diff --git a/cxf-xjc-plugin/src/main/java/org/apache/cxf/maven_plugin/AbstractXSDToJavaMojo.java b/cxf-xjc-plugin/src/main/java/org/apache/cxf/maven_plugin/AbstractXSDToJavaMojo.java
index 4d8ca82..d19729c 100644
--- a/cxf-xjc-plugin/src/main/java/org/apache/cxf/maven_plugin/AbstractXSDToJavaMojo.java
+++ b/cxf-xjc-plugin/src/main/java/org/apache/cxf/maven_plugin/AbstractXSDToJavaMojo.java
@@ -62,12 +62,12 @@
 /**
  * CXF XSD To Java Tool
  */
-public abstract class AbstractXSDToJavaMojo extends AbstractMojo {   
+public abstract class AbstractXSDToJavaMojo extends AbstractMojo {
     @Component
     protected MavenProject project;
     
     @Parameter
-    XsdOption xsdOptions[];
+    XsdOption[] xsdOptions;
     
     /**
      * Directory in which the "DONE" markers are saved that 
@@ -248,10 +248,10 @@
                     } else if (srctimestamp > doneFile.lastModified()) {
                         doWork = true;
                     } else {
-                        File files[] = xsdOptions[x].getDependencies();
+                        File[] files = xsdOptions[x].getDependencies();
                         if (files != null) {
-                            for (int z = 0; z < files.length; ++z) {
-                                if (files[z].lastModified() > doneFile.lastModified()) {
+                            for (File file : files) {
+                                if (file.lastModified() > doneFile.lastModified()) {
                                     doWork = true;
                                 }
                             }
@@ -260,11 +260,11 @@
 
                     if (doWork) {
                         try {
-                            File files[] = xsdOptions[x].getDependencies();
+                            File[] files = xsdOptions[x].getDependencies();
                             if (files != null) {
-                                for (int z = 0; z < files.length; ++z) {
-                                    if (files[z].lastModified() > doneFile.lastModified()) {
-                                        buildContext.removeMessages(files[z]);
+                                for (File file : files) {
+                                    if (file.lastModified() > doneFile.lastModified()) {
+                                        buildContext.removeMessages(file);
                                     }
                                 }
                             }
@@ -279,10 +279,10 @@
                                 doneFile.delete();
                                 doneFile.createNewFile();
                             }
-                            File dirs[] = xsdOptions[x].getDeleteDirs();
+                            File[] dirs = xsdOptions[x].getDeleteDirs();
                             if (dirs != null) {
-                                for (int idx = 0; idx < dirs.length; ++idx) {
-                                    result = result && deleteDir(dirs[idx]);
+                                for (File dir : dirs) {
+                                    result = result && deleteDir(dir);
                                 }
                             }
                             buildContext.refresh(outputDirFile);
@@ -451,9 +451,9 @@
     
     private boolean deleteDir(File f) {
         if (f.isDirectory()) {
-            File files[] = f.listFiles();
-            for (int idx = 0; idx < files.length; ++idx) {
-                deleteDir(files[idx]);
+            File[] files = f.listFiles();
+            for (File file : files) {
+                deleteDir(file);
             }
         }
         
diff --git a/cxf-xjc-plugin/src/main/java/org/apache/cxf/maven_plugin/XsdOption.java b/cxf-xjc-plugin/src/main/java/org/apache/cxf/maven_plugin/XsdOption.java
index 8fc2a13..4f1ce0f 100644
--- a/cxf-xjc-plugin/src/main/java/org/apache/cxf/maven_plugin/XsdOption.java
+++ b/cxf-xjc-plugin/src/main/java/org/apache/cxf/maven_plugin/XsdOption.java
@@ -27,9 +27,9 @@
     String xsd;
     String xsdDir;
     String packagename;
-    File dependencies[];
-    File redundantDirs[];
-    boolean extension;    
+    File[] dependencies;
+    File[] redundantDirs;
+    boolean extension;
     List<String> extensionArgs;
     List<String> bindingFiles;
     String catalog;
@@ -73,14 +73,14 @@
     public void setBindingFiles(List<String> bindingFiles) {
         this.bindingFiles = bindingFiles;
     }    
-    public void setDependencies(File files[]) {
+    public void setDependencies(File[] files) {
         dependencies = files;
     }
     public File[] getDependencies() {
         return dependencies;
     }
 
-    public void setDeleteDirs(File files[]) {
+    public void setDeleteDirs(File[] files) {
         redundantDirs = files;
     }
     public File[] getDeleteDirs() {
diff --git a/pom.xml b/pom.xml
index 20256ad..fea1805 100644
--- a/pom.xml
+++ b/pom.xml
@@ -44,7 +44,7 @@
     </prerequisites>
 
     <properties>
-        <cxf-buildtools-version>3.4.1</cxf-buildtools-version>
+        <cxf-buildtools-version>3.4.3</cxf-buildtools-version>
         <jdk.version>1.8</jdk.version>
         <jaxb-version>2.3.2</jaxb-version>
 
@@ -375,24 +375,18 @@
                 <plugin>
                     <groupId>org.apache.maven.plugins</groupId>
                     <artifactId>maven-checkstyle-plugin</artifactId>
-                    <version>2.17</version>
+                    <version>3.1.0</version>
                     <dependencies>
                         <dependency>
                             <groupId>org.apache.cxf.build-utils</groupId>
                             <artifactId>cxf-buildtools</artifactId>
                             <version>${cxf-buildtools-version}</version>
                         </dependency>
+                        <!-- https://issues.apache.org/jira/browse/MCHECKSTYLE-376 -->
                         <dependency>
                             <groupId>com.puppycrawl.tools</groupId>
                             <artifactId>checkstyle</artifactId>
-                            <version>8.7</version>
-                            <exclusions>
-                                <!--  MCHECKSTYLE-156  -->
-                                <exclusion>
-                                    <groupId>com.sun</groupId>
-                                    <artifactId>tools</artifactId>
-                                </exclusion>
-                            </exclusions>
+                            <version>8.23</version>
                         </dependency>
                     </dependencies>
                     <configuration>
@@ -403,12 +397,12 @@
                             <id>validate</id>
                             <phase>validate</phase>
                             <configuration>
+                                <includeTestSourceDirectory>true</includeTestSourceDirectory>
                                 <configLocation>${resources.base.path}cxf-checkstyle${checkstyle.extension}.xml</configLocation>
                                 <consoleOutput>true</consoleOutput>
                                 <failsOnError>true</failsOnError>
                                 <linkXRef>false</linkXRef>
                                 <suppressionsLocation>${resources.base.path}cxf-checkstyle-suppressions.xml</suppressionsLocation>
-                                <sourceDirectory>${basedir}/src</sourceDirectory>
                                 <excludes>**/archetype-resources/**/*.java</excludes>
                             </configuration>
                             <goals>
