Merge Checkstyle 8.7 into aosp/master

Merged commit 5f62e6406680bb91ef505b9a1932e398bf42532d

Test: None
diff --git a/.ci/check-only-javadoc-error.sh b/.ci/check-only-javadoc-error.sh
index 78fc128..ad0e480 100755
--- a/.ci/check-only-javadoc-error.sh
+++ b/.ci/check-only-javadoc-error.sh
@@ -7,7 +7,7 @@
 
 uname -a
 mvn --version
-mvn clean install -Pno-validations
+mvn -e clean install -Pno-validations
 git clone https://github.com/checkstyle/contribution && cd contribution/checkstyle-tester
 sed -i.'' 's/^guava/#guava/' projects-to-test-on.properties
 sed -i.'' 's/#spring-framework/spring-framework/' projects-to-test-on.properties
diff --git a/.ci/idea_inspection.sh b/.ci/idea_inspection.sh
index a548569..b85a840 100755
--- a/.ci/idea_inspection.sh
+++ b/.ci/idea_inspection.sh
@@ -29,7 +29,7 @@
 fi
 
 #Execute compilation of Checkstyle to generate all source files
-mvn compile
+mvn -e compile
 
 mkdir -p $RESULTS_DIR
 rm -rf $RESULTS_DIR/*
@@ -42,7 +42,7 @@
 if [[ $IDEA_OUTPUT == "Already running" ]]; then
     echo "It might be that Intellij Idea is running, please close it."
     exit 1;
-else
+fi
 
 echo "Checking results ..."
 if [[ $(grep -R "<problems" $RESULTS_DIR/ | cat | wc -l ) > 0 ]]; then
diff --git a/.ci/run-link-check-plugin.sh b/.ci/run-link-check-plugin.sh
index 434df02..c6bac13 100755
--- a/.ci/run-link-check-plugin.sh
+++ b/.ci/run-link-check-plugin.sh
@@ -8,7 +8,7 @@
 uname -a
 mvn --version
 curl -I https://sourceforge.net/projects/checkstyle/
-mvn clean site -Dcheckstyle.ant.skip=true -DskipTests -DskipITs -Dpmd.skip=true -Dfindbugs.skip=true -Dcobertura.skip=true -Dcheckstyle.skip=true
+mvn -e clean site -Dcheckstyle.ant.skip=true -DskipTests -DskipITs -Dpmd.skip=true -Dfindbugs.skip=true -Dcobertura.skip=true -Dcheckstyle.skip=true
 echo "------------ grep of linkcheck.html--BEGIN"
 # "grep ... | cat" is required command is running in "set -e" mode and grep could return exit code 1 if nothing is matching
 grep externalLink target/site/linkcheck.html | cat
diff --git a/.ci/sonar.sh b/.ci/sonar.sh
index 9172697..e594b4a 100755
--- a/.ci/sonar.sh
+++ b/.ci/sonar.sh
@@ -4,7 +4,7 @@
 curl -X POST -u admin:admin -F 'backup=@config/default_sonar_profile.xml' -v http://localhost:9000/api/profiles/restore
 
 #execute inspection
-mvn sonar:sonar -P sonar -Dsonar.language=java -Dsonar.profile=checksyle-profile
+mvn -e sonar:sonar -P sonar -Dsonar.language=java -Dsonar.profile=checksyle-profile
 
 # Uncomment following to get HTML report.
 # mvn sonar:sonar -Dsonar.analysis.mode=preview -Dsonar.issuesReport.html.enable=true \
diff --git a/.ci/travis/travis.sh b/.ci/travis/travis.sh
index 474703c..8de2b86 100755
--- a/.ci/travis/travis.sh
+++ b/.ci/travis/travis.sh
@@ -5,17 +5,37 @@
 case $1 in
 
 nondex)
-  mvn --fail-never clean nondex:nondex -DargLine='-Xms1024m -Xmx2048m'
+  mvn -e --fail-never clean nondex:nondex -DargLine='-Xms1024m -Xmx2048m'
   cat `grep -RlE 'td class=.x' .nondex/ | cat` < /dev/null > output.txt
   RESULT=$(cat output.txt | wc -c)
   cat output.txt
   echo 'Size of output:'$RESULT
-  if [[ $RESULT != 0 ]]; then false; fi
+  if [[ $RESULT != 0 ]]; then sleep 5s; false; fi
+  ;;
+
+versions)
+  if [[ -v TRAVIS_EVENT_TYPE && $TRAVIS_EVENT_TYPE != "cron" ]]; then exit 0; fi
+  mvn -e clean versions:dependency-updates-report versions:plugin-updates-report
+  if [ $(grep "<nextVersion>" target/*-updates-report.xml | cat | wc -l) -gt 0 ]; then
+    echo "Version reports (dependency-updates-report.xml):"
+    cat target/dependency-updates-report.xml
+    echo "Version reports (plugin-updates-report.xml):"
+    cat target/plugin-updates-report.xml
+    echo "New dependency versions:"
+    grep -B 7 -A 7 "<nextVersion>" target/dependency-updates-report.xml | cat
+    echo "New plugin versions:"
+    grep -B 4 -A 7 "<nextVersion>" target/plugin-updates-report.xml | cat
+    echo "Verification is failed."
+    sleep 5s
+    false
+  else
+    echo "No new versions found"
+  fi
   ;;
 
 assembly-run-all-jar)
-  mvn clean package -Passembly
-  CS_POM_VERSION=$(mvn -q -Dexec.executable='echo' -Dexec.args='${project.version}' --non-recursive org.codehaus.mojo:exec-maven-plugin:1.3.1:exec)
+  mvn -e clean package -Passembly
+  CS_POM_VERSION=$(mvn -e -q -Dexec.executable='echo' -Dexec.args='${project.version}' --non-recursive org.codehaus.mojo:exec-maven-plugin:1.3.1:exec)
   echo version:$CS_POM_VERSION
   java -jar target/checkstyle-$CS_POM_VERSION-all.jar -c /google_checks.xml \
         src/it/resources/com/google/checkstyle/test/chapter3filestructure/rule332nolinewrap/InputNoLineWrapGood.java > output.log
@@ -26,10 +46,11 @@
 sonarqube)
   # token could be generated at https://sonarcloud.io/account/security/
   # executon on local: SONAR_TOKEN=xxxxxxxxxx ./.ci/travis/travis.sh sonarqube
-  if [[ $TRAVIS_PULL_REQUEST && $TRAVIS_PULL_REQUEST =~ ^([0-9]*)$ ]]; then exit 0; fi
+  if [[ -v TRAVIS_PULL_REQUEST && $TRAVIS_PULL_REQUEST && $TRAVIS_PULL_REQUEST =~ ^([0-9]*)$ ]]; then exit 0; fi
+  if [[ -z $SONAR_TOKEN ]]; then echo "SONAR_TOKEN is not set"; sleep 5s; exit 1; fi
   export MAVEN_OPTS='-Xmx2000m'
-  mvn clean package cobertura:cobertura sonar:sonar \
-       -Dsonar.host.url=https://sonarqube.com \
+  mvn -e clean package cobertura:cobertura sonar:sonar \
+       -Dsonar.host.url=https://sonarcloud.io \
        -Dsonar.login=$SONAR_TOKEN \
        -Dcobertura.report.format=xml -Dmaven.test.failure.ignore=true \
        -Dcheckstyle.skip=true -Dpmd.skip=true -Dcheckstyle.ant.skip=true
@@ -37,7 +58,7 @@
 
 release-dry-run)
   if [ $(git log -1 | grep -E "\[maven-release-plugin\] prepare release" | cat | wc -l) -lt 1 ]; then
-    mvn release:prepare -DdryRun=true --batch-mode -Darguments='-DskipTests -DskipITs \
+    mvn -e release:prepare -DdryRun=true --batch-mode -Darguments='-DskipTests -DskipITs \
       -Dcobertura.skip=true -Dpmd.skip=true -Dfindbugs.skip=true  -Dxml.skip=true \
       -Dcheckstyle.ant.skip=true -Dcheckstyle.skip=true -Dgpg.skip=true'
   fi
@@ -68,9 +89,9 @@
   ;;
 
 no-error-test-sbe)
-  CS_POM_VERSION=$(mvn -q -Dexec.executable='echo' -Dexec.args='${project.version}' --non-recursive org.codehaus.mojo:exec-maven-plugin:1.3.1:exec)
+  CS_POM_VERSION=$(mvn -e -q -Dexec.executable='echo' -Dexec.args='${project.version}' --non-recursive org.codehaus.mojo:exec-maven-plugin:1.3.1:exec)
   echo version:$CS_POM_VERSION
-  mvn clean install -Pno-validations
+  mvn -e clean install -Pno-validations
   git clone https://github.com/real-logic/simple-binary-encoding.git
   cd simple-binary-encoding
   git checkout 963814f8ca1456de9daaf67e78663e7d877871a9
@@ -85,7 +106,7 @@
   sed -i.'' 's/#checkstyle/checkstyle/' projects-to-test-on.properties
   sed -i.'' 's/#sevntu-checkstyle/sevntu-checkstyle/' projects-to-test-on.properties
   cd ../../
-  mvn clean install -Pno-validations
+  mvn -e clean install -Pno-validations
   cd contribution/checkstyle-tester
   export MAVEN_OPTS="-Xmx2048m"
   groovy ./launch.groovy --listOfProjects projects-to-test-on.properties --config checks-nonjavadoc-error.xml
@@ -97,7 +118,7 @@
   sed -i.'' 's/^guava/#guava/' projects-to-test-on.properties
   sed -i.'' 's/#guava|/guava|/' projects-to-test-on.properties
   cd ../../
-  mvn clean install -Pno-validations
+  mvn -e clean install -Pno-validations
   cd contribution/checkstyle-tester
   export MAVEN_OPTS="-Xmx2048m"
   groovy ./launch.groovy --listOfProjects projects-to-test-on.properties --config checks-nonjavadoc-error.xml
@@ -109,7 +130,7 @@
   sed -i.'' 's/^guava/#guava/' projects-to-test-on.properties
   sed -i.'' 's/#guava|/guava|/' projects-to-test-on.properties
   cd ../../
-  mvn clean install -Pno-validations
+  mvn -e clean install -Pno-validations
   sed -i.'' 's/warning/ignore/' src/main/resources/google_checks.xml
   cd contribution/checkstyle-tester
   export MAVEN_OPTS="-Xmx2048m"
@@ -122,7 +143,7 @@
   sed -i.'' 's/^guava/#guava/' projects-to-test-on.properties
   sed -i.'' 's/#hibernate-orm/hibernate-orm/' projects-to-test-on.properties
   cd ../../
-  mvn clean install -Pno-validations
+  mvn -e clean install -Pno-validations
   cd contribution/checkstyle-tester
   export MAVEN_OPTS="-Xmx2048m"
   groovy ./launch.groovy --listOfProjects projects-to-test-on.properties --config checks-nonjavadoc-error.xml
@@ -134,7 +155,7 @@
   sed -i.'' 's/^guava/#guava/' projects-to-test-on.properties
   sed -i.'' 's/#findbugs/findbugs/' projects-to-test-on.properties
   cd ../../
-  mvn clean install -Pno-validations
+  mvn -e clean install -Pno-validations
   cd contribution/checkstyle-tester
   export MAVEN_OPTS="-Xmx2048m"
   groovy ./launch.groovy --listOfProjects projects-to-test-on.properties --config checks-nonjavadoc-error.xml
@@ -146,7 +167,7 @@
   sed -i.'' 's/^guava/#guava/' projects-to-test-on.properties
   sed -i.'' 's/#spring-framework/spring-framework/' projects-to-test-on.properties
   cd ../../
-  mvn clean install -Pno-validations
+  mvn -e clean install -Pno-validations
   cd contribution/checkstyle-tester
   export MAVEN_OPTS="-Xmx2048m"
   groovy ./launch.groovy --listOfProjects projects-to-test-on.properties --config checks-nonjavadoc-error.xml
@@ -158,7 +179,7 @@
   sed -i.'' 's/^guava/#guava/' projects-to-test-on.properties
   sed -i.'' 's/#Hbase/Hbase/' projects-to-test-on.properties
   cd ../../
-  mvn clean install -Pno-validations
+  mvn -e clean install -Pno-validations
   cd contribution/checkstyle-tester
   export MAVEN_OPTS="-Xmx2048m"
   groovy ./launch.groovy --listOfProjects projects-to-test-on.properties --config checks-nonjavadoc-error.xml
@@ -172,7 +193,7 @@
   sed -i.'' 's/#elasticsearch/elasticsearch/' projects-to-test-on.properties
   sed -i.'' 's/#lombok-ast/lombok-ast/' projects-to-test-on.properties
   cd ../../
-  mvn clean install -Pno-validations
+  mvn -e clean install -Pno-validations
   cd contribution/checkstyle-tester
   export MAVEN_OPTS="-Xmx2048m"
   groovy ./launch.groovy --listOfProjects projects-to-test-on.properties --config checks-nonjavadoc-error.xml
@@ -189,7 +210,7 @@
   sed -i.'' 's/#apache-jsecurity/apache-jsecurity/' projects-to-test-on.properties
   sed -i.'' 's/#android-launcher/android-launcher/' projects-to-test-on.properties
   cd ../../
-  mvn clean install -Pno-validations
+  mvn -e clean install -Pno-validations
   cd contribution/checkstyle-tester
   export MAVEN_OPTS="-Xmx2048m"
   groovy ./launch.groovy --listOfProjects projects-to-test-on.properties --config checks-nonjavadoc-error.xml
@@ -197,14 +218,18 @@
 
 cobertura-check)
   set +e
-  mvn clean compile cobertura:cobertura cobertura:check -DargLine='-Xms1024m -Xmx2048m' > mvn-log.log
+  echo "Output and Error output will be redirected to mvn-log.log file ..."
+  mvn -e clean compile cobertura:cobertura cobertura:check -DargLine='-Xms1024m -Xmx2048m' &> mvn-log.log
+  echo "Printing mvn-log.log file:"
   cat mvn-log.log
+  sleep 5s
   set -e
   echo "Grep for hidden errors (due to quiet=true mode in pom.xml):"
   grep -R "<td class=\"nbHitsUncovered\"" target/site/cobertura/* --exclude=*grammars* | cat > mvn-log-grep.log
   cat mvn-log-grep.log
   if [[ $(cat mvn-log-grep.log | wc -l) -gt 0 ]]; then
-    exit 1
+    sleep 5s
+    false
   fi
   echo "Checking that all classes are covered:"
   xmlstarlet sel -t -m "//class" -v "@name" -n target/site/cobertura/coverage.xml | sed "s/\./\//g" | sed "/^$/d" | sort | uniq > cobertura_classes.log
@@ -215,22 +240,23 @@
   sed -i'' "s/com\/puppycrawl\/tools\/checkstyle\/gui\/BaseCellEditor/\ncom\/puppycrawl\/tools\/checkstyle\/gui\/BaseCellEditor/" cobertura_excluded_classes.log
   grep -Fxvf cobertura_classes.log target_classes.log > missed_classes_with_excludes.log
   grep -Fvf cobertura_excluded_classes.log missed_classes_with_excludes.log > missed_classes_without_excludes.log | cat > output.log
-  echo "output.log"
+  echo "output.log content:"
   cat output.log
 
   if [[ -s missed_classes_without_excludes.log ]] ; then
     echo "Classes which are missed in Cobertura coverage report:"
     cat missed_classes_without_excludes.log
-    exit 1;
+    sleep 5s
+    false
   else
     echo "All classes are present in Cobertura coverage report."
-    exit 0;
   fi
   ;;
 
 *)
   echo "Unexpected argument: $1"
-  exit 1
+  sleep 5s
+  false
   ;;
 
 esac
diff --git a/.ci/travis/xtr_releasenotes-gen.sh b/.ci/travis/xtr_releasenotes-gen.sh
index 6b1af3c..c7f48fc 100755
--- a/.ci/travis/xtr_releasenotes-gen.sh
+++ b/.ci/travis/xtr_releasenotes-gen.sh
@@ -5,14 +5,14 @@
 if [[ $TRAVIS_PULL_REQUEST =~ ^([0-9]*)$ ]]; then exit 0; fi
 git clone https://github.com/checkstyle/contribution
 cd contribution/releasenotes-builder
-mvn clean compile package
+mvn -e clean compile package
 cd ../../
 # we need to do full clone as Travis do "git clone --depth=50"
 git clone https://github.com/checkstyle/checkstyle
 cd checkstyle
 LATEST_RELEASE_TAG=$(git describe $(git rev-list --tags --max-count=1))
 cd ../
-CS_RELEASE_VERSION=$(mvn -q -Dexec.executable='echo' -Dexec.args='${project.version}' --non-recursive org.codehaus.mojo:exec-maven-plugin:1.3.1:exec | sed 's/-SNAPSHOT//' )
+CS_RELEASE_VERSION=$(mvn -e -q -Dexec.executable='echo' -Dexec.args='${project.version}' --non-recursive org.codehaus.mojo:exec-maven-plugin:1.3.1:exec | sed 's/-SNAPSHOT//' )
 echo LATEST_RELEASE_TAG=$LATEST_RELEASE_TAG
 echo CS_RELEASE_VERSION=$CS_RELEASE_VERSION
 java -jar contribution/releasenotes-builder/target/releasenotes-builder-1.0-all.jar \
diff --git a/.ci/wercker.sh b/.ci/wercker.sh
new file mode 100755
index 0000000..0de1a20
--- /dev/null
+++ b/.ci/wercker.sh
@@ -0,0 +1,200 @@
+#!/bin/bash
+# Attention, there is no "-x" to avoid problems on Wercker
+set -e
+
+case $1 in
+
+no-error-pgjdbc)
+  CS_POM_VERSION=$(mvn -e -q -Dexec.executable='echo' -Dexec.args='${project.version}' --non-recursive org.codehaus.mojo:exec-maven-plugin:1.3.1:exec)
+  echo CS_version: ${CS_POM_VERSION}
+  for i in 1 2 3 4 5; do git clone https://github.com/pgjdbc/pgjdbc.git && break || sleep 15; done
+  cd pgjdbc/pgjdbc
+  mvn -e checkstyle:check -Dcheckstyle.version=${CS_POM_VERSION}
+  cd ../../
+  rm -rf pgjdbc
+  ;;
+
+no-error-orekit)
+  CS_POM_VERSION=$(mvn -e -q -Dexec.executable='echo' -Dexec.args='${project.version}' --non-recursive org.codehaus.mojo:exec-maven-plugin:1.3.1:exec)
+  echo CS_version: ${CS_POM_VERSION}
+  for i in 1 2 3 4 5; do git clone https://github.com/Hipparchus-Math/hipparchus.git && break || sleep 15; done
+  cd hipparchus
+  git checkout 905006092493e350dcd68dd7b2ec1dedaf4983b7
+  mvn -e clean install -DskipTests
+  cd ../
+  for i in 1 2 3 4 5; do git clone https://github.com/CS-SI/Orekit.git && break || sleep 15; done
+  cd Orekit
+  # Orekit use 'develop' branch as target for PullRequest merges
+  git checkout develop
+  mvn -e compile checkstyle:check -Dorekit.checkstyle.version=${CS_POM_VERSION}
+  cd ../
+  rm -rf hipparchus Orekit
+  ;;
+
+no-error-xwiki)
+  CS_POM_VERSION=$(mvn -e -q -Dexec.executable='echo' -Dexec.args='${project.version}' --non-recursive org.codehaus.mojo:exec-maven-plugin:1.3.1:exec)
+  echo CS_version: ${CS_POM_VERSION}
+  for i in 1 2 3 4 5; do git clone https://github.com/xwiki/xwiki-commons/ && break || sleep 15; done
+  cd xwiki-commons
+  git checkout 44b0c0048c516dae20cf5f8a71181af836549484
+  mvn -e install -DskipTests -Dxwiki.clirr.skip=true checkstyle:check -Dcheckstyle.version=${CS_POM_VERSION}
+  cd ../../
+  rm -rf xwiki-commons
+  ;;
+
+no-error-apex-core)
+  CS_POM_VERSION=$(mvn -e -q -Dexec.executable='echo' -Dexec.args='${project.version}' --non-recursive org.codehaus.mojo:exec-maven-plugin:1.3.1:exec)
+  echo CS_version: ${CS_POM_VERSION}
+  for i in 1 2 3 4 5; do git clone https://github.com/apache/incubator-apex-core/ && break || sleep 15; done
+  cd incubator-apex-core
+  mvn -e compile checkstyle:check -Dcheckstyle.version=${CS_POM_VERSION}
+  cd ../
+  rm -rf incubator-apex-core
+  ;;
+
+no-error-hibernate-search)
+  CS_POM_VERSION=$(mvn -e -q -Dexec.executable='echo' -Dexec.args='${project.version}' --non-recursive org.codehaus.mojo:exec-maven-plugin:1.3.1:exec)
+  echo CS_version: ${CS_POM_VERSION}
+  for i in 1 2 3 4 5; do git clone https://github.com/hibernate/hibernate-search.git && break || sleep 15; done
+  cd hibernate-search
+  mvn -e -s settings-example.xml clean install -DskipTests=true -Dtest.elasticsearch.host.provided=true -Dpuppycrawl.checkstyle.version=${CS_POM_VERSION}
+  mvn -e -s settings-example.xml checkstyle:check  -Dpuppycrawl.checkstyle.version=${CS_POM_VERSION}
+  cd ../
+  rm -rf hibernate-search
+  ;;
+
+no-error-htmlunit)
+  CS_POM_VERSION=$(mvn -e -q -Dexec.executable='echo' -Dexec.args='${project.version}' --non-recursive org.codehaus.mojo:exec-maven-plugin:1.3.1:exec)
+  echo CS_version: ${CS_POM_VERSION}
+  echo "checkouting project sources ..."
+  svn -q export https://svn.code.sf.net/p/htmlunit/code/trunk/htmlunit@r14923 htmlunit
+  cd htmlunit
+  sed -i "s/            <version>2.28-SNAPSHOT/            <version>2.28-20171106.080245-12/" pom.xml
+  echo "Running checkstyle validation ..."
+  mvn -e compile checkstyle:check -Dcheckstyle.version=${CS_POM_VERSION}
+  cd ../
+  rm -rf htmlunit
+  ;;
+
+no-error-checkstyles-sevntu)
+  set -e
+  CS_POM_VERSION=$(mvn -e -q -Dexec.executable='echo' -Dexec.args='${project.version}' --non-recursive org.codehaus.mojo:exec-maven-plugin:1.3.1:exec)
+  echo CS_version: ${CS_POM_VERSION}
+  mvn -e compile verify -Dmaven.sevntu-checkstyle-check.checkstyle.version=${CS_POM_VERSION} -Dmaven.test.skip=true -Dcheckstyle.ant.skip=true -Dpmd.skip=true -Dfindbugs.skip=true -Dcobertura.skip=true -Dforbiddenapis.skip=true -Dxml.skip=true
+  ;;
+
+no-error-sevntu-checks)
+  set -e
+  CS_POM_VERSION=$(mvn -e -q -Dexec.executable='echo' -Dexec.args='${project.version}' --non-recursive org.codehaus.mojo:exec-maven-plugin:1.3.1:exec)
+  echo CS_version: ${CS_POM_VERSION}
+  for i in 1 2 3 4 5; do git clone https://github.com/sevntu-checkstyle/sevntu.checkstyle && break || sleep 15; done
+  cd sevntu.checkstyle/sevntu-checks
+  mvn -e -Pno-validations verify  -Dcheckstyle.skip=false -Dcheckstyle.version=${CS_POM_VERSION} -Dcheckstyle.configLocation=../../config/checkstyle_checks.xml
+  ;;
+
+no-exception-struts)
+  for i in 1 2 3 4 5; do git clone https://github.com/checkstyle/contribution && break || sleep 15; done
+  cd contribution/checkstyle-tester
+  sed -i'' 's/^guava/#guava/' projects-for-wercker.properties
+  sed -i'' 's/#apache-struts/apache-struts/' projects-for-wercker.properties
+  groovy ./launch.groovy --listOfProjects projects-for-wercker.properties --config checks-nonjavadoc-error.xml
+  cd ../../
+  rm -rf contribution
+  ;;
+
+no-exception-checkstyle-sevntu)
+  set -e
+  for i in 1 2 3 4 5; do git clone https://github.com/checkstyle/contribution && break || sleep 15; done
+  cd contribution/checkstyle-tester
+  sed -i'' 's/^guava/#guava/' projects-for-wercker.properties
+  sed -i'' 's/#checkstyle/checkstyle/' projects-for-wercker.properties
+  sed -i'' 's/#sevntu-checkstyle/sevntu-checkstyle/' projects-for-wercker.properties
+  groovy ./launch.groovy --listOfProjects projects-for-wercker.properties --config checks-nonjavadoc-error.xml
+  cd ../../
+  rm -rf contribution
+  ;;
+
+no-exception-guava)
+  for i in 1 2 3 4 5; do git clone https://github.com/checkstyle/contribution && break || sleep 15; done
+  cd contribution/checkstyle-tester
+  sed -i'' 's/^guava/#guava/' projects-for-wercker.properties
+  sed -i'' 's/#guava/guava/' projects-for-wercker.properties
+  groovy ./launch.groovy --listOfProjects projects-for-wercker.properties --config checks-nonjavadoc-error.xml
+  cd ../../
+  rm -rf contribution
+  ;;
+
+no-exception-hibernate-orm)
+  git clone https://github.com/checkstyle/contribution
+  cd contribution/checkstyle-tester
+  sed -i.'' 's/^guava/#guava/' projects-to-test-on.properties
+  sed -i.'' 's/#hibernate-orm/hibernate-orm/' projects-to-test-on.properties
+  groovy ./launch.groovy --listOfProjects projects-for-wercker.properties --config checks-nonjavadoc-error.xml
+  cd ../../
+  rm -rf contribution
+  ;;
+
+no-exception-findbugs)
+  git clone https://github.com/checkstyle/contribution
+  cd contribution/checkstyle-tester
+  sed -i.'' 's/^guava/#guava/' projects-to-test-on.properties
+  sed -i.'' 's/#findbugs/findbugs/' projects-to-test-on.properties
+  groovy ./launch.groovy --listOfProjects projects-to-test-on.properties --config checks-nonjavadoc-error.xml
+  cd ../../
+  rm -rf contribution
+  ;;
+
+no-exception-spring-framework)
+  git clone https://github.com/checkstyle/contribution
+  cd contribution/checkstyle-tester
+  sed -i.'' 's/^guava/#guava/' projects-to-test-on.properties
+  sed -i.'' 's/#spring-framework/spring-framework/' projects-to-test-on.properties
+  groovy ./launch.groovy --listOfProjects projects-to-test-on.properties --config checks-nonjavadoc-error.xml
+  cd ../../
+  rm -rf contribution
+  ;;
+
+no-exception-hbase)
+  git clone https://github.com/checkstyle/contribution
+  cd contribution/checkstyle-tester
+  sed -i.'' 's/^guava/#guava/' projects-to-test-on.properties
+  sed -i.'' 's/#Hbase/Hbase/' projects-to-test-on.properties
+  groovy ./launch.groovy --listOfProjects projects-to-test-on.properties --config checks-nonjavadoc-error.xml
+  cd ../../
+  rm -rf contribution
+  ;;
+
+no-exception-Pmd-elasticsearch-lombok-ast)
+  git clone https://github.com/checkstyle/contribution
+  cd contribution/checkstyle-tester
+  sed -i.'' 's/^guava/#guava/' projects-to-test-on.properties
+  sed -i.'' 's/#pmd/pmd/' projects-to-test-on.properties
+  sed -i.'' 's/#elasticsearch/elasticsearch/' projects-to-test-on.properties
+  sed -i.'' 's/#lombok-ast/lombok-ast/' projects-to-test-on.properties
+  groovy ./launch.groovy --listOfProjects projects-to-test-on.properties --config checks-nonjavadoc-error.xml
+  cd ../../
+  rm -rf contribution
+  ;;
+
+no-exception-alot-of-projects)
+  git clone https://github.com/checkstyle/contribution
+  cd contribution/checkstyle-tester
+  sed -i.'' 's/^guava/#guava/' projects-to-test-on.properties
+  sed -i.'' 's/#RxJava/RxJava/' projects-to-test-on.properties
+  sed -i.'' 's/#java-design-patterns/java-design-patterns/' projects-to-test-on.properties
+  sed -i.'' 's/#MaterialDesignLibrary/MaterialDesignLibrary/' projects-to-test-on.properties
+  sed -i.'' 's/#apache-ant/apache-ant/' projects-to-test-on.properties
+  sed -i.'' 's/#apache-jsecurity/apache-jsecurity/' projects-to-test-on.properties
+  sed -i.'' 's/#android-launcher/android-launcher/' projects-to-test-on.properties
+  groovy ./launch.groovy --listOfProjects projects-to-test-on.properties --config checks-nonjavadoc-error.xml
+  cd ../../
+  rm -rf contribution
+  ;;
+
+*)
+  echo "Unexpected argument: $1"
+  sleep 5s
+  false
+  ;;
+
+esac
diff --git a/.travis.yml b/.travis.yml
index ee0a9c8..44478c7 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -18,11 +18,7 @@
     - master
 
 install:
-  - |
-    if [ "${TRAVIS_OS_NAME}" == "osx" ]; then
-      # https://github.com/travis-ci/travis-ci/issues/6307#issuecomment-233315824
-      rvm get head
-    fi
+  -
 
 matrix:
   fast_finish: true
@@ -36,14 +32,14 @@
     - jdk: oraclejdk8
       env:
         - DESC="tests and deploy"
-        - CMD="mvn clean integration-test failsafe:verify -DargLine='-Xms1024m -Xmx2048m'"
+        - CMD="mvn -e clean integration-test failsafe:verify -DargLine='-Xms1024m -Xmx2048m'"
         - DEPLOY="true"
 
     # checkstyle (oraclejdk8)
     - jdk: oraclejdk8
       env:
         - DESC="checkstyle and sevntu-checkstyle"
-        - CMD="export MAVEN_OPTS='-Xmx2000m' && mvn clean verify -DskipTests -DskipITs -Dpmd.skip=true -Dfindbugs.skip=true -Dcobertura.skip=true"
+        - CMD="export MAVEN_OPTS='-Xmx2000m' && mvn -e clean verify -DskipTests -DskipITs -Dpmd.skip=true -Dfindbugs.skip=true -Dcobertura.skip=true"
 
     # cobertura and codecov (oraclejdk8)
     - jdk: oraclejdk8
@@ -56,13 +52,13 @@
     - jdk: oraclejdk8
       env:
         - DESC="findbugs,spotbugs,pmd"
-        - CMD="export MAVEN_OPTS='-Xmx2000m' && mvn clean compile pmd:check findbugs:check spotbugs:check"
+        - CMD="export MAVEN_OPTS='-Xmx2000m' && mvn -e clean compile pmd:check findbugs:check spotbugs:check"
 
     # eclipse static analysis
     - jdk: oraclejdk8
       env:
         - DESC="eclipse static analysis"
-        - CMD="mvn clean compile exec:exec -Peclipse-compiler"
+        - CMD="mvn -e clean compile exec:exec -Peclipse-compiler"
 
     # Releasenotes generation - validaton
     - jdk: oraclejdk8
@@ -81,7 +77,7 @@
     #- jdk: oraclejdk8
     #  env:
     #    - DESC="site"
-    #    - CMD1="mvn clean site -Dlinkcheck.skip=true -DskipTests -DskipITs "
+    #    - CMD1="mvn -e clean site -Dlinkcheck.skip=true -DskipTests -DskipITs "
     #    - CMD2=" -Dpmd.skip=true -Dfindbugs.skip=true -Dcobertura.skip=true "
     #    - CMD3=" -Dcheckstyle.ant.skip=true -Dcheckstyle.skip=true"
     #    - CMD=$CMD1$CMD2$CMD3
@@ -91,42 +87,42 @@
     - jdk: oraclejdk8
       env:
         - DESC="tests de"
-        - CMD="mvn clean integration-test failsafe:verify -DargLine='-Duser.language=de -Duser.country=DE -Xms1024m -Xmx2048m'"
+        - CMD="mvn -e clean integration-test failsafe:verify -DargLine='-Duser.language=de -Duser.country=DE -Xms1024m -Xmx2048m'"
     # unit tests in Spanish locale (oraclejdk8)
     - jdk: oraclejdk8
       env:
         - DESC="tests es"
-        - CMD="mvn clean integration-test failsafe:verify -DargLine='-Duser.language=es -Duser.country=ES -Xms1024m -Xmx2048m'"
+        - CMD="mvn -e clean integration-test failsafe:verify -DargLine='-Duser.language=es -Duser.country=ES -Xms1024m -Xmx2048m'"
     # unit tests in Finnish locale (oraclejdk8)
     - jdk: oraclejdk8
       env:
         - DESC="tests fi"
-        - CMD="mvn clean integration-test failsafe:verify -DargLine='-Duser.language=fi -Duser.country=FI -Xms1024m -Xmx2048m'"
+        - CMD="mvn -e clean integration-test failsafe:verify -DargLine='-Duser.language=fi -Duser.country=FI -Xms1024m -Xmx2048m'"
     # unit tests in French locale (oraclejdk8)
     - jdk: oraclejdk8
       env:
         - DESC="tests fr"
-        - CMD="mvn clean integration-test failsafe:verify -DargLine='-Duser.language=fr -Duser.country=FR -Xms1024m -Xmx2048m'"
+        - CMD="mvn -e clean integration-test failsafe:verify -DargLine='-Duser.language=fr -Duser.country=FR -Xms1024m -Xmx2048m'"
     # unit tests in Chinese locale (oraclejdk8)
     - jdk: oraclejdk8
       env:
         - DESC="tests zh"
-        - CMD="mvn clean integration-test failsafe:verify -DargLine='-Duser.language=zh -Duser.country=CN -Xms1024m -Xmx2048m'"
+        - CMD="mvn -e clean integration-test failsafe:verify -DargLine='-Duser.language=zh -Duser.country=CN -Xms1024m -Xmx2048m'"
     # unit tests in Japanese locale (oraclejdk8)
     - jdk: oraclejdk8
       env:
         - DESC="tests ja"
-        - CMD="mvn clean integration-test failsafe:verify -DargLine='-Duser.language=ja -Duser.country=JP -Xms1024m -Xmx2048m'"
+        - CMD="mvn -e clean integration-test failsafe:verify -DargLine='-Duser.language=ja -Duser.country=JP -Xms1024m -Xmx2048m'"
     # unit tests in Portuguese locale (oraclejdk8)
     - jdk: oraclejdk8
       env:
         - DESC="tests pt"
-        - CMD="mvn clean integration-test failsafe:verify -DargLine='-Duser.language=pt -Duser.country=PT -Xms1024m -Xmx2048m'"
+        - CMD="mvn -e clean integration-test failsafe:verify -DargLine='-Duser.language=pt -Duser.country=PT -Xms1024m -Xmx2048m'"
     # unit tests in Turkish locale (oraclejdk8)
     - jdk: oraclejdk8
       env:
         - DESC="tests tr"
-        - CMD="mvn clean integration-test failsafe:verify -DargLine='-Duser.language=tr -Duser.country=TR -Xms1024m -Xmx2048m'"
+        - CMD="mvn -e clean integration-test failsafe:verify -DargLine='-Duser.language=tr -Duser.country=TR -Xms1024m -Xmx2048m'"
 
     # assembly (oraclejdk8)
     - jdk: oraclejdk8
@@ -161,12 +157,12 @@
     - os: osx
       env:
         - DESC="MacOS verify, site, assembly"
-        - CMD="export JAVA_HOME=$(/usr/libexec/java_home) && mvn package -Dlinkcheck.skip=true && mvn package -Passembly "
+        - CMD="export JAVA_HOME=$(/usr/libexec/java_home) && mvn -e package -Dlinkcheck.skip=true && mvn -e package -Passembly "
 
-    # https://sonarqube.com (oraclejdk8)
+    # https://sonarcloud.io (oraclejdk8)
     - jdk: oraclejdk8
       env:
-        - DESC="sonarqube.com"
+        - DESC="sonarcloud.io"
         - CMD="./.ci/travis/travis.sh sonarqube"
 
     # No error testing - simple-binary-encoding
@@ -175,8 +171,14 @@
         - DESC="no error test on simple-binary-encoding"
         - CMD="./.ci/travis/travis.sh no-error-test-sbe"
 
+    # versions to update
+    - jdk: oraclejdk8
+      env:
+        - DESC="print versions to update"
+        - CMD="./.ci/travis/travis.sh versions"
+
 script:
-  - SKIP_FILES=".github|appveyor.yml|circle.yml|distelli-manifest.yml|fast-forward-merge.sh|LICENSE|LICENSE.apache20|README.md|release.sh|RIGHTS.antlr|shippable.yml|wercker.yml|intellij-idea-inspections.xml"
+  - SKIP_FILES=".github|appveyor.yml|circle.yml|distelli-manifest.yml|fast-forward-merge.sh|LICENSE|LICENSE.apache20|README.md|release.sh|RIGHTS.antlr|shippable.yml|wercker.yml|wercker.sh|intellij-idea-inspections.xml"
   - SKIP_CI=$(if [[ $(git diff --name-only HEAD HEAD~1 | grep -vE "$SKIP_FILES" | cat | wc -c | sed 's/^ *//' ) > 0 ]]; then echo false; else echo true; fi;)
   - echo "SKIP_CI="$SKIP_CI
   - |
@@ -208,6 +210,6 @@
             && $SKIP_DEPLOY == 'false'
        ]];
     then
-        mvn -s config/deploy-settings.xml -Pno-validations deploy;
+        mvn -e -s config/deploy-settings.xml -Pno-validations deploy;
         echo "deploy to maven snapshot repository is finished";
     fi
diff --git a/README.md b/README.md
index 8585083..d01f5c5 100644
--- a/README.md
+++ b/README.md
@@ -73,8 +73,8 @@
 [appveyor]:https://ci.appveyor.com/project/checkstyle/checkstyle/history
 [appveyor img]:https://ci.appveyor.com/api/projects/status/rw6bw3dl9kph6ucc?svg=true
 
-[sonar]:https://sonarqube.com/dashboard?id=com.puppycrawl.tools%3Acheckstyle
-[sonar img]:https://sonarqube.com/api/badges/measure?key=com.puppycrawl.tools:checkstyle&metric=sqale_debt_ratio
+[sonar]:https://sonarcloud.io/dashboard?id=com.puppycrawl.tools%3Acheckstyle
+[sonar img]:https://sonarcloud.io/api/badges/measure?key=com.puppycrawl.tools:checkstyle&metric=sqale_debt_ratio
 
 [codacy]:https://www.codacy.com/app/checkstyle/checkstyle
 [codacy img]:https://api.codacy.com/project/badge/3adf12d434314ba8b38277ea46d3c44b
diff --git a/appveyor.yml b/appveyor.yml
index 5f607ca..288e0ce 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -14,7 +14,8 @@
     - release.sh
     - RIGHTS.antlr
     - shippable.yml
-     -wercker.yml
+    - wercker.yml
+    - wercker.sh
 clone_depth: 10
 branches:
   only:
diff --git a/circle.yml b/circle.yml
index 595964e..2db6ea5 100644
--- a/circle.yml
+++ b/circle.yml
@@ -7,9 +7,9 @@
   pre:
     - if [ ! -d groovy-2.4.7 ]; then wget https://dl.bintray.com/groovy/maven/apache-groovy-binary-2.4.7.zip && unzip apache-groovy-binary-2.4.7.zip; fi
 
-  # we to override as 'mvn dependecy:go-ofline' does not download all dependencies
+  # we to override as 'mvn -e dependecy:go-ofline' does not download all dependencies
   override:
-    - mvn install -Pno-validations
+    - mvn -e install -Pno-validations
     - eval $TESTER_DEPENDENCIES
 machine:
   java:
@@ -45,7 +45,7 @@
     TEST_3: $CMD1$CMD2$TAPESTRY$STORM$CASSANDRA$CMD3
     # Test over apache-commons, hadoop, scouter, groovy
     TEST_4: $CMD1$CMD2$COMMONS$HADOOP$SCOUTER$GROOVY$CMD3
-    SKIP_FILES: ".github|appveyor.yml|.travis.yml|.ci|distelli-manifest.yml|fast-forward-merge.sh|LICENSE|LICENSE.apache20|README.md|release.sh|RIGHTS.antlr|shippable.yml|wercker.yml|intellij-idea-inspections.xml|org.eclipse.jdt.core.prefs"
+    SKIP_FILES: ".github|appveyor.yml|.travis.yml|.ci|distelli-manifest.yml|fast-forward-merge.sh|LICENSE|LICENSE.apache20|README.md|release.sh|RIGHTS.antlr|shippable.yml|wercker.yml|wercker.sh|intellij-idea-inspections.xml|org.eclipse.jdt.core.prefs"
 test:
   override:
     - if [ $(git diff --name-only HEAD HEAD~1 | grep -vE $SKIP_FILES | wc -c) -gt 0 ] ; then case $CIRCLE_NODE_INDEX in 0) eval $TEST_1 ;; 1) eval $TEST_2 ;; 2) eval $TEST_3 ;;  3) eval $TEST_4 ;; esac; fi:
diff --git a/config/ant-phase-verify.xml b/config/ant-phase-verify.xml
index b9a2331..feba93f 100644
--- a/config/ant-phase-verify.xml
+++ b/config/ant-phase-verify.xml
@@ -38,6 +38,8 @@
       <property key="checkstyle.importcontroltest.file" file="config/import-control-test.xml"/>
       <property key="checkstyle.suppressions.file"
                 file="config/suppressions.xml"/>
+      <property key="checkstyle.suppressions-xpath.file"
+                file="config/suppressions-xpath.xml"/>
     </checkstyle>
 
     <tstamp>
diff --git a/config/catalog.xml b/config/catalog.xml
index 896f017..20ce707 100644
--- a/config/catalog.xml
+++ b/config/catalog.xml
@@ -8,7 +8,9 @@
     <system systemId="http://checkstyle.sourceforge.net/dtds/packages_1_0.dtd" uri="./../src/main/resources/com/puppycrawl/tools/checkstyle/packages_1_0.dtd"/>
     <system systemId="http://checkstyle.sourceforge.net/dtds/suppressions_1_0.dtd" uri="./../src/main/resources/com/puppycrawl/tools/checkstyle/suppressions_1_0.dtd"/>
     <system systemId="http://checkstyle.sourceforge.net/dtds/suppressions_1_1.dtd" uri="./../src/main/resources/com/puppycrawl/tools/checkstyle/suppressions_1_1.dtd"/>
+    <system systemId="http://checkstyle.sourceforge.net/dtds/suppressions_1_2.dtd" uri="./../src/main/resources/com/puppycrawl/tools/checkstyle/suppressions_1_2.dtd"/>
     <system systemId="http://checkstyle.sourceforge.net/dtds/suppressions_1_1_xpath_experimental.dtd" uri="./../src/main/resources/com/puppycrawl/tools/checkstyle/suppressions_1_1_xpath_experimental.dtd"/>
+    <system systemId="http://checkstyle.sourceforge.net/dtds/suppressions_1_2_xpath_experimental.dtd" uri="./../src/main/resources/com/puppycrawl/tools/checkstyle/suppressions_1_2_xpath_experimental.dtd"/>
     <system systemId="http://checkstyle.sourceforge.net/dtds/import_control_1_0.dtd" uri="./../src/main/resources/com/puppycrawl/tools/checkstyle/checks/imports/import_control_1_0.dtd"/>
     <system systemId="http://checkstyle.sourceforge.net/dtds/import_control_1_1.dtd" uri="./../src/main/resources/com/puppycrawl/tools/checkstyle/checks/imports/import_control_1_1.dtd"/>
     <system systemId="http://checkstyle.sourceforge.net/dtds/import_control_1_2.dtd" uri="./../src/main/resources/com/puppycrawl/tools/checkstyle/checks/imports/import_control_1_2.dtd"/>
diff --git a/config/checkstyle_checks.xml b/config/checkstyle_checks.xml
index c94e8f5..1f5dce7 100644
--- a/config/checkstyle_checks.xml
+++ b/config/checkstyle_checks.xml
@@ -35,6 +35,15 @@
     <property name="file" value="${checkstyle.suppressions.file}"/>
   </module>
   <module name="SuppressWarningsFilter"/>
+  <module name="SuppressWithPlainTextCommentFilter">
+    <!--
+      Use suppressions.xml for suppressions, this is only example.
+      checkFormat will prevent suppression comments from being valid.
+    -->
+    <property name="checkFormat" value="IGNORETHIS"/>
+    <property name="offCommentFormat" value="CSOFF\: .*"/>
+    <property name="onCommentFormat" value="CSON\: .*"/>
+  </module>
 
   <!-- Headers -->
   <module name="Header">
@@ -312,6 +321,9 @@
       <property name="offCommentFormat" value="CSOFF\: .*"/>
       <property name="onCommentFormat" value="CSON\: .*"/>
     </module>
+    <module name="SuppressionXpathFilter">
+      <property name="file" value="${checkstyle.suppressions-xpath.file}"/>
+    </module>
     <module name="SuppressWithNearbyCommentFilter">
       <property name="commentFormat" value="-@cs\[(\w{8,}(\|\w{8,})*)\] \w[\(\)\-\.\'\`\,\:\;\w ]{10,}"/>
       <property name="checkFormat" value="$1"/>
diff --git a/config/findbugs-exclude.xml b/config/findbugs-exclude.xml
index 0f4b8a2..e9898d1 100644
--- a/config/findbugs-exclude.xml
+++ b/config/findbugs-exclude.xml
@@ -91,16 +91,69 @@
         <Bug pattern="NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE" />
     </Match>
     <Match>
-        <!-- Temporary disabled. Have to deal with Javadoc nodes as well
-         See https://github.com/checkstyle/checkstyle/issues/3432-->
-        <Class name="com.puppycrawl.tools.checkstyle.gui.TreeTable" />
-        <Method name="makeCodeSelection"/>
-        <Bug pattern="RV_RETURN_VALUE_IGNORED_NO_SIDE_EFFECT"/>
-    </Match>
-    <Match>
         <!-- false-positive. Bugs reported even though casting is done only after verification using instanceof -->
         <Class name="com.puppycrawl.tools.checkstyle.JavadocDetailNodeParser"/>
         <Method name="parseJavadocAsDetailNode"/>
         <Bug pattern="BC_UNCONFIRMED_CAST_OF_RETURN_VALUE"/>
     </Match>
+    <Match>
+        <!-- false-positive. See details at https://github.com/checkstyle/checkstyle/pull/5403 -->
+        <Class name="com.puppycrawl.tools.checkstyle.Main"/>
+        <Method name="loadProperties"/>
+        <Bug pattern="NP_NULL_PARAM_DEREF"/>
+    </Match>
+    <Match>
+        <!-- false-positive. See details at https://github.com/checkstyle/checkstyle/pull/5403 -->
+        <Class name="com.puppycrawl.tools.checkstyle.PackageNamesLoader"/>
+        <Method name="processFile"/>
+        <Bug pattern="NP_NULL_PARAM_DEREF"/>
+    </Match>
+    <Match>
+        <!-- false-positive. See details at https://github.com/checkstyle/checkstyle/pull/5403 -->
+        <Class name="com.puppycrawl.tools.checkstyle.PropertyCacheFile"/>
+        <Method name="flushAndCloseOutStream"/>
+        <Bug pattern="NP_NULL_PARAM_DEREF"/>
+    </Match>
+    <Match>
+        <!-- false-positive. See details at https://github.com/checkstyle/checkstyle/pull/5403 -->
+        <Class name="com.puppycrawl.tools.checkstyle.PropertyCacheFile"/>
+        <Method name="load"/>
+        <Bug pattern="NP_NULL_PARAM_DEREF"/>
+    </Match>
+    <Match>
+        <!-- false-positive. See details at https://github.com/checkstyle/checkstyle/pull/5403 -->
+        <Class name="com.puppycrawl.tools.checkstyle.checks.header.AbstractHeaderCheck"/>
+        <Method name="loadHeaderFile"/>
+        <Bug pattern="NP_NULL_PARAM_DEREF"/>
+    </Match>
+    <Match>
+        <!-- false-positive. See details at https://github.com/checkstyle/checkstyle/pull/5403 -->
+        <Class name="com.puppycrawl.tools.checkstyle.ant.CheckstyleAntTask"/>
+        <Method name="createOverridingProperties"/>
+        <Bug pattern="NP_NULL_PARAM_DEREF"/>
+    </Match>
+    <Match>
+        <!-- false-positive. See details at https://github.com/checkstyle/checkstyle/pull/5403 -->
+        <Class name="com.puppycrawl.tools.checkstyle.PropertyCacheFile"/>
+        <Method name="persist"/>
+        <Bug pattern="NP_GUARANTEED_DEREF_ON_EXCEPTION_PATH"/>
+    </Match>
+    <Match>
+        <!-- false-positive. See details at https://github.com/checkstyle/checkstyle/pull/5403 -->
+        <Class name="com.puppycrawl.tools.checkstyle.PropertyCacheFile"/>
+        <Method name="persist"/>
+        <Bug pattern="NP_NULL_PARAM_DEREF"/>
+    </Match>
+    <Match>
+        <!-- false-positive. See details at https://github.com/checkstyle/checkstyle/pull/5403 -->
+        <Class name="com.puppycrawl.tools.checkstyle.checks.TranslationCheck"/>
+        <Method name="getTranslationKeys"/>
+        <Bug pattern="NP_GUARANTEED_DEREF_ON_EXCEPTION_PATH"/>
+    </Match>
+    <Match>
+        <!-- false-positive. See details at https://github.com/checkstyle/checkstyle/pull/5403 -->
+        <Class name="com.puppycrawl.tools.checkstyle.checks.UniquePropertiesCheck"/>
+        <Method name="processFiltered"/>
+        <Bug pattern="NP_GUARANTEED_DEREF_ON_EXCEPTION_PATH"/>
+    </Match>
 </FindBugsFilter>
diff --git a/config/import-control.xml b/config/import-control.xml
index 126d2fc..2a9ce1b 100644
--- a/config/import-control.xml
+++ b/config/import-control.xml
@@ -95,11 +95,6 @@
            local-only="true"/>
     <allow pkg="org.antlr.v4.runtime" local-only="true"/>
 
-    <!-- allowed till https://github.com/checkstyle/checkstyle/issues/3455 -->
-    <allow class="com.google.common.io.Closeables" local-only="true"/>
-    <allow class="com.google.common.collect.ImmutableCollection" local-only="true"/>
-    <allow class="com.google.common.collect.ImmutableMap" local-only="true"/>
-
     <allow class="com.puppycrawl.tools.checkstyle.Checker" local-only="true"/>
     <!-- allowed till https://github.com/checkstyle/checkstyle/issues/3817 -->
     <allow pkg="com.puppycrawl.tools.checkstyle.utils"/>
@@ -120,6 +115,9 @@
     <allow class="com.google.common.collect.Multiset.Entry" local-only="true"/>
     <allow class="com.google.common.collect.SetMultimap" local-only="true"/>
 
+    <subpackage name="imports">
+      <allow class="com.puppycrawl.tools.checkstyle.XmlLoader" local-only="true"/>
+    </subpackage>
     <subpackage name="indentation">
       <allow pkg="java.lang.reflect"/>
     </subpackage>
@@ -154,9 +152,11 @@
     <allow class="java.lang.ref.WeakReference" local-only="true"/>
     <allow class="com.puppycrawl.tools.checkstyle.TreeWalkerAuditEvent" local-only="true"/>
     <allow class="com.puppycrawl.tools.checkstyle.TreeWalkerFilter" local-only="true"/>
+    <allow class="com.puppycrawl.tools.checkstyle.XmlLoader" local-only="true"/>
     <disallow pkg="com\.puppycrawl\.tools\.checkstyle\.checks\.[^.]+" regex="true"/>
     <allow pkg="com.puppycrawl.tools.checkstyle.utils"/>
     <allow pkg="com.puppycrawl.tools.checkstyle.xpath"/>
+    <allow class="java.nio.charset.StandardCharsets" local-only="true"/>
   </subpackage>
 
   <subpackage name="gui" strategyOnMismatch="disallowed">
diff --git a/config/intellij-idea-inspections.xml b/config/intellij-idea-inspections.xml
index c35ca45..33d284f 100644
--- a/config/intellij-idea-inspections.xml
+++ b/config/intellij-idea-inspections.xml
@@ -3,8 +3,7 @@
     <option name="myName" value="Checkstyle" />
     <inspection_tool class="AbsoluteAlignmentInUserInterface" enabled="true" level="ERROR" enabled_by_default="true" />
     <inspection_tool class="AbstractBeanReferencesInspection" enabled="true" level="WARNING" enabled_by_default="true" />
-    <!-- till https://github.com/checkstyle/checkstyle/issues/4716 -->
-    <inspection_tool class="AbstractClassExtendsConcreteClass" enabled="false" level="ERROR" enabled_by_default="false" />
+    <inspection_tool class="AbstractClassExtendsConcreteClass" enabled="true" level="ERROR" enabled_by_default="true" />
     <inspection_tool class="AbstractClassNamingConvention" enabled="true" level="WARNING" enabled_by_default="true">
         <option name="m_regex" value="[A-Z][A-Za-z\d]*|Check" />
         <option name="m_minLength" value="5" />
@@ -2091,8 +2090,6 @@
                      See https://github.com/checkstyle/checkstyle/issues/2285-->
                 <option value="ProhibitedExceptionThrown" />
                 <option value="MismatchedQueryAndUpdateOfCollection" />
-                <!-- Till https://github.com/checkstyle/checkstyle/issues/3066 -->
-                <option value="ProhibitedExceptionCaught" />
                 <!-- No way to split apart huge if/else branches in test. -->
                 <option value="IfStatementWithTooManyBranches" />
                 <!-- we have to catch Exception in Checker and rethrow it -->
diff --git a/config/pmd-test.xml b/config/pmd-test.xml
index a444b60..1314160 100644
--- a/config/pmd-test.xml
+++ b/config/pmd-test.xml
@@ -94,6 +94,7 @@
             | //ClassOrInterfaceDeclaration[@Image='AstRegressionTest']//MethodDeclarator[@Image='testImpossibleValid']
             | //ClassOrInterfaceDeclaration[@Image='AllChecksTest']//MethodDeclarator[@Image='testAllModulesAreReferencedInConfigFile']
             | //ClassOrInterfaceDeclaration[@Image='DetailASTTest']//MethodDeclarator[@Image='testTreeStructure']
+            | //ClassOrInterfaceDeclaration[@Image='SuppressWithPlainTextCommentFilterTest']//MethodDeclarator[@Image='testEqualsAndHashCodeOfTagClass']
             "/>
         </properties>
     </rule>
diff --git a/config/pmd.xml b/config/pmd.xml
index cebf840..01eb897 100644
--- a/config/pmd.xml
+++ b/config/pmd.xml
@@ -184,7 +184,7 @@
     <properties>
      <!-- Can not change API -->
     <property name="violationSuppressXPath" value="//ClassOrInterfaceDeclaration[@Image='AbstractFileSetCheck'
-    or @Image='AbstractCheck' or @Image='AbstractJavadocCheck' or @Image='AbstractNode']"/>
+    or @Image='AbstractCheck' or @Image='AbstractJavadocCheck' or @Image='AbstractNode' or @Image='AbstractViolationReporter']"/>
     </properties>
   </rule>
 
@@ -264,7 +264,7 @@
   <rule ref="rulesets/java/naming.xml/AbstractNaming">
     <properties>
      <!-- We can not brake compatibility with previous versions -->
-     <property name="violationSuppressXPath" value="//ClassOrInterfaceDeclaration[@Image='AbstractClassNameCheck']"/>
+     <property name="violationSuppressXPath" value="//ClassOrInterfaceDeclaration[@Image='AbstractClassNameCheck' or @Image='AutomaticBean']"/>
     </properties>
   </rule>
   <rule ref="rulesets/java/naming.xml/LongVariable">
diff --git a/config/suppressions-xpath.xml b/config/suppressions-xpath.xml
new file mode 100644
index 0000000..65fba6d
--- /dev/null
+++ b/config/suppressions-xpath.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+
+<!DOCTYPE suppressions PUBLIC
+    "-//Puppy Crawl//DTD Suppressions Xpath Experimental 1.2//EN"
+    "http://checkstyle.sourceforge.net/dtds/suppressions_1_2_xpath_experimental.dtd">
+
+<suppressions>
+    <!-- Tone down the checking for test code -->
+    <suppress-xpath checks="NPathComplexity"
+                    query="/CLASS_DEF[@text='XdocsPagesTest']
+                    //METHOD_DEF[@text='validateCheckSection']"/>
+
+    <suppress-xpath checks="CyclomaticComplexity"
+                    query="/CLASS_DEF[@text='XdocsPagesTest']//METHOD_DEF"/>
+
+    <!-- Suppressions from PMD configuration-->
+    <!-- JavadocMethodCheck, JavadocStyleCheck, JavadocUtils.getJavadocTags() - deprecated -->
+    <suppress-xpath checks="CyclomaticComplexity"
+                    query="/CLASS_DEF[@text='JavadocMethodCheck' or @text='JavadocStyleCheck'
+                    or @text='CustomImportOrderCheck']//METHOD_DEF"/>
+</suppressions>
diff --git a/config/suppressions.xml b/config/suppressions.xml
index 1273406..aeb9c33 100644
--- a/config/suppressions.xml
+++ b/config/suppressions.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0"?>
 
 <!DOCTYPE suppressions PUBLIC
-    "-//Puppy Crawl//DTD Suppressions 1.1//EN"
-    "http://checkstyle.sourceforge.net/dtds/suppressions_1_1.dtd">
+    "-//Puppy Crawl//DTD Suppressions 1.2//EN"
+    "http://checkstyle.sourceforge.net/dtds/suppressions_1_2.dtd">
 
 <suppressions>
     <suppress checks="FileLength"
@@ -21,14 +21,12 @@
               files="AbstractClassNameCheck.java"/>
     <!-- test should be named as their main class -->
     <suppress checks="AbstractClassNameCheck"
-              files="AbstractCheckTest.java|AbstractClassNameCheckTest.java|AbstractTypeAwareCheckTest.java|AbstractJavadocCheckTest.java|AbstractViolationReporterTest.java|AbstractFileSetCheckTest.java|AbstractLoaderTest.java|AbstractNodeTest.java"/>
+              files="AbstractCheckTest.java|AbstractClassNameCheckTest.java|AbstractTypeAwareCheckTest.java|AbstractJavadocCheckTest.java|AbstractViolationReporterTest.java|AbstractFileSetCheckTest.java|AbstractNodeTest.java"/>
 
     <!-- Tone down the checking for test code -->
-    <suppress checks="CyclomaticComplexity" files="[\\/]XdocsPagesTest\.java"/>
-    <suppress checks="NPathComplexity" files="[\\/]XdocsPagesTest\.java"/>
     <suppress checks="IllegalCatch" files="[\\/]internal[\\/].*[\\/]\w+Util\.java"/>
     <suppress checks="EmptyBlock" files=".*[\\/]src[\\/]test[\\/]"/>
-    <suppress checks="Javadoc" files=".*[\\/]src[\\/](test|it)[\\/]"/>
+    <suppress message="Missing a Javadoc comment|Missing package-info.java file|Expected @throws tag for|missing an @author tag" files=".*[\\/]src[\\/](test|it)[\\/]"/>
     <suppress checks="MagicNumber" files=".*[\\/]src[\\/](test|it)[\\/]"/>
     <suppress checks="AvoidStaticImport" files=".*[\\/]src[\\/](test|it)[\\/]"/>
     <suppress checks="ClassDataAbstractionCoupling" files="[\\/]IndentationCheckTest.java$|[\\/]SuppressWithNearbyCommentFilterTest.java$|[\\/]SuppressionCommentFilterTest.java|[\\/]DetailASTTest.java$"/>
@@ -85,12 +83,6 @@
     <!-- Should be fixed after moving https://github.com/sevntu-checkstyle/sevntu.checkstyle/blob/master/sevntu-checks/src/main/java/com/github/sevntu/checkstyle/checks/coding/ReturnCountExtendedCheck.java into the main repo, to allow skip guard sentences(or by topLinesToIgnoreCount) -->
     <suppress checks="ReturnCount" files="(ConfigurationLoader|LambdaHandler)\.java"/>
 
-    <!-- Suppressions from PMD configuration-->
-    <!-- JavadocMethodCheck, JavadocStyleCheck, JavadocUtils.getJavadocTags() - deprecated -->
-    <suppress checks="CyclomaticComplexity" files="JavadocMethodCheck\.java"/>
-    <suppress checks="CyclomaticComplexity" files="JavadocStyleCheck\.java"/>
-    <suppress checks="CyclomaticComplexity" files="CustomImportOrderCheck\.java"/>
-
     <!-- HandlerFactory crosses allowed limit for executable statements -->
     <suppress checks="ExecutableStatementCount" files="HandlerFactory\.java"/>
 </suppressions>
diff --git a/config/version-number-rules.xml b/config/version-number-rules.xml
new file mode 100644
index 0000000..ab7b21a
--- /dev/null
+++ b/config/version-number-rules.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ruleset xmlns="http://mojo.codehaus.org/versions-maven-plugin/rule/2.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+    comparisonMethod="maven" xsi:schemaLocation="http://mojo.codehaus.org/versions-maven-plugin/rule/2.0.0 https://mojo.codehaus.org/versions-maven-plugin/xsd/rule-2.0.0.xsd">
+
+    <ignoreVersions>
+        <ignoreVersion type="regex">.*[-_\.](alpha|Alpha|ALPHA|beta|Beta|BETA|rc|RC|M|EA)[-_\.]?[0-9]?.*</ignoreVersion>
+    </ignoreVersions>
+    <rules>
+        <rule groupId="com.google.guava" artifactId="guava">
+            <ignoreVersions>
+                <ignoreVersion type="regex">.*-android</ignoreVersion>
+            </ignoreVersions>
+        </rule>
+        <rule groupId="antlr" artifactId="antlr">
+            <ignoreVersions>
+                <!-- this is really old version before versioning become semantic -->
+                <ignoreVersion type="regex">20030911</ignoreVersion>
+            </ignoreVersions>
+        </rule>
+        <rule groupId="org.apache.maven.plugins" artifactId="maven-release-plugin">
+            <ignoreVersions>
+                <!-- we use 2.1 version that is defined at our parent
+                http://central.maven.org/maven2/org/sonatype/oss/oss-parent/9/oss-parent-9.pom
+                It is better to use same version as in parent, we have to use such parent
+                to use nexus-staging-maven-plugin to deploy maven central
+                -->
+                <ignoreVersion type="regex">.*</ignoreVersion>
+            </ignoreVersions>
+        </rule>
+    </rules>
+</ruleset>
diff --git a/distelli-manifest.yml b/distelli-manifest.yml
index aa2042a..2838760 100644
--- a/distelli-manifest.yml
+++ b/distelli-manifest.yml
@@ -2,7 +2,7 @@
 checkstyle/checkstyle:
   Build:
     - set -e
-    - SKIP_FILES="appveyor.yml|circle.yml|shippable.yml|.travis.yml|wercker.yml|fast-forward-merge.sh|LICENSE|LICENSE.apache20|README.md|release.sh|RIGHTS.antlr|intellij-idea-inspections.xml|org.eclipse.jdt.core.prefs"
+    - SKIP_FILES="appveyor.yml|circle.yml|shippable.yml|.travis.yml|wercker.yml|wercker.sh|fast-forward-merge.sh|LICENSE|LICENSE.apache20|README.md|release.sh|RIGHTS.antlr|intellij-idea-inspections.xml|org.eclipse.jdt.core.prefs"
     - SKIP_CI=$(if [[ $(git diff --name-only HEAD HEAD~1 | grep -vE "$SKIP_FILES" | cat | wc -c) > 0 ]]; then echo false; else echo true; fi;)
     - echo "SKIP_CI="$SKIP_CI
     - |
diff --git a/pom.xml b/pom.xml
index 0c15382..244454d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -22,7 +22,7 @@
 
   <groupId>com.puppycrawl.tools</groupId>
   <artifactId>checkstyle</artifactId>
-  <version>8.5</version>
+  <version>8.7</version>
   <packaging>jar</packaging>
 
   <name>checkstyle</name>
@@ -211,22 +211,22 @@
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
     <projectVersion>${project.version}</projectVersion>
-    <antlr4.version>4.7</antlr4.version>
+    <antlr4.version>4.7.1</antlr4.version>
     <maven.site.plugin.version>3.6</maven.site.plugin.version>
     <maven.findbugs.plugin.version>3.0.5</maven.findbugs.plugin.version>
     <maven.spotbugs.plugin.version>3.0.6</maven.spotbugs.plugin.version>
     <maven.pmd.plugin.version>3.8</maven.pmd.plugin.version>
     <pmd.version>5.8.1</pmd.version>
     <maven.jacoco.plugin.version>0.7.9</maven.jacoco.plugin.version>
-    <saxon.version>9.8.0-5</saxon.version>
+    <saxon.version>9.8.0-7</saxon.version>
     <maven.checkstyle.plugin.version>2.17</maven.checkstyle.plugin.version>
     <maven.sevntu.checkstyle.plugin.version>1.25.0</maven.sevntu.checkstyle.plugin.version>
-    <maven.sevntu-checkstyle-check.checkstyle.version>8.4</maven.sevntu-checkstyle-check.checkstyle.version>
+    <maven.sevntu-checkstyle-check.checkstyle.version>8.6</maven.sevntu-checkstyle-check.checkstyle.version>
     <maven.versions.plugin.version>2.5</maven.versions.plugin.version>
     <java.version>1.8</java.version>
     <tools.jar.version>${java.version}.0</tools.jar.version>
     <tools.jar.path>${java.home}/../lib/tools.jar</tools.jar.path>
-    <pitest.plugin.version>1.2.4</pitest.plugin.version>
+    <pitest.plugin.version>1.3.1</pitest.plugin.version>
     <pitest.plugin.timeout.factor>10</pitest.plugin.timeout.factor>
     <pitest.plugin.timeout.constant>50000</pitest.plugin.timeout.constant>
     <pitest.plugin.threads>4</pitest.plugin.threads>
@@ -271,7 +271,7 @@
     <dependency>
       <groupId>com.google.guava</groupId>
       <artifactId>guava</artifactId>
-      <version>23.2-jre</version>
+      <version>23.6-jre</version>
     </dependency>
     <dependency>
       <groupId>org.apache.ant</groupId>
@@ -290,13 +290,13 @@
     <dependency>
       <groupId>com.github.stefanbirkner</groupId>
       <artifactId>system-rules</artifactId>
-      <version>1.16.1</version>
+      <version>1.17.0</version>
       <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>nl.jqno.equalsverifier</groupId>
       <artifactId>equalsverifier</artifactId>
-      <version>2.3.3</version>
+      <version>2.4</version>
       <scope>test</scope>
     </dependency>
     <dependency>
@@ -314,13 +314,13 @@
     <dependency>
       <groupId>commons-io</groupId>
       <artifactId>commons-io</artifactId>
-      <version>2.5</version>
+      <version>2.6</version>
       <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit</artifactId>
-      <version>4.9.0.201710071750-r</version>
+      <version>4.9.2.201712150930-r</version>
       <scope>test</scope>
     </dependency>
     <dependency>
@@ -346,10 +346,50 @@
   <build>
     <pluginManagement>
       <plugins>
+        <!-- from super-pom http://maven.apache.org/ref/3.5.2/maven-model-builder/super-pom.html BEGIN -->
+        <!-- we need to override just make "mvn versions:plugin-updates-report" see no old versions -->
+        <plugin>
+          <artifactId>maven-antrun-plugin</artifactId>
+          <version>1.8</version>
+        </plugin>
+        <plugin>
+          <artifactId>maven-assembly-plugin</artifactId>
+          <version>3.1.0</version>
+        </plugin>
+        <plugin>
+          <artifactId>maven-dependency-plugin</artifactId>
+          <version>3.0.2</version>
+        </plugin>
+        <plugin>
+          <artifactId>maven-release-plugin</artifactId>
+          <!-- version is same as in supper-pom as it is better to use same version as in sonatype-nexus-staging -->
+          <version>2.1</version>
+        </plugin>
+        <!-- from super-pom END -->
+        <plugin>
+          <groupId>org.codehaus.mojo</groupId>
+          <artifactId>cobertura-maven-plugin</artifactId>
+          <version>2.7</version>
+        </plugin>
+        <plugin>
+          <groupId>org.codehaus.mojo</groupId>
+          <artifactId>sonar-maven-plugin</artifactId>
+          <version>3.4.0.905</version>
+        </plugin>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-shade-plugin</artifactId>
+          <version>3.1.0</version>
+        </plugin>
+        <plugin>
+          <groupId>org.pitest</groupId>
+          <artifactId>pitest-maven</artifactId>
+          <version>${pitest.plugin.version}</version>
+        </plugin>
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-javadoc-plugin</artifactId>
-          <version>2.10.4</version>
+          <version>3.0.0</version>
           <configuration>
             <source>${java.version}</source>
             <failOnError>true</failOnError>
@@ -680,6 +720,11 @@
         <version>${maven.versions.plugin.version}</version>
         <configuration>
           <generateBackupPoms>false</generateBackupPoms>
+          <rulesUri>file://${basedir}/config/version-number-rules.xml</rulesUri>
+          <formats>
+            <format>xml</format>
+            <format>html</format>
+          </formats>
         </configuration>
       </plugin>
       <plugin>
@@ -1086,8 +1131,7 @@
           <!-- generated classes, unfortunately use problematic api -->
           <exclude>**/GeneratedJavaLexer.class</exclude>
           <exclude>**/JavadocParser.class</exclude>
-          <!-- excluded till https://github.com/policeman-tools/forbidden-apis/issues/108-->
-          <exclude>**/checks/annotation/annotationlocation/InputAnnotationLocationDeprecatedAndCustom*</exclude>
+          <exclude>**/Input*</exclude>
         </excludes>
       </configuration>
       <executions>
@@ -1148,7 +1192,6 @@
       <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>cobertura-maven-plugin</artifactId>
-        <version>2.7</version>
         <reportSets>
           <reportSet>
             <reports>
@@ -1232,7 +1275,7 @@
         <artifactId>maven-report</artifactId>
         <version>0.1</version>
         <configuration>
-          <sonarHostURL>https://sonarqube.com</sonarHostURL>
+          <sonarHostURL>https://sonarcloud.io</sonarHostURL>
         </configuration>
       </plugin>
 
@@ -1305,6 +1348,7 @@
             <excludedLink>http://search.maven.org/*</excludedLink>
             <!-- codehaus does not exists anymore -->
             <excludedLink>http://sonar-plugins.codehaus.org/maven-report</excludedLink>
+            <excludedLink>http://www.mojohaus.org/sonar-maven-plugin/sonar-maven-plugin</excludedLink>
             <!-- this plugin does not have site at all -->
             <excludedLink>http://hazendaz.github.io/findbugs-maven-plugin/</excludedLink>
             <!-- SSLHandshakeException but page is opening -->
@@ -1336,7 +1380,7 @@
             by sonar's developers. It is not allowed to open issue against sonar's maven report plugin
             at sonar's issue tracker: http://jira.codehaus.org/browse/MSONAR
             Sonar's mailing lists: http://www.mojohaus.org/sonar-maven-plugin/mail-lists.html-->
-            <excludedLink>https://sonarqube.com/project/index/com.puppycrawl.tools:checkstyle</excludedLink>
+            <excludedLink>https://sonarcloud.io/project/index/com.puppycrawl.tools:checkstyle</excludedLink>
             <!-- SSL error, skip validating released "-all" jar on sourceforge as it is uploaded after site generation-->
             <excludedLink>http://downloads.sourceforge.net/project/checkstyle/checkstyle/*/checkstyle-*-all.jar</excludedLink>
 
@@ -1348,6 +1392,8 @@
             <excludedLink>https://github.com/search*</excludedLink>
             <!-- till https://github.com/apache/maven-plugins/pull/81 -->
             <excludedLink>http://git-scm.com*</excludedLink>
+            <!-- links works but not in linkcheck -->
+            <excludedLink>https://marketplace.visualstudio.com/items?itemName=shengchen.vscode-checkstyle</excludedLink>
 
             <!-- reason described at https://github.com/checkstyle/checkstyle/issues/3080 -->
             <excludedLink>https://www.scm-manager.org/</excludedLink>
@@ -1384,6 +1430,8 @@
             <!-- permanent: avax.net.ssl.SSLException : Received fatal alert: internal_error -->
             <excludedLink>https://salt.bountysource.com/teams/checkstyle</excludedLink>
             <excludedLink>https://www.bountysource.com/teams/checkstyle/issues</excludedLink>
+            <!--  javax.net.ssl.SSLHandshakeException : Received fatal alert: handshake_failure -->
+            <excludedLink>https://eclipse.org</excludedLink>
           </excludedLinks>
         </configuration>
       </plugin>
@@ -1488,7 +1536,6 @@
           <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-shade-plugin</artifactId>
-            <version>3.1.0</version>
             <executions>
               <execution>
                 <phase>package</phase>
@@ -1521,7 +1568,6 @@
           <!-- Creates the binary and source distributions -->
           <plugin>
             <artifactId>maven-assembly-plugin</artifactId>
-            <version>3.1.0</version>
             <configuration>
               <descriptors>
                 <descriptor>config/assembly-bin.xml</descriptor>
@@ -1551,7 +1597,6 @@
           <plugin>
             <groupId>org.codehaus.mojo</groupId>
             <artifactId>sonar-maven-plugin</artifactId>
-            <version>3.3.0.603</version>
           </plugin>
         </plugins>
       </build>
@@ -1567,7 +1612,6 @@
           <plugin>
             <groupId>org.codehaus.mojo</groupId>
             <artifactId>cobertura-maven-plugin</artifactId>
-            <version>2.7</version>
             <configuration>
               <quiet>true</quiet>
               <formats>
@@ -1684,7 +1728,8 @@
                 <param>com.puppycrawl.tools.checkstyle.checks.UniquePropertiesCheckTest</param>
                 <param>com.puppycrawl.tools.checkstyle.checks.UpperEllCheckTest</param>
               </targetTests>
-              <mutationThreshold>99</mutationThreshold>
+              <coverageThreshold>100</coverageThreshold>
+              <mutationThreshold>100</mutationThreshold>
               <timeoutFactor>${pitest.plugin.timeout.factor}</timeoutFactor>
               <timeoutConstant>${pitest.plugin.timeout.constant}</timeoutConstant>
               <threads>${pitest.plugin.threads}</threads>
@@ -1723,6 +1768,7 @@
                 <param>com.puppycrawl.tools.checkstyle.checks.annotation.PackageAnnotationCheckTest</param>
                 <param>com.puppycrawl.tools.checkstyle.checks.annotation.SuppressWarningsCheckTest</param>
               </targetTests>
+              <coverageThreshold>100</coverageThreshold>
               <mutationThreshold>100</mutationThreshold>
               <timeoutFactor>${pitest.plugin.timeout.factor}</timeoutFactor>
               <timeoutConstant>${pitest.plugin.timeout.constant}</timeoutConstant>
@@ -1750,6 +1796,7 @@
               <targetTests>
                 <param>com.puppycrawl.tools.checkstyle.checks.blocks.*</param>
               </targetTests>
+              <coverageThreshold>100</coverageThreshold>
               <mutationThreshold>97</mutationThreshold>
               <timeoutFactor>${pitest.plugin.timeout.factor}</timeoutFactor>
               <timeoutConstant>${pitest.plugin.timeout.constant}</timeoutConstant>
@@ -1777,7 +1824,8 @@
               <targetTests>
                 <param>com.puppycrawl.tools.checkstyle.checks.coding.*</param>
               </targetTests>
-              <mutationThreshold>97</mutationThreshold>
+              <coverageThreshold>100</coverageThreshold>
+              <mutationThreshold>98</mutationThreshold>
               <timeoutFactor>${pitest.plugin.timeout.factor}</timeoutFactor>
               <timeoutConstant>${pitest.plugin.timeout.constant}</timeoutConstant>
               <threads>${pitest.plugin.threads}</threads>
@@ -1804,6 +1852,7 @@
               <targetTests>
                 <param>com.puppycrawl.tools.checkstyle.checks.design.*</param>
               </targetTests>
+              <coverageThreshold>100</coverageThreshold>
               <mutationThreshold>100</mutationThreshold>
               <timeoutFactor>${pitest.plugin.timeout.factor}</timeoutFactor>
               <timeoutConstant>${pitest.plugin.timeout.constant}</timeoutConstant>
@@ -1831,6 +1880,7 @@
               <targetTests>
                 <param>com.puppycrawl.tools.checkstyle.checks.header.*</param>
               </targetTests>
+              <coverageThreshold>100</coverageThreshold>
               <mutationThreshold>100</mutationThreshold>
               <timeoutFactor>${pitest.plugin.timeout.factor}</timeoutFactor>
               <timeoutConstant>${pitest.plugin.timeout.constant}</timeoutConstant>
@@ -1858,6 +1908,7 @@
               <targetTests>
                 <param>com.puppycrawl.tools.checkstyle.checks.imports.*</param>
               </targetTests>
+              <coverageThreshold>100</coverageThreshold>
               <mutationThreshold>96</mutationThreshold>
               <timeoutFactor>${pitest.plugin.timeout.factor}</timeoutFactor>
               <timeoutConstant>${pitest.plugin.timeout.constant}</timeoutConstant>
@@ -1885,6 +1936,7 @@
               <targetTests>
                 <param>com.puppycrawl.tools.checkstyle.checks.indentation.*</param>
               </targetTests>
+              <coverageThreshold>100</coverageThreshold>
               <mutationThreshold>94</mutationThreshold>
               <timeoutFactor>${pitest.plugin.timeout.factor}</timeoutFactor>
               <timeoutConstant>${pitest.plugin.timeout.constant}</timeoutConstant>
@@ -1912,6 +1964,7 @@
               <targetTests>
                 <param>com.puppycrawl.tools.checkstyle.checks.javadoc.*</param>
               </targetTests>
+              <coverageThreshold>100</coverageThreshold>
               <mutationThreshold>95</mutationThreshold>
               <timeoutFactor>${pitest.plugin.timeout.factor}</timeoutFactor>
               <timeoutConstant>${pitest.plugin.timeout.constant}</timeoutConstant>
@@ -1939,7 +1992,8 @@
               <targetTests>
                 <param>com.puppycrawl.tools.checkstyle.checks.metrics.*</param>
               </targetTests>
-              <mutationThreshold>97</mutationThreshold>
+              <coverageThreshold>100</coverageThreshold>
+              <mutationThreshold>100</mutationThreshold>
               <timeoutFactor>${pitest.plugin.timeout.factor}</timeoutFactor>
               <timeoutConstant>${pitest.plugin.timeout.constant}</timeoutConstant>
               <threads>${pitest.plugin.threads}</threads>
@@ -1966,6 +2020,7 @@
               <targetTests>
                 <param>com.puppycrawl.tools.checkstyle.checks.modifier.*</param>
               </targetTests>
+              <coverageThreshold>100</coverageThreshold>
               <mutationThreshold>100</mutationThreshold>
               <timeoutFactor>${pitest.plugin.timeout.factor}</timeoutFactor>
               <timeoutConstant>${pitest.plugin.timeout.constant}</timeoutConstant>
@@ -1997,6 +2052,7 @@
                 <!-- deprecated class -->
                 <param>com.puppycrawl.tools.checkstyle.checks.naming.AbstractTypeParameterNameCheck</param>
               </excludedClasses>
+              <coverageThreshold>100</coverageThreshold>
               <mutationThreshold>100</mutationThreshold>
               <timeoutFactor>${pitest.plugin.timeout.factor}</timeoutFactor>
               <timeoutConstant>${pitest.plugin.timeout.constant}</timeoutConstant>
@@ -2024,6 +2080,7 @@
               <targetTests>
                 <param>com.puppycrawl.tools.checkstyle.checks.regexp.*</param>
               </targetTests>
+              <coverageThreshold>100</coverageThreshold>
               <mutationThreshold>100</mutationThreshold>
               <timeoutFactor>${pitest.plugin.timeout.factor}</timeoutFactor>
               <timeoutConstant>${pitest.plugin.timeout.constant}</timeoutConstant>
@@ -2051,6 +2108,7 @@
               <targetTests>
                 <param>com.puppycrawl.tools.checkstyle.checks.sizes.*</param>
               </targetTests>
+              <coverageThreshold>100</coverageThreshold>
               <mutationThreshold>100</mutationThreshold>
               <timeoutFactor>${pitest.plugin.timeout.factor}</timeoutFactor>
               <timeoutConstant>${pitest.plugin.timeout.constant}</timeoutConstant>
@@ -2078,7 +2136,8 @@
               <targetTests>
                 <param>com.puppycrawl.tools.checkstyle.checks.whitespace.*</param>
               </targetTests>
-              <mutationThreshold>99</mutationThreshold>
+              <coverageThreshold>100</coverageThreshold>
+              <mutationThreshold>100</mutationThreshold>
               <timeoutFactor>${pitest.plugin.timeout.factor}</timeoutFactor>
               <timeoutConstant>${pitest.plugin.timeout.constant}</timeoutConstant>
               <threads>${pitest.plugin.threads}</threads>
@@ -2130,6 +2189,7 @@
                 <param>com.puppycrawl.tools.checkstyle.doclets.*</param>
                 <param>com.puppycrawl.tools.checkstyle.ThreadModeSettingsTest</param>
               </targetTests>
+              <coverageThreshold>100</coverageThreshold>
               <mutationThreshold>100</mutationThreshold>
               <timeoutFactor>${pitest.plugin.timeout.factor}</timeoutFactor>
               <timeoutConstant>${pitest.plugin.timeout.constant}</timeoutConstant>
@@ -2154,6 +2214,7 @@
               <targetTests>
                 <param>com.puppycrawl.tools.checkstyle.MainTest</param>
               </targetTests>
+              <coverageThreshold>100</coverageThreshold>
               <mutationThreshold>100</mutationThreshold>
               <timeoutFactor>${pitest.plugin.timeout.factor}</timeoutFactor>
               <timeoutConstant>${pitest.plugin.timeout.constant}</timeoutConstant>
@@ -2199,6 +2260,7 @@
                 to remove all of them as they are chained together, so we just exclude it from pitest check. -->
                 <param>destroy</param>
               </excludedMethods>
+              <coverageThreshold>100</coverageThreshold>
               <mutationThreshold>100</mutationThreshold>
               <timeoutFactor>${pitest.plugin.timeout.factor}</timeoutFactor>
               <timeoutConstant>${pitest.plugin.timeout.constant}</timeoutConstant>
@@ -2238,8 +2300,9 @@
               </excludedMethods>
               <avoidCallsTo>
                 <!--cause of https://github.com/checkstyle/checkstyle/issues/3605-->
-                <avoidCallsTo>com.puppycrawl.tools.checkstyle.api.AbstractLoader$FeaturesForVerySecureJavaInstallations</avoidCallsTo>
+                <avoidCallsTo>com.puppycrawl.tools.checkstyle.XmlLoader$FeaturesForVerySecureJavaInstallations</avoidCallsTo>
               </avoidCallsTo>
+              <coverageThreshold>100</coverageThreshold>
               <mutationThreshold>100</mutationThreshold>
               <timeoutFactor>${pitest.plugin.timeout.factor}</timeoutFactor>
               <timeoutConstant>${pitest.plugin.timeout.constant}</timeoutConstant>
@@ -2266,6 +2329,7 @@
                 <param>com.puppycrawl.tools.checkstyle.filefilters.*</param>
                 <param>com.puppycrawl.tools.checkstyle.filters.*</param>
               </targetTests>
+              <coverageThreshold>100</coverageThreshold>
               <mutationThreshold>100</mutationThreshold>
               <timeoutFactor>${pitest.plugin.timeout.factor}</timeoutFactor>
               <timeoutConstant>${pitest.plugin.timeout.constant}</timeoutConstant>
@@ -2289,23 +2353,18 @@
               </targetClasses>
               <targetTests>
                 <param>com.puppycrawl.tools.checkstyle.utils.*</param>
-                <param>com.puppycrawl.tools.checkstyle.checks.coding.*</param>
+                <!-- 12% mutation in CommonUtils, 3% coverage in CommonUtils, 2% coverage in JavadocUtils -->
                 <param>com.puppycrawl.tools.checkstyle.AstTreeStringPrinterTest</param>
-                <param>com.puppycrawl.tools.checkstyle.ConfigurationLoaderTest</param>
+                <!-- 2% mutation in CommonUtils -->
                 <param>com.puppycrawl.tools.checkstyle.DetailNodeTreeStringPrinterTest</param>
+                <!-- ModuleReflectionUtils -->
                 <param>com.puppycrawl.tools.checkstyle.PackageObjectFactoryTest</param>
-                <param>com.puppycrawl.tools.checkstyle.checks.FinalParametersCheckTest</param>
-                <param>com.puppycrawl.tools.checkstyle.checks.TranslationCheckTest</param>
-                <param>com.puppycrawl.tools.checkstyle.checks.blocks.RightCurlyCheckTest</param>
-                <param>com.puppycrawl.tools.checkstyle.checks.coding.MultipleVariableDeclarationsCheckTest</param>
-                <param>com.puppycrawl.tools.checkstyle.checks.design.FinalClassCheckTest</param>
-                <param>com.puppycrawl.tools.checkstyle.checks.javadoc.*</param>
-                <param>com.puppycrawl.tools.checkstyle.checks.regexp.RegexpOnFilenameCheckTest</param>
-                <param>com.puppycrawl.tools.checkstyle.checks.whitespace.*</param>
-                <param>com.puppycrawl.tools.checkstyle.filters.SuppressionCommentFilter</param>
-                <param>com.puppycrawl.tools.checkstyle.filters.SuppressWithNearbyCommentFilterTest</param>
-                <param>com.puppycrawl.tools.checkstyle.internal.AllChecksTest</param>
+                <!-- 3% coverage in BlockCommentPosition, 11% mutation in JavadocUtils, 10% coverage in JavadocUtils, ScopeUtils -->
+                <param>com.puppycrawl.tools.checkstyle.checks.javadoc.AbstractJavadocCheckTest</param>
+                <param>com.puppycrawl.tools.checkstyle.checks.javadoc.SingleLineJavadocCheckTest</param>
+                <param>com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocVariableCheckTest</param>
               </targetTests>
+              <coverageThreshold>100</coverageThreshold>
               <mutationThreshold>100</mutationThreshold>
               <timeoutFactor>${pitest.plugin.timeout.factor}</timeoutFactor>
               <timeoutConstant>${pitest.plugin.timeout.constant}</timeoutConstant>
@@ -2330,6 +2389,7 @@
               <targetTests>
                 <param>com.puppycrawl.tools.checkstyle.gui.*</param>
               </targetTests>
+              <coverageThreshold>100</coverageThreshold>
               <mutationThreshold>30</mutationThreshold>
               <timeoutFactor>${pitest.plugin.timeout.factor}</timeoutFactor>
               <timeoutConstant>${pitest.plugin.timeout.constant}</timeoutConstant>
@@ -2380,6 +2440,7 @@
               <targetTests>
                 <param>com.puppycrawl.tools.checkstyle.xpath.*</param>
               </targetTests>
+              <coverageThreshold>100</coverageThreshold>
               <mutationThreshold>100</mutationThreshold>
               <timeoutFactor>${pitest.plugin.timeout.factor}</timeoutFactor>
               <timeoutConstant>${pitest.plugin.timeout.constant}</timeoutConstant>
diff --git a/release.sh b/release.sh
index 8690ef7..2465a4b 100755
--- a/release.sh
+++ b/release.sh
@@ -25,10 +25,10 @@
 echo "exit" | ssh -t $SF_USER,checkstyle@shell.sourceforge.net create
 
 # Version bump in pom.xml - https://github.com/checkstyle/checkstyle/commits/master
-mvn -Pgpg release:prepare -B -Darguments="-DskipTests -DskipITs -Dpmd.skip=true -Dfindbugs.skip=true -Dcobertura.skip=true -Dcheckstyle.ant.skip=true -Dcheckstyle.skip=true -Dxml.skip=true"
+mvn -e -Pgpg release:prepare -B -Darguments="-DskipTests -DskipITs -Dpmd.skip=true -Dfindbugs.skip=true -Dcobertura.skip=true -Dcheckstyle.ant.skip=true -Dcheckstyle.skip=true -Dxml.skip=true"
 
 # deployment of jars to maven central and publication of site to http://checkstyle.sourceforge.net/new-site/
-mvn -Pgpg release:perform -Darguments='-Dcheckstyle.ant.skip=true -Dcheckstyle.skip=true'
+mvn -e -Pgpg release:perform -Darguments='-Dcheckstyle.ant.skip=true -Dcheckstyle.skip=true'
 
 #############################
 
@@ -53,7 +53,7 @@
 git checkout checkstyle-$RELEASE
 
 #Generate all binaries
-mvn -Passembly clean package
+mvn -e -Passembly clean package
 
 #Publish them to sourceforce
 FRS_PATH=/home/frs/project/checkstyle/checkstyle/$RELEASE
diff --git a/shippable.yml b/shippable.yml
index 63c28d0..7b25879 100644
--- a/shippable.yml
+++ b/shippable.yml
@@ -6,26 +6,26 @@
 
 env:
   matrix:
-    - PROFILE="-Ppitest-checkstyle-xpath,no-validations"; POST_ACTION=check_survived
-    - PROFILE="-Ppitest-checkstyle-filters,no-validations"; POST_ACTION=check_survived
+    - PROFILE="-Ppitest-checkstyle-xpath,no-validations"; POST_ACTION=check_survived_uncovered
+    - PROFILE="-Ppitest-checkstyle-filters,no-validations"; POST_ACTION=check_survived_uncovered
     - PROFILE="-Ppitest-checks-javadoc,no-validations"
-    - PROFILE="-Ppitest-checks-imports,no-validations"; POST_ACTION=check_survived_imports
-    - PROFILE="-Ppitest-checks-metrics,no-validations"
-    - PROFILE="-Ppitest-checks-regexp,no-validations"; POST_ACTION=check_survived
-    - PROFILE="-Ppitest-checks-sizes,no-validations"; POST_ACTION=check_survived
-    - PROFILE="-Ppitest-checks-whitespace,no-validations"; POST_ACTION=check_survived_whitespace
-    - PROFILE="-Ppitest-checks-misc,no-validations"; POST_ACTION=check_survived_misc
+    - PROFILE="-Ppitest-checks-imports,no-validations"; POST_ACTION=check_survived_uncovered
+    - PROFILE="-Ppitest-checks-metrics,no-validations"; POST_ACTION=check_survived_uncovered
+    - PROFILE="-Ppitest-checks-regexp,no-validations"; POST_ACTION=check_survived_uncovered
+    - PROFILE="-Ppitest-checks-sizes,no-validations"; POST_ACTION=check_survived_uncovered
+    - PROFILE="-Ppitest-checks-whitespace,no-validations"; POST_ACTION=check_survived
+    - PROFILE="-Ppitest-checks-misc,no-validations"; POST_ACTION=check_survived_uncovered
     - PROFILE="-Ppitest-checks-blocks,no-validations"; POST_ACTION=check_survived_blocks
     - PROFILE="-Ppitest-checks-coding,no-validations"; POST_ACTION=check_survived_coding
-    - PROFILE="-Ppitest-checks-design,no-validations"; POST_ACTION=check_survived
-    - PROFILE="-Ppitest-checks-annotation,no-validations"; POST_ACTION=check_survived
-    - PROFILE="-Ppitest-checks-header,no-validations"; POST_ACTION=check_survived
-    - PROFILE="-Ppitest-checks-modifier,no-validations"; POST_ACTION=check_survived
-    - PROFILE="-Ppitest-checks-naming,no-validations"; POST_ACTION=check_survived
+    - PROFILE="-Ppitest-checks-design,no-validations"; POST_ACTION=check_survived_uncovered
+    - PROFILE="-Ppitest-checks-annotation,no-validations"; POST_ACTION=check_survived_uncovered
+    - PROFILE="-Ppitest-checks-header,no-validations"; POST_ACTION=check_survived_uncovered
+    - PROFILE="-Ppitest-checks-modifier,no-validations"; POST_ACTION=check_survived_uncovered
+    - PROFILE="-Ppitest-checks-naming,no-validations"; POST_ACTION=check_survived_uncovered
     - PROFILE="-Ppitest-checks-indentation,no-validations"
-    - PROFILE="-Ppitest-checkstyle-tree-walker,no-validations"; POST_ACTION=check_survived
+    - PROFILE="-Ppitest-checkstyle-tree-walker,no-validations"; POST_ACTION=check_survived_uncovered
     - PROFILE="-Ppitest-checkstyle-common,no-validations"; POST_ACTION=check_survived
-    - PROFILE="-Ppitest-checkstyle-main,no-validations"; POST_ACTION=check_survived
+    - PROFILE="-Ppitest-checkstyle-main,no-validations"; POST_ACTION=check_survived_uncovered
     - PROFILE="-Ppitest-checkstyle-api,no-validations"; POST_ACTION=check_survived
     - PROFILE="-Ppitest-checkstyle-utils,no-validations"; POST_ACTION=check_survived
     - PROFILE="-Ppitest-checkstyle-gui,no-validations"
@@ -43,51 +43,44 @@
     # we skip PRs and commits that are not for Issues, as pitest is too time consuming
     - |
       set -e
-      SKIP_FILES="appveyor.yml|circle.yml|distelli-manifest.yml|.travis.yml|wercker.yml|fast-forward-merge.sh|LICENSE|LICENSE.apache20|README.md|release.sh|RIGHTS.antlr|intellij-idea-inspections.xml|org.eclipse.jdt.core.prefs"
+      SKIP_FILES="appveyor.yml|circle.yml|distelli-manifest.yml|.travis.yml|wercker.yml|wercker.sh|fast-forward-merge.sh|LICENSE|LICENSE.apache20|README.md|release.sh|RIGHTS.antlr|intellij-idea-inspections.xml|org.eclipse.jdt.core.prefs"
       SKIP_CI=$(if [[ $(git diff --name-only HEAD HEAD~1 | grep -vE "$SKIP_FILES" | cat | wc -c) > 0 ]]; then echo false; else echo true; fi;)
       echo "SKIP_CI="$SKIP_CI
       echo "POST_ACTION="$POST_ACTION
       if [[ $SKIP_CI == 'false' ]];
       then
-        mvn $PROFILE clean verify org.pitest:pitest-maven:mutationCoverage;
+        mvn -e $PROFILE clean verify org.pitest:pitest-maven:mutationCoverage;
 
+        if [[ $POST_ACTION == 'check_survived_uncovered' \
+                && ( $(grep -RE "class='survived'" target/ | cat | wc -l) > 0 \
+                    || $(grep -RE "class='uncovered'" target/ | cat | wc -l) > 0) ]]; then
+           echo "Survived items:"$(grep -RE "class='survived'" target/ | cat)
+           echo "Uncovered items:"$(grep -RE "class='uncovered'" target/ | cat)
+           echo "Survived/Uncovered items found in reports, build will be failed"
+           exit 1
+        fi
         if [[ $POST_ACTION == 'check_survived' && $(grep -RE "class='survived'" target/ | cat | wc -l) > 0 ]]; then
            echo "Survived items:"$(grep -RE "class='survived'" target/ | cat)
            echo "Survived items found in reports, build will be failed"
            exit 1
         fi
-        if [[ $POST_ACTION == 'check_survived_whitespace' && $(grep -RE "class='survived'" --exclude="NoWhitespaceAfterCheck.*" --exclude="ParenPadCheck.*" --exclude="SingleSpaceSeparatorCheck.*" target/ | cat | wc -l) > 0 ]]; then
-           echo "Survived items:"$(grep -RE "class='survived'" --exclude="NoWhitespaceAfterCheck.*" --exclude="ParenPadCheck.*" --exclude="SingleSpaceSeparatorCheck.*" target/ | cat)
-           echo "Survived items found in reports, build will be failed"
-           exit 1
-        fi
-        if [[ $POST_ACTION == 'check_survived_imports' && $(grep -RE "class='survived'" --exclude="CustomImportOrderCheck.*" target/ | cat | wc -l) > 0 ]]; then
-           echo "Survived items:"$(grep -RE "class='survived'" --exclude="CustomImportOrderCheck.*" --exclude="ImportOrderCheck.*" target/ | cat)
-           echo "Survived items found in reports, build will be failed"
-           exit 1
-        fi
-        if [[ $POST_ACTION == 'check_survived_misc' && $(grep -RE "class='survived'" --exclude="TranslationCheck.*" target/ | cat | wc -l) > 0 ]]; then
-           echo "Survived items:"$(grep -RE "class='survived'" --exclude="TranslationCheck.*" target/ | cat)
-           echo "Survived items found in reports, build will be failed"
-           exit 1
-        fi
         if [[ $POST_ACTION == 'check_survived_blocks' && $(grep -RE "class='survived'" --exclude="LeftCurlyCheck.*" target/ | cat | wc -l) > 0 ]]; then
            echo "Survived items:"$(grep -RE "class='survived'" --exclude="LeftCurlyCheck.*" target/ | cat)
            echo "Survived items found in reports, build will be failed"
            exit 1
         fi
         if [[ $POST_ACTION == 'check_survived_coding'
-              && $(grep -RE "class='survived'"  --exclude="AbstractSuperCheck.*" --exclude="DeclarationOrderCheck.*" --exclude="EqualsAvoidNullCheck.*" \
-              --exclude="EqualsHashCodeCheck.*" --exclude="FallThroughCheck.*" --exclude="HiddenFieldCheck.*" --exclude="IllegalInstantiationCheck.*" \
-              --exclude="IllegalTokenTextCheck.*" --exclude="IllegalTypeCheck.*" --exclude="MagicNumberCheck.*" --exclude="ModifiedControlVariableCheck.*" \
-              --exclude="MultipleStringLiteralsCheck.*" --exclude="MultipleVariableDeclarationsCheck.*" --exclude="NestedForDepthCheck.*" \
-              --exclude="OneStatementPerLineCheck.*" --exclude="ParameterAssignmentCheck.*" --exclude="RequireThisCheck.*" --exclude="ReturnCountCheck.*" \
+              && $(grep -RE "class='survived'"  --exclude="EqualsAvoidNullCheck.*" \
+              --exclude="FallThroughCheck.*" --exclude="HiddenFieldCheck.*" --exclude="IllegalInstantiationCheck.*" \
+              --exclude="IllegalTypeCheck.*" \
+              --exclude="MultipleVariableDeclarationsCheck.*" \
+              --exclude="RequireThisCheck.*" \
               --exclude="UnnecessaryParenthesesCheck.*" --exclude="VariableDeclarationUsageDistanceCheck.*"   target/ | cat | wc -l) > 0 ]]; then
-           echo "Survived items:"$(grep -RE "class='survived'"  --exclude="AbstractSuperCheck.*" --exclude="DeclarationOrderCheck.*" --exclude="EqualsAvoidNullCheck.*" \
-              --exclude="EqualsHashCodeCheck.*" --exclude="FallThroughCheck.*" --exclude="HiddenFieldCheck.*" --exclude="IllegalInstantiationCheck.*" \
-              --exclude="IllegalTokenTextCheck.*" --exclude="IllegalTypeCheck.*" --exclude="MagicNumberCheck.*" --exclude="ModifiedControlVariableCheck.*" \
-              --exclude="MultipleStringLiteralsCheck.*" --exclude="MultipleVariableDeclarationsCheck.*" --exclude="NestedForDepthCheck.*" \
-              --exclude="OneStatementPerLineCheck.*" --exclude="ParameterAssignmentCheck.*" --exclude="RequireThisCheck.*" --exclude="ReturnCountCheck.*" \
+           echo "Survived items:"$(grep -RE "class='survived'"  --exclude="EqualsAvoidNullCheck.*" \
+              --exclude="FallThroughCheck.*" --exclude="HiddenFieldCheck.*" --exclude="IllegalInstantiationCheck.*" \
+              --exclude="IllegalTypeCheck.*" \
+              --exclude="MultipleVariableDeclarationsCheck.*" \
+              --exclude="RequireThisCheck.*" \
               --exclude="UnnecessaryParenthesesCheck.*" --exclude="VariableDeclarationUsageDistanceCheck.*"  target/ | cat)
            echo "Survived items found in reports, build will be failed"
            exit 1
diff --git a/src/it/java/com/google/checkstyle/test/base/AbstractModuleTestSupport.java b/src/it/java/com/google/checkstyle/test/base/AbstractModuleTestSupport.java
index 946f797..d23a3e0 100644
--- a/src/it/java/com/google/checkstyle/test/base/AbstractModuleTestSupport.java
+++ b/src/it/java/com/google/checkstyle/test/base/AbstractModuleTestSupport.java
@@ -87,7 +87,7 @@
      * Returns test logger.
      * @return logger test logger
      */
-    public BriefUtLogger getBriefUtLogger() {
+    public final BriefUtLogger getBriefUtLogger() {
         return new BriefUtLogger(stream);
     }
 
@@ -122,7 +122,7 @@
      * @return {@link Checker} instance based on the given {@link Configuration} instance.
      * @throws Exception if an exception occurs during checker configuration.
      */
-    public Checker createChecker(Configuration moduleConfig)
+    public final Checker createChecker(Configuration moduleConfig)
             throws Exception {
         if (checkstyleModules == null) {
             checkstyleModules = CheckUtil.getCheckstyleModules();
@@ -134,7 +134,7 @@
         for (Class<?> moduleClass : checkstyleModules) {
             if (moduleClass.getSimpleName().equals(name)
                     || moduleClass.getSimpleName().equals(name + "Check")) {
-                if (ModuleReflectionUtils.isCheckstyleCheck(moduleClass)
+                if (ModuleReflectionUtils.isCheckstyleTreeWalkerCheck(moduleClass)
                         || ModuleReflectionUtils.isTreeWalkerFilterModule(moduleClass)) {
                     moduleCreationOption = ModuleCreationOption.IN_TREEWALKER;
                 }
@@ -151,9 +151,9 @@
      * @param moduleCreationOption {@code IN_TREEWALKER} if the {@code moduleConfig} should be added
      *                                                  under {@link TreeWalker}.
      * @return {@link Checker} instance.
-     * @throws CheckstyleException if an exception occurs during checker configuration.
+     * @throws Exception if an exception occurs during checker configuration.
      */
-    protected Checker createChecker(Configuration moduleConfig,
+    protected final Checker createChecker(Configuration moduleConfig,
                                     ModuleCreationOption moduleCreationOption)
             throws Exception {
         final DefaultConfiguration dc;
@@ -183,7 +183,7 @@
      * @param config {@link Configuration} instance.
      * @return {@link DefaultConfiguration} for the {@link Checker}.
      */
-    protected DefaultConfiguration createTreeWalkerConfig(Configuration config) {
+    protected static DefaultConfiguration createTreeWalkerConfig(Configuration config) {
         final DefaultConfiguration dc =
                 new DefaultConfiguration("configuration");
         final DefaultConfiguration twConf = createModuleConfig(TreeWalker.class);
@@ -199,7 +199,7 @@
      * @param config {@link Configuration} instance.
      * @return {@link DefaultConfiguration} for the given {@link Configuration} instance.
      */
-    protected DefaultConfiguration createRootConfig(Configuration config) {
+    protected static DefaultConfiguration createRootConfig(Configuration config) {
         final DefaultConfiguration dc = new DefaultConfiguration("root");
         dc.addChild(config);
         return dc;
@@ -218,7 +218,7 @@
      * @param warnsExpected an array of expected warning numbers.
      * @throws Exception if exception occurs during verification process.
      */
-    protected void verify(Configuration config, String fileName, String[] expected,
+    protected final void verify(Configuration config, String fileName, String[] expected,
             Integer... warnsExpected) throws Exception {
         verify(createChecker(config),
                 new File[] {new File(fileName)},
@@ -234,7 +234,7 @@
      * @param warnsExpected an array of expected warning line numbers.
      * @throws Exception if exception occurs during verification process.
      */
-    protected void verify(Checker checker,
+    protected final void verify(Checker checker,
             File[] processedFiles,
             String messageFileName,
             String[] expected,
@@ -281,10 +281,12 @@
      * Gets the check message 'as is' from appropriate 'messages.properties'
      * file.
      *
+     * @param aClass The package the message is located in.
      * @param messageKey the key of message in 'messages.properties' file.
      * @param arguments  the arguments of message in 'messages.properties' file.
+     * @return The message of the check with the arguments applied.
      */
-    protected String getCheckMessage(Class<? extends AbstractViolationReporter> aClass,
+    protected static String getCheckMessage(Class<? extends AbstractViolationReporter> aClass,
             String messageKey, Object... arguments) {
         String checkMessage;
         try {
@@ -302,10 +304,12 @@
 
     /**
      * Gets the check message 'as is' from appropriate 'messages.properties' file.
+     * @param messages The map of messages to scan.
      * @param messageKey the key of message in 'messages.properties' file.
      * @param arguments the arguments of message in 'messages.properties' file.
+     * @return The message of the check with the arguments applied.
      */
-    protected String getCheckMessage(Map<String, String> messages, String messageKey,
+    protected static String getCheckMessage(Map<String, String> messages, String messageKey,
             Object... arguments) {
         String checkMessage = null;
         for (Map.Entry<String, String> entry : messages.entrySet()) {
@@ -333,6 +337,7 @@
      * Returns {@link Configuration} instance for the given module name.
      * This implementation uses {@link AbstractModuleTestSupport#getConfiguration()} method inside.
      * @param moduleName module name.
+     * @param moduleId module id.
      * @return {@link Configuration} instance for the given module name.
      * @throws CheckstyleException if exception occurs during configuration loading.
      */
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/Checker.java b/src/main/java/com/puppycrawl/tools/checkstyle/Checker.java
index 80cff62..9ecc9ef 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/Checker.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/Checker.java
@@ -413,7 +413,7 @@
     }
 
     @Override
-    public void finishLocalSetup() throws CheckstyleException {
+    protected void finishLocalSetup() throws CheckstyleException {
         final Locale locale = new Locale(localeLanguage, localeCountry);
         LocalizedMessage.setLocale(locale);
 
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/ConfigurationLoader.java b/src/main/java/com/puppycrawl/tools/checkstyle/ConfigurationLoader.java
index c37302c..059e93c 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/ConfigurationLoader.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/ConfigurationLoader.java
@@ -40,7 +40,6 @@
 import org.xml.sax.SAXException;
 import org.xml.sax.SAXParseException;
 
-import com.puppycrawl.tools.checkstyle.api.AbstractLoader;
 import com.puppycrawl.tools.checkstyle.api.CheckstyleException;
 import com.puppycrawl.tools.checkstyle.api.Configuration;
 import com.puppycrawl.tools.checkstyle.api.SeverityLevel;
@@ -76,7 +75,7 @@
         "-//Puppy Crawl//DTD Check Configuration 1.0//EN";
 
     /** The resource for version 1_0 of the configuration dtd. */
-    private static final String DTD_RESOURCE_NAME_1_0 =
+    private static final String DTD_CONFIGURATION_NAME_1_0 =
         "com/puppycrawl/tools/checkstyle/configuration_1_0.dtd";
 
     /** The public ID for version 1_1 of the configuration dtd. */
@@ -84,7 +83,7 @@
         "-//Puppy Crawl//DTD Check Configuration 1.1//EN";
 
     /** The resource for version 1_1 of the configuration dtd. */
-    private static final String DTD_RESOURCE_NAME_1_1 =
+    private static final String DTD_CONFIGURATION_NAME_1_1 =
         "com/puppycrawl/tools/checkstyle/configuration_1_1.dtd";
 
     /** The public ID for version 1_2 of the configuration dtd. */
@@ -92,7 +91,7 @@
         "-//Puppy Crawl//DTD Check Configuration 1.2//EN";
 
     /** The resource for version 1_2 of the configuration dtd. */
-    private static final String DTD_RESOURCE_NAME_1_2 =
+    private static final String DTD_CONFIGURATION_NAME_1_2 =
         "com/puppycrawl/tools/checkstyle/configuration_1_2.dtd";
 
     /** The public ID for version 1_3 of the configuration dtd. */
@@ -100,7 +99,7 @@
         "-//Puppy Crawl//DTD Check Configuration 1.3//EN";
 
     /** The resource for version 1_3 of the configuration dtd. */
-    private static final String DTD_RESOURCE_NAME_1_3 =
+    private static final String DTD_CONFIGURATION_NAME_1_3 =
         "com/puppycrawl/tools/checkstyle/configuration_1_3.dtd";
 
     /** Prefix for the exception when unable to parse resource. */
@@ -166,10 +165,10 @@
      */
     private static Map<String, String> createIdToResourceNameMap() {
         final Map<String, String> map = new HashMap<>();
-        map.put(DTD_PUBLIC_ID_1_0, DTD_RESOURCE_NAME_1_0);
-        map.put(DTD_PUBLIC_ID_1_1, DTD_RESOURCE_NAME_1_1);
-        map.put(DTD_PUBLIC_ID_1_2, DTD_RESOURCE_NAME_1_2);
-        map.put(DTD_PUBLIC_ID_1_3, DTD_RESOURCE_NAME_1_3);
+        map.put(DTD_PUBLIC_ID_1_0, DTD_CONFIGURATION_NAME_1_0);
+        map.put(DTD_PUBLIC_ID_1_1, DTD_CONFIGURATION_NAME_1_1);
+        map.put(DTD_PUBLIC_ID_1_2, DTD_CONFIGURATION_NAME_1_2);
+        map.put(DTD_PUBLIC_ID_1_3, DTD_CONFIGURATION_NAME_1_3);
         return map;
     }
 
@@ -224,7 +223,7 @@
      *            'ignore' should be omitted, {@code false} otherwise
      * @return the check configurations
      * @throws CheckstyleException if an error occurs
-     * @deprecated in order to fullfil demands of BooleanParameter IDEA check.
+     * @deprecated in order to fulfill demands of BooleanParameter IDEA check.
      * @noinspection BooleanParameter
      */
     @Deprecated
@@ -245,7 +244,7 @@
      * @param threadModeSettings the thread mode configuration
      * @return the check configurations
      * @throws CheckstyleException if an error occurs
-     * @deprecated in order to fullfil demands of BooleanParameter IDEA check.
+     * @deprecated in order to fulfill demands of BooleanParameter IDEA check.
      * @noinspection BooleanParameter, WeakerAccess
      */
     @Deprecated
@@ -297,7 +296,7 @@
      *            'ignore' should be omitted, {@code false} otherwise
      * @return the check configurations
      * @throws CheckstyleException if an error occurs
-     * @deprecated in order to fullfil demands of BooleanParameter IDEA check.
+     * @deprecated in order to fulfill demands of BooleanParameter IDEA check.
      * @noinspection BooleanParameter
      */
     @Deprecated
@@ -320,7 +319,7 @@
      * @param threadModeSettings the thread mode configuration
      * @return the check configurations
      * @throws CheckstyleException if an error occurs
-     * @deprecated in order to fullfil demands of BooleanParameter IDEA check.
+     * @deprecated in order to fulfill demands of BooleanParameter IDEA check.
      * @noinspection BooleanParameter, WeakerAccess
      */
     @Deprecated
@@ -580,7 +579,7 @@
      * appear in the public API of the ConfigurationLoader.
      */
     private final class InternalLoader
-        extends AbstractLoader {
+        extends XmlLoader {
         /** Module elements. */
         private static final String MODULE = "module";
         /** Name attribute. */
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/DefaultLogger.java b/src/main/java/com/puppycrawl/tools/checkstyle/DefaultLogger.java
index e110b02..23cd2ff 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/DefaultLogger.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/DefaultLogger.java
@@ -28,6 +28,7 @@
 import com.puppycrawl.tools.checkstyle.api.AuditEvent;
 import com.puppycrawl.tools.checkstyle.api.AuditListener;
 import com.puppycrawl.tools.checkstyle.api.AutomaticBean;
+import com.puppycrawl.tools.checkstyle.api.CheckstyleException;
 import com.puppycrawl.tools.checkstyle.api.LocalizedMessage;
 import com.puppycrawl.tools.checkstyle.api.SeverityLevel;
 
@@ -77,7 +78,7 @@
      * Creates a new {@code DefaultLogger} instance.
      * @param outputStream where to log infos and errors
      * @param closeStreamsAfterUse if oS should be closed in auditFinished()
-     * @deprecated in order to fullfil demands of BooleanParameter IDEA check.
+     * @deprecated in order to fulfill demands of BooleanParameter IDEA check.
      * @noinspection BooleanParameter
      */
     @Deprecated
@@ -92,7 +93,7 @@
      * @param closeInfoAfterUse auditFinished should close infoStream.
      * @param errorStream the {@code OutputStream} for error messages.
      * @param closeErrorAfterUse auditFinished should close errorStream
-     * @deprecated in order to fullfil demands of BooleanParameter IDEA check.
+     * @deprecated in order to fulfill demands of BooleanParameter IDEA check.
      * @noinspection BooleanParameter
      */
     @Deprecated
@@ -112,7 +113,7 @@
      * @param errorStream the {@code OutputStream} for error messages
      * @param closeErrorAfterUse auditFinished should close errorStream
      * @param messageFormatter formatter for the log message.
-     * @deprecated in order to fullfil demands of BooleanParameter IDEA check.
+     * @deprecated in order to fulfill demands of BooleanParameter IDEA check.
      * @noinspection BooleanParameter, WeakerAccess
      */
     @Deprecated
@@ -193,6 +194,11 @@
         formatter = messageFormatter;
     }
 
+    @Override
+    protected void finishLocalSetup() throws CheckstyleException {
+        // No code by default
+    }
+
     /**
      * Print an Emacs compliant line on the error stream.
      * If the column number is non zero, then also display it.
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/FileStatefulCheck.java b/src/main/java/com/puppycrawl/tools/checkstyle/FileStatefulCheck.java
index 7f4c60e..2c67438 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/FileStatefulCheck.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/FileStatefulCheck.java
@@ -34,7 +34,7 @@
  * Checker guarantees that each check instance processes only one file at the same time.
  * Checker guarantees that all check instances have equal (but not the same) configuration.
  * It means, that if a check holds a property of type "array of strings",
- * the property value will not be shared accross check instances.
+ * the property value will not be shared across check instances.
  * Instead, each check instance will hold its own array instance.
  * Checker does not guarantee that each file will have it's own thread -
  * there might be a list of files, which will be executed on the same thread.
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/GlobalStatefulCheck.java b/src/main/java/com/puppycrawl/tools/checkstyle/GlobalStatefulCheck.java
index 52cc1f1..9fd6d74 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/GlobalStatefulCheck.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/GlobalStatefulCheck.java
@@ -35,7 +35,7 @@
  * The check methods and fields should be thread safe, because they may be accessed from others
  * threads at the same time.
  * Checker guarantees that there will be exactly one check instance
- * This is simular to multi-file validation, which checkstyle does not support fully yet.
+ * This is similar to multi-file validation, which checkstyle does not support fully yet.
  * Please refer to https://github.com/checkstyle/checkstyle/issues/3540 for details.
  * @author Andrew Kuchev
  * @noinspection AnnotationClass, ClassIndependentOfModule, unused
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/PackageNamesLoader.java b/src/main/java/com/puppycrawl/tools/checkstyle/PackageNamesLoader.java
index 4c5cf4e..9b6b0cc 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/PackageNamesLoader.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/PackageNamesLoader.java
@@ -37,7 +37,6 @@
 import org.xml.sax.SAXException;
 
 import com.google.common.io.Closeables;
-import com.puppycrawl.tools.checkstyle.api.AbstractLoader;
 import com.puppycrawl.tools.checkstyle.api.CheckstyleException;
 import com.puppycrawl.tools.checkstyle.utils.CommonUtils;
 
@@ -46,7 +45,7 @@
  * @author Rick Giles
  */
 public final class PackageNamesLoader
-    extends AbstractLoader {
+    extends XmlLoader {
     /** The public ID for the configuration dtd. */
     private static final String DTD_PUBLIC_ID =
         "-//Puppy Crawl//DTD Package Names 1.0//EN";
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/PackageObjectFactory.java b/src/main/java/com/puppycrawl/tools/checkstyle/PackageObjectFactory.java
index 2465edc..6307097 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/PackageObjectFactory.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/PackageObjectFactory.java
@@ -55,7 +55,7 @@
      */
     public enum ModuleLoadOption {
         /**
-         * Searching from registred checkstyle modules and from packages given in countructor.
+         * Searching from registered checkstyle modules and from packages given in constructor.
          **/
         SEARCH_REGISTERED_PACKAGES,
         /**
@@ -73,7 +73,7 @@
     public static final String UNABLE_TO_INSTANTIATE_EXCEPTION_MESSAGE =
             "PackageObjectFactory.unableToInstantiateExceptionMessage";
 
-    /** Exception message when there is ambigugous module name in config file. */
+    /** Exception message when there is ambiguous module name in config file. */
     public static final String AMBIGUOUS_MODULE_NAME_EXCEPTION_MESSAGE =
             "PackageObjectFactory.ambiguousModuleNameExceptionMessage";
 
@@ -354,7 +354,7 @@
     }
 
     /**
-     * Searching to class with given name (or name concatinated with &quot;Check&quot;) in existing
+     * Searching to class with given name (or name concatenated with &quot;Check&quot;) in existing
      * packages. Returns instance if class found or, otherwise, null.
      * @param name the name of a class.
      * @return the {@code Object} created by loader.
@@ -820,6 +820,8 @@
                 BASE_PACKAGE + ".filters.IntRangeFilter");
         NAME_TO_FULL_MODULE_NAME.put("SeverityMatchFilter",
                 BASE_PACKAGE + ".filters.SeverityMatchFilter");
+        NAME_TO_FULL_MODULE_NAME.put("SuppressWithPlainTextCommentFilter",
+            BASE_PACKAGE + ".filters.SuppressWithPlainTextCommentFilter");
         NAME_TO_FULL_MODULE_NAME.put("SuppressionCommentFilter",
                 BASE_PACKAGE + ".filters.SuppressionCommentFilter");
         NAME_TO_FULL_MODULE_NAME.put("SuppressionFilter",
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/PropertyCacheFile.java b/src/main/java/com/puppycrawl/tools/checkstyle/PropertyCacheFile.java
index 2a0ae4d..cd42699 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/PropertyCacheFile.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/PropertyCacheFile.java
@@ -239,7 +239,7 @@
 
     /**
      * Serializes object to output stream.
-     * @param object object to be erialized
+     * @param object object to be serialized
      * @param outputStream serialization stream
      * @throws IOException if an error occurs
      */
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/TreeWalkerAuditEvent.java b/src/main/java/com/puppycrawl/tools/checkstyle/TreeWalkerAuditEvent.java
index 629c680..a881efb 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/TreeWalkerAuditEvent.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/TreeWalkerAuditEvent.java
@@ -105,6 +105,14 @@
     }
 
     /**
+     * Gets the column char index associated with the message.
+     * @return the column char index associated with the message
+     */
+    public int getColumnCharIndex() {
+        return localizedMessage.getColumnCharIndex();
+    }
+
+    /**
      * Returns id of module.
      * @return the identifier of the module that generated the event. Can return
      *         null.
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/XMLLogger.java b/src/main/java/com/puppycrawl/tools/checkstyle/XMLLogger.java
index 0a00954..10037c5 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/XMLLogger.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/XMLLogger.java
@@ -35,6 +35,7 @@
 import com.puppycrawl.tools.checkstyle.api.AuditEvent;
 import com.puppycrawl.tools.checkstyle.api.AuditListener;
 import com.puppycrawl.tools.checkstyle.api.AutomaticBean;
+import com.puppycrawl.tools.checkstyle.api.CheckstyleException;
 import com.puppycrawl.tools.checkstyle.api.SeverityLevel;
 import com.puppycrawl.tools.checkstyle.utils.CommonUtils;
 
@@ -81,7 +82,7 @@
      * Sets the output to a defined stream.
      * @param outputStream the stream to write logs to.
      * @param closeStream close oS in auditFinished
-     * @deprecated in order to fullfil demands of BooleanParameter IDEA check.
+     * @deprecated in order to fulfill demands of BooleanParameter IDEA check.
      * @noinspection BooleanParameter
      */
     @Deprecated
@@ -102,6 +103,11 @@
     }
 
     @Override
+    protected void finishLocalSetup() throws CheckstyleException {
+        // No code by default
+    }
+
+    @Override
     public void auditStarted(AuditEvent event) {
         writer.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
 
@@ -115,8 +121,6 @@
 
     @Override
     public void auditFinished(AuditEvent event) {
-        fileMessages.forEach(this::writeFileMessages);
-
         writer.println("</checkstyle>");
         if (closeStream) {
             writer.close();
@@ -180,21 +184,20 @@
     public void addError(AuditEvent event) {
         if (event.getSeverityLevel() != SeverityLevel.IGNORE) {
             final String fileName = event.getFileName();
-            if (fileName == null) {
+            if (fileName == null || !fileMessages.containsKey(fileName)) {
                 synchronized (writerLock) {
                     writeFileError(event);
                 }
             }
             else {
-                final FileMessages messages = fileMessages.computeIfAbsent(
-                        fileName, name -> new FileMessages());
+                final FileMessages messages = fileMessages.get(fileName);
                 messages.addError(event);
             }
         }
     }
 
     /**
-     * Outputs the given envet to the writer.
+     * Outputs the given event to the writer.
      * @param event An event to print.
      */
     private void writeFileError(AuditEvent event) {
@@ -221,14 +224,13 @@
     @Override
     public void addException(AuditEvent event, Throwable throwable) {
         final String fileName = event.getFileName();
-        if (fileName == null) {
+        if (fileName == null || !fileMessages.containsKey(fileName)) {
             synchronized (writerLock) {
                 writeException(throwable);
             }
         }
         else {
-            final FileMessages messages = fileMessages.computeIfAbsent(
-                    fileName, name -> new FileMessages());
+            final FileMessages messages = fileMessages.get(fileName);
             messages.addException(throwable);
         }
     }
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/api/AbstractLoader.java b/src/main/java/com/puppycrawl/tools/checkstyle/XmlLoader.java
similarity index 93%
rename from src/main/java/com/puppycrawl/tools/checkstyle/api/AbstractLoader.java
rename to src/main/java/com/puppycrawl/tools/checkstyle/XmlLoader.java
index e0a83f3..5a410f0 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/api/AbstractLoader.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/XmlLoader.java
@@ -17,7 +17,7 @@
 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 ////////////////////////////////////////////////////////////////////////////////
 
-package com.puppycrawl.tools.checkstyle.api;
+package com.puppycrawl.tools.checkstyle;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -48,7 +48,7 @@
  * @author Oliver Burn
  * @noinspection ThisEscapedInObjectConstruction
  */
-public abstract class AbstractLoader
+public class XmlLoader
     extends DefaultHandler {
     /** Maps public id to resolve to resource name for the DTD. */
     private final Map<String, String> publicIdToResourceNameMap;
@@ -62,7 +62,7 @@
      * @throws SAXException if an error occurs
      * @throws ParserConfigurationException if an error occurs
      */
-    protected AbstractLoader(String publicId, String dtdResourceName)
+    protected XmlLoader(String publicId, String dtdResourceName)
             throws SAXException, ParserConfigurationException {
         this(new HashMap<>(1));
         publicIdToResourceNameMap.put(publicId, dtdResourceName);
@@ -74,7 +74,7 @@
      * @throws SAXException if an error occurs
      * @throws ParserConfigurationException if an error occurs
      */
-    protected AbstractLoader(Map<String, String> publicIdToResourceNameMap)
+    protected XmlLoader(Map<String, String> publicIdToResourceNameMap)
             throws SAXException, ParserConfigurationException {
         this.publicIdToResourceNameMap = new HashMap<>(publicIdToResourceNameMap);
         final SAXParserFactory factory = SAXParserFactory.newInstance();
@@ -145,9 +145,9 @@
         }
 
         /**
-         * Configures SAXParserFactory with features requered
-         * for exectution on very secured environments.
-         * @param factory factory to be configured with spectial features
+         * Configures SAXParserFactory with features required
+         * for execution on very secured environments.
+         * @param factory factory to be configured with special features
          * @throws SAXException if an error occurs
          * @throws ParserConfigurationException if an error occurs
          */
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/api/AbstractViolationReporter.java b/src/main/java/com/puppycrawl/tools/checkstyle/api/AbstractViolationReporter.java
index 1739b6b..fa57d7d 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/api/AbstractViolationReporter.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/api/AbstractViolationReporter.java
@@ -27,6 +27,7 @@
  * {@link LocalizedMessage localized messages} that are created by the module.
  *
  * @author lkuehne
+ * @noinspection NoopMethodInAbstractClass
  */
 public abstract class AbstractViolationReporter
     extends AutomaticBean {
@@ -134,6 +135,11 @@
         return messageBundle;
     }
 
+    @Override
+    protected void finishLocalSetup() throws CheckstyleException {
+        // No code by default
+    }
+
     /**
      * Log a message that has no column information.
      *
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/api/AutomaticBean.java b/src/main/java/com/puppycrawl/tools/checkstyle/api/AutomaticBean.java
index 7e977ea..e7a35f6 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/api/AutomaticBean.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/api/AutomaticBean.java
@@ -53,7 +53,8 @@
  * calling the bean's setters for all configuration attributes.
  * @author lkuehne
  */
-public class AutomaticBean
+// -@cs[AbstractClassName] We can not brake compatibility with previous versions.
+public abstract class AutomaticBean
     implements Configurable, Contextualizable {
 
     /**
@@ -78,6 +79,16 @@
     private Configuration configuration;
 
     /**
+     * Provides a hook to finish the part of this component's setup that
+     * was not handled by the bean introspection.
+     * <p>
+     * The default implementation does nothing.
+     * </p>
+     * @throws CheckstyleException if there is a configuration error.
+     */
+    protected abstract void finishLocalSetup() throws CheckstyleException;
+
+    /**
      * Creates a BeanUtilsBean that is configured to use
      * type converters that throw a ConversionException
      * instead of using the default value when something
@@ -259,18 +270,6 @@
     }
 
     /**
-     * Provides a hook to finish the part of this component's setup that
-     * was not handled by the bean introspection.
-     * <p>
-     * The default implementation does nothing.
-     * </p>
-     * @throws CheckstyleException if there is a configuration error.
-     */
-    protected void finishLocalSetup() throws CheckstyleException {
-        // No code by default, should be overridden only by demand at subclasses
-    }
-
-    /**
      * Called by configure() for every child of this component's Configuration.
      * <p>
      * The default implementation throws {@link CheckstyleException} if
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/api/Configuration.java b/src/main/java/com/puppycrawl/tools/checkstyle/api/Configuration.java
index e4fc719..c50b2d1 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/api/Configuration.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/api/Configuration.java
@@ -20,8 +20,7 @@
 package com.puppycrawl.tools.checkstyle.api;
 
 import java.io.Serializable;
-
-import com.google.common.collect.ImmutableMap;
+import java.util.Map;
 
 /**
  * A Configuration is used to configure a Configurable component.  The general
@@ -61,5 +60,5 @@
      * for this configuration.
      * @return unmodifiable map containing custom messages
      */
-    ImmutableMap<String, String> getMessages();
+    Map<String, String> getMessages();
 }
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/api/Context.java b/src/main/java/com/puppycrawl/tools/checkstyle/api/Context.java
index 795de70..e96c663 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/api/Context.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/api/Context.java
@@ -19,7 +19,7 @@
 
 package com.puppycrawl.tools.checkstyle.api;
 
-import com.google.common.collect.ImmutableCollection;
+import java.util.Collection;
 
 /**
  * A context to be used in subcomponents. The general idea of
@@ -40,5 +40,5 @@
      * Returns the names of all attributes of this context.
      * @return the names of all attributes of this context.
      */
-    ImmutableCollection<String> getAttributeNames();
+    Collection<String> getAttributeNames();
 }
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/api/FileContents.java b/src/main/java/com/puppycrawl/tools/checkstyle/api/FileContents.java
index ca9a5b3..6aa0ad8 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/api/FileContents.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/api/FileContents.java
@@ -23,12 +23,12 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.regex.Pattern;
 
-import com.google.common.collect.ImmutableMap;
 import com.puppycrawl.tools.checkstyle.grammars.CommentListener;
 import com.puppycrawl.tools.checkstyle.utils.CommonUtils;
 
@@ -165,7 +165,7 @@
      * @deprecated Use {@link #getSingleLineComments()} instead.
      */
     @Deprecated
-    public ImmutableMap<Integer, TextBlock> getCppComments() {
+    public Map<Integer, TextBlock> getCppComments() {
         return getSingleLineComments();
     }
 
@@ -174,8 +174,8 @@
      * the value is the comment {@link TextBlock} at the line.
      * @return the Map of comments
      */
-    public ImmutableMap<Integer, TextBlock> getSingleLineComments() {
-        return ImmutableMap.copyOf(cppComments);
+    public Map<Integer, TextBlock> getSingleLineComments() {
+        return Collections.unmodifiableMap(cppComments);
     }
 
     /**
@@ -202,7 +202,7 @@
      */
     // -@cs[AbbreviationAsWordInName] Can't change yet since class is API.
     @Deprecated
-    public ImmutableMap<Integer, List<TextBlock>> getCComments() {
+    public Map<Integer, List<TextBlock>> getCComments() {
         return getBlockComments();
     }
 
@@ -212,8 +212,8 @@
      * that start at that line.
      * @return the map of comments
      */
-    public ImmutableMap<Integer, List<TextBlock>> getBlockComments() {
-        return ImmutableMap.copyOf(clangComments);
+    public Map<Integer, List<TextBlock>> getBlockComments() {
+        return Collections.unmodifiableMap(clangComments);
     }
 
     /**
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/api/FileText.java b/src/main/java/com/puppycrawl/tools/checkstyle/api/FileText.java
index 3b12ffe..64e9195 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/api/FileText.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/api/FileText.java
@@ -37,7 +37,7 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import com.google.common.io.Closeables;
+import com.puppycrawl.tools.checkstyle.utils.CommonUtils;
 
 /**
  * Represents the text contents of a file of arbitrary plain text type.
@@ -139,7 +139,7 @@
             lines = textLines.toArray(new String[textLines.size()]);
         }
         finally {
-            Closeables.closeQuietly(reader);
+            CommonUtils.close(reader);
         }
     }
 
@@ -209,7 +209,7 @@
             }
         }
         finally {
-            Closeables.closeQuietly(reader);
+            CommonUtils.close(reader);
         }
         return buf.toString();
     }
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/api/TokenTypes.java b/src/main/java/com/puppycrawl/tools/checkstyle/api/TokenTypes.java
index 5b45f5d..8adc69c 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/api/TokenTypes.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/api/TokenTypes.java
@@ -30,6 +30,7 @@
  *
  * @author Oliver Burn
  * @author <a href="mailto:dobratzp@ele.uri.edu">Peter Dobratz</a>
+ * @noinspection ClassWithTooManyDependents
  */
 public final class TokenTypes {
     // The following three types are never part of an AST,
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/checks/TranslationCheck.java b/src/main/java/com/puppycrawl/tools/checkstyle/checks/TranslationCheck.java
index 56303a3..76601ae 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/checks/TranslationCheck.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/checks/TranslationCheck.java
@@ -47,6 +47,7 @@
 import com.puppycrawl.tools.checkstyle.api.AbstractFileSetCheck;
 import com.puppycrawl.tools.checkstyle.api.FileText;
 import com.puppycrawl.tools.checkstyle.api.LocalizedMessage;
+import com.puppycrawl.tools.checkstyle.api.MessageDispatcher;
 import com.puppycrawl.tools.checkstyle.utils.CommonUtils;
 
 /**
@@ -132,19 +133,19 @@
     private static final String DEFAULT_TRANSLATION_REGEXP = "^.+\\..+$";
 
     /**
-     * Regexp pattern for bundles names wich end with language code, followed by country code and
+     * Regexp pattern for bundles names which end with language code, followed by country code and
      * variant suffix. For example, messages_es_ES_UNIX.properties.
      */
     private static final Pattern LANGUAGE_COUNTRY_VARIANT_PATTERN =
         CommonUtils.createPattern("^.+\\_[a-z]{2}\\_[A-Z]{2}\\_[A-Za-z]+\\..+$");
     /**
-     * Regexp pattern for bundles names wich end with language code, followed by country code
+     * Regexp pattern for bundles names which end with language code, followed by country code
      * suffix. For example, messages_es_ES.properties.
      */
     private static final Pattern LANGUAGE_COUNTRY_PATTERN =
         CommonUtils.createPattern("^.+\\_[a-z]{2}\\_[A-Z]{2}\\..+$");
     /**
-     * Regexp pattern for bundles names wich end with language code suffix.
+     * Regexp pattern for bundles names which end with language code suffix.
      * For example, messages_es.properties.
      */
     private static final Pattern LANGUAGE_PATTERN =
@@ -325,9 +326,11 @@
      * @param fileName file name.
      */
     private void logMissingTranslation(String filePath, String fileName) {
+        final MessageDispatcher dispatcher = getMessageDispatcher();
+        dispatcher.fireFileStarted(filePath);
         log(0, MSG_KEY_MISSING_TRANSLATION_FILE, fileName);
         fireErrors(filePath);
-        getMessageDispatcher().fireFileFinished(filePath);
+        dispatcher.fireFileFinished(filePath);
     }
 
     /**
@@ -454,6 +457,9 @@
     private void checkFilesForConsistencyRegardingTheirKeys(SetMultimap<File, String> fileKeys,
                                                             Set<String> keysThatMustExist) {
         for (File currentFile : fileKeys.keySet()) {
+            final MessageDispatcher dispatcher = getMessageDispatcher();
+            final String path = currentFile.getPath();
+            dispatcher.fireFileStarted(path);
             final Set<String> currentFileKeys = fileKeys.get(currentFile);
             final Set<String> missingKeys = keysThatMustExist.stream()
                 .filter(e -> !currentFileKeys.contains(e)).collect(Collectors.toSet());
@@ -462,9 +468,8 @@
                     log(0, MSG_KEY, key);
                 }
             }
-            final String path = currentFile.getPath();
             fireErrors(path);
-            getMessageDispatcher().fireFileFinished(path);
+            dispatcher.fireFileFinished(path);
         }
     }
 
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/checks/UniquePropertiesCheck.java b/src/main/java/com/puppycrawl/tools/checkstyle/checks/UniquePropertiesCheck.java
index b20f5b9..ffe0bd9 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/checks/UniquePropertiesCheck.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/checks/UniquePropertiesCheck.java
@@ -113,7 +113,7 @@
             }
             ++lineNumber;
         }
-        // -1 as check seeks for the first duplicate occurance in file,
+        // -1 as check seeks for the first duplicate occurrence in file,
         // so it cannot be the last line.
         if (lineNumber > fileText.size() - 1) {
             lineNumber = 0;
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/EqualsAvoidNullCheck.java b/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/EqualsAvoidNullCheck.java
index 0fc040f..326cc81 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/EqualsAvoidNullCheck.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/EqualsAvoidNullCheck.java
@@ -483,7 +483,7 @@
         // The minimal distance between objCalledOn and field (of type String) initialization
         // is calculated as follows:
         // String(6) + space(1) + variableName(1) + assign(1) +
-        // anotherStringVariableName(1) + semicolumn(1) = 11
+        // anotherStringVariableName(1) + semicolon(1) = 11
         // Example: length of "String s=d;" is 11 symbols.
         final int minimumSymbolsBetween = 11;
         if (field.getLineNo() < objCalledOn.getLineNo()
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/FinalLocalVariableCheck.java b/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/FinalLocalVariableCheck.java
index 0397723..679d79a 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/FinalLocalVariableCheck.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/FinalLocalVariableCheck.java
@@ -251,7 +251,7 @@
             case TokenTypes.SLIST:
                 // -@cs[MoveVariableInsideIf] assignment value is modified later so it can't be
                 // moved
-                final Deque<DetailAST> prevScopeUnitializedVariableData =
+                final Deque<DetailAST> prevScopeUninitializedVariableData =
                     prevScopeUninitializedVariables.peek();
                 boolean containsBreak = false;
                 if (ast.getParent().getType() != TokenTypes.CASE_GROUP
@@ -263,7 +263,7 @@
                 }
                 final DetailAST parent = ast.getParent();
                 if (containsBreak || shouldUpdateUninitializedVariables(parent)) {
-                    updateAllUninitializedVariables(prevScopeUnitializedVariableData);
+                    updateAllUninitializedVariables(prevScopeUninitializedVariableData);
                 }
                 updateCurrentScopeAssignedVariables();
                 break;
@@ -348,35 +348,35 @@
      */
     private void storePrevScopeUninitializedVariableData() {
         final ScopeData scopeData = scopeStack.peek();
-        final Deque<DetailAST> prevScopeUnitializedVariableData =
+        final Deque<DetailAST> prevScopeUninitializedVariableData =
                 new ArrayDeque<>();
-        scopeData.uninitializedVariables.forEach(prevScopeUnitializedVariableData::push);
-        prevScopeUninitializedVariables.push(prevScopeUnitializedVariableData);
+        scopeData.uninitializedVariables.forEach(prevScopeUninitializedVariableData::push);
+        prevScopeUninitializedVariables.push(prevScopeUninitializedVariableData);
     }
 
     /**
      * Update current scope data uninitialized variable according to the whole scope data.
-     * @param prevScopeUnitializedVariableData variable for previous stack of uninitialized
+     * @param prevScopeUninitializedVariableData variable for previous stack of uninitialized
      *     variables
+     * @noinspection MethodParameterNamingConvention
      */
-    // -@cs[CyclomaticComplexity] Breaking apart will damage encapsulation.
     private void updateAllUninitializedVariables(
-            Deque<DetailAST> prevScopeUnitializedVariableData) {
+            Deque<DetailAST> prevScopeUninitializedVariableData) {
         // Check for only previous scope
-        updateUninitializedVariables(prevScopeUnitializedVariableData);
+        updateUninitializedVariables(prevScopeUninitializedVariableData);
         // Check for rest of the scope
         prevScopeUninitializedVariables.forEach(this::updateUninitializedVariables);
     }
 
     /**
      * Update current scope data uninitialized variable according to the specific scope data.
-     * @param scopeUnitializedVariableData variable for specific stack of uninitialized variables
+     * @param scopeUninitializedVariableData variable for specific stack of uninitialized variables
      */
-    private void updateUninitializedVariables(Deque<DetailAST> scopeUnitializedVariableData) {
+    private void updateUninitializedVariables(Deque<DetailAST> scopeUninitializedVariableData) {
         final Iterator<DetailAST> iterator = currentScopeAssignedVariables.peek().iterator();
         while (iterator.hasNext()) {
             final DetailAST assignedVariable = iterator.next();
-            for (DetailAST variable : scopeUnitializedVariableData) {
+            for (DetailAST variable : scopeUninitializedVariableData) {
                 for (ScopeData scopeData : scopeStack) {
                     final FinalVariableCandidate candidate =
                         scopeData.scope.get(variable.getText());
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/IllegalInstantiationCheck.java b/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/IllegalInstantiationCheck.java
index 75b1284..bcdb895 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/IllegalInstantiationCheck.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/IllegalInstantiationCheck.java
@@ -116,7 +116,6 @@
 
     @Override
     public void beginTree(DetailAST rootAST) {
-        super.beginTree(rootAST);
         pkgName = null;
         imports.clear();
         instantiations.clear();
@@ -328,7 +327,7 @@
      * @return true if type is standard
      */
     private boolean isStandardClass(String className, String illegal) {
-        boolean isStandardCalss = false;
+        boolean isStandardClass = false;
         // class from java.lang
         if (illegal.length() - JAVA_LANG.length() == className.length()
             && illegal.endsWith(className)
@@ -343,10 +342,10 @@
             final boolean isSamePackage = isSamePackage(className);
 
             if (!isSameFile && !isSamePackage) {
-                isStandardCalss = true;
+                isStandardClass = true;
             }
         }
-        return isStandardCalss;
+        return isStandardClass;
     }
 
     /**
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/IllegalTypeCheck.java b/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/IllegalTypeCheck.java
index edcb1a0..ef2891c 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/IllegalTypeCheck.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/IllegalTypeCheck.java
@@ -98,8 +98,6 @@
      */
     public static final String MSG_KEY = "illegal.type";
 
-    /** Abstract classes legal by default. */
-    private static final String[] DEFAULT_LEGAL_ABSTRACT_NAMES = {};
     /** Types illegal by default. */
     private static final String[] DEFAULT_ILLEGAL_TYPES = {
         "HashSet",
@@ -144,7 +142,6 @@
     /** Creates new instance of the check. */
     public IllegalTypeCheck() {
         setIllegalClassNames(DEFAULT_ILLEGAL_TYPES);
-        setLegalAbstractClassNames(DEFAULT_LEGAL_ABSTRACT_NAMES);
         setIgnoredMethodNames(DEFAULT_IGNORED_METHOD_NAMES);
     }
 
@@ -450,7 +447,6 @@
      * @noinspection WeakerAccess
      */
     public void setLegalAbstractClassNames(String... classNames) {
-        legalAbstractClassNames.clear();
         Collections.addAll(legalAbstractClassNames, classNames);
     }
 
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/RequireThisCheck.java b/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/RequireThisCheck.java
index c2e3de9..58e5f7b 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/RequireThisCheck.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/RequireThisCheck.java
@@ -91,6 +91,7 @@
  * @author o_sukhodolsky
  * @author Andrei Selkin
  */
+// -@cs[ClassDataAbstractionCoupling] This check requires to work with and identify many frames.
 @FileStatefulCheck
 public class RequireThisCheck extends AbstractCheck {
 
@@ -113,6 +114,7 @@
             TokenTypes.METHOD_DEF,
             TokenTypes.CLASS_DEF,
             TokenTypes.ENUM_DEF,
+            TokenTypes.ANNOTATION_DEF,
             TokenTypes.INTERFACE_DEF,
             TokenTypes.PARAMETER_DEF,
             TokenTypes.TYPE_ARGUMENT,
@@ -145,12 +147,12 @@
             TokenTypes.BXOR_ASSIGN,
         }).collect(Collectors.toSet()));
 
+    /** Frame for the currently processed AST. */
+    private final Deque<AbstractFrame> current = new ArrayDeque<>();
+
     /** Tree of all the parsed frames. */
     private Map<DetailAST, AbstractFrame> frames;
 
-    /** Frame for the currently processed AST. */
-    private AbstractFrame current;
-
     /** Whether we should check fields usage. */
     private boolean checkFields = true;
     /** Whether we should check methods usage. */
@@ -193,8 +195,10 @@
             TokenTypes.CLASS_DEF,
             TokenTypes.INTERFACE_DEF,
             TokenTypes.ENUM_DEF,
+            TokenTypes.ANNOTATION_DEF,
             TokenTypes.CTOR_DEF,
             TokenTypes.METHOD_DEF,
+            TokenTypes.LITERAL_FOR,
             TokenTypes.SLIST,
             TokenTypes.IDENT,
         };
@@ -208,7 +212,7 @@
     @Override
     public void beginTree(DetailAST rootAST) {
         frames = new HashMap<>();
-        current = null;
+        current.clear();
 
         final Deque<AbstractFrame> frameStack = new LinkedList<>();
         DetailAST curNode = rootAST;
@@ -239,7 +243,26 @@
             case TokenTypes.SLIST :
             case TokenTypes.METHOD_DEF :
             case TokenTypes.CTOR_DEF :
-                current = frames.get(ast);
+            case TokenTypes.LITERAL_FOR :
+                current.push(frames.get(ast));
+                break;
+            default :
+                // do nothing
+        }
+    }
+
+    @Override
+    public void leaveToken(DetailAST ast) {
+        switch (ast.getType()) {
+            case TokenTypes.CLASS_DEF :
+            case TokenTypes.INTERFACE_DEF :
+            case TokenTypes.ENUM_DEF :
+            case TokenTypes.ANNOTATION_DEF :
+            case TokenTypes.SLIST :
+            case TokenTypes.METHOD_DEF :
+            case TokenTypes.CTOR_DEF :
+            case TokenTypes.LITERAL_FOR:
+                current.pop();
                 break;
             default :
                 // do nothing
@@ -252,7 +275,12 @@
      * @param ast IDENT to check.
      */
     private void processIdent(DetailAST ast) {
-        final int parentType = ast.getParent().getType();
+        int parentType = ast.getParent().getType();
+        if (parentType == TokenTypes.EXPR
+                && ast.getParent().getParent().getParent().getType()
+                    == TokenTypes.ANNOTATION_FIELD_DEF) {
+            parentType = TokenTypes.ANNOTATION_FIELD_DEF;
+        }
         switch (parentType) {
             case TokenTypes.ANNOTATION_MEMBER_VALUE_PAIR:
             case TokenTypes.ANNOTATION:
@@ -328,6 +356,7 @@
      * @param frameStack stack containing the FrameTree being built.
      * @param ast AST to parse.
      */
+    // -@cs[JavaNCSS] This method is a big switch and is too hard to remove.
     private static void collectDeclarations(Deque<AbstractFrame> frameStack, DetailAST ast) {
         final AbstractFrame frame = frameStack.peek();
         switch (ast.getType()) {
@@ -336,7 +365,8 @@
                 break;
             case TokenTypes.PARAMETER_DEF :
                 if (!CheckUtils.isReceiverParameter(ast)
-                        && !isLambdaParameter(ast)) {
+                        && !isLambdaParameter(ast)
+                        && ast.getParent().getType() != TokenTypes.LITERAL_CATCH) {
                     final DetailAST parameterIdent = ast.findFirstToken(TokenTypes.IDENT);
                     frame.addIdent(parameterIdent);
                 }
@@ -366,6 +396,20 @@
                 final DetailAST ctorFrameNameIdent = ast.findFirstToken(TokenTypes.IDENT);
                 frameStack.addFirst(new ConstructorFrame(frame, ctorFrameNameIdent));
                 break;
+            case TokenTypes.ENUM_CONSTANT_DEF :
+                final DetailAST ident = ast.findFirstToken(TokenTypes.IDENT);
+                ((ClassFrame) frame).addStaticMember(ident);
+                break;
+            case TokenTypes.LITERAL_CATCH:
+                final AbstractFrame catchFrame = new CatchFrame(frame, ast);
+                catchFrame.addIdent(ast.findFirstToken(TokenTypes.PARAMETER_DEF).findFirstToken(
+                        TokenTypes.IDENT));
+                frameStack.addFirst(catchFrame);
+                break;
+            case TokenTypes.LITERAL_FOR:
+                final AbstractFrame forFrame = new ForFrame(frame, ast);
+                frameStack.addFirst(forFrame);
+                break;
             case TokenTypes.LITERAL_NEW:
                 if (isAnonymousClassDef(ast)) {
                     frameStack.addFirst(new AnonymousClassFrame(frame,
@@ -414,6 +458,8 @@
             case TokenTypes.SLIST :
             case TokenTypes.METHOD_DEF :
             case TokenTypes.CTOR_DEF :
+            case TokenTypes.LITERAL_CATCH :
+            case TokenTypes.LITERAL_FOR :
                 frames.put(ast, frameStack.poll());
                 break;
             case TokenTypes.LITERAL_NEW :
@@ -581,7 +627,8 @@
     private boolean canBeReferencedFromStaticContext(DetailAST ident) {
         AbstractFrame variableDeclarationFrame = findFrame(ident, false);
         boolean staticInitializationBlock = false;
-        while (variableDeclarationFrame.getType() == FrameType.BLOCK_FRAME) {
+        while (variableDeclarationFrame.getType() == FrameType.BLOCK_FRAME
+                || variableDeclarationFrame.getType() == FrameType.FOR_FRAME) {
             final DetailAST blockFrameNameIdent = variableDeclarationFrame.getFrameNameIdent();
             final DetailAST definitionToken = blockFrameNameIdent.getParent();
             if (definitionToken.getType() == TokenTypes.STATIC_INIT) {
@@ -824,7 +871,7 @@
      * @return AbstractFrame containing declaration or null.
      */
     private AbstractFrame findClassFrame(DetailAST name, boolean lookForMethod) {
-        AbstractFrame frame = current;
+        AbstractFrame frame = current.peek();
 
         while (true) {
             frame = findFrame(frame, name, lookForMethod);
@@ -846,7 +893,7 @@
      * @return AbstractFrame containing declaration or null.
      */
     private AbstractFrame findFrame(DetailAST name, boolean lookForMethod) {
-        return findFrame(current, name, lookForMethod);
+        return findFrame(current.peek(), name, lookForMethod);
     }
 
     /**
@@ -858,14 +905,7 @@
      */
     private static AbstractFrame findFrame(AbstractFrame frame, DetailAST name,
             boolean lookForMethod) {
-        final AbstractFrame result;
-        if (frame == null) {
-            result = null;
-        }
-        else {
-            result = frame.getIfContains(name, lookForMethod);
-        }
-        return result;
+        return frame.getIfContains(name, lookForMethod);
     }
 
     /**
@@ -900,7 +940,7 @@
      * @return the name of the nearest parent ClassFrame.
      */
     private String getNearestClassFrameName() {
-        AbstractFrame frame = current;
+        AbstractFrame frame = current.peek();
         while (frame.getType() != FrameType.CLASS_FRAME) {
             frame = frame.getParent();
         }
@@ -952,6 +992,10 @@
         METHOD_FRAME,
         /** Block frame type. */
         BLOCK_FRAME,
+        /** Catch frame type. */
+        CATCH_FRAME,
+        /** Lambda frame type. */
+        FOR_FRAME,
     }
 
     /**
@@ -1357,4 +1401,44 @@
             return FrameType.BLOCK_FRAME;
         }
     }
+
+    /**
+     * A frame initiated on entering a catch block; holds local catch variable names.
+     * @author Richard Veach
+     */
+    public static class CatchFrame extends AbstractFrame {
+        /**
+         * Creates catch frame.
+         * @param parent parent frame.
+         * @param ident ident frame name ident.
+         */
+        protected CatchFrame(AbstractFrame parent, DetailAST ident) {
+            super(parent, ident);
+        }
+
+        @Override
+        public FrameType getType() {
+            return FrameType.CATCH_FRAME;
+        }
+    }
+
+    /**
+     * A frame initiated on entering a for block; holds local for variable names.
+     * @author Richard Veach
+     */
+    public static class ForFrame extends AbstractFrame {
+        /**
+         * Creates for frame.
+         * @param parent parent frame.
+         * @param ident ident frame name ident.
+         */
+        protected ForFrame(AbstractFrame parent, DetailAST ident) {
+            super(parent, ident);
+        }
+
+        @Override
+        public FrameType getType() {
+            return FrameType.FOR_FRAME;
+        }
+    }
 }
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/ReturnCountCheck.java b/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/ReturnCountCheck.java
index 231fcd8..fcdcdda 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/ReturnCountCheck.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/ReturnCountCheck.java
@@ -60,6 +60,11 @@
      * file.
      */
     public static final String MSG_KEY = "return.count";
+    /**
+     * A key pointing to the warning message text in "messages.properties"
+     * file.
+     */
+    public static final String MSG_KEY_VOID = "return.countVoid";
 
     /** Stack of method contexts. */
     private final Deque<Context> contextStack = new ArrayDeque<>();
@@ -199,10 +204,10 @@
         // we can't identify which max to use for lambdas, so we can only assign
         // after the first return statement is seen
         if (ast.getFirstChild().getType() == TokenTypes.SEMI) {
-            context.visitLiteralReturn(maxForVoid);
+            context.visitLiteralReturn(maxForVoid, true);
         }
         else {
-            context.visitLiteralReturn(max);
+            context.visitLiteralReturn(max, false);
         }
     }
 
@@ -217,6 +222,8 @@
         private int count;
         /** Maximum allowed number of return statements. */
         private Integer maxAllowed;
+        /** Identifies if context is void. */
+        private boolean isVoidContext;
 
         /**
          * Creates new method context.
@@ -227,10 +234,12 @@
         }
 
         /**
-         * Increase the number of return statements.
+         * Increase the number of return statements and set context return type.
          * @param maxAssigned Maximum allowed number of return statements.
+         * @param voidReturn Identifies if context is void.
          */
-        public void visitLiteralReturn(int maxAssigned) {
+        public void visitLiteralReturn(int maxAssigned, Boolean voidReturn) {
+            isVoidContext = voidReturn;
             if (maxAllowed == null) {
                 maxAllowed = maxAssigned;
             }
@@ -245,7 +254,12 @@
          */
         public void checkCount(DetailAST ast) {
             if (checking && maxAllowed != null && count > maxAllowed) {
-                log(ast.getLineNo(), ast.getColumnNo(), MSG_KEY, count, maxAllowed);
+                if (isVoidContext) {
+                    log(ast.getLineNo(), ast.getColumnNo(), MSG_KEY_VOID, count, maxAllowed);
+                }
+                else {
+                    log(ast.getLineNo(), ast.getColumnNo(), MSG_KEY, count, maxAllowed);
+                }
             }
         }
     }
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/VariableDeclarationUsageDistanceCheck.java b/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/VariableDeclarationUsageDistanceCheck.java
index 0e7d9fd..f13541e 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/VariableDeclarationUsageDistanceCheck.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/VariableDeclarationUsageDistanceCheck.java
@@ -424,8 +424,13 @@
      */
     private static int getDistToVariableUsageInChildNode(DetailAST childNode, DetailAST varIdent,
                                                          int currentDistToVarUsage) {
+        DetailAST examineNode = childNode;
+        if (examineNode.getType() == TokenTypes.LABELED_STAT) {
+            examineNode = examineNode.getFirstChild().getNextSibling();
+        }
+
         int resultDist = currentDistToVarUsage;
-        switch (childNode.getType()) {
+        switch (examineNode.getType()) {
             case TokenTypes.VARIABLE_DEF:
                 resultDist++;
                 break;
@@ -437,7 +442,7 @@
             case TokenTypes.LITERAL_DO:
             case TokenTypes.LITERAL_IF:
             case TokenTypes.LITERAL_SWITCH:
-                if (isVariableInOperatorExpr(childNode, varIdent)) {
+                if (isVariableInOperatorExpr(examineNode, varIdent)) {
                     resultDist++;
                 }
                 else {
@@ -447,11 +452,11 @@
                 }
                 break;
             default:
-                if (childNode.branchContains(TokenTypes.SLIST)) {
-                    resultDist = 0;
+                if (examineNode.findFirstToken(TokenTypes.SLIST) == null) {
+                    resultDist++;
                 }
                 else {
-                    resultDist++;
+                    resultDist = 0;
                 }
         }
         return resultDist;
@@ -522,16 +527,17 @@
                     variableUsageAst = exprWithVariableUsage;
                 }
             }
+
+            // If there's no any variable usage, then distance = 0.
+            else if (variableUsageExpressions.isEmpty()) {
+                variableUsageAst = null;
+            }
             // If variable usage exists in different scopes, then distance =
             // distance until variable first usage.
-            else if (variableUsageExpressions.size() > 1) {
+            else {
                 dist++;
                 variableUsageAst = variableUsageExpressions.get(0);
             }
-            // If there's no any variable usage, then distance = 0.
-            else {
-                variableUsageAst = null;
-            }
         }
         return new SimpleEntry<>(variableUsageAst, dist);
     }
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/checks/imports/CustomImportOrderCheck.java b/src/main/java/com/puppycrawl/tools/checkstyle/checks/imports/CustomImportOrderCheck.java
index cc32ef2..c4d2d6d 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/checks/imports/CustomImportOrderCheck.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/checks/imports/CustomImportOrderCheck.java
@@ -436,7 +436,6 @@
      *        user value.
      */
     public final void setCustomImportOrderRules(final String inputCustomImportOrder) {
-        customImportOrderRules.clear();
         for (String currentState : GROUP_SEPARATOR_PATTERN.split(inputCustomImportOrder)) {
             addRulesToList(currentState);
         }
@@ -636,7 +635,7 @@
                 }
                 if (SPECIAL_IMPORTS_RULE_GROUP.equals(group)) {
                     bestMatch = findBetterPatternMatch(importPath,
-                            SPECIAL_IMPORTS_RULE_GROUP, specialImportsRegExp, bestMatch);
+                            group, specialImportsRegExp, bestMatch);
                 }
             }
         }
@@ -691,7 +690,7 @@
         final String separator = "\\.";
         final String[] import1Tokens = import1.split(separator);
         final String[] import2Tokens = import2.split(separator);
-        for (int i = 0; i < import1Tokens.length && i != import2Tokens.length; i++) {
+        for (int i = 0; i != import1Tokens.length && i != import2Tokens.length; i++) {
             final String import1Token = import1Tokens[i];
             final String import2Token = import2Tokens[i];
             result = import1Token.compareTo(import2Token);
@@ -699,6 +698,9 @@
                 break;
             }
         }
+        if (result == 0) {
+            result = Integer.compare(import1Tokens.length, import2Tokens.length);
+        }
         return result;
     }
 
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/checks/imports/ImportControlLoader.java b/src/main/java/com/puppycrawl/tools/checkstyle/checks/imports/ImportControlLoader.java
index f6e7869..93a442b 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/checks/imports/ImportControlLoader.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/checks/imports/ImportControlLoader.java
@@ -34,14 +34,14 @@
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
 
-import com.puppycrawl.tools.checkstyle.api.AbstractLoader;
+import com.puppycrawl.tools.checkstyle.XmlLoader;
 import com.puppycrawl.tools.checkstyle.api.CheckstyleException;
 
 /**
  * Responsible for loading the contents of an import control configuration file.
  * @author Oliver Burn
  */
-final class ImportControlLoader extends AbstractLoader {
+final class ImportControlLoader extends XmlLoader {
     /** The public ID for the configuration dtd. */
     private static final String DTD_PUBLIC_ID_1_0 =
         "-//Puppy Crawl//DTD Import Control 1.0//EN";
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/checks/imports/ImportOrderCheck.java b/src/main/java/com/puppycrawl/tools/checkstyle/checks/imports/ImportOrderCheck.java
index a6f08bf..f769c75 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/checks/imports/ImportOrderCheck.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/checks/imports/ImportOrderCheck.java
@@ -392,6 +392,10 @@
             }
             doVisitToken(ident, isStatic, isStaticAndNotLastImport);
 
+            if (isStaticAndNotLastImport && !beforeFirstImport) {
+                log(ident.getLineNo(), MSG_ORDERING, ident.getText());
+            }
+
         }
         else if (option == ImportOrderOption.BOTTOM) {
 
@@ -401,6 +405,10 @@
             }
             doVisitToken(ident, isStatic, isLastImportAndNonStatic);
 
+            if (isLastImportAndNonStatic) {
+                log(ident.getLineNo(), MSG_ORDERING, ident.getText());
+            }
+
         }
         else if (option == ImportOrderOption.ABOVE) {
             // previous non-static but current is static
@@ -440,14 +448,15 @@
         final int groupIdx = getGroupNumber(name);
         final int line = ident.getLineNo();
 
-        if (isInSameGroup(groupIdx, isStatic)) {
-            doVisitTokenInSameGroup(isStatic, previous, name, line);
-        }
-        else if (groupIdx > lastGroup) {
-            if (!beforeFirstImport && separated && line - lastImportLine < 2) {
+        if (groupIdx > lastGroup) {
+            if (!beforeFirstImport && separated && line - lastImportLine < 2
+                && !isInSameGroup(groupIdx, isStatic)) {
                 log(line, MSG_SEPARATION, name);
             }
         }
+        else if (isInSameGroup(groupIdx, isStatic)) {
+            doVisitTokenInSameGroup(isStatic, previous, name, line);
+        }
         else {
             log(line, MSG_ORDERING, name);
         }
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/checks/indentation/LineWrappingHandler.java b/src/main/java/com/puppycrawl/tools/checkstyle/checks/indentation/LineWrappingHandler.java
index f8af0a7..39f2b9c 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/checks/indentation/LineWrappingHandler.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/checks/indentation/LineWrappingHandler.java
@@ -262,7 +262,8 @@
             if (isCurrentNodeCloseAnnotationAloneInLine
                     || node.getType() == TokenTypes.AT
                     && (parentNode.getParent().getType() == TokenTypes.MODIFIERS
-                        || parentNode.getParent().getType() == TokenTypes.ANNOTATIONS)) {
+                        || parentNode.getParent().getType() == TokenTypes.ANNOTATIONS)
+                    || node.getLineNo() == atNode.getLineNo()) {
                 logWarningMessage(node, firstNodeIndent);
             }
             else {
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/checks/indentation/TryHandler.java b/src/main/java/com/puppycrawl/tools/checkstyle/checks/indentation/TryHandler.java
index 1b91a57..eb80609 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/checks/indentation/TryHandler.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/checks/indentation/TryHandler.java
@@ -129,9 +129,9 @@
      */
     private void checkTryResources(final DetailAST resourcesSpecAst) {
         final DetailAST resourcesAst = resourcesSpecAst.findFirstToken(TokenTypes.RESOURCES);
-        final int indetation = getIndent().getFirstIndentLevel()
+        final int indentation = getIndent().getFirstIndentLevel()
             + getIndentCheck().getLineWrappingIndentation();
-        final IndentLevel expectedResourceIndent = new IndentLevel(indetation);
+        final IndentLevel expectedResourceIndent = new IndentLevel(indentation);
 
         final String subType = "resource";
 
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/checks/javadoc/JavadocMethodCheck.java b/src/main/java/com/puppycrawl/tools/checkstyle/checks/javadoc/JavadocMethodCheck.java
index 2e0d95e..ca3aec8 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/checks/javadoc/JavadocMethodCheck.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/checks/javadoc/JavadocMethodCheck.java
@@ -100,12 +100,12 @@
     public static final String MSG_DUPLICATE_TAG = "javadoc.duplicateTag";
 
     /** Compiled regexp to match Javadoc tags that take an argument. */
-    private static final Pattern MATCH_JAVADOC_ARG =
-            CommonUtils.createPattern("@(throws|exception|param)\\s+(\\S+)\\s+\\S*");
+    private static final Pattern MATCH_JAVADOC_ARG = CommonUtils.createPattern(
+            "^\\s*(?>\\*|\\/\\*\\*)?\\s*@(throws|exception|param)\\s+(\\S+)\\s+\\S*");
 
     /** Compiled regexp to match first part of multilineJavadoc tags. */
-    private static final Pattern MATCH_JAVADOC_ARG_MULTILINE_START =
-            CommonUtils.createPattern("@(throws|exception|param)\\s+(\\S+)\\s*$");
+    private static final Pattern MATCH_JAVADOC_ARG_MULTILINE_START = CommonUtils.createPattern(
+            "^\\s*(?>\\*|\\/\\*\\*)?\\s*@(throws|exception|param)\\s+(\\S+)\\s*$");
 
     /** Compiled regexp to look for a continuation of the comment. */
     private static final Pattern MATCH_JAVADOC_MULTILINE_CONT =
@@ -118,10 +118,10 @@
 
     /** Compiled regexp to match Javadoc tags with no argument. */
     private static final Pattern MATCH_JAVADOC_NOARG =
-            CommonUtils.createPattern("@(return|see)\\s+\\S");
+            CommonUtils.createPattern("^\\s*(?>\\*|\\/\\*\\*)?\\s*@(return|see)\\s+\\S");
     /** Compiled regexp to match first part of multilineJavadoc tags. */
     private static final Pattern MATCH_JAVADOC_NOARG_MULTILINE_START =
-            CommonUtils.createPattern("@(return|see)\\s*$");
+            CommonUtils.createPattern("^\\s*(?>\\*|\\/\\*\\*)?\\s*@(return|see)\\s*$");
     /** Compiled regexp to match Javadoc tags with no argument and {}. */
     private static final Pattern MATCH_JAVADOC_NOARG_CURLY =
             CommonUtils.createPattern("\\{\\s*@(inheritDoc)\\s*\\}");
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/checks/javadoc/NonEmptyAtclauseDescriptionCheck.java b/src/main/java/com/puppycrawl/tools/checkstyle/checks/javadoc/NonEmptyAtclauseDescriptionCheck.java
index 7751620..73e46a0 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/checks/javadoc/NonEmptyAtclauseDescriptionCheck.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/checks/javadoc/NonEmptyAtclauseDescriptionCheck.java
@@ -48,6 +48,7 @@
             JavadocTokenTypes.PARAM_LITERAL,
             JavadocTokenTypes.RETURN_LITERAL,
             JavadocTokenTypes.THROWS_LITERAL,
+            JavadocTokenTypes.EXCEPTION_LITERAL,
             JavadocTokenTypes.DEPRECATED_LITERAL,
         };
     }
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/checks/metrics/AbstractClassCouplingCheck.java b/src/main/java/com/puppycrawl/tools/checkstyle/checks/metrics/AbstractClassCouplingCheck.java
index a0498fc..293cd4a 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/checks/metrics/AbstractClassCouplingCheck.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/checks/metrics/AbstractClassCouplingCheck.java
@@ -140,7 +140,7 @@
     }
 
     /**
-     * Sets user-excluded pakcages to ignore. All exlcuded packages should end with a period,
+     * Sets user-excluded packages to ignore. All excluded packages should end with a period,
      * so it also appends a dot to a package name.
      * @param excludedPackages the list of packages to ignore.
      */
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/checks/metrics/ClassDataAbstractionCouplingCheck.java b/src/main/java/com/puppycrawl/tools/checkstyle/checks/metrics/ClassDataAbstractionCouplingCheck.java
index b960dd5..8c41a8c 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/checks/metrics/ClassDataAbstractionCouplingCheck.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/checks/metrics/ClassDataAbstractionCouplingCheck.java
@@ -59,14 +59,7 @@
 
     @Override
     public int[] getAcceptableTokens() {
-        return new int[] {
-            TokenTypes.PACKAGE_DEF,
-            TokenTypes.IMPORT,
-            TokenTypes.CLASS_DEF,
-            TokenTypes.INTERFACE_DEF,
-            TokenTypes.ENUM_DEF,
-            TokenTypes.LITERAL_NEW,
-        };
+        return getRequiredTokens();
     }
 
     // -@cs[SimpleAccessorNameNotation] Overrides method from the base class.
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/checks/metrics/NPathComplexityCheck.java b/src/main/java/com/puppycrawl/tools/checkstyle/checks/metrics/NPathComplexityCheck.java
index 5f62d2c..b07268c 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/checks/metrics/NPathComplexityCheck.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/checks/metrics/NPathComplexityCheck.java
@@ -337,7 +337,7 @@
     }
 
     /**
-     * Calculates number of conditional operators, including inline ternary operatior, for a token.
+     * Calculates number of conditional operators, including inline ternary operator, for a token.
      * @param ast inspected token.
      * @return number of conditional operators.
      * @see <a href="https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.23">
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/checks/modifier/RedundantModifierCheck.java b/src/main/java/com/puppycrawl/tools/checkstyle/checks/modifier/RedundantModifierCheck.java
index cc8d1b6..5db77a3 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/checks/modifier/RedundantModifierCheck.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/checks/modifier/RedundantModifierCheck.java
@@ -289,11 +289,11 @@
             modifiers.findFirstToken(TokenTypes.LITERAL_PRIVATE) != null;
         // declared in a final class?
         DetailAST parent = ast.getParent();
-        while (parent != null) {
+        while (parent != null && !checkFinal) {
             if (parent.getType() == TokenTypes.CLASS_DEF) {
                 final DetailAST classModifiers =
                     parent.findFirstToken(TokenTypes.MODIFIERS);
-                checkFinal = checkFinal || classModifiers.findFirstToken(TokenTypes.FINAL) != null;
+                checkFinal = classModifiers.findFirstToken(TokenTypes.FINAL) != null;
                 parent = null;
             }
             else if (parent.getType() == TokenTypes.LITERAL_NEW
@@ -301,6 +301,10 @@
                 checkFinal = true;
                 parent = null;
             }
+            else if (parent.getType() == TokenTypes.ENUM_DEF) {
+                checkFinal = modifiers.findFirstToken(TokenTypes.LITERAL_STATIC) != null;
+                parent = null;
+            }
             else {
                 parent = parent.getParent();
             }
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/checks/regexp/RegexpSinglelineJavaCheck.java b/src/main/java/com/puppycrawl/tools/checkstyle/checks/regexp/RegexpSinglelineJavaCheck.java
index c7876e2..b82985b 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/checks/regexp/RegexpSinglelineJavaCheck.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/checks/regexp/RegexpSinglelineJavaCheck.java
@@ -62,15 +62,15 @@
 
     @Override
     public void beginTree(DetailAST rootAST) {
-        MatchSuppressor supressor = null;
+        MatchSuppressor suppressor = null;
         if (ignoreComments) {
-            supressor = new CommentSuppressor(getFileContents());
+            suppressor = new CommentSuppressor(getFileContents());
         }
 
         final DetectorOptions options = DetectorOptions.newBuilder()
             .reporter(this)
             .compileFlags(0)
-            .suppressor(supressor)
+            .suppressor(suppressor)
             .format(format)
             .message(message)
             .minimum(minimum)
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/checks/sizes/MethodCountCheck.java b/src/main/java/com/puppycrawl/tools/checkstyle/checks/sizes/MethodCountCheck.java
index d31c525..e9ce934 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/checks/sizes/MethodCountCheck.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/checks/sizes/MethodCountCheck.java
@@ -112,7 +112,7 @@
     @Override
     public void visitToken(DetailAST ast) {
         if (ast.getType() == TokenTypes.METHOD_DEF) {
-            if (isInLastestScopeDefinition(ast)) {
+            if (isInLatestScopeDefinition(ast)) {
                 raiseCounter(ast);
             }
         }
@@ -134,11 +134,11 @@
      * Checks if there is a scope definition to check and that the method is found inside that scope
      * (class, enum, etc.).
      * @param methodDef
-     *        The method to analzye.
+     *        The method to analyze.
      * @return {@code true} if the method is part of the latest scope definition and should be
      *         counted.
      */
-    private boolean isInLastestScopeDefinition(DetailAST methodDef) {
+    private boolean isInLatestScopeDefinition(DetailAST methodDef) {
         boolean result = false;
 
         if (!counters.isEmpty()) {
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/checks/whitespace/NoWhitespaceAfterCheck.java b/src/main/java/com/puppycrawl/tools/checkstyle/checks/whitespace/NoWhitespaceAfterCheck.java
index 44a3118..4d95620 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/checks/whitespace/NoWhitespaceAfterCheck.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/checks/whitespace/NoWhitespaceAfterCheck.java
@@ -390,8 +390,12 @@
         }
         //ident and lastTypeNode lay on one line
         else {
-            if (ident.getColumnNo() >= ast.getColumnNo() + 1
-                || lastTypeNode.getColumnNo() > ident.getColumnNo()) {
+            final int instanceOfSize = 13;
+            // +2 because ast has `[]` after the ident
+            if (ident.getColumnNo() >= ast.getColumnNo() + 2
+                // +13 because ident (at most 1 character) is followed by
+                // ' instanceof ' (12 characters)
+                || lastTypeNode.getColumnNo() >= ident.getColumnNo() + instanceOfSize) {
                 previousElement = lastTypeNode;
             }
             else {
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/filefilters/BeforeExecutionExclusionFileFilter.java b/src/main/java/com/puppycrawl/tools/checkstyle/filefilters/BeforeExecutionExclusionFileFilter.java
index 39dea8f..77fe7c4 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/filefilters/BeforeExecutionExclusionFileFilter.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/filefilters/BeforeExecutionExclusionFileFilter.java
@@ -83,6 +83,11 @@
     }
 
     @Override
+    protected void finishLocalSetup() {
+        // No code by default
+    }
+
+    @Override
     public boolean accept(String uri) {
         return fileNamePattern == null || !fileNamePattern.matcher(uri).find();
     }
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/filters/SeverityMatchFilter.java b/src/main/java/com/puppycrawl/tools/checkstyle/filters/SeverityMatchFilter.java
index db2aa92..9642ee7 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/filters/SeverityMatchFilter.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/filters/SeverityMatchFilter.java
@@ -21,6 +21,7 @@
 
 import com.puppycrawl.tools.checkstyle.api.AuditEvent;
 import com.puppycrawl.tools.checkstyle.api.AutomaticBean;
+import com.puppycrawl.tools.checkstyle.api.CheckstyleException;
 import com.puppycrawl.tools.checkstyle.api.Filter;
 import com.puppycrawl.tools.checkstyle.api.SeverityLevel;
 
@@ -59,6 +60,11 @@
     }
 
     @Override
+    protected void finishLocalSetup() throws CheckstyleException {
+        // No code by default
+    }
+
+    @Override
     public boolean accept(AuditEvent event) {
         final boolean severityMatches = severity == event.getSeverityLevel();
         return acceptOnMatch == severityMatches;
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/filters/SuppressElement.java b/src/main/java/com/puppycrawl/tools/checkstyle/filters/SuppressElement.java
index ad2d6d2..21c17ee 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/filters/SuppressElement.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/filters/SuppressElement.java
@@ -24,7 +24,6 @@
 
 import com.puppycrawl.tools.checkstyle.api.AuditEvent;
 import com.puppycrawl.tools.checkstyle.api.Filter;
-import com.puppycrawl.tools.checkstyle.utils.CommonUtils;
 
 /**
  * This filter processes {@link AuditEvent}
@@ -53,6 +52,12 @@
     /** The pattern for check class names. */
     private final String checkPattern;
 
+    /** The regexp to match message names against. */
+    private final Pattern messageRegexp;
+
+    /** The pattern for message names. */
+    private final String messagePattern;
+
     /** Module id filter. */
     private final String moduleId;
 
@@ -74,20 +79,33 @@
      *
      * @param files   regular expression for names of filtered files.
      * @param checks  regular expression for filtered check classes.
+     * @param message regular expression for messages.
      * @param modId   the id
      * @param lines   lines CSV values and ranges for line number filtering.
      * @param columns columns CSV values and ranges for column number filtering.
      */
     public SuppressElement(String files, String checks,
-                           String modId, String lines, String columns) {
+                           String message, String modId, String lines, String columns) {
         filePattern = files;
-        fileRegexp = Pattern.compile(files);
+        if (files == null) {
+            fileRegexp = null;
+        }
+        else {
+            fileRegexp = Pattern.compile(files);
+        }
         checkPattern = checks;
         if (checks == null) {
             checkRegexp = null;
         }
         else {
-            checkRegexp = CommonUtils.createPattern(checks);
+            checkRegexp = Pattern.compile(checks);
+        }
+        messagePattern = message;
+        if (message == null) {
+            messageRegexp = null;
+        }
+        else {
+            messageRegexp = Pattern.compile(message);
         }
         moduleId = modId;
         linesCsv = lines;
@@ -109,6 +127,7 @@
     @Override
     public boolean accept(AuditEvent event) {
         return isFileNameAndModuleNotMatching(event)
+                || !isMessageNameMatching(event)
                 || isLineAndColumnMatch(event);
     }
 
@@ -119,13 +138,22 @@
      */
     private boolean isFileNameAndModuleNotMatching(AuditEvent event) {
         return event.getFileName() == null
-                || !fileRegexp.matcher(event.getFileName()).find()
+                || fileRegexp != null && !fileRegexp.matcher(event.getFileName()).find()
                 || event.getLocalizedMessage() == null
                 || moduleId != null && !moduleId.equals(event.getModuleId())
                 || checkRegexp != null && !checkRegexp.matcher(event.getSourceName()).find();
     }
 
     /**
+     * Is matching by message.
+     * @param event event
+     * @return true is matching or not set.
+     */
+    private boolean isMessageNameMatching(AuditEvent event) {
+        return messageRegexp == null || messageRegexp.matcher(event.getMessage()).find();
+    }
+
+    /**
      * Whether line and column match.
      * @param event event to process.
      * @return true if line and column match.
@@ -138,7 +166,8 @@
 
     @Override
     public int hashCode() {
-        return Objects.hash(filePattern, checkPattern, moduleId, linesCsv, columnsCsv);
+        return Objects.hash(filePattern, checkPattern, messagePattern, moduleId, linesCsv,
+                columnsCsv);
     }
 
     @Override
@@ -152,6 +181,7 @@
         final SuppressElement suppressElement = (SuppressElement) other;
         return Objects.equals(filePattern, suppressElement.filePattern)
                 && Objects.equals(checkPattern, suppressElement.checkPattern)
+                && Objects.equals(messagePattern, suppressElement.messagePattern)
                 && Objects.equals(moduleId, suppressElement.moduleId)
                 && Objects.equals(linesCsv, suppressElement.linesCsv)
                 && Objects.equals(columnsCsv, suppressElement.columnsCsv);
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/filters/SuppressWarningsFilter.java b/src/main/java/com/puppycrawl/tools/checkstyle/filters/SuppressWarningsFilter.java
index 4e2c6bb..f257713 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/filters/SuppressWarningsFilter.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/filters/SuppressWarningsFilter.java
@@ -21,6 +21,7 @@
 
 import com.puppycrawl.tools.checkstyle.api.AuditEvent;
 import com.puppycrawl.tools.checkstyle.api.AutomaticBean;
+import com.puppycrawl.tools.checkstyle.api.CheckstyleException;
 import com.puppycrawl.tools.checkstyle.api.Filter;
 import com.puppycrawl.tools.checkstyle.checks.SuppressWarningsHolder;
 
@@ -33,6 +34,11 @@
     extends AutomaticBean
     implements Filter {
     @Override
+    protected void finishLocalSetup() throws CheckstyleException {
+        // No code by default
+    }
+
+    @Override
     public boolean accept(AuditEvent event) {
         return !SuppressWarningsHolder.isSuppressed(event);
     }
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/filters/SuppressWithNearbyCommentFilter.java b/src/main/java/com/puppycrawl/tools/checkstyle/filters/SuppressWithNearbyCommentFilter.java
index 85a387b..d3fa968 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/filters/SuppressWithNearbyCommentFilter.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/filters/SuppressWithNearbyCommentFilter.java
@@ -31,6 +31,7 @@
 import com.puppycrawl.tools.checkstyle.TreeWalkerAuditEvent;
 import com.puppycrawl.tools.checkstyle.TreeWalkerFilter;
 import com.puppycrawl.tools.checkstyle.api.AutomaticBean;
+import com.puppycrawl.tools.checkstyle.api.CheckstyleException;
 import com.puppycrawl.tools.checkstyle.api.FileContents;
 import com.puppycrawl.tools.checkstyle.api.TextBlock;
 import com.puppycrawl.tools.checkstyle.utils.CommonUtils;
@@ -183,6 +184,11 @@
     }
 
     @Override
+    protected void finishLocalSetup() throws CheckstyleException {
+        // No code by default
+    }
+
+    @Override
     public boolean accept(TreeWalkerAuditEvent event) {
         boolean accepted = true;
 
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/filters/SuppressWithPlainTextCommentFilter.java b/src/main/java/com/puppycrawl/tools/checkstyle/filters/SuppressWithPlainTextCommentFilter.java
new file mode 100644
index 0000000..ad38084
--- /dev/null
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/filters/SuppressWithPlainTextCommentFilter.java
@@ -0,0 +1,349 @@
+////////////////////////////////////////////////////////////////////////////////
+// checkstyle: Checks Java source code for adherence to a set of rules.
+// Copyright (C) 2001-2017 the original author or authors.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+////////////////////////////////////////////////////////////////////////////////
+
+package com.puppycrawl.tools.checkstyle.filters;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
+
+import com.puppycrawl.tools.checkstyle.api.AuditEvent;
+import com.puppycrawl.tools.checkstyle.api.AutomaticBean;
+import com.puppycrawl.tools.checkstyle.api.CheckstyleException;
+import com.puppycrawl.tools.checkstyle.api.FileText;
+import com.puppycrawl.tools.checkstyle.api.Filter;
+import com.puppycrawl.tools.checkstyle.utils.CommonUtils;
+
+/**
+ * <p>
+ *     A filter that uses comments to suppress audit events.
+ *     The filter can be used only to suppress audit events received from
+ *     {@link com.puppycrawl.tools.checkstyle.api.FileSetCheck} checks.
+ *     SuppressWithPlainTextCommentFilter knows nothing about AST,
+ *     it treats only plain text comments and extracts the information required for suppression from
+ *     the plain text comments. Currently the filter supports only single line comments.
+ * </p>
+ * <p>
+ *     Rationale:
+ *     Sometimes there are legitimate reasons for violating a check. When
+ *     this is a matter of the code in question and not personal
+ *     preference, the best place to override the policy is in the code
+ *     itself.  Semi-structured comments can be associated with the check.
+ *     This is sometimes superior to a separate suppressions file, which
+ *     must be kept up-to-date as the source file is edited.
+ * </p>
+ * @author Andrei Selkin
+ */
+public class SuppressWithPlainTextCommentFilter extends AutomaticBean implements Filter {
+
+    /** Comment format which turns checkstyle reporting off. */
+    private static final String DEFAULT_OFF_FORMAT = "// CHECKSTYLE:OFF";
+
+    /** Comment format which turns checkstyle reporting on. */
+    private static final String DEFAULT_ON_FORMAT = "// CHECKSTYLE:ON";
+
+    /** Default check format to suppress. By default the filter suppress all checks. */
+    private static final String DEFAULT_CHECK_FORMAT = ".*";
+
+    /** Regexp which turns checkstyle reporting off. */
+    private Pattern offCommentFormat = CommonUtils.createPattern(DEFAULT_OFF_FORMAT);
+
+    /** Regexp which turns checkstyle reporting on. */
+    private Pattern onCommentFormat = CommonUtils.createPattern(DEFAULT_ON_FORMAT);
+
+    /** The check format to suppress. */
+    private String checkFormat = DEFAULT_CHECK_FORMAT;
+
+    /** The message format to suppress.*/
+    private String messageFormat;
+
+    /**
+     * Sets an off comment format pattern.
+     * @param pattern off comment format pattern.
+     */
+    public final void setOffCommentFormat(Pattern pattern) {
+        offCommentFormat = pattern;
+    }
+
+    /**
+     * Sets an on comment format pattern.
+     * @param pattern  on comment format pattern.
+     */
+    public final void setOnCommentFormat(Pattern pattern) {
+        onCommentFormat = pattern;
+    }
+
+    /**
+     * Sets a pattern for check format.
+     * @param format pattern for check format.
+     */
+    public final void setCheckFormat(String format) {
+        checkFormat = format;
+    }
+
+    /**
+     * Sets a pattern for message format.
+     * @param format pattern for message format.
+     */
+    public final void setMessageFormat(String format) {
+        messageFormat = format;
+    }
+
+    @Override
+    public boolean accept(AuditEvent event) {
+        boolean accepted = true;
+        if (event.getLocalizedMessage() != null) {
+            final FileText fileText = getFileText(event.getFileName());
+            if (fileText != null) {
+                final List<Suppression> suppressions = getSuppressions(fileText);
+                accepted = getNearestSuppression(suppressions, event) == null;
+            }
+        }
+        return accepted;
+    }
+
+    @Override
+    protected void finishLocalSetup() throws CheckstyleException {
+        // No code by default
+    }
+
+    /**
+     * Returns {@link FileText} instance created based on the given file name.
+     * @param fileName the name of the file.
+     * @return {@link FileText} instance.
+     */
+    private static FileText getFileText(String fileName) {
+        final File file = new File(fileName);
+        FileText result = null;
+
+        // some violations can be on a directory, instead of a file
+        if (!file.isDirectory()) {
+            try {
+                result = new FileText(file, StandardCharsets.UTF_8.name());
+            }
+            catch (IOException ex) {
+                throw new IllegalStateException("Cannot read source file: " + fileName, ex);
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * Returns the list of {@link Suppression} instances retrieved from the given {@link FileText}.
+     * @param fileText {@link FileText} instance.
+     * @return list of {@link Suppression} instances.
+     */
+    private List<Suppression> getSuppressions(FileText fileText) {
+        final List<Suppression> suppressions = new ArrayList<>();
+        for (int lineNo = 0; lineNo < fileText.size(); lineNo++) {
+            final Optional<Suppression> suppression = getSuppression(fileText, lineNo);
+            suppression.ifPresent(suppressions::add);
+        }
+        return suppressions;
+    }
+
+    /**
+     * Tries to extract the suppression from the given line.
+     * @param fileText {@link FileText} instance.
+     * @param lineNo line number.
+     * @return {@link Optional} of {@link Suppression}.
+     */
+    private Optional<Suppression> getSuppression(FileText fileText, int lineNo) {
+        final String line = fileText.get(lineNo);
+        final Matcher onCommentMatcher = onCommentFormat.matcher(line);
+        final Matcher offCommentMatcher = offCommentFormat.matcher(line);
+
+        Suppression suppression = null;
+        if (onCommentMatcher.find()) {
+            suppression = new Suppression(onCommentMatcher.group(0),
+                lineNo + 1, onCommentMatcher.start(), SuppressionType.ON, this);
+        }
+        if (offCommentMatcher.find()) {
+            suppression = new Suppression(offCommentMatcher.group(0),
+                lineNo + 1, offCommentMatcher.start(), SuppressionType.OFF, this);
+        }
+
+        return Optional.ofNullable(suppression);
+    }
+
+    /**
+     * Finds the nearest {@link Suppression} instance which can suppress
+     * the given {@link AuditEvent}. The nearest suppression is the suppression which scope
+     * is before the line and column of the event.
+     * @param suppressions {@link Suppression} instance.
+     * @param event {@link AuditEvent} instance.
+     * @return {@link Suppression} instance.
+     */
+    private static Suppression getNearestSuppression(List<Suppression> suppressions,
+                                                     AuditEvent event) {
+        return suppressions
+            .stream()
+            .filter(suppression -> suppression.isMatch(event))
+            .reduce((first, second) -> second)
+            .filter(suppression -> suppression.suppressionType != SuppressionType.ON)
+            .orElse(null);
+    }
+
+    /** Enum which represents the type of the suppression. */
+    private enum SuppressionType {
+
+        /** On suppression type. */
+        ON,
+        /** Off suppression type. */
+        OFF
+
+    }
+
+    /** The class which represents the suppression. */
+    public static class Suppression {
+
+        /** The regexp which is used to match the event source.*/
+        private final Pattern eventSourceRegexp;
+        /** The regexp which is used to match the event message.*/
+        private final Pattern eventMessageRegexp;
+
+        /** Suppression text.*/
+        private final String text;
+        /** Suppression line.*/
+        private final int lineNo;
+        /** Suppression column number.*/
+        private final int columnNo;
+        /** Suppression type. */
+        private final SuppressionType suppressionType;
+
+        /**
+         * Creates new suppression instance.
+         * @param text suppression text.
+         * @param lineNo suppression line number.
+         * @param columnNo suppression column number.
+         * @param suppressionType suppression type.
+         * @param filter the {@link SuppressWithPlainTextCommentFilter} with the context.
+         */
+        protected Suppression(
+            String text,
+            int lineNo,
+            int columnNo,
+            SuppressionType suppressionType,
+            SuppressWithPlainTextCommentFilter filter
+        ) {
+            this.text = text;
+            this.lineNo = lineNo;
+            this.columnNo = columnNo;
+            this.suppressionType = suppressionType;
+
+            //Expand regexp for check and message
+            //Does not intern Patterns with Utils.getPattern()
+            String format = "";
+            try {
+                if (this.suppressionType == SuppressionType.ON) {
+                    format = CommonUtils.fillTemplateWithStringsByRegexp(
+                            filter.checkFormat, text, filter.onCommentFormat);
+                    eventSourceRegexp = Pattern.compile(format);
+                    if (filter.messageFormat == null) {
+                        eventMessageRegexp = null;
+                    }
+                    else {
+                        format = CommonUtils.fillTemplateWithStringsByRegexp(
+                                filter.messageFormat, text, filter.onCommentFormat);
+                        eventMessageRegexp = Pattern.compile(format);
+                    }
+                }
+                else {
+                    format = CommonUtils.fillTemplateWithStringsByRegexp(
+                            filter.checkFormat, text, filter.offCommentFormat);
+                    eventSourceRegexp = Pattern.compile(format);
+                    if (filter.messageFormat == null) {
+                        eventMessageRegexp = null;
+                    }
+                    else {
+                        format = CommonUtils.fillTemplateWithStringsByRegexp(
+                                filter.messageFormat, text, filter.offCommentFormat);
+                        eventMessageRegexp = Pattern.compile(format);
+                    }
+                }
+            }
+            catch (final PatternSyntaxException ex) {
+                throw new IllegalArgumentException(
+                    "unable to parse expanded comment " + format, ex);
+            }
+        }
+
+        @Override
+        public boolean equals(Object other) {
+            if (this == other) {
+                return true;
+            }
+            if (other == null || getClass() != other.getClass()) {
+                return false;
+            }
+            final Suppression suppression = (Suppression) other;
+            return Objects.equals(lineNo, suppression.lineNo)
+                    && Objects.equals(columnNo, suppression.columnNo)
+                    && Objects.equals(suppressionType, suppression.suppressionType)
+                    && Objects.equals(text, suppression.text)
+                    && Objects.equals(eventSourceRegexp, suppression.eventSourceRegexp)
+                    && Objects.equals(eventMessageRegexp, suppression.eventMessageRegexp);
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(
+                text, lineNo, columnNo, suppressionType, eventSourceRegexp, eventMessageRegexp);
+        }
+
+        /**
+         * Checks whether the suppression matches the given {@link AuditEvent}.
+         * @param event {@link AuditEvent} instance.
+         * @return true if the suppression matches {@link AuditEvent}.
+         */
+        private boolean isMatch(AuditEvent event) {
+            boolean match = false;
+            if (isInScopeOfSuppression(event)) {
+                final Matcher sourceNameMatcher = eventSourceRegexp.matcher(event.getSourceName());
+                if (sourceNameMatcher.find()) {
+                    match = eventMessageRegexp == null
+                        || eventMessageRegexp.matcher(event.getMessage()).find();
+                }
+                else {
+                    match = event.getModuleId() != null
+                        && eventSourceRegexp.matcher(event.getModuleId()).find();
+                }
+            }
+            return match;
+        }
+
+        /**
+         * Checks whether {@link AuditEvent} is in the scope of the suppression.
+         * @param event {@link AuditEvent} instance.
+         * @return true if {@link AuditEvent} is in the scope of the suppression.
+         */
+        private boolean isInScopeOfSuppression(AuditEvent event) {
+            return lineNo <= event.getLine();
+        }
+    }
+
+}
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/filters/SuppressionCommentFilter.java b/src/main/java/com/puppycrawl/tools/checkstyle/filters/SuppressionCommentFilter.java
index e871395..386964a 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/filters/SuppressionCommentFilter.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/filters/SuppressionCommentFilter.java
@@ -32,6 +32,7 @@
 import com.puppycrawl.tools.checkstyle.TreeWalkerAuditEvent;
 import com.puppycrawl.tools.checkstyle.TreeWalkerFilter;
 import com.puppycrawl.tools.checkstyle.api.AutomaticBean;
+import com.puppycrawl.tools.checkstyle.api.CheckstyleException;
 import com.puppycrawl.tools.checkstyle.api.FileContents;
 import com.puppycrawl.tools.checkstyle.api.TextBlock;
 import com.puppycrawl.tools.checkstyle.utils.CommonUtils;
@@ -179,6 +180,11 @@
     }
 
     @Override
+    protected void finishLocalSetup() throws CheckstyleException {
+        // No code by default
+    }
+
+    @Override
     public boolean accept(TreeWalkerAuditEvent event) {
         boolean accepted = true;
 
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/filters/SuppressionFilter.java b/src/main/java/com/puppycrawl/tools/checkstyle/filters/SuppressionFilter.java
index 814ea31..35e5983 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/filters/SuppressionFilter.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/filters/SuppressionFilter.java
@@ -42,7 +42,7 @@
  */
 public class SuppressionFilter extends AutomaticBean implements Filter, ExternalResourceHolder {
 
-    /** Filename of supression file. */
+    /** Filename of suppression file. */
     private String file;
     /** Tells whether config file existence is optional. */
     private boolean optional;
@@ -50,7 +50,7 @@
     private FilterSet filters = new FilterSet();
 
     /**
-     * Sets name of the supression file.
+     * Sets name of the suppression file.
      * @param fileName name of the suppressions file.
      */
     public void setFile(String fileName) {
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/filters/SuppressionXpathFilter.java b/src/main/java/com/puppycrawl/tools/checkstyle/filters/SuppressionXpathFilter.java
index f4b2540..9363ed5 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/filters/SuppressionXpathFilter.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/filters/SuppressionXpathFilter.java
@@ -41,7 +41,7 @@
 public class SuppressionXpathFilter extends AutomaticBean implements
         TreeWalkerFilter, ExternalResourceHolder {
 
-    /** Filename of supression file. */
+    /** Filename of suppression file. */
     private String file;
     /** Tells whether config file existence is optional. */
     private boolean optional;
@@ -49,7 +49,7 @@
     private Set<TreeWalkerFilter> filters = new HashSet<>();
 
     /**
-     * Sets name of the supression file.
+     * Sets name of the suppression file.
      * @param fileName name of the suppressions file.
      */
     public void setFile(String fileName) {
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/filters/SuppressionsLoader.java b/src/main/java/com/puppycrawl/tools/checkstyle/filters/SuppressionsLoader.java
index ee3c66e..ced67bc 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/filters/SuppressionsLoader.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/filters/SuppressionsLoader.java
@@ -36,7 +36,7 @@
 import org.xml.sax.SAXException;
 
 import com.puppycrawl.tools.checkstyle.TreeWalkerFilter;
-import com.puppycrawl.tools.checkstyle.api.AbstractLoader;
+import com.puppycrawl.tools.checkstyle.XmlLoader;
 import com.puppycrawl.tools.checkstyle.api.CheckstyleException;
 import com.puppycrawl.tools.checkstyle.api.FilterSet;
 import com.puppycrawl.tools.checkstyle.utils.CommonUtils;
@@ -46,25 +46,37 @@
  * @author Rick Giles
  */
 public final class SuppressionsLoader
-    extends AbstractLoader {
+    extends XmlLoader {
     /** The public ID for the configuration dtd. */
     private static final String DTD_PUBLIC_ID_1_0 =
         "-//Puppy Crawl//DTD Suppressions 1.0//EN";
     /** The resource for the configuration dtd. */
-    private static final String DTD_RESOURCE_NAME_1_0 =
+    private static final String DTD_SUPPRESSIONS_NAME_1_0 =
         "com/puppycrawl/tools/checkstyle/suppressions_1_0.dtd";
     /** The public ID for the configuration dtd. */
     private static final String DTD_PUBLIC_ID_1_1 =
         "-//Puppy Crawl//DTD Suppressions 1.1//EN";
     /** The resource for the configuration dtd. */
-    private static final String DTD_RESOURCE_NAME_1_1 =
+    private static final String DTD_SUPPRESSIONS_NAME_1_1 =
         "com/puppycrawl/tools/checkstyle/suppressions_1_1.dtd";
     /** The public ID for the configuration dtd. */
+    private static final String DTD_PUBLIC_ID_1_2 =
+        "-//Puppy Crawl//DTD Suppressions 1.2//EN";
+    /** The resource for the configuration dtd. */
+    private static final String DTD_SUPPRESSIONS_NAME_1_2 =
+        "com/puppycrawl/tools/checkstyle/suppressions_1_2.dtd";
+    /** The public ID for the configuration dtd. */
     private static final String DTD_PUBLIC_ID_1_1_XPATH =
             "-//Puppy Crawl//DTD Suppressions Xpath Experimental 1.1//EN";
     /** The resource for the configuration dtd. */
-    private static final String DTD_RESOURCE_NAME_1_1_XPATH =
+    private static final String DTD_SUPPRESSIONS_NAME_1_1_XPATH =
             "com/puppycrawl/tools/checkstyle/suppressions_1_1_xpath_experimental.dtd";
+    /** The public ID for the configuration dtd. */
+    private static final String DTD_PUBLIC_ID_1_2_XPATH =
+            "-//Puppy Crawl//DTD Suppressions Xpath Experimental 1.2//EN";
+    /** The resource for the configuration dtd. */
+    private static final String DTD_SUPPRESSIONS_NAME_1_2_XPATH =
+            "com/puppycrawl/tools/checkstyle/suppressions_1_2_xpath_experimental.dtd";
     /** File search error message. **/
     private static final String UNABLE_TO_FIND_ERROR_MESSAGE = "Unable to find: ";
     /** String literal for attribute name. **/
@@ -72,6 +84,8 @@
     /** String literal for attribute name. **/
     private static final String ATTRIBUTE_NAME_CHECKS = "checks";
     /** String literal for attribute name. **/
+    private static final String ATTRIBUTE_NAME_MESSAGE = "message";
+    /** String literal for attribute name. **/
     private static final String ATTRIBUTE_NAME_ID = "id";
     /** String literal for attribute name. **/
     private static final String ATTRIBUTE_NAME_QUERY = "query";
@@ -128,20 +142,21 @@
     private static SuppressElement getSuppressElement(Attributes attributes) throws SAXException {
         final String checks = attributes.getValue(ATTRIBUTE_NAME_CHECKS);
         final String modId = attributes.getValue(ATTRIBUTE_NAME_ID);
-        if (checks == null && modId == null) {
+        final String message = attributes.getValue(ATTRIBUTE_NAME_MESSAGE);
+        if (checks == null && modId == null && message == null) {
             // -@cs[IllegalInstantiation] SAXException is in the overridden method signature
-            throw new SAXException("missing checks and id attribute");
+            throw new SAXException("missing checks or id or message attribute");
         }
         final SuppressElement suppress;
         try {
             final String files = attributes.getValue(ATTRIBUTE_NAME_FILES);
             final String lines = attributes.getValue(ATTRIBUTE_NAME_LINES);
             final String columns = attributes.getValue(ATTRIBUTE_NAME_COLUMNS);
-            suppress = new SuppressElement(files, checks, modId, lines, columns);
+            suppress = new SuppressElement(files, checks, message, modId, lines, columns);
         }
         catch (final PatternSyntaxException ex) {
             // -@cs[IllegalInstantiation] SAXException is in the overridden method signature
-            throw new SAXException("invalid files or checks format", ex);
+            throw new SAXException("invalid files or checks or message format", ex);
         }
         return suppress;
     }
@@ -156,19 +171,21 @@
     private static XpathFilter getXpathFilter(Attributes attributes) throws SAXException {
         final String checks = attributes.getValue(ATTRIBUTE_NAME_CHECKS);
         final String modId = attributes.getValue(ATTRIBUTE_NAME_ID);
-        if (checks == null && modId == null) {
+        final String message = attributes.getValue(ATTRIBUTE_NAME_MESSAGE);
+        if (checks == null && modId == null && message == null) {
             // -@cs[IllegalInstantiation] SAXException is in the overridden method signature
-            throw new SAXException("missing checks and id attribute for suppress-xpath");
+            throw new SAXException("missing checks or id or message attribute for suppress-xpath");
         }
         final XpathFilter filter;
         try {
             final String files = attributes.getValue(ATTRIBUTE_NAME_FILES);
             final String xpathQuery = attributes.getValue(ATTRIBUTE_NAME_QUERY);
-            filter = new XpathFilter(files, checks, modId, xpathQuery);
+            filter = new XpathFilter(files, checks, message, modId, xpathQuery);
         }
         catch (final PatternSyntaxException ex) {
             // -@cs[IllegalInstantiation] SAXException is in the overridden method signature
-            throw new SAXException("invalid files or checks format for suppress-xpath", ex);
+            throw new SAXException("invalid files or checks or message format for suppress-xpath",
+                    ex);
         }
         return filter;
     }
@@ -266,9 +283,11 @@
      */
     private static Map<String, String> createIdToResourceNameMap() {
         final Map<String, String> map = new HashMap<>();
-        map.put(DTD_PUBLIC_ID_1_0, DTD_RESOURCE_NAME_1_0);
-        map.put(DTD_PUBLIC_ID_1_1, DTD_RESOURCE_NAME_1_1);
-        map.put(DTD_PUBLIC_ID_1_1_XPATH, DTD_RESOURCE_NAME_1_1_XPATH);
+        map.put(DTD_PUBLIC_ID_1_0, DTD_SUPPRESSIONS_NAME_1_0);
+        map.put(DTD_PUBLIC_ID_1_1, DTD_SUPPRESSIONS_NAME_1_1);
+        map.put(DTD_PUBLIC_ID_1_2, DTD_SUPPRESSIONS_NAME_1_2);
+        map.put(DTD_PUBLIC_ID_1_1_XPATH, DTD_SUPPRESSIONS_NAME_1_1_XPATH);
+        map.put(DTD_PUBLIC_ID_1_2_XPATH, DTD_SUPPRESSIONS_NAME_1_2_XPATH);
         return map;
     }
 }
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/filters/XpathFilter.java b/src/main/java/com/puppycrawl/tools/checkstyle/filters/XpathFilter.java
index 8079be3..6003404 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/filters/XpathFilter.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/filters/XpathFilter.java
@@ -53,6 +53,12 @@
     /** The pattern for check class names. */
     private final String checkPattern;
 
+    /** The regexp to match message names against. */
+    private final Pattern messageRegexp;
+
+    /** The pattern for message names. */
+    private final String messagePattern;
+
     /** Module id filter. */
     private final String moduleId;
 
@@ -66,13 +72,19 @@
      * Creates a {@code XpathElement} instance.
      * @param files regular expression for names of filtered files
      * @param checks regular expression for filtered check classes
+     * @param message regular expression for messages.
      * @param moduleId the module id
      * @param query the xpath query
      */
     public XpathFilter(String files, String checks,
-                       String moduleId, String query) {
+                       String message, String moduleId, String query) {
         filePattern = files;
-        fileRegexp = Pattern.compile(files);
+        if (files == null) {
+            fileRegexp = null;
+        }
+        else {
+            fileRegexp = Pattern.compile(files);
+        }
         checkPattern = checks;
         if (checks == null) {
             checkRegexp = null;
@@ -80,6 +92,13 @@
         else {
             checkRegexp = CommonUtils.createPattern(checks);
         }
+        messagePattern = message;
+        if (message == null) {
+            messageRegexp = null;
+        }
+        else {
+            messageRegexp = Pattern.compile(message);
+        }
         this.moduleId = moduleId;
         xpathQuery = query;
         if (xpathQuery == null) {
@@ -99,6 +118,7 @@
     @Override
     public boolean accept(TreeWalkerAuditEvent event) {
         return !isFileNameAndModuleAndCheckNameMatching(event)
+                || !isMessageNameMatching(event)
                 || !isXpathQueryMatching(event);
     }
 
@@ -109,26 +129,39 @@
      */
     private boolean isFileNameAndModuleAndCheckNameMatching(TreeWalkerAuditEvent event) {
         return event.getFileName() != null
-                && fileRegexp.matcher(event.getFileName()).find()
+                && (fileRegexp == null || fileRegexp.matcher(event.getFileName()).find())
                 && event.getLocalizedMessage() != null
                 && (moduleId == null || moduleId.equals(event.getModuleId()))
                 && (checkRegexp == null || checkRegexp.matcher(event.getSourceName()).find());
     }
 
     /**
+     * Is matching by message.
+     * @param event event
+     * @return true is matching or not set.
+     */
+    private boolean isMessageNameMatching(TreeWalkerAuditEvent event) {
+        return messageRegexp == null || messageRegexp.matcher(event.getMessage()).find();
+    }
+
+    /**
      * Is matching by xpath query.
      * @param event event
      * @return true is matching
      */
     private boolean isXpathQueryMatching(TreeWalkerAuditEvent event) {
-        boolean isMatching = false;
-        if (xpathExpression != null) {
+        boolean isMatching;
+        if (xpathExpression == null) {
+            isMatching = true;
+        }
+        else {
+            isMatching = false;
             final List<Item> items = getItems(event);
             for (Item item : items) {
                 final AbstractNode abstractNode = (AbstractNode) item;
                 isMatching = abstractNode.getTokenType() == event.getTokenType()
                         && abstractNode.getLineNumber() == event.getLine()
-                        && abstractNode.getColumnNumber() == event.getColumn();
+                        && abstractNode.getColumnNumber() == event.getColumnCharIndex();
                 if (isMatching) {
                     break;
                 }
@@ -165,7 +198,7 @@
 
     @Override
     public int hashCode() {
-        return Objects.hash(filePattern, checkPattern, moduleId, xpathQuery);
+        return Objects.hash(filePattern, checkPattern, messagePattern, moduleId, xpathQuery);
     }
 
     @Override
@@ -179,6 +212,7 @@
         final XpathFilter xpathFilter = (XpathFilter) other;
         return Objects.equals(filePattern, xpathFilter.filePattern)
                 && Objects.equals(checkPattern, xpathFilter.checkPattern)
+                && Objects.equals(messagePattern, xpathFilter.messagePattern)
                 && Objects.equals(moduleId, xpathFilter.moduleId)
                 && Objects.equals(xpathQuery, xpathFilter.xpathQuery);
     }
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/utils/AnnotationUtility.java b/src/main/java/com/puppycrawl/tools/checkstyle/utils/AnnotationUtility.java
index bb673e9..a36d609 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/utils/AnnotationUtility.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/utils/AnnotationUtility.java
@@ -155,7 +155,7 @@
         for (DetailAST child = holder.getFirstChild();
             child != null; child = child.getNextSibling()) {
             if (child.getType() == TokenTypes.ANNOTATION) {
-                final DetailAST firstChild = child.getFirstChild();
+                final DetailAST firstChild = child.findFirstToken(TokenTypes.AT);
                 final String name =
                     FullIdent.createFullIdent(firstChild.getNextSibling()).getText();
                 if (annotation.equals(name)) {
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/utils/BlockCommentPosition.java b/src/main/java/com/puppycrawl/tools/checkstyle/utils/BlockCommentPosition.java
index f35404e..5d49342 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/utils/BlockCommentPosition.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/utils/BlockCommentPosition.java
@@ -36,6 +36,18 @@
     }
 
     /**
+     * Node is on type definition.
+     * @param blockComment DetailAST
+     * @return true if node is before class, interface, enum or annotation.
+     */
+    public static boolean isOnType(DetailAST blockComment) {
+        return isOnClass(blockComment)
+                || isOnInterface(blockComment)
+                || isOnEnum(blockComment)
+                || isOnAnnotationDef(blockComment);
+    }
+
+    /**
      * Node is on class definition.
      * @param blockComment DetailAST
      * @return true if node is before class
@@ -80,6 +92,20 @@
     }
 
     /**
+     * Node is on type member declaration.
+     * @param blockComment DetailAST
+     * @return true if node is before method, field, constructor, enum constant
+     *     or annotation field
+     */
+    public static boolean isOnMember(DetailAST blockComment) {
+        return isOnMethod(blockComment)
+                || isOnField(blockComment)
+                || isOnConstructor(blockComment)
+                || isOnEnumConstant(blockComment)
+                || isOnAnnotationField(blockComment);
+    }
+
+    /**
      * Node is on method declaration.
      * @param blockComment DetailAST
      * @return true if node is before method
@@ -130,6 +156,17 @@
     }
 
     /**
+     * Node is on annotation field declaration.
+     * @param blockComment DetailAST
+     * @return true if node is before annotation field
+     */
+    public static boolean isOnAnnotationField(DetailAST blockComment) {
+        return isOnPlainClassMember(blockComment, TokenTypes.ANNOTATION_FIELD_DEF)
+                || isOnTokenWithModifiers(blockComment, TokenTypes.ANNOTATION_FIELD_DEF)
+                || isOnTokenWithAnnotation(blockComment, TokenTypes.ANNOTATION_FIELD_DEF);
+    }
+
+    /**
      * Checks that block comment is on specified token without any modifiers.
      * @param blockComment block comment start DetailAST
      * @param parentTokenType parent token type
@@ -179,11 +216,16 @@
      * @return true if block comment is on specified token without modifiers
      */
     private static boolean isOnPlainClassMember(DetailAST blockComment, int memberType) {
-        return blockComment.getParent() != null
-                && blockComment.getParent().getType() == TokenTypes.TYPE
-                && blockComment.getParent().getParent().getType() == memberType
+        DetailAST parent = blockComment.getParent();
+        // type could be in fully qualified form, so we go up to Type token
+        while (parent != null && parent.getType() == TokenTypes.DOT) {
+            parent = parent.getParent();
+        }
+        return parent != null
+                && parent.getType() == TokenTypes.TYPE
+                && parent.getParent().getType() == memberType
                 // previous parent sibling is always TokenTypes.MODIFIERS
-                && blockComment.getParent().getPreviousSibling().getChildCount() == 0;
+                && parent.getPreviousSibling().getChildCount() == 0;
     }
 
     /**
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/utils/CommonUtils.java b/src/main/java/com/puppycrawl/tools/checkstyle/utils/CommonUtils.java
index 14b3e03..122c6f2 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/utils/CommonUtils.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/utils/CommonUtils.java
@@ -129,7 +129,7 @@
         commentContent.setText("*" + content);
         commentContent.setLineNo(0);
         // javadoc should starts at 0 column, so COMMENT_CONTENT node
-        // that contains javadoc identificator has -1 column
+        // that contains javadoc identifier has -1 column
         commentContent.setColumnNo(-1);
 
         final DetailAST blockCommentEnd = new DetailAST();
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/utils/JavadocUtils.java b/src/main/java/com/puppycrawl/tools/checkstyle/utils/JavadocUtils.java
index b744167..9477603 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/utils/JavadocUtils.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/utils/JavadocUtils.java
@@ -30,6 +30,7 @@
 import com.puppycrawl.tools.checkstyle.api.DetailNode;
 import com.puppycrawl.tools.checkstyle.api.JavadocTokenTypes;
 import com.puppycrawl.tools.checkstyle.api.TextBlock;
+import com.puppycrawl.tools.checkstyle.api.TokenTypes;
 import com.puppycrawl.tools.checkstyle.checks.javadoc.InvalidJavadocTag;
 import com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocTag;
 import com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocTagInfo;
@@ -176,8 +177,8 @@
         boolean result = false;
 
         if (!commentContent.isEmpty()) {
-            final char docCommentIdentificator = commentContent.charAt(0);
-            result = docCommentIdentificator == '*';
+            final char docCommentIdentifier = commentContent.charAt(0);
+            result = docCommentIdentifier == '*';
         }
 
         return result;
@@ -400,24 +401,40 @@
 
     /**
      * Checks Javadoc comment it's in right place.
-     * From Javadoc util documentation:
+     * <p>From Javadoc util documentation:
      * "Placement of comments - Documentation comments are recognized only when placed
-     * immediately before class, interface, constructor, method, or field
+     * immediately before class, interface, constructor, method, field or annotation field
      * declarations -- see the class example, method example, and field example.
-     * Documentation comments placed in the body of a method are ignored. Only one
-     * documentation comment per declaration statement is recognized by the Javadoc tool."
+     * Documentation comments placed in the body of a method are ignored."</p>
+     * <p>If there are many documentation comments per declaration statement,
+     * only the last one will be recognized.</p>
      *
      * @param blockComment Block comment AST
      * @return true if Javadoc is in right place
+     * @see <a href="https://docs.oracle.com/javase/8/docs/technotes/tools/unix/javadoc.html">
+     *     Javadoc util documentation</a>
      */
     private static boolean isCorrectJavadocPosition(DetailAST blockComment) {
-        return BlockCommentPosition.isOnClass(blockComment)
-                || BlockCommentPosition.isOnInterface(blockComment)
-                || BlockCommentPosition.isOnEnum(blockComment)
-                || BlockCommentPosition.isOnMethod(blockComment)
-                || BlockCommentPosition.isOnField(blockComment)
-                || BlockCommentPosition.isOnConstructor(blockComment)
-                || BlockCommentPosition.isOnEnumConstant(blockComment)
-                || BlockCommentPosition.isOnAnnotationDef(blockComment);
+        // We must be sure that after this one there are no other documentation comments.
+        DetailAST sibling = blockComment.getNextSibling();
+        while (sibling != null) {
+            if (sibling.getType() == TokenTypes.BLOCK_COMMENT_BEGIN) {
+                if (isJavadocComment(getBlockCommentContent(sibling))) {
+                    // Found another javadoc comment, so this one should be ignored.
+                    break;
+                }
+                sibling = sibling.getNextSibling();
+            }
+            else if (sibling.getType() == TokenTypes.SINGLE_LINE_COMMENT) {
+                sibling = sibling.getNextSibling();
+            }
+            else {
+                // Annotation, declaration or modifier is here. Do not check further.
+                sibling = null;
+            }
+        }
+        return sibling == null
+            && (BlockCommentPosition.isOnType(blockComment)
+                || BlockCommentPosition.isOnMember(blockComment));
     }
 }
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/utils/ModuleReflectionUtils.java b/src/main/java/com/puppycrawl/tools/checkstyle/utils/ModuleReflectionUtils.java
index c05c21c..d52f704 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/utils/ModuleReflectionUtils.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/utils/ModuleReflectionUtils.java
@@ -73,7 +73,7 @@
      */
     public static boolean isCheckstyleModule(Class<?> clazz) {
         return isValidCheckstyleClass(clazz)
-            && (isCheckstyleCheck(clazz)
+            && (isCheckstyleTreeWalkerCheck(clazz)
                     || isFileSetModule(clazz)
                     || isFilterModule(clazz)
                     || isFileFilterModule(clazz)
@@ -111,12 +111,13 @@
     }
 
     /**
-     * Checks whether a class may be considered as the checkstyle check.
+     * Checks whether a class may be considered as the checkstyle check
+     * which has TreeWalker as a parent.
      * Checkstyle's checks are classes which implement 'AbstractCheck' interface.
      * @param clazz class to check.
      * @return true if a class may be considered as the checkstyle check.
      */
-    public static boolean isCheckstyleCheck(Class<?> clazz) {
+    public static boolean isCheckstyleTreeWalkerCheck(Class<?> clazz) {
         return AbstractCheck.class.isAssignableFrom(clazz);
     }
 
diff --git a/src/main/resources/com/puppycrawl/tools/checkstyle/checks/coding/messages.properties b/src/main/resources/com/puppycrawl/tools/checkstyle/checks/coding/messages.properties
index 64b56e1..7a21688 100644
--- a/src/main/resources/com/puppycrawl/tools/checkstyle/checks/coding/messages.properties
+++ b/src/main/resources/com/puppycrawl/tools/checkstyle/checks/coding/messages.properties
@@ -44,7 +44,8 @@
 parameter.assignment=Assignment of parameter ''{0}'' is not allowed.
 require.this.method=Method call to ''{0}'' needs \"{1}this.\".
 require.this.variable=Reference to instance variable ''{0}'' needs \"{1}this.\".
-return.count=Return count is {0,number,integer} (max allowed is {1,number,integer}).
+return.count=Return count is {0,number,integer} (max allowed for non-void methods/lambdas is {1,number,integer}).
+return.countVoid=Return count is {0,number,integer} (max allowed for void methods/constructors/lambdas is {1,number,integer}).
 simplify.boolReturn=Conditional logic can be removed.
 simplify.expression=Expression can be simplified.
 string.literal.equality=Literal Strings should be compared using equals(), not ''{0}''.
diff --git a/src/main/resources/com/puppycrawl/tools/checkstyle/checks/coding/messages_de.properties b/src/main/resources/com/puppycrawl/tools/checkstyle/checks/coding/messages_de.properties
index bb1308e..6e46475 100644
--- a/src/main/resources/com/puppycrawl/tools/checkstyle/checks/coding/messages_de.properties
+++ b/src/main/resources/com/puppycrawl/tools/checkstyle/checks/coding/messages_de.properties
@@ -44,7 +44,8 @@
 parameter.assignment=Die Zuweisung des Parameters ''{0}'' ist nicht erlaubt.
 require.this.method=Der Methodenaufruf ''{0}'' erfordert ein vorangestelltes \"{1}this.\".
 require.this.variable=Der Instanzvariablenzugriff ''{0}'' erfordert ein vorangestelltes \"{1}this.\".
-return.count=Die Methode hat insgesamt {0,number,integer} return-Anweisungen (Obergrenze ist {1,number,integer}).
+return.count=Die Methode hat insgesamt {0,number,integer} return-Anweisungen (max erlaubt für nicht void Methoden / Lambdas ist ist {1,number,integer}).
+return.countVoid=Die Methode hat insgesamt {0,number,integer} return-Anweisungen (max erlaubt für void Methoden / Konstruktoren / Lambdas ist {1,number,integer}).
 simplify.boolReturn=Die Verzweigungslogik kann entfernt werden.
 simplify.expression=Der Ausdruck kann vereinfacht werden.
 string.literal.equality=Der Vergleich von String-Literalen sollte mit equals() erfolgen, nicht mit ''{0}''.
diff --git a/src/main/resources/com/puppycrawl/tools/checkstyle/checks/coding/messages_es.properties b/src/main/resources/com/puppycrawl/tools/checkstyle/checks/coding/messages_es.properties
index 1a97e00..3f7b7f6 100644
--- a/src/main/resources/com/puppycrawl/tools/checkstyle/checks/coding/messages_es.properties
+++ b/src/main/resources/com/puppycrawl/tools/checkstyle/checks/coding/messages_es.properties
@@ -44,7 +44,8 @@
 parameter.assignment=No esta permitida la asignación del parámetro ''{0}''.
 require.this.method=La llamada al método ''{0}'' necesita \"{1}this.\".
 require.this.variable=La referencia a la variable de instancia ''{0}'' necesita \"{1}this.\".
-return.count=El número de sentencias return es {0,number,integer} (máximo permitido es {1,number,integer}).
+return.count=El número de sentencias return es {0,number,integer} (max permitido para métodos no vacíos / lambdas es {1,number,integer}).
+return.countVoid=El número de sentencias return es {0,number,integer} (max permitido para métodos / constructores / lambdas vacíos {1,number,integer}).
 simplify.boolReturn=Se puede eliminar la lógica condicional.
 simplify.expression=Se puede simplificar la expresión.
 string.literal.equality=Las cadenas literales deben compararse usando equals(), no ''{0}''.
diff --git a/src/main/resources/com/puppycrawl/tools/checkstyle/checks/coding/messages_fi.properties b/src/main/resources/com/puppycrawl/tools/checkstyle/checks/coding/messages_fi.properties
index b28e231..1246514 100644
--- a/src/main/resources/com/puppycrawl/tools/checkstyle/checks/coding/messages_fi.properties
+++ b/src/main/resources/com/puppycrawl/tools/checkstyle/checks/coding/messages_fi.properties
@@ -44,7 +44,8 @@
 parameter.assignment=Tehtävä parametrin ''{0}'' ei ole sallittu.
 require.this.method=Menetelmä kehotus ''{0}'' tarvitsee \"{1}this.\".
 require.this.variable=Viittaus Esimerkiksi muuttuja ''{0}'' tarvitsee \"{1}this.\".
-return.count=Paluu määrä on {0, number, integer} (max sallittu on {1, number, integer}).
+return.count=Paluu määrä on {0, number, integer} (max sallittu ei-tyhjiin menetelmiin / lambdas {1, number, integer}).
+return.countVoid=Paluu määrä on {0, number, integer} (max sallittu menetelmät / konstruktorit / lambdas ovat {1, number, integer}).
 simplify.boolReturn=Konditionaalilogiikan voisi poistaa.
 simplify.expression=Ilmaisua voisi yksinkertaistaa.
 string.literal.equality=Kirjaimellinen Strings pitäisi verrata käyttämällä tasavertaisten (), ei ''{0}''.
diff --git a/src/main/resources/com/puppycrawl/tools/checkstyle/checks/coding/messages_fr.properties b/src/main/resources/com/puppycrawl/tools/checkstyle/checks/coding/messages_fr.properties
index 7ae8de9..a1d712f 100644
--- a/src/main/resources/com/puppycrawl/tools/checkstyle/checks/coding/messages_fr.properties
+++ b/src/main/resources/com/puppycrawl/tools/checkstyle/checks/coding/messages_fr.properties
@@ -44,7 +44,8 @@
 parameter.assignment=Il est interdit d''affecter une valeur au paramètre ''{0}''.
 require.this.method=L''appel à la méthode ''{0}'' nécessite l''utilisation de  \"{1}this.\".
 require.this.variable=La référence à la variable d''instance ''{0}'' doit utiliser \"{1}this.\".
-return.count=Le nombre de return est de {0,number,integer} alors que le maximum autorisé est de {1,number,integer}.
+return.count=Le nombre de return est de {0,number,integer} alors que le maximum méthodes non-nulles/lambdas {1,number,integer}.
+return.countVoid=Le nombre de return est de {0,number,integer} alors que le maximum autorisé void methods/constructors/lambdas est de {1,number,integer}.
 simplify.boolReturn=Le test peut être supprimé et l''expression directement retournée.
 simplify.expression=L''expression peut être simplifiée.
 string.literal.equality=Les chaines de caractères littérales devraient être comparées avec la méthode equals() et pas avec ''{0}''.
diff --git a/src/main/resources/com/puppycrawl/tools/checkstyle/checks/coding/messages_ja.properties b/src/main/resources/com/puppycrawl/tools/checkstyle/checks/coding/messages_ja.properties
index 98adfa1..ae74664 100644
--- a/src/main/resources/com/puppycrawl/tools/checkstyle/checks/coding/messages_ja.properties
+++ b/src/main/resources/com/puppycrawl/tools/checkstyle/checks/coding/messages_ja.properties
@@ -44,7 +44,8 @@
 parameter.assignment=パラメータ ''{0}'' への代入は許可されていません。
 require.this.method=メソッド ''{0}'' への呼び出しは、 \"{1}this.\" が必要です。
 require.this.variable=インスタンス変数 ''{0}'' への参照には \"{1}this.\" が必要です。
-return.count=return が {0,number,integer} 個所あります(最大 {1,number,integer} まで)。
+return.count=return が {0,number,integer} 個所あります(非無効メソッド/ ラムダに許される最大値は {1,number,integer} まで)。
+return.countVoid=return が {0,number,integer} 個所あります(無効メソッド/コンストラクタ/ ラムダメソッドに許可される最大値は {1,number,integer} まで)。
 simplify.boolReturn=条件ロジックはなくせます。
 simplify.expression=表現は簡潔にできます。
 string.literal.equality=リテラルの文字列は ''{0}'' ではなく、 equals() を使用して比較するべきです。
diff --git a/src/main/resources/com/puppycrawl/tools/checkstyle/checks/coding/messages_pt.properties b/src/main/resources/com/puppycrawl/tools/checkstyle/checks/coding/messages_pt.properties
index 73fb2cc..da79ad8 100644
--- a/src/main/resources/com/puppycrawl/tools/checkstyle/checks/coding/messages_pt.properties
+++ b/src/main/resources/com/puppycrawl/tools/checkstyle/checks/coding/messages_pt.properties
@@ -44,7 +44,8 @@
 parameter.assignment=A atribuição ao parâmetro ''{0}'' não é permitda.
 require.this.method=A chamada de método no ''{0}'' precisa de \"{1}this.\".
 require.this.variable=A referência à variável de instância ''{0}'' precisa de \"{1}this.\".
-return.count=O número de \"return\"s é {0,number,integer} (o máximo permitido é {1,number,integer}).
+return.count=O número de \"return\"s é {0,number,integer} (o máximo permitido para métodos não vazios/lambdas é {1,number,integer}).
+return.countVoid=O número de \"return\"s é {0,number,integer} (o máximo permitido para vazios métodos/construtores/lambdas é {1,number,integer}).
 simplify.boolReturn=A lógica condicional pode ser removida.
 simplify.expression=A expressão pode ser simplicada.
 string.literal.equality=Literais de String deveriam ser comparados com \"equals()\", não com ''{0}''.
diff --git a/src/main/resources/com/puppycrawl/tools/checkstyle/checks/coding/messages_tr.properties b/src/main/resources/com/puppycrawl/tools/checkstyle/checks/coding/messages_tr.properties
index da4f297..4e27831 100644
--- a/src/main/resources/com/puppycrawl/tools/checkstyle/checks/coding/messages_tr.properties
+++ b/src/main/resources/com/puppycrawl/tools/checkstyle/checks/coding/messages_tr.properties
@@ -45,7 +45,8 @@
 parameter.assignment=''{0}'' parametresine atama yapılamaz.
 require.this.method=''{0}'' metoduna erişim \"{1}this.\" kullanılarak yapılmalıdır.
 require.this.variable=''{0}'' değişkenine erişim \"{1}this.\" kullanılarak yapılmalıdır.
-return.count=Kullanılan ''return'' sayısı {0,number,integer} (maksimum izin verilen değer {1,number,integer}).
+return.count=Kullanılan ''return'' sayısı {0,number,integer} (void olmayan yöntemler / lambdas için izin verilen maksimum sayı  {1,number,integer}).
+return.countVoid=Kullanılan ''return'' sayısı {0,number,integer} (void yöntemleri / kurucu / lambdas için izin verilen maksimum sayı {1,number,integer}).
 simplify.boolReturn=Koşul mantığı kaldırılabilir.
 simplify.expression=İfade sadeleştirilebilir.
 string.literal.equality=''String'' ifadeleri ''{0}'' kullanarak değil, equals() metodu kullanarak karşılaştırılmalı.
diff --git a/src/main/resources/com/puppycrawl/tools/checkstyle/checks/coding/messages_zh.properties b/src/main/resources/com/puppycrawl/tools/checkstyle/checks/coding/messages_zh.properties
index 5bc59c5..51bf29a 100644
--- a/src/main/resources/com/puppycrawl/tools/checkstyle/checks/coding/messages_zh.properties
+++ b/src/main/resources/com/puppycrawl/tools/checkstyle/checks/coding/messages_zh.properties
@@ -44,7 +44,8 @@
 parameter.assignment=不应对方法参数''{0}''赋值。
 require.this.method=对方法 ''{0}'' 的调用需要 \"{1}this.\"。
 require.this.variable=对实例属性 ''{0}'' 的引用需要 \"{1}this.\"。
-return.count=Return 次数 {0,number,integer} 次(最多: {1,number,integer} 次)。
+return.count=Return 次数 {0,number,integer} 次(最大允许非空虚方法/ 拉姆达: {1,number,integer} 次)。
+return.countVoid=Return 次数 {0,number,integer} 次(最大允許為void方法/構造函數/ 拉姆达: {1,number,integer} 次)。
 simplify.boolReturn=不必要的条件逻辑。
 simplify.expression=表达式可被简化。
 string.literal.equality=字符串应使用equals()方法进行比较,而非''{0}''。
diff --git a/src/main/resources/com/puppycrawl/tools/checkstyle/checks/imports/messages_zh.properties b/src/main/resources/com/puppycrawl/tools/checkstyle/checks/imports/messages_zh.properties
index 5298c0e..0132462 100644
--- a/src/main/resources/com/puppycrawl/tools/checkstyle/checks/imports/messages_zh.properties
+++ b/src/main/resources/com/puppycrawl/tools/checkstyle/checks/imports/messages_zh.properties
@@ -9,10 +9,10 @@
 import.control.missing.file=找不到导入控制文件。
 import.control.unknown.pkg=导入控制文件并未处理此包。
 import.duplicate=第{0,number,integer}行重复导入:{1} 。
-import.groups.separated.internally=進口組以前的額外分離 ''{0}''。
-import.illegal=非法进口: {0} 。
+import.groups.separated.internally=导入组之前的额外空行 ''{0}''。
+import.illegal=非法导入: {0} 。
 import.lang=不需要从 java.lang 包导入: {0} 。
 import.ordering=导入 ''{0}'' 顺序错误。
-import.same=额外 import 当前包下内容:{0} 。
+import.same=额外导入当前包下内容:{0} 。
 import.separation=''{0}'' 应与之前的导入语句通过空行隔开。
 import.unused=无用导入 - {0} 。
diff --git a/src/main/resources/com/puppycrawl/tools/checkstyle/suppressions_1_2.dtd b/src/main/resources/com/puppycrawl/tools/checkstyle/suppressions_1_2.dtd
new file mode 100644
index 0000000..5649868
--- /dev/null
+++ b/src/main/resources/com/puppycrawl/tools/checkstyle/suppressions_1_2.dtd
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- Add the following to any file that is to be validated against this DTD:
+
+<!DOCTYPE suppressions PUBLIC
+    "-//Puppy Crawl//DTD Suppressions 1.2//EN"
+    "http://checkstyle.sourceforge.net/dtds/suppressions_1_2.dtd">
+-->
+
+<!ELEMENT suppressions (suppress*)>
+
+<!ELEMENT suppress EMPTY>
+<!ATTLIST suppress files CDATA #IMPLIED
+                   checks CDATA #IMPLIED
+                   message CDATA #IMPLIED
+                   id CDATA #IMPLIED
+                   lines CDATA #IMPLIED
+                   columns CDATA #IMPLIED>
diff --git a/src/main/resources/com/puppycrawl/tools/checkstyle/suppressions_1_2_xpath_experimental.dtd b/src/main/resources/com/puppycrawl/tools/checkstyle/suppressions_1_2_xpath_experimental.dtd
new file mode 100644
index 0000000..f424d8e
--- /dev/null
+++ b/src/main/resources/com/puppycrawl/tools/checkstyle/suppressions_1_2_xpath_experimental.dtd
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- Add the following to any file that is to be validated against this DTD:
+
+<!DOCTYPE suppressions PUBLIC
+    "-//Puppy Crawl//DTD Suppressions Xpath Experimental 1.2//EN"
+    "http://checkstyle.sourceforge.net/dtds/suppressions_1_2_xpath_experimental.dtd">
+-->
+
+<!ELEMENT suppressions (suppress|suppress-xpath)*>
+
+<!ELEMENT suppress EMPTY>
+<!ATTLIST suppress files CDATA #IMPLIED
+                   checks CDATA #IMPLIED
+                   message CDATA #IMPLIED
+                   id CDATA #IMPLIED
+                   lines CDATA #IMPLIED
+                   columns CDATA #IMPLIED>
+
+<!ELEMENT suppress-xpath EMPTY>
+<!ATTLIST suppress-xpath files CDATA #IMPLIED
+                   checks CDATA #IMPLIED
+                   message CDATA #IMPLIED
+                   id CDATA #IMPLIED
+                   query CDATA #IMPLIED>
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/AbstractModuleTestSupport.java b/src/test/java/com/puppycrawl/tools/checkstyle/AbstractModuleTestSupport.java
index b3e708a..5b008cf 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/AbstractModuleTestSupport.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/AbstractModuleTestSupport.java
@@ -81,7 +81,7 @@
      * Returns test logger.
      * @return logger for tests
      */
-    public BriefUtLogger getBriefUtLogger() {
+    public final BriefUtLogger getBriefUtLogger() {
         return new BriefUtLogger(stream);
     }
 
@@ -95,7 +95,7 @@
      * @return {@link Checker} instance based on the given {@link Configuration} instance.
      * @throws Exception if an exception occurs during checker configuration.
      */
-    public Checker createChecker(Configuration moduleConfig)
+    public final Checker createChecker(Configuration moduleConfig)
             throws Exception {
         ModuleCreationOption moduleCreationOption = ModuleCreationOption.IN_CHECKER;
 
@@ -103,7 +103,7 @@
         if (!ROOT_MODULE_NAME.equals(moduleName)) {
             try {
                 final Class<?> moduleClass = Class.forName(moduleName);
-                if (ModuleReflectionUtils.isCheckstyleCheck(moduleClass)
+                if (ModuleReflectionUtils.isCheckstyleTreeWalkerCheck(moduleClass)
                         || ModuleReflectionUtils.isTreeWalkerFilterModule(moduleClass)) {
                     moduleCreationOption = ModuleCreationOption.IN_TREEWALKER;
                 }
@@ -124,7 +124,7 @@
      * @return {@link Checker} instance based on the given {@link Configuration} instance.
      * @throws Exception if an exception occurs during checker configuration.
      */
-    public Checker createChecker(Configuration moduleConfig,
+    public final Checker createChecker(Configuration moduleConfig,
                                  ModuleCreationOption moduleCreationOption)
             throws Exception {
         final Checker checker = new Checker();
@@ -150,9 +150,9 @@
      * based on the given {@link Configuration} instance.
      * @param config {@link Configuration} instance.
      * @return {@link DefaultConfiguration} for the {@link TreeWalker}
-     * based on the given {@link Configuration} instance.
+     *     based on the given {@link Configuration} instance.
      */
-    protected DefaultConfiguration createTreeWalkerConfig(Configuration config) {
+    protected static DefaultConfiguration createTreeWalkerConfig(Configuration config) {
         final DefaultConfiguration dc =
                 new DefaultConfiguration("configuration");
         final DefaultConfiguration twConf = createModuleConfig(TreeWalker.class);
@@ -168,7 +168,7 @@
      * @param config {@link Configuration} instance.
      * @return {@link DefaultConfiguration} for the given {@link Configuration} instance.
      */
-    protected DefaultConfiguration createRootConfig(Configuration config) {
+    protected static DefaultConfiguration createRootConfig(Configuration config) {
         final DefaultConfiguration dc = new DefaultConfiguration(ROOT_MODULE_NAME);
         if (config != null) {
             dc.addChild(config);
@@ -198,7 +198,7 @@
      * @param filename file name.
      * @return URI-representation of the path for the file with the given file name.
      */
-    protected String getUriString(String filename) {
+    protected final String getUriString(String filename) {
         return new File("src/test/resources/" + getPackageLocation() + "/" + filename).toURI()
                 .toString();
     }
@@ -213,7 +213,7 @@
      * @param expected an array of expected messages.
      * @throws Exception if exception occurs during verification process.
      */
-    protected void verify(Configuration aConfig, String fileName, String... expected)
+    protected final void verify(Configuration aConfig, String fileName, String... expected)
             throws Exception {
         verify(createChecker(aConfig), fileName, fileName, expected);
     }
@@ -246,7 +246,7 @@
      * @param expected an array of expected messages.
      * @throws Exception if exception occurs during verification process.
      */
-    protected void verify(Checker checker,
+    protected final void verify(Checker checker,
                           String processedFilename,
                           String messageFileName,
                           String... expected)
@@ -257,8 +257,13 @@
     }
 
     /**
-     *  We keep two verify methods with separate logic only for convenience of debugging
-     *  We have minimum amount of multi-file test cases
+     *  We keep two verify methods with separate logic only for convenience of debugging.
+     *  We have minimum amount of multi-file test cases.
+     *  @param checker {@link Checker} instance.
+     *  @param processedFiles list of files to verify.
+     *  @param messageFileName message file name.
+     *  @param expected an array of expected messages.
+     *  @throws Exception if exception occurs during verification process.
      */
     protected void verify(Checker checker,
                           File[] processedFiles,
@@ -299,7 +304,7 @@
      * @param expectedViolations a map of expected violations per files.
      * @throws Exception if exception occurs during verification process.
      */
-    protected void verify(Checker checker,
+    protected final void verify(Checker checker,
                           File[] processedFiles,
                           Map<String, List<String>> expectedViolations)
             throws Exception {
@@ -383,8 +388,9 @@
      *
      * @param messageKey the key of message in 'messages.properties' file.
      * @param arguments  the arguments of message in 'messages.properties' file.
+     * @return The message of the check with the arguments applied.
      */
-    protected String getCheckMessage(String messageKey, Object... arguments) {
+    protected final String getCheckMessage(String messageKey, Object... arguments) {
         return internalGetCheckMessage(getMessageBundle(), messageKey, arguments);
     }
 
@@ -395,6 +401,7 @@
      * @param clazz the related check class.
      * @param messageKey the key of message in 'messages.properties' file.
      * @param arguments the arguments of message in 'messages.properties' file.
+     * @return The message of the check with the arguments applied.
      */
     protected static String getCheckMessage(
             Class<?> clazz, String messageKey, Object... arguments) {
@@ -408,6 +415,7 @@
      * @param messageBundle the bundle name.
      * @param messageKey the key of message in 'messages.properties' file.
      * @param arguments the arguments of message in 'messages.properties' file.
+     * @return The message of the check with the arguments applied.
      */
     private static String internalGetCheckMessage(
             String messageBundle, String messageKey, Object... arguments) {
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/AbstractPathTestSupport.java b/src/test/java/com/puppycrawl/tools/checkstyle/AbstractPathTestSupport.java
index 9b79d8f..849cf89 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/AbstractPathTestSupport.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/AbstractPathTestSupport.java
@@ -21,8 +21,15 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Paths;
 
 public abstract class AbstractPathTestSupport {
+    protected static final String LF_REGEX = "\\\\n";
+
+    protected static final String CRLF_REGEX = "\\\\r\\\\n";
+
     /**
      * Returns the exact location for the package where the file is present.
      * @return path for the package name for the file.
@@ -46,4 +53,15 @@
     protected final String getResourcePath(String filename) {
         return "/" + getPackageLocation() + "/" + filename;
     }
+
+    /** Reads the contents of a file.
+     * @param filename the name of the file whose contents are to be read
+     * @return contents of the file with all {@code \r\n} replaced by {@code \n}
+     * @throws IOException if I/O exception occurs while reading
+     */
+    protected static String readFile(String filename) throws IOException {
+        return new String(Files.readAllBytes(
+                Paths.get(filename)), StandardCharsets.UTF_8)
+                .replaceAll(CRLF_REGEX, LF_REGEX);
+    }
 }
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/AbstractTreeTestSupport.java b/src/test/java/com/puppycrawl/tools/checkstyle/AbstractTreeTestSupport.java
index dd67666..01113fa 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/AbstractTreeTestSupport.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/AbstractTreeTestSupport.java
@@ -23,16 +23,9 @@
 
 import java.io.File;
 import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Paths;
 
 public abstract class AbstractTreeTestSupport extends AbstractPathTestSupport {
 
-    protected static final String LF_REGEX = "\\\\n";
-
-    protected static final String CRLF_REGEX = "\\\\r\\\\n";
-
     /**
      * Returns canonical path for the file with the given file name.
      * The path is formed base on the non-compilable resources location.
@@ -118,15 +111,4 @@
         assertEquals("Generated tree from the javadoc file should match the pre-defined tree",
                 expectedContents, actualContents);
     }
-
-    /** Reads the contents of a file.
-     * @param filename the name of the file whose contents are to be read
-     * @return contents of the file with all {@code \r\n} replaced by {@code \n}
-     * @throws IOException if I/O exception occurs while reading
-     */
-    protected static String readFile(String filename) throws IOException {
-        return new String(Files.readAllBytes(
-                Paths.get(filename)), StandardCharsets.UTF_8)
-                .replaceAll(CRLF_REGEX, LF_REGEX);
-    }
 }
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/AbstractXmlTestSupport.java b/src/test/java/com/puppycrawl/tools/checkstyle/AbstractXmlTestSupport.java
new file mode 100644
index 0000000..9387ec2
--- /dev/null
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/AbstractXmlTestSupport.java
@@ -0,0 +1,171 @@
+////////////////////////////////////////////////////////////////////////////////
+// checkstyle: Checks Java source code for adherence to a set of rules.
+// Copyright (C) 2001-2017 the original author or authors.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+////////////////////////////////////////////////////////////////////////////////
+
+package com.puppycrawl.tools.checkstyle;
+
+import java.io.ByteArrayOutputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.Set;
+import java.util.function.BiPredicate;
+
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.junit.Assert;
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+import com.puppycrawl.tools.checkstyle.internal.utils.XmlUtil;
+
+public abstract class AbstractXmlTestSupport extends AbstractModuleTestSupport {
+
+    protected static Document getOutputStreamXml(ByteArrayOutputStream outputStream)
+            throws ParserConfigurationException {
+        final String xml = new String(outputStream.toByteArray(), StandardCharsets.UTF_8);
+
+        return XmlUtil.getRawXml("audit output", xml, xml);
+    }
+
+    protected static void verifyXml(String expectedOutputFile,
+            ByteArrayOutputStream actualOutputStream, String... messages) throws Exception {
+        verifyXml(expectedOutputFile, actualOutputStream, null, messages);
+    }
+
+    protected static void verifyXml(String expectedOutputFile,
+            ByteArrayOutputStream actualOutputStream,
+            BiPredicate<Node, Node> ordered, String... messages) throws Exception {
+        String expectedContents = readFile(expectedOutputFile);
+
+        for (int i = 0; i < messages.length; i++) {
+            expectedContents = expectedContents.replace("$" + i, messages[i]);
+        }
+
+        final Document expectedDocument = XmlUtil.getRawXml("audit output", expectedContents,
+                expectedContents);
+        final Document actualDocument = getOutputStreamXml(actualOutputStream);
+
+        verifyXmlNode(expectedDocument, actualDocument, "/", ordered);
+    }
+
+    private static void verifyXmlNodes(Node expected, Node actual, String path,
+            BiPredicate<Node, Node> ordered) {
+        final Node expectedFirstChild = expected.getFirstChild();
+        final Node actualFirstChild = actual.getFirstChild();
+
+        if (expectedFirstChild == null) {
+            Assert.assertNull("no children nodes should exist: " + path, actualFirstChild);
+            Assert.assertEquals("text should be the same: " + path, expected.getNodeValue(),
+                    actual.getNodeValue());
+        }
+        else {
+            Assert.assertNotNull("children nodes should exist: " + path, actualFirstChild);
+
+            if (ordered == null) {
+                Node actualChild = actualFirstChild;
+
+                for (Node expectedChild = expectedFirstChild; expectedChild != null;
+                        expectedChild = expectedChild.getNextSibling()) {
+                    verifyXmlNode(expectedChild, actualChild, path, ordered);
+
+                    actualChild = actualChild.getNextSibling();
+                }
+
+                Assert.assertNull("node have same number of children: " + path, actualChild);
+            }
+            else {
+                final Set<Node> expectedChildren = XmlUtil.getChildrenElements(expected);
+                final Set<Node> actualChildren = XmlUtil.getChildrenElements(actual);
+
+                Assert.assertEquals("node have same number of children: " + path,
+                        expectedChildren.size(), actualChildren.size());
+
+                for (Node expectedChild : expectedChildren) {
+                    Node foundChild = null;
+
+                    for (Node actualChild : actualChildren) {
+                        if (ordered.test(expectedChild, actualChild)) {
+                            foundChild = actualChild;
+                            break;
+                        }
+                    }
+
+                    Assert.assertNotNull("node should exist: " + path + expectedChild.getNodeName()
+                            + "/", foundChild);
+
+                    verifyXmlNode(expectedChild, foundChild, path, ordered);
+                }
+            }
+        }
+    }
+
+    private static void verifyXmlNode(Node expected, Node actual, String path,
+            BiPredicate<Node, Node> ordered) {
+        if (expected == null) {
+            if (actual != null) {
+                Assert.fail("no node should exist: " + path + actual.getNodeName() + "/");
+            }
+        }
+        else {
+            final String newPath = path + expected.getNodeName() + "/";
+
+            Assert.assertNotNull("node should exist: " + newPath, actual);
+            Assert.assertEquals("node should have same name: " + newPath, expected.getNodeName(),
+                    actual.getNodeName());
+            Assert.assertEquals("node should have same type: " + newPath, expected.getNodeType(),
+                    actual.getNodeType());
+
+            verifyXmlAttributes(expected.getAttributes(), actual.getAttributes(), newPath);
+
+            verifyXmlNodes(expected, actual, newPath, ordered);
+        }
+    }
+
+    private static void verifyXmlAttributes(NamedNodeMap expected, NamedNodeMap actual,
+            String path) {
+        if (expected == null) {
+            Assert.assertNull("no attributes should exist: " + path, actual);
+        }
+        else {
+            Assert.assertNotNull("attributes should exist: " + path, actual);
+
+            for (int i = 0; i < expected.getLength(); i++) {
+                verifyXmlAttribute(expected.item(i), actual.item(i), path);
+            }
+
+            Assert.assertEquals("node have same number of attributes: " + path,
+                    expected.getLength(), actual.getLength());
+        }
+    }
+
+    private static void verifyXmlAttribute(Node expected, Node actual, String path) {
+        final String expectedName = expected.getNodeName();
+
+        Assert.assertNotNull("attribute value for '" + expectedName + "' should not be null: "
+                + path, actual);
+
+        Assert.assertEquals("attribute name should match: " + path, expectedName,
+                actual.getNodeName());
+
+        // ignore checkstyle version in xml as it changes each release
+        if (!"/#document/checkstyle".equals(path) && !"version".equals(expectedName)) {
+            Assert.assertEquals("attribute value for '" + expectedName + "' should match: " + path,
+                    expected.getNodeValue(), actual.getNodeValue());
+        }
+    }
+}
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/CheckerTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/CheckerTest.java
index 876492e..a59c27e 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/CheckerTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/CheckerTest.java
@@ -415,7 +415,7 @@
         assertEquals("Charset was different than expected",
                 System.getProperty("file.encoding", StandardCharsets.UTF_8.name()),
                 context.get("charset"));
-        assertEquals("Was used unsufficient classloader",
+        assertEquals("Was used insufficient classloader",
                 contextClassLoader, context.get("classLoader"));
         assertEquals("Severity is set to unexpected value",
                 "error", context.get("severity"));
@@ -1079,7 +1079,7 @@
         @Override
         public Set<String> getExternalResourceLocations() {
             final Set<String> externalResourceLocation = new HashSet<>(1);
-            externalResourceLocation.add("non_existing_external_resource.xml");
+            externalResourceLocation.add("non_existent_external_resource.xml");
             return externalResourceLocation;
         }
     }
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/ConfigurationLoaderTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/ConfigurationLoaderTest.java
index 3e43563..909fed3 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/ConfigurationLoaderTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/ConfigurationLoaderTest.java
@@ -511,16 +511,16 @@
     }
 
     @Test
-    public void testNonExistingPropertyName() throws Exception {
+    public void testNonExistentPropertyName() throws Exception {
         try {
-            loadConfiguration("InputConfigurationLoaderNonexistingProperty.xml");
+            loadConfiguration("InputConfigurationLoaderNonexistentProperty.xml");
             fail("exception in expected");
         }
         catch (CheckstyleException ex) {
             assertEquals("Invalid exception message",
                 "unable to parse configuration stream", ex.getMessage());
             assertEquals("Invalid exception cause message",
-                "Property ${nonexisting} has not been set",
+                "Property ${nonexistent} has not been set",
                     ex.getCause().getMessage());
         }
     }
@@ -619,7 +619,7 @@
 
     /**
      * This SuppressWarning("unchecked") required to suppress
-     * "Unchecked generics array creation for varargs parameter" during mock
+     * "Unchecked generics array creation for varargs parameter" during mock.
      * @throws Exception could happen from PowerMokito calls and getAttribute
      */
     @SuppressWarnings("unchecked")
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/DefaultConfigurationTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/DefaultConfigurationTest.java
index de4d5a9..07ede00 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/DefaultConfigurationTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/DefaultConfigurationTest.java
@@ -32,18 +32,18 @@
     public void testRemoveChild() {
         final DefaultConfiguration config = new DefaultConfiguration("MyConfig");
         final DefaultConfiguration configChild = new DefaultConfiguration("childConfig");
-        assertEquals("Invalid cildren count", 0, config.getChildren().length);
+        assertEquals("Invalid children count", 0, config.getChildren().length);
         config.addChild(configChild);
-        assertEquals("Invalid cildren count", 1, config.getChildren().length);
+        assertEquals("Invalid children count", 1, config.getChildren().length);
         config.removeChild(configChild);
-        assertEquals("Invalid cildren count", 0, config.getChildren().length);
+        assertEquals("Invalid children count", 0, config.getChildren().length);
     }
 
     @Test
-    public void testExceptionForNonExistingAttribute() {
+    public void testExceptionForNonExistentAttribute() {
         final String name = "MyConfig";
         final DefaultConfiguration config = new DefaultConfiguration(name);
-        final String attributeName = "NonExisting#$%";
+        final String attributeName = "NonExistent#$%";
         try {
             config.getAttribute(attributeName);
             fail("Exception is expected");
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/DefaultLoggerTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/DefaultLoggerTest.java
index 654da10..a339424 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/DefaultLoggerTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/DefaultLoggerTest.java
@@ -19,6 +19,7 @@
 
 package com.puppycrawl.tools.checkstyle;
 
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
@@ -33,6 +34,7 @@
 
 import com.puppycrawl.tools.checkstyle.api.AuditEvent;
 import com.puppycrawl.tools.checkstyle.api.AutomaticBean;
+import com.puppycrawl.tools.checkstyle.api.CheckstyleException;
 import com.puppycrawl.tools.checkstyle.api.LocalizedMessage;
 import com.puppycrawl.tools.checkstyle.utils.CommonUtils;
 
@@ -114,4 +116,15 @@
         assertTrue("Message should contain exception info, but was " + infoStream,
                 infoStream.toString().contains("java.lang.IllegalStateException: upsss"));
     }
+
+    @Test
+    public void testFinishLocalSetup() throws CheckstyleException {
+        final OutputStream infoStream = new ByteArrayOutputStream();
+        final DefaultLogger dl = new DefaultLogger(infoStream,
+                AutomaticBean.OutputStreamOptions.CLOSE);
+        dl.finishLocalSetup();
+        dl.auditStarted(null);
+        dl.auditFinished(null);
+        assertNotNull("instance should not be null", dl);
+    }
 }
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/DetailNodeTreeStringPrinterTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/DetailNodeTreeStringPrinterTest.java
index e6f46a0..6d77ef3 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/DetailNodeTreeStringPrinterTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/DetailNodeTreeStringPrinterTest.java
@@ -77,7 +77,7 @@
     }
 
     @Test
-    public void testNoUnnecessaryTextinJavadocAst() throws Exception {
+    public void testNoUnnecessaryTextInJavadocAst() throws Exception {
         verifyJavadocTree(
                 getPath("ExpectedDetailNodeTreeStringPrinterNoUnnecessaryTextInJavadocAst.txt"),
                 getPath("InputDetailNodeTreeStringPrinterNoUnnecessaryTextInJavadocAst.javadoc"));
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/MainTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/MainTest.java
index 77b8d4a..a29340b 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/MainTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/MainTest.java
@@ -173,7 +173,7 @@
             throws Exception {
 
         exit.checkAssertionAfterwards(() -> {
-            assertEquals("Unexpected ouput log",
+            assertEquals("Unexpected output log",
                     "Checkstyle version: null" + System.lineSeparator(),
                     systemOut.getLog());
             assertEquals("Unexpected system error log", "", systemErr.getLog());
@@ -188,7 +188,7 @@
         exit.checkAssertionAfterwards(() -> {
             final String usage = "Unrecognized option: -w" + EOL
                     + USAGE;
-            assertEquals("Unexpected ouput log", usage, systemOut.getLog());
+            assertEquals("Unexpected output log", usage, systemOut.getLog());
             assertEquals("Unexpected system error log", "", systemErr.getLog());
         });
         Main.main("-w");
@@ -199,7 +199,7 @@
             throws Exception {
         exit.expectSystemExitWithStatus(-1);
         exit.checkAssertionAfterwards(() -> {
-            assertEquals("Unexpected ouput log",
+            assertEquals("Unexpected output log",
                     "Must specify a config XML file." + System.lineSeparator(),
                     systemOut.getLog());
             assertEquals("Unexpected system error log", "", systemErr.getLog());
@@ -208,36 +208,36 @@
     }
 
     @Test
-    public void testNonExistingTargetFile()
+    public void testNonExistentTargetFile()
             throws Exception {
         exit.expectSystemExitWithStatus(-1);
         exit.checkAssertionAfterwards(() -> {
-            assertEquals("Unexpected ouput log", "Files to process must be specified, found 0."
+            assertEquals("Unexpected output log", "Files to process must be specified, found 0."
                 + System.lineSeparator(), systemOut.getLog());
             assertEquals("Unexpected system error log", "", systemErr.getLog());
         });
-        Main.main("-c", "/google_checks.xml", "NonExistingFile.java");
+        Main.main("-c", "/google_checks.xml", "NonExistentFile.java");
     }
 
     @Test
-    public void testNonExistingConfigFile()
+    public void testNonExistentConfigFile()
             throws Exception {
         exit.expectSystemExitWithStatus(-1);
         exit.checkAssertionAfterwards(() -> {
-            assertEquals("Unexpected ouput log", "Could not find config XML file "
-                        + "'src/main/resources/non_existing_config.xml'." + EOL,
+            assertEquals("Unexpected output log", "Could not find config XML file "
+                        + "'src/main/resources/non_existent_config.xml'." + EOL,
                     systemOut.getLog());
             assertEquals("Unexpected system error log", "", systemErr.getLog());
         });
-        Main.main("-c", "src/main/resources/non_existing_config.xml",
+        Main.main("-c", "src/main/resources/non_existent_config.xml",
                 getPath("InputMain.java"));
     }
 
     @Test
-    public void testNonExistingOutputFormat() throws Exception {
+    public void testNonExistentOutputFormat() throws Exception {
         exit.expectSystemExitWithStatus(-1);
         exit.checkAssertionAfterwards(() -> {
-            assertEquals("Unexpected ouput log", "Invalid output format. "
+            assertEquals("Unexpected output log", "Invalid output format. "
                     + "Found 'xmlp' but expected 'plain' or 'xml'." + EOL, systemOut.getLog());
             assertEquals("Unexpected system error log", "", systemErr.getLog());
         });
@@ -246,19 +246,18 @@
     }
 
     @Test
-    public void testNonExistingClass() throws Exception {
+    public void testNonExistentClass() throws Exception {
         exit.expectSystemExitWithStatus(-2);
         exit.checkAssertionAfterwards(() -> {
-            final String expectedExceptionMessage = errorCounterOneMessage.getMessage()
-                    + EOL;
-            assertEquals("Unexpected ouput log", expectedExceptionMessage, systemOut.getLog());
+            final String expectedExceptionMessage = errorCounterOneMessage.getMessage() + EOL;
+            assertEquals("Unexpected output log", expectedExceptionMessage, systemOut.getLog());
 
             final String cause = "com.puppycrawl.tools.checkstyle.api.CheckstyleException:"
                     + " cannot initialize module TreeWalker - ";
             assertTrue("Unexpected system error log", systemErr.getLog().startsWith(cause));
         });
 
-        Main.main("-c", getPath("InputMainConfig-non-existing-classname.xml"),
+        Main.main("-c", getPath("InputMainConfig-non-existent-classname.xml"),
             getPath("InputMain.java"));
     }
 
@@ -266,7 +265,7 @@
     public void testExistingTargetFile() throws Exception {
 
         exit.checkAssertionAfterwards(() -> {
-            assertEquals("Unexpected ouput log", auditStartMessage.getMessage() + EOL
+            assertEquals("Unexpected output log", auditStartMessage.getMessage() + EOL
                     + auditFinishMessage.getMessage() + EOL,
                     systemOut.getLog());
             assertEquals("Unexpected system error log", "", systemErr.getLog());
@@ -284,7 +283,7 @@
                     ResourceBundle.getBundle("checkstylecompilation", Locale.ROOT);
             final String version = compilationProperties
                 .getString("checkstyle.compile.version");
-            assertEquals("Unexpected ouput log", "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + EOL
+            assertEquals("Unexpected output log", "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + EOL
                     + "<checkstyle version=\"" + version + "\">" + EOL
                     + "<file name=\"" + expectedPath + "\">" + EOL
                     + "</file>" + EOL
@@ -300,7 +299,7 @@
     public void testExistingTargetFilePlainOutput() throws Exception {
 
         exit.checkAssertionAfterwards(() -> {
-            assertEquals("Unexpected ouput log", auditStartMessage.getMessage() + EOL
+            assertEquals("Unexpected output log", auditStartMessage.getMessage() + EOL
                     + auditFinishMessage.getMessage() + EOL, systemOut.getLog());
             assertEquals("Unexpected system error log", "", systemErr.getLog());
         });
@@ -321,7 +320,7 @@
                     "name.invalidPattern", new String[] {"InputMainInner", "^[a-z0-9]*$"},
                     null, getClass(), null);
             final String expectedPath = getFilePath("InputMain.java");
-            assertEquals("Unexpected ouput log", auditStartMessage.getMessage() + EOL
+            assertEquals("Unexpected output log", auditStartMessage.getMessage() + EOL
                             + "[WARN] " + expectedPath + ":3:14: "
                             + invalidPatternMessageMain.getMessage()
                             + " [TypeName]" + EOL
@@ -352,7 +351,7 @@
                     "name.invalidPattern", new String[] {"InputMainInner", "^[a-z0-9]*$"},
                     null, getClass(), null);
             final String expectedPath = getFilePath("InputMain.java");
-            assertEquals("Unexpected ouput log", auditStartMessage.getMessage() + EOL
+            assertEquals("Unexpected output log", auditStartMessage.getMessage() + EOL
                     + "[ERROR] " + expectedPath + ":3:14: "
                     + invalidPatternMessageMain.getMessage() + " [TypeName]" + EOL
                     + "[ERROR] " + expectedPath + ":5:7: "
@@ -367,11 +366,11 @@
     }
 
     @Test
-    public void testExistingTargetFilePlainOutputToNonExistingFile()
+    public void testExistentTargetFilePlainOutputToNonExistentFile()
             throws Exception {
 
         exit.checkAssertionAfterwards(() -> {
-            assertEquals("Unexpected ouput log", "", systemOut.getLog());
+            assertEquals("Unexpected output log", "", systemOut.getLog());
             assertEquals("Unexpected system error log", "", systemErr.getLog());
         });
         Main.main("-c", getPath("InputMainConfig-classname.xml"),
@@ -385,7 +384,7 @@
             throws Exception {
         final File file = temporaryFolder.newFile("file.output");
         exit.checkAssertionAfterwards(() -> {
-            assertEquals("Unexpected ouput log", "", systemOut.getLog());
+            assertEquals("Unexpected output log", "", systemOut.getLog());
             assertEquals("Unexpected system error log", "", systemErr.getLog());
         });
         Main.main("-c", getPath("InputMainConfig-classname.xml"),
@@ -395,8 +394,8 @@
     }
 
     @Test
-    public void testCreateNonExistingOutputFile() throws Exception {
-        final String outputFile = temporaryFolder.getRoot().getCanonicalPath() + "nonexisting.out";
+    public void testCreateNonExistentOutputFile() throws Exception {
+        final String outputFile = temporaryFolder.getRoot().getCanonicalPath() + "nonexistent.out";
         assertFalse("File must not exist", new File(outputFile).exists());
         Main.main("-c", getPath("InputMainConfig-classname.xml"),
                 "-f", "plain",
@@ -413,7 +412,7 @@
 
         //exit.expectSystemExitWithStatus(0);
         exit.checkAssertionAfterwards(() -> {
-            assertEquals("Unexpected ouput log", auditStartMessage.getMessage() + EOL
+            assertEquals("Unexpected output log", auditStartMessage.getMessage() + EOL
                     + auditFinishMessage.getMessage() + EOL, systemOut.getLog());
             assertEquals("Unexpected system error log", "", systemErr.getLog());
         });
@@ -426,16 +425,16 @@
     }
 
     @Test
-    public void testExistingTargetFilePlainOutputNonexistingProperties()
+    public void testExistingTargetFilePlainOutputNonexistentProperties()
             throws Exception {
         exit.expectSystemExitWithStatus(-1);
         exit.checkAssertionAfterwards(() -> {
-            assertEquals("Unexpected ouput log", "Could not find file 'nonexisting.properties'."
+            assertEquals("Unexpected output log", "Could not find file 'nonexistent.properties'."
                     + System.lineSeparator(), systemOut.getLog());
             assertEquals("Unexpected system error log", "", systemErr.getLog());
         });
         Main.main("-c", getPath("InputMainConfig-classname-prop.xml"),
-                "-p", "nonexisting.properties",
+                "-p", "nonexistent.properties",
                 getPath("InputMain.java"));
     }
 
@@ -445,7 +444,7 @@
         exit.expectSystemExitWithStatus(-2);
         exit.checkAssertionAfterwards(() -> {
             final String output = errorCounterOneMessage.getMessage() + EOL;
-            assertEquals("Unexpected ouput log", output, systemOut.getLog());
+            assertEquals("Unexpected output log", output, systemOut.getLog());
             final String errorOutput = "com.puppycrawl.tools.checkstyle.api."
                 + "CheckstyleException: unable to parse configuration stream - ";
             assertTrue("Unexpected system error log", systemErr.getLog().startsWith(errorOutput));
@@ -460,7 +459,7 @@
         exit.expectSystemExitWithStatus(-2);
         exit.checkAssertionAfterwards(() -> {
             final String output = errorCounterOneMessage.getMessage() + EOL;
-            assertEquals("Unexpected ouput log", output, systemOut.getLog());
+            assertEquals("Unexpected output log", output, systemOut.getLog());
             final String errorOutput = "com.puppycrawl.tools.checkstyle.api."
                     + "CheckstyleException: cannot initialize module RegexpSingleline"
                     + " - RegexpSingleline is not allowed as a child in RegexpSingleline";
@@ -476,7 +475,7 @@
         exit.expectSystemExitWithStatus(-2);
         exit.checkAssertionAfterwards(() -> {
             final String output = errorCounterOneMessage.getMessage() + EOL;
-            assertEquals("Unexpected ouput log", output, systemOut.getLog());
+            assertEquals("Unexpected output log", output, systemOut.getLog());
             final String errorOutput = "com.puppycrawl.tools.checkstyle.api."
                     + "CheckstyleException: cannot initialize module TreeWalker"
                     + " - JavadocVariable is not allowed as a child in JavadocMethod";
@@ -521,12 +520,12 @@
             final boolean samePrefix = causeMessage.substring(0, causeMessage.indexOf(' '))
                     .equals(localizedMessage
                             .substring(0, localizedMessage.indexOf(' ')));
-            final boolean sameSufix =
+            final boolean sameSuffix =
                     causeMessage.substring(causeMessage.lastIndexOf(' '), causeMessage.length())
                     .equals(localizedMessage
                             .substring(localizedMessage.lastIndexOf(' '),
                                     localizedMessage.length()));
-            assertTrue("Invalid error message", samePrefix || sameSufix);
+            assertTrue("Invalid error message", samePrefix || sameSuffix);
             assertTrue("Invalid error message",
                     causeMessage.contains(":invalid"));
         }
@@ -614,7 +613,7 @@
             }
             sb.append(auditFinishMessage.getMessage())
                     .append(EOL);
-            assertEquals("Unexpected ouput log", sb.toString(), systemOut.getLog());
+            assertEquals("Unexpected output log", sb.toString(), systemOut.getLog());
             assertEquals("Unexpected system error log", "", systemErr.getLog());
         });
 
@@ -659,7 +658,7 @@
         exit.checkAssertionAfterwards(() -> {
             final String expectedExceptionMessage = auditStartMessage.getMessage() + EOL
                             + errorCounterOneMessage.getMessage() + EOL;
-            assertEquals("Unexpected ouput log", expectedExceptionMessage, systemOut.getLog());
+            assertEquals("Unexpected output log", expectedExceptionMessage, systemOut.getLog());
 
             final String exceptionFirstLine = "com.puppycrawl.tools.checkstyle.api."
                     + "CheckstyleException: Exception was thrown while processing "
@@ -669,7 +668,7 @@
                     systemErr.getLog().startsWith(exceptionFirstLine));
         });
 
-        // We put xml as source to cause parse excepion
+        // We put xml as source to cause parse exception
         Main.main("-c", getPath("InputMainConfig-classname.xml"),
                 getNonCompilablePath("InputMainIncorrectClass.java"));
     }
@@ -679,7 +678,7 @@
 
         exit.expectSystemExitWithStatus(-1);
         exit.checkAssertionAfterwards(() -> {
-            assertEquals("Unexpected ouput log", "Printing AST is allowed for only one file."
+            assertEquals("Unexpected output log", "Printing AST is allowed for only one file."
                 + System.lineSeparator(), systemOut.getLog());
             assertEquals("Unexpected system error log", "", systemErr.getLog());
         });
@@ -718,7 +717,7 @@
             + "    `--RCURLY -> } [6:0]" + EOL;
 
         exit.checkAssertionAfterwards(() -> {
-            assertEquals("Unexpected ouput log", expected, systemOut.getLog());
+            assertEquals("Unexpected output log", expected, systemOut.getLog());
             assertEquals("Unexpected system error log", "", systemErr.getLog());
         });
         Main.main("-t", getPath("InputMain.java"));
@@ -758,7 +757,7 @@
             + "    `--RCURLY -> } [6:0]" + EOL;
 
         exit.checkAssertionAfterwards(() -> {
-            assertEquals("Unexpected ouput log", expected, systemOut.getLog());
+            assertEquals("Unexpected output log", expected, systemOut.getLog());
             assertEquals("Unexpected system error log", "", systemErr.getLog());
         });
         Main.main("-T", getPath("InputMain.java"));
@@ -771,7 +770,7 @@
             .replaceAll("\\\\r\\\\n", "\\\\n");
 
         exit.checkAssertionAfterwards(() -> {
-            assertEquals("Unexpected ouput log",
+            assertEquals("Unexpected output log",
                     expected, systemOut.getLog().replaceAll("\\\\r\\\\n", "\\\\n"));
             assertEquals("Unexpected system error log",
                     "", systemErr.getLog());
@@ -786,7 +785,7 @@
             StandardCharsets.UTF_8).replaceAll("\\\\r\\\\n", "\\\\n");
 
         exit.checkAssertionAfterwards(() -> {
-            assertEquals("Unexpected ouput log",
+            assertEquals("Unexpected output log",
                     expected, systemOut.getLog().replaceAll("\\\\r\\\\n", "\\\\n"));
             assertEquals("Unexpected system error log", "", systemErr.getLog());
         });
@@ -798,7 +797,7 @@
 
         exit.expectSystemExitWithStatus(-1);
         exit.checkAssertionAfterwards(() -> {
-            assertEquals("Unexpected ouput log", "Option '-t' cannot be used with other options."
+            assertEquals("Unexpected output log", "Option '-t' cannot be used with other options."
                 + System.lineSeparator(), systemOut.getLog());
             assertEquals("Unexpected system error log", "", systemErr.getLog());
         });
@@ -811,7 +810,7 @@
 
         exit.expectSystemExitWithStatus(-1);
         exit.checkAssertionAfterwards(() -> {
-            assertEquals("Unexpected ouput log", "Option '-t' cannot be used with other options."
+            assertEquals("Unexpected output log", "Option '-t' cannot be used with other options."
                 + System.lineSeparator(), systemOut.getLog());
             assertEquals("Unexpected system error log", "", systemErr.getLog());
         });
@@ -824,7 +823,7 @@
 
         exit.expectSystemExitWithStatus(-1);
         exit.checkAssertionAfterwards(() -> {
-            assertEquals("Unexpected ouput log", "Option '-t' cannot be used with other options."
+            assertEquals("Unexpected output log", "Option '-t' cannot be used with other options."
                 + System.lineSeparator(), systemOut.getLog());
             assertEquals("Unexpected system error log", "", systemErr.getLog());
         });
@@ -838,7 +837,7 @@
 
         exit.expectSystemExitWithStatus(-1);
         exit.checkAssertionAfterwards(() -> {
-            assertEquals("Unexpected ouput log", "Option '-t' cannot be used with other options."
+            assertEquals("Unexpected output log", "Option '-t' cannot be used with other options."
                 + System.lineSeparator(), systemOut.getLog());
             assertEquals("Unexpected system error log", "", systemErr.getLog());
         });
@@ -857,7 +856,7 @@
     public void testExcludeOption() throws Exception {
         exit.expectSystemExitWithStatus(-1);
         exit.checkAssertionAfterwards(() -> {
-            assertEquals("Unexpected ouput log", "Files to process must be specified, found 0."
+            assertEquals("Unexpected output log", "Files to process must be specified, found 0."
                 + System.lineSeparator(), systemOut.getLog());
             assertEquals("Unexpected system error log", "", systemErr.getLog());
         });
@@ -868,9 +867,9 @@
     public void testExcludeRegexpOption() throws Exception {
         exit.expectSystemExitWithStatus(-1);
         exit.checkAssertionAfterwards(() -> {
-            assertEquals("Unexpected ouput log", "Files to process must be specified, found 0."
+            assertEquals("Unexpected output log", "Files to process must be specified, found 0."
                 + System.lineSeparator(), systemOut.getLog());
-            assertEquals("Unexpected ouput log", "", systemErr.getLog());
+            assertEquals("Unexpected output log", "", systemErr.getLog());
         });
         Main.main("-c", "/google_checks.xml", getFilePath(""), "-x", ".");
     }
@@ -893,7 +892,7 @@
         TestRootModuleChecker.reset();
 
         exit.checkAssertionAfterwards(() -> {
-            assertEquals("Unexpected ouput log", "", systemOut.getLog());
+            assertEquals("Unexpected output log", "", systemOut.getLog());
             assertEquals("Unexpected system error log", "", systemErr.getLog());
             assertTrue("Invalid Checker state", TestRootModuleChecker.isProcessed());
         });
@@ -916,7 +915,7 @@
                             + "TestRootModuleCheckerCheck, " + checkstylePackage
                             + "TestRootModuleCheckerCheck"},
                     null, getClass(), null);
-            assertEquals("Unexpected ouput log", errorCounterOneMessage.getMessage() + EOL,
+            assertEquals("Unexpected output log", errorCounterOneMessage.getMessage() + EOL,
                     systemOut.getLog());
             assertTrue("Unexpected system error log",
                     systemErr.getLog().startsWith(checkstylePackage + "api.CheckstyleException: "
@@ -932,14 +931,14 @@
         exit.expectSystemExitWithStatus(-2);
         exit.checkAssertionAfterwards(() -> {
             final String expectedExceptionMessage = errorCounterOneMessage.getMessage() + EOL;
-            assertEquals("Unexpected ouput log", expectedExceptionMessage, systemOut.getLog());
+            assertEquals("Unexpected output log", expectedExceptionMessage, systemOut.getLog());
 
             final String cause = "com.puppycrawl.tools.checkstyle.api.CheckstyleException:"
                     + " cannot initialize module TreeWalker - ";
             assertTrue("Unexpected system error log", systemErr.getLog().startsWith(cause));
         });
 
-        Main.main("-c", getPath("InputMainConfig-non-existing-classname-ignore.xml"),
+        Main.main("-c", getPath("InputMainConfig-non-existent-classname-ignore.xml"),
                 "-executeIgnoredModules",
                 getPath("InputMain.java"));
     }
@@ -948,7 +947,7 @@
     public void testInvalidCheckerThreadsNumber() throws Exception {
         exit.expectSystemExitWithStatus(-1);
         exit.checkAssertionAfterwards(() -> {
-            assertEquals("Unexpected ouput log", "Invalid Checker threads number"
+            assertEquals("Unexpected output log", "Invalid Checker threads number"
                 + System.lineSeparator(), systemOut.getLog());
             assertEquals("Unexpected system error log", "", systemErr.getLog());
         });
@@ -959,7 +958,7 @@
     public void testInvalidTreeWalkerThreadsNumber() throws Exception {
         exit.expectSystemExitWithStatus(-1);
         exit.checkAssertionAfterwards(() -> {
-            assertEquals("Unexpected ouput log", "Invalid TreeWalker threads number"
+            assertEquals("Unexpected output log", "Invalid TreeWalker threads number"
                 + System.lineSeparator(), systemOut.getLog());
             assertEquals("Unexpected system error log", "", systemErr.getLog());
         });
@@ -970,7 +969,7 @@
     public void testZeroCheckerThreadsNumber() throws Exception {
         exit.expectSystemExitWithStatus(-1);
         exit.checkAssertionAfterwards(() -> {
-            assertEquals("Unexpected ouput log", "Checker threads number must be greater than zero"
+            assertEquals("Unexpected output log", "Checker threads number must be greater than zero"
                 + System.lineSeparator(), systemOut.getLog());
             assertEquals("Unexpected system error log", "", systemErr.getLog());
         });
@@ -981,7 +980,7 @@
     public void testZeroTreeWalkerThreadsNumber() throws Exception {
         exit.expectSystemExitWithStatus(-1);
         exit.checkAssertionAfterwards(() -> {
-            assertEquals("Unexpected ouput log",
+            assertEquals("Unexpected output log",
                     "TreeWalker threads number must be greater than zero"
                 + System.lineSeparator(), systemOut.getLog());
             assertEquals("Unexpected system error log", "", systemErr.getLog());
@@ -994,7 +993,7 @@
         TestRootModuleChecker.reset();
 
         exit.checkAssertionAfterwards(() -> {
-            assertEquals("Unexpected ouput log", "", systemOut.getLog());
+            assertEquals("Unexpected output log", "", systemOut.getLog());
             assertEquals("Unexpected system error log", "", systemErr.getLog());
             assertTrue("Invalid checker state", TestRootModuleChecker.isProcessed());
             final DefaultConfiguration config =
@@ -1014,7 +1013,7 @@
         TestRootModuleChecker.reset();
 
         exit.checkAssertionAfterwards(() -> {
-            assertEquals("Unexpected ouput log", "", systemOut.getLog());
+            assertEquals("Unexpected output log", "", systemOut.getLog());
             assertEquals("Unexpected system error log", "", systemErr.getLog());
             assertTrue("Invalid checker state", TestRootModuleChecker.isProcessed());
             final DefaultConfiguration config =
@@ -1034,7 +1033,7 @@
         TestRootModuleChecker.reset();
 
         exit.checkAssertionAfterwards(() -> {
-            assertEquals("Unexpected ouput log", "", systemOut.getLog());
+            assertEquals("Unexpected output log", "", systemOut.getLog());
             assertEquals("Unexpected system error log", "", systemErr.getLog());
             assertTrue("Invalid checker state", TestRootModuleChecker.isProcessed());
             final DefaultConfiguration config =
@@ -1049,7 +1048,7 @@
                 .getChildren()[0];
             assertEquals("Invalid checker name", "Checker", checkerConfiguration.getName());
             final Configuration treeWalkerConfig = checkerConfiguration.getChildren()[0];
-            assertEquals("Invalid checker childs name", "TreeWalker", treeWalkerConfig.getName());
+            assertEquals("Invalid checker children name", "TreeWalker", treeWalkerConfig.getName());
         });
         Main.main("-C", "1", "-W", "1", "-c", getPath("InputMainConfig-multi-thread-mode.xml"),
             getPath("InputMain.java"));
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/PropertyCacheFileTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/PropertyCacheFileTest.java
index d391e64..cf98238 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/PropertyCacheFileTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/PropertyCacheFileTest.java
@@ -109,11 +109,11 @@
         final String filePath = temporaryFolder.newFile().getPath();
         final PropertyCacheFile cache = new PropertyCacheFile(config, filePath);
         cache.put("myFile", 1);
-        assertTrue("Should return true wnen file is in cache",
+        assertTrue("Should return true when file is in cache",
                 cache.isInCache("myFile", 1));
-        assertFalse("Should return false wnen file is not in cache",
+        assertFalse("Should return false when file is not in cache",
                 cache.isInCache("myFile", 2));
-        assertFalse("Should return false wnen file is not in cache",
+        assertFalse("Should return false when file is not in cache",
                 cache.isInCache("myFile1", 1));
     }
 
@@ -216,7 +216,7 @@
     }
 
     @Test
-    public void testExternalResourseIsSavedInCache() throws Exception {
+    public void testExternalResourceIsSavedInCache() throws Exception {
         final Configuration config = new DefaultConfiguration("myName");
         final String filePath = temporaryFolder.newFile().getPath();
         final PropertyCacheFile cache = new PropertyCacheFile(config, filePath);
@@ -245,12 +245,12 @@
 
     /**
      * This SuppressWarning("unchecked") required to suppress
-     * "Unchecked generics array creation for varargs parameter" during mock
+     * "Unchecked generics array creation for varargs parameter" during mock.
      * @throws IOException when smth wrong with file creation or cache.load
      */
     @SuppressWarnings("unchecked")
     @Test
-    public void testNonExistingResource() throws IOException {
+    public void testNonExistentResource() throws IOException {
         final Configuration config = new DefaultConfiguration("myName");
         final String filePath = temporaryFolder.newFile().getPath();
         final PropertyCacheFile cache = new PropertyCacheFile(config, filePath);
@@ -358,10 +358,10 @@
     }
 
     @Test
-    public void testPutNonExsistingExternalResourceSameExceptionBetweenRuns() throws Exception {
+    public void testPutNonExistentExternalResourceSameExceptionBetweenRuns() throws Exception {
         final File cacheFile = temporaryFolder.newFile();
 
-        // We mock getUriByFilename method of CommonUtils to garantee that it will
+        // We mock getUriByFilename method of CommonUtils to guarantee that it will
         // throw CheckstyleException with the specific content.
         mockStatic(CommonUtils.class);
         final CheckstyleException mockException =
@@ -370,7 +370,7 @@
             .thenThrow(mockException);
 
         // We invoke 'putExternalResources' twice to invalidate cache
-        // and have two identical exceptions whith the equal content
+        // and have two identical exceptions which the equal content
         final int numberOfRuns = 2;
         final String[] configHashes = new String[numberOfRuns];
         final String[] externalResourceHashes = new String[numberOfRuns];
@@ -382,10 +382,10 @@
             configHashes[i] = cache.get(PropertyCacheFile.CONFIG_HASH_KEY);
             assertNotNull("Config hash key should not be null", configHashes[i]);
 
-            final Set<String> nonExistingExternalResources = new HashSet<>();
-            final String externalResourceFileName = "non_existing_file.xml";
-            nonExistingExternalResources.add(externalResourceFileName);
-            cache.putExternalResources(nonExistingExternalResources);
+            final Set<String> nonExistentExternalResources = new HashSet<>();
+            final String externalResourceFileName = "non_existent_file.xml";
+            nonExistentExternalResources.add(externalResourceFileName);
+            cache.putExternalResources(nonExistentExternalResources);
 
             externalResourceHashes[i] = cache.get(PropertyCacheFile.EXTERNAL_RESOURCE_KEY_PREFIX
                     + externalResourceFileName);
@@ -412,7 +412,7 @@
      * @noinspection InstanceMethodNamingConvention
      */
     @Test
-    public void testPutNonExsistingExternalResourceDifferentExceptionsBetweenRuns()
+    public void testPutNonExistentExternalResourceDifferentExceptionsBetweenRuns()
             throws Exception {
 
         final File cacheFile = temporaryFolder.newFile();
@@ -426,7 +426,7 @@
             final Configuration config = new DefaultConfiguration("myConfig");
             final PropertyCacheFile cache = new PropertyCacheFile(config, cacheFile.getPath());
 
-            // We mock getUriByFilename method of CommonUtils to garantee that it will
+            // We mock getUriByFilename method of CommonUtils to guarantee that it will
             // throw CheckstyleException with the specific content.
             mockStatic(CommonUtils.class);
             final CheckstyleException mockException = new CheckstyleException("Exception #" + i);
@@ -438,10 +438,10 @@
             configHashes[i] = cache.get(PropertyCacheFile.CONFIG_HASH_KEY);
             assertNotNull("Config hash key should not be null", configHashes[i]);
 
-            final Set<String> nonExistingExternalResources = new HashSet<>();
-            final String externalResourceFileName = "non_existing_file.xml";
-            nonExistingExternalResources.add(externalResourceFileName);
-            cache.putExternalResources(nonExistingExternalResources);
+            final Set<String> nonExistentExternalResources = new HashSet<>();
+            final String externalResourceFileName = "non_existent_file.xml";
+            nonExistentExternalResources.add(externalResourceFileName);
+            cache.putExternalResources(nonExistentExternalResources);
 
             externalResourceHashes[i] = cache.get(PropertyCacheFile.EXTERNAL_RESOURCE_KEY_PREFIX
                     + externalResourceFileName);
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/XMLLoggerTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/XMLLoggerTest.java
index 91464a9..cfb1435 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/XMLLoggerTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/XMLLoggerTest.java
@@ -24,34 +24,32 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
-import java.io.BufferedReader;
-import java.io.ByteArrayInputStream;
 import java.io.IOException;
-import java.io.InputStreamReader;
 import java.io.PrintWriter;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Pattern;
 
 import org.junit.Test;
 
 import com.puppycrawl.tools.checkstyle.api.AuditEvent;
 import com.puppycrawl.tools.checkstyle.api.AutomaticBean;
+import com.puppycrawl.tools.checkstyle.api.CheckstyleException;
 import com.puppycrawl.tools.checkstyle.api.LocalizedMessage;
 import com.puppycrawl.tools.checkstyle.api.SeverityLevel;
 import com.puppycrawl.tools.checkstyle.internal.utils.CloseAndFlushTestByteArrayOutputStream;
-import com.puppycrawl.tools.checkstyle.utils.CommonUtils;
 
 /**
  * Enter a description of class XMLLoggerTest.java.
  * @author Rick Giles
  */
 // -@cs[AbbreviationAsWordInName] Test should be named as its main class.
-public class XMLLoggerTest {
+public class XMLLoggerTest extends AbstractXmlTestSupport {
     private final CloseAndFlushTestByteArrayOutputStream outStream =
         new CloseAndFlushTestByteArrayOutputStream();
 
+    @Override
+    protected String getPackageLocation() {
+        return "com/puppycrawl/tools/checkstyle/xmllogger";
+    }
+
     @Test
     public void testEncode()
             throws IOException {
@@ -116,7 +114,7 @@
 
     @Test
     public void testCloseStream()
-            throws IOException {
+            throws Exception {
         final XMLLogger logger = new XMLLogger(outStream,
                 AutomaticBean.OutputStreamOptions.CLOSE);
         logger.auditStarted(null);
@@ -124,13 +122,12 @@
 
         assertEquals("Invalid close count", 1, outStream.getCloseCount());
 
-        final String[] expectedLines = CommonUtils.EMPTY_STRING_ARRAY;
-        verifyLines(expectedLines);
+        verifyXml(getPath("ExpectedXMLLoggerEmpty.xml"), outStream);
     }
 
     @Test
     public void testNoCloseStream()
-            throws IOException {
+            throws Exception {
         final XMLLogger logger = new XMLLogger(outStream,
                 AutomaticBean.OutputStreamOptions.NONE);
         logger.auditStarted(null);
@@ -139,42 +136,34 @@
         assertEquals("Invalid close count", 0, outStream.getCloseCount());
 
         outStream.close();
-        final String[] expectedLines = CommonUtils.EMPTY_STRING_ARRAY;
-        verifyLines(expectedLines);
+        verifyXml(getPath("ExpectedXMLLoggerEmpty.xml"), outStream);
     }
 
     @Test
     public void testFileStarted()
-            throws IOException {
+            throws Exception {
         final XMLLogger logger = new XMLLogger(outStream, true);
         logger.auditStarted(null);
         final AuditEvent ev = new AuditEvent(this, "Test.java");
         logger.fileStarted(ev);
+        logger.fileFinished(ev);
         logger.auditFinished(null);
-        final String[] expectedLines = {
-            "<file name=\"Test.java\">",
-            "</file>",
-        };
-        verifyLines(expectedLines);
+        verifyXml(getPath("ExpectedXMLLogger.xml"), outStream);
     }
 
     @Test
     public void testFileFinished()
-            throws IOException {
+            throws Exception {
         final XMLLogger logger = new XMLLogger(outStream, true);
         logger.auditStarted(null);
         final AuditEvent ev = new AuditEvent(this, "Test.java");
         logger.fileFinished(ev);
         logger.auditFinished(null);
-        final String[] expectedLines = {
-            "<file name=\"Test.java\">",
-            "</file>",
-        };
-        verifyLines(expectedLines);
+        verifyXml(getPath("ExpectedXMLLogger.xml"), outStream);
     }
 
     @Test
-    public void testAddError() throws IOException {
+    public void testAddError() throws Exception {
         final XMLLogger logger = new XMLLogger(outStream, true);
         logger.auditStarted(null);
         final LocalizedMessage message =
@@ -182,19 +171,15 @@
                 "messages.properties", "key", null, SeverityLevel.ERROR, null,
                     getClass(), null);
         final AuditEvent ev = new AuditEvent(this, "Test.java", message);
+        logger.fileStarted(ev);
         logger.addError(ev);
+        logger.fileFinished(ev);
         logger.auditFinished(null);
-        final String[] expectedLines = {
-            "<file name=\"Test.java\">",
-            "<error line=\"1\" column=\"1\" severity=\"error\" message=\"key\""
-                + " source=\"com.puppycrawl.tools.checkstyle.XMLLoggerTest\"/>",
-            "</file>",
-        };
-        verifyLines(expectedLines);
+        verifyXml(getPath("ExpectedXMLLoggerError.xml"), outStream, message.getMessage());
     }
 
     @Test
-    public void testAddErrorWithNullFileName() throws IOException {
+    public void testAddErrorWithNullFileName() throws Exception {
         final XMLLogger logger = new XMLLogger(outStream, true);
         logger.auditStarted(null);
         final LocalizedMessage message =
@@ -204,15 +189,12 @@
         final AuditEvent ev = new AuditEvent(this, null, message);
         logger.addError(ev);
         logger.auditFinished(null);
-        final String[] expectedLines = {
-            "<error line=\"1\" column=\"1\" severity=\"error\" message=\"key\""
-                + " source=\"com.puppycrawl.tools.checkstyle.XMLLoggerTest\"/>",
-        };
-        verifyLines(expectedLines);
+        verifyXml(getPath("ExpectedXMLLoggerErrorNullFileName.xml"), outStream,
+                message.getMessage());
     }
 
     @Test
-    public void testAddErrorModuleId() throws IOException {
+    public void testAddErrorModuleId() throws Exception {
         final XMLLogger logger = new XMLLogger(outStream, true);
         logger.auditStarted(null);
         final LocalizedMessage message =
@@ -222,17 +204,11 @@
         final AuditEvent ev = new AuditEvent(this, "Test.java", message);
         logger.addError(ev);
         logger.auditFinished(null);
-        final String[] expectedLines = {
-            "<file name=\"Test.java\">",
-            "<error line=\"1\" column=\"1\" severity=\"error\" message=\"key\""
-                + " source=\"module\"/>",
-            "</file>",
-        };
-        verifyLines(expectedLines);
+        verifyXml(getPath("ExpectedXMLLoggerErrorModuleId.xml"), outStream, message.getMessage());
     }
 
     @Test
-    public void testAddErrorOnZeroColumns() throws IOException {
+    public void testAddErrorOnZeroColumns() throws Exception {
         final XMLLogger logger = new XMLLogger(outStream, true);
         logger.auditStarted(null);
         final LocalizedMessage message =
@@ -240,19 +216,16 @@
                         "messages.properties", "key", null, SeverityLevel.ERROR, null,
                         getClass(), null);
         final AuditEvent ev = new AuditEvent(this, "Test.java", message);
+        logger.fileStarted(ev);
         logger.addError(ev);
+        logger.fileFinished(ev);
         logger.auditFinished(null);
-        final String[] expectedLines = {
-            "<file name=\"Test.java\">",
-            "<error line=\"1\" severity=\"error\" message=\"key\""
-                + " source=\"com.puppycrawl.tools.checkstyle.XMLLoggerTest\"/>",
-            "</file>",
-        };
-        verifyLines(expectedLines);
+        verifyXml(getPath("ExpectedXMLLoggerErrorZeroColumn.xml"), outStream,
+                message.getMessage());
     }
 
     @Test
-    public void testAddIgnored() throws IOException {
+    public void testAddIgnored() throws Exception {
         final XMLLogger logger = new XMLLogger(outStream, true);
         logger.auditStarted(null);
         final LocalizedMessage message =
@@ -262,13 +235,12 @@
         final AuditEvent ev = new AuditEvent(this, "Test.java", message);
         logger.addError(ev);
         logger.auditFinished(null);
-        final String[] expectedLines = CommonUtils.EMPTY_STRING_ARRAY;
-        verifyLines(expectedLines);
+        verifyXml(getPath("ExpectedXMLLoggerEmpty.xml"), outStream);
     }
 
     @Test
     public void testAddException()
-            throws IOException {
+            throws Exception {
         final XMLLogger logger = new XMLLogger(outStream, true);
         logger.auditStarted(null);
         final LocalizedMessage message =
@@ -277,20 +249,13 @@
         final AuditEvent ev = new AuditEvent(this, "Test.java", message);
         logger.addException(ev, new TestException("msg", new RuntimeException("msg")));
         logger.auditFinished(null);
-        final String[] expectedLines = {
-            "<file name=\"Test.java\">",
-            "&lt;exception&gt;&#10;&lt;![CDATA[&#10;stackTrace&#10;example]]&gt;"
-                + "&#10;&lt;/exception&gt;&#10;",
-            "</file>",
-        };
-
-        verifyLines(expectedLines);
+        verifyXml(getPath("ExpectedXMLLoggerException.xml"), outStream);
         assertEquals("Invalid close count", 1, outStream.getCloseCount());
     }
 
     @Test
     public void testAddExceptionWithNullFileName()
-            throws IOException {
+            throws Exception {
         final XMLLogger logger = new XMLLogger(outStream, true);
         logger.auditStarted(null);
         final LocalizedMessage message =
@@ -299,18 +264,13 @@
         final AuditEvent ev = new AuditEvent(this, null, message);
         logger.addException(ev, new TestException("msg", new RuntimeException("msg")));
         logger.auditFinished(null);
-        final String[] expectedLines = {
-            "&lt;exception&gt;&#10;&lt;![CDATA[&#10;stackTrace&#10;example]]&gt;"
-                + "&#10;&lt;/exception&gt;&#10;",
-        };
-
-        verifyLines(expectedLines);
+        verifyXml(getPath("ExpectedXMLLoggerExceptionNullFileName.xml"), outStream);
         assertEquals("Invalid close count", 1, outStream.getCloseCount());
     }
 
     @Test
     public void testAddExceptionAfterFileStarted()
-            throws IOException {
+            throws Exception {
         final XMLLogger logger = new XMLLogger(outStream, true);
         logger.auditStarted(null);
 
@@ -323,21 +283,15 @@
         final AuditEvent ev = new AuditEvent(this, "Test.java", message);
         logger.addException(ev, new TestException("msg", new RuntimeException("msg")));
 
+        logger.fileFinished(ev);
         logger.auditFinished(null);
-        final String[] expectedLines = {
-            "<file name=\"Test.java\">",
-            "&lt;exception&gt;&#10;&lt;![CDATA[&#10;stackTrace&#10;example]]&gt;"
-                    + "&#10;&lt;/exception&gt;&#10;",
-            "</file>",
-        };
-
-        verifyLines(expectedLines);
+        verifyXml(getPath("ExpectedXMLLoggerException2.xml"), outStream);
         assertEquals("Invalid close count", 1, outStream.getCloseCount());
     }
 
     @Test
     public void testAddExceptionBeforeFileFinished()
-            throws IOException {
+            throws Exception {
         final XMLLogger logger = new XMLLogger(outStream, true);
         logger.auditStarted(null);
         final LocalizedMessage message =
@@ -348,20 +302,13 @@
         final AuditEvent fileFinishedEvent = new AuditEvent(this, "Test.java");
         logger.fileFinished(fileFinishedEvent);
         logger.auditFinished(null);
-        final String[] expectedLines = {
-            "<file name=\"Test.java\">",
-            "&lt;exception&gt;&#10;&lt;![CDATA[&#10;stackTrace&#10;example]]&gt;"
-                    + "&#10;&lt;/exception&gt;&#10;",
-            "</file>",
-        };
-
-        verifyLines(expectedLines);
+        verifyXml(getPath("ExpectedXMLLoggerException3.xml"), outStream);
         assertEquals("Invalid close count", 1, outStream.getCloseCount());
     }
 
     @Test
     public void testAddExceptionBetweenFileStartedAndFinished()
-            throws IOException {
+            throws Exception {
         final XMLLogger logger = new XMLLogger(outStream, true);
         logger.auditStarted(null);
         final LocalizedMessage message =
@@ -374,19 +321,12 @@
         final AuditEvent fileFinishedEvent = new AuditEvent(this, "Test.java");
         logger.fileFinished(fileFinishedEvent);
         logger.auditFinished(null);
-        final String[] expectedLines = {
-            "<file name=\"Test.java\">",
-            "&lt;exception&gt;&#10;&lt;![CDATA[&#10;stackTrace&#10;example]]&gt;"
-                    + "&#10;&lt;/exception&gt;&#10;",
-            "</file>",
-        };
-
-        verifyLines(expectedLines);
+        verifyXml(getPath("ExpectedXMLLoggerException2.xml"), outStream);
         assertEquals("Invalid close count", 1, outStream.getCloseCount());
     }
 
     @Test
-    public void testAuditFinishedWithoutFileFinished() throws IOException {
+    public void testAuditFinishedWithoutFileFinished() throws Exception {
         final XMLLogger logger = new XMLLogger(outStream, true);
         logger.auditStarted(null);
         final AuditEvent fileStartedEvent = new AuditEvent(this, "Test.java");
@@ -399,53 +339,18 @@
         final AuditEvent errorEvent = new AuditEvent(this, "Test.java", message);
         logger.addError(errorEvent);
 
+        logger.fileFinished(errorEvent);
         logger.auditFinished(null);
-        final String[] expectedLines = {
-            "<file name=\"Test.java\">",
-            "<error line=\"1\" column=\"1\" severity=\"error\" message=\"key\""
-                    + " source=\"com.puppycrawl.tools.checkstyle.XMLLoggerTest\"/>",
-            "</file>",
-        };
-        verifyLines(expectedLines);
+        verifyXml(getPath("ExpectedXMLLoggerError.xml"), outStream, message.getMessage());
     }
 
-    private String[] getOutStreamLines()
-            throws IOException {
-        final byte[] bytes = outStream.toByteArray();
-        final ByteArrayInputStream inStream =
-            new ByteArrayInputStream(bytes);
-        final List<String> lineList = new ArrayList<>();
-        try (BufferedReader reader = new BufferedReader(
-                new InputStreamReader(inStream, StandardCharsets.UTF_8))) {
-            while (true) {
-                final String line = reader.readLine();
-                if (line == null) {
-                    break;
-                }
-                lineList.add(line);
-            }
-        }
-        return lineList.toArray(new String[lineList.size()]);
-    }
-
-    /**
-     * Verify output lines from auditStart to auditEnd.
-     * Take into consideration checkstyle element (first and last lines).
-     * @param expectedLines expected error report lines
-     */
-    private void verifyLines(String... expectedLines)
-            throws IOException {
-        final String[] lines = getOutStreamLines();
-        assertEquals("length.", expectedLines.length + 3, lines.length);
-        assertEquals("first line.",
-                     "<?xml version=\"1.0\" encoding=\"UTF-8\"?>",
-                     lines[0]);
-        final Pattern checkstyleOpenTag = Pattern.compile("^<checkstyle version=\".*\">$");
-        assertTrue("second line.", checkstyleOpenTag.matcher(lines[1]).matches());
-        for (int i = 0; i < expectedLines.length; i++) {
-            assertEquals("line " + i + ".", expectedLines[i], lines[i + 2]);
-        }
-        assertEquals("last line.", "</checkstyle>", lines[lines.length - 1]);
+    @Test
+    public void testFinishLocalSetup() throws CheckstyleException {
+        final XMLLogger logger = new XMLLogger(outStream, true);
+        logger.finishLocalSetup();
+        logger.auditStarted(null);
+        logger.auditFinished(null);
+        assertNotNull("instance should not be null", logger);
     }
 
     private static class TestException extends RuntimeException {
@@ -461,5 +366,4 @@
             printWriter.print("stackTrace\r\nexample");
         }
     }
-
 }
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/api/AbstractLoaderTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/XmlLoaderTest.java
similarity index 85%
rename from src/test/java/com/puppycrawl/tools/checkstyle/api/AbstractLoaderTest.java
rename to src/test/java/com/puppycrawl/tools/checkstyle/XmlLoaderTest.java
index 80dd679..0c805e3 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/api/AbstractLoaderTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/XmlLoaderTest.java
@@ -17,7 +17,7 @@
 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 ////////////////////////////////////////////////////////////////////////////////
 
-package com.puppycrawl.tools.checkstyle.api;
+package com.puppycrawl.tools.checkstyle;
 
 import static com.puppycrawl.tools.checkstyle.internal.utils.TestUtil.isUtilsClassHasPrivateConstructor;
 import static org.junit.Assert.assertEquals;
@@ -35,26 +35,26 @@
 
 import com.sun.org.apache.xerces.internal.impl.Constants;
 
-public class AbstractLoaderTest {
+public class XmlLoaderTest {
 
     private static final String NAMESPACES_FEATURE =
             Constants.SAX_FEATURE_PREFIX + Constants.NAMESPACES_FEATURE;
 
     @Test
-    public void testParserConfiguratedSuccefully() throws Exception {
+    public void testParserConfiguredSuccessfully() throws Exception {
         final DummyLoader dummyLoader = new DummyLoader(new HashMap<>(1));
         final XMLReader parser = Whitebox.getInternalState(dummyLoader, "parser");
         assertTrue("Invalid feature state", parser.getFeature(NAMESPACES_FEATURE));
-        assertEquals("Invalid entity resoler", dummyLoader, parser.getEntityResolver());
+        assertEquals("Invalid entity resolver", dummyLoader, parser.getEntityResolver());
     }
 
     @Test
     public void testIsProperUtilsClass() throws ReflectiveOperationException {
         assertTrue("Constructor is not private", isUtilsClassHasPrivateConstructor(
-                AbstractLoader.FeaturesForVerySecureJavaInstallations.class, true));
+                XmlLoader.FeaturesForVerySecureJavaInstallations.class, true));
     }
 
-    private static final class DummyLoader extends AbstractLoader {
+    private static final class DummyLoader extends XmlLoader {
 
         DummyLoader(Map<String, String> publicIdToResourceNameMap)
                 throws SAXException, ParserConfigurationException {
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/ant/CheckstyleAntTaskTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/ant/CheckstyleAntTaskTest.java
index 52788eb..dee95b1 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/ant/CheckstyleAntTaskTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/ant/CheckstyleAntTaskTest.java
@@ -200,7 +200,7 @@
                 filesToCheck.size(), is(9));
         assertThat("The path of file differs from expected",
                 filesToCheck.get(5).getAbsolutePath(), is(getPath(FLAWLESS_INPUT)));
-        assertEquals("Amount of logged messages in unxexpected",
+        assertEquals("Amount of logged messages in unexpected",
                 9, antTask.getLoggedMessages().size());
     }
 
@@ -250,7 +250,7 @@
     }
 
     @Test
-    public final void testNonExistingConfig() throws IOException {
+    public final void testNonExistentConfig() throws IOException {
         final CheckstyleAntTask antTask = new CheckstyleAntTask();
         antTask.setConfig(getPath(NOT_EXISTING_FILE));
         antTask.setProject(new Project());
@@ -491,7 +491,7 @@
     }
 
     @Test
-    public final void testSetPropertiesNonExistingFile() throws IOException {
+    public final void testSetPropertiesNonExistentFile() throws IOException {
         final CheckstyleAntTask antTask = getCheckstyleAntTask();
         antTask.setFile(new File(getPath(FLAWLESS_INPUT)));
         antTask.setProperties(new File(getPath(NOT_EXISTING_FILE)));
@@ -666,7 +666,7 @@
             Whitebox.getInternalState(antTask, "classpath"));
     }
 
-    /** This test is created to satisfy pitest, it is hard to emulate Referece by Id */
+    /** This test is created to satisfy pitest, it is hard to emulate Reference by Id. */
     @Test
     public void testSetClasspathRef1() {
         final CheckstyleAntTask antTask = new CheckstyleAntTask();
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/api/AbstractFileSetCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/api/AbstractFileSetCheckTest.java
index 37b07b8..2e2d7a7 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/api/AbstractFileSetCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/api/AbstractFileSetCheckTest.java
@@ -104,20 +104,20 @@
     }
 
     @Test
-    public void testGetFileExtention() {
+    public void testGetFileExtension() {
         final DummyFileSetCheck check = new DummyFileSetCheck();
         check.setFileExtensions("tmp", ".java");
-        final String[] expectedExtentions = {".tmp", ".java"};
+        final String[] expectedExtensions = {".tmp", ".java"};
 
         Assert.assertArrayEquals("Invalid extensions",
-                expectedExtentions, check.getFileExtensions());
+                expectedExtensions, check.getFileExtensions());
     }
 
     /**
-     * This javadoc exists only to suppress Intellij Idea inspection
+     * This javadoc exists only to suppress Intellij Idea inspection.
      */
     @Test
-    public void testSetExtentionThrowsExceptionWhenTheyAreNull() {
+    public void testSetExtensionThrowsExceptionWhenTheyAreNull() {
         final DummyFileSetCheck check = new DummyFileSetCheck();
         try {
             check.setFileExtensions((String[]) null);
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/api/AutomaticBeanTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/api/AutomaticBeanTest.java
index 7ad0be7..15e6b30 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/api/AutomaticBeanTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/api/AutomaticBeanTest.java
@@ -42,13 +42,13 @@
     public void testConfigureNoSuchAttribute() {
         final TestBean testBean = new TestBean();
         final DefaultConfiguration conf = new DefaultConfiguration("testConf");
-        conf.addAttribute("NonExisting", "doesn't matter");
+        conf.addAttribute("NonExistent", "doesn't matter");
         try {
             testBean.configure(conf);
             fail("Exception is expected");
         }
         catch (CheckstyleException ex) {
-            final String expected = "Property 'NonExisting' in module ";
+            final String expected = "Property 'NonExistent' in module ";
             assertNull("Exceptions cause should be null", ex.getCause());
             assertTrue("Invalid exception message, should start with: " + expected,
                     ex.getMessage().startsWith(expected));
@@ -209,5 +209,10 @@
             throw new IllegalStateException(privateField + "," + wrong + "," + val + "," + value);
         }
 
+        @Override
+        protected void finishLocalSetup() throws CheckstyleException {
+            // No code by default
+        }
+
     }
 }
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/api/DetailASTTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/api/DetailASTTest.java
index bf07a5b..d3261a0 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/api/DetailASTTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/api/DetailASTTest.java
@@ -258,7 +258,7 @@
     }
 
     /**
-     * There are asserts in checkNode, but idea does not see them
+     * There are asserts in checkNode, but idea does not see them.
      * @noinspection JUnitTestMethodWithNoAssertions
      */
     @Test
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/api/FileContentsTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/api/FileContentsTest.java
index 5bd90a8..13a8743 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/api/FileContentsTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/api/FileContentsTest.java
@@ -34,8 +34,6 @@
 import org.junit.Test;
 import org.powermock.reflect.Whitebox;
 
-import com.google.common.collect.ImmutableMap;
-
 public class FileContentsTest {
 
     @Test
@@ -101,7 +99,7 @@
         final FileContents fileContents = new FileContents(
                 new FileText(new File("filename"), Collections.singletonList("  //   ")));
         fileContents.reportCComment(1, 2, 1, 2);
-        final ImmutableMap<Integer, List<TextBlock>> comments = fileContents.getCComments();
+        final Map<Integer, List<TextBlock>> comments = fileContents.getCComments();
 
         assertEquals("Invalid comment",
                 new Comment(new String[] {"/"}, 2, 1, 2).toString(),
@@ -158,7 +156,7 @@
                 new FileText(new File("filename"), Arrays.asList("   ", "    ", "  /* test   ",
                         "  */  ", "   ")));
         fileContents.reportCComment(3, 2, 4, 2);
-        final ImmutableMap<Integer, List<TextBlock>> blockComments =
+        final Map<Integer, List<TextBlock>> blockComments =
             fileContents.getBlockComments();
         final String[] text = blockComments.get(3).get(0).getText();
 
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/api/FileTextTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/api/FileTextTest.java
index af5d93c..7918d96 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/api/FileTextTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/api/FileTextTest.java
@@ -38,11 +38,11 @@
 import org.powermock.core.classloader.annotations.PrepareForTest;
 import org.powermock.modules.junit4.PowerMockRunner;
 
-import com.google.common.io.Closeables;
 import com.puppycrawl.tools.checkstyle.AbstractPathTestSupport;
+import com.puppycrawl.tools.checkstyle.utils.CommonUtils;
 
 @RunWith(PowerMockRunner.class)
-@PrepareForTest(Closeables.class)
+@PrepareForTest(CommonUtils.class)
 public class FileTextTest extends AbstractPathTestSupport {
     @Override
     protected String getPackageLocation() {
@@ -67,9 +67,9 @@
     @Test
     public void testSupportedCharset() throws IOException {
         //check if reader finally closed
-        mockStatic(Closeables.class);
-        doNothing().when(Closeables.class);
-        Closeables.closeQuietly(any(Reader.class));
+        mockStatic(CommonUtils.class);
+        doNothing().when(CommonUtils.class);
+        CommonUtils.close(any(Reader.class));
 
         final String charsetName = StandardCharsets.ISO_8859_1.name();
         final FileText fileText = new FileText(new File(getPath("InputFileTextImportControl.xml")),
@@ -77,7 +77,7 @@
         assertEquals("Invalid charset name", charsetName, fileText.getCharset().name());
 
         verifyStatic(times(2));
-        Closeables.closeQuietly(any(Reader.class));
+        CommonUtils.close(any(Reader.class));
     }
 
     @Test
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/api/FilterSetTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/api/FilterSetTest.java
index d66e436..73dc5de 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/api/FilterSetTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/api/FilterSetTest.java
@@ -27,7 +27,6 @@
 import com.puppycrawl.tools.checkstyle.filters.SeverityMatchFilter;
 import nl.jqno.equalsverifier.EqualsVerifier;
 
-/** Tests SuppressElementFilter. */
 public class FilterSetTest {
     @Test
     public void testEqualsAndHashCode() {
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/NewlineAtEndOfFileCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/NewlineAtEndOfFileCheckTest.java
index d930caa..f77c8cb 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/NewlineAtEndOfFileCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/NewlineAtEndOfFileCheckTest.java
@@ -80,7 +80,7 @@
 
     /**
      * Pitest requires all closes of streams and readers to be verified. Using PowerMock
-     * is almost only posibility to check it without rewriting production code.
+     * is almost only possibility to check it without rewriting production code.
      *
      * @throws Exception when code tested throws some exception
      */
@@ -230,7 +230,7 @@
         final File impossibleFile = new File("");
         final FileText fileText = new FileText(impossibleFile, lines);
         final Set<LocalizedMessage> messages = check.process(impossibleFile, fileText);
-        assertEquals("Ammount of messages is unexpected",
+        assertEquals("Amount of messages is unexpected",
                 1, messages.size());
         final Iterator<LocalizedMessage> iterator = messages.iterator();
         assertEquals("Violation message differs from expected",
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/SuppressWarningsHolderTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/SuppressWarningsHolderTest.java
index 25640ca..a594c3d 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/SuppressWarningsHolderTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/SuppressWarningsHolderTest.java
@@ -85,9 +85,9 @@
 
     @Test
     public void testGetDefaultAlias() {
-        assertEquals("Diffault alias differs from expected",
+        assertEquals("Default alias differs from expected",
                 "somename", SuppressWarningsHolder.getDefaultAlias("SomeName"));
-        assertEquals("Diffault alias differs from expected",
+        assertEquals("Default alias differs from expected",
                 "somename", SuppressWarningsHolder.getDefaultAlias("SomeNameCheck"));
     }
 
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/TrailingCommentCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/TrailingCommentCheckTest.java
index 2aafd1e..c1b6aec 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/TrailingCommentCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/TrailingCommentCheckTest.java
@@ -80,6 +80,27 @@
     }
 
     @Test
+    public void testFormat() throws Exception {
+        final DefaultConfiguration checkConfig = createModuleConfig(TrailingCommentCheck.class);
+        checkConfig.addAttribute("format", "NOT MATCH");
+        final String[] expected = {
+            "4: " + getCheckMessage(MSG_KEY),
+            "5: " + getCheckMessage(MSG_KEY),
+            "6: " + getCheckMessage(MSG_KEY),
+            "7: " + getCheckMessage(MSG_KEY),
+            "8: " + getCheckMessage(MSG_KEY),
+            "13: " + getCheckMessage(MSG_KEY),
+            "14: " + getCheckMessage(MSG_KEY),
+            "15: " + getCheckMessage(MSG_KEY),
+            "18: " + getCheckMessage(MSG_KEY),
+            "19: " + getCheckMessage(MSG_KEY),
+            "26: " + getCheckMessage(MSG_KEY),
+            "29: " + getCheckMessage(MSG_KEY),
+        };
+        verify(checkConfig, getPath("InputTrailingComment.java"), expected);
+    }
+
+    @Test
     public void testCallVisitToken() {
         final TrailingCommentCheck check = new TrailingCommentCheck();
         try {
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/TranslationCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/TranslationCheckTest.java
index 408ec6f..9395843 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/TranslationCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/TranslationCheckTest.java
@@ -57,7 +57,7 @@
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.io.Closeables;
-import com.puppycrawl.tools.checkstyle.AbstractModuleTestSupport;
+import com.puppycrawl.tools.checkstyle.AbstractXmlTestSupport;
 import com.puppycrawl.tools.checkstyle.Checker;
 import com.puppycrawl.tools.checkstyle.DefaultConfiguration;
 import com.puppycrawl.tools.checkstyle.XMLLogger;
@@ -68,11 +68,12 @@
 import com.puppycrawl.tools.checkstyle.api.MessageDispatcher;
 import com.puppycrawl.tools.checkstyle.api.SeverityLevel;
 import com.puppycrawl.tools.checkstyle.api.SeverityLevelCounter;
+import com.puppycrawl.tools.checkstyle.internal.utils.XmlUtil;
 import com.puppycrawl.tools.checkstyle.utils.CommonUtils;
 
 @RunWith(PowerMockRunner.class)
 @PrepareForTest(Closeables.class)
-public class TranslationCheckTest extends AbstractModuleTestSupport {
+public class TranslationCheckTest extends AbstractXmlTestSupport {
     @Captor
     private ArgumentCaptor<SortedSet<LocalizedMessage>> captor;
 
@@ -144,6 +145,7 @@
         checkConfig.addAttribute("requiredTranslations", "ja,de");
         checkConfig.addAttribute("baseName", "^InputTranslation.*$");
         final Checker checker = createChecker(checkConfig);
+        checker.setBasedir(getPath(""));
         final ByteArrayOutputStream out = new ByteArrayOutputStream();
         final XMLLogger logger = new XMLLogger(out, AutomaticBean.OutputStreamOptions.NONE);
         checker.addListener(logger);
@@ -162,8 +164,21 @@
         final String secondErrorMessage = getCheckMessage(MSG_KEY, "anotherKey");
 
         verify(checker, propertyFiles, ImmutableMap.of(
-            getPath(""), Collections.singletonList(line + firstErrorMessage),
-            translationProps, Collections.singletonList(line + secondErrorMessage)));
+            ":0", Collections.singletonList(" " + firstErrorMessage),
+            "InputTranslationCheckFireErrors_de.properties",
+                Collections.singletonList(line + secondErrorMessage)));
+
+        verifyXml(getPath("ExpectedTranslationLog.xml"), out, (expected, actual) -> {
+            // order is not always maintained here for an unknown reason.
+            // File names can appear in different orders depending on the OS and VM.
+            // This ensures we pick up the correct file based on its name and the
+            // number of children it has.
+            return !"file".equals(expected.getNodeName())
+                    || expected.getAttributes().getNamedItem("name").getNodeValue()
+                            .equals(actual.getAttributes().getNamedItem("name").getNodeValue())
+                    && XmlUtil.getChildrenElements(expected).size() == XmlUtil
+                            .getChildrenElements(actual).size();
+        }, firstErrorMessage, secondErrorMessage);
     }
 
     @Test
@@ -369,7 +384,7 @@
 
     /**
      * Pitest requires all closes of streams and readers to be verified. Using PowerMock
-     * is almost only posibility to check it without rewriting production code.
+     * is almost only possibility to check it without rewriting production code.
      *
      * @throws Exception when code tested throws some exception
      */
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/UniquePropertiesCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/UniquePropertiesCheckTest.java
index 4af4916..65bf7e6 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/UniquePropertiesCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/UniquePropertiesCheckTest.java
@@ -54,9 +54,6 @@
 import com.puppycrawl.tools.checkstyle.api.LocalizedMessage;
 import com.puppycrawl.tools.checkstyle.utils.CommonUtils;
 
-/**
- * JUnit tests for Unique Properties check.
- */
 @RunWith(PowerMockRunner.class)
 @PrepareForTest(Closeables.class)
 public class UniquePropertiesCheckTest extends AbstractModuleTestSupport {
@@ -95,7 +92,7 @@
 
     /**
      * Pitest requires all closes of streams and readers to be verified. Using PowerMock
-     * is almost only posibility to check it without rewriting production code.
+     * is almost only possibility to check it without rewriting production code.
      *
      * @throws Exception when code tested throws some exception
      */
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/blocks/EmptyCatchBlockCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/blocks/EmptyCatchBlockCheckTest.java
index de62224..9934f90 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/blocks/EmptyCatchBlockCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/blocks/EmptyCatchBlockCheckTest.java
@@ -28,11 +28,6 @@
 import com.puppycrawl.tools.checkstyle.DefaultConfiguration;
 import com.puppycrawl.tools.checkstyle.api.TokenTypes;
 
-/**
- *
- * @author <a href="mailto:nesterenko-aleksey@list.ru">Aleksey Nesterenko</a>
- *
- */
 public class EmptyCatchBlockCheckTest extends AbstractModuleTestSupport {
     @Override
     protected String getPackageLocation() {
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/ExplicitInitializationCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/ExplicitInitializationCheckTest.java
index 2a08720..c19a4de 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/ExplicitInitializationCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/ExplicitInitializationCheckTest.java
@@ -72,7 +72,7 @@
     }
 
     @Test
-    public void testonlyObjectReferences() throws Exception {
+    public void testOnlyObjectReferences() throws Exception {
         final DefaultConfiguration checkConfig =
             createModuleConfig(ExplicitInitializationCheck.class);
         checkConfig.addAttribute("onlyObjectReferences", "true");
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/FallThroughCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/FallThroughCheckTest.java
index 78113a1..d35d928 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/FallThroughCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/FallThroughCheckTest.java
@@ -53,7 +53,9 @@
             "424:9: " + getCheckMessage(MSG_FALL_THROUGH),
             "436:9: " + getCheckMessage(MSG_FALL_THROUGH),
             "446:9: " + getCheckMessage(MSG_FALL_THROUGH),
-
+            "555:9: " + getCheckMessage(MSG_FALL_THROUGH),
+            "556:9: " + getCheckMessage(MSG_FALL_THROUGH),
+            "557:9: " + getCheckMessage(MSG_FALL_THROUGH),
         };
         verify(checkConfig,
                getPath("InputFallThrough.java"),
@@ -82,6 +84,9 @@
             "424:9: " + getCheckMessage(MSG_FALL_THROUGH),
             "436:9: " + getCheckMessage(MSG_FALL_THROUGH),
             "446:9: " + getCheckMessage(MSG_FALL_THROUGH),
+            "555:9: " + getCheckMessage(MSG_FALL_THROUGH),
+            "556:9: " + getCheckMessage(MSG_FALL_THROUGH),
+            "557:9: " + getCheckMessage(MSG_FALL_THROUGH),
         };
         verify(checkConfig,
                getPath("InputFallThrough.java"),
@@ -133,6 +138,9 @@
             "507:9: " + getCheckMessage(MSG_FALL_THROUGH),
             "514:9: " + getCheckMessage(MSG_FALL_THROUGH),
             "546:12: " + getCheckMessage(MSG_FALL_THROUGH),
+            "555:9: " + getCheckMessage(MSG_FALL_THROUGH),
+            "556:9: " + getCheckMessage(MSG_FALL_THROUGH),
+            "557:9: " + getCheckMessage(MSG_FALL_THROUGH),
         };
         verify(checkConfig,
                getPath("InputFallThrough.java"),
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/IllegalTokenTextCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/IllegalTokenTextCheckTest.java
index a18cfb6..6898432 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/IllegalTokenTextCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/IllegalTokenTextCheckTest.java
@@ -23,6 +23,7 @@
 
 import java.util.Arrays;
 import java.util.List;
+import java.util.regex.Pattern;
 
 import org.junit.Assert;
 import org.junit.Test;
@@ -30,6 +31,7 @@
 import com.puppycrawl.tools.checkstyle.AbstractModuleTestSupport;
 import com.puppycrawl.tools.checkstyle.DefaultConfiguration;
 import com.puppycrawl.tools.checkstyle.api.TokenTypes;
+import com.puppycrawl.tools.checkstyle.internal.utils.TestUtil;
 import com.puppycrawl.tools.checkstyle.utils.TokenUtils;
 
 public class IllegalTokenTextCheckTest
@@ -123,6 +125,19 @@
     }
 
     @Test
+    public void testOrderOfProperties() throws Exception {
+        // pure class must be used as configuration doesn't guarantee order of
+        // attributes
+        final IllegalTokenTextCheck check = new IllegalTokenTextCheck();
+        check.setFormat("test");
+        check.setIgnoreCase(true);
+        final Pattern actual = (Pattern) TestUtil.getClassDeclaredField(
+                IllegalTokenTextCheck.class, "regexp").get(check);
+        Assert.assertEquals("should match", Pattern.CASE_INSENSITIVE, actual.flags());
+        Assert.assertEquals("should match", "test", actual.pattern());
+    }
+
+    @Test
     public void testAcceptableTokensMakeSense() {
         final int expectedTokenTypesTotalNumber = 169;
         Assert.assertEquals("Total number of TokenTypes has changed, acceptable tokens in"
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/IllegalTypeCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/IllegalTypeCheckTest.java
index ee10c28..59fa281 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/IllegalTypeCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/IllegalTypeCheckTest.java
@@ -82,6 +82,7 @@
                 "com.puppycrawl.tools.checkstyle.checks.coding.illegaltype."
                     + "InputIllegalType.AbstractClass"),
             "16:13: " + getCheckMessage(MSG_KEY, "java.util.TreeSet"),
+            "25:36: " + getCheckMessage(MSG_KEY, "java.util.TreeSet"),
         };
 
         verify(checkConfig, getPath("InputIllegalType.java"), expected);
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/ModifiedControlVariableCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/ModifiedControlVariableCheckTest.java
index 2d891ff..b5b851f 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/ModifiedControlVariableCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/ModifiedControlVariableCheckTest.java
@@ -57,6 +57,7 @@
             "56:14: " + getCheckMessage(MSG_KEY, "m"),
             "67:15: " + getCheckMessage(MSG_KEY, "i"),
             "68:15: " + getCheckMessage(MSG_KEY, "k"),
+            "78:15: " + getCheckMessage(MSG_KEY, "v"),
         };
         verify(checkConfig, getPath("InputModifiedControlVariableBothForLoops.java"), expected);
     }
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/MultipleVariableDeclarationsCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/MultipleVariableDeclarationsCheckTest.java
index 41caf84..fc537ab 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/MultipleVariableDeclarationsCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/MultipleVariableDeclarationsCheckTest.java
@@ -46,6 +46,9 @@
             "9:9: " + getCheckMessage(MSG_MULTIPLE),
             "13:5: " + getCheckMessage(MSG_MULTIPLE),
             "16:5: " + getCheckMessage(MSG_MULTIPLE),
+            "35:9: " + getCheckMessage(MSG_MULTIPLE),
+            "35:31: " + getCheckMessage(MSG_MULTIPLE),
+            "35:44: " + getCheckMessage(MSG_MULTIPLE),
         };
 
         verify(checkConfig,
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/NestedForDepthCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/NestedForDepthCheckTest.java
index 5ca5221..04cd3e5 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/NestedForDepthCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/NestedForDepthCheckTest.java
@@ -28,10 +28,6 @@
 import com.puppycrawl.tools.checkstyle.DefaultConfiguration;
 import com.puppycrawl.tools.checkstyle.utils.CommonUtils;
 
-/**
- * The unit-test for the {@code NestedForDepthCheck}-checkstyle enhancement.
- * @see NestedForDepthCheck
- */
 public class NestedForDepthCheckTest extends AbstractModuleTestSupport {
     @Override
     protected String getPackageLocation() {
@@ -56,6 +52,7 @@
         final String[] expected = {
             "43:11: " + getCheckMessage(MSG_KEY, 3, 2),
             "44:13: " + getCheckMessage(MSG_KEY, 4, 2),
+            "47:13: " + getCheckMessage(MSG_KEY, 4, 2),
         };
 
         verify(checkConfig, getPath("InputNestedForDepth.java"),
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/NoCloneCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/NoCloneCheckTest.java
index 89df6c0..5aae2c1 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/NoCloneCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/NoCloneCheckTest.java
@@ -27,9 +27,6 @@
 import com.puppycrawl.tools.checkstyle.AbstractModuleTestSupport;
 import com.puppycrawl.tools.checkstyle.DefaultConfiguration;
 
-/**
- * NoCloneCheck test.
- */
 public class NoCloneCheckTest
     extends AbstractModuleTestSupport {
     @Override
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/RequireThisCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/RequireThisCheckTest.java
index 48fe463..83b7dac 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/RequireThisCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/RequireThisCheckTest.java
@@ -22,6 +22,7 @@
 import static com.puppycrawl.tools.checkstyle.checks.coding.RequireThisCheck.MSG_METHOD;
 import static com.puppycrawl.tools.checkstyle.checks.coding.RequireThisCheck.MSG_VARIABLE;
 
+import java.lang.reflect.Constructor;
 import java.util.SortedSet;
 
 import org.junit.Assert;
@@ -33,6 +34,7 @@
 import com.puppycrawl.tools.checkstyle.api.DetailAST;
 import com.puppycrawl.tools.checkstyle.api.LocalizedMessage;
 import com.puppycrawl.tools.checkstyle.api.TokenTypes;
+import com.puppycrawl.tools.checkstyle.internal.utils.TestUtil;
 import com.puppycrawl.tools.checkstyle.utils.CommonUtils;
 
 public class RequireThisCheckTest extends AbstractModuleTestSupport {
@@ -58,6 +60,11 @@
             "121:13: " + getCheckMessage(MSG_METHOD, "instanceMethod", "Issue2240."),
             "122:13: " + getCheckMessage(MSG_VARIABLE, "i", "Issue2240."),
             "134:9: " + getCheckMessage(MSG_METHOD, "foo", ""),
+            "142:9: " + getCheckMessage(MSG_VARIABLE, "s", ""),
+            "168:16: " + getCheckMessage(MSG_VARIABLE, "a", ""),
+            "168:20: " + getCheckMessage(MSG_VARIABLE, "a", ""),
+            "174:16: " + getCheckMessage(MSG_VARIABLE, "b", ""),
+            "174:20: " + getCheckMessage(MSG_VARIABLE, "b", ""),
         };
         verify(checkConfig,
                getPath("InputRequireThisEnumInnerClassesAndBugs.java"),
@@ -95,6 +102,11 @@
             "113:9: " + getCheckMessage(MSG_VARIABLE, "i", ""),
             "114:9: " + getCheckMessage(MSG_VARIABLE, "i", ""),
             "122:13: " + getCheckMessage(MSG_VARIABLE, "i", "Issue2240."),
+            "142:9: " + getCheckMessage(MSG_VARIABLE, "s", ""),
+            "168:16: " + getCheckMessage(MSG_VARIABLE, "a", ""),
+            "168:20: " + getCheckMessage(MSG_VARIABLE, "a", ""),
+            "174:16: " + getCheckMessage(MSG_VARIABLE, "b", ""),
+            "174:20: " + getCheckMessage(MSG_VARIABLE, "b", ""),
         };
         verify(checkConfig,
                getPath("InputRequireThisEnumInnerClassesAndBugs.java"),
@@ -260,7 +272,7 @@
         final String[] expected = {
             "15:9: " + getCheckMessage(MSG_VARIABLE, "tags", ""),
         };
-        verify(checkConfig, getPath("InputRequireThisMetodReferences.java"), expected);
+        verify(checkConfig, getPath("InputRequireThisMethodReferences.java"), expected);
     }
 
     @Test
@@ -294,6 +306,43 @@
     }
 
     @Test
+    public void testCatchVariables() throws Exception {
+        final DefaultConfiguration checkConfig = createModuleConfig(RequireThisCheck.class);
+        checkConfig.addAttribute("validateOnlyOverlapping", "false");
+        final String[] expected = {
+            "29:21: " + getCheckMessage(MSG_VARIABLE, "ex", ""),
+        };
+        verify(checkConfig, getPath("InputRequireThisCatchVariables.java"), expected);
+    }
+
+    @Test
+    public void testEnumConstant() throws Exception {
+        final DefaultConfiguration checkConfig = createModuleConfig(RequireThisCheck.class);
+        checkConfig.addAttribute("validateOnlyOverlapping", "false");
+        final String[] expected = CommonUtils.EMPTY_STRING_ARRAY;
+        verify(checkConfig, getPath("InputRequireThisEnumConstant.java"), expected);
+    }
+
+    @Test
+    public void testAnnotationInterface() throws Exception {
+        final DefaultConfiguration checkConfig = createModuleConfig(RequireThisCheck.class);
+        checkConfig.addAttribute("validateOnlyOverlapping", "false");
+        final String[] expected = CommonUtils.EMPTY_STRING_ARRAY;
+        verify(checkConfig, getPath("InputRequireThisAnnotationInterface.java"), expected);
+    }
+
+    @Test
+    public void testFor() throws Exception {
+        final DefaultConfiguration checkConfig = createModuleConfig(RequireThisCheck.class);
+        checkConfig.addAttribute("validateOnlyOverlapping", "false");
+        final String[] expected = {
+            "13:13: " + getCheckMessage(MSG_VARIABLE, "bottom", ""),
+            "21:34: " + getCheckMessage(MSG_VARIABLE, "name", ""),
+        };
+        verify(checkConfig, getPath("InputRequireThisFor.java"), expected);
+    }
+
+    @Test
     public void test() throws Exception {
         final DefaultConfiguration checkConfig = createModuleConfig(RequireThisCheck.class);
         final String[] expected = CommonUtils.EMPTY_STRING_ARRAY;
@@ -307,4 +356,18 @@
         final String[] expected = CommonUtils.EMPTY_STRING_ARRAY;
         verify(checkConfig, getPath("InputRequireThisExtendedMethod.java"), expected);
     }
+
+    @Test
+    public void testUnusedMethod() throws Exception {
+        final DetailAST ident = new DetailAST();
+        ident.setText("testName");
+
+        final Class<?> cls = Class.forName(RequireThisCheck.class.getName() + "$CatchFrame");
+        final Constructor<?> constructor = cls.getDeclaredConstructors()[0];
+        constructor.setAccessible(true);
+        final Object o = constructor.newInstance(null, ident);
+
+        Assert.assertEquals("expected ident token", ident,
+                TestUtil.getClassDeclaredMethod(cls, "getFrameNameIdent").invoke(o));
+    }
 }
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/ReturnCountCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/ReturnCountCheckTest.java
index eccf7ec..6e407a4 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/ReturnCountCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/ReturnCountCheckTest.java
@@ -20,6 +20,7 @@
 package com.puppycrawl.tools.checkstyle.checks.coding;
 
 import static com.puppycrawl.tools.checkstyle.checks.coding.ReturnCountCheck.MSG_KEY;
+import static com.puppycrawl.tools.checkstyle.checks.coding.ReturnCountCheck.MSG_KEY_VOID;
 import static org.junit.Assert.assertTrue;
 
 import java.io.File;
@@ -48,9 +49,9 @@
         final DefaultConfiguration checkConfig =
             createModuleConfig(ReturnCountCheck.class);
         final String[] expected = {
-            "18:5: " + getCheckMessage(MSG_KEY, 7, 1),
-            "30:5: " + getCheckMessage(MSG_KEY, 2, 1),
-            "35:17: " + getCheckMessage(MSG_KEY, 6, 1),
+            "18:5: " + getCheckMessage(MSG_KEY_VOID, 7, 1),
+            "30:5: " + getCheckMessage(MSG_KEY_VOID, 2, 1),
+            "35:17: " + getCheckMessage(MSG_KEY_VOID, 6, 1),
             "49:5: " + getCheckMessage(MSG_KEY, 7, 2),
         };
         verify(checkConfig, getPath("InputReturnCountSwitches.java"), expected);
@@ -63,9 +64,9 @@
         checkConfig.addAttribute("format", "^$");
         final String[] expected = {
             "5:5: " + getCheckMessage(MSG_KEY, 7, 2),
-            "18:5: " + getCheckMessage(MSG_KEY, 7, 1),
-            "30:5: " + getCheckMessage(MSG_KEY, 2, 1),
-            "35:17: " + getCheckMessage(MSG_KEY, 6, 1),
+            "18:5: " + getCheckMessage(MSG_KEY_VOID, 7, 1),
+            "30:5: " + getCheckMessage(MSG_KEY_VOID, 2, 1),
+            "35:17: " + getCheckMessage(MSG_KEY_VOID, 6, 1),
             "49:5: " + getCheckMessage(MSG_KEY, 7, 2),
         };
         verify(checkConfig, getPath("InputReturnCountSwitches.java"), expected);
@@ -146,10 +147,11 @@
         checkConfig.addAttribute("max", "2");
         checkConfig.addAttribute("maxForVoid", "0");
         final String[] expected = {
-            "4:5: " + getCheckMessage(MSG_KEY, 1, 0),
-            "8:5: " + getCheckMessage(MSG_KEY, 1, 0),
-            "14:5: " + getCheckMessage(MSG_KEY, 2, 0),
+            "4:5: " + getCheckMessage(MSG_KEY_VOID, 1, 0),
+            "8:5: " + getCheckMessage(MSG_KEY_VOID, 1, 0),
+            "14:5: " + getCheckMessage(MSG_KEY_VOID, 2, 0),
             "30:5: " + getCheckMessage(MSG_KEY, 3, 2),
+            "41:5: " + getCheckMessage(MSG_KEY_VOID, 2, 0),
         };
         verify(checkConfig, getPath("InputReturnCountVoid.java"), expected);
     }
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/UnnecessaryParenthesesCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/UnnecessaryParenthesesCheckTest.java
index 07de217..038eaf2 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/UnnecessaryParenthesesCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/UnnecessaryParenthesesCheckTest.java
@@ -95,6 +95,8 @@
             "81:11: " + getCheckMessage(MSG_ASSIGN),
             "81:16: " + getCheckMessage(MSG_LITERAL, "3"),
             "82:39: " + getCheckMessage(MSG_ASSIGN),
+            "93:11: " + getCheckMessage(MSG_ASSIGN),
+            "93:14: " + getCheckMessage(MSG_STRING, "\"12345678901234567890123\""),
         };
 
         verify(checkConfig, getPath("InputUnnecessaryParenthesesOperatorsAndCasts.java"), expected);
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/VariableDeclarationUsageDistanceCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/VariableDeclarationUsageDistanceCheckTest.java
index 7e17610..5e54ba7 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/VariableDeclarationUsageDistanceCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/VariableDeclarationUsageDistanceCheckTest.java
@@ -27,6 +27,7 @@
 
 import com.puppycrawl.tools.checkstyle.AbstractModuleTestSupport;
 import com.puppycrawl.tools.checkstyle.DefaultConfiguration;
+import com.puppycrawl.tools.checkstyle.utils.CommonUtils;
 
 public class VariableDeclarationUsageDistanceCheckTest extends
         AbstractModuleTestSupport {
@@ -76,6 +77,7 @@
             "891: " + getCheckMessage(MSG_KEY, "a", 4, 1),
             "901: " + getCheckMessage(MSG_KEY, "a", 4, 1),
             "967: " + getCheckMessage(MSG_KEY, "a", 4, 1),
+            "978: " + getCheckMessage(MSG_KEY, "a", 2, 1),
         };
         verify(checkConfig, getPath("InputVariableDeclarationUsageDistance.java"), expected);
     }
@@ -170,6 +172,7 @@
             "505: " + getCheckMessage(MSG_KEY, "files", 2, 1),
             "540: " + getCheckMessage(MSG_KEY, "id", 2, 1),
             "542: " + getCheckMessage(MSG_KEY, "parentId", 4, 1),
+            "978: " + getCheckMessage(MSG_KEY, "a", 2, 1),
         };
         verify(checkConfig, getPath("InputVariableDeclarationUsageDistance.java"), expected);
     }
@@ -239,7 +242,27 @@
             "542: " + getCheckMessage(MSG_KEY_EXT, "parentId", 4, 3),
         };
 
-        createChecker(checkConfig);
         verify(checkConfig, getPath("InputVariableDeclarationUsageDistance.java"), expected);
     }
+
+    @Test
+    public void testAnonymousClass() throws Exception {
+        final DefaultConfiguration checkConfig =
+            createModuleConfig(VariableDeclarationUsageDistanceCheck.class);
+        final String[] expected = {
+            "9: " + getCheckMessage(MSG_KEY_EXT, "prefs", 4, 3),
+        };
+
+        verify(checkConfig, getPath("InputVariableDeclarationUsageDistanceAnonymous.java"),
+                expected);
+    }
+
+    @Test
+    public void testLabels() throws Exception {
+        final DefaultConfiguration checkConfig =
+            createModuleConfig(VariableDeclarationUsageDistanceCheck.class);
+        final String[] expected = CommonUtils.EMPTY_STRING_ARRAY;
+
+        verify(checkConfig, getPath("InputVariableDeclarationUsageDistanceLabels.java"), expected);
+    }
 }
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/design/ThrowsCountCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/design/ThrowsCountCheckTest.java
index 435c530..2979869 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/design/ThrowsCountCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/design/ThrowsCountCheckTest.java
@@ -114,6 +114,6 @@
         final String[] expected = {
             "18:26: " + getCheckMessage(MSG_KEY, 5, 4),
         };
-        verify(checkConfig, getPath("InputThrowsCountMwthodWithAnnotation.java"), expected);
+        verify(checkConfig, getPath("InputThrowsCountMethodWithAnnotation.java"), expected);
     }
 }
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/design/VisibilityModifierCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/design/VisibilityModifierCheckTest.java
index 571f9fa..eab6ec9 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/design/VisibilityModifierCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/design/VisibilityModifierCheckTest.java
@@ -450,7 +450,7 @@
      * class with name "", but in this case internal collection will have short names
      * as "" that will not make problems, but will be weird in debug.
      *
-     * @throws Exception when exception occured during execution.
+     * @throws Exception when exception occurred during execution.
      */
     @Test
     public void testIsStarImportNullAst() throws Exception {
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/header/HeaderCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/header/HeaderCheckTest.java
index 8db53f0..f82d75a 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/header/HeaderCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/header/HeaderCheckTest.java
@@ -88,9 +88,9 @@
     }
 
     @Test
-    public void testNonExistingHeaderFile() throws Exception {
+    public void testNonExistentHeaderFile() throws Exception {
         final DefaultConfiguration checkConfig = createModuleConfig(HeaderCheck.class);
-        checkConfig.addAttribute("headerFile", getPath("nonExisting.file"));
+        checkConfig.addAttribute("headerFile", getPath("nonExistent.file"));
         try {
             createChecker(checkConfig);
             fail("CheckstyleException is expected");
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/imports/AccessResultTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/imports/AccessResultTest.java
index 7ef2abd..aae8313 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/imports/AccessResultTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/imports/AccessResultTest.java
@@ -48,6 +48,6 @@
             AccessResult.DISALLOWED,
             AccessResult.UNKNOWN,
         };
-        assertArrayEquals("Invalid aaccess result values", expected, actual);
+        assertArrayEquals("Invalid access result values", expected, actual);
     }
 }
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/imports/CustomImportOrderCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/imports/CustomImportOrderCheckTest.java
index 2975913..1aa1e08 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/imports/CustomImportOrderCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/imports/CustomImportOrderCheckTest.java
@@ -29,11 +29,13 @@
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+import java.io.File;
 import java.lang.reflect.Method;
 
 import org.junit.Test;
 
 import com.puppycrawl.tools.checkstyle.AbstractModuleTestSupport;
+import com.puppycrawl.tools.checkstyle.Checker;
 import com.puppycrawl.tools.checkstyle.DefaultConfiguration;
 import com.puppycrawl.tools.checkstyle.api.CheckstyleException;
 import com.puppycrawl.tools.checkstyle.api.DetailAST;
@@ -336,6 +338,59 @@
     }
 
     @Test
+    public void testCompareImports() throws Exception {
+        final DefaultConfiguration checkConfig =
+            createModuleConfig(CustomImportOrderCheck.class);
+        checkConfig.addAttribute("specialImportsRegExp", "com");
+        checkConfig.addAttribute("sortImportsInGroupAlphabetically", "true");
+        checkConfig.addAttribute("customImportOrderRules",
+            "STANDARD_JAVA_PACKAGE###SPECIAL_IMPORTS");
+        final String[] expected = {
+            "4: " + getCheckMessage(MSG_LEX, "java.util.Map",
+                "java.util.Map.Entry"),
+        };
+
+        verify(checkConfig, getPath("InputCustomImportOrderCompareImports.java"), expected);
+    }
+
+    @Test
+    public void testFindBetterPatternMatch() throws Exception {
+        final DefaultConfiguration checkConfig =
+            createModuleConfig(CustomImportOrderCheck.class);
+        checkConfig.addAttribute("standardPackageRegExp", "java|javax|event.*");
+        checkConfig.addAttribute("specialImportsRegExp", "An|lang|java|collect|event");
+        checkConfig.addAttribute("thirdPartyPackageRegExp", "com");
+        checkConfig.addAttribute("separateLineBetweenGroups", "true");
+        checkConfig.addAttribute("customImportOrderRules",
+            "STANDARD_JAVA_PACKAGE###SPECIAL_IMPORTS###THIRD_PARTY_PACKAGE");
+        final String[] expected = {
+            "8: " + getCheckMessage(MSG_ORDER, THIRD, SPECIAL,
+                "com.google.common.annotations.Beta"),
+        };
+
+        verify(checkConfig, getPath("InputCustomImportOrderFindBetterPatternMatch.java"), expected);
+    }
+
+    @Test
+    public void testBeginTreeClear() throws Exception {
+        final DefaultConfiguration checkConfig =
+            createModuleConfig(CustomImportOrderCheck.class);
+        checkConfig.addAttribute("specialImportsRegExp", "com");
+        checkConfig.addAttribute("separateLineBetweenGroups", "false");
+        checkConfig.addAttribute("customImportOrderRules",
+            "STANDARD_JAVA_PACKAGE###SPECIAL_IMPORTS");
+        final String[] expected = CommonUtils.EMPTY_STRING_ARRAY;
+        final Checker checker = createChecker(checkConfig);
+        final String fileName1 = getPath("InputCustomImportOrderImportsContainingJava.java");
+        final String fileName2 = getPath("InputCustomImportOrderNoValid.java");
+        final File[] files = {
+            new File(fileName1),
+            new File(fileName2),
+        };
+        verify(checker, files, fileName1, expected);
+    }
+
+    @Test
     public void testImportsContainingJava() throws Exception {
         final DefaultConfiguration checkConfig = createModuleConfig(CustomImportOrderCheck.class);
         checkConfig.addAttribute("customImportOrderRules",
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/imports/IllegalImportCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/imports/IllegalImportCheckTest.java
index 902dcbf..dd44916 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/imports/IllegalImportCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/imports/IllegalImportCheckTest.java
@@ -112,7 +112,7 @@
     }
 
     @Test
-    public void testIllegalClassessRegularExpression()
+    public void testIllegalClassesRegularExpression()
             throws Exception {
         final DefaultConfiguration checkConfig =
                 createModuleConfig(IllegalImportCheck.class);
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/imports/ImportControlCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/imports/ImportControlCheckTest.java
index 5fab0d1..6cd86d2 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/imports/ImportControlCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/imports/ImportControlCheckTest.java
@@ -349,7 +349,7 @@
         // One more time to use cache.
         verify(checkerConfig, filePath, expected);
 
-        assertTrue("External resourse is not present in cache",
+        assertTrue("External resource is not present in cache",
                 new String(Files.readAllBytes(cacheFile.toPath()),
                         StandardCharsets.UTF_8).contains("InputImportControlOneRegExp.xml"));
     }
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/imports/ImportControlTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/imports/ImportControlTest.java
index ded4f34..7a92cc5 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/imports/ImportControlTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/imports/ImportControlTest.java
@@ -68,92 +68,92 @@
 
     @Test
     public void testLocateFinest() {
-        assertEquals("Unxpected response", icRoot, icRoot
+        assertEquals("Unexpected response", icRoot, icRoot
                 .locateFinest("com.kazgroup.courtlink.domain"));
-        assertEquals("Unxpected response", icCommon, icRoot
+        assertEquals("Unexpected response", icCommon, icRoot
                 .locateFinest("com.kazgroup.courtlink.common.api"));
-        assertNull("Unxpected response", icRoot.locateFinest("com"));
+        assertNull("Unexpected response", icRoot.locateFinest("com"));
     }
 
     @Test
     public void testEnsureTrailingDot() {
-        assertNull("Unxpected response", icRoot.locateFinest("com.kazgroup.courtlinkkk"));
-        assertNull("Unxpected response",
+        assertNull("Unexpected response", icRoot.locateFinest("com.kazgroup.courtlinkkk"));
+        assertNull("Unexpected response",
                 icRoot.locateFinest("com.kazgroup.courtlink/common.api"));
     }
 
     @Test
     public void testCheckAccess() {
-        assertEquals("Unxpected access result", AccessResult.DISALLOWED, icCommon.checkAccess(
+        assertEquals("Unexpected access result", AccessResult.DISALLOWED, icCommon.checkAccess(
                 "com.kazgroup.courtlink.common",
                 "org.springframework.something"));
-        assertEquals("Unxpected access result", AccessResult.ALLOWED, icCommon
+        assertEquals("Unexpected access result", AccessResult.ALLOWED, icCommon
                 .checkAccess("com.kazgroup.courtlink.common",
                         "org.apache.commons.something"));
-        assertEquals("Unxpected access result", AccessResult.DISALLOWED, icCommon.checkAccess(
+        assertEquals("Unexpected access result", AccessResult.DISALLOWED, icCommon.checkAccess(
                 "com.kazgroup.courtlink.common", "org.apache.commons"));
-        assertEquals("Unxpected access result", AccessResult.ALLOWED, icCommon.checkAccess(
+        assertEquals("Unexpected access result", AccessResult.ALLOWED, icCommon.checkAccess(
                 "com.kazgroup.courtlink.common", "org.hibernate.something"));
-        assertEquals("Unxpected access result", AccessResult.DISALLOWED, icCommon.checkAccess(
+        assertEquals("Unexpected access result", AccessResult.DISALLOWED, icCommon.checkAccess(
                 "com.kazgroup.courtlink.common", "com.badpackage.something"));
-        assertEquals("Unxpected access result", AccessResult.DISALLOWED, icRoot.checkAccess(
+        assertEquals("Unexpected access result", AccessResult.DISALLOWED, icRoot.checkAccess(
                 "com.kazgroup.courtlink", "org.hibernate.something"));
     }
 
     @Test
     public void testUnknownPkg() {
-        assertNull("Unxpected response", icRoot.locateFinest("net.another"));
+        assertNull("Unexpected response", icRoot.locateFinest("net.another"));
     }
 
     @Test
     public void testRegExpChildLocateFinest() {
-        assertEquals("Unxpected response", icRootRegexpChild, icRootRegexpChild
+        assertEquals("Unexpected response", icRootRegexpChild, icRootRegexpChild
                 .locateFinest("com.kazgroup.courtlink.domain"));
-        assertEquals("Unxpected response", icCommonRegexpChild, icRootRegexpChild
+        assertEquals("Unexpected response", icCommonRegexpChild, icRootRegexpChild
                 .locateFinest("com.kazgroup.courtlink.common.api"));
-        assertNull("Unxpected response", icRootRegexpChild.locateFinest("com"));
+        assertNull("Unexpected response", icRootRegexpChild.locateFinest("com"));
     }
 
     @Test
     public void testRegExpChildCheckAccess() {
-        assertEquals("Unxpected access result", AccessResult.DISALLOWED,
+        assertEquals("Unexpected access result", AccessResult.DISALLOWED,
                 icCommonRegexpChild.checkAccess("com.kazgroup.courtlink.common",
                         "org.springframework.something"));
-        assertEquals("Unxpected access result", AccessResult.DISALLOWED,
+        assertEquals("Unexpected access result", AccessResult.DISALLOWED,
                 icCommonRegexpChild.checkAccess("com.kazgroup.courtlink.common",
                         "org.luiframework.something"));
-        assertEquals("Unxpected access result", AccessResult.DISALLOWED,
+        assertEquals("Unexpected access result", AccessResult.DISALLOWED,
                 icCommonRegexpChild.checkAccess("com.kazgroup.courtlink.common",
                         "de.springframework.something"));
-        assertEquals("Unxpected access result", AccessResult.DISALLOWED,
+        assertEquals("Unexpected access result", AccessResult.DISALLOWED,
                 icCommonRegexpChild.checkAccess("com.kazgroup.courtlink.common",
                 "de.luiframework.something"));
-        assertEquals("Unxpected access result", AccessResult.ALLOWED,
+        assertEquals("Unexpected access result", AccessResult.ALLOWED,
                 icCommonRegexpChild.checkAccess("com.kazgroup.courtlink.common",
                         "org.apache.commons.something"));
-        assertEquals("Unxpected access result", AccessResult.ALLOWED,
+        assertEquals("Unexpected access result", AccessResult.ALLOWED,
                 icCommonRegexpChild.checkAccess("com.kazgroup.courtlink.common",
                         "org.lui.commons.something"));
-        assertEquals("Unxpected access result", AccessResult.DISALLOWED,
+        assertEquals("Unexpected access result", AccessResult.DISALLOWED,
                 icCommonRegexpChild.checkAccess("com.kazgroup.courtlink.common",
                         "org.apache.commons"));
-        assertEquals("Unxpected access result", AccessResult.DISALLOWED,
+        assertEquals("Unexpected access result", AccessResult.DISALLOWED,
                 icCommonRegexpChild.checkAccess("com.kazgroup.courtlink.common",
                         "org.lui.commons"));
-        assertEquals("Unxpected access result", AccessResult.ALLOWED,
+        assertEquals("Unexpected access result", AccessResult.ALLOWED,
                 icCommonRegexpChild.checkAccess("com.kazgroup.courtlink.common",
                         "org.hibernate.something"));
-        assertEquals("Unxpected access result", AccessResult.DISALLOWED,
+        assertEquals("Unexpected access result", AccessResult.DISALLOWED,
                 icCommonRegexpChild.checkAccess("com.kazgroup.courtlink.common",
                         "com.badpackage.something"));
-        assertEquals("Unxpected access result", AccessResult.DISALLOWED,
+        assertEquals("Unexpected access result", AccessResult.DISALLOWED,
                 icRootRegexpChild.checkAccess("com.kazgroup.courtlink",
                         "org.hibernate.something"));
     }
 
     @Test
     public void testRegExpChildUnknownPkg() {
-        assertNull("Unxpected response", icRootRegexpChild.locateFinest("net.another"));
+        assertNull("Unexpected response", icRootRegexpChild.locateFinest("net.another"));
     }
 
     @Test
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/imports/ImportOrderCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/imports/ImportOrderCheckTest.java
index df5ab75..7d33222 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/imports/ImportOrderCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/imports/ImportOrderCheckTest.java
@@ -133,7 +133,7 @@
             "7: " + getCheckMessage(MSG_SEPARATED_IN_GROUP, "org.junit.Assert.assertEquals"),
         };
 
-        verify(checkConfig, getPath("InputImportOrderStaticGroupSeperated.java"), expected);
+        verify(checkConfig, getPath("InputImportOrderStaticGroupSeparated.java"), expected);
     }
 
     @Test
@@ -409,6 +409,57 @@
     }
 
     @Test
+    public void testStaticGroupsAlphabeticalOrderBottomNegative() throws Exception {
+        final DefaultConfiguration checkConfig =
+            createModuleConfig(ImportOrderCheck.class);
+        checkConfig.addAttribute("option", "bottom");
+        checkConfig.addAttribute("groups", "org, java");
+        checkConfig.addAttribute("separated", "true");
+        checkConfig.addAttribute("sortStaticImportsAlphabetically", "true");
+        final String[] expected = {
+            "8: " + getCheckMessage(MSG_ORDERING, "java.util.Set"),
+        };
+        verify(checkConfig, getPath("InputImportOrderStaticGroupOrderBottom_Negative.java"),
+            expected);
+    }
+
+    /** Tests that a non-static import after a static import correctly gives an
+     * error if order=bottom. */
+
+    @Test
+    public void testStaticGroupsAlphabeticalOrderTopNegative() throws Exception {
+        final DefaultConfiguration checkConfig =
+            createModuleConfig(ImportOrderCheck.class);
+        checkConfig.addAttribute("option", "top");
+        checkConfig.addAttribute("groups", "org, java");
+        checkConfig.addAttribute("separated", "true");
+        checkConfig.addAttribute("sortStaticImportsAlphabetically", "true");
+        final String[] expected = {
+            "5: " + getCheckMessage(MSG_ORDERING, "java.lang.Math.PI"),
+        };
+        verify(checkConfig, getPath("InputImportOrderStaticGroupOrderBottom_Negative.java"),
+            expected);
+    }
+
+    /** Tests that a non-static import before a static import correctly gives an
+     * error if order=top. */
+
+    @Test
+    public void testStaticGroupsAlphabeticalOrderBottomNegative2() throws Exception {
+        final DefaultConfiguration checkConfig =
+            createModuleConfig(ImportOrderCheck.class);
+        checkConfig.addAttribute("option", "bottom");
+        checkConfig.addAttribute("groups", "org, java");
+        checkConfig.addAttribute("separated", "true");
+        checkConfig.addAttribute("sortStaticImportsAlphabetically", "true");
+        final String[] expected = {
+            "8: " + getCheckMessage(MSG_ORDERING, "java.util.Set"),
+        };
+        verify(checkConfig, getPath("InputImportOrderStaticGroupOrderBottom_Negative2.java"),
+            expected);
+    }
+
+    @Test
     public void testStaticGroupsOrderBottom() throws Exception {
         final DefaultConfiguration checkConfig =
             createModuleConfig(ImportOrderCheck.class);
@@ -430,7 +481,7 @@
         final String[] expected = {
             "6: " + getCheckMessage(MSG_ORDERING, "java.awt.event.ActionEvent"),
         };
-        verify(checkConfig, getPath("InputImportOrderRepetiton.java"), expected);
+        verify(checkConfig, getPath("InputImportOrderRepetition.java"), expected);
     }
 
     @Test
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/indentation/CommentsIndentationCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/indentation/CommentsIndentationCheckTest.java
index 11e2948..4102b45 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/indentation/CommentsIndentationCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/indentation/CommentsIndentationCheckTest.java
@@ -31,12 +31,6 @@
 import com.puppycrawl.tools.checkstyle.api.TokenTypes;
 import com.puppycrawl.tools.checkstyle.utils.CommonUtils;
 
-/**
-*
-* @author <a href="mailto:nesterenko-aleksey@list.ru">Aleksey Nesterenko</a>
-* @author <a href="mailto:andreyselkin@gmail.com">Andrei Selkin</a>
-*
-*/
 public class CommentsIndentationCheckTest extends AbstractModuleTestSupport {
 
     @Override
@@ -221,7 +215,7 @@
         }
         catch (IllegalArgumentException ex) {
             final String msg = ex.getMessage();
-            Assert.assertEquals("Invalid excpeton message",
+            Assert.assertEquals("Invalid exception message",
                     "Unexpected token type: methodStub", msg);
         }
     }
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/indentation/IndentationCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/indentation/IndentationCheckTest.java
index 464a8a7..91606fe 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/indentation/IndentationCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/indentation/IndentationCheckTest.java
@@ -1746,6 +1746,39 @@
     }
 
     @Test
+    public void testMethodPrecedeByAnnotationsWithParameterOnSeparateLine() throws Exception {
+        final DefaultConfiguration checkConfig = createModuleConfig(IndentationCheck.class);
+        checkConfig.addAttribute("tabWidth", "4");
+        checkConfig.addAttribute("basicOffset", "2");
+        checkConfig.addAttribute("braceAdjustment", "0");
+        checkConfig.addAttribute("caseIndent", "2");
+        checkConfig.addAttribute("throwsIndent", "4");
+        checkConfig.addAttribute("lineWrappingIndentation", "4");
+        checkConfig.addAttribute("arrayInitIndent", "2");
+        final String fileName =
+            getPath("InputIndentationMethodPrecededByAnnotationWithParameterOnSeparateLine.java");
+        final String[] expected = CommonUtils.EMPTY_STRING_ARRAY;
+        verify(checkConfig, fileName, expected);
+    }
+
+    @Test
+    public void testAnnotationIncorrect() throws Exception {
+        final DefaultConfiguration checkConfig = createModuleConfig(IndentationCheck.class);
+        checkConfig.addAttribute("tabWidth", "4");
+        checkConfig.addAttribute("basicOffset", "4");
+        checkConfig.addAttribute("braceAdjustment", "0");
+        checkConfig.addAttribute("lineWrappingIndentation", "4");
+        final String fileName =
+            getPath("InputIndentationAnnotationIncorrect.java");
+        final String[] expected = {
+            "11: " + getCheckMessage(MSG_ERROR, "(", 4, 8),
+            "14: " + getCheckMessage(MSG_ERROR, "(", 8, 12),
+            "19: " + getCheckMessage(MSG_ERROR, "(", 4, 8),
+        };
+        verify(checkConfig, fileName, expected);
+    }
+
+    @Test
     public void testInputAnnotationScopeIndentationCheck() throws Exception {
         final DefaultConfiguration checkConfig = createModuleConfig(IndentationCheck.class);
         checkConfig.addAttribute("tabWidth", "4");
@@ -1869,10 +1902,10 @@
      * {@link IndentationCheck#MSG_CHILD_ERROR}, {@link IndentationCheck#MSG_CHILD_ERROR_MULTI},
      * {@link IndentationCheck#MSG_CHILD_ERROR_MULTI} are in appropriate order.
      *
-     * In other tests, the argument 0 and text before it are chopped off and only the rest of
+     * <p>In other tests, the argument 0 and text before it are chopped off and only the rest of
      * messages are verified. Therefore, the argument 0 is required to be the first argument in
      * the messages above. If we update the messages in the future, it is required to keep the
-     * arguments in appropriate order to ensure other tests will work.
+     * arguments in appropriate order to ensure other tests will work.</p>
      *
      * @see IndentComment#getExpectedMessagePostfix(String)
      */
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/AbstractJavadocCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/AbstractJavadocCheckTest.java
index 2873e03..40e933c 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/AbstractJavadocCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/AbstractJavadocCheckTest.java
@@ -44,9 +44,8 @@
 import com.puppycrawl.tools.checkstyle.TreeWalker;
 import com.puppycrawl.tools.checkstyle.api.DetailNode;
 import com.puppycrawl.tools.checkstyle.api.JavadocTokenTypes;
-import com.puppycrawl.tools.checkstyle.internal.utils.TestUtil;
-import com.puppycrawl.tools.checkstyle.utils.BlockCommentPosition;
 import com.puppycrawl.tools.checkstyle.utils.CommonUtils;
+import com.puppycrawl.tools.checkstyle.utils.JavadocUtils;
 
 public class AbstractJavadocCheckTest extends AbstractModuleTestSupport {
 
@@ -180,7 +179,7 @@
         final String[] expected = CommonUtils.EMPTY_STRING_ARRAY;
         verify(checkConfig, getPath("InputAbstractJavadocPosition.java"), expected);
         assertEquals("Invalid number of javadocs",
-            58, JavadocCatchCheck.javadocsNumber);
+            65, JavadocCatchCheck.javadocsNumber);
     }
 
     @Test
@@ -192,7 +191,7 @@
         verify(checkConfig,
             getPath("InputAbstractJavadocPositionWithSinglelineComments.java"), expected);
         assertEquals("Invalid number of javadocs",
-                58, JavadocCatchCheck.javadocsNumber);
+                65, JavadocCatchCheck.javadocsNumber);
     }
 
     @Test
@@ -207,12 +206,6 @@
     }
 
     @Test
-    public void testBlockCommentPositionHasPrivateConstr() throws Exception {
-        Assert.assertTrue("Constructor is not private",
-                TestUtil.isUtilsClassHasPrivateConstructor(BlockCommentPosition.class, true));
-    }
-
-    @Test
     public void testTokens() {
         final int[] defaultJavadocTokens = {JavadocTokenTypes.JAVADOC};
         final AbstractJavadocCheck check = new AbstractJavadocCheck() {
@@ -231,7 +224,7 @@
         Assert.assertNotNull("Default tokens should not be null", check.getDefaultTokens());
         Assert.assertArrayEquals("Acceptable tokens should be equal to default",
                 check.getDefaultTokens(), check.getAcceptableTokens());
-        Assert.assertArrayEquals("REquired tokens should be equal to default",
+        Assert.assertArrayEquals("Required tokens should be equal to default",
                 check.getDefaultTokens(), check.getRequiredTokens());
         Assert.assertArrayEquals("Invalid default javadoc tokens",
                 defaultJavadocTokens, check.getDefaultJavadocTokens());
@@ -485,6 +478,9 @@
         @Override
         public void visitJavadocToken(DetailNode ast) {
             assertEquals(ast.toString(), "JAVADOC", ast.getText());
+            final DetailNode text = JavadocUtils.findFirstToken(ast, JavadocTokenTypes.TEXT);
+            Assert.assertNotNull("Empty javadoc text at " + ast, text);
+            assertEquals(ast.toString(), "Javadoc", text.getText());
             javadocsNumber++;
         }
     }
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/ClassResolverTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/ClassResolverTest.java
index c4b20ee..15b36ac 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/ClassResolverTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/ClassResolverTest.java
@@ -150,7 +150,7 @@
             final String expected = "expected exception";
             assertTrue("Invalid exception cause, should be: ClassNotFoundException",
                     ex.getCause() instanceof ClassNotFoundException);
-            assertTrue("Invalid excpetion message, should end with: " + expected,
+            assertTrue("Invalid exception message, should end with: " + expected,
                     ex.getMessage().endsWith(expected));
         }
     }
@@ -158,7 +158,7 @@
     /**
      * This test exists to prevent any possible regression and let of
      * https://github.com/checkstyle/checkstyle/issues/1192 to be persistent
-     * event is not very obvious
+     * event is not very obvious.
      *
      * @throws Exception when smth is not expected
      */
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/JavadocMethodCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/JavadocMethodCheckTest.java
index 1e3c28b..8cf4210 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/JavadocMethodCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/JavadocMethodCheckTest.java
@@ -135,8 +135,10 @@
             "254:8: " + getCheckMessage(MSG_UNUSED_TAG, "@throws", "java.io.FileNotFoundException"),
             "256:28: " + getCheckMessage(MSG_EXPECTED_TAG, "@throws", "IOException"),
             "262:8: " + getCheckMessage(MSG_UNUSED_TAG, "@param", "aParam"),
-            "320:9: " + getCheckMessage(MSG_JAVADOC_MISSING),
-            "329:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
+            "305: " + getCheckMessage(MSG_RETURN_EXPECTED),
+            "305:22: " + getCheckMessage(MSG_EXPECTED_TAG, "@param", "aParam"),
+            "328:9: " + getCheckMessage(MSG_JAVADOC_MISSING),
+            "337:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
         };
 
         verify(checkConfig, getPath("InputJavadocMethodTags.java"), expected);
@@ -171,8 +173,10 @@
             "254:8: " + getCheckMessage(MSG_UNUSED_TAG, "@throws", "java.io.FileNotFoundException"),
             "256:28: " + getCheckMessage(MSG_EXPECTED_TAG, "@throws", "IOException"),
             "262:8: " + getCheckMessage(MSG_UNUSED_TAG, "@param", "aParam"),
-            "320:9: " + getCheckMessage(MSG_JAVADOC_MISSING),
-            "329:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
+            "305: " + getCheckMessage(MSG_RETURN_EXPECTED),
+            "305:22: " + getCheckMessage(MSG_EXPECTED_TAG, "@param", "aParam"),
+            "328:9: " + getCheckMessage(MSG_JAVADOC_MISSING),
+            "337:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
         };
         verify(checkConfig, getPath("InputJavadocMethodTags.java"), expected);
     }
@@ -287,8 +291,10 @@
             "179:8: " + getCheckMessage(MSG_UNUSED_TAG, "@throws", "ArrayStoreException"),
             "256:28: " + getCheckMessage(MSG_EXPECTED_TAG, "@throws", "IOException"),
             "262:8: " + getCheckMessage(MSG_UNUSED_TAG, "@param", "aParam"),
-            "320:9: " + getCheckMessage(MSG_JAVADOC_MISSING),
-            "329:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
+            "305: " + getCheckMessage(MSG_RETURN_EXPECTED),
+            "305:22: " + getCheckMessage(MSG_EXPECTED_TAG, "@param", "aParam"),
+            "328:9: " + getCheckMessage(MSG_JAVADOC_MISSING),
+            "337:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
         };
         verify(checkConfig, getPath("InputJavadocMethodTags.java"), expected);
     }
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/JavadocTagInfoTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/JavadocTagInfoTest.java
index b197145..b47008f 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/JavadocTagInfoTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/JavadocTagInfoTest.java
@@ -86,7 +86,7 @@
         }
 
         ast.setType(TokenTypes.LAMBDA);
-        assertFalse("Should return false when ast type is invalid for currrent tag",
+        assertFalse("Should return false when ast type is invalid for current tag",
                 JavadocTagInfo.AUTHOR.isValidOn(ast));
     }
 
@@ -129,11 +129,11 @@
 
             astParent.setType(TokenTypes.SLIST);
             ast.setType(TokenTypes.VARIABLE_DEF);
-            assertFalse("Should return false when ast type is invalid for currrent tag",
+            assertFalse("Should return false when ast type is invalid for current tag",
                     tagInfo.isValidOn(ast));
 
             ast.setType(TokenTypes.PARAMETER_DEF);
-            assertFalse("Should return false when ast type is invalid for currrent tag",
+            assertFalse("Should return false when ast type is invalid for current tag",
                     tagInfo.isValidOn(ast));
         }
     }
@@ -166,11 +166,11 @@
 
         astParent.setType(TokenTypes.SLIST);
         ast.setType(TokenTypes.VARIABLE_DEF);
-        assertFalse("Should return false when ast type is invalid for currrent tag",
+        assertFalse("Should return false when ast type is invalid for current tag",
                 JavadocTagInfo.DEPRECATED.isValidOn(ast));
 
         ast.setType(TokenTypes.PARAMETER_DEF);
-        assertFalse("Should return false when ast type is invalid for currrent tag",
+        assertFalse("Should return false when ast type is invalid for current tag",
                 JavadocTagInfo.DEPRECATED.isValidOn(ast));
     }
 
@@ -194,11 +194,11 @@
 
         astParent.setType(TokenTypes.SLIST);
         ast.setType(TokenTypes.VARIABLE_DEF);
-        assertFalse("Should return false when ast type is invalid for currrent tag",
+        assertFalse("Should return false when ast type is invalid for current tag",
                 JavadocTagInfo.SERIAL.isValidOn(ast));
 
         ast.setType(TokenTypes.PARAMETER_DEF);
-        assertFalse("Should return false when ast type is invalid for currrent tag",
+        assertFalse("Should return false when ast type is invalid for current tag",
                 JavadocTagInfo.SERIAL.isValidOn(ast));
     }
 
@@ -217,7 +217,7 @@
         }
 
         ast.setType(TokenTypes.LAMBDA);
-        assertFalse("Should return false when ast type is invalid for currrent tag",
+        assertFalse("Should return false when ast type is invalid for current tag",
                 JavadocTagInfo.EXCEPTION.isValidOn(ast));
     }
 
@@ -236,7 +236,7 @@
         }
 
         ast.setType(TokenTypes.LAMBDA);
-        assertFalse("Should return false when ast type is invalid for currrent tag",
+        assertFalse("Should return false when ast type is invalid for current tag",
                 JavadocTagInfo.THROWS.isValidOn(ast));
     }
 
@@ -258,7 +258,7 @@
         }
 
         ast.setType(TokenTypes.LAMBDA);
-        assertFalse("Should return false when ast type is invalid for currrent tag",
+        assertFalse("Should return false when ast type is invalid for current tag",
                 JavadocTagInfo.VERSION.isValidOn(ast));
     }
 
@@ -279,7 +279,7 @@
         }
 
         ast.setType(TokenTypes.LAMBDA);
-        assertFalse("Should return false when ast type is invalid for currrent tag",
+        assertFalse("Should return false when ast type is invalid for current tag",
                 JavadocTagInfo.PARAM.isValidOn(ast));
     }
 
@@ -303,11 +303,11 @@
         }
 
         astChild2.setType(TokenTypes.LITERAL_VOID);
-        assertFalse("Should return false when ast type is invalid for currrent tag",
+        assertFalse("Should return false when ast type is invalid for current tag",
                 JavadocTagInfo.RETURN.isValidOn(ast));
 
         ast.setType(TokenTypes.LAMBDA);
-        assertFalse("Should return false when ast type is invalid for currrent tag",
+        assertFalse("Should return false when ast type is invalid for current tag",
                 JavadocTagInfo.RETURN.isValidOn(ast));
     }
 
@@ -332,15 +332,15 @@
         }
 
         astChild2.setText("1111");
-        assertFalse("Should return false when ast type is invalid for currrent tag",
+        assertFalse("Should return false when ast type is invalid for current tag",
                 JavadocTagInfo.SERIAL_FIELD.isValidOn(ast));
 
         astChild2.setType(TokenTypes.LITERAL_VOID);
-        assertFalse("Should return false when ast type is invalid for currrent tag",
+        assertFalse("Should return false when ast type is invalid for current tag",
                 JavadocTagInfo.SERIAL_FIELD.isValidOn(ast));
 
         ast.setType(TokenTypes.LAMBDA);
-        assertFalse("Should return false when ast type is invalid for currrent tag",
+        assertFalse("Should return false when ast type is invalid for current tag",
                 JavadocTagInfo.SERIAL_FIELD.isValidOn(ast));
     }
 
@@ -368,11 +368,11 @@
         }
 
         astChild.setText("1111");
-        assertFalse("Should return false when ast type is invalid for currrent tag",
+        assertFalse("Should return false when ast type is invalid for current tag",
                 JavadocTagInfo.SERIAL_DATA.isValidOn(ast));
 
         ast.setType(TokenTypes.LAMBDA);
-        assertFalse("Should return false when ast type is invalid for currrent tag",
+        assertFalse("Should return false when ast type is invalid for current tag",
                 JavadocTagInfo.SERIAL_DATA.isValidOn(ast));
     }
 
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/JavadocTypeCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/JavadocTypeCheckTest.java
index 76d9142..73815fd 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/JavadocTypeCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/JavadocTypeCheckTest.java
@@ -34,9 +34,6 @@
 import com.puppycrawl.tools.checkstyle.api.TokenTypes;
 import com.puppycrawl.tools.checkstyle.utils.CommonUtils;
 
-/**
- * @author Oliver.Burn
- */
 public class JavadocTypeCheckTest extends AbstractModuleTestSupport {
     @Override
     protected String getPackageLocation() {
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/NonEmptyAtclauseDescriptionCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/NonEmptyAtclauseDescriptionCheckTest.java
index 3bf65b7..df90f72 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/NonEmptyAtclauseDescriptionCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/NonEmptyAtclauseDescriptionCheckTest.java
@@ -82,6 +82,7 @@
             "91: " + getCheckMessage(MSG_KEY),
             "92: " + getCheckMessage(MSG_KEY),
             "93: " + getCheckMessage(MSG_KEY),
+            "120: " + getCheckMessage(MSG_KEY),
         };
         verify(checkConfig, getPath("InputNonEmptyAtclauseDescription.java"), expected);
     }
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/utils/BlockTagUtilsTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/utils/BlockTagUtilsTest.java
index e249434..0e8801e 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/utils/BlockTagUtilsTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/utils/BlockTagUtilsTest.java
@@ -28,9 +28,6 @@
 
 import com.puppycrawl.tools.checkstyle.internal.utils.TestUtil;
 
-/**
- * Tests BlockTagUtils.
- */
 public class BlockTagUtilsTest {
 
     @Test
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/utils/InlineTagUtilsTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/utils/InlineTagUtilsTest.java
index 3f29816..73cfff0 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/utils/InlineTagUtilsTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/utils/InlineTagUtilsTest.java
@@ -29,9 +29,6 @@
 
 import com.puppycrawl.tools.checkstyle.internal.utils.TestUtil;
 
-/**
- * Tests InlineTagUtils
- */
 public class InlineTagUtilsTest {
 
     @Test
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/metrics/BooleanExpressionComplexityCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/metrics/BooleanExpressionComplexityCheckTest.java
index a749d18..bd58329 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/metrics/BooleanExpressionComplexityCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/metrics/BooleanExpressionComplexityCheckTest.java
@@ -45,9 +45,10 @@
 
         final String[] expected = {
             "13:9: " + getCheckMessage(MSG_KEY, 4, 3),
-            "32:9: " + getCheckMessage(MSG_KEY, 6, 3),
-            "38:34: " + getCheckMessage(MSG_KEY, 4, 3),
-            "40:34: " + getCheckMessage(MSG_KEY, 4, 3),
+            "29:99: " + getCheckMessage(MSG_KEY, 4, 3),
+            "39:9: " + getCheckMessage(MSG_KEY, 6, 3),
+            "45:34: " + getCheckMessage(MSG_KEY, 4, 3),
+            "47:34: " + getCheckMessage(MSG_KEY, 4, 3),
         };
 
         verify(checkConfig, getPath("InputBooleanExpressionComplexity.java"), expected);
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/metrics/ClassDataAbstractionCouplingCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/metrics/ClassDataAbstractionCouplingCheckTest.java
index e141d09..05b80d3 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/metrics/ClassDataAbstractionCouplingCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/metrics/ClassDataAbstractionCouplingCheckTest.java
@@ -20,7 +20,9 @@
 package com.puppycrawl.tools.checkstyle.checks.metrics;
 
 import static com.puppycrawl.tools.checkstyle.checks.metrics.ClassDataAbstractionCouplingCheck.MSG_KEY;
+import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
@@ -41,6 +43,17 @@
     }
 
     @Test
+    public void testTokens() {
+        final ClassDataAbstractionCouplingCheck check = new ClassDataAbstractionCouplingCheck();
+        assertNotNull("Required tokens should not be null", check.getRequiredTokens());
+        assertNotNull("Acceptable tokens should not be null", check.getAcceptableTokens());
+        assertArrayEquals("Invalid default tokens", check.getDefaultTokens(),
+                check.getAcceptableTokens());
+        assertArrayEquals("Invalid acceptable tokens", check.getDefaultTokens(),
+                check.getRequiredTokens());
+    }
+
+    @Test
     public void test() throws Exception {
         final DefaultConfiguration checkConfig =
             createModuleConfig(ClassDataAbstractionCouplingCheck.class);
@@ -58,7 +71,7 @@
     }
 
     @Test
-    public void testExludedPackageDirectPackages() throws Exception {
+    public void testExcludedPackageDirectPackages() throws Exception {
         final DefaultConfiguration checkConfig =
             createModuleConfig(ClassDataAbstractionCouplingCheck.class);
 
@@ -78,7 +91,7 @@
     }
 
     @Test
-    public void testExludedPackageCommonPackages() throws Exception {
+    public void testExcludedPackageCommonPackages() throws Exception {
         final DefaultConfiguration checkConfig =
             createModuleConfig(ClassDataAbstractionCouplingCheck.class);
 
@@ -97,7 +110,7 @@
     }
 
     @Test
-    public void testExludedPackageWithEndingDot() throws Exception {
+    public void testExcludedPackageWithEndingDot() throws Exception {
         final DefaultConfiguration checkConfig =
             createModuleConfig(ClassDataAbstractionCouplingCheck.class);
 
@@ -123,7 +136,7 @@
     }
 
     @Test
-    public void testExludedPackageCommonPackagesAllIgnored() throws Exception {
+    public void testExcludedPackageCommonPackagesAllIgnored() throws Exception {
         final DefaultConfiguration checkConfig =
             createModuleConfig(ClassDataAbstractionCouplingCheck.class);
 
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/metrics/ClassFanOutComplexityCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/metrics/ClassFanOutComplexityCheckTest.java
index 9508e1f..32cebea 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/metrics/ClassFanOutComplexityCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/metrics/ClassFanOutComplexityCheckTest.java
@@ -217,4 +217,15 @@
         verify(moduleConfig,
                 getPath("InputClassFanOutComplexityMultiDimensionalArray.java"), expected);
     }
+
+    @Test
+    public void testPackageName() throws Exception {
+        final DefaultConfiguration moduleConfig =
+                createModuleConfig(ClassFanOutComplexityCheck.class);
+        moduleConfig.addAttribute("max", "0");
+
+        final String[] expected = CommonUtils.EMPTY_STRING_ARRAY;
+        verify(moduleConfig,
+                getPath("InputClassFanOutComplexityPackageName.java"), expected);
+    }
 }
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/metrics/NPathComplexityCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/metrics/NPathComplexityCheckTest.java
index b72b3f6..ed1373b 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/metrics/NPathComplexityCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/metrics/NPathComplexityCheckTest.java
@@ -21,7 +21,9 @@
 
 import static com.puppycrawl.tools.checkstyle.checks.metrics.NPathComplexityCheck.MSG_KEY;
 
+import java.io.File;
 import java.util.Collection;
+import java.util.Optional;
 import java.util.SortedSet;
 
 import org.junit.Assert;
@@ -60,6 +62,9 @@
             "76:5: " + getCheckMessage(MSG_KEY, 3, 0),
             "88:5: " + getCheckMessage(MSG_KEY, 3, 0),
             "104:13: " + getCheckMessage(MSG_KEY, 2, 0),
+            "113:5: " + getCheckMessage(MSG_KEY, 48, 0),
+            "123:5: " + getCheckMessage(MSG_KEY, 1, 0),
+            "124:5: " + getCheckMessage(MSG_KEY, 1, 0),
         };
 
         verify(checkConfig, getPath("InputNPathComplexityDefault.java"), expected);
@@ -139,6 +144,35 @@
     }
 
     @Test
+    public void testStatefulFieldsClearedOnBeginTree3() throws Exception {
+        final NPathComplexityCheck check = new NPathComplexityCheck();
+        final Optional<DetailAST> question = TestUtil.findTokenInAstByPredicate(
+            TestUtil.parseFile(new File(getPath("InputNPathComplexity.java"))),
+            ast -> ast.getType() == TokenTypes.QUESTION);
+
+        Assert.assertTrue("Ast should contain QUESTION", question.isPresent());
+
+        Assert.assertTrue("State is not cleared on beginTree",
+            TestUtil.isStatefulFieldClearedDuringBeginTree(
+                check,
+                question.get(),
+                "processingTokenEnd",
+                processingTokenEnd -> {
+                    try {
+                        return (Integer) TestUtil.getClassDeclaredField(
+                            processingTokenEnd.getClass(), "endLineNo").get(
+                            processingTokenEnd) == 0
+                            && (Integer) TestUtil.getClassDeclaredField(
+                                processingTokenEnd.getClass(), "endColumnNo").get(
+                                processingTokenEnd) == 0;
+                    }
+                    catch (IllegalAccessException | NoSuchFieldException ex) {
+                        throw new IllegalStateException(ex);
+                    }
+                }));
+    }
+
+    @Test
     public void testDefaultConfiguration() throws Exception {
         final DefaultConfiguration checkConfig =
             createModuleConfig(NPathComplexityCheck.class);
@@ -217,6 +251,31 @@
         Assert.assertEquals("No exception messages expected", 0, messages2.size());
     }
 
+    /**
+     * This must be a reflection test as it is too difficult to hit normally and
+     * the responsible code can't be removed without failing tests.
+     * TokenEnd is only used for processingTokenEnd and it is only set during visitConditional
+     * and visitUnitaryOperator. For it to be the same line/column, it must be the exact same
+     * token or a token who has the same line/column as it's child and we visit. We never
+     * visit the same token twice and we are only visiting on very specific tokens.
+     * The line can't be removed or reworked as other tests fail, and regression shows us no
+     * use cases to create a UT for.
+     * @throws Exception if there is an error.
+     */
+    @Test
+    public void testTokenEndIsAfterSameLineColumn() throws Exception {
+        final NPathComplexityCheck check = new NPathComplexityCheck();
+        final Object tokenEnd = TestUtil.getClassDeclaredField(NPathComplexityCheck.class,
+                "processingTokenEnd").get(check);
+        final DetailAST token = new DetailAST();
+        token.setLineNo(0);
+        token.setColumnNo(0);
+
+        Assert.assertTrue("isAfter must be true for same line/column",
+                (Boolean) TestUtil.getClassDeclaredMethod(tokenEnd.getClass(), "isAfter")
+                    .invoke(tokenEnd, token));
+    }
+
     @Test
     public void testVisitTokenBeforeExpressionRange() {
         // Create first ast
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/modifier/RedundantModifierCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/modifier/RedundantModifierCheckTest.java
index 4d90731..53405d5 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/modifier/RedundantModifierCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/modifier/RedundantModifierCheckTest.java
@@ -232,6 +232,16 @@
     }
 
     @Test
+    public void testEnumStaticMethodsInPublicClass() throws Exception {
+        final DefaultConfiguration checkConfig = createModuleConfig(RedundantModifierCheck.class);
+        final String[] expected = {
+            "12:23: " + getCheckMessage(MSG_KEY, "final"),
+        };
+        verify(checkConfig,
+            getPath("InputRedundantModifierFinalInEnumStaticMethods.java"), expected);
+    }
+
+    @Test
     public void testAnnotationOnEnumConstructor() throws Exception {
         final DefaultConfiguration checkConfig = createModuleConfig(RedundantModifierCheck.class);
         final String[] expected = {
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/naming/AbstractClassNameCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/naming/AbstractClassNameCheckTest.java
index ac890d3..e23bd71 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/naming/AbstractClassNameCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/naming/AbstractClassNameCheckTest.java
@@ -130,7 +130,7 @@
         final int[] expected = {
             TokenTypes.CLASS_DEF,
         };
-        Assert.assertArrayEquals("Invalid accaptable tokens", expected, actual);
+        Assert.assertArrayEquals("Invalid acceptable tokens", expected, actual);
     }
 
     @Test
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/naming/MethodNameCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/naming/MethodNameCheckTest.java
index d0b9617..851c15c 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/naming/MethodNameCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/naming/MethodNameCheckTest.java
@@ -81,8 +81,8 @@
                     "InputMethodNameEqualClassName", pattern),
             "47:9: " + getCheckMessage(MSG_KEY, "SweetInterface"),
             "47:9: " + getCheckMessage(MSG_INVALID_PATTERN, "SweetInterface", pattern),
-            "53:17: " + getCheckMessage(MSG_KEY, "Outter"),
-            "53:17: " + getCheckMessage(MSG_INVALID_PATTERN, "Outter", pattern),
+            "53:17: " + getCheckMessage(MSG_KEY, "Outer"),
+            "53:17: " + getCheckMessage(MSG_INVALID_PATTERN, "Outer", pattern),
         };
 
         verify(checkConfig, getPath("InputMethodNameEqualClassName.java"), expected);
@@ -109,7 +109,7 @@
             "37:24: " + getCheckMessage(MSG_INVALID_PATTERN,
                     "InputMethodNameEqualClassName", pattern),
             "47:9: " + getCheckMessage(MSG_INVALID_PATTERN, "SweetInterface", pattern),
-            "53:17: " + getCheckMessage(MSG_INVALID_PATTERN, "Outter", pattern),
+            "53:17: " + getCheckMessage(MSG_INVALID_PATTERN, "Outer", pattern),
         };
 
         verify(checkConfig, getPath("InputMethodNameEqualClassName.java"), expected);
@@ -137,7 +137,7 @@
             "37:24: " + getCheckMessage(MSG_INVALID_PATTERN,
                     "InputMethodNameEqualClassName", pattern),
             "47:9: " + getCheckMessage(MSG_INVALID_PATTERN, "SweetInterface", pattern),
-            "53:17: " + getCheckMessage(MSG_INVALID_PATTERN, "Outter", pattern),
+            "53:17: " + getCheckMessage(MSG_INVALID_PATTERN, "Outer", pattern),
         };
 
         verify(checkConfig, getPath("InputMethodNameEqualClassName.java"), expected);
@@ -165,7 +165,7 @@
             "20:20: " + getCheckMessage(MSG_INVALID_PATTERN, "PROTECTEDfoo", pattern),
         };
 
-        verify(checkConfig, getPath("InputMethodNameOverridenMethods.java"), expected);
+        verify(checkConfig, getPath("InputMethodNameOverriddenMethods.java"), expected);
     }
 
     @Test
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/whitespace/NoWhitespaceAfterCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/whitespace/NoWhitespaceAfterCheckTest.java
index 96875fb..8b77df6 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/whitespace/NoWhitespaceAfterCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/whitespace/NoWhitespaceAfterCheckTest.java
@@ -58,6 +58,7 @@
             "289:6: " + getCheckMessage(MSG_KEY, "@"),
             "290:6: " + getCheckMessage(MSG_KEY, "@"),
             "291:6: " + getCheckMessage(MSG_KEY, "@"),
+            "296:27: " + getCheckMessage(MSG_KEY, "int"),
         };
         verify(checkConfig, getPath("InputNoWhitespaceAfter.java"), expected);
     }
@@ -107,7 +108,7 @@
             "39:11: " + getCheckMessage(MSG_KEY, "ar"),
             "39:24: " + getCheckMessage(MSG_KEY, "int"),
             "40:16: " + getCheckMessage(MSG_KEY, "int"),
-            "43:63: " + getCheckMessage(MSG_KEY, "getLongMultArray"),
+            "43:64: " + getCheckMessage(MSG_KEY, "getLongMultiArray"),
             "47:26: " + getCheckMessage(MSG_KEY, "}"),
             "49:22: " + getCheckMessage(MSG_KEY, "int"),
             "50:24: " + getCheckMessage(MSG_KEY, "]"),
@@ -164,6 +165,7 @@
             "94:45: " + getCheckMessage(MSG_KEY, ")"),
             "97:41: " + getCheckMessage(MSG_KEY, "Object"),
             "100:43: " + getCheckMessage(MSG_KEY, "]"),
+            "108:31: " + getCheckMessage(MSG_KEY, "Object"),
         };
         verify(checkConfig, getPath("InputNoWhitespaceAfterArrayDeclarations2.java"), expected);
     }
@@ -234,7 +236,7 @@
     }
 
     /**
-     * Creates MOCK lexical token and returns AST node for this token
+     * Creates MOCK lexical token and returns AST node for this token.
      * @param tokenType type of token
      * @param tokenText text of token
      * @param tokenFileName file name of token
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/whitespace/ParenPadCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/whitespace/ParenPadCheckTest.java
index 76628ee..6edb35a 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/whitespace/ParenPadCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/whitespace/ParenPadCheckTest.java
@@ -476,7 +476,7 @@
         final Method method = Whitebox.getMethod(ParenPadCheck.class,
             "isAcceptableToken", DetailAST.class);
         final DetailAST ast = new DetailAST();
-        final String message = "Expected that all accaptable tokens will pass isAccaptableToken "
+        final String message = "Expected that all acceptable tokens will pass isAcceptableToken "
             + "method, but some token don't: ";
 
         for (int token : check.getAcceptableTokens()) {
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/filters/CsvFilterTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/filters/CsvFilterTest.java
index 769751b..5af38b1 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/filters/CsvFilterTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/filters/CsvFilterTest.java
@@ -27,7 +27,6 @@
 
 import nl.jqno.equalsverifier.EqualsVerifier;
 
-/** Tests CsvFilter. */
 public class CsvFilterTest {
     @Test
     public void testDecideSingle() {
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/filters/IntMatchFilterTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/filters/IntMatchFilterTest.java
index c3678d4..2228aca 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/filters/IntMatchFilterTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/filters/IntMatchFilterTest.java
@@ -27,7 +27,6 @@
 
 import nl.jqno.equalsverifier.EqualsVerifier;
 
-/** Tests IntMatchFilter. */
 public class IntMatchFilterTest {
     @Test
     public void testDecide() {
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/filters/IntRangeFilterTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/filters/IntRangeFilterTest.java
index 9ae249b..5fa9fbf 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/filters/IntRangeFilterTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/filters/IntRangeFilterTest.java
@@ -26,7 +26,6 @@
 
 import nl.jqno.equalsverifier.EqualsVerifier;
 
-/** Tests IntRangeFilter. */
 public class IntRangeFilterTest {
     @Test
     public void testDecide() {
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/filters/SeverityMatchFilterTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/filters/SeverityMatchFilterTest.java
index 6357f82..e1ea27e 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/filters/SeverityMatchFilterTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/filters/SeverityMatchFilterTest.java
@@ -20,15 +20,17 @@
 package com.puppycrawl.tools.checkstyle.filters;
 
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 import org.junit.Test;
 
+import com.puppycrawl.tools.checkstyle.DefaultConfiguration;
 import com.puppycrawl.tools.checkstyle.api.AuditEvent;
+import com.puppycrawl.tools.checkstyle.api.CheckstyleException;
 import com.puppycrawl.tools.checkstyle.api.LocalizedMessage;
 import com.puppycrawl.tools.checkstyle.api.SeverityLevel;
 
-/** Tests SeverityMatchFilter. */
 public class SeverityMatchFilterTest {
     private final SeverityMatchFilter filter = new SeverityMatchFilter();
 
@@ -87,4 +89,10 @@
         final AuditEvent ev3 = new AuditEvent(this, "ATest.java", infoMessage);
         assertFalse("level:" + infoLevel, filter.accept(ev3));
     }
+
+    @Test
+    public void testConfigure() throws CheckstyleException {
+        filter.configure(new DefaultConfiguration("test"));
+        assertNotNull("object exists", filter);
+    }
 }
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/filters/SuppressElementTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/filters/SuppressElementTest.java
index 9223385..c5e78df 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/filters/SuppressElementTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/filters/SuppressElementTest.java
@@ -33,13 +33,12 @@
 import nl.jqno.equalsverifier.EqualsVerifier;
 import nl.jqno.equalsverifier.Warning;
 
-/** Tests SuppressElementFilter. */
 public class SuppressElementTest {
     private SuppressElement filter;
 
     @Before
     public void setUp() {
-        filter = new SuppressElement("Test", "Test", null, null, null);
+        filter = new SuppressElement("Test", "Test", null, null, null, null);
     }
 
     @Test
@@ -58,16 +57,29 @@
     }
 
     @Test
+    public void testDecideByMessage() {
+        final LocalizedMessage message =
+            new LocalizedMessage(0, 0, "", "", null, null, getClass(), "Test");
+        final AuditEvent ev = new AuditEvent(this, "ATest.java", message);
+        final SuppressElement filter1 =
+                new SuppressElement(null, null, "Test", null, null, null);
+        final SuppressElement filter2 =
+                new SuppressElement(null, null, "Bad", null, null, null);
+        assertFalse("Message match", filter1.accept(ev));
+        assertTrue("Message not match", filter2.accept(ev));
+    }
+
+    @Test
     public void testDecideByLine() {
         final LocalizedMessage message =
             new LocalizedMessage(10, 10, "", "", null, null, getClass(), null);
         final AuditEvent ev = new AuditEvent(this, "ATest.java", message);
         final SuppressElement filter1 =
-                new SuppressElement("Test", "Test", null, "1-10", null);
+                new SuppressElement("Test", "Test", null, null, "1-10", null);
         final SuppressElement filter2 =
-                new SuppressElement("Test", "Test", null, "1-9, 11", null);
+                new SuppressElement("Test", "Test", null, null, "1-9, 11", null);
         final SuppressElement filter3 =
-                new SuppressElement("Test", "Test", null, null, null);
+                new SuppressElement("Test", "Test", null, null, null, null);
         //deny because there are matches on file name, check name, and line
         assertFalse("In range 1-10", filter1.accept(ev));
         assertTrue("Not in 1-9, 11", filter2.accept(ev));
@@ -80,9 +92,9 @@
             new LocalizedMessage(10, 10, "", "", null, null, getClass(), null);
         final AuditEvent ev = new AuditEvent(this, "ATest.java", message);
         final SuppressElement filter1 =
-                new SuppressElement("Test", "Test", null, null, "1-10");
+                new SuppressElement("Test", "Test", null, null, null, "1-10");
         final SuppressElement filter2 =
-                new SuppressElement("Test", "Test", null, null, "1-9, 11");
+                new SuppressElement("Test", "Test", null, null, null, "1-9, 11");
 
         //deny because there are matches on file name, check name, and column
         assertFalse("In range 1-10", filter1.accept(ev));
@@ -117,7 +129,7 @@
                 new LocalizedMessage(10, 10, "", "", null, "MyModule", getClass(), null);
         final AuditEvent ev = new AuditEvent(this, "ATest.java", message);
         final SuppressElement myFilter =
-                new SuppressElement("Test", "Test", "MyModule", null, null);
+                new SuppressElement("Test", "Test", null, "MyModule", null, null);
 
         assertFalse("Filter should not accept invalid event", myFilter.accept(ev));
     }
@@ -128,7 +140,7 @@
                 new LocalizedMessage(10, 10, "", "", null, "TheirModule", getClass(), null);
         final AuditEvent ev = new AuditEvent(this, "ATest.java", message);
         final SuppressElement myFilter =
-                new SuppressElement("Test", "Test", "MyModule", null, null);
+                new SuppressElement("Test", "Test", null, "MyModule", null, null);
 
         assertTrue("Filter should accept valid event", myFilter.accept(ev));
     }
@@ -147,7 +159,7 @@
                 new LocalizedMessage(10, 10, "", "", null, null, getClass(), null);
         final AuditEvent ev = new AuditEvent(this, "TestSUFFIX", message);
         final SuppressElement myFilter =
-                new SuppressElement("Test", null, null, null, null);
+                new SuppressElement("Test", null, null, null, null, null);
         assertFalse("Filter should not accept invalid event", myFilter.accept(ev));
     }
 
@@ -157,7 +169,7 @@
                 new LocalizedMessage(10, 10, "", "", null, null, getClass(), null);
         final AuditEvent ev = new AuditEvent(this, "ATest.java", message);
         final SuppressElement myFilter =
-                new SuppressElement("Test", "NON_EXISTING_CHECK", "MyModule", null, null);
+                new SuppressElement("Test", "NON_EXISTENT_CHECK", null, "MyModule", null, null);
         assertTrue("Filter should accept valid event", myFilter.accept(ev));
     }
 
@@ -167,7 +179,7 @@
                 new LocalizedMessage(10, 10, "", "", null, null, getClass(), null);
         final AuditEvent ev = new AuditEvent(this, "ATest.java", message);
         final SuppressElement myFilter =
-                new SuppressElement("Test", getClass().getCanonicalName(), null, null, null);
+                new SuppressElement("Test", getClass().getCanonicalName(), null, null, null, null);
 
         assertFalse("Filter should not accept invalid event", myFilter.accept(ev));
     }
@@ -179,7 +191,7 @@
         final AuditEvent ev = new AuditEvent(this, "ATest.java", message);
         final SuppressElement myFilter =
                 new SuppressElement("Test", TreeWalkerTest.class.getCanonicalName(),
-                        null, null, null);
+                        null, null, null, null);
 
         assertTrue("Filter should not accept invalid event", myFilter.accept(ev));
     }
@@ -189,27 +201,27 @@
         // filterBased is used instead of filter field only to satisfy IntelliJ Idea Inspection
         // Inspection "Arguments to assertEquals() in wrong order "
         final SuppressElement filterBased =
-                new SuppressElement("Test", "Test", null, null, null);
+                new SuppressElement("Test", "Test", null, null, null, null);
 
         final SuppressElement filter2 =
-                new SuppressElement("Test", "Test", null, null, null);
+                new SuppressElement("Test", "Test", null, null, null, null);
         assertEquals("filter, filter2", filterBased, filter2);
         final SuppressElement filter3 =
-                new SuppressElement("Test", "Test3", null, null, null);
+                new SuppressElement("Test", "Test3", null, null, null, null);
         assertNotEquals("filter, filter3", filterBased, filter3);
         final SuppressElement filterBased1 =
-                new SuppressElement("Test", "Test", null, null, "1-10");
+                new SuppressElement("Test", "Test", null, null, null, "1-10");
 
         assertNotEquals("filter, filter2", filterBased1, filter2);
         final SuppressElement filter22 =
-                new SuppressElement("Test", "Test", null, null, "1-10");
+                new SuppressElement("Test", "Test", null, null, null, "1-10");
         assertEquals("filter, filter2", filterBased1, filter22);
         assertNotEquals("filter, filter2", filterBased1, filter2);
         final SuppressElement filterBased2 =
-                new SuppressElement("Test", "Test", null, "3,4", null);
+                new SuppressElement("Test", "Test", null, null, "3,4", null);
         assertNotEquals("filter, filter2", filterBased2, filter2);
         final SuppressElement filter23 =
-                new SuppressElement("Test", "Test", null, "3,4", null);
+                new SuppressElement("Test", "Test", null, null, "3,4", null);
         assertEquals("filter, filter2", filterBased2, filter23);
         assertNotEquals("filter, filter2", filterBased2, filter2);
         assertEquals("filter, filter2", filterBased2, filter23);
@@ -219,7 +231,8 @@
     public void testEqualsAndHashCode() {
         EqualsVerifier.forClass(SuppressElement.class)
                 .usingGetClass()
-                .withIgnoredFields("fileRegexp", "checkRegexp", "columnFilter", "lineFilter")
+                .withIgnoredFields("fileRegexp", "checkRegexp", "messageRegexp", "columnFilter",
+                        "lineFilter")
                 .suppress(Warning.NONFINAL_FIELDS)
                 .verify();
     }
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/filters/SuppressWithPlainTextCommentFilterTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/filters/SuppressWithPlainTextCommentFilterTest.java
new file mode 100644
index 0000000..9f71733
--- /dev/null
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/filters/SuppressWithPlainTextCommentFilterTest.java
@@ -0,0 +1,487 @@
+////////////////////////////////////////////////////////////////////////////////
+// checkstyle: Checks Java source code for adherence to a set of rules.
+// Copyright (C) 2001-2017 the original author or authors.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+////////////////////////////////////////////////////////////////////////////////
+
+package com.puppycrawl.tools.checkstyle.filters;
+
+import static com.puppycrawl.tools.checkstyle.checks.whitespace.FileTabCharacterCheck.MSG_CONTAINS_TAB;
+import static com.puppycrawl.tools.checkstyle.checks.whitespace.FileTabCharacterCheck.MSG_FILE_CONTAINS_TAB;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.stream.Collectors;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.puppycrawl.tools.checkstyle.AbstractModuleTestSupport;
+import com.puppycrawl.tools.checkstyle.DefaultConfiguration;
+import com.puppycrawl.tools.checkstyle.api.AuditEvent;
+import com.puppycrawl.tools.checkstyle.api.CheckstyleException;
+import com.puppycrawl.tools.checkstyle.api.Configuration;
+import com.puppycrawl.tools.checkstyle.api.LocalizedMessage;
+import com.puppycrawl.tools.checkstyle.api.SeverityLevel;
+import com.puppycrawl.tools.checkstyle.api.TokenTypes;
+import com.puppycrawl.tools.checkstyle.checks.regexp.RegexpSinglelineCheck;
+import com.puppycrawl.tools.checkstyle.checks.whitespace.FileTabCharacterCheck;
+import com.puppycrawl.tools.checkstyle.utils.CommonUtils;
+import nl.jqno.equalsverifier.EqualsVerifier;
+
+public class SuppressWithPlainTextCommentFilterTest extends AbstractModuleTestSupport {
+
+    private static final String MSG_REGEXP_EXCEEDED = "regexp.exceeded";
+
+    @Override
+    protected String getPackageLocation() {
+        return "com/puppycrawl/tools/checkstyle/filters/suppresswithplaintextcommentfilter";
+    }
+
+    @Test
+    public void testFilterWithDefaultConfig() throws Exception {
+        final DefaultConfiguration filterCfg =
+            createModuleConfig(SuppressWithPlainTextCommentFilter.class);
+
+        final DefaultConfiguration checkCfg = createModuleConfig(FileTabCharacterCheck.class);
+        checkCfg.addAttribute("eachLine", "true");
+
+        final String[] suppressed = {
+            "5:7: " + getCheckMessage(FileTabCharacterCheck.class, MSG_FILE_CONTAINS_TAB),
+            "10:1: " + getCheckMessage(FileTabCharacterCheck.class, MSG_CONTAINS_TAB),
+        };
+
+        final String[] violationMessages = {
+            "5:7: " + getCheckMessage(FileTabCharacterCheck.class, MSG_FILE_CONTAINS_TAB),
+            "8:7: " + getCheckMessage(FileTabCharacterCheck.class, MSG_CONTAINS_TAB),
+            "10:1: " + getCheckMessage(FileTabCharacterCheck.class, MSG_CONTAINS_TAB),
+        };
+
+        verifySuppressed(
+            "InputSuppressWithPlainTextCommentFilterWithDefaultCfg.java",
+            removeSuppressed(violationMessages, suppressed),
+            filterCfg, checkCfg
+        );
+    }
+
+    @Test
+    public void testChangeOffAndOnFormat() throws Exception {
+        final DefaultConfiguration filterCfg =
+            createModuleConfig(SuppressWithPlainTextCommentFilter.class);
+        filterCfg.addAttribute("onCommentFormat", "cs-on");
+        filterCfg.addAttribute("offCommentFormat", "cs-off");
+
+        final DefaultConfiguration checkCfg = createModuleConfig(FileTabCharacterCheck.class);
+        checkCfg.addAttribute("eachLine", "true");
+
+        final String[] suppressed = {
+            "5:7: " + getCheckMessage(FileTabCharacterCheck.class, MSG_FILE_CONTAINS_TAB),
+            "10:1: " + getCheckMessage(FileTabCharacterCheck.class, MSG_CONTAINS_TAB),
+            "11:1: " + getCheckMessage(FileTabCharacterCheck.class, MSG_CONTAINS_TAB),
+            "13:1: " + getCheckMessage(FileTabCharacterCheck.class, MSG_CONTAINS_TAB),
+        };
+
+        final String[] violationMessage = {
+            "5:7: " + getCheckMessage(FileTabCharacterCheck.class, MSG_FILE_CONTAINS_TAB),
+            "8:7: " + getCheckMessage(FileTabCharacterCheck.class, MSG_CONTAINS_TAB),
+            "10:1: " + getCheckMessage(FileTabCharacterCheck.class, MSG_CONTAINS_TAB),
+            "11:1: " + getCheckMessage(FileTabCharacterCheck.class, MSG_CONTAINS_TAB),
+        };
+
+        verifySuppressed(
+            "InputSuppressWithPlainTextCommentFilterWithCustomOnAndOffComments.java",
+            removeSuppressed(violationMessage, suppressed),
+            filterCfg, checkCfg
+        );
+    }
+
+    @Test
+    public void testSuppressionCommentsInXmlFile() throws Exception {
+        final DefaultConfiguration filterCfg =
+            createModuleConfig(SuppressWithPlainTextCommentFilter.class);
+        filterCfg.addAttribute("offCommentFormat", "CS-OFF");
+        filterCfg.addAttribute("onCommentFormat", "CS-ON");
+
+        final DefaultConfiguration checkCfg = createModuleConfig(FileTabCharacterCheck.class);
+        checkCfg.addAttribute("eachLine", "true");
+
+        final String[] suppressed = {
+            "7:1: " + getCheckMessage(FileTabCharacterCheck.class, MSG_CONTAINS_TAB),
+        };
+
+        final String[] violationMessages = {
+            "7:1: " + getCheckMessage(FileTabCharacterCheck.class, MSG_CONTAINS_TAB),
+            "10:1: " + getCheckMessage(FileTabCharacterCheck.class, MSG_CONTAINS_TAB),
+        };
+
+        verifySuppressed(
+            "InputSuppressWithPlainTextCommentFilter.xml",
+            removeSuppressed(violationMessages, suppressed),
+            filterCfg, checkCfg
+        );
+    }
+
+    @Test
+    public void testSuppressionCommentsInPropertiesFile() throws Exception {
+        final DefaultConfiguration filterCfg =
+            createModuleConfig(SuppressWithPlainTextCommentFilter.class);
+        filterCfg.addAttribute("offCommentFormat", "# CHECKSTYLE:OFF");
+        filterCfg.addAttribute("onCommentFormat", "# CHECKSTYLE:ON");
+
+        final DefaultConfiguration checkCfg = createModuleConfig(RegexpSinglelineCheck.class);
+        checkCfg.addAttribute("format", "^key[0-9]=$");
+
+        final String[] suppressed = {
+            "2: " + getCheckMessage(RegexpSinglelineCheck.class, MSG_REGEXP_EXCEEDED,
+                "^key[0-9]=$"),
+        };
+
+        final String[] violationMessages = {
+            "2: " + getCheckMessage(RegexpSinglelineCheck.class, MSG_REGEXP_EXCEEDED,
+                "^key[0-9]=$"),
+            "4: " + getCheckMessage(RegexpSinglelineCheck.class, MSG_REGEXP_EXCEEDED,
+                "^key[0-9]=$"),
+        };
+
+        verifySuppressed(
+            "InputSuppressWithPlainTextCommentFilter.properties",
+            removeSuppressed(violationMessages, suppressed),
+            filterCfg, checkCfg
+        );
+    }
+
+    @Test
+    public void testSuppressionCommentsInSqlFile() throws Exception {
+        final DefaultConfiguration filterCfg =
+            createModuleConfig(SuppressWithPlainTextCommentFilter.class);
+        filterCfg.addAttribute("offCommentFormat", "-- CHECKSTYLE OFF");
+        filterCfg.addAttribute("onCommentFormat", "-- CHECKSTYLE ON");
+
+        final DefaultConfiguration checkCfg = createModuleConfig(FileTabCharacterCheck.class);
+        checkCfg.addAttribute("eachLine", "true");
+
+        final String[] suppressed = {
+            "2:1: " + getCheckMessage(FileTabCharacterCheck.class, MSG_CONTAINS_TAB),
+        };
+
+        final String[] violationMessages = {
+            "2:1: " + getCheckMessage(FileTabCharacterCheck.class, MSG_CONTAINS_TAB),
+            "5:1: " + getCheckMessage(FileTabCharacterCheck.class, MSG_CONTAINS_TAB),
+        };
+
+        verifySuppressed(
+            "InputSuppressWithPlainTextCommentFilter.sql",
+            removeSuppressed(violationMessages, suppressed),
+            filterCfg, checkCfg
+        );
+    }
+
+    @Test
+    public void testSuppressionCommentsInJavaScriptFile() throws Exception {
+        final DefaultConfiguration filterCfg =
+            createModuleConfig(SuppressWithPlainTextCommentFilter.class);
+        filterCfg.addAttribute("offCommentFormat", "// CS-OFF");
+        filterCfg.addAttribute("onCommentFormat", "// CS-ON");
+
+        final DefaultConfiguration checkCfg = createModuleConfig(RegexpSinglelineCheck.class);
+        checkCfg.addAttribute("format", ".*===.*");
+
+        final String[] suppressed = {
+            "2: " + getCheckMessage(RegexpSinglelineCheck.class, MSG_REGEXP_EXCEEDED, ".*===.*"),
+        };
+
+        final String[] violationMessages = {
+            "2: " + getCheckMessage(RegexpSinglelineCheck.class, MSG_REGEXP_EXCEEDED, ".*===.*"),
+            "5: " + getCheckMessage(RegexpSinglelineCheck.class, MSG_REGEXP_EXCEEDED, ".*===.*"),
+        };
+
+        verifySuppressed(
+            "InputSuppressWithPlainTextCommentFilter.js",
+            removeSuppressed(violationMessages, suppressed),
+            filterCfg, checkCfg
+        );
+    }
+
+    @Test
+    public void testInvalidCheckFormat() throws Exception {
+        final DefaultConfiguration filterCfg =
+            createModuleConfig(SuppressWithPlainTextCommentFilter.class);
+        filterCfg.addAttribute("checkFormat", "e[l");
+        filterCfg.addAttribute("onCommentFormat", "// cs-on");
+        filterCfg.addAttribute("offCommentFormat", "// cs-off");
+
+        final DefaultConfiguration checkCfg = createModuleConfig(FileTabCharacterCheck.class);
+        checkCfg.addAttribute("eachLine", "true");
+
+        final String[] suppressed = CommonUtils.EMPTY_STRING_ARRAY;
+
+        final String[] violationMessages = {
+            "5:7: " + getCheckMessage(FileTabCharacterCheck.class, MSG_FILE_CONTAINS_TAB),
+            "8:7: " + getCheckMessage(FileTabCharacterCheck.class, MSG_CONTAINS_TAB),
+            "10:1: " + getCheckMessage(FileTabCharacterCheck.class, MSG_CONTAINS_TAB),
+        };
+
+        try {
+            verifySuppressed(
+                "InputSuppressWithPlainTextCommentFilterWithCustomOnAndOffComments.java",
+                removeSuppressed(violationMessages, suppressed),
+                filterCfg, checkCfg
+            );
+            fail("CheckstyleException is expected");
+        }
+        catch (CheckstyleException ex) {
+            final IllegalArgumentException cause = (IllegalArgumentException) ex.getCause();
+            assertEquals("Invalid exception message",
+                "unable to parse expanded comment e[l", cause.getMessage());
+        }
+    }
+
+    @Test
+    public void testInvalidMessageFormat() throws Exception {
+        final DefaultConfiguration filterCfg =
+            createModuleConfig(SuppressWithPlainTextCommentFilter.class);
+        filterCfg.addAttribute("messageFormat", "e[l");
+        filterCfg.addAttribute("onCommentFormat", "// cs-on");
+        filterCfg.addAttribute("offCommentFormat", "// cs-off");
+
+        final DefaultConfiguration checkCfg = createModuleConfig(FileTabCharacterCheck.class);
+        checkCfg.addAttribute("eachLine", "true");
+
+        final String[] suppressed = CommonUtils.EMPTY_STRING_ARRAY;
+
+        final String[] violationMessages = {
+            "5:7: " + getCheckMessage(FileTabCharacterCheck.class, MSG_FILE_CONTAINS_TAB),
+            "8:7: " + getCheckMessage(FileTabCharacterCheck.class, MSG_CONTAINS_TAB),
+            "10:1: " + getCheckMessage(FileTabCharacterCheck.class, MSG_CONTAINS_TAB),
+        };
+
+        try {
+            verifySuppressed(
+                "InputSuppressWithPlainTextCommentFilterWithCustomOnAndOffComments.java",
+                removeSuppressed(violationMessages, suppressed),
+                filterCfg, checkCfg
+            );
+            fail("CheckstyleException is expected");
+        }
+        catch (CheckstyleException ex) {
+            final IllegalArgumentException cause = (IllegalArgumentException) ex.getCause();
+            assertEquals("Invalid exception message",
+                "unable to parse expanded comment e[l", cause.getMessage());
+        }
+    }
+
+    @Test
+    public void testAcceptNullLocalizedMessage() {
+        final SuppressWithPlainTextCommentFilter filter = new SuppressWithPlainTextCommentFilter();
+        final AuditEvent auditEvent = new AuditEvent(this);
+        assertTrue("Filter should accept audit event", filter.accept(auditEvent));
+        Assert.assertNull("File name should not be null", auditEvent.getFileName());
+    }
+
+    @Test
+    public void testEqualsAndHashCodeOfTagClass() {
+        EqualsVerifier.forClass(SuppressWithPlainTextCommentFilter.Suppression.class)
+            .usingGetClass().verify();
+    }
+
+    @Test
+    public void testSuppressByModuleId() throws Exception {
+        final DefaultConfiguration filterCfg =
+            createModuleConfig(SuppressWithPlainTextCommentFilter.class);
+        filterCfg.addAttribute("offCommentFormat", "CSOFF (\\w+) \\(\\w+\\)");
+        filterCfg.addAttribute("onCommentFormat", "CSON (\\w+)");
+        filterCfg.addAttribute("checkFormat", "$1");
+
+        final DefaultConfiguration regexpCheckCfg = createModuleConfig(RegexpSinglelineCheck.class);
+        regexpCheckCfg.addAttribute("id", "ignore");
+        regexpCheckCfg.addAttribute("format", ".*[a-zA-Z][0-9].*");
+
+        final DefaultConfiguration fileTabCheckCfg =
+            createModuleConfig(FileTabCharacterCheck.class);
+        fileTabCheckCfg.addAttribute("eachLine", "true");
+        fileTabCheckCfg.addAttribute("id", "foo");
+
+        final String[] suppressedViolationMessages = {
+            "6: " + getCheckMessage(RegexpSinglelineCheck.class, MSG_REGEXP_EXCEEDED,
+                ".*[a-zA-Z][0-9].*"),
+            "9: " + getCheckMessage(RegexpSinglelineCheck.class, MSG_REGEXP_EXCEEDED,
+                ".*[a-zA-Z][0-9].*"),
+            "11: " + getCheckMessage(RegexpSinglelineCheck.class, MSG_REGEXP_EXCEEDED,
+                ".*[a-zA-Z][0-9].*"),
+        };
+
+        final String[] expectedViolationMessages = {
+            "6: " + getCheckMessage(RegexpSinglelineCheck.class, MSG_REGEXP_EXCEEDED,
+                ".*[a-zA-Z][0-9].*"),
+            "9:1: " + getCheckMessage(FileTabCharacterCheck.class, MSG_CONTAINS_TAB),
+            "9: " + getCheckMessage(RegexpSinglelineCheck.class, MSG_REGEXP_EXCEEDED,
+                ".*[a-zA-Z][0-9].*"),
+            "11: " + getCheckMessage(RegexpSinglelineCheck.class, MSG_REGEXP_EXCEEDED,
+                ".*[a-zA-Z][0-9].*"),
+            "14: " + getCheckMessage(RegexpSinglelineCheck.class, MSG_REGEXP_EXCEEDED,
+                ".*[a-zA-Z][0-9].*"),
+        };
+
+        verifySuppressed(
+            "InputSuppressWithPlainTextCommentFilterSuppressById.java",
+            removeSuppressed(expectedViolationMessages, suppressedViolationMessages),
+            filterCfg, regexpCheckCfg, fileTabCheckCfg
+        );
+    }
+
+    @Test
+    public void testSuppressByModuleIdWithNullModuleId() throws Exception {
+        final DefaultConfiguration filterCfg =
+            createModuleConfig(SuppressWithPlainTextCommentFilter.class);
+        filterCfg.addAttribute("offCommentFormat", "CSOFF (\\w+) \\(\\w+\\)");
+        filterCfg.addAttribute("onCommentFormat", "CSON (\\w+)");
+        filterCfg.addAttribute("checkFormat", "$1");
+
+        final DefaultConfiguration regexpCheckCfg = createModuleConfig(RegexpSinglelineCheck.class);
+        regexpCheckCfg.addAttribute("id", "ignore");
+        regexpCheckCfg.addAttribute("format", ".*[a-zA-Z][0-9].*");
+
+        final DefaultConfiguration fileTabCheckCfg =
+            createModuleConfig(FileTabCharacterCheck.class);
+        fileTabCheckCfg.addAttribute("eachLine", "true");
+        fileTabCheckCfg.addAttribute("id", null);
+
+        final String[] suppressedViolationMessages = {
+            "6: " + getCheckMessage(RegexpSinglelineCheck.class, MSG_REGEXP_EXCEEDED,
+                ".*[a-zA-Z][0-9].*"),
+            "9: " + getCheckMessage(RegexpSinglelineCheck.class, MSG_REGEXP_EXCEEDED,
+                ".*[a-zA-Z][0-9].*"),
+            "11: " + getCheckMessage(RegexpSinglelineCheck.class, MSG_REGEXP_EXCEEDED,
+                ".*[a-zA-Z][0-9].*"),
+            };
+
+        final String[] expectedViolationMessages = {
+            "6: " + getCheckMessage(RegexpSinglelineCheck.class, MSG_REGEXP_EXCEEDED,
+                ".*[a-zA-Z][0-9].*"),
+            "9:1: " + getCheckMessage(FileTabCharacterCheck.class, MSG_CONTAINS_TAB),
+            "9: " + getCheckMessage(RegexpSinglelineCheck.class, MSG_REGEXP_EXCEEDED,
+                ".*[a-zA-Z][0-9].*"),
+            "11: " + getCheckMessage(RegexpSinglelineCheck.class, MSG_REGEXP_EXCEEDED,
+                ".*[a-zA-Z][0-9].*"),
+            "14: " + getCheckMessage(RegexpSinglelineCheck.class, MSG_REGEXP_EXCEEDED,
+                ".*[a-zA-Z][0-9].*"),
+        };
+
+        verifySuppressed(
+            "InputSuppressWithPlainTextCommentFilterSuppressById.java",
+            removeSuppressed(expectedViolationMessages, suppressedViolationMessages),
+            filterCfg, regexpCheckCfg, fileTabCheckCfg
+        );
+    }
+
+    @Test
+    public void testAcceptThrowsIllegalStateExceptionAsFileNotFound() {
+        final LocalizedMessage message = new LocalizedMessage(1, 1, 1, TokenTypes.CLASS_DEF,
+            "messages.properties", "key", null, SeverityLevel.ERROR, null, getClass(), null);
+        final String fileName = "nonexisting_file";
+        final AuditEvent auditEvent = new AuditEvent(this, fileName, message);
+
+        final SuppressWithPlainTextCommentFilter filter = new SuppressWithPlainTextCommentFilter();
+
+        try {
+            filter.accept(auditEvent);
+            fail(IllegalStateException.class.getSimpleName() + " is expected");
+        }
+        catch (IllegalStateException ex) {
+            assertEquals("Invalid exception message",
+                "Cannot read source file: " + fileName, ex.getMessage());
+
+            final Throwable cause = ex.getCause();
+            assertTrue("Exception cause has invalid type",
+                cause instanceof FileNotFoundException);
+            assertEquals("Invalid exception message",
+                fileName + " (No such file or directory)", cause.getMessage());
+        }
+    }
+
+    @Test
+    public void testFilterWithCustomMessageFormat() throws Exception {
+        final DefaultConfiguration filterCfg =
+            createModuleConfig(SuppressWithPlainTextCommentFilter.class);
+        final String messageFormat =
+            ".*" + getCheckMessage(FileTabCharacterCheck.class, MSG_CONTAINS_TAB) + ".*";
+        // -@cs[CheckstyleTestMakeup] need to test dynamic property
+        filterCfg.addAttribute("messageFormat", messageFormat);
+
+        final DefaultConfiguration fileTabCheckCfg =
+            createModuleConfig(FileTabCharacterCheck.class);
+        fileTabCheckCfg.addAttribute("eachLine", "true");
+
+        final DefaultConfiguration regexpCheckCfg = createModuleConfig(RegexpSinglelineCheck.class);
+        regexpCheckCfg.addAttribute("id", "ignore");
+        regexpCheckCfg.addAttribute("format", ".*[a-zA-Z][0-9].*");
+
+        final String[] suppressed = {
+            "8:1: " + getCheckMessage(FileTabCharacterCheck.class, MSG_CONTAINS_TAB),
+        };
+
+        final String[] violationMessages = {
+            "6: " + getCheckMessage(RegexpSinglelineCheck.class, MSG_REGEXP_EXCEEDED,
+                ".*[a-zA-Z][0-9].*"),
+            "8:1: " + getCheckMessage(FileTabCharacterCheck.class, MSG_CONTAINS_TAB),
+            "8: " + getCheckMessage(RegexpSinglelineCheck.class, MSG_REGEXP_EXCEEDED,
+                ".*[a-zA-Z][0-9].*"),
+            "10: " + getCheckMessage(RegexpSinglelineCheck.class, MSG_REGEXP_EXCEEDED,
+                ".*[a-zA-Z][0-9].*"),
+            "13: " + getCheckMessage(RegexpSinglelineCheck.class, MSG_REGEXP_EXCEEDED,
+                ".*[a-zA-Z][0-9].*"),
+        };
+
+        verifySuppressed(
+            "InputSuppressWithPlainTextCommentFilterCustomMessageFormat.java",
+            removeSuppressed(violationMessages, suppressed),
+            filterCfg, fileTabCheckCfg, regexpCheckCfg
+        );
+    }
+
+    @Test
+    public void testFilterWithDirectory() throws IOException {
+        final SuppressWithPlainTextCommentFilter filter = new SuppressWithPlainTextCommentFilter();
+        final AuditEvent event = new AuditEvent(this, getPath(""), new LocalizedMessage(1, 1,
+                "bundle", "key", null, SeverityLevel.ERROR, "moduleId", getClass(),
+                "customMessage"));
+
+        assertTrue("filter should accept directory", filter.accept(event));
+    }
+
+    private void verifySuppressed(String fileNameWithExtension, String[] violationMessages,
+                                  Configuration... childConfigs) throws Exception {
+        final DefaultConfiguration checkerConfig = createRootConfig(null);
+
+        Arrays.stream(childConfigs).forEach(checkerConfig::addChild);
+
+        final String fileExtension = CommonUtils.getFileExtension(fileNameWithExtension);
+        checkerConfig.addAttribute("fileExtensions", fileExtension);
+
+        verify(checkerConfig, getPath(fileNameWithExtension), violationMessages);
+    }
+
+    private static String[] removeSuppressed(String[] from, String... remove) {
+        final Collection<String> coll = Arrays.stream(from).collect(Collectors.toList());
+        coll.removeAll(Arrays.asList(remove));
+        return coll.toArray(new String[coll.size()]);
+    }
+}
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/filters/SuppressionCommentFilterTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/filters/SuppressionCommentFilterTest.java
index 229a9b9..36835ca 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/filters/SuppressionCommentFilterTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/filters/SuppressionCommentFilterTest.java
@@ -401,7 +401,7 @@
         final TreeWalkerAuditEvent dummyEvent = new TreeWalkerAuditEvent(contents, "filename",
                 new LocalizedMessage(1, null, null, null, null, Object.class, null), null);
         final boolean result = suppressionCommentFilter.accept(dummyEvent);
-        assertFalse("Fileter should not accept event", result);
+        assertFalse("Filter should not accept event", result);
     }
 
     @Test
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/filters/SuppressionFilterTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/filters/SuppressionFilterTest.java
index f0e9e81..3404858 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/filters/SuppressionFilterTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/filters/SuppressionFilterTest.java
@@ -85,8 +85,8 @@
     }
 
     @Test
-    public void testNonExistingSuppressionFileWithFalseOptional() {
-        final String fileName = "non_existing_suppression_file.xml";
+    public void testNonExistentSuppressionFileWithFalseOptional() {
+        final String fileName = "non_existent_suppression_file.xml";
         try {
             final boolean optional = false;
             createSuppressionFilter(fileName, optional);
@@ -108,7 +108,7 @@
         }
         catch (CheckstyleException ex) {
             assertEquals("Invalid error message",
-                "Unable to parse " + fileName + " - invalid files or checks format",
+                "Unable to parse " + fileName + " - invalid files or checks or message format",
                 ex.getMessage());
         }
     }
@@ -126,8 +126,8 @@
     }
 
     @Test
-    public void testNonExistingSuppressionFileWithTrueOptional() throws Exception {
-        final String fileName = "non_existing_suppression_file.xml";
+    public void testNonExistentSuppressionFileWithTrueOptional() throws Exception {
+        final String fileName = "non_existent_suppression_file.xml";
         final boolean optional = true;
         final SuppressionFilter filter = createSuppressionFilter(fileName, optional);
 
@@ -138,9 +138,9 @@
     }
 
     @Test
-    public void testNonExistingSuppressionUrlWithTrueOptional() throws Exception {
+    public void testNonExistentSuppressionUrlWithTrueOptional() throws Exception {
         final String fileName =
-                "http://checkstyle.sourceforge.net/non_existing_suppression.xml";
+                "http://checkstyle.sourceforge.net/non_existent_suppression.xml";
         final boolean optional = true;
         final SuppressionFilter filter = createSuppressionFilter(fileName, optional);
 
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/filters/SuppressionXpathFilterTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/filters/SuppressionXpathFilterTest.java
index 97b9c1e..a7fe7ce 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/filters/SuppressionXpathFilterTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/filters/SuppressionXpathFilterTest.java
@@ -86,8 +86,8 @@
     }
 
     @Test
-    public void testNonExistingSuppressionFileWithFalseOptional() throws Exception {
-        final String fileName = getPath("non_existing_suppression_file.xml");
+    public void testNonExistentSuppressionFileWithFalseOptional() throws Exception {
+        final String fileName = getPath("non_existent_suppression_file.xml");
         try {
             final boolean optional = false;
             createSuppressionXpathFilter(fileName, optional);
@@ -108,9 +108,8 @@
             fail("Exception is expected");
         }
         catch (CheckstyleException ex) {
-            assertEquals("Invalid error message",
-                    "Unable to parse " + fileName + " - invalid files or checks format for "
-                            + "suppress-xpath",
+            assertEquals("Invalid error message", "Unable to parse " + fileName
+                    + " - invalid files or checks or message format for suppress-xpath",
                     ex.getMessage());
         }
     }
@@ -129,9 +128,9 @@
     }
 
     @Test
-    public void testNonExistingSuppressionFileWithTrueOptional() throws Exception {
+    public void testNonExistentSuppressionFileWithTrueOptional() throws Exception {
         final String fileName = "src/test/resources/com/puppycrawl/tools/checkstyle/filters/"
-                + "non_existing_suppression_file.xml";
+                + "non_existent_suppression_file.xml";
         final boolean optional = true;
         final SuppressionXpathFilter filter = createSuppressionXpathFilter(fileName, optional);
 
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/filters/SuppressionsLoaderTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/filters/SuppressionsLoaderTest.java
index 0a7be08..294599e 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/filters/SuppressionsLoaderTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/filters/SuppressionsLoaderTest.java
@@ -27,6 +27,7 @@
 import java.lang.reflect.Method;
 import java.net.HttpURLConnection;
 import java.net.URL;
+import java.util.HashSet;
 import java.util.Set;
 
 import org.junit.Rule;
@@ -104,7 +105,7 @@
     }
 
     @Test
-    public void testLoadFromNonExistingUrl() {
+    public void testLoadFromNonExistentUrl() {
         try {
             SuppressionsLoader.loadSuppressions("http://^%$^* %&% %^&");
             fail("exception expected");
@@ -122,17 +123,20 @@
         final FilterSet fc2 = new FilterSet();
 
         final SuppressElement se0 =
-                new SuppressElement("file0", "check0", null, null, null);
+                new SuppressElement("file0", "check0", null, null, null, null);
         fc2.addFilter(se0);
         final SuppressElement se1 =
-                new SuppressElement("file1", "check1", null, "1,2-3", null);
+                new SuppressElement("file1", "check1", null, null, "1,2-3", null);
         fc2.addFilter(se1);
         final SuppressElement se2 =
-                new SuppressElement("file2", "check2", null, null, "1,2-3");
+                new SuppressElement("file2", "check2", null, null, null, "1,2-3");
         fc2.addFilter(se2);
         final SuppressElement se3 =
-                new SuppressElement("file3", "check3", null, "1,2-3", "1,2-3");
+                new SuppressElement("file3", "check3", null, null, "1,2-3", "1,2-3");
         fc2.addFilter(se3);
+        final SuppressElement se4 =
+                new SuppressElement(null, null, "message0", null, null, null);
+        fc2.addFilter(se4);
         assertEquals("Multiple suppressions were loaded incorrectly", fc2, fc);
     }
 
@@ -268,7 +272,7 @@
         }
         catch (CheckstyleException ex) {
             assertEquals("Invalid error message",
-                "Unable to parse " + fn + " - missing checks and id attribute",
+                "Unable to parse " + fn + " - missing checks or id or message attribute",
                 ex.getMessage());
         }
     }
@@ -290,7 +294,7 @@
         }
         catch (CheckstyleException ex) {
             assertEquals("Invalid error message",
-                "Unable to parse " + fn + " - invalid files or checks format",
+                "Unable to parse " + fn + " - invalid files or checks or message format",
                 ex.getMessage());
         }
     }
@@ -318,7 +322,15 @@
         final String fn = getPath("InputSuppressionsLoaderXpathCorrect.xml");
         final Set<TreeWalkerFilter> filterSet = SuppressionsLoader.loadXpathSuppressions(fn);
 
-        assertEquals("Invalid number of filters", 1, filterSet.size());
+        final Set<TreeWalkerFilter> expectedFilterSet = new HashSet<>();
+        final XpathFilter xf0 =
+                new XpathFilter("file1", "test", null, "id1", "/CLASS_DEF");
+        expectedFilterSet.add(xf0);
+        final XpathFilter xf1 =
+                new XpathFilter(null, null, "message1", null, "/CLASS_DEF");
+        expectedFilterSet.add(xf1);
+        assertEquals("Multiple xpath suppressions were loaded incorrectly", expectedFilterSet,
+                filterSet);
     }
 
     @Test
@@ -330,7 +342,7 @@
         }
         catch (CheckstyleException ex) {
             assertEquals("Invalid error message",
-                    "Unable to parse " + fn + " - invalid files or checks format for "
+                    "Unable to parse " + fn + " - invalid files or checks or message format for "
                             + "suppress-xpath",
                     ex.getMessage());
         }
@@ -346,7 +358,7 @@
         }
         catch (CheckstyleException ex) {
             assertEquals("Invalid error message",
-                    "Unable to parse " + fn + " - missing checks and id attribute for "
+                    "Unable to parse " + fn + " - missing checks or id or message attribute for "
                             + "suppress-xpath",
                     ex.getMessage());
         }
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/filters/XpathFilterTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/filters/XpathFilterTest.java
index f74af31..4580cd3 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/filters/XpathFilterTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/filters/XpathFilterTest.java
@@ -61,7 +61,7 @@
     public void testMatching() throws Exception {
         final String xpath = "/CLASS_DEF[@text='InputXpathFilterSuppressByXpath']";
         final XpathFilter filter =
-                new XpathFilter("InputXpathFilterSuppressByXpath", "Test", null, xpath);
+                new XpathFilter("InputXpathFilterSuppressByXpath", "Test", null, null, xpath);
         final TreeWalkerAuditEvent ev = getEvent(3, 0,
                 TokenTypes.CLASS_DEF);
         assertFalse("Event should be rejected", filter.accept(ev));
@@ -71,7 +71,7 @@
     public void testNonMatchingTokenType() throws Exception {
         final String xpath = "//METHOD_DEF[@text='countTokens']";
         final XpathFilter filter =
-                new XpathFilter("InputXpathFilterSuppressByXpath", "Test", null, xpath);
+                new XpathFilter("InputXpathFilterSuppressByXpath", "Test", null, null, xpath);
         final TreeWalkerAuditEvent ev = getEvent(3, 0,
                 TokenTypes.CLASS_DEF);
         assertTrue("Event should be accepted", filter.accept(ev));
@@ -81,7 +81,7 @@
     public void testNonMatchingLineNumber() throws Exception {
         final String xpath = "/CLASS_DEF[@text='InputXpathFilterSuppressByXpath']";
         final XpathFilter filter =
-                new XpathFilter("InputXpathFilterSuppressByXpath", "Test", null, xpath);
+                new XpathFilter("InputXpathFilterSuppressByXpath", "Test", null, null, xpath);
         final TreeWalkerAuditEvent ev = getEvent(100, 0,
                 TokenTypes.CLASS_DEF);
         assertTrue("Event should be accepted", filter.accept(ev));
@@ -91,7 +91,7 @@
     public void testNonMatchingColumnNumber() throws Exception {
         final String xpath = "/CLASS_DEF[@text='InputXpathFilterSuppressByXpath']";
         final XpathFilter filter =
-                new XpathFilter("InputXpathFilterSuppressByXpath", "Test", null, xpath);
+                new XpathFilter("InputXpathFilterSuppressByXpath", "Test", null, null, xpath);
         final TreeWalkerAuditEvent ev = getEvent(3, 100,
                 TokenTypes.CLASS_DEF);
         assertTrue("Event should be accepted", filter.accept(ev));
@@ -103,7 +103,7 @@
                 + "../..[@text='countTokens']] "
                 + "| //VARIABLE_DEF[@text='someVariable' and ../..[@text='sum']]";
         final XpathFilter filter =
-                new XpathFilter("InputXpathFilterSuppressByXpath", "Test", null, xpath);
+                new XpathFilter("InputXpathFilterSuppressByXpath", "Test", null, null, xpath);
         final TreeWalkerAuditEvent eventOne = getEvent(5, 8,
                 TokenTypes.VARIABLE_DEF);
         final TreeWalkerAuditEvent eventTwo = getEvent(10, 4,
@@ -120,7 +120,7 @@
         final String xpath = "1@#";
         try {
             final Object test = new XpathFilter("InputXpathFilterSuppressByXpath", "Test", null,
-                    xpath);
+                    null, xpath);
             fail("Exception was expected but got " + test);
         }
         catch (IllegalStateException ex) {
@@ -134,15 +134,15 @@
         final TreeWalkerAuditEvent event = getEvent(15, 8,
                 TokenTypes.VARIABLE_DEF);
         final XpathFilter filter =
-                new XpathFilter("InputXpathFilterSuppressByXpath", "Test", null, null);
-        assertTrue("Event should be accepted", filter.accept(event));
+                new XpathFilter("InputXpathFilterSuppressByXpath", "Test", null, null, null);
+        assertFalse("Event should be accepted", filter.accept(event));
     }
 
     @Test
     public void testNullFileName() {
         final String xpath = "NON_MATCHING_QUERY";
         final XpathFilter filter =
-                new XpathFilter("InputXpathFilterSuppressByXpath", "Test", null, xpath);
+                new XpathFilter("InputXpathFilterSuppressByXpath", "Test", null, null, xpath);
         final TreeWalkerAuditEvent ev = new TreeWalkerAuditEvent(null,
                 null, null, null);
         assertTrue("Event should be accepted", filter.accept(ev));
@@ -152,7 +152,7 @@
     public void testNonMatchingFileRegexp() throws Exception {
         final String xpath = "NON_MATCHING_QUERY";
         final XpathFilter filter =
-                new XpathFilter("NonMatchingRegexp", "Test", null, xpath);
+                new XpathFilter("NonMatchingRegexp", "Test", null, null, xpath);
         final TreeWalkerAuditEvent ev = getEvent(3, 0,
                 TokenTypes.CLASS_DEF);
         assertTrue("Event should be accepted", filter.accept(ev));
@@ -162,7 +162,7 @@
     public void testNullLocalizedMessage() {
         final String xpath = "NON_MATCHING_QUERY";
         final XpathFilter filter =
-                new XpathFilter("InputXpathFilterSuppressByXpath", "Test", null, xpath);
+                new XpathFilter("InputXpathFilterSuppressByXpath", "Test", null, null, xpath);
         final TreeWalkerAuditEvent ev = new TreeWalkerAuditEvent(null,
                 file.getName(), null, null);
         assertTrue("Event should be accepted", filter.accept(ev));
@@ -172,7 +172,7 @@
     public void testNonMatchingModuleId() throws Exception {
         final String xpath = "NON_MATCHING_QUERY";
         final XpathFilter filter =
-                new XpathFilter("InputXpathFilterSuppressByXpath", "Test", "id19", xpath);
+                new XpathFilter("InputXpathFilterSuppressByXpath", "Test", null, "id19", xpath);
         final LocalizedMessage message =
                 new LocalizedMessage(3, 0, TokenTypes.CLASS_DEF, "", "", null, null, "id20",
                         getClass(), null);
@@ -185,7 +185,7 @@
     public void testMatchingModuleId() throws Exception {
         final String xpath = "/CLASS_DEF[@text='InputXpathFilterSuppressByXpath']";
         final XpathFilter filter =
-                new XpathFilter("InputXpathFilterSuppressByXpath", "Test", "id19", xpath);
+                new XpathFilter("InputXpathFilterSuppressByXpath", "Test", null, "id19", xpath);
         final LocalizedMessage message =
                 new LocalizedMessage(3, 0, TokenTypes.CLASS_DEF, "", "", null, null, "id19",
                         getClass(), null);
@@ -198,7 +198,7 @@
     public void testNonMatchingChecks() throws Exception {
         final String xpath = "NON_MATCHING_QUERY";
         final XpathFilter filter = new XpathFilter("InputXpathFilterSuppressByXpath",
-                "NonMatchingRegexp", "id19", xpath);
+                "NonMatchingRegexp", null, "id19", xpath);
         final LocalizedMessage message =
                 new LocalizedMessage(3, 0, TokenTypes.CLASS_DEF, "", "", null, null, "id19",
                         getClass(), null);
@@ -211,7 +211,7 @@
     public void testNonMatchingFileNameModuleIdAndCheck() throws Exception {
         final String xpath = "NON_MATCHING_QUERY";
         final XpathFilter filter =
-                new XpathFilter("InputXpathFilterSuppressByXpath", null, null, xpath);
+                new XpathFilter("InputXpathFilterSuppressByXpath", null, null, null, xpath);
         final TreeWalkerAuditEvent ev = getEvent(3, 0,
                 TokenTypes.CLASS_DEF);
         assertTrue("Event should be accepted", filter.accept(ev));
@@ -221,17 +221,29 @@
     public void testNullModuleIdAndNonMatchingChecks() throws Exception {
         final String xpath = "NON_MATCHING_QUERY";
         final XpathFilter filter = new XpathFilter("InputXpathFilterSuppressByXpath",
-                "NonMatchingRegexp", null, xpath);
+                "NonMatchingRegexp", null, null, xpath);
         final TreeWalkerAuditEvent ev = getEvent(3, 0,
                 TokenTypes.CLASS_DEF);
         assertTrue("Event should be accepted", filter.accept(ev));
     }
 
     @Test
+    public void testDecideByMessage() throws Exception {
+        final LocalizedMessage message = new LocalizedMessage(0, 0, TokenTypes.CLASS_DEF, "", "",
+                null, null, null, getClass(), "Test");
+        final TreeWalkerAuditEvent ev = new TreeWalkerAuditEvent(fileContents, file.getName(),
+                message, TestUtil.parseFile(file));
+        final XpathFilter filter1 = new XpathFilter(null, null, "Test", null, null);
+        final XpathFilter filter2 = new XpathFilter(null, null, "Bad", null, null);
+        assertFalse("Message match", filter1.accept(ev));
+        assertTrue("Message not match", filter2.accept(ev));
+    }
+
+    @Test
     public void testThrowException() {
         final String xpath = "/CLASS_DEF[@text='InputXpathFilterSuppressByXpath']";
         final XpathFilter filter =
-                new XpathFilter("InputXpathFilterSuppressByXpath", "Test", null, xpath);
+                new XpathFilter("InputXpathFilterSuppressByXpath", "Test", null, null, xpath);
         final LocalizedMessage message =
                 new LocalizedMessage(3, 0, TokenTypes.CLASS_DEF, "", "", null, null, "id19",
                         getClass(), null);
@@ -254,7 +266,7 @@
                 xpathEvaluator.createExpression("//METHOD_DEF"),
                 xpathEvaluator.createExpression("//VARIABLE_DEF"))
                 .usingGetClass()
-                .withIgnoredFields("fileRegexp", "checkRegexp", "xpathExpression")
+                .withIgnoredFields("fileRegexp", "checkRegexp", "messageRegexp", "xpathExpression")
                 .verify();
     }
 
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/grammars/GeneratedJavaTokenTypesTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/grammars/GeneratedJavaTokenTypesTest.java
index 54b3f86..ea49bf9 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/grammars/GeneratedJavaTokenTypesTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/grammars/GeneratedJavaTokenTypesTest.java
@@ -22,7 +22,10 @@
 import org.junit.Assert;
 import org.junit.Test;
 
-/** @noinspection ClassIndependentOfModule */
+/**
+ * GeneratedJavaTokenTypesTest.
+ * @noinspection ClassIndependentOfModule
+ */
 public class GeneratedJavaTokenTypesTest {
     /**
      * <p>
@@ -30,6 +33,7 @@
      * old tokens must remain and keep their current numbering. Old token
      * numberings are not allowed to change.
      * </p>
+     *
      * <p>
      * The reason behind this is Java inlines static final field values directly
      * into the compiled Java code. This loses all connections with the original
@@ -37,7 +41,9 @@
      * up in user-created checks and causes conflicts.
      * </p>
      *
+     * <p>
      * Issue: https://github.com/checkstyle/checkstyle/issues/505
+     * </p>
      */
     @Test
     public void testTokenNumbering() {
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/grammars/javadoc/GeneratedJavadocTokenTypesTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/grammars/javadoc/GeneratedJavadocTokenTypesTest.java
index c90a188..fe4d2ed 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/grammars/javadoc/GeneratedJavadocTokenTypesTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/grammars/javadoc/GeneratedJavadocTokenTypesTest.java
@@ -23,7 +23,10 @@
 
 import org.junit.Test;
 
-/** @noinspection ClassIndependentOfModule */
+/**
+ * GeneratedJavadocTokenTypesTest.
+ * @noinspection ClassIndependentOfModule
+ */
 public class GeneratedJavadocTokenTypesTest {
 
     private static final String MSG = "Ensure that token numbers generated for the elements"
@@ -33,7 +36,7 @@
      * This method checks that the numbers generated for tokens in <tt>JavadocLexer.g4</tt> don't
      * change with the lexer grammar itself.
      * <br>ANTLR maps all the lexer elements to compile time constants used internally by ANTLR.
-     * Compatability damange is incurred <i>(with respect to the previous checkstyle versions)
+     * Compatibility damage is incurred <i>(with respect to the previous checkstyle versions)
      * </i> if these compile time constants keep changing with the grammar.
      *
      * @see "https://github.com/checkstyle/checkstyle/issues/5139"
@@ -143,7 +146,7 @@
      * This method checks that the numbers generated for rules in <tt>JavadocParser.g4</tt> don't
      * change with the Parser grammar itself.
      * <br>ANTLR maps all the parser rules to compile time constants used internally by ANTLR.
-     * Compatability damange is incurred <i>(with respect to the previous checkstyle versions)
+     * Compatibility damage is incurred <i>(with respect to the previous checkstyle versions)
      * </i> if these compile time constants keep changing with the grammar.
      *
      * @see "https://github.com/checkstyle/checkstyle/issues/5139"
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/grammars/javadoc/JavadocParseTreeTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/grammars/javadoc/JavadocParseTreeTest.java
index ebfb522..ff70d92 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/grammars/javadoc/JavadocParseTreeTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/grammars/javadoc/JavadocParseTreeTest.java
@@ -26,7 +26,10 @@
 
 import com.puppycrawl.tools.checkstyle.AbstractTreeTestSupport;
 
-/** @noinspection ClassOnlyUsedInOnePackage */
+/**
+ * JavadocParseTreeTest.
+ * @noinspection ClassOnlyUsedInOnePackage
+ */
 public class JavadocParseTreeTest extends AbstractTreeTestSupport {
 
     @Override
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/gui/CodeSelectorPresentationTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/gui/CodeSelectorPresentationTest.java
index 8adea50..dc9e16a 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/gui/CodeSelectorPresentationTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/gui/CodeSelectorPresentationTest.java
@@ -56,7 +56,7 @@
     }
 
     /** Converts lineToPosition from multicharacter to one character line separator
-      * needs to support crossplatform line separators
+      * needs to support crossplatform line separators.
       * @param systemLinesToPosition lines to position mapping for current system
       * @return lines to position mapping with one character line separator
       */
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/gui/ParseTreeTablePresentationTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/gui/ParseTreeTablePresentationTest.java
index afd5a7f..03e7209 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/gui/ParseTreeTablePresentationTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/gui/ParseTreeTablePresentationTest.java
@@ -191,18 +191,19 @@
         final ParseTreeTablePresentation parseTree = new ParseTreeTablePresentation(null);
         int index = 0;
         while (ithChild != null) {
-            Assert.assertEquals("Invalud child index",
+            Assert.assertEquals("Invalid child index",
                     index, parseTree.getIndexOfChild(tree, ithChild));
             ithChild = ithChild.getNextSibling();
             index++;
         }
 
-        Assert.assertEquals("Invalud child index",
+        Assert.assertEquals("Invalid child index",
                 -1, parseTree.getIndexOfChild(tree, new DetailAST()));
     }
 
     /**
-     * The path to class name in InputJavadocAttributesAndMethods.java
+     * The path to class name in InputJavadocAttributesAndMethods.java.
+     * <pre>
      * CLASS_DEF
      *  - MODIFIERS
      *  - Comment node
@@ -210,6 +211,7 @@
      *  - IDENT -> this is the node that holds the class name
      *  Line number 4 - first three lines are taken by javadoc
      *  Column 6 - first five columns taken by 'class '
+     *  </pre>
      */
     @Test
     public void testGetValueAt() {
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/internal/AllChecksTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/internal/AllChecksTest.java
index 38c24c7..f821554 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/internal/AllChecksTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/internal/AllChecksTest.java
@@ -330,8 +330,6 @@
     public void testAllModulesAreReferencedInConfigFile() throws Exception {
         final Set<String> modulesReferencedInConfig = CheckUtil.getConfigCheckStyleModules();
         final Set<String> moduleNames = CheckUtil.getSimpleNames(CheckUtil.getCheckstyleModules());
-        //Issue: https://github.com/checkstyle/checkstyle/issues/4421
-        moduleNames.remove("SuppressionXpathFilter");
 
         moduleNames.stream().filter(check -> !modulesReferencedInConfig.contains(check))
             .forEach(check -> {
@@ -428,8 +426,6 @@
         // these are documented on non-'config_' pages
         checkstyleModulesNames.remove("TreeWalker");
         checkstyleModulesNames.remove("Checker");
-        //Issue: https://github.com/checkstyle/checkstyle/issues/4421
-        checkstyleModulesNames.remove("SuppressionXpathFilter");
 
         checkstyleModulesNames.stream()
             .filter(moduleName -> !modulesNamesWhichHaveXdocs.contains(moduleName))
@@ -445,8 +441,6 @@
     public void testAllCheckstyleModulesInCheckstyleConfig() throws Exception {
         final Set<String> configChecks = CheckUtil.getConfigCheckStyleModules();
         final Set<String> moduleNames = CheckUtil.getSimpleNames(CheckUtil.getCheckstyleModules());
-        //Issue: https://github.com/checkstyle/checkstyle/issues/4421
-        moduleNames.remove("SuppressionXpathFilter");
 
         for (String moduleName : moduleNames) {
             Assert.assertTrue("checkstyle_checks.xml is missing module: " + moduleName,
@@ -548,6 +542,7 @@
      * Checks that an array is a subset of other array.
      * @param array to check whether it is a subset.
      * @param arrayToCheckIn array to check in.
+     * @return {@code true} if all elements in {@code array} are in {@code arrayToCheckIn}.
      */
     private static boolean isSubset(int[] array, int... arrayToCheckIn) {
         Arrays.sort(arrayToCheckIn);
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/internal/AllTestsTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/internal/AllTestsTest.java
index b7269b5..d9c4c5e 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/internal/AllTestsTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/internal/AllTestsTest.java
@@ -32,7 +32,10 @@
 import org.junit.Assert;
 import org.junit.Test;
 
-/** @noinspection ClassIndependentOfModule */
+/**
+ * AllTestsTest.
+ * @noinspection ClassIndependentOfModule
+ */
 public class AllTestsTest {
     @Test
     public void testAllInputsHaveTest() throws Exception {
@@ -143,7 +146,6 @@
 
             // until https://github.com/checkstyle/checkstyle/issues/5105
             if (!path.contains(File.separatorChar + "grammars" + File.separatorChar)
-                    // until https://github.com/checkstyle/checkstyle/issues/5104
                     && !path.contains(File.separatorChar + "foo" + File.separatorChar)
                     && !path.contains(File.separatorChar + "bar" + File.separatorChar)) {
                 String fileName = file.getName();
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/internal/CommitValidationTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/internal/CommitValidationTest.java
index ede921e..f632346 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/internal/CommitValidationTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/internal/CommitValidationTest.java
@@ -49,24 +49,24 @@
 /**
  * Validate commit message has proper structure.
  *
- * Commits to check are resolved from different places according
+ * <p>Commits to check are resolved from different places according
  * to type of commit in current HEAD. If current HEAD commit is
  * non-merge commit , previous commits are resolved due to current
  * HEAD commit. Otherwise if it is a merge commit, it will invoke
- * resolving previous commits due to commits which was merged.
+ * resolving previous commits due to commits which was merged.</p>
  *
- * After calculating commits to start with ts resolves previous
+ * <p>After calculating commits to start with ts resolves previous
  * commits according to COMMITS_RESOLUTION_MODE variable.
  * At default(BY_LAST_COMMIT_AUTHOR) it checks first commit author
  * and return all consecutive commits with same author. Second
  * mode(BY_COUNTER) makes returning first PREVIOUS_COMMITS_TO_CHECK_COUNT
- * commits after starter commit.
+ * commits after starter commit.</p>
  *
- * Resolved commits are filtered according to author. If commit author
+ * <p>Resolved commits are filtered according to author. If commit author
  * belong to list USERS_EXCLUDED_FROM_VALIDATION then this commit will
- * not be validated.
+ * not be validated.</p>
  *
- * Filtered commit list is checked if their messages has proper structure.
+ * <p>Filtered commit list is checked if their messages has proper structure.</p>
  *
  * @author <a href="mailto:piotr.listkiewicz@gmail.com">liscju</a>
  */
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/internal/XdocsPagesTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/internal/XdocsPagesTest.java
index 129d67c..5f88ab1 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/internal/XdocsPagesTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/internal/XdocsPagesTest.java
@@ -84,6 +84,7 @@
             "name=\"Header\"",
             "name=\"Translation\"",
             "name=\"SeverityMatchFilter\"",
+            "name=\"SuppressWithPlainTextCommentFilter\"",
             "name=\"SuppressionFilter\"",
             "name=\"SuppressWarningsFilter\"",
             "name=\"BeforeExecutionExclusionFileFilter\"",
@@ -215,6 +216,7 @@
         // can't process non-existent examples, or out of context snippets
         if (!code.contains("com.mycompany") && !code.contains("checkstyle-packages")
                 && !code.contains("MethodLimit") && !code.contains("<suppress ")
+                && !code.contains("<suppress-xpath ")
                 && !code.contains("<import-control ")
                 && !unserializedSource.startsWith("<property ")
                 && !unserializedSource.startsWith("<taskdef ")) {
@@ -292,7 +294,7 @@
     }
 
     /**
-     * Test contains asserts in callstack, but idea does not see them
+     * Test contains asserts in callstack, but idea does not see them.
      * @noinspection JUnitTestMethodWithNoAssertions
      */
     @Test
@@ -450,6 +452,9 @@
         if (hasParentModule(sectionName)) {
             if (AbstractJavadocCheck.class.isAssignableFrom(clss)) {
                 properties.removeAll(JAVADOC_CHECK_PROPERTIES);
+
+                // override
+                properties.add("violateExecutionOnNonTightHtml");
             }
             else if (AbstractCheck.class.isAssignableFrom(clss)) {
                 properties.removeAll(CHECK_PROPERTIES);
@@ -643,7 +648,14 @@
                         .replaceAll("\\s+", " ").trim());
     }
 
-    /** @noinspection IfStatementWithTooManyBranches */
+    /**
+     * Get's the name of the bean property's type for the class.
+     * @param clss The bean property's defined type.
+     * @param instance The class instance to work with.
+     * @param propertyName The property name to work with.
+     * @return String form of property's type.
+     * @noinspection IfStatementWithTooManyBranches
+     */
     private static String getModulePropertyExpectedTypeName(Class<?> clss, Object instance,
             String propertyName) {
         final String instanceName = instance.getClass().getSimpleName();
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/internal/testmodules/TestFileSetCheck.java b/src/test/java/com/puppycrawl/tools/checkstyle/internal/testmodules/TestFileSetCheck.java
index f5ea98b..c6b6cb0 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/internal/testmodules/TestFileSetCheck.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/internal/testmodules/TestFileSetCheck.java
@@ -26,6 +26,7 @@
 import com.puppycrawl.tools.checkstyle.api.FileText;
 
 /**
+ * TestFileSetCheck.
  * @noinspection ClassOnlyUsedInOnePackage
  */
 public class TestFileSetCheck extends AbstractFileSetCheck {
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/internal/testmodules/TestLoggingReporter.java b/src/test/java/com/puppycrawl/tools/checkstyle/internal/testmodules/TestLoggingReporter.java
index 2bf6b9f..005a58f 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/internal/testmodules/TestLoggingReporter.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/internal/testmodules/TestLoggingReporter.java
@@ -22,6 +22,7 @@
 import com.puppycrawl.tools.checkstyle.api.AbstractViolationReporter;
 
 /**
+ * TestLoggingReporter.
  * @noinspection ClassOnlyUsedInOnePackage
  */
 public final class TestLoggingReporter extends AbstractViolationReporter {
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/internal/utils/CheckUtil.java b/src/test/java/com/puppycrawl/tools/checkstyle/internal/utils/CheckUtil.java
index be08981..8a25a6c 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/internal/utils/CheckUtil.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/internal/utils/CheckUtil.java
@@ -139,7 +139,7 @@
                 .getContextClassLoader();
         final String packageName = "com.puppycrawl.tools.checkstyle";
         return getCheckstyleModulesRecursive(packageName, loader).stream()
-                .filter(ModuleReflectionUtils::isCheckstyleCheck)
+                .filter(ModuleReflectionUtils::isCheckstyleTreeWalkerCheck)
                 .collect(Collectors.toSet());
     }
 
@@ -219,6 +219,7 @@
      * Gets the check message 'as is' from appropriate 'messages.properties'
      * file.
      *
+     * @param module The package the message is located in.
      * @param locale the locale to get the message for.
      * @param messageKey the key of message in 'messages*.properties' file.
      * @param arguments the arguments of message in 'messages*.properties' file.
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/internal/utils/CloseAndFlushTestByteArrayOutputStream.java b/src/test/java/com/puppycrawl/tools/checkstyle/internal/utils/CloseAndFlushTestByteArrayOutputStream.java
index 6eb65dd..cf62e8b 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/internal/utils/CloseAndFlushTestByteArrayOutputStream.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/internal/utils/CloseAndFlushTestByteArrayOutputStream.java
@@ -22,7 +22,10 @@
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 
-/** @noinspection ClassOnlyUsedInOnePackage */
+/**
+ * CloseAndFlushTestByteArrayOutputStream.
+ * @noinspection ClassOnlyUsedInOnePackage
+ */
 public final class CloseAndFlushTestByteArrayOutputStream extends ByteArrayOutputStream {
 
     private int closeCount;
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/internal/utils/ConfigurationUtil.java b/src/test/java/com/puppycrawl/tools/checkstyle/internal/utils/ConfigurationUtil.java
index 948a551..a88fb96 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/internal/utils/ConfigurationUtil.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/internal/utils/ConfigurationUtil.java
@@ -38,6 +38,7 @@
         props.setProperty("checkstyle.basedir", "basedir");
         props.setProperty("checkstyle.cache.file", "file");
         props.setProperty("checkstyle.suppressions.file", "file");
+        props.setProperty("checkstyle.suppressions-xpath.file", "file");
         props.setProperty("checkstyle.header.file", "file");
         props.setProperty("checkstyle.regexp.header.file", "file");
         props.setProperty("checkstyle.importcontrol.file", "file");
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/internal/utils/TestUtil.java b/src/test/java/com/puppycrawl/tools/checkstyle/internal/utils/TestUtil.java
index 1c5d8cc..df85e9a 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/internal/utils/TestUtil.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/internal/utils/TestUtil.java
@@ -25,6 +25,7 @@
 import java.io.IOException;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
+import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
@@ -72,6 +73,52 @@
     }
 
     /**
+     * Retrieves the specified field by it's name in the class or it's direct super.
+     *
+     * @param clss The class to retrieve the field for.
+     * @param fieldName The name of the field to retrieve.
+     * @return The class' field.
+     * @throws NoSuchFieldException if the requested field cannot be found in the class.
+     */
+    public static Field getClassDeclaredField(Class<?> clss, String fieldName)
+            throws NoSuchFieldException {
+        final Optional<Field> classField = Arrays.stream(clss.getDeclaredFields())
+                .filter(field -> fieldName.equals(field.getName())).findFirst();
+        final Field resultField;
+        if (classField.isPresent()) {
+            resultField = classField.get();
+        }
+        else {
+            resultField = clss.getSuperclass().getDeclaredField(fieldName);
+        }
+        resultField.setAccessible(true);
+        return resultField;
+    }
+
+    /**
+     * Retrieves the specified method by it's name in the class or it's direct super.
+     *
+     * @param clss The class to retrieve the field for.
+     * @param methodName The name of the method to retrieve.
+     * @return The class' field.
+     * @throws NoSuchMethodException if the requested method cannot be found in the class.
+     */
+    public static Method getClassDeclaredMethod(Class<?> clss, String methodName)
+            throws NoSuchMethodException {
+        final Optional<Method> classMethod = Arrays.stream(clss.getDeclaredMethods())
+                .filter(method -> methodName.equals(method.getName())).findFirst();
+        final Method resultMethod;
+        if (classMethod.isPresent()) {
+            resultMethod = classMethod.get();
+        }
+        else {
+            resultMethod = clss.getSuperclass().getDeclaredMethod(methodName);
+        }
+        resultMethod.setAccessible(true);
+        return resultMethod;
+    }
+
+    /**
      * Checks if stateful field is cleared during {@link AbstractCheck#beginTree} in check.
      *
      * @param check      check object which field is to be verified
@@ -91,16 +138,7 @@
         check.beginTree(astToVisit);
         check.visitToken(astToVisit);
         check.beginTree(null);
-        final Optional<Field> classField = Arrays.stream(check.getClass().getDeclaredFields())
-            .filter(field -> fieldName.equals(field.getName())).findFirst();
-        final Field resultField;
-        if (classField.isPresent()) {
-            resultField = classField.get();
-        }
-        else {
-            resultField = check.getClass().getSuperclass().getDeclaredField(fieldName);
-        }
-        resultField.setAccessible(true);
+        final Field resultField = getClassDeclaredField(check.getClass(), fieldName);
         return isClear.test(resultField.get(check));
     }
 
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/internal/utils/XdocUtil.java b/src/test/java/com/puppycrawl/tools/checkstyle/internal/utils/XdocUtil.java
index ba72c98..1840a83 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/internal/utils/XdocUtil.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/internal/utils/XdocUtil.java
@@ -37,7 +37,10 @@
 import org.w3c.dom.NodeList;
 import org.xml.sax.SAXException;
 
-/** @noinspection ClassOnlyUsedInOnePackage */
+/**
+ * XdocUtil.
+ * @noinspection ClassOnlyUsedInOnePackage
+ */
 public final class XdocUtil {
     public static final String DIRECTORY_PATH = "src/xdocs";
 
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/internal/utils/XmlUtil.java b/src/test/java/com/puppycrawl/tools/checkstyle/internal/utils/XmlUtil.java
index 9b36a44..3a48978 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/internal/utils/XmlUtil.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/internal/utils/XmlUtil.java
@@ -34,7 +34,10 @@
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
 
-/** @noinspection ClassOnlyUsedInOnePackage */
+/**
+ * XmlUtil.
+ * @noinspection ClassOnlyUsedInOnePackage
+ */
 public final class XmlUtil {
     private XmlUtil() {
     }
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/internal/utils/XpathUtil.java b/src/test/java/com/puppycrawl/tools/checkstyle/internal/utils/XpathUtil.java
index bedab2e..c2e78eb 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/internal/utils/XpathUtil.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/internal/utils/XpathUtil.java
@@ -29,6 +29,7 @@
 import net.sf.saxon.trans.XPathException;
 
 /**
+ * XpathUtil.
  * @noinspection ClassOnlyUsedInOnePackage
  */
 public final class XpathUtil {
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/utils/AnnotationUtilityTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/utils/AnnotationUtilityTest.java
index 090b2d3..a000ea5 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/utils/AnnotationUtilityTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/utils/AnnotationUtilityTest.java
@@ -173,6 +173,7 @@
         final DetailAST annotationName = new DetailAST();
         annotations.setType(TokenTypes.ANNOTATIONS);
         annotation.setType(TokenTypes.ANNOTATION);
+        annotationNameHolder.setType(TokenTypes.AT);
         annotationName.setText("Annotation");
 
         annotationNameHolder.setNextSibling(annotationName);
@@ -184,4 +185,31 @@
         assertTrue("Annotation should contain " + astForTest,
                 AnnotationUtility.containsAnnotation(astForTest, "Annotation"));
     }
+
+    @Test
+    public void testContainsAnnotationWithComment() {
+        final DetailAST astForTest = new DetailAST();
+        astForTest.setType(TokenTypes.PACKAGE_DEF);
+        final DetailAST child = new DetailAST();
+        final DetailAST annotations = new DetailAST();
+        final DetailAST annotation = new DetailAST();
+        final DetailAST annotationNameHolder = new DetailAST();
+        final DetailAST annotationName = new DetailAST();
+        final DetailAST comment = new DetailAST();
+        annotations.setType(TokenTypes.ANNOTATIONS);
+        annotation.setType(TokenTypes.ANNOTATION);
+        annotationNameHolder.setType(TokenTypes.AT);
+        comment.setType(TokenTypes.BLOCK_COMMENT_BEGIN);
+        annotationName.setText("Annotation");
+
+        annotationNameHolder.setNextSibling(annotationName);
+        annotation.setFirstChild(comment);
+        comment.setNextSibling(annotationNameHolder);
+        annotations.setFirstChild(annotation);
+        child.setNextSibling(annotations);
+        astForTest.setFirstChild(child);
+
+        assertTrue("Annotation should contain " + astForTest,
+                AnnotationUtility.containsAnnotation(astForTest, "Annotation"));
+    }
 }
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/utils/BlockCommentPositionTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/utils/BlockCommentPositionTest.java
index 0c8df79..d82a70c 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/utils/BlockCommentPositionTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/utils/BlockCommentPositionTest.java
@@ -20,6 +20,7 @@
 package com.puppycrawl.tools.checkstyle.utils;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 import java.io.File;
 import java.util.Arrays;
@@ -36,12 +37,18 @@
 public class BlockCommentPositionTest extends AbstractPathTestSupport {
 
     @Test
+    public void testPrivateConstr() throws Exception {
+        assertTrue("Constructor is not private",
+                TestUtil.isUtilsClassHasPrivateConstructor(BlockCommentPosition.class, true));
+    }
+
+    @Test
     public void testJavaDocsRecognition() throws Exception {
         final List<BlockCommentPositionTestMetadata> metadataList = Arrays.asList(
                 new BlockCommentPositionTestMetadata("InputBlockCommentPositionOnClass.java",
                         BlockCommentPosition::isOnClass, 3),
                 new BlockCommentPositionTestMetadata("InputBlockCommentPositionOnMethod.java",
-                        BlockCommentPosition::isOnMethod, 3),
+                        BlockCommentPosition::isOnMethod, 4),
                 new BlockCommentPositionTestMetadata("InputBlockCommentPositionOnField.java",
                         BlockCommentPosition::isOnField, 3),
                 new BlockCommentPositionTestMetadata("InputBlockCommentPositionOnEnum.java",
@@ -53,7 +60,10 @@
                 new BlockCommentPositionTestMetadata("InputBlockCommentPositionOnAnnotation.java",
                         BlockCommentPosition::isOnAnnotationDef, 3),
                 new BlockCommentPositionTestMetadata("InputBlockCommentPositionOnEnumMember.java",
-                        BlockCommentPosition::isOnEnumConstant, 2)
+                        BlockCommentPosition::isOnEnumConstant, 2),
+                new BlockCommentPositionTestMetadata(
+                        "InputBlockCommentPositionOnAnnotationField.java",
+                        BlockCommentPosition::isOnAnnotationField, 4)
         );
 
         for (BlockCommentPositionTestMetadata metadata : metadataList) {
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/utils/CheckUtilsTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/utils/CheckUtilsTest.java
index abdde4a..59f2fe0 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/utils/CheckUtilsTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/utils/CheckUtilsTest.java
@@ -186,23 +186,23 @@
 
     @Test
     public void testGetTypeParameterNames() throws Exception {
-        final DetailAST parameterisedClassNode = getNodeFromFile(TokenTypes.CLASS_DEF);
+        final DetailAST parameterizedClassNode = getNodeFromFile(TokenTypes.CLASS_DEF);
         final List<String> expected = Arrays.asList("V", "C");
 
         assertEquals("Invalid type parameters",
-                expected, CheckUtils.getTypeParameterNames(parameterisedClassNode));
+                expected, CheckUtils.getTypeParameterNames(parameterizedClassNode));
     }
 
     @Test
     public void testGetTypeParameters() throws Exception {
-        final DetailAST parameterisedClassNode = getNodeFromFile(TokenTypes.CLASS_DEF);
+        final DetailAST parameterizedClassNode = getNodeFromFile(TokenTypes.CLASS_DEF);
         final DetailAST firstTypeParameter =
-                getNode(parameterisedClassNode, TokenTypes.TYPE_PARAMETER);
+                getNode(parameterizedClassNode, TokenTypes.TYPE_PARAMETER);
         final List<DetailAST> expected = Arrays.asList(firstTypeParameter,
                 firstTypeParameter.getNextSibling().getNextSibling());
 
         assertEquals("Invalid type parameters", expected,
-                CheckUtils.getTypeParameters(parameterisedClassNode));
+                CheckUtils.getTypeParameters(parameterizedClassNode));
     }
 
     @Test
@@ -235,7 +235,7 @@
     }
 
     @Test
-    public void testIsNonViodMethod() throws Exception {
+    public void testIsNonVoidMethod() throws Exception {
         final DetailAST nonVoidMethod = getNodeFromFile(TokenTypes.METHOD_DEF);
         final DetailAST voidMethod = nonVoidMethod.getNextSibling();
 
@@ -276,13 +276,13 @@
         final DetailAST publicVariable = protectedVariable.getNextSibling();
         final DetailAST packageVariable = publicVariable.getNextSibling();
 
-        assertEquals("Invalid access modofier", AccessModifier.PRIVATE,
+        assertEquals("Invalid access modifier", AccessModifier.PRIVATE,
                 CheckUtils.getAccessModifierFromModifiersToken(privateVariable.getFirstChild()));
-        assertEquals("Invalid access modofier", AccessModifier.PROTECTED,
+        assertEquals("Invalid access modifier", AccessModifier.PROTECTED,
                 CheckUtils.getAccessModifierFromModifiersToken(protectedVariable.getFirstChild()));
-        assertEquals("Invalid access modofier", AccessModifier.PUBLIC,
+        assertEquals("Invalid access modifier", AccessModifier.PUBLIC,
                 CheckUtils.getAccessModifierFromModifiersToken(publicVariable.getFirstChild()));
-        assertEquals("Invalid access modofier", AccessModifier.PACKAGE,
+        assertEquals("Invalid access modifier", AccessModifier.PACKAGE,
                 CheckUtils.getAccessModifierFromModifiersToken(packageVariable.getFirstChild()));
     }
 
@@ -310,6 +310,21 @@
     }
 
     @Test
+    public void testGetFirstNode2() {
+        final DetailAST child = new DetailAST();
+        child.setLineNo(6);
+        child.setColumnNo(5);
+
+        final DetailAST root = new DetailAST();
+        root.setLineNo(5);
+        root.setColumnNo(6);
+
+        root.addChild(child);
+
+        assertEquals("Unexpected node", root, CheckUtils.getFirstNode(root));
+    }
+
+    @Test
     public void testIsReceiverParameter() throws Exception {
         final DetailAST objBlock = getNodeFromFile(TokenTypes.OBJBLOCK);
         final DetailAST methodWithReceiverParameter = objBlock.getLastChild().getPreviousSibling();
@@ -344,11 +359,14 @@
 
     @Test
     public void testParseClassNames() {
-        final String className = "I.am.class.name.with.dot.in.the.end.";
-        final Set<String> result = CheckUtils.parseClassNames(className);
+        final Set<String> actual = CheckUtils.parseClassNames(
+                "I.am.class.name.with.dot.in.the.end.", "ClassOnly", "my.Class");
         final Set<String> expected = new HashSet<>();
-        expected.add(className);
-        assertEquals("Result is not expected", expected, result);
+        expected.add("I.am.class.name.with.dot.in.the.end.");
+        expected.add("ClassOnly");
+        expected.add("my.Class");
+        expected.add("Class");
+        assertEquals("Result is not expected", expected, actual);
     }
 
     private DetailAST getNodeFromFile(int type) throws Exception {
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/utils/CommonUtilsTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/utils/CommonUtilsTest.java
index 1a7cfae..52997d5 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/utils/CommonUtilsTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/utils/CommonUtilsTest.java
@@ -92,6 +92,13 @@
     }
 
     @Test
+    public void testCreatePattern() {
+        assertEquals("invalid pattern", "Test", CommonUtils.createPattern("Test").pattern());
+        assertEquals("invalid pattern", ".*Pattern.*", CommonUtils.createPattern(".*Pattern.*")
+                .pattern());
+    }
+
+    @Test
     public void testBadRegex() {
         try {
             CommonUtils.createPattern("[");
@@ -125,14 +132,14 @@
         assertEquals("Invalid line number", 0, testCommentBlock.getLineNo());
 
         final DetailAST contentCommentBlock = testCommentBlock.getFirstChild();
-        assertEquals("Invalid tiken type",
+        assertEquals("Invalid token type",
                 TokenTypes.COMMENT_CONTENT, contentCommentBlock.getType());
         assertEquals("Invalid text", "*test_comment", contentCommentBlock.getText());
         assertEquals("Invalid line number", 0, contentCommentBlock.getLineNo());
         assertEquals("Invalid column number", -1, contentCommentBlock.getColumnNo());
 
         final DetailAST endCommentBlock = contentCommentBlock.getNextSibling();
-        assertEquals("Invalid tiken type", TokenTypes.BLOCK_COMMENT_END, endCommentBlock.getType());
+        assertEquals("Invalid token type", TokenTypes.BLOCK_COMMENT_END, endCommentBlock.getType());
         assertEquals("Invalid text", "*/", endCommentBlock.getText());
     }
 
@@ -143,6 +150,8 @@
         assertFalse("Invalid file extension",
             CommonUtils.matchesFileExtension(pdfFile, fileExtensions));
         assertTrue("Invalid file extension",
+            CommonUtils.matchesFileExtension(pdfFile));
+        assertTrue("Invalid file extension",
             CommonUtils.matchesFileExtension(pdfFile, (String[]) null));
         final File javaFile = new File("file.java");
         assertTrue("Invalid file extension",
@@ -150,6 +159,20 @@
         final File emptyExtensionFile = new File("file.");
         assertTrue("Invalid file extension",
             CommonUtils.matchesFileExtension(emptyExtensionFile, ""));
+        assertFalse("Invalid file extension",
+            CommonUtils.matchesFileExtension(pdfFile, ".noMatch"));
+        assertTrue("Invalid file extension",
+            CommonUtils.matchesFileExtension(pdfFile, ".pdf"));
+    }
+
+    @Test
+    public void testHasWhitespaceBefore() {
+        assertTrue("Invalid result",
+            CommonUtils.hasWhitespaceBefore(0, "a"));
+        assertTrue("Invalid result",
+            CommonUtils.hasWhitespaceBefore(4, "    a"));
+        assertFalse("Invalid result",
+            CommonUtils.hasWhitespaceBefore(5, "    a"));
     }
 
     @Test
@@ -206,7 +229,7 @@
     }
 
     @Test
-    public void testGetNonExistingConstructor() {
+    public void testGetNonExistentConstructor() {
         try {
             CommonUtils.getConstructor(Math.class);
             fail("IllegalStateException is expected");
@@ -266,10 +289,36 @@
     }
 
     @Test
-    public void testGetFileExtensionForFileNameWithoutExtension() {
-        final String fileNameWithoutExtension = "file";
-        final String extension = CommonUtils.getFileExtension(fileNameWithoutExtension);
-        assertEquals("Invalid extension", "", extension);
+    public void testFillTemplateWithStringsByRegexp() {
+        assertEquals("invalid result", "template", CommonUtils.fillTemplateWithStringsByRegexp(
+                "template", "lineToPlaceInTemplate", Pattern.compile("NO MATCH")));
+        assertEquals(
+                "invalid result",
+                "before word after",
+                CommonUtils.fillTemplateWithStringsByRegexp("before $0 after", "word",
+                        Pattern.compile("\\w+")));
+        assertEquals("invalid result", "before word 123 after1 word after2 123 after3",
+                CommonUtils.fillTemplateWithStringsByRegexp("before $0 after1 $1 after2 $2 after3",
+                        "word 123", Pattern.compile("(\\w+) (\\d+)")));
+    }
+
+    @Test
+    public void testGetFileNameWithoutExtension() {
+        assertEquals("invalid result", "filename",
+                CommonUtils.getFileNameWithoutExtension("filename"));
+        assertEquals("invalid result", "filename",
+                CommonUtils.getFileNameWithoutExtension("filename.extension"));
+        assertEquals("invalid result", "filename.subext",
+                CommonUtils.getFileNameWithoutExtension("filename.subext.extension"));
+    }
+
+    @Test
+    public void testGetFileExtension() {
+        assertEquals("Invalid extension", "", CommonUtils.getFileExtension("filename"));
+        assertEquals("Invalid extension", "extension",
+                CommonUtils.getFileExtension("filename.extension"));
+        assertEquals("Invalid extension", "extension",
+                CommonUtils.getFileExtension("filename.subext.extension"));
     }
 
     @Test
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/utils/FilterUtilsTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/utils/FilterUtilsTest.java
index 4f29b39..8b5b773 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/utils/FilterUtilsTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/utils/FilterUtilsTest.java
@@ -58,9 +58,9 @@
     }
 
     @Test
-    public void testNonExistingFile() {
+    public void testNonExistentFile() {
         assertFalse("Suppression file does not exist",
-                FilterUtils.isFileExists("non-existing.xml"));
+                FilterUtils.isFileExists("non-existent.xml"));
     }
 
     @Test
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/utils/JavadocUtilsTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/utils/JavadocUtilsTest.java
index e03e7d2..4114b14 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/utils/JavadocUtilsTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/utils/JavadocUtilsTest.java
@@ -187,7 +187,7 @@
     @Test
     public void testEmptyJavadocComment() {
         final String emptyJavadocComment = "*";
-        assertTrue("Should return true when empty jabadoc comment is passed",
+        assertTrue("Should return true when empty javadoc comment is passed",
                 JavadocUtils.isJavadocComment(emptyJavadocComment));
     }
 
@@ -361,4 +361,11 @@
         assertEquals("Unexpected token name",
             "WBR_TAG", JavadocUtils.getTokenName(10079));
     }
+
+    @Test
+    public void testEscapeAllControlChars() {
+        assertEquals("invalid result", "abc", JavadocUtils.escapeAllControlChars("abc"));
+        assertEquals("invalid result", "1\\r2\\n3\\t",
+                JavadocUtils.escapeAllControlChars("1\\r2\\n3\\t"));
+    }
 }
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/utils/ModuleReflectionUtilsTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/utils/ModuleReflectionUtilsTest.java
index ed20df7..bfabf93 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/utils/ModuleReflectionUtilsTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/utils/ModuleReflectionUtilsTest.java
@@ -87,9 +87,9 @@
     @Test
     public void testIsCheckstyleCheck() {
         assertTrue("Should return true when valid checkstyle check is passed",
-                ModuleReflectionUtils.isCheckstyleCheck(CheckClass.class));
+                ModuleReflectionUtils.isCheckstyleTreeWalkerCheck(CheckClass.class));
         assertFalse("Should return false when invalid class is passed",
-                ModuleReflectionUtils.isCheckstyleCheck(NotCheckstyleCheck.class));
+                ModuleReflectionUtils.isCheckstyleTreeWalkerCheck(NotCheckstyleCheck.class));
     }
 
     @Test
@@ -147,16 +147,23 @@
         assertEquals("should use field", 1, test.getField());
     }
 
-    /** @noinspection SuperClassHasFrequentlyUsedInheritors */
     private static class ValidCheckstyleClass extends AutomaticBean {
         // empty, use default constructor
+
+        @Override
+        protected void finishLocalSetup() throws CheckstyleException {
+            //dummy method
+        }
     }
 
     private static class InvalidNonAutomaticBeanClass {
         // empty, use default constructor
     }
 
-    /** @noinspection AbstractClassNeverImplemented */
+    /**
+     * AbstractInvalidClass.
+     * @noinspection AbstractClassNeverImplemented
+     */
     private abstract static class AbstractInvalidClass extends AutomaticBean {
         public abstract void method();
     }
@@ -187,6 +194,11 @@
 
     private static class FilterClass extends AutomaticBean implements Filter {
         @Override
+        protected void finishLocalSetup() throws CheckstyleException {
+            //dummy method
+        }
+
+        @Override
         public boolean accept(AuditEvent event) {
             return false;
         }
@@ -195,6 +207,11 @@
     private static class FileFilterModuleClass extends AutomaticBean
             implements BeforeExecutionFileFilter {
         @Override
+        protected void finishLocalSetup() throws CheckstyleException {
+            //dummy method
+        }
+
+        @Override
         public boolean accept(String uri) {
             return false;
         }
@@ -202,6 +219,11 @@
 
     private static class RootModuleClass extends AutomaticBean implements RootModule {
         @Override
+        protected void finishLocalSetup() throws CheckstyleException {
+            //dummy method
+        }
+
+        @Override
         public void addListener(AuditListener listener) {
             //dummy method
         }
@@ -224,6 +246,11 @@
 
     private static class TreeWalkerFilterClass extends AutomaticBean implements TreeWalkerFilter {
         @Override
+        protected void finishLocalSetup() throws CheckstyleException {
+            //dummy method
+        }
+
+        @Override
         public boolean accept(TreeWalkerAuditEvent treeWalkerAuditEvent) {
             return false;
         }
@@ -232,6 +259,11 @@
     private static class AuditListenerClass extends AutomaticBean implements AuditListener {
 
         @Override
+        protected void finishLocalSetup() throws CheckstyleException {
+            //dummy method
+        }
+
+        @Override
         public void auditStarted(AuditEvent event) {
             //dummy method
         }
@@ -285,5 +317,10 @@
         public int getField() {
             return field;
         }
+
+        @Override
+        protected void finishLocalSetup() throws CheckstyleException {
+            //dummy method
+        }
     }
 }
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/utils/ScopeUtilsTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/utils/ScopeUtilsTest.java
index d18b588..e7b46c3 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/utils/ScopeUtilsTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/utils/ScopeUtilsTest.java
@@ -39,51 +39,46 @@
     }
 
     @Test
-    public void testInEnumOnRoot() {
+    public void testInEnumBlock() {
         assertFalse("Should return false when passed is not enum",
                 ScopeUtils.isInEnumBlock(new DetailAST()));
-    }
-
-    @Test
-    public void testInEnumBlockInNew() {
         assertFalse("Should return false when passed is not enum",
                 ScopeUtils.isInEnumBlock(getNode(TokenTypes.LITERAL_NEW,
                         TokenTypes.MODIFIERS)));
-    }
-
-    @Test
-    public void testInEnumBlockWithEnum() {
         assertTrue("Should return true when passed is enum",
                 ScopeUtils.isInEnumBlock(getNode(TokenTypes.OBJBLOCK, TokenTypes.ENUM_DEF,
                         TokenTypes.MODIFIERS)));
-    }
-
-    @Test
-    public void testInEnumBlockInInterface() {
         assertFalse("Should return false when passed is not enum",
-                ScopeUtils.isInEnumBlock(getNode(TokenTypes.INTERFACE_DEF,
+                ScopeUtils.isInEnumBlock(getNode(TokenTypes.ENUM_DEF, TokenTypes.INTERFACE_DEF,
                         TokenTypes.MODIFIERS)));
-    }
-
-    @Test
-    public void testInEnumBlockInAnnotation() {
         assertFalse("Should return false when passed is not enum",
-                ScopeUtils.isInEnumBlock(getNode(TokenTypes.ANNOTATION_DEF,
+                ScopeUtils.isInEnumBlock(getNode(TokenTypes.ENUM_DEF, TokenTypes.ANNOTATION_DEF,
                         TokenTypes.MODIFIERS)));
-    }
-
-    @Test
-    public void testInEnumBlockInClass() {
         assertFalse("Should return false when passed is not enum",
-                ScopeUtils.isInEnumBlock(getNode(TokenTypes.CLASS_DEF,
+                ScopeUtils.isInEnumBlock(getNode(TokenTypes.ENUM_DEF, TokenTypes.CLASS_DEF,
                         TokenTypes.MODIFIERS)));
-    }
-
-    @Test
-    public void testInEnumBlockInLiteralNew() {
         assertFalse("Should return false when passed is not enum",
-                ScopeUtils.isInEnumBlock(getNode(TokenTypes.LITERAL_NEW,
+                ScopeUtils.isInEnumBlock(getNode(TokenTypes.ENUM_DEF, TokenTypes.LITERAL_NEW,
                         TokenTypes.IDENT)));
+        assertFalse("Should return false when passed is not expected",
+                ScopeUtils.isInEnumBlock(getNode(TokenTypes.PACKAGE_DEF, TokenTypes.DOT)));
+    }
+
+    @Test
+    public void testIsInCodeBlock() {
+        assertFalse("invalid result", ScopeUtils.isInCodeBlock(getNode(TokenTypes.CLASS_DEF)));
+        assertFalse("invalid result",
+                ScopeUtils.isInCodeBlock(getNode(TokenTypes.ASSIGN, TokenTypes.VARIABLE_DEF)));
+        assertTrue("invalid result",
+                ScopeUtils.isInCodeBlock(getNode(TokenTypes.METHOD_DEF, TokenTypes.OBJBLOCK)));
+        assertTrue("invalid result",
+                ScopeUtils.isInCodeBlock(getNode(TokenTypes.CTOR_DEF, TokenTypes.OBJBLOCK)));
+        assertTrue("invalid result",
+                ScopeUtils.isInCodeBlock(getNode(TokenTypes.INSTANCE_INIT, TokenTypes.OBJBLOCK)));
+        assertTrue("invalid result",
+                ScopeUtils.isInCodeBlock(getNode(TokenTypes.STATIC_INIT, TokenTypes.OBJBLOCK)));
+        assertTrue("invalid result",
+                ScopeUtils.isInCodeBlock(getNode(TokenTypes.LAMBDA, TokenTypes.ASSIGN)));
     }
 
     @Test
@@ -113,6 +108,12 @@
     }
 
     @Test
+    public void testIsOuterMostTypePackageDef() {
+        assertTrue("Should return false when passed is not outer most type",
+                ScopeUtils.isOuterMostType(getNode(TokenTypes.PACKAGE_DEF, TokenTypes.DOT)));
+    }
+
+    @Test
     public void testIsLocalVariableDefCatch() {
         assertTrue("Should return true when passed is variable def",
                 ScopeUtils.isLocalVariableDef(getNode(TokenTypes.LITERAL_CATCH,
@@ -123,6 +124,26 @@
     public void testIsLocalVariableDefUnexpected() {
         assertFalse("Should return false when passed is not variable def",
                 ScopeUtils.isLocalVariableDef(getNode(TokenTypes.LITERAL_CATCH)));
+        assertFalse("Should return false when passed is not variable def",
+                ScopeUtils.isLocalVariableDef(getNode(TokenTypes.COMMA, TokenTypes.PARAMETER_DEF)));
+    }
+
+    @Test
+    public void testIsLocalVariableDefResource() {
+        assertTrue("invalid result",
+                ScopeUtils.isLocalVariableDef(getNode(TokenTypes.RESOURCE)));
+    }
+
+    @Test
+    public void testIsLocalVariableDefVariable() {
+        assertTrue("invalid result",
+                ScopeUtils.isLocalVariableDef(getNode(TokenTypes.SLIST, TokenTypes.VARIABLE_DEF)));
+        assertTrue("invalid result", ScopeUtils.isLocalVariableDef(getNode(TokenTypes.FOR_INIT,
+                TokenTypes.VARIABLE_DEF)));
+        assertTrue("invalid result", ScopeUtils.isLocalVariableDef(getNode(
+                TokenTypes.FOR_EACH_CLAUSE, TokenTypes.VARIABLE_DEF)));
+        assertFalse("invalid result", ScopeUtils.isLocalVariableDef(getNode(TokenTypes.CLASS_DEF,
+                TokenTypes.VARIABLE_DEF)));
     }
 
     @Test
@@ -130,6 +151,11 @@
         assertTrue("Should return true when passed is class field def",
                 ScopeUtils.isClassFieldDef(getNode(TokenTypes.CLASS_DEF,
                         TokenTypes.OBJBLOCK, TokenTypes.VARIABLE_DEF)));
+        assertFalse("Should return false when passed is unexpected",
+                ScopeUtils.isClassFieldDef(getNode(TokenTypes.CLASS_DEF)));
+        assertFalse("Should return false when passed is method variable def",
+                ScopeUtils.isClassFieldDef(getNode(TokenTypes.METHOD_DEF,
+                        TokenTypes.SLIST, TokenTypes.VARIABLE_DEF)));
     }
 
     @Test
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/utils/TokenUtilsTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/utils/TokenUtilsTest.java
index c1a0d97..474479f 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/utils/TokenUtilsTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/utils/TokenUtilsTest.java
@@ -145,7 +145,7 @@
 
     @Test
     public void testTokenIdIncorrect() {
-        final String id = "NON_EXISTING_VALUE";
+        final String id = "NON_EXISTENT_VALUE";
         try {
             TokenUtils.getTokenId(id);
             fail("IllegalArgumentException is expected");
@@ -158,7 +158,7 @@
 
     @Test
     public void testShortDescriptionIncorrect() {
-        final String id = "NON_EXISTING_VALUE";
+        final String id = "NON_EXISTENT_VALUE";
         try {
             TokenUtils.getShortDescription(id);
             fail("IllegalArgumentException is expected");
@@ -184,7 +184,7 @@
     }
 
     @Test
-    public void tetsGetTokenTypesTotalNumber() {
+    public void testGetTokenTypesTotalNumber() {
         final int tokenTypesTotalNumber = TokenUtils.getTokenTypesTotalNumber();
 
         assertEquals("Invalid token total number", 169, tokenTypesTotalNumber);
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/xpath/XpathMapperTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/xpath/XpathMapperTest.java
index 2cc154b..4a3abf0 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/xpath/XpathMapperTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/xpath/XpathMapperTest.java
@@ -111,7 +111,7 @@
 
     @Test
     public void testAttributeOr() throws Exception {
-        final String xpath = "//METHOD_DEF[@text='getSomeMethod' or @text='nonExistingMethod']";
+        final String xpath = "//METHOD_DEF[@text='getSomeMethod' or @text='nonExistentMethod']";
         final RootNode rootNode = getRootNode("InputXpathMapperAst.java");
         final DetailAST[] actual = convertToArray(getXpathItems(xpath, rootNode));
         final DetailAST expectedClassDefNode = getSiblingByType(rootNode.getUnderlyingNode(),
@@ -413,7 +413,7 @@
     }
 
     @Test
-    public void testQueryNonExistingAttribute() throws Exception {
+    public void testQueryNonExistentAttribute() throws Exception {
         final String xpath = "/CLASS_DEF[@text='InputXpathMapperAst']";
         final RootNode rootNode = getRootNode("InputXpathMapperAst.java");
         final List<Item> nodes = getXpathItems(xpath, rootNode);
@@ -450,7 +450,7 @@
     }
 
     @Test
-    public void testQueryNonExistingAnnotation() throws Exception {
+    public void testQueryNonExistentAnnotation() throws Exception {
         final String xpath = "//ANNOTATION[@text='SpringBootApplication']";
         final RootNode rootNode = getRootNode("InputXpathMapperAnnotation.java");
         final List<Item> nodes = getXpathItems(xpath, rootNode);
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/fallthrough/InputFallThrough.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/fallthrough/InputFallThrough.java
index a3c745e..384499f 100644
--- a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/fallthrough/InputFallThrough.java
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/fallthrough/InputFallThrough.java
@@ -547,4 +547,17 @@
                break;
        }
     }
+
+    void multipleCasesOnOneLine() {
+        int i = 0;
+        switch (i) {
+        case 0: case 1: i *= i; // fall through
+        case 2: case 3: i *= i; // fall through
+        case 4: case 5: i *= i; // fall through
+        case 6: case 7: i *= i;
+            break;
+        default:
+            throw new RuntimeException();
+        }
+    }
 }
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/illegaltype/InputIllegalType.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/illegaltype/InputIllegalType.java
index dfce5fd..2efc892 100644
--- a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/illegaltype/InputIllegalType.java
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/illegaltype/InputIllegalType.java
@@ -21,4 +21,6 @@
     
     InputIllegalType(Integer i) {}
     private void table2(Integer i) {}
+
+    private void getInitialContext(java.util.TreeSet v) {} // ignore method by default
 }
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/modifiedcontrolvariable/InputModifiedControlVariableBothForLoops.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/modifiedcontrolvariable/InputModifiedControlVariableBothForLoops.java
index d3f57c7..01c2414 100644
--- a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/modifiedcontrolvariable/InputModifiedControlVariableBothForLoops.java
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/modifiedcontrolvariable/InputModifiedControlVariableBothForLoops.java
@@ -70,6 +70,13 @@
         for (int i = 0,j = 0 ; i <10; i++) {
             j++;
         }
+        
+        for (String v : sa) {
+            new NestedClass() {
+                public void method() {}
+            };
+            v = "bad";
+        }
     }
     private int i;
 }
@@ -83,3 +90,6 @@
         }
     }
 }
+abstract class NestedClass {
+    public abstract void method();
+}
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/multiplevariabledeclarations/InputMultipleVariableDeclarations.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/multiplevariabledeclarations/InputMultipleVariableDeclarations.java
index 16487fb..d178fbf 100644
--- a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/multiplevariabledeclarations/InputMultipleVariableDeclarations.java
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/multiplevariabledeclarations/InputMultipleVariableDeclarations.java
@@ -30,4 +30,8 @@
             int k = 7;
         }
     }
+
+    void method3() {
+        java.lang.Object obj; Object obj1; Object obj2; Object obj3;
+    }
 }
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/nestedfordepth/InputNestedForDepth.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/nestedfordepth/InputNestedForDepth.java
index dfa0eb6..cfa8356 100644
--- a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/nestedfordepth/InputNestedForDepth.java
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/nestedfordepth/InputNestedForDepth.java
@@ -44,6 +44,9 @@
             for (i5 = 0; i5 < 10; i5++) {
               i += 1;
             }
+            for (int i5a = 0; i5a < 10; i5a++) {
+                i += 1;
+              }
           }
         }
       }
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/onestatementperline/InputOneStatementPerLineSingleLine.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/onestatementperline/InputOneStatementPerLineSingleLine.java
index 185b7b7..4a20cb7 100644
--- a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/onestatementperline/InputOneStatementPerLineSingleLine.java
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/onestatementperline/InputOneStatementPerLineSingleLine.java
@@ -238,4 +238,11 @@
      */
     for (;;) { one = 5; }
   }
+
+  public void foo6() {
+      bar(() -> {
+          return;}, () -> {return;});
+  }
+
+  void bar(Runnable r1, Runnable r2) { }
 }
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/parameterassignment/InputParameterAssignmentWithUnchecked.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/parameterassignment/InputParameterAssignmentWithUnchecked.java
index 60f8eed..fbfc6e7 100644
--- a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/parameterassignment/InputParameterAssignmentWithUnchecked.java
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/parameterassignment/InputParameterAssignmentWithUnchecked.java
@@ -19,4 +19,17 @@
     void foo3(String field, int field1) {
         this.field = (field1 += field.length());
     }
+
+    void foo4() {
+        String hidden = "";
+        new NestedClass() {
+            public void test(String hidden) {
+            }
+        };
+        hidden += "test";
+    }
+
+    public static abstract class NestedClass {
+        public abstract void test(String hidden);
+    }
 }
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/requirethis/InputRequireThisAnnotationInterface.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/requirethis/InputRequireThisAnnotationInterface.java
new file mode 100644
index 0000000..b7b3549
--- /dev/null
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/requirethis/InputRequireThisAnnotationInterface.java
@@ -0,0 +1,9 @@
+package com.puppycrawl.tools.checkstyle.checks.coding.requirethis;
+
+public @interface InputRequireThisAnnotationInterface {
+    String DEFAULT_VALUE = "DEFAULT_VALUE";
+
+    String value() default DEFAULT_VALUE;
+
+    String[] results() default {};
+}
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/requirethis/InputRequireThisCatchVariables.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/requirethis/InputRequireThisCatchVariables.java
new file mode 100644
index 0000000..920dd63
--- /dev/null
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/requirethis/InputRequireThisCatchVariables.java
@@ -0,0 +1,40 @@
+package com.puppycrawl.tools.checkstyle.checks.coding.requirethis;
+
+public class InputRequireThisCatchVariables extends Thread {
+    private Throwable ex;
+
+    public InputRequireThisCatchVariables(Throwable ex) {
+        this.ex = ex;
+    }
+
+    @Override
+    public void run() {
+        if (this.ex != null) {
+            try {
+                exceptional(this.ex);
+            }
+            catch (RuntimeException ex) {
+                if (ex == this.ex) {
+                    debug("Expected exception thrown", ex);
+                }
+                else {
+                    ex.printStackTrace();
+                }
+            }
+            catch (Error err) {
+                if (err == this.ex) {
+                    debug("Expected exception thrown", err);
+                }
+                else {
+                    ex.printStackTrace();
+                }
+            }
+            catch (Throwable ex) {
+                ex.printStackTrace();
+            }
+        }
+    }
+
+    private static void exceptional(Throwable ex) {}
+    private static void debug(String message, Throwable err) {}
+}
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/requirethis/InputRequireThisEnumConstant.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/requirethis/InputRequireThisEnumConstant.java
new file mode 100644
index 0000000..4cfc3b3
--- /dev/null
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/requirethis/InputRequireThisEnumConstant.java
@@ -0,0 +1,13 @@
+package com.puppycrawl.tools.checkstyle.checks.coding.requirethis;
+
+public class InputRequireThisEnumConstant {
+    private final String TEST = "";
+    
+    public enum TestEnum {
+        TEST;
+
+        public TestEnum method() {
+            return TEST;
+        }
+    }
+}
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/requirethis/InputRequireThisEnumInnerClassesAndBugs.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/requirethis/InputRequireThisEnumInnerClassesAndBugs.java
index a0bd746..77beca3 100644
--- a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/requirethis/InputRequireThisEnumInnerClassesAndBugs.java
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/requirethis/InputRequireThisEnumInnerClassesAndBugs.java
@@ -134,3 +134,43 @@
         foo();
     }
 }
+class NestedRechange {
+    final String s = "";
+
+    NestedRechange() {
+        String s = "t";
+        s = s.substring(0);
+    }
+
+    private static class NestedStatic {
+        static final String s = "";
+
+        public void method() {
+            s.substring(0);
+        }
+    }
+}
+class NestedFrames {
+    int a = 0;
+    int b = 0;
+
+    public int oneReturnInMethod2() {
+        for (int i = 0; i < 10; i++) {
+            int a = 1;
+            if (a != 2 && true) {
+                if (true | false) {
+                    if (a - a != 0) {
+                        a += 1;
+                    }
+                }
+            }
+        }
+        return a + a * a;
+    }
+
+    public int oneReturnInMethod3() {
+        for (int b = 0; b < 10; b++) {
+        }
+        return b + b * b;
+    }
+}
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/requirethis/InputRequireThisFor.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/requirethis/InputRequireThisFor.java
new file mode 100644
index 0000000..9ad0e9f
--- /dev/null
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/requirethis/InputRequireThisFor.java
@@ -0,0 +1,23 @@
+package com.puppycrawl.tools.checkstyle.checks.coding.requirethis;
+
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+public class InputRequireThisFor {
+    private String name;
+    int bottom;
+
+    public void method1() {
+        for (int i = 0; i < 10; i++) {
+            int bottom = i - 4;
+            bottom = bottom > 0 ? bottom - 1 : bottom;
+        }
+    }
+
+    public void method2() {
+        for (String name : new String[]{}) {
+        }
+
+        Path jarfile = Paths.get(name + ".jar");
+    }
+}
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/requirethis/InputRequireThisMetodReferences.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/requirethis/InputRequireThisMethodReferences.java
similarity index 80%
rename from src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/requirethis/InputRequireThisMetodReferences.java
rename to src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/requirethis/InputRequireThisMethodReferences.java
index 516b85a..b0b528e 100644
--- a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/requirethis/InputRequireThisMetodReferences.java
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/requirethis/InputRequireThisMethodReferences.java
@@ -6,16 +6,16 @@
 import java.util.TreeSet;
 import java.util.stream.Collectors;
 
-public class InputRequireThisMetodReferences {
+public class InputRequireThisMethodReferences {
     private Set<String> tags = Collections.unmodifiableSortedSet(
         Arrays.stream(new String[] {"br", "li", "dt", "dd", "hr", "img", "p", "td", "tr", "th",})
             .collect(Collectors.toCollection(TreeSet::new)));
 
-    public InputRequireThisMetodReferences(Set<String> tags) {
+    public InputRequireThisMethodReferences(Set<String> tags) {
         tags = tags; // violation
     }
 
-    public InputRequireThisMetodReferences() {
+    public InputRequireThisMethodReferences() {
         this.tags = Arrays.stream(
             new String[] {"br", "li", "dt", "dd", "hr", "img", "p", "td", "tr", "th",})
             .collect(Collectors.toCollection(TreeSet::new));
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/returncount/InputReturnCountVoid.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/returncount/InputReturnCountVoid.java
index 9a2d48f..a1becee 100644
--- a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/returncount/InputReturnCountVoid.java
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/returncount/InputReturnCountVoid.java
@@ -37,4 +37,12 @@
 
         return 0;
     }
+
+    void method5() {
+        if (true) {
+            return;
+        }
+
+        return;
+    }
 }
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/unnecessaryparentheses/InputUnnecessaryParenthesesOperatorsAndCasts.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/unnecessaryparentheses/InputUnnecessaryParenthesesOperatorsAndCasts.java
index 777f4b1..33246c1 100644
--- a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/unnecessaryparentheses/InputUnnecessaryParenthesesOperatorsAndCasts.java
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/unnecessaryparentheses/InputUnnecessaryParenthesesOperatorsAndCasts.java
@@ -87,6 +87,14 @@
         System.identityHashCode("arg = " + arg);
     }
 
+    private int f7() {
+        String f;
+
+        f = ("12345678901234567890123");
+
+        return 0;
+    }
+
     static class TypeParameterized<T> {}
     static class TypeA extends TypeParameterized<String> {}
     static class TypeB extends TypeA {}
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/variabledeclarationusagedistance/InputVariableDeclarationUsageDistance.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/variabledeclarationusagedistance/InputVariableDeclarationUsageDistance.java
index 57ca5e7..330abb8 100644
--- a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/variabledeclarationusagedistance/InputVariableDeclarationUsageDistance.java
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/variabledeclarationusagedistance/InputVariableDeclarationUsageDistance.java
@@ -973,5 +973,16 @@
         }
         catch(Exception e){}
     }
+
+    void m() {
+        final int a = 1;
+        int b = 0;
+
+        if (b == 1) {
+            System.lineSeparator();
+        }
+
+        final int c = a + 1;
+    }
     
 }
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/variabledeclarationusagedistance/InputVariableDeclarationUsageDistanceAnonymous.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/variabledeclarationusagedistance/InputVariableDeclarationUsageDistanceAnonymous.java
new file mode 100644
index 0000000..969aa80
--- /dev/null
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/variabledeclarationusagedistance/InputVariableDeclarationUsageDistanceAnonymous.java
@@ -0,0 +1,22 @@
+package com.puppycrawl.tools.checkstyle.checks.coding.variabledeclarationusagedistance;
+
+import java.awt.event.ActionListener;
+import java.awt.event.ActionEvent;
+import javax.swing.JMenuItem;
+
+public class InputVariableDeclarationUsageDistanceAnonymous {
+    public void method() {
+        JMenuItem prefs = new JMenuItem("Preferences...");
+
+        nothing();
+        nothing();
+        nothing();
+        prefs.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+            }
+        });
+    }
+
+    public void nothing() {
+    }
+}
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/variabledeclarationusagedistance/InputVariableDeclarationUsageDistanceLabels.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/variabledeclarationusagedistance/InputVariableDeclarationUsageDistanceLabels.java
new file mode 100644
index 0000000..e9e0e3f
--- /dev/null
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/variabledeclarationusagedistance/InputVariableDeclarationUsageDistanceLabels.java
@@ -0,0 +1,22 @@
+package com.puppycrawl.tools.checkstyle.checks.coding.variabledeclarationusagedistance;
+
+public class InputVariableDeclarationUsageDistanceLabels {
+    public void method() {
+        boolean eol = false;
+
+        nothing();
+        nothing();
+        nothing();
+        nothing();
+        myLoop:
+        for (int i = 0; i < 5; i++) {
+            if (i == 5) {
+                eol = true;
+                break myLoop;
+            }
+        }
+    }
+
+    public void nothing() {
+    }
+}
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/design/throwscount/InputThrowsCountMwthodWithAnnotation.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/design/throwscount/InputThrowsCountMethodWithAnnotation.java
similarity index 90%
rename from src/test/resources/com/puppycrawl/tools/checkstyle/checks/design/throwscount/InputThrowsCountMwthodWithAnnotation.java
rename to src/test/resources/com/puppycrawl/tools/checkstyle/checks/design/throwscount/InputThrowsCountMethodWithAnnotation.java
index 8793435..20a6143 100644
--- a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/design/throwscount/InputThrowsCountMwthodWithAnnotation.java
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/design/throwscount/InputThrowsCountMethodWithAnnotation.java
@@ -6,7 +6,7 @@
 import java.nio.file.FileAlreadyExistsException;
 import java.sql.SQLException;
 
-public class InputThrowsCountMwthodWithAnnotation extends ParentClass {
+public class InputThrowsCountMethodWithAnnotation extends ParentClass {
     @Override
     public void method() throws AWTException, SQLException, FileNotFoundException,
             EOFException, FileAlreadyExistsException {
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/imports/customimportorder/InputCustomImportOrderCompareImports.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/imports/customimportorder/InputCustomImportOrderCompareImports.java
new file mode 100644
index 0000000..a32b019
--- /dev/null
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/imports/customimportorder/InputCustomImportOrderCompareImports.java
@@ -0,0 +1,10 @@
+package com.puppycrawl.tools.checkstyle.checks.imports.customimportorder;
+
+import java.util.Map.Entry;
+import java.util.Map;
+
+import com.google.common.*;
+import com.google.common.annotations.*;
+
+public class InputCustomImportOrderCompareImports {
+}
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/imports/customimportorder/InputCustomImportOrderFindBetterPatternMatch.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/imports/customimportorder/InputCustomImportOrderFindBetterPatternMatch.java
new file mode 100644
index 0000000..0e316b9
--- /dev/null
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/imports/customimportorder/InputCustomImportOrderFindBetterPatternMatch.java
@@ -0,0 +1,13 @@
+package com.puppycrawl.tools.checkstyle.checks.imports.customimportorder;
+
+import javax.lang.model.element.AnnotationValue;
+import java.awt.event.ActionEvent;
+import java.lang.*;
+import java.awt.color.ColorSpace;
+
+import com.google.common.annotations.Beta;
+
+import com.google.common.collect.HashMultimap;
+
+public class InputCustomImportOrderFindBetterPatternMatch {
+}
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/imports/importorder/InputImportOrderRepetiton.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/imports/importorder/InputImportOrderRepetition.java
similarity index 85%
rename from src/test/resources/com/puppycrawl/tools/checkstyle/checks/imports/importorder/InputImportOrderRepetiton.java
rename to src/test/resources/com/puppycrawl/tools/checkstyle/checks/imports/importorder/InputImportOrderRepetition.java
index 7845692..9597953 100644
--- a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/imports/importorder/InputImportOrderRepetiton.java
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/imports/importorder/InputImportOrderRepetition.java
@@ -8,5 +8,5 @@
 import javax.swing.JComponent;
 import javax.swing.JTable;
 
-public class InputImportOrderRepetiton {
+public class InputImportOrderRepetition {
 }
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/imports/importorder/InputImportOrderStaticGroupOrderBottom_Negative.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/imports/importorder/InputImportOrderStaticGroupOrderBottom_Negative.java
new file mode 100644
index 0000000..e093b04
--- /dev/null
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/imports/importorder/InputImportOrderStaticGroupOrderBottom_Negative.java
@@ -0,0 +1,13 @@
+package com.puppycrawl.tools.checkstyle.checks.imports.importorder;
+
+import org.*;
+
+import static java.lang.Math.PI;
+import static org.antlr.v4.runtime.Recognizer.EOF;
+
+import java.util.Set;
+
+public class InputImportOrderStaticGroupOrderBottom_Negative
+{
+
+}
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/imports/importorder/InputImportOrderStaticGroupOrderBottom_Negative2.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/imports/importorder/InputImportOrderStaticGroupOrderBottom_Negative2.java
new file mode 100644
index 0000000..61277ad
--- /dev/null
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/imports/importorder/InputImportOrderStaticGroupOrderBottom_Negative2.java
@@ -0,0 +1,15 @@
+package com.puppycrawl.tools.checkstyle.checks.imports.importorder;
+
+import org.*;
+
+import static java.lang.Math.PI;
+import static org.antlr.v4.runtime.Recognizer.EOF;
+
+import java.util.Set;
+
+import static java.util.Set.*;
+
+public class InputImportOrderStaticGroupOrderBottom_Negative2
+{
+
+}
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/imports/importorder/InputImportOrderStaticGroupSeperated.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/imports/importorder/InputImportOrderStaticGroupSeparated.java
similarity index 82%
rename from src/test/resources/com/puppycrawl/tools/checkstyle/checks/imports/importorder/InputImportOrderStaticGroupSeperated.java
rename to src/test/resources/com/puppycrawl/tools/checkstyle/checks/imports/importorder/InputImportOrderStaticGroupSeparated.java
index dd06f8d..2528dc2 100644
--- a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/imports/importorder/InputImportOrderStaticGroupSeperated.java
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/imports/importorder/InputImportOrderStaticGroupSeparated.java
@@ -7,7 +7,7 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
-public class InputImportOrderStaticGroupSeperated {
+public class InputImportOrderStaticGroupSeparated {
     void method() {
     }
 }
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/indentation/indentation/InputIndentationAnnotationIncorrect.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/indentation/indentation/InputIndentationAnnotationIncorrect.java
new file mode 100644
index 0000000..20d8784
--- /dev/null
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/indentation/indentation/InputIndentationAnnotationIncorrect.java
@@ -0,0 +1,24 @@
+package com.puppycrawl.tools.checkstyle.checks.indentation.indentation; //indent:0 exp:0
+
+class InpuIndentationAnnotationIncorrect { //indent:0 exp:0
+
+    public @interface MyAnnotation1 { //indent:4 exp:4
+        String value(); //indent:8 exp:8
+    } //indent:4 exp:4
+
+    @MyAnnotation2 //indent:4 exp:4
+    @MyAnnotation1 //indent:4 exp:4
+    (value = "") //indent:4 exp:8
+    class innerClass { //indent:4 exp:4
+        @MyAnnotation2 @MyAnnotation1 //indent:8 exp:8
+        (value = "") //indent:8 exp:12
+        public int a; //indent:8 exp:8
+    } //indent:4 exp:4
+
+    @MyAnnotation2 @MyAnnotation1 //indent:4 exp:4
+    (value = "") //indent:4 exp:8
+    class InputIndentationAnnotationInnerClass { //indent:4 exp:4
+
+    } //indent:4 exp:4
+} //indent:0 exp:0
+
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/indentation/indentation/InputIndentationMethodPrecededByAnnotationWithParameterOnSeparateLine.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/indentation/indentation/InputIndentationMethodPrecededByAnnotationWithParameterOnSeparateLine.java
new file mode 100644
index 0000000..b0ea5d2
--- /dev/null
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/indentation/indentation/InputIndentationMethodPrecededByAnnotationWithParameterOnSeparateLine.java
@@ -0,0 +1,20 @@
+package com.puppycrawl.tools.checkstyle.checks.indentation.indentation; //indent:0 exp:0
+
+public class InputIndentationMethodPrecededByAnnotationWithParameterOnSeparateLine { //indent:0 exp:0
+
+  @interface  Annotation1 { //indent:2 exp:2
+    String field1(); //indent:4 exp:4
+    String field2(); //indent:4 exp:4
+  } //indent:2 exp:2
+
+  @interface Annotation2 {}; //indent:2 exp:2
+
+  @Annotation1(field1 = "foo", field2 = "bar") //indent:2 exp:2
+  public @Annotation2 String method( //indent:2 exp:2
+      String param //indent:6 exp:6
+  ) { //indent:2 exp:2
+    return null; //indent:4 exp:4
+  } //indent:2 exp:2
+
+} //indent:0 exp:0
+
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/abstractjavadoc/InputAbstractJavadocPosition.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/abstractjavadoc/InputAbstractJavadocPosition.java
index c83a607..258c511 100644
--- a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/abstractjavadoc/InputAbstractJavadocPosition.java
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/abstractjavadoc/InputAbstractJavadocPosition.java
@@ -95,6 +95,11 @@
 	void/**nope*/ a/**nope*/(@Component/**nope*/int/**nope*/ a/**nope*/)/**nope*/{/**nope*/}/**nope*/
 }
 
+class HHH {
+	/**Javadoc*/
+	java.lang.String/**nope*/ a/**nope*/()/**nope*/{/**nope*/return null;/**nope*/}/**nope*/
+}
+
 ////////////////
 // INTERFACES //
 ////////////////
@@ -229,7 +234,14 @@
 }
 
 /**Javadoc*/
-@interface/**nope*/ MyAnnotation/**nope*/ {/**nope*/
+@interface/**nope*/ MyAnnotation/**nope*/ {
+	/**Javadoc*/
+	@Component/**nope*/abstract/**nope*/String/**nope*/val1()/**nope*/default/**nope*/"";
+	/**Javadoc*/
+	abstract/**nope*/String/**nope*/val2()/**nope*/;
+	/**Javadoc*/
+	java.lang.String/**nope*/val3()/**nope*/;
+	/**nope*/
 }
 
 class MyTemp1 {
@@ -239,3 +251,28 @@
 }
 
 /**nope*/
+/*noise*/
+/**nope*/
+/**Javadoc*/
+//noise
+@Component
+/*noise*/
+interface MultipleJavadoc {
+	/**nope*/
+	/*noise*/
+	/**nope*/
+	/**Javadoc*/
+	/* noise */
+	public /**nope*/ int method();
+	/**nope*/
+	/*noise*/
+	/**nope*/
+	/**Javadoc*/
+	// noise
+	@Deprecated
+	// noise
+	/**nope*/
+	public /**nope*/ void method2();
+}
+
+/**nope*/
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/abstractjavadoc/InputAbstractJavadocPositionWithSinglelineComments.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/abstractjavadoc/InputAbstractJavadocPositionWithSinglelineComments.java
index c95e470..3f320c1 100644
--- a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/abstractjavadoc/InputAbstractJavadocPositionWithSinglelineComments.java
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/abstractjavadoc/InputAbstractJavadocPositionWithSinglelineComments.java
@@ -95,6 +95,11 @@
 	void/**nope*/ a/**nope*/(@Component2/**nope*/int/**nope*/ a/**nope*/)/**nope*/{/**nope*/}/**nope*/
 }
 
+class LKM {
+	/**Javadoc*/ //noise
+	java.lang.String/**nope*/ a/**nope*/(/**nope*/)/**nope*/{/**nope*/return null;/**nope*/}/**nope*/
+}
+
 ////////////////
 // INTERFACES //
 ////////////////
@@ -230,7 +235,14 @@
 }
 
 /**Javadoc*/ //noise
-@interface/**nope*/ MyAnnotation2/**nope*/ {/**nope*/
+@interface/**nope*/ MyAnnotation2/**nope*/ {
+	/**Javadoc*/ //noise
+	@Component2/**nope*/abstract/**nope*/String/**nope*/val1()/**nope*/default/**nope*/"";
+	/**Javadoc*/ //noise
+	abstract/**nope*/String/**nope*/val2()/**nope*/;
+	/**Javadoc*/ //noise
+	java.lang.String/**nope*/val3()/**nope*/;
+	/**nope*/
 }
 
 class MyTemp2 {
@@ -239,4 +251,16 @@
 	}
 }
 
+/**nope*/ /*noise*/ /**nope*/ /**Javadoc*/ //noise
+interface MultipleJavadocs2 {
+	/**nope*/ /*noise*/ /**nope*/ /**Javadoc*/ //noise
+	int method();
+	/**nope*/ /*noise*/ /**nope*/ /**Javadoc*/ //noise
+	@Deprecated
+	/**nope*/ /*noise*/ /**nope*/ //noise
+	public
+	/**nope*/ /*noise*/ /**nope*/ //noise
+	void method2();
+}
+
 /**nope*/
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/javadocmethod/InputJavadocMethodTags.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/javadocmethod/InputJavadocMethodTags.java
index 1926f2d..0766afe 100644
--- a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/javadocmethod/InputJavadocMethodTags.java
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/javadocmethod/InputJavadocMethodTags.java
@@ -297,6 +297,14 @@
 
         return 1;
     }
+
+    /**
+     * misplaced @param aParam
+     * misplaced @return something very important.
+     */
+    int method29(int aParam)
+    { return 0;
+    }
 }
 
 enum InputJavadocMethodTagsEnum
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/nonemptyatclausedescription/InputNonEmptyAtclauseDescription.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/nonemptyatclausedescription/InputNonEmptyAtclauseDescription.java
index bf3346d..1251e99 100644
--- a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/nonemptyatclausedescription/InputNonEmptyAtclauseDescription.java
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/javadoc/nonemptyatclausedescription/InputNonEmptyAtclauseDescription.java
@@ -96,4 +96,31 @@
 	{
 		return 1;
 	}
+
+	/**
+	 * Some javadoc
+	 * @param a Some javadoc
+	 * @param b Some javadoc
+	 * @param c Some javadoc
+	 * @return Some javadoc
+	 * @exception Exception Some javadoc
+	 * @deprecated Some javadoc
+	 */
+	public int foo5(String a, int b, double c) throws Exception
+	{
+		return 1;
+	}
+
+	/**
+	 *
+	 * @param a Some javadoc
+	 * @param b Some javadoc
+	 * @param c Some javadoc
+	 * @return Some javadoc
+	 * @exception Exception
+	 */
+	public int foo6(String a, int b, double c) throws Exception
+	{
+		return 1;
+	}
 }
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/metrics/booleanexpressioncomplexity/InputBooleanExpressionComplexity.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/metrics/booleanexpressioncomplexity/InputBooleanExpressionComplexity.java
index 8d5bd7a..1c8b481 100644
--- a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/metrics/booleanexpressioncomplexity/InputBooleanExpressionComplexity.java
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/metrics/booleanexpressioncomplexity/InputBooleanExpressionComplexity.java
@@ -24,6 +24,13 @@
     }
 
     public boolean equals(Object object) {
+        new NestedClass() {
+            public void method() {
+                new Settings(Settings.FALSE || Settings.FALSE || Settings.FALSE || Settings.FALSE || Settings.FALSE);
+            }
+            public void method2() {
+            }
+        };
         return (((_a && (_b & _c)) || (_c ^ _d) || (_a && _d)));
     }
     
@@ -68,4 +75,9 @@
         {
         }
     }
+
+    abstract class NestedClass {
+        public abstract void method();
+        public abstract void method2();
+    }
 }
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/metrics/classfanoutcomplexity/InputClassFanOutComplexityPackageName.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/metrics/classfanoutcomplexity/InputClassFanOutComplexityPackageName.java
new file mode 100644
index 0000000..c0386f1
--- /dev/null
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/metrics/classfanoutcomplexity/InputClassFanOutComplexityPackageName.java
@@ -0,0 +1,7 @@
+package com.puppycrawl.tools.checkstyle.checks.metrics.classfanoutcomplexity;
+
+public interface InputClassFanOutComplexityPackageName {
+    public com.puppycrawl.tools.checkstyle.checks.metrics.classfanoutcomplexity.InputClassFanOutComplexityPackageName method1();
+
+    public com.puppycrawl.tools.checkstyle.checks.metrics.classfanoutcomplexity.InputClassFanOutComplexityPackageName method2();
+}
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/metrics/npathcomplexity/InputNPathComplexityDefault.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/metrics/npathcomplexity/InputNPathComplexityDefault.java
index 390d4dd..fe4a52a 100644
--- a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/metrics/npathcomplexity/InputNPathComplexityDefault.java
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/metrics/npathcomplexity/InputNPathComplexityDefault.java
@@ -109,4 +109,17 @@
         };
         new Thread(runnable).start();       
     }
+
+    public void InputNestedTernaryCheck() {
+        double x = (getSmth() || Math.random() == 5) ? null : (int) Math
+                .cos(400 * (10 + 40)); // good
+        double y = (0.2 == Math.random()) ? (0.3 == Math.random()) ? null : (int) Math
+                .cos(400 * (10 + 40)) : 6; // bad (nested in first position)
+        double z = (Integer) ((0.2 == Math.random()) ? (Integer) null + apply(null)
+                : (0.3 == Math.random()) ? (Integer) null : (int) Math
+                        .sin(300 * (12 + 30))); // bad (nested in second
+                                                // position)
+    }
+    public boolean getSmth() { return true; }; 
+    public int apply(Object o) { return 0; }
 }
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/modifier/redundantmodifier/InputRedundantModifierFinalInEnumStaticMethods.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/modifier/redundantmodifier/InputRedundantModifierFinalInEnumStaticMethods.java
new file mode 100644
index 0000000..0668729
--- /dev/null
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/modifier/redundantmodifier/InputRedundantModifierFinalInEnumStaticMethods.java
@@ -0,0 +1,16 @@
+package com.puppycrawl.tools.checkstyle.checks.modifier.redundantmodifier;
+
+public class InputRedundantModifierFinalInEnumStaticMethods {
+    public enum TestEnum {
+        VALUE {
+           @Override public void someMethodToOverride() {
+                // do it differently
+            }
+         };
+
+        public void someMethodToOverride() { }
+        public static final void someStaticMethod() { }    //violation
+        public static void someMethod() { }
+    }
+}
+
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/naming/methodname/InputMethodNameEqualClassName.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/naming/methodname/InputMethodNameEqualClassName.java
index 277ab48..5a9ed01 100644
--- a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/naming/methodname/InputMethodNameEqualClassName.java
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/naming/methodname/InputMethodNameEqualClassName.java
@@ -47,10 +47,10 @@
     int SweetInterface();
 }
 
-class Outter {
+class Outer {
 	
 	//illegal name
-    public void Outter() {
+    public void Outer() {
 		
 	}
 }
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/naming/methodname/InputMethodNameOverridenMethods.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/naming/methodname/InputMethodNameOverriddenMethods.java
similarity index 88%
rename from src/test/resources/com/puppycrawl/tools/checkstyle/checks/naming/methodname/InputMethodNameOverridenMethods.java
rename to src/test/resources/com/puppycrawl/tools/checkstyle/checks/naming/methodname/InputMethodNameOverriddenMethods.java
index c253ffa..102be8b 100644
--- a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/naming/methodname/InputMethodNameOverridenMethods.java
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/naming/methodname/InputMethodNameOverriddenMethods.java
@@ -1,6 +1,6 @@
 package com.puppycrawl.tools.checkstyle.checks.naming.methodname;
 
-public class InputMethodNameOverridenMethods extends SomeClass 
+public class InputMethodNameOverriddenMethods extends SomeClass
 {
     @Override
     public void PUBLICfoo() { //Ignored due to impossibility of change by developer
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/translation/ExpectedTranslationLog.xml b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/translation/ExpectedTranslationLog.xml
new file mode 100644
index 0000000..7f7a772
--- /dev/null
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/translation/ExpectedTranslationLog.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<checkstyle version="8.3-SNAPSHOT">
+<file name="InputTranslationCheckFireErrors.properties">
+</file>
+<file name="InputTranslationCheckFireErrors_de.properties">
+</file>
+<file name="">
+<error line="0" severity="error" message="$0" source="com.puppycrawl.tools.checkstyle.checks.TranslationCheck"/>
+</file>
+<file name="InputTranslationCheckFireErrors.properties">
+</file>
+<file name="InputTranslationCheckFireErrors_de.properties">
+<error line="0" severity="error" message="$1" source="com.puppycrawl.tools.checkstyle.checks.TranslationCheck"/>
+</file>
+</checkstyle>
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/translation/OutputTranslationCheckLinux.xml b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/translation/OutputTranslationCheckLinux.xml
deleted file mode 100644
index 34a16cb..0000000
--- a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/translation/OutputTranslationCheckLinux.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<checkstyle version="8.3-SNAPSHOT">
-<file name="path_to_file/InputTranslationCheckFireErrors.properties">
-</file>
-<file name="path_to_file/InputTranslationCheckFireErrors_de.properties">
-</file>
-<file name="path_to_file">
-<error line="0" severity="error" message="%s" source="com.puppycrawl.tools.checkstyle.checks.TranslationCheck"/>
-</file>
-<file name="path_to_file/InputTranslationCheckFireErrors.properties">
-</file>
-<file name="path_to_file/InputTranslationCheckFireErrors_de.properties">
-<error line="0" severity="error" message="%s" source="com.puppycrawl.tools.checkstyle.checks.TranslationCheck"/>
-</file>
-</checkstyle>
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/translation/OutputTranslationCheckMacOS.xml b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/translation/OutputTranslationCheckMacOS.xml
deleted file mode 100644
index 865791f..0000000
--- a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/translation/OutputTranslationCheckMacOS.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<checkstyle version="8.3-SNAPSHOT">
-<file name="path_to_file/InputTranslationCheckFireErrors.properties">
-</file>
-<file name="path_to_file/InputTranslationCheckFireErrors_de.properties">
-</file>
-<file name="path_to_file">
-<error line="0" severity="error" message="%s" source="com.puppycrawl.tools.checkstyle.checks.TranslationCheck"/>
-</file>
-<file name="path_to_file/InputTranslationCheckFireErrors_de.properties">
-<error line="0" severity="error" message="%s" source="com.puppycrawl.tools.checkstyle.checks.TranslationCheck"/>
-</file>
-<file name="path_to_file/InputTranslationCheckFireErrors.properties">
-</file>
-</checkstyle>
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/translation/OutputTranslationCheckWindows.xml b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/translation/OutputTranslationCheckWindows.xml
deleted file mode 100644
index 443bba3..0000000
--- a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/translation/OutputTranslationCheckWindows.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<checkstyle version="8.3-SNAPSHOT">
-<file name="path_to_file\InputTranslationCheckFireErrors.properties">
-</file>
-<file name="path_to_file\InputTranslationCheckFireErrors_de.properties">
-</file>
-<file name="path_to_file">
-<error line="0" severity="error" message="%s" source="com.puppycrawl.tools.checkstyle.checks.TranslationCheck"/>
-</file>
-<file name="path_to_file\InputTranslationCheckFireErrors.properties">
-</file>
-<file name="path_to_file\InputTranslationCheckFireErrors_de.properties">
-<error line="0" severity="error" message="%s" source="com.puppycrawl.tools.checkstyle.checks.TranslationCheck"/>
-</file>
-</checkstyle>
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/whitespace/nowhitespaceafter/InputNoWhitespaceAfter.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/whitespace/nowhitespaceafter/InputNoWhitespaceAfter.java
index 4cdd506..34f62a3 100644
--- a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/whitespace/nowhitespaceafter/InputNoWhitespaceAfter.java
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/whitespace/nowhitespaceafter/InputNoWhitespaceAfter.java
@@ -291,4 +291,8 @@
     @
     interface BAD3{}
     @interface Ok{}
+
+    static {
+        int[]err = new int [50];
+    }
 }
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/whitespace/nowhitespaceafter/InputNoWhitespaceAfterArrayDeclarations.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/whitespace/nowhitespaceafter/InputNoWhitespaceAfterArrayDeclarations.java
index 9ba53be..001bd78 100644
--- a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/whitespace/nowhitespaceafter/InputNoWhitespaceAfterArrayDeclarations.java
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/whitespace/nowhitespaceafter/InputNoWhitespaceAfterArrayDeclarations.java
@@ -37,10 +37,10 @@
         };
     }
     int ar [] = new int [] {1, 2}; //Incorrect (2 warnings)
-    private int [][][] getMultArray() { //Incorrect
+    private int [][][] getMultiArray() { //Incorrect
         return null;
     }
-    private long getLongMultArray(int someParam, String value) [][][] { //Incorrect
+    private long getLongMultiArray(int someParam, String value) [][][] { //Incorrect
         return null;
     }
     int aa = new int[]{1}[0];//Correct
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/whitespace/nowhitespaceafter/InputNoWhitespaceAfterArrayDeclarations2.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/whitespace/nowhitespaceafter/InputNoWhitespaceAfterArrayDeclarations2.java
index f632316..7a33245 100644
--- a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/whitespace/nowhitespaceafter/InputNoWhitespaceAfterArrayDeclarations2.java
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/whitespace/nowhitespaceafter/InputNoWhitespaceAfterArrayDeclarations2.java
@@ -103,6 +103,14 @@
         if(someStuff15 instanceof Object[][]) {
           
         }
+        Object[] a = null;
+
+        if(a instanceof Object  []) {//incorrect
+          
+        }
+        if(a instanceof Object[][]) {
+          
+        }
     }
 
 }
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/configurationloader/InputConfigurationLoaderNonexistingProperty.xml b/src/test/resources/com/puppycrawl/tools/checkstyle/configurationloader/InputConfigurationLoaderNonexistentProperty.xml
similarity index 79%
rename from src/test/resources/com/puppycrawl/tools/checkstyle/configurationloader/InputConfigurationLoaderNonexistingProperty.xml
rename to src/test/resources/com/puppycrawl/tools/checkstyle/configurationloader/InputConfigurationLoaderNonexistentProperty.xml
index 95bb8a3..58441ac 100644
--- a/src/test/resources/com/puppycrawl/tools/checkstyle/configurationloader/InputConfigurationLoaderNonexistingProperty.xml
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/configurationloader/InputConfigurationLoaderNonexistentProperty.xml
@@ -5,5 +5,5 @@
     "http://checkstyle.sourceforge.net/dtds/configuration_1_3.dtd">
 
 <module name="Checker">
-    <property name="tabWidth" value="${nonexisting}" />
+    <property name="tabWidth" value="${nonexistent}" />
 </module>
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/filters/suppressionsloader/InputSuppressionsLoaderMultiple.xml b/src/test/resources/com/puppycrawl/tools/checkstyle/filters/suppressionsloader/InputSuppressionsLoaderMultiple.xml
index 283d550..3754f2d 100644
--- a/src/test/resources/com/puppycrawl/tools/checkstyle/filters/suppressionsloader/InputSuppressionsLoaderMultiple.xml
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/filters/suppressionsloader/InputSuppressionsLoaderMultiple.xml
@@ -1,10 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE suppressions PUBLIC
-    "-//Puppy Crawl//DTD Suppressions 1.0//EN"
-    "http://checkstyle.sourceforge.net/dtds/suppressions_1_0.dtd">
+    "-//Puppy Crawl//DTD Suppressions 1.2//EN"
+    "http://checkstyle.sourceforge.net/dtds/suppressions_1_2.dtd">
 <suppressions>
   <suppress files="file0" checks="check0"/>
   <suppress files="file1" checks="check1" lines="1,2-3"/>
   <suppress files="file2" checks="check2" columns="1,2-3"/>
   <suppress files="file3" checks="check3" lines="1,2-3" columns="1,2-3"/>
+  <suppress message="message0"/>
 </suppressions>
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/filters/suppressionsloader/InputSuppressionsLoaderXpathCorrect.xml b/src/test/resources/com/puppycrawl/tools/checkstyle/filters/suppressionsloader/InputSuppressionsLoaderXpathCorrect.xml
index d1e284a..05aa135 100644
--- a/src/test/resources/com/puppycrawl/tools/checkstyle/filters/suppressionsloader/InputSuppressionsLoaderXpathCorrect.xml
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/filters/suppressionsloader/InputSuppressionsLoaderXpathCorrect.xml
@@ -1,7 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE suppressions PUBLIC
-    "-//Puppy Crawl//DTD Suppressions Xpath Experimental 1.1//EN"
-    "http://checkstyle.sourceforge.net/dtds/suppressions_1_1_xpath_experimental.dtd">
+    "-//Puppy Crawl//DTD Suppressions Xpath Experimental 1.2//EN"
+    "http://checkstyle.sourceforge.net/dtds/suppressions_1_2_xpath_experimental.dtd">
 <suppressions>
   <suppress-xpath files="file1" id="id1" checks="test" query="/CLASS_DEF"/>
+  <suppress-xpath message="message1" query="/CLASS_DEF"/>
 </suppressions>
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/filters/suppresswithplaintextcommentfilter/InputSuppressWithPlainTextCommentFilter.js b/src/test/resources/com/puppycrawl/tools/checkstyle/filters/suppresswithplaintextcommentfilter/InputSuppressWithPlainTextCommentFilter.js
new file mode 100644
index 0000000..9e0fbce
--- /dev/null
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/filters/suppresswithplaintextcommentfilter/InputSuppressWithPlainTextCommentFilter.js
@@ -0,0 +1,7 @@
+// CS-OFF
+alert( 2 === 1 );
+
+// CS-ON
+alert( 2 === 1 );
+
+alert( 2 != 1 );
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/filters/suppresswithplaintextcommentfilter/InputSuppressWithPlainTextCommentFilter.properties b/src/test/resources/com/puppycrawl/tools/checkstyle/filters/suppresswithplaintextcommentfilter/InputSuppressWithPlainTextCommentFilter.properties
new file mode 100644
index 0000000..549756f
--- /dev/null
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/filters/suppresswithplaintextcommentfilter/InputSuppressWithPlainTextCommentFilter.properties
@@ -0,0 +1,4 @@
+# CHECKSTYLE:OFF
+key1=
+# CHECKSTYLE:ON
+key2=
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/filters/suppresswithplaintextcommentfilter/InputSuppressWithPlainTextCommentFilter.sql b/src/test/resources/com/puppycrawl/tools/checkstyle/filters/suppresswithplaintextcommentfilter/InputSuppressWithPlainTextCommentFilter.sql
new file mode 100644
index 0000000..662164f
--- /dev/null
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/filters/suppresswithplaintextcommentfilter/InputSuppressWithPlainTextCommentFilter.sql
@@ -0,0 +1,5 @@
+-- CHECKSTYLE OFF
+	SELECT COUNT(1) FROM filters;
+
+-- CHECKSTYLE ON
+	SELECT COUNT(1) FROM checks;
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/filters/suppresswithplaintextcommentfilter/InputSuppressWithPlainTextCommentFilter.xml b/src/test/resources/com/puppycrawl/tools/checkstyle/filters/suppresswithplaintextcommentfilter/InputSuppressWithPlainTextCommentFilter.xml
new file mode 100644
index 0000000..685ec35
--- /dev/null
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/filters/suppresswithplaintextcommentfilter/InputSuppressWithPlainTextCommentFilter.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--CS-OFF-->
+
+<root>
+    <child>
+	</child>
+    <!--CS-ON-->
+    <child>
+	</child>
+</root>
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/filters/suppresswithplaintextcommentfilter/InputSuppressWithPlainTextCommentFilterCustomMessageFormat.java b/src/test/resources/com/puppycrawl/tools/checkstyle/filters/suppresswithplaintextcommentfilter/InputSuppressWithPlainTextCommentFilterCustomMessageFormat.java
new file mode 100644
index 0000000..d66fce6
--- /dev/null
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/filters/suppresswithplaintextcommentfilter/InputSuppressWithPlainTextCommentFilterCustomMessageFormat.java
@@ -0,0 +1,15 @@
+package com.puppycrawl.tools.checkstyle.filters.suppresswithplaintextcommentfilter;
+
+public class InputSuppressWithPlainTextCommentFilterCustomMessageFormat {
+
+    // CHECKSTYLE:OFF
+    private int A1;
+
+	private static final int a1 = 5; // contains tab character
+
+    int a2 = 100;
+
+    // CHECKSTYLE:ON
+    private long a3 = 1;
+
+}
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/filters/suppresswithplaintextcommentfilter/InputSuppressWithPlainTextCommentFilterSuppressById.java b/src/test/resources/com/puppycrawl/tools/checkstyle/filters/suppresswithplaintextcommentfilter/InputSuppressWithPlainTextCommentFilterSuppressById.java
new file mode 100644
index 0000000..f18d95e
--- /dev/null
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/filters/suppresswithplaintextcommentfilter/InputSuppressWithPlainTextCommentFilterSuppressById.java
@@ -0,0 +1,16 @@
+package com.puppycrawl.tools.checkstyle.filters.suppresswithplaintextcommentfilter;
+
+public class InputSuppressWithPlainTextCommentFilterSuppressById {
+
+    //CSOFF ignore (reason)
+    private int A1;
+
+    // @cs-: ignore (reason)
+	private static final int a1 = 5; // contains tab character
+
+    int a2 = 100;
+    //CSON ignore
+
+    private long a3 = 1;
+
+}
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/filters/suppresswithplaintextcommentfilter/InputSuppressWithPlainTextCommentFilterWithCustomOnAndOffComments.java b/src/test/resources/com/puppycrawl/tools/checkstyle/filters/suppresswithplaintextcommentfilter/InputSuppressWithPlainTextCommentFilterWithCustomOnAndOffComments.java
new file mode 100644
index 0000000..9f7067d
--- /dev/null
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/filters/suppresswithplaintextcommentfilter/InputSuppressWithPlainTextCommentFilterWithCustomOnAndOffComments.java
@@ -0,0 +1,14 @@
+package com.puppycrawl.tools.checkstyle.filters.suppresswithplaintextcommentfilter;
+
+public class InputSuppressWithPlainTextCommentFilterWithCustomOnAndOffComments {
+    // cs-off
+    //	has tab here
+
+    // cs-on
+    //	has tab here
+
+
+    /* cs-off **/ private int	b; /* cs-on **/
+
+    private 	int c;
+}
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/filters/suppresswithplaintextcommentfilter/InputSuppressWithPlainTextCommentFilterWithDefaultCfg.java b/src/test/resources/com/puppycrawl/tools/checkstyle/filters/suppresswithplaintextcommentfilter/InputSuppressWithPlainTextCommentFilterWithDefaultCfg.java
new file mode 100644
index 0000000..3a1a64d
--- /dev/null
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/filters/suppresswithplaintextcommentfilter/InputSuppressWithPlainTextCommentFilterWithDefaultCfg.java
@@ -0,0 +1,12 @@
+package com.puppycrawl.tools.checkstyle.filters.suppresswithplaintextcommentfilter;
+
+public class InputSuppressWithPlainTextCommentFilterWithDefaultCfg {
+    // CHECKSTYLE:OFF
+    //	has tab here
+
+    // CHECKSTYLE:ON
+    //	has tab here
+
+	private int a; // CHECKSTYLE:OFF
+    // CHECKSTYLE:ON
+}
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/main/InputMainConfig-non-existing-classname-ignore.xml b/src/test/resources/com/puppycrawl/tools/checkstyle/main/InputMainConfig-non-existent-classname-ignore.xml
similarity index 89%
rename from src/test/resources/com/puppycrawl/tools/checkstyle/main/InputMainConfig-non-existing-classname-ignore.xml
rename to src/test/resources/com/puppycrawl/tools/checkstyle/main/InputMainConfig-non-existent-classname-ignore.xml
index efee92a..cb1e347 100644
--- a/src/test/resources/com/puppycrawl/tools/checkstyle/main/InputMainConfig-non-existing-classname-ignore.xml
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/main/InputMainConfig-non-existent-classname-ignore.xml
@@ -6,7 +6,7 @@
 
 <module name="Checker">
     <module name="TreeWalker">
-        <module name="NonExistingClass">
+        <module name="NonExistentClass">
             <property name="severity" value="ignore"/>
         </module>
     </module>
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/main/InputMainConfig-non-existing-classname.xml b/src/test/resources/com/puppycrawl/tools/checkstyle/main/InputMainConfig-non-existent-classname.xml
similarity index 89%
rename from src/test/resources/com/puppycrawl/tools/checkstyle/main/InputMainConfig-non-existing-classname.xml
rename to src/test/resources/com/puppycrawl/tools/checkstyle/main/InputMainConfig-non-existent-classname.xml
index 5945458..01316ff 100644
--- a/src/test/resources/com/puppycrawl/tools/checkstyle/main/InputMainConfig-non-existing-classname.xml
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/main/InputMainConfig-non-existent-classname.xml
@@ -6,7 +6,7 @@
 
 <module name="Checker">
     <module name="TreeWalker">
-        <module name="NonExistingClass">
+        <module name="NonExistentClass">
             <property name="severity" value="warning"/>
         </module>
     </module>
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/utils/blockcommentposition/InputBlockCommentPositionOnAnnotationField.java b/src/test/resources/com/puppycrawl/tools/checkstyle/utils/blockcommentposition/InputBlockCommentPositionOnAnnotationField.java
new file mode 100644
index 0000000..80577e1
--- /dev/null
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/utils/blockcommentposition/InputBlockCommentPositionOnAnnotationField.java
@@ -0,0 +1,25 @@
+package com.puppycrawl.tools.checkstyle.utils.blockcommentposition;
+
+public @interface InputBlockCommentPositionOnAnnotationField {
+    /**
+     * I'm a javadoc
+     */
+    String value() default "";
+
+    /**
+     * I'm a javadoc
+     */
+    abstract String value1() default "";
+
+    /**
+     * I'm a javadoc
+     */
+    @Deprecated
+    String value2() default "";
+
+    /**
+     * I'm a javadoc
+     */
+    @Deprecated
+    abstract String value3() default "";
+}
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/utils/blockcommentposition/InputBlockCommentPositionOnMethod.java b/src/test/resources/com/puppycrawl/tools/checkstyle/utils/blockcommentposition/InputBlockCommentPositionOnMethod.java
index e2b5a0b..06e4f4d 100644
--- a/src/test/resources/com/puppycrawl/tools/checkstyle/utils/blockcommentposition/InputBlockCommentPositionOnMethod.java
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/utils/blockcommentposition/InputBlockCommentPositionOnMethod.java
@@ -22,4 +22,11 @@
     int method2(){
         return 0;
     }
+
+    /**
+     * I'm a javadoc
+     */
+    java.lang.String method3(){
+        return null;
+    }
 }
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/xmllogger/ExpectedXMLLogger.xml b/src/test/resources/com/puppycrawl/tools/checkstyle/xmllogger/ExpectedXMLLogger.xml
new file mode 100644
index 0000000..9d02b76
--- /dev/null
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/xmllogger/ExpectedXMLLogger.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<checkstyle version="">
+<file name="Test.java">
+</file>
+</checkstyle>
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/xmllogger/ExpectedXMLLoggerEmpty.xml b/src/test/resources/com/puppycrawl/tools/checkstyle/xmllogger/ExpectedXMLLoggerEmpty.xml
new file mode 100644
index 0000000..91fd284
--- /dev/null
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/xmllogger/ExpectedXMLLoggerEmpty.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<checkstyle version="">
+</checkstyle>
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/xmllogger/ExpectedXMLLoggerError.xml b/src/test/resources/com/puppycrawl/tools/checkstyle/xmllogger/ExpectedXMLLoggerError.xml
new file mode 100644
index 0000000..b3998bf
--- /dev/null
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/xmllogger/ExpectedXMLLoggerError.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<checkstyle version="">
+<file name="Test.java">
+<error line="1" column="1" severity="error" message="$0" source="com.puppycrawl.tools.checkstyle.XMLLoggerTest"/>
+</file>
+</checkstyle>
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/xmllogger/ExpectedXMLLoggerErrorModuleId.xml b/src/test/resources/com/puppycrawl/tools/checkstyle/xmllogger/ExpectedXMLLoggerErrorModuleId.xml
new file mode 100644
index 0000000..cd3bec8
--- /dev/null
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/xmllogger/ExpectedXMLLoggerErrorModuleId.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<checkstyle version="">
+<error line="1" column="1" severity="error" message="$0" source="module"/>
+</checkstyle>
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/xmllogger/ExpectedXMLLoggerErrorNullFileName.xml b/src/test/resources/com/puppycrawl/tools/checkstyle/xmllogger/ExpectedXMLLoggerErrorNullFileName.xml
new file mode 100644
index 0000000..dae3ac4
--- /dev/null
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/xmllogger/ExpectedXMLLoggerErrorNullFileName.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<checkstyle version="">
+<error line="1" column="1" severity="error" message="$0" source="com.puppycrawl.tools.checkstyle.XMLLoggerTest"/>
+</checkstyle>
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/xmllogger/ExpectedXMLLoggerErrorZeroColumn.xml b/src/test/resources/com/puppycrawl/tools/checkstyle/xmllogger/ExpectedXMLLoggerErrorZeroColumn.xml
new file mode 100644
index 0000000..b0959a9
--- /dev/null
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/xmllogger/ExpectedXMLLoggerErrorZeroColumn.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<checkstyle version="">
+<file name="Test.java">
+<error line="1" severity="error" message="$0" source="com.puppycrawl.tools.checkstyle.XMLLoggerTest"/>
+</file>
+</checkstyle>
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/xmllogger/ExpectedXMLLoggerException.xml b/src/test/resources/com/puppycrawl/tools/checkstyle/xmllogger/ExpectedXMLLoggerException.xml
new file mode 100644
index 0000000..0a5b431
--- /dev/null
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/xmllogger/ExpectedXMLLoggerException.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<checkstyle version="">
+&lt;exception&gt;&#10;&lt;![CDATA[&#10;stackTrace&#10;example]]&gt;&#10;&lt;/exception&gt;&#10;
+</checkstyle>
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/xmllogger/ExpectedXMLLoggerException2.xml b/src/test/resources/com/puppycrawl/tools/checkstyle/xmllogger/ExpectedXMLLoggerException2.xml
new file mode 100644
index 0000000..9f125a0
--- /dev/null
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/xmllogger/ExpectedXMLLoggerException2.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<checkstyle version="">
+<file name="Test.java">
+&lt;exception&gt;&#10;&lt;![CDATA[&#10;stackTrace&#10;example]]&gt;&#10;&lt;/exception&gt;&#10;
+</file>
+</checkstyle>
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/xmllogger/ExpectedXMLLoggerException3.xml b/src/test/resources/com/puppycrawl/tools/checkstyle/xmllogger/ExpectedXMLLoggerException3.xml
new file mode 100644
index 0000000..a28d515
--- /dev/null
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/xmllogger/ExpectedXMLLoggerException3.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<checkstyle version="">
+&lt;exception&gt;&#10;&lt;![CDATA[&#10;stackTrace&#10;example]]&gt;&#10;&lt;/exception&gt;&#10;
+<file name="Test.java">
+</file>
+</checkstyle>
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/xmllogger/ExpectedXMLLoggerExceptionNullFileName.xml b/src/test/resources/com/puppycrawl/tools/checkstyle/xmllogger/ExpectedXMLLoggerExceptionNullFileName.xml
new file mode 100644
index 0000000..0a5b431
--- /dev/null
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/xmllogger/ExpectedXMLLoggerExceptionNullFileName.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<checkstyle version="">
+&lt;exception&gt;&#10;&lt;![CDATA[&#10;stackTrace&#10;example]]&gt;&#10;&lt;/exception&gt;&#10;
+</checkstyle>
diff --git a/src/xdocs/config.xml b/src/xdocs/config.xml
index 2e8103b..1b71431 100644
--- a/src/xdocs/config.xml
+++ b/src/xdocs/config.xml
@@ -14,13 +14,12 @@
   </head>
 
   <body>
-<!-- till https://issues.apache.org/jira/browse/MSITE-748
     <section name="Content">
       <macro name="toc">
         <param name="fromDepth" value="1"/>
         <param name="toDepth" value="1"/>
       </macro>
-    </section> -->
+    </section>
 
     <section name="Overview">
       <p>
@@ -823,7 +822,7 @@
       </source>
 
       <div class="tip">
-        <h4>Note</h4>
+        <b>Note</b>
         <p>
           As of Checkstyle 5.0 it is unnecessary to repeat the
           <code>package</code> elements for Checkstyle's packages in
@@ -835,7 +834,7 @@
 
     <section name="XML Structure">
 
-      <h4>Configuration XML Document</h4>
+      <b>Configuration XML Document</b>
       <p>
         The following DTD for a configuration XML document specifies the
         hierarchy of modules and their properties:
@@ -880,7 +879,7 @@
         conventions.
       </p>
 
-      <h4>Package Names XML Document</h4>
+      <b>Package Names XML Document</b>
       <p>
         This is a DTD for a package names XML document:
       </p>
@@ -907,7 +906,7 @@
 &quot;http://checkstyle.sourceforge.net/dtds/packages_1_1.dtd&quot;&gt;
       </source>
 
-      <h4>Suppressions XML Document</h4>
+      <b>Suppressions XML Document</b>
       <p>
         This is a DTD for a suppressions XML document:
       </p>
@@ -918,8 +917,9 @@
 &lt;!ELEMENT suppressions (suppress*)&gt;
 
 &lt;!ELEMENT suppress EMPTY&gt;
-&lt;!ATTLIST suppress files CDATA #REQUIRED
+&lt;!ATTLIST suppress files CDATA #IMPLIED
                    checks CDATA #IMPLIED
+                   message CDATA #IMPLIED
                    id CDATA #IMPLIED
                    lines CDATA #IMPLIED
                    columns CDATA #IMPLIED&gt;
diff --git a/src/xdocs/config_coding.xml b/src/xdocs/config_coding.xml
index d05b6c2..c44d889 100644
--- a/src/xdocs/config_coding.xml
+++ b/src/xdocs/config_coding.xml
@@ -3984,6 +3984,10 @@
             <a href="https://github.com/search?q=path%3Asrc%2Fmain%2Fresources%2Fcom%2Fpuppycrawl%2Ftools%2Fcheckstyle%2Fchecks%2Fcoding+filename%3Amessages*.properties+repo%3Acheckstyle%2Fcheckstyle+%22return.count%22">
             return.count</a>
           </li>
+          <li>
+            <a href="https://github.com/search?q=path%3Asrc%2Fmain%2Fresources%2Fcom%2Fpuppycrawl%2Ftools%2Fcheckstyle%2Fchecks%2Fcoding+filename%3Amessages*.properties+repo%3Acheckstyle%2Fcheckstyle+%22return.countVoid%22">
+            return.countVoid</a>
+          </li>
         </ul>
         <p>
           All messages can be customized if the default message doesn't suit you.
diff --git a/src/xdocs/config_filters.xml b/src/xdocs/config_filters.xml
index e5ae5cd..f78de04 100644
--- a/src/xdocs/config_filters.xml
+++ b/src/xdocs/config_filters.xml
@@ -483,19 +483,25 @@
                   <code>files</code> -
                   a <a href="property_types.html#regexp">Regular Expression</a>
                   matched against the file name associated with an audit
-                  event. It is mandatory.
+                  event. It is optional.
               </li>
               <li>
                   <code>checks</code> -
                   a <a href="property_types.html#regexp">Regular Expression</a>
                   matched against the name of the check associated with an audit
-                  event. Optional if <code>id</code> is specified.
+                  event. Optional as long as <code>id</code> or <code>message</code> is specified.
+              </li>
+              <li>
+                  <code>message</code> -
+                  a <a href="property_types.html#regexp">Regular Expression</a>
+                  matched against the message of the check associated with an audit
+                  event.  Optional as long as <code>checks</code> or <code>id</code> is specified.
               </li>
               <li>
                   <code>id</code> -
                   a <a href="property_types.html#string">string</a>
                   matched against the ID of the check associated with an audit
-                  event. Optional if <code>checks</code> is specified.
+                  event.  Optional as long as <code>checks</code> or <code>message</code> is specified.
               </li>
               <li>
                   <code>lines</code> - a comma-separated list of
@@ -527,7 +533,9 @@
             lines 82 and 108 to 122 of
             file <code>AbstractComplexityCheck.java</code>,
             and <code>MagicNumberCheck</code> errors for line
-            221 of file <code>JavadocStyleCheck.java</code>:
+            221 of file <code>JavadocStyleCheck.java</code>,
+            and '<code>Missing a Javadoc comment</code>' errors
+            for all lines and files:
           </p>
           <source>
 &lt;?xml version=&quot;1.0&quot;?&gt;
@@ -544,6 +552,7 @@
   files=&quot;JavadocStyleCheck.java&quot;
   lines=&quot;221&quot;/&gt;
 &lt;/suppressions&gt;
+&lt;suppress message=&quot;Missing a Javadoc comment&quot;/&gt;&lt;/suppressions&gt;
           </source>
           <p>
             As another example to suppress Check by module id:
@@ -615,6 +624,12 @@
           <source>
 &lt;suppress checks=&quot;FileLength&quot; files=&quot;com[\\/]mycompany[\\/]app[\\/].*IT.java&quot;/&gt;
           </source>
+          <p>
+            Suppress naming errors on variable named 'log' in all files:
+          </p>
+          <source>
+&lt;suppress message=&quot;Name 'log' must match pattern&quot;/&gt;
+          </source>
       </subsection>
       <subsection name="Example of Usage">
         <ul>
@@ -633,6 +648,229 @@
       </subsection>
     </section>
 
+    <section name="SuppressionXpathFilter">
+      <subsection name="Description">
+        <p>Since Checkstyle 8.6</p>
+        <p>
+          Filter <code>SuppressionXpathFilter</code> works as
+          <a href="config_filters.html#SuppressionFilter">SuppressionFilter</a>.
+          Additionally, filter processes <code>suppress-xpath</code> elements,
+          which contains xpath-expressions. Xpath-expressions
+          are queries for suppressed nodes inside the AST tree.
+        </p>
+        <p>
+          Note, after resolving
+          <a href="https://github.com/checkstyle/checkstyle/issues/4530">issue 4530</a>
+          CLI will have option to generate the basic suppression xpath to elements.
+        </p>
+        <p>
+          Currently, filter supports the following
+          checks:
+        </p>
+        <ul>
+          <li>CyclomaticComplexityCheck</li>
+          <li>DeclarationOrderCheck</li>
+          <li>DefaultComesLastCheck</li>
+          <li>ExplicitInitializationCheck</li>
+          <li>FallThroughCheck</li>
+          <li>HiddenFieldCheck</li>
+          <li>IllegalCatchCheck</li>
+          <li>IllegalThrowsCheck</li>
+          <li>JavadocMethodCheck</li>
+          <li>JavadocVariableCheck</li>
+          <li>ImportControlCheck</li>
+          <li>LeftCurlyCheck</li>
+          <li>MethodParamPadCheck</li>
+          <li>MultipleVariableDeclarationCheck</li>
+          <li>NestedForDepthCheck</li>
+          <li>NestedIfDepthCheck</li>
+          <li>NestedTryDepthCheck</li>
+          <li>NPathComplexityCheck</li>
+          <li>OneStatementPerLineCheck</li>
+          <li>OuterTypeNumberCheck</li>
+          <li>RequireThisCheck</li>
+          <li>RightCurlyCheck</li>
+        </ul>
+        <p>
+          Note, that support for other Checks will be available after resolving
+          <a href="https://github.com/checkstyle/checkstyle/issues/4830">issue 4830</a>.
+        </p>
+      </subsection>
+      <subsection name="Properties">
+        <table>
+          <tr>
+            <th>name</th>
+            <th>description</th>
+            <th>type</th>
+            <th>default value</th>
+            <th>since</th>
+          </tr>
+          <tr>
+            <td>file</td>
+            <td>
+              the location of the <em>suppressions XML document</em> file.
+              The order the location is checked is:
+              <ol>
+                <li>as a filesystem location</li>
+                <li>
+                  if no file found, and the location starts with either
+                  <code>http://</code> or <code>https://</code>, then it
+                  is interpreted as a URL
+                </li>
+                <li>
+                  if no file found, then passed to the
+                  <code>ClassLoader.getResource()</code> method.
+                </li>
+              </ol>
+            </td>
+            <td><a href="property_types.html#string">string</a></td>
+            <td><code>none</code></td>
+            <td>8.6</td>
+          </tr>
+          <tr>
+            <td>optional</td>
+            <td>
+              Tells what to do when the file is not existing. If
+              optional is set to false the file must exist, or else
+              it ends with error. On the other hand if optional is
+              true and file is not found, the filter accept all
+              audit events.
+            </td>
+            <td><a href="property_types.html#boolean">Boolean</a></td>
+            <td><code>false</code></td>
+            <td>8.6</td>
+          </tr>
+        </table>
+      </subsection>
+      <subsection name="Examples">
+        <p>
+          For example, the following configuration fragment directs the
+          Checker to use a <code>SuppressionXpathFilter</code>
+          with suppressions
+          file <code>config/suppressions.xml</code>:
+        </p>
+        <source>
+&lt;module name=&quot;SuppressionXpathFilter&quot;&gt;
+  &lt;property name=&quot;file&quot; value=&quot;config/suppressions.xml&quot;/&gt;
+  &lt;property name=&quot;optional&quot; value=&quot;false&quot;/&gt;
+&lt;/module&gt;
+        </source>
+        <p>
+          A <a href="config.html#XML_Structure"><em>suppressions XML
+          document</em></a> contains a set
+          of <code>suppress</code> and <code>suppress-xpath</code> elements, where
+          each <code>suppress-xpath</code> element can have the
+          following attributes:
+        </p>
+        <ul>
+          <li>
+            <code>files</code> -
+            a <a href="property_types.html#regexp">Regular Expression</a>
+            matched against the file name associated with an audit
+            event. It is optional.
+          </li>
+          <li>
+            <code>checks</code> -
+            a <a href="property_types.html#regexp">Regular Expression</a>
+            matched against the name of the check associated with an audit
+            event. Optional as long as <code>id</code> or <code>message</code> is specified.
+          </li>
+          <li>
+            <code>message</code> -
+            a <a href="property_types.html#regexp">Regular Expression</a>
+            matched against the message of the check associated with an audit
+            event.  Optional as long as <code>checks</code> or <code>id</code> is specified.
+          </li>
+          <li>
+            <code>id</code> -
+            a <a href="property_types.html#string">string</a>
+            matched against the ID of the check associated with an audit
+            event.  Optional as long as <code>checks</code> or <code>message</code> is specified.
+          </li>
+          <li>
+            <code>query</code> -
+            a <a href="property_types.html#string">string</a>
+            xpath query. It is optional.
+          </li>
+        </ul>
+        <p>
+          Each audit event is checked against
+          each <code>suppress</code> and <code>suppress-xpath</code> element. It is
+          suppressed if all specified attributes match against the audit
+          event.
+        </p>
+        <p>
+          The following suppressions XML document directs
+          a <code>SuppressionXpathFilter</code> to
+          reject <code>CyclomaticComplexity</code> errors for
+          all methods with name <i>sayHelloWorld</i> inside <i>FileOne</i>
+          and <i>FileTwo</i> classes:
+        </p>
+        <source>
+&lt;?xml version=&quot;1.0&quot;?&gt;
+
+&lt;!DOCTYPE suppressions PUBLIC
+&quot;-//Puppy Crawl//DTD Suppressions Xpath Experimental 1.2//EN&quot;
+&quot;http://checkstyle.sourceforge.net/dtds/suppressions_1_2_xpath_experimental.dtd&quot;&gt;
+
+&lt;suppressions&gt;
+  &lt;suppress-xpath checks=&quot;CyclomaticComplexity&quot;
+  files=&quot;FileOne.java,FileTwo.java&quot;
+  query=&quot;//METHOD_DEF[@text='sayHelloWorld']&quot;/&gt;
+&lt;/suppressions&gt;
+        </source>
+        <p>
+          Suppress checks for package definitions:
+        </p>
+        <source>
+&lt;suppress-xpath checks=&quot;.*&quot; query=&quot;/PACKAGE_DEF&quot;/&gt;
+        </source>
+        <p>
+          Suppress checks for parent element of the first variable definition:
+        </p>
+        <source>
+&lt;suppress-xpath checks=&quot;.*&quot; query=&quot;(//VARIABLE_DEF)[1]/..&quot;/&gt;
+        </source>
+        <p>
+          Suppress checks for elements which are either class definitions,
+          either method definitions.
+        </p>
+        <source>
+&lt;suppress-xpath checks=&quot;.*&quot; query=&quot;//CLASS_DEF | //METHOD_DEF&quot;/&gt;
+        </source>
+        <p>
+          Suppress checks for certain methods:
+        </p>
+        <source>
+&lt;suppress-xpath checks=&quot;.*&quot; query=&quot;//METHOD_DEF[@text='getSomeVar'
+          or @text='setSomeVar']&quot;/&gt;
+        </source>
+        <p>
+          Suppress checks for variable <i>testVariable</i> inside <i>testMethod</i> method
+          inside <i>TestClass</i> class.
+        </p>
+        <source>
+&lt;suppress-xpath checks=&quot;.*&quot; query=&quot;/CLASS_DEF[@text='TestClass']
+          //METHOD_DEF[@text='testMethod']//VARIABLE_DEF[@text='testVariable']&quot;/&gt;
+        </source>
+      </subsection>
+      <subsection name="Example of Usage">
+        <ul>
+          <li>
+            <a href="https://github.com/search?q=path%3Aconfig+filename%3Acheckstyle_checks.xml+repo%3Acheckstyle%2Fcheckstyle+SuppressionXpathFilter">
+              Checkstyle Style</a>
+          </li>
+        </ul>
+      </subsection>
+      <subsection name="Package">
+        <p> com.puppycrawl.tools.checkstyle.filters </p>
+      </subsection>
+
+      <subsection name="Parent Module">
+        <p> <a href="config.html#TreeWalker">TreeWalker</a> </p>
+      </subsection>
+    </section>
+
     <section name="SuppressWarningsFilter">
       <subsection name="Description">
           <p>Since Checkstyle 5.7</p>
@@ -986,5 +1224,301 @@
           <p> <a href="config.html#TreeWalker">TreeWalker</a> </p>
         </subsection>
       </section>
+
+    <section name="SuppressWithPlainTextCommentFilter">
+          <subsection name="Description">
+              <p>Since Checkstyle 8.6</p>
+              <p>
+                  Filter <code>SuppressWithPlainTextCommentFilter</code> uses plain text to suppress
+                  audit events. The filter can be used only to suppress audit events received from
+                  the checks which implement FileSetCheck interface. In other words, the checks
+                  which have Checker as a parent module. The filter knows nothing about AST,
+                  it treats only plain text comments and extracts the information required
+                  for suppression from the plain text comments. Currently the filter supports
+                  only single line comments.
+              </p>
+              <p>
+                  Please, be aware of the fact that, it is not recommended to use the filter
+                  for Java code anymore, however you still are able to use it to suppress audit
+                  events received from the checks which implement FileSetCheck interface.
+              </p>
+              <p>
+                  Rationale: Sometimes there are legitimate reasons for violating
+                  a check.  When this is a matter of the code in question and not
+                  personal preference, the best place to override the policy is in
+                  the code itself.  Semi-structured comments can be associated
+                  with the check.  This is sometimes superior to a separate
+                  suppressions file, which must be kept up-to-date as the source
+                  file is edited.
+              </p>
+              <p>
+                  Note that the suppression comment should be put before the violation. You can use more
+                  than one suppression comment each on separate line.
+              </p>
+          </subsection>
+          <subsection name="Properties">
+              <table>
+                  <tr>
+                      <th>name</th>
+                      <th>description</th>
+                      <th>type</th>
+                      <th>default value</th>
+                      <th>since</th>
+                  </tr>
+                  <tr>
+                      <td>offCommentFormat</td>
+                      <td>comment pattern to trigger filter to begin suppression</td>
+                      <td><a href="property_types.html#regexp">Regular Expression</a></td>
+                      <td><code>"// CHECKSTYLE:OFF"</code></td>
+                      <td>8.6</td>
+                  </tr>
+                  <tr>
+                      <td>onCommentFormat</td>
+                      <td>comment pattern to trigger filter to end suppression</td>
+                      <td><a href="property_types.html#regexp">Regular Expression</a></td>
+                      <td><code>"// CHECKSTYLE:ON"</code></td>
+                      <td>8.6</td>
+                  </tr>
+                  <tr>
+                      <td>checkFormat</td>
+                      <td>check pattern to suppress</td>
+                      <td><a href="property_types.html#regexp">Regular Expression</a></td>
+                      <td><code>".*"</code></td>
+                      <td>8.6</td>
+                  </tr>
+                  <tr>
+                      <td>messageFormat</td>
+                      <td>message pattern to suppress</td>
+                      <td><a href="property_types.html#regexp">Regular Expression</a></td>
+                      <td><code>null</code></td>
+                      <td>8.6</td>
+                  </tr>
+              </table>
+              <p>
+                  offCommentFormat and onCommentFormat must have equal <a
+                      href="https://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html#groupCount()">paren counts</a>.
+              </p>
+          </subsection>
+          <subsection name="Examples">
+              <p>
+                  To configure a filter to suppress audit events between a comment
+                  containing <code>CHECKSTYLE:OFF</code> and a comment containing
+                  <code>CHECKSTYLE:ON</code>:
+              </p>
+              <source>
+&lt;module name=&quot;Checker&quot;&gt;
+  ...
+  &lt;module name=&quot;SuppressWithPlainTextCommentFilter&quot;/&gt;
+  ...
+&lt;/module&gt;
+              </source>
+              <p>
+                  To configure a filter to suppress audit events between a comment
+                  containing line <code>BEGIN GENERATED CONTENT</code> and a comment
+                  containing line <code>END GENERATED CONTENT</code>
+                  (Checker is configured to check only properties files):
+              </p>
+              <source>
+&lt;module name=&quot;Checker&quot;&gt;
+  &lt;property name=&quot;fileExtensions&quot; value=&quot;properties&quot;/&gt;
+
+  &lt;module name=&quot;SuppressWithPlainTextCommentFilter&quot;&gt;
+    &lt;property name=&quot;offCommentFormat&quot; value=&quot;BEGIN GENERATED CONTENT&quot;/&gt;
+    &lt;property name=&quot;onCommentFormat&quot; value=&quot;END GENERATED CONTENT&quot;/&gt;
+  &lt;/module>
+
+&lt;/module&gt;
+              </source>
+              <source>
+//BEGIN GENERATED CONTENT
+my.property=value1 // No violation events will be reported
+my.property=value2 // No violation events will be reported
+//END GENERATED CONTENT
+. . .
+              </source>
+              <p>
+                  To configure a filter so that <code>-- stop tab
+                  check</code> and <code>-- resume tab check</code> marks allowed tab positions
+                  (Checker is configured to check only sql files):
+              </p>
+              <source>
+&lt;module name=&quot;Checker&quot;&gt;
+  &lt;property name=&quot;fileExtensions&quot; value=&quot;sql&quot;/&gt;
+
+  &lt;module name=&quot;SuppressWithPlainTextCommentFilter&quot;&gt;
+    &lt;property name=&quot;offCommentFormat&quot; value=&quot;stop tab check&quot;/&gt;
+    &lt;property name=&quot;onCommentFormat&quot; value=&quot;resume tab check&quot;/&gt;
+    &lt;property name=&quot;checkFormat&quot; value=&quot;FileTabCharacterCheck&quot;/&gt;
+  &lt;/module>
+
+&lt;/module>
+              </source>
+              <source>
+-- stop tab check
+  SELECT * FROM users // won't warn here if there is a tab character on line
+-- resume tab check
+  SELECT 1 // will warn here if there is a tab character on line
+              </source>
+              <p>
+                  To configure a filter so that name of suppressed check mentioned
+                  in comment <code>CSOFF: <i>regexp</i></code>
+                  and <code>CSON: <i>regexp</i></code> mark a matching check
+                  (Checker is configured to check only xml files):
+              </p>
+              <source>
+&lt;module name=&quot;Checker&quot;&gt;
+  &lt;property name=&quot;fileExtensions&quot; value=&quot;xml&quot;/&gt;
+
+  &lt;module name=&quot;SuppressWithPlainTextCommentFilter&quot;&gt;
+    &lt;property name=&quot;offCommentFormat&quot; value=&quot;CSOFF\: ([\w\|]+)&quot;/&gt;
+    &lt;property name=&quot;onCommentFormat&quot; value=&quot;CSON\: ([\w\|]+)&quot;/&gt;
+    &lt;property name=&quot;checkFormat&quot; value=&quot;$1&quot;/&gt;
+  &lt;/module&gt;
+
+&lt;/module>
+              </source>
+              <source>
+// CSOFF: RegexpSinglelineCheck
+&lt;condition property=&quot;checkstyle.ant.skip&quot;&gt; // RegexpSingleline check won't warn here if the line matches regexp
+  &lt;isset property=&quot;checkstyle.ant.skip&quot;/&gt; // RegexpSingleline check won't warn here if the line matches regexp
+&lt;/condition&gt; // RegexpSingleline check won't warn here if the line matches regexp
+// CSON: RegexpSinglelineCheck
+&lt;property name=&quot;checkstyle.pattern.todo&quot; value=&quot;NOTHingWillMatCH_-&quot;/&gt; // RegexpSingleline check will warn here if the line matches regexp
+              </source>
+              <p>
+                  To configure a filter to suppress all audit events between a comment
+                  containing <code>CHECKSTYLE_OFF: ALMOST_ALL</code> and a comment containing
+                  <code>CHECKSTYLE_OFF: ALMOST_ALL</code> except for the <em>EqualsHashCode</em> check
+                  (Checker is configured to check only java files):
+              </p>
+              <source>
+&lt;module name=&quot;Checker&quot;&gt;
+  &lt;property name=&quot;fileExtensions&quot; value=&quot;java&quot;/&gt;
+
+  &lt;module name=&quot;SuppressWithPlainTextCommentFilter&quot;&gt;
+    &lt;property name=&quot;offCommentFormat&quot; value=&quot;CHECKSTYLE_OFF: ALMOST_ALL&quot;/&gt;
+    &lt;property name=&quot;onCommentFormat&quot; value=&quot;CHECKSTYLE_ON: ALMOST_ALL&quot;/&gt;
+    &lt;property name=&quot;checkFormat&quot; value=&quot;^((?!(FileTabCharacterCheck)).)*$&quot;/&gt;
+  &lt;/module&gt;
+
+&lt;/module>
+              </source>
+              <source>
+// CHECKSTYLE_OFF: ALMOST_ALL
+public static final int array [];
+private String [] strArray;
+// CHECKSTYLE_ON: ALMOST_ALL
+private int array1 [];
+              </source>
+              <p>
+                  To configure a filter to suppress Check's violation message <b>which matches
+                  specified message in messageFormat</b> (so suppression will not be only by
+                  Check's name, but also by message text, as the same Check can report
+                  violations with different message format) between a comment
+                  containing <code>stop</code> and comment containing <code>resume</code>:
+              </p>
+              <source>
+&lt;module name=&quot;Checker&quot;&gt;
+  &lt;module name=&quot;SuppressWithPlainTextCommentFilter&quot;&gt;
+    &lt;property name=&quot;offCommentFormat&quot; value=&quot;stop&quot;/&gt;
+    &lt;property name=&quot;onCommentFormat&quot; value=&quot;resume&quot;/&gt;
+    &lt;property name=&quot;checkFormat&quot; value=&quot;FileTabCharacterCheck&quot;/&gt;
+    &lt;property name=&quot;messageFormat&quot; value=&quot;^File contains tab characters (this is the first instance)\.$&quot;/&gt;
+  &lt;/module&gt;
+&lt;/module>
+              </source>
+              <p>
+                  It is possible to specify an ID of checks, so that it can be leveraged by the
+                  SuppressWithPlainTextCommentFilter to skip validations.
+                  The following examples show how to skip validations near code that is surrounded
+                  with <code>-- CSOFF &lt;ID> (reason)</code> and <code>-- CSON &lt;ID></code>,
+                  where ID is the ID of checks you want to suppress.
+              </p>
+              <p>
+                  Examples of Checkstyle checks configuration:
+              </p>
+              <source>
+&lt;module name=&quot;RegexpSinglelineJava&quot;&gt;
+  &lt;property name=&quot;id&quot; value=&quot;count&quot;/&gt;
+  &lt;property name="format" value="^.*COUNT(*).*$"/&gt;
+  &lt;property name="message" value="Don't use COUNT(*), use COUNT(1) instead."/&gt;
+&lt;/module&gt;
+
+&lt;module name=&quot;RegexpSinglelineJava&quot;&gt;
+  &lt;property name=&quot;id&quot; value=&quot;join&quot;/&gt;
+  &lt;property name="format" value="^.*JOIN\s.+\s(ON|USING)$"/&gt;
+  &lt;property name="message" value="Don't use JOIN, use sub-select instead."/&gt;
+&lt;/module&gt;
+              </source>
+              <p>
+                  Example of SuppressWithPlainTextCommentFilter configuration (checkFormat which is set to '$1'
+                  points that ID of the checks is in the first group of offCommentFormat and
+                  onCommentFormat regular expressions):
+              </p>
+              <source>
+&lt;module name=&quot;Checker&quot;&gt;
+  &lt;property name=&quot;fileExtensions&quot; value=&quot;sql&quot;/&gt;
+
+  &lt;module name="SuppressWithPlainTextCommentFilter&quot;&gt;
+    &lt;property name="offCommentFormat" value="CSOFF (\w+) \(\w+\)"/&gt;
+    &lt;property name="onCommentFormat" value="CSON (\w+)"/&gt;
+    &lt;property name="checkFormat" value="$1"/&gt;
+  &lt;/module&gt;
+
+&lt;/module&gt;
+              </source>
+              <source>
+-- CSOFF join (it is ok to use join here for performance reasons)
+SELECT name, job_name
+FROM users AS u
+JOIN jobs AS j ON u.job_id = j.id
+-- CSON join
+
+-- CSOFF count (test query execution plan)
+EXPLAIN SELECT COUNT(*) FROM restaurants
+-- CSON count
+              </source>
+              <p>
+                  Example of how to configure the check to suppress more than one check
+                  (Checker is configured to check only sql files).
+              </p>
+              <source>
+&lt;module name=&quot;Checker&quot;&gt;
+  &lt;property name=&quot;fileExtensions&quot; value=&quot;sql&quot;/&gt;
+
+  &lt;module name="SuppressWithPlainTextCommentFilter&quot;&gt;
+    &lt;property name="offCommentFormat" value="@cs-\: ([\w\|]+)"/&gt;
+    &lt;property name="checkFormat" value="$1"/&gt;
+  &lt;/module&gt;
+
+&lt;/module&gt;
+              </source>
+              <source>
+-- @cs-: RegexpSinglelineCheck
+-- @cs-: FileTabCharacterCheck
+CREATE TABLE STATION (
+  ID INTEGER PRIMARY KEY,
+  CITY CHAR(20),
+  STATE CHAR(2),
+  LAT_N REAL,
+  LONG_W REAL);
+              </source>
+          </subsection>
+          <subsection name="Example of Usage">
+              <ul>
+                  <li>
+                      <a href="https://github.com/search?q=path%3Aconfig+filename%3Acheckstyle_checks.xml+repo%3Acheckstyle%2Fcheckstyle+SuppressWithPlainTextCommentFilter">
+                          Checkstyle Style</a>
+                  </li>
+              </ul>
+          </subsection>
+          <subsection name="Package">
+              <p> com.puppycrawl.tools.checkstyle.filters </p>
+          </subsection>
+
+          <subsection name="Parent Module">
+              <p> <a href="config.html#Checker">Checker</a> </p>
+          </subsection>
+      </section>
   </body>
 </document>
diff --git a/src/xdocs/config_javadoc.xml b/src/xdocs/config_javadoc.xml
index c1ade7f..49da8de 100644
--- a/src/xdocs/config_javadoc.xml
+++ b/src/xdocs/config_javadoc.xml
@@ -41,6 +41,16 @@
             <th>since</th>
           </tr>
           <tr>
+            <td>violateExecutionOnNonTightHtml</td>
+            <td>
+              If turned on, will print violations if the Javadoc being examined by this check
+              violates the tight html rules defined at
+              <a href="writingjavadocchecks.html#Tight-HTML_rules">Tight-HTML Rules</a>.</td>
+            <td><a href="property_types.html#boolean">Boolean</a></td>
+            <td><code>false</code></td>
+            <td>8.3</td>
+          </tr>
+          <tr>
             <td>target</td>
             <td>allows to specify targets to check at-clauses.</td>
             <td>subset of tokens
@@ -619,6 +629,16 @@
             <th>since</th>
           </tr>
           <tr>
+            <td>violateExecutionOnNonTightHtml</td>
+            <td>
+              If turned on, will print violations if the Javadoc being examined by this check
+              violates the tight html rules defined at
+              <a href="writingjavadocchecks.html#Tight-HTML_rules">Tight-HTML Rules</a>.</td>
+            <td><a href="property_types.html#boolean">Boolean</a></td>
+            <td><code>false</code></td>
+            <td>8.3</td>
+          </tr>
+          <tr>
             <td>allowNewlineParagraph</td>
             <td>whether the &lt;p&gt; tag should be placed immediately before the first word</td>
             <td><a href="property_types.html#boolean">Boolean</a></td>
@@ -991,6 +1011,16 @@
             <th>since</th>
           </tr>
           <tr>
+            <td>violateExecutionOnNonTightHtml</td>
+            <td>
+              If turned on, will print violations if the Javadoc being examined by this check
+              violates the tight html rules defined at
+              <a href="writingjavadocchecks.html#Tight-HTML_rules">Tight-HTML Rules</a>.</td>
+            <td><a href="property_types.html#boolean">Boolean</a></td>
+            <td><code>false</code></td>
+            <td>8.3</td>
+          </tr>
+          <tr>
             <td>offset</td>
             <td>How many spaces to use for new indentation level.</td>
             <td><a href="property_types.html#integer">Integer</a></td>
@@ -1417,18 +1447,30 @@
             <th>since</th>
           </tr>
           <tr>
+            <td>violateExecutionOnNonTightHtml</td>
+            <td>
+              If turned on, will print violations if the Javadoc being examined by this check
+              violates the tight html rules defined at
+              <a href="writingjavadocchecks.html#Tight-HTML_rules">Tight-HTML Rules</a>.</td>
+            <td><a href="property_types.html#boolean">Boolean</a></td>
+            <td><code>false</code></td>
+            <td>8.3</td>
+          </tr>
+          <tr>
             <td>javadocTokens</td>
             <td>javadoc tokens to check</td>
             <td>subset of javadoc tokens
               <a href="apidocs/com/puppycrawl/tools/checkstyle/api/JavadocTokenTypes.html#PARAM_LITERAL">PARAM_LITERAL</a>,
               <a href="apidocs/com/puppycrawl/tools/checkstyle/api/JavadocTokenTypes.html#RETURN_LITERAL">RETURN_LITERAL</a>,
               <a href="apidocs/com/puppycrawl/tools/checkstyle/api/JavadocTokenTypes.html#THROWS_LITERAL">THROWS_LITERAL</a>,
+              <a href="apidocs/com/puppycrawl/tools/checkstyle/api/JavadocTokenTypes.html#TEXCEPTION_LITERAL">EXCEPTION_LITERAL</a>,
               <a href="apidocs/com/puppycrawl/tools/checkstyle/api/JavadocTokenTypes.html#DEPRECATED_LITERAL">DEPRECATED_LITERAL</a>.
             </td>
             <td>
               <a href="apidocs/com/puppycrawl/tools/checkstyle/api/JavadocTokenTypes.html#PARAM_LITERAL">PARAM_LITERAL</a>,
               <a href="apidocs/com/puppycrawl/tools/checkstyle/api/JavadocTokenTypes.html#RETURN_LITERAL">RETURN_LITERAL</a>,
               <a href="apidocs/com/puppycrawl/tools/checkstyle/api/JavadocTokenTypes.html#THROWS_LITERAL">THROWS_LITERAL</a>,
+              <a href="apidocs/com/puppycrawl/tools/checkstyle/api/JavadocTokenTypes.html#TEXCEPTION_LITERAL">EXCEPTION_LITERAL</a>,
               <a href="apidocs/com/puppycrawl/tools/checkstyle/api/JavadocTokenTypes.html#DEPRECATED_LITERAL">DEPRECATED_LITERAL</a>.
             </td>
             <td>7.3</td>
@@ -1517,6 +1559,16 @@
             <th>since</th>
           </tr>
           <tr>
+            <td>violateExecutionOnNonTightHtml</td>
+            <td>
+              If turned on, will print violations if the Javadoc being examined by this check
+              violates the tight html rules defined at
+              <a href="writingjavadocchecks.html#Tight-HTML_rules">Tight-HTML Rules</a>.</td>
+            <td><a href="property_types.html#boolean">Boolean</a></td>
+            <td><code>false</code></td>
+            <td>8.3</td>
+          </tr>
+          <tr>
             <td>ignoredTags</td>
             <td>allows to specify at-clauses which are ignored by the check.</td>
             <td><a href="property_types.html#stringSet">String Set</a></td>
@@ -1622,6 +1674,16 @@
             <th>since</th>
           </tr>
           <tr>
+            <td>violateExecutionOnNonTightHtml</td>
+            <td>
+              If turned on, will print violations if the Javadoc being examined by this check
+              violates the tight html rules defined at
+              <a href="writingjavadocchecks.html#Tight-HTML_rules">Tight-HTML Rules</a>.</td>
+            <td><a href="property_types.html#boolean">Boolean</a></td>
+            <td><code>false</code></td>
+            <td>8.3</td>
+          </tr>
+          <tr>
             <td>forbiddenSummaryFragments</td>
             <td>forbidden summary fragments</td>
             <td><a href="property_types.html#regexp">Regular Expression</a></td>
diff --git a/src/xdocs/index.xml.vm b/src/xdocs/index.xml.vm
index 1b281fe..56ad4ec 100644
--- a/src/xdocs/index.xml.vm
+++ b/src/xdocs/index.xml.vm
@@ -312,6 +312,12 @@
                   <td>Part of the standard JDEE distribution - <a href="https://github.com/jdee-emacs/jdee"/></td>
                   <td><a href="https://github.com/jdee-emacs/jdee/blob/master/jdee-checkstyle.el">configuration could be seen at jdee-checkstyle.el</a></td>
               </tr>
+              <tr>
+                  <td><a href="https://code.visualstudio.com/">Visual Studio Code</a></td>
+                  <td>Sheng Chen</td>
+                  <td><a href="https://marketplace.visualstudio.com/items?itemName=shengchen.vscode-checkstyle">vscode-checkstyle</a></td>
+                  <td>Checkstyle for Microsoft Visual Studio Code</td>
+              </tr>
           </table>
       </subsection>
 
diff --git a/src/xdocs/releasenotes.xml b/src/xdocs/releasenotes.xml
index b4580cc..9a511e4 100644
--- a/src/xdocs/releasenotes.xml
+++ b/src/xdocs/releasenotes.xml
@@ -16,6 +16,129 @@
   <body>
     <!-- placeholder for a new section -->
 
+    <section name="Release 8.6">
+      <p>Breaking backward compatibility:</p>
+        <ul>
+          <li>
+            AbstractLoader: move out of api, rename, and remove abstract modifier . Author: Roman_Zhigunov <a href="https://github.com/checkstyle/checkstyle/issues/5338">#5338</a>
+          </li>
+        </ul>
+      <p>New:</p>
+        <ul>
+          <li>
+            new Checker filter SuppressWithPlainTextCommentFilter as akin to Treewalker's SuppressionCommentFilter. Author: Andrei Selkin <a href="https://github.com/checkstyle/checkstyle/issues/4841">#4841</a>
+          </li>
+          <li>
+            Add @exception JavaDoc block tag to NonEmptyAtclauseDescriptionCheck. Author: Lev_Sikhovets <a href="https://github.com/checkstyle/checkstyle/issues/5388">#5388</a>
+          </li>
+          <li>
+            Support suppression-xpath element in SuppressionLoader. Author: Timur Tibeyev <a href="https://github.com/checkstyle/checkstyle/issues/4421">#4421</a>
+          </li>
+          <li>
+            add ANNOTATION_DEF to RequireThisCheck. Author: rnveach <a href="https://github.com/checkstyle/checkstyle/issues/5363">#5363</a>
+          </li>
+          <li>
+            SuppressionFilter: add suppression by message. Author: rnveach <a href="https://github.com/checkstyle/checkstyle/issues/2804">#2804</a>
+          </li>
+        </ul>
+      <p>Bug fixes:</p>
+        <ul>
+          <li>
+            TranslationCheck: should fire file started/finished when invoking errors. Author: rnveach <a href="https://github.com/checkstyle/checkstyle/issues/5057">#5057</a>
+          </li>
+          <li>
+            fixed RequireThisCheck and for loop variable handling. Author: rnveach <a href="https://github.com/checkstyle/checkstyle/issues/5392">#5392</a>
+          </li>
+          <li>
+            changed RequireThis kept track of the frame being examined. Author: rnveach <a href="https://github.com/checkstyle/checkstyle/issues/5364">#5364</a>
+          </li>
+          <li>
+            ImportOrder with option=bottom should not allow non-static import after static import. Author: Julian Hyde <a href="https://github.com/checkstyle/checkstyle/issues/4981">#4981</a>
+          </li>
+          <li>
+            ReturnCount: unclear message when only max property is specified. Author: vaano94 <a href="https://github.com/checkstyle/checkstyle/issues/5306">#5306</a>
+          </li>
+          <li>
+            Incorrect indentation check for method preceded by annotation, with method parameter on separate line. Author: BBG <a href="https://github.com/checkstyle/checkstyle/issues/5154">#5154</a>
+          </li>
+          <li>
+            fixed RequireThisCheck and enum constants handling. Author: rnveach <a href="https://github.com/checkstyle/checkstyle/issues/5361">#5361</a>
+          </li>
+          <li>
+            fixed RequireThisCheck and catch variable handling. Author: rnveach <a href="https://github.com/checkstyle/checkstyle/issues/5351">#5351</a>
+          </li>
+          <li>
+            AnnotationUtility.getAnnotation fails when there is an comment in the annotation. Author: rnveach <a href="https://github.com/checkstyle/checkstyle/issues/5327">#5327</a>
+          </li>
+          <li>
+            False RedundantModifier violation for final method of enum inside final class. Author: BBG <a href="https://github.com/checkstyle/checkstyle/issues/5268">#5268</a>
+          </li>
+          <li>
+            fixed bug on matching xpath when no xpath given. Author: rnveach <a href="https://github.com/checkstyle/checkstyle/issues/5321">#5321</a>
+          </li>
+          <li>
+            Checkstyle ignores javadoc that placed over Annotation type elements . Author: Pavel Bludov <a href="https://github.com/checkstyle/checkstyle/issues/4169">#4169</a>
+          </li>
+          <li>
+            JavadocMethod: No error for a misplaced javadoc tag. Author: Pavel Bludov <a href="https://github.com/checkstyle/checkstyle/issues/4701">#4701</a>
+          </li>
+        </ul>
+      <p>Notes:</p>
+        <ul>
+          <li>
+            pitest: increase mutation coverage for pitest-checks-misc profile to 100%. Author: rnveach, vasilyeva <a href="https://github.com/checkstyle/checkstyle/issues/4675">#4675</a>
+          </li>
+          <li>
+            Some contents in messages_zh.properties for imports check are not well translated. Author: zhangduo <a href="https://github.com/checkstyle/checkstyle/issues/5393">#5393</a>
+          </li>
+          <li>
+            TranslationCheckTest.testLogOutput is failed . Author: rnveach <a href="https://github.com/checkstyle/checkstyle/issues/5141">#5141</a>
+          </li>
+          <li>
+            pitest: increase mutation coverage for pitest-checks-imports profile to 100%. Author: BBG <a href="https://github.com/checkstyle/checkstyle/issues/5004">#5004</a>
+          </li>
+          <li>
+            Indentaion problem in pjdbc project. Author: Roman Ivanov <a href="https://github.com/checkstyle/checkstyle/issues/5286">#5286</a>
+          </li>
+          <li>
+            Use versions-maven-plugin to report versions to update. Author: Roman Ivanov <a href="https://github.com/checkstyle/checkstyle/issues/5208">#5208</a>
+          </li>
+          <li>
+            minimize pitest-checkstyle-utils profile execution. Author: rnveach <a href="https://github.com/checkstyle/checkstyle/issues/4605">#4605</a>
+          </li>
+          <li>
+            api: abstract classes that extending concrete class. Author: rnveach <a href="https://github.com/checkstyle/checkstyle/issues/4716">#4716</a>
+          </li>
+          <li>
+            pitest: increase mutation coverage for pitest-checks-whitespace profile to 100%. Author: rnveach <a href="https://github.com/checkstyle/checkstyle/issues/5003">#5003</a>
+          </li>
+          <li>
+            pitest: increase mutation coverage for pitest-checks-metrics profile to 100%. Author: rnveach <a href="https://github.com/checkstyle/checkstyle/issues/5005">#5005</a>
+          </li>
+          <li>
+            pitest: increase mutation coverage for pitest-checks-coding profile to 100%. Author: rnveach <a href="https://github.com/checkstyle/checkstyle/issues/5008">#5008</a>
+          </li>
+          <li>
+            internal code: terminolozy problems in ModuleReflectionUtils. Author: rnveach <a href="https://github.com/checkstyle/checkstyle/issues/4876">#4876</a>
+          </li>
+          <li>
+            Add violateExecutionOnNonTightHtml property of AbstractJavadocCheck to xdoc. Author: rnveach <a href="https://github.com/checkstyle/checkstyle/issues/5002">#5002</a>
+          </li>
+          <li>
+            change all sonarqube.com to sonarcloud.io. Author: Roman Ivanov <a href="https://github.com/checkstyle/checkstyle/issues/5290">#5290</a>
+          </li>
+          <li>
+            doc: add 'Checkstyle for Microsoft Visual Studio Code' in known tools. Author: Roman Ivanov
+          </li>
+          <li>
+            Revert "infra: fix for travis:osx problem with 'shell_session_update: command not found'". Author: Roman Ivanov
+          </li>
+          <li>
+            Remove usage of DetailAST.branchContains. Author: rnveach <a href="https://github.com/checkstyle/checkstyle/issues/5124">#5124</a>
+          </li>
+        </ul>
+    </section>
+
     <section name="Release 8.5">
       <p>New:</p>
         <ul>
@@ -3818,7 +3941,7 @@
           Remove usage of deprecated methods from MainTest. Author: Michal Kordas <a href="https://github.com/checkstyle/checkstyle/issues/1325">#1325</a>
         </li>
         <li>
-          Restore checkstyle validation on https://sonarqube.com. Author: Roman Ivanov <a href="https://github.com/checkstyle/checkstyle/issues/1319">#1319</a>
+          Restore checkstyle validation on https://sonarcloud.io. Author: Roman Ivanov <a href="https://github.com/checkstyle/checkstyle/issues/1319">#1319</a>
         </li>
         <li>
           Update Maven Shade Plugin, EqualsVerifier, antlr, system-rules and Maven PMD Plugin to latest versions. Author: Michal Kordas
diff --git a/src/xdocs/writingjavadocchecks.xml.vm b/src/xdocs/writingjavadocchecks.xml.vm
index b07b52d..209cbe6 100644
--- a/src/xdocs/writingjavadocchecks.xml.vm
+++ b/src/xdocs/writingjavadocchecks.xml.vm
@@ -23,25 +23,74 @@
 
     <section name="What is Javadoc comment">
       <p>
-      Javadoc comment is multiline comment <code>/*  */</code> that starts with <b>*</b> character and placed above class definition, interface definition, enum definition, method definition or field definition.
+      Javadoc comment is a multiline comment <code>/*  */</code> that starts with the <b>*</b>
+      character and placed above the class definition, interface definition, enum definition,
+      method definition or field definition.
+      If an annotation precedes any of the definitions listed above, then the javadoc comment
+      should be placed before the annotation.
+      If several multiline comments with javadoc identifiers are placed sequentially, only
+      the one closest to the definition, right above it, with the javadoc identifier will be used.
+      </p>
+      <p>
+      Javadoc comments should contain: a short summary (the first sentence), an optional
+      documentation section, an optional tag section.
+      The first sentence has a special meaning and should be clear, punchy, short, and is ended by
+      a period symbol.
+      Immediately after the first sentence, the main description could begin, which may be followed
+      by the tag section.
+      The tag section starts with the first block tag, which is defined by the first <code>@</code>
+      character that begins a line (ignoring leading asterisks, white space, and leading separator
+      <code>/**</code>).
+      </p>
       <p>For example, here is java file:</p>
       <source><![CDATA[
 /**
  * My <b>class</b>.
- * @see AbstractClass
+ *
+ * @see Annotation
  */
 public class MyClass {
 
+  /** Not a javadoc (ignored). */
+
+  /**
+   * Doubles the value.
+   * The long and detailed explanation what the method does.
+   *
+   * @param value for doubling.
+   * @return double value.
+   */
+
+  /*
+   Multiline comment (ignored).
+  */
+  @Annotation
+  /** Extra javadoc (ignored). */
+  // Single line comment (ignored).
+  public int method(int value) {
+    /** Inner javadoc (ignored). */
+    return value * 2;
+  }
 }
       ]]></source>
-      Javadoc content is:
+      <p>Javadoc content for the MyClass will be:</p>
       <source><![CDATA[
- * My <b>class</b>.
- * @see AbstractClass
+    My <b>class</b>.
+
+    @see Annotation
       ]]></source>
-      </p>
+      <p>Javadoc content for the MyClass.method will be:</p>
+      <source><![CDATA[
+    Doubles the value.
+    The long and detailed explanation what the method does.
+
+    @param value for doubling.
+    @return double value.
+      ]]></source>
+      <p>
       Attention that java comment starts with <code>/*</code>, following with Identificator of comment type. Javadoc Identificator is <code>*</code>. All symbols after Javadoc Identificator till <code>*/</code> are part of javadoc comment.
-      <p>Please note that javadoc-like(miltiline comment with javdoc identificator) comment inside a method is not a javadoc comment and skipped by
+      </p>
+      <p>Please note that javadoc-like (miltiline comment with javdoc identificator) comment inside a method is not a javadoc comment and skipped by
          Sun/Oracle javadoc tool and by our javadoc comment matcher, but such comment will be in AST.
       </p>
       <p>In internet you can find different types of documentation
diff --git a/wercker.yml b/wercker.yml
index d6e78dc..464f2f4 100644
--- a/wercker.yml
+++ b/wercker.yml
@@ -3,7 +3,7 @@
 build:
   steps:
   - script:
-      name: setup mvn local repo
+      name: setup maven local repo
       code: |
         export MAVEN_OPTS="-Dmaven.repo.local=${WERCKER_CACHE_DIR}"
         mvn -version
@@ -24,7 +24,6 @@
          PATH=$GROOVY_HOME/bin:$PATH
          groovy -v
 
-  # Build Checkstyle
   - script:
       name: Build Checkstyle
       code: |
@@ -32,322 +31,165 @@
         export SKIP_CI=$(if [[ $(git diff --name-only HEAD HEAD~1 | grep -vE "$SKIP_FILES" | cat | wc -c) > 0 ]]; then echo false; else echo true; fi;)
         echo "SKIP_CI="$SKIP_CI
         if [[ $SKIP_CI == 'false' ]]; then
-          mvn clean install -Pno-validations
+          mvn -e clean install -Pno-validations
         else
           echo "build is skipped ..."
         fi
 
-  # NoErrorTest - Postgresql JDBC Driver (oraclejdk8)
   - script:
       name: NoErrorTest - Postgresql JDBC Driver
       code: |
         if [[ $SKIP_CI == 'false' ]]; then
-          set -e
-          CS_POM_VERSION=$(mvn -q -Dexec.executable='echo' -Dexec.args='${project.version}' --non-recursive org.codehaus.mojo:exec-maven-plugin:1.3.1:exec)
-          echo CS_version: ${CS_POM_VERSION}
-          for i in 1 2 3 4 5; do git clone https://github.com/pgjdbc/pgjdbc.git && break || sleep 15; done
-          cd pgjdbc/pgjdbc
-          # special checkout till https://github.com/checkstyle/checkstyle/issues/5286
-          git checkout 279fb435b392114c45266ecef901bfd59470842a
-          wget https://gist.githubusercontent.com/timurt/a981d094cbbbe746ecd400424f5f3af8/raw/6e5d28a83b0d63a880f897d839f7f536b64f0979/pgjdbc.patch
-          git apply pgjdbc.patch
-          mvn compile checkstyle:check -Dcheckstyle.version=${CS_POM_VERSION}
-          cd ../../
-          rm -rf pgjdbc
+          ./.ci/wercker.sh no-error-pgjdbc
         else
           echo "build is skipped ..."
         fi
 
-  # NoErrorTest - Orekit (oraclejdk8)
   - script:
       name: NoErrorTest - Orekit
       code: |
         if [[ $SKIP_CI == 'false' ]]; then
-          set -e
-          CS_POM_VERSION=$(mvn -q -Dexec.executable='echo' -Dexec.args='${project.version}' --non-recursive org.codehaus.mojo:exec-maven-plugin:1.3.1:exec)
-          echo CS_version: ${CS_POM_VERSION}
-          for i in 1 2 3 4 5; do git clone https://github.com/Hipparchus-Math/hipparchus.git && break || sleep 15; done
-          cd hipparchus
-          git checkout 905006092493e350dcd68dd7b2ec1dedaf4983b7
-          mvn clean install -DskipTests
-          cd ../
-          for i in 1 2 3 4 5; do git clone https://github.com/CS-SI/Orekit.git && break || sleep 15; done
-          cd Orekit
-          git checkout f7abe7ea0c7fbf6d138ed7eaf9487510dfbbcaac
-          wget https://gist.githubusercontent.com/timurt/7c45454a233ce775a7e5acaa1231d845/raw/225ef24f84e671b501caeef8279dc1363869d5ae/orekit.patch
-          git apply orekit.patch
-          mvn compile checkstyle:check -Dorekit.checkstyle.version=${CS_POM_VERSION}
-          cd ../
-          rm -rf hipparchus Orekit
+          ./.ci/wercker.sh no-error-orekit
         else
           echo "build is skipped ..."
         fi
 
-  # NoErrorTest - XWiki (oraclejdk8)
   - script:
       name: NoErrorTest - XWiki
       code: |
         if [[ $SKIP_CI == 'false' ]]; then
-          set -e
-          CS_POM_VERSION=$(mvn -q -Dexec.executable='echo' -Dexec.args='${project.version}' --non-recursive org.codehaus.mojo:exec-maven-plugin:1.3.1:exec)
-          echo CS_version: ${CS_POM_VERSION}
-          for i in 1 2 3 4 5; do git clone https://github.com/xwiki/xwiki-commons/ && break || sleep 15; done
-          cd xwiki-commons
-          git checkout 44b0c0048c516dae20cf5f8a71181af836549484
-          mvn install -DskipTests -Dxwiki.clirr.skip=true checkstyle:check -Dcheckstyle.version=${CS_POM_VERSION}
-          cd ../../
-          rm -rf xwiki-commons
+          ./.ci/wercker.sh no-error-xwiki
         else
           echo "build is skipped ..."
         fi
 
-  # NoErrorTest - Apache Apex (oraclejdk8)
   - script:
       name: NoErrorTest - Apache Apex
       code: |
         if [[ $SKIP_CI == 'false' ]]; then
-          set -e
-          CS_POM_VERSION=$(mvn -q -Dexec.executable='echo' -Dexec.args='${project.version}' --non-recursive org.codehaus.mojo:exec-maven-plugin:1.3.1:exec)
-          echo CS_version: ${CS_POM_VERSION}
-          for i in 1 2 3 4 5; do git clone https://github.com/apache/incubator-apex-core/ && break || sleep 15; done
-          cd incubator-apex-core
-          mvn compile checkstyle:check -Dcheckstyle.version=${CS_POM_VERSION}
-          cd ../
-          rm -rf incubator-apex-core
+          ./.ci/wercker.sh no-error-apex-core
         else
           echo "build is skipped ..."
         fi
 
-  # NoErrorTest - Hibernate Search (oraclejdk8)
   - script:
       name: NoErrorTest - Hibernate Search
       code: |
         if [[ $SKIP_CI == 'false' ]]; then
-          set -e
-          CS_POM_VERSION=$(mvn -q -Dexec.executable='echo' -Dexec.args='${project.version}' --non-recursive org.codehaus.mojo:exec-maven-plugin:1.3.1:exec)
-          echo CS_version: ${CS_POM_VERSION}
-          for i in 1 2 3 4 5; do git clone https://github.com/hibernate/hibernate-search.git && break || sleep 15; done
-          cd hibernate-search
-          mvn -s settings-example.xml clean install -DskipTests=true -Dtest.elasticsearch.host.provided=true -Dpuppycrawl.checkstyle.version=${CS_POM_VERSION}
-          mvn -s settings-example.xml checkstyle:check  -Dpuppycrawl.checkstyle.version=${CS_POM_VERSION}
-          cd ../
-          rm -rf hibernate-search
+          ./.ci/wercker.sh no-error-hibernate-search
         else
           echo "build is skipped ..."
         fi
 
-  # NoErrorTest - HtmlUnit (oraclejdk8)
   - script:
       name: NoErrorTest - HtmlUnit
       code: |
         if [[ $SKIP_CI == 'false' ]]; then
-          set -e
-          CS_POM_VERSION=$(mvn -q -Dexec.executable='echo' -Dexec.args='${project.version}' --non-recursive org.codehaus.mojo:exec-maven-plugin:1.3.1:exec)
-          echo CS_version: ${CS_POM_VERSION}
-          echo "checkouting project sources ..."
-          svn -q export https://svn.code.sf.net/p/htmlunit/code/trunk/htmlunit@r14923 htmlunit
-          cd htmlunit
-          sed -i "s/            <version>2.28-SNAPSHOT/            <version>2.28-20171106.080245-12/" pom.xml
-          echo "Running checkstyle validation ..."
-          mvn compile checkstyle:check -Dcheckstyle.version=${CS_POM_VERSION}
-          cd ../
-          rm -rf htmlunit
+          ./.ci/wercker.sh no-error-htmlunit
         else
           echo "build is skipped ..."
         fi
 
-  # NoErrorTest - checkstyle's sevntu
   - script:
       name: NoErrorTest - checkstyle's sevntu
       code: |
-        if [[ $SKIP_CI == 'false' ]]; then
-          set -e
-          CS_POM_VERSION=$(mvn -q -Dexec.executable='echo' -Dexec.args='${project.version}' --non-recursive org.codehaus.mojo:exec-maven-plugin:1.3.1:exec)
-          echo CS_version: ${CS_POM_VERSION}
-          mvn compile verify -Dmaven.sevntu-checkstyle-check.checkstyle.version=${CS_POM_VERSION} -Dmaven.test.skip=true -Dcheckstyle.ant.skip=true -Dpmd.skip=true -Dfindbugs.skip=true -Dcobertura.skip=true -Dforbiddenapis.skip=true -Dxml.skip=true
+        if [[ 'true' == 'false' ]]; then
+          ./.ci/wercker.sh no-error-checkstyles-sevntu
         else
           echo "build is skipped ..."
         fi
 
-  # NoErrorTest - sevntu-checks
-  - script:
-      name: NoErrorTest - sevntu-checks
-      code: |
-        if [[ $SKIP_CI == 'false' ]]; then
-          set -e
-          CS_POM_VERSION=$(mvn -q -Dexec.executable='echo' -Dexec.args='${project.version}' --non-recursive org.codehaus.mojo:exec-maven-plugin:1.3.1:exec)
-          echo CS_version: ${CS_POM_VERSION}
-          for i in 1 2 3 4 5; do git clone https://github.com/sevntu-checkstyle/sevntu.checkstyle && break || sleep 15; done
-          cd sevntu.checkstyle/sevntu-checks
-          mvn -Pno-validations verify  -Dcheckstyle.skip=false -Dcheckstyle.version=${CS_POM_VERSION} -Dcheckstyle.configLocation=../../config/checkstyle_checks.xml
-        else
-          echo "build is skipped ..."
-        fi
+#  - script:
+#      name: NoErrorTest - sevntu-checks
+#      code: |
+#        if [[ $SKIP_CI == 'false' ]]; then
+#          ./.ci/wercker.sh no-error-sevntu-checks
+#        else
+#          echo "build is skipped ..."
+#        fi
 
-  # NoExceptiontest - Apache Struts (oraclejdk8)
   - script:
       name: NoExceptiontest - Apache Struts
       code: |
         if [[ $SKIP_CI == 'false' ]]; then
-          set -e
-          for i in 1 2 3 4 5; do git clone https://github.com/checkstyle/contribution && break || sleep 15; done
-          cd contribution/checkstyle-tester
-          sed -i'' 's/^guava/#guava/' projects-for-wercker.properties
-          sed -i'' 's/#apache-struts/apache-struts/' projects-for-wercker.properties
-          groovy ./launch.groovy --listOfProjects projects-for-wercker.properties --config checks-nonjavadoc-error.xml
-          cd ../../
-          rm -rf contribution
+          ./.ci/wercker.sh no-exception-struts
         else
           echo "build is skipped ..."
         fi
 
-  # NoExceptiontest - Checkstyle ,sevntu-checkstyle (oraclejdk8)
   - script:
       name: NoExceptiontest - Checkstyle ,sevntu-checkstyle
       code: |
         if [[ $SKIP_CI == 'false' ]]; then
-          set -e
-          for i in 1 2 3 4 5; do git clone https://github.com/checkstyle/contribution && break || sleep 15; done
-          cd contribution/checkstyle-tester
-          sed -i'' 's/^guava/#guava/' projects-for-wercker.properties
-          sed -i'' 's/#checkstyle/checkstyle/' projects-for-wercker.properties
-          sed -i'' 's/#sevntu-checkstyle/sevntu-checkstyle/' projects-for-wercker.properties
-          groovy ./launch.groovy --listOfProjects projects-for-wercker.properties --config checks-nonjavadoc-error.xml
-          cd ../../
-          rm -rf contribution
+          ./.ci/wercker.sh no-exception-checkstyle-sevntu
         else
           echo "build is skipped ..."
         fi
 
-  # NoExceptiontest - Guava (oraclejdk8)
   - script:
       name: NoExceptiontest - Guava
       code: |
         if [[ $SKIP_CI == 'false' ]]; then
-          set -e
-          for i in 1 2 3 4 5; do git clone https://github.com/checkstyle/contribution && break || sleep 15; done
-          cd contribution/checkstyle-tester
-          sed -i'' 's/^guava/#guava/' projects-for-wercker.properties
-          sed -i'' 's/#guava/guava/' projects-for-wercker.properties
-          groovy ./launch.groovy --listOfProjects projects-for-wercker.properties --config checks-nonjavadoc-error.xml
-          cd ../../
-          rm -rf contribution
+          ./.ci/wercker.sh no-exception-guava
         else
           echo "build is skipped ..."
         fi
 
-  # NoExceptiontest - Hibernate (oraclejdk8)
   - script:
       name: NoExceptiontest - Hibernate
       code: |
         if [[ $SKIP_CI == 'false' ]]; then
-          set -e
-          for i in 1 2 3 4 5; do git clone https://github.com/checkstyle/contribution && break || sleep 15; done
-          cd contribution/checkstyle-tester
-          sed -i'' 's/^guava/#guava/' projects-for-wercker.properties
-          sed -i'' 's/#hibernate-orm/hibernate-orm/' projects-for-wercker.properties
-          groovy ./launch.groovy --listOfProjects projects-for-wercker.properties --config checks-nonjavadoc-error.xml
-          cd ../../
-          rm -rf contribution
+          ./.ci/wercker.sh no-exception-hibernate-orm
         else
           echo "build is skipped ..."
         fi
 
 
-  # NoExceptiontest - Findbugs (oraclejdk8)
   - script:
       name: NoExceptiontest - findbugs
       code: |
         if [[ $SKIP_CI == 'false' ]]; then
-          set -e
-          for i in 1 2 3 4 5; do git clone https://github.com/checkstyle/contribution && break || sleep 15; done
-          cd contribution/checkstyle-tester
-          sed -i'' 's/^guava/#guava/' projects-for-wercker.properties
-          sed -i'' 's/#findbugs/findbugs/' projects-for-wercker.properties
-          groovy ./launch.groovy --listOfProjects projects-for-wercker.properties --config checks-nonjavadoc-error.xml
-          cd ../../
-          rm -rf contribution
+          ./.ci/wercker.sh no-exception-findbugs
         else
           echo "build is skipped ..."
         fi
 
-  # NoExceptiontest - spring-framework (oraclejdk8)
   - script:
       name: NoExceptiontest - spring-framework
       code: |
         if [[ $SKIP_CI == 'false' ]]; then
-          set -e
-          for i in 1 2 3 4 5; do git clone https://github.com/checkstyle/contribution && break || sleep 15; done
-          cd contribution/checkstyle-tester
-          sed -i'' 's/^guava/#guava/' projects-for-wercker.properties
-          sed -i'' 's/#spring-framework/spring-framework/' projects-for-wercker.properties
-          groovy ./launch.groovy --listOfProjects projects-for-wercker.properties --config checks-nonjavadoc-error.xml
-          cd ../../
-          rm -rf contribution
+          ./.ci/wercker.sh no-exception-spring-framework
         else
           echo "build is skipped ..."
         fi
 
-  # NoExceptiontest - Hbase (oraclejdk8)
   - script:
       name: NoExceptiontest - Hbase
       code: |
         if [[ $SKIP_CI == 'false' ]]; then
-          set -e
-          for i in 1 2 3 4 5; do git clone https://github.com/checkstyle/contribution  && break || sleep 15; done
-          cd contribution/checkstyle-tester
-          sed -i'' 's/^guava/#guava/' projects-for-wercker.properties
-          sed -i'' 's/#Hbase/Hbase/' projects-for-wercker.properties
-          groovy ./launch.groovy --listOfProjects projects-for-wercker.properties --config checks-nonjavadoc-error.xml
-          cd ../../
-          rm -rf contribution
+          ./.ci/wercker.sh no-exception-hbase
         else
           echo "build is skipped ..."
         fi
 
-  # NoExceptiontest - pmd elasticsearch lombok-ast (oraclejdk8)
   - script:
       name: NoExceptiontest - pmd elasticsearch lombok-ast
       code: |
         if [[ $SKIP_CI == 'false' ]]; then
-          set -e
-          for i in 1 2 3 4 5; do git clone https://github.com/checkstyle/contribution && break || sleep 15; done
-          cd contribution/checkstyle-tester
-          sed -i'' 's/^guava/#guava/' projects-for-wercker.properties
-          sed -i'' 's/#pmd/pmd/' projects-for-wercker.properties
-          sed -i'' 's/#elasticsearch/elasticsearch/' projects-for-wercker.properties
-          sed -i'' 's/#lombok-ast/lombok-ast/' projects-for-wercker.properties
-          groovy ./launch.groovy --listOfProjects projects-for-wercker.properties --config checks-nonjavadoc-error.xml
-          cd ../../
-          rm -rf contribution
+          ./.ci/wercker.sh no-exception-Pmd-elasticsearch-lombok-ast
         else
           echo "build is skipped ..."
         fi
 
-  # NoExceptiontest - RxJava java-design-patterns MaterialDesignLibrary apache-ant apache-jsecurity android-launcher (oraclejdk8)
   - script:
       name: NoExceptiontest - RxJava java-design-patterns MaterialDesignLibrary apache-ant apache-jsecurity android-launcher
       code: |
         if [[ $SKIP_CI == 'false' ]]; then
-          set -e
-          for i in 1 2 3 4 5; do git clone https://github.com/checkstyle/contribution && break || sleep 15; done
-          cd contribution/checkstyle-tester
-          sed -i'' 's/^guava/#guava/' projects-for-wercker.properties
-          sed -i'' 's/#RxJava/RxJava/' projects-for-wercker.properties
-          sed -i'' 's/#Vavr/Vavr/' projects-for-wercker.properties
-          sed -i'' 's/#java-design-patterns/java-design-patterns/' projects-for-wercker.properties
-          sed -i'' 's/#MaterialDesignLibrary/MaterialDesignLibrary/' projects-for-wercker.properties
-          sed -i'' 's/#apache-ant/apache-ant/' projects-for-wercker.properties
-          sed -i'' 's/#apache-jsecurity/apache-jsecurity/' projects-for-wercker.properties
-          sed -i'' 's/#android-launcher/android-launcher/' projects-for-wercker.properties
-          groovy ./launch.groovy --listOfProjects projects-for-wercker.properties --config checks-nonjavadoc-error.xml
-          cd ../../
-          rm -rf contribution
+          ./.ci/wercker.sh no-exception-alot-of-projects
         else
           echo "build is skipped ..."
         fi
 
-  # Cleanup
   - script:
       name: Cleanup maven local repo
       code: |