diff --git a/Jenkinsfile b/Jenkinsfile
index f568cd3..2392586 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -148,7 +148,7 @@
                 YETUS_ARGS+=(--proclimit=2000)
 
                 # rsync these files back into the archive dir
-                YETUS_ARGS+=("--archive-list=checkstyle-errors.xml,findbugsXml.xml")
+                YETUS_ARGS+=("--archive-list=checkstyle-errors.xml,spotbugsXml.xml")
 
                 # URL for user-side presentation in reports and such to our artifacts
                 # (needs to match the archive bits below)
diff --git a/asf-site-src/source/documentation/in-progress/precommit-basic.md b/asf-site-src/source/documentation/in-progress/precommit-basic.md
index bf882ea..5a6522a 100644
--- a/asf-site-src/source/documentation/in-progress/precommit-basic.md
+++ b/asf-site-src/source/documentation/in-progress/precommit-basic.md
@@ -101,7 +101,9 @@
 * [Apache Creadur Rat](http://creadur.apache.org/rat/) entries in build system
 * [checkstyle](http://checkstyle.sourceforge.net/) entries in build system (ant and maven only)
 * [FindBugs](http://findbugs.sourceforge.net/) entries in build system and 3.x executables
-   (NOTE: FindBugs executables are required even if the build system is using [Spotbugs](https://spotbugs.github.io/))
+  - NOTE: only one of FindBugs or SpotBugs may be used at a time.
+* [SpotBugs](https://spotbugs.github.io/)) entries in build system and 3.x executables
+  - NOTE: only one of FindBugs or SpotBugs may be used at a time.
 * [jshint](https://jshint.com) installed
 * [hadolint](https://github.com/hadolint/hadolint) installed
 * [Perl::Critic](http://perlcritic.com/) installed
diff --git a/audience-annotations-component/audience-annotations/src/main/java/org/apache/yetus/audience/tools/StabilityOptions.java b/audience-annotations-component/audience-annotations/src/main/java/org/apache/yetus/audience/tools/StabilityOptions.java
index 8e7a93e..26c1459 100644
--- a/audience-annotations-component/audience-annotations/src/main/java/org/apache/yetus/audience/tools/StabilityOptions.java
+++ b/audience-annotations-component/audience-annotations/src/main/java/org/apache/yetus/audience/tools/StabilityOptions.java
@@ -50,6 +50,8 @@
         case STABLE_OPTION:
           RootDocProcessor.stability = STABLE_OPTION;
           break;
+        default:
+          break;
       }
     }
   }
diff --git a/pom.xml b/pom.xml
index 5bbf662..19f262f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -73,7 +73,7 @@
     <jython-shaded.version>2.7.1</jython-shaded.version>
     <maven-checkstyle-plugin.version>3.0.0</maven-checkstyle-plugin.version>
     <maven-project-info-reports-plugin.version>3.0.0</maven-project-info-reports-plugin.version>
-    <spotbugs-maven-plugin.version>3.1.7</spotbugs-maven-plugin.version>
+    <spotbugs-maven-plugin.version>3.1.11</spotbugs-maven-plugin.version>
 
      <sourceReleaseAssemblyDescriptor>source-release-tar</sourceReleaseAssemblyDescriptor>
 
diff --git a/precommit/src/main/shell/core.d/01-common.sh b/precommit/src/main/shell/core.d/01-common.sh
index d5e5c32..ffd1e67 100755
--- a/precommit/src/main/shell/core.d/01-common.sh
+++ b/precommit/src/main/shell/core.d/01-common.sh
@@ -317,12 +317,11 @@
   declare strip
   declare stridx
 
-  yetus_debug "Testing if $1 has been enabled by user"
+  yetus_debug "Testing if ${toadd} has been enabled by user"
 
   bar=""
   for idx in ${ENABLED_PLUGINS}; do
     stridx=${idx// }
-    yetus_debug "verify_plugin_enabled: processing ${stridx}"
     case ${stridx} in
       all)
         bar=${toadd}
@@ -343,7 +342,9 @@
   done
 
   if [[ -n ${bar} ]]; then
-    yetus_debug "Post-parsing: checking ${bar} = ${toadd}"
+    if [[ "${bar}" = "${toadd}" ]]; then
+      yetus_debug "Post-parsing: ${toadd} enabled"
+    fi
   fi
   [[ ${bar} = "${toadd}" ]]
 }
@@ -418,6 +419,22 @@
   yetus_del_array_element TESTTYPES "${1}"
 }
 
+## @description  Add the given test type
+## @audience     public
+## @stability    stable
+## @replaceable  yes
+## @param        plugin
+function replace_test_type
+{
+  if verify_plugin_enabled "${1}" && verify_plugin_enabled "${2}"; then
+    ENABLED_PLUGINS=${ENABLED_PLUGINS%$2}
+    delete_test_type "$2"
+    delete_test "$2"
+    return 0
+  fi
+  return 1
+}
+
 ## @description  Add the given bugsystem type
 ## @audience     public
 ## @stability    stable
@@ -536,6 +553,12 @@
     fi
   done
 
+  for i in "${TESTTYPES[@]}"; do
+    if declare -f "${i}_deprecate_test_type" >/dev/null; then
+      "${i}_deprecate_test_type"
+    fi
+  done
+
   if [[ ${ROBOT} == true ]]; then
     if declare -f "${ROBOTTYPE}"_set_plugin_defaults >/dev/null; then
       "${ROBOTTYPE}"_set_plugin_defaults
diff --git a/precommit/src/main/shell/it/it-tp.sh b/precommit/src/main/shell/it/it-tp.sh
index 0e275f4..149d708 100755
--- a/precommit/src/main/shell/it/it-tp.sh
+++ b/precommit/src/main/shell/it/it-tp.sh
@@ -58,7 +58,7 @@
 # our 'default' args, in (mostly) alphabetical order
 
 # rsync these files back into the archive dir
-YETUS_ARGS+=("--archive-list=checkstyle-errors.xml,findbugsXml.xml")
+YETUS_ARGS+=("--archive-list=checkstyle-errors.xml,spotbugsXml.xml")
 
 # where the source is located
 YETUS_ARGS+=("--basedir=${BASEDIR}")
diff --git a/precommit/src/main/shell/personality/bigtop.sh b/precommit/src/main/shell/personality/bigtop.sh
index 6e84416..0a423ab 100755
--- a/precommit/src/main/shell/personality/bigtop.sh
+++ b/precommit/src/main/shell/personality/bigtop.sh
@@ -14,7 +14,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-personality_plugins "all,-checkstyle,-findbugs"
+personality_plugins "all,-checkstyle,-findbugs,-spotbugs"
 
 ## @description  Globals specific to this personality
 ## @audience     private
diff --git a/precommit/src/main/shell/personality/jmeter.sh b/precommit/src/main/shell/personality/jmeter.sh
index f2a6056..b4f524c 100755
--- a/precommit/src/main/shell/personality/jmeter.sh
+++ b/precommit/src/main/shell/personality/jmeter.sh
@@ -14,7 +14,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-personality_plugins "all,-javadoc,-findbugs,-asflicense"
+personality_plugins "all,-javadoc,-findbugs,-asflicense,-spotbugs"
 
 ## @description  Globals specific to this personality
 ## @audience     private
diff --git a/precommit/src/main/shell/personality/orc.sh b/precommit/src/main/shell/personality/orc.sh
index 95868ba..6fb5796 100755
--- a/precommit/src/main/shell/personality/orc.sh
+++ b/precommit/src/main/shell/personality/orc.sh
@@ -14,7 +14,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-personality_plugins "all,-checkstyle,-findbugs"
+personality_plugins "all,-checkstyle,-findbugs,-spotbugs"
 
 ## @description  Globals specific to this personality
 ## @audience     private
diff --git a/precommit/src/main/shell/test-patch-docker/Dockerfile b/precommit/src/main/shell/test-patch-docker/Dockerfile
index e8552fb..7fe612f 100644
--- a/precommit/src/main/shell/test-patch-docker/Dockerfile
+++ b/precommit/src/main/shell/test-patch-docker/Dockerfile
@@ -121,6 +121,18 @@
     && rm -rf /var/lib/apt/lists/*
 ENV FINDBUGS_HOME /usr
 
+#####
+# Install SpotBugs
+#####
+RUN curl -fsSL http://repo.maven.apache.org/maven2/com/github/spotbugs/spotbugs/3.1.12/spotbugs-3.1.12.tgz -o spotbugs.tgz \
+    && curl -fsSL http://repo.maven.apache.org/maven2/com/github/spotbugs/spotbugs/3.1.12/spotbugs-3.1.12.tgz.sha1 -o spotbugs.tgz.sha1 \
+    && echo -n "  spotbugs.tgz" >> spotbugs.tgz.sha1 \
+    && shasum -c spotbugs.tgz.sha1 \
+    && mkdir -p /opt/spotbugs \
+    && tar -C /opt/spotbugs --strip-components 1  -xpf spotbugs.tgz \
+    && rm spotbugs.tgz spotbugs.tgz.sha1
+ENV SPOTBUGS_HOME /opt/spotbugs
+
 ####
 # Install GNU C/C++
 ####
diff --git a/precommit/src/main/shell/test-patch.d/ant.sh b/precommit/src/main/shell/test-patch.d/ant.sh
index 31a5e66..7171d26 100755
--- a/precommit/src/main/shell/test-patch.d/ant.sh
+++ b/precommit/src/main/shell/test-patch.d/ant.sh
@@ -120,6 +120,9 @@
     javadoc)
       modules_workers "${repostatus}" javadoc clean javadoc
     ;;
+    spotbugs)
+      modules_workers "${repostatus}" spotbugs spotbugs
+    ;;
     unit)
       modules_workers "${repostatus}" unit
     ;;
@@ -209,6 +212,7 @@
   fi
 
   if [[ ${filename} =~ \.java$ ]]; then
+    add_test spotbugs
     add_test findbugs
   fi
 }
diff --git a/precommit/src/main/shell/test-patch.d/findbugs.sh b/precommit/src/main/shell/test-patch.d/findbugs.sh
deleted file mode 100755
index 606fb93..0000000
--- a/precommit/src/main/shell/test-patch.d/findbugs.sh
+++ /dev/null
@@ -1,463 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# SHELLDOC-IGNORE
-
-FINDBUGS_HOME=${FINDBUGS_HOME:-}
-FINDBUGS_WARNINGS_FAIL_PRECHECK=false
-
-add_test_type findbugs
-
-function findbugs_usage
-{
-  yetus_add_option "--findbugs-home=<path>" "Findbugs home directory (default \${FINDBUGS_HOME})"
-  yetus_add_option "--findbugs-strict-precheck" "If there are Findbugs warnings during precheck, fail"
-}
-
-function findbugs_parse_args
-{
-  declare i
-
-  for i in "$@"; do
-    case ${i} in
-    --findbugs-home=*)
-      FINDBUGS_HOME=${i#*=}
-    ;;
-    --findbugs-strict-precheck)
-      FINDBUGS_WARNINGS_FAIL_PRECHECK=true
-    ;;
-    esac
-  done
-}
-
-## @description  initialize the findbugs plug-in
-## @audience     private
-## @stability    evolving
-## @replaceable  no
-function findbugs_initialize
-{
-  if declare -f maven_add_install >/dev/null 2>&1; then
-    maven_add_install findbugs
-  fi
-}
-
-function findbugs_filefilter
-{
-  declare filename=$1
-
-  if [[ ${BUILDTOOL} == maven
-    || ${BUILDTOOL} == ant ]]; then
-    if [[ ${filename} =~ \.java$
-      || ${filename} =~ (^|/)findbugs-exclude.xml$ ]]; then
-      add_test findbugs
-    fi
-  fi
-}
-
-function findbugs_precheck
-{
-  declare exec
-  declare status=0
-
-  if [[ -z ${FINDBUGS_HOME} ]]; then
-    yetus_error "FINDBUGS_HOME was not specified."
-    status=1
-  else
-    for exec in computeBugHistory \
-                convertXmlToText \
-                filterBugs \
-                setBugDatabaseInfo\
-                unionBugs; do
-      if ! verify_command "${exec}" "${FINDBUGS_HOME}/bin/${exec}"; then
-        status=1
-      fi
-    done
-  fi
-  if [[ ${status} == 1 ]]; then
-    add_vote_table 0 findbugs "Findbugs executables are not available."
-    delete_test findbugs
-  fi
-}
-
-## @description  Run the maven findbugs plugin and record found issues in a bug database
-## @audience     private
-## @stability    evolving
-## @replaceable  no
-## @return       0 on success
-## @return       1 on failure
-## @param        repostatus
-function findbugs_runner
-{
-  declare name=$1
-  declare module
-  declare result=0
-  declare fn
-  declare warnings_file
-  declare i=0
-  declare savestop
-  declare retval
-
-
-  personality_modules "${name}" findbugs
-
-  "${BUILDTOOL}_modules_worker" "${name}" findbugs
-
-  if [[ ${UNSUPPORTED_TEST} = true ]]; then
-    return 0
-  fi
-
-  #shellcheck disable=SC2153
-  until [[ ${i} -eq ${#MODULE[@]} ]]; do
-    if [[ ${MODULE_STATUS[${i}]} == -1 ]]; then
-      ((result=result+1))
-      ((i=i+1))
-      continue
-    fi
-    start_clock
-    offset_clock "${MODULE_STATUS_TIMER[${i}]}"
-    module="${MODULE[${i}]}"
-    fn=$(module_file_fragment "${module}")
-
-    if [[ "${module}" == . ]]; then
-      module=root
-    fi
-
-    case ${BUILDTOOL} in
-      maven)
-        targetfile="findbugsXml.xml"
-      ;;
-      ant)
-        targetfile="${ANT_FINDBUGSXML}"
-      ;;
-    esac
-
-    while read -r line; do
-      files+=("${line}")
-    done < <(find . -name "${targetfile}")
-
-    if [[ "${#files[@]}" -lt 1 ]]; then
-      module_status ${i} 0 "" "${name}/${module} no findbugs output file (${targetfile})"
-      ((i=i+1))
-      continue
-    fi
-
-    warnings_file="${PATCH_DIR}/${name}-findbugs-${fn}-warnings"
-
-    "${FINDBUGS_HOME}/bin/unionBugs" -withMessages -output "${warnings_file}.xml" "${files[@]}"
-
-    if [[ ${name} == branch ]]; then
-      "${FINDBUGS_HOME}/bin/setBugDatabaseInfo" -name "${PATCH_BRANCH}" \
-          "${warnings_file}.xml" "${warnings_file}.xml"
-      retval=$?
-    else
-      "${FINDBUGS_HOME}/bin/setBugDatabaseInfo" -name patch \
-          "${warnings_file}.xml" "${warnings_file}.xml"
-      retval=$?
-    fi
-
-    if [[ ${retval} != 0 ]]; then
-      savestop=$(stop_clock)
-      MODULE_STATUS_TIMER[${i}]=${savestop}
-      module_status ${i} -1 "" "${name}/${module} cannot run setBugDatabaseInfo from findbugs"
-      ((result=result+1))
-      ((i=i+1))
-      continue
-    fi
-
-    if ! "${FINDBUGS_HOME}/bin/convertXmlToText" -html \
-      "${warnings_file}.xml" \
-      "${warnings_file}.html"; then
-      savestop=$(stop_clock)
-      MODULE_STATUS_TIMER[${i}]=${savestop}
-      module_status ${i} -1 "" "${name}/${module} cannot run convertXmlToText from findbugs"
-      ((result=result+1))
-    fi
-
-    if [[ -z ${FINDBUGS_VERSION}
-        && ${name} == branch ]]; then
-      FINDBUGS_VERSION=$(${GREP} -i "BugCollection version=" "${warnings_file}.xml" \
-        | cut -f2 -d\" \
-        | cut -f1 -d\" )
-      if [[ -n ${FINDBUGS_VERSION} ]]; then
-        add_footer_table findbugs "v${FINDBUGS_VERSION}"
-      fi
-    fi
-
-    ((i=i+1))
-  done
-  return ${result}
-}
-
-## @description  Track pre-existing findbugs warnings
-## @audience     private
-## @stability    evolving
-## @replaceable  no
-## @return       0 on success
-## @return       1 on failure
-function findbugs_preapply
-{
-  declare fn
-  declare module
-  declare modindex=0
-  declare warnings_file
-  declare module_findbugs_warnings
-  declare result=0
-  declare msg
-
-  if ! verify_needed_test findbugs; then
-    return 0
-  fi
-
-  big_console_header "findbugs detection: ${PATCH_BRANCH}"
-
-  findbugs_runner branch
-  result=$?
-
-  if [[ ${UNSUPPORTED_TEST} = true ]]; then
-    return 0
-  fi
-
-  until [[ ${modindex} -eq ${#MODULE[@]} ]]; do
-    if [[ ${MODULE_STATUS[${modindex}]} == -1 ]]; then
-      ((result=result+1))
-      ((modindex=modindex+1))
-      continue
-    fi
-
-    module=${MODULE[${modindex}]}
-    start_clock
-    offset_clock "${MODULE_STATUS_TIMER[${modindex}]}"
-    fn=$(module_file_fragment "${module}")
-
-    if [[ "${module}" == . ]]; then
-      module=root
-    fi
-
-    warnings_file="${PATCH_DIR}/branch-findbugs-${fn}-warnings"
-    # shellcheck disable=SC2016
-    module_findbugs_warnings=$("${FINDBUGS_HOME}/bin/filterBugs" -first \
-        "${PATCH_BRANCH}" \
-        "${warnings_file}.xml" \
-        "${warnings_file}.xml" \
-        | ${AWK} '{print $1}')
-
-    if [[ ${module_findbugs_warnings} -gt 0 ]] ; then
-      msg="${module} in ${PATCH_BRANCH} has ${module_findbugs_warnings} extant Findbugs warnings."
-      if [[ "${FINDBUGS_WARNINGS_FAIL_PRECHECK}" = "true" ]]; then
-        module_status ${modindex} -1 "branch-findbugs-${fn}-warnings.html" "${msg}"
-        ((result=result+1))
-      elif [[ "${BUILDMODE}" = full ]]; then
-        module_status ${modindex} -1 "branch-findbugs-${fn}-warnings.html" "${msg}"
-        ((result=result+1))
-        populate_test_table FindBugs "module:${module}"
-        #shellcheck disable=SC2162
-        while read line; do
-          firstpart=$(echo "${line}" | cut -f2 -d:)
-          secondpart=$(echo "${line}" | cut -f9- -d' ')
-          add_test_table "" "${firstpart}:${secondpart}"
-        done < <("${FINDBUGS_HOME}/bin/convertXmlToText" "${warnings_file}.xml")
-      else
-        module_status ${modindex} 0 "branch-findbugs-${fn}-warnings.html" "${msg}"
-      fi
-    fi
-
-    savestop=$(stop_clock)
-    MODULE_STATUS_TIMER[${modindex}]=${savestop}
-    ((modindex=modindex+1))
-  done
-  modules_messages branch findbugs true
-
-  if [[ ${result} != 0 ]]; then
-    return 1
-  fi
-  return 0
-}
-
-## @description  Verify patch does not trigger any findbugs warnings
-## @audience     private
-## @stability    evolving
-## @replaceable  no
-## @return       0 on success
-## @return       1 on failure
-function findbugs_postinstall
-{
-  declare module
-  declare fn
-  declare combined_xml
-  declare branchxml
-  declare patchxml
-  declare newbugsbase
-  declare fixedbugsbase
-  declare branch_warnings
-  declare patch_warnings
-  declare fixed_warnings
-  declare line
-  declare firstpart
-  declare secondpart
-  declare i=0
-  declare result=0
-  declare savestop
-  declare summarize=true
-  declare statstring
-
-  if ! verify_needed_test findbugs; then
-    return 0
-  fi
-
-  big_console_header "findbugs detection: ${BUILDMODE}"
-
-  findbugs_runner patch
-
-  if [[ ${UNSUPPORTED_TEST} = true ]]; then
-    return 0
-  fi
-
-  until [[ $i -eq ${#MODULE[@]} ]]; do
-    if [[ ${MODULE_STATUS[${i}]} == -1 ]]; then
-      ((result=result+1))
-      ((i=i+1))
-      continue
-    fi
-
-    start_clock
-    offset_clock "${MODULE_STATUS_TIMER[${i}]}"
-    module="${MODULE[${i}]}"
-
-    buildtool_cwd "${i}"
-
-    fn=$(module_file_fragment "${module}")
-
-    if [[ "${module}" == . ]]; then
-      module=root
-    fi
-
-    combined_xml="${PATCH_DIR}/combined-findbugs-${fn}.xml"
-    branchxml="${PATCH_DIR}/branch-findbugs-${fn}-warnings.xml"
-    patchxml="${PATCH_DIR}/patch-findbugs-${fn}-warnings.xml"
-
-    if [[ -f "${branchxml}" ]]; then
-      # shellcheck disable=SC2016
-      branch_warnings=$("${FINDBUGS_HOME}/bin/filterBugs" -first \
-          "${PATCH_BRANCH}" \
-          "${branchxml}" \
-          "${branchxml}" \
-          | ${AWK} '{print $1}')
-    else
-      branchxml=${patchxml}
-    fi
-
-    newbugsbase="${PATCH_DIR}/new-findbugs-${fn}"
-    fixedbugsbase="${PATCH_DIR}/fixed-findbugs-${fn}"
-
-    if ! "${FINDBUGS_HOME}/bin/computeBugHistory" -useAnalysisTimes -withMessages \
-            -output "${combined_xml}" \
-            "${branchxml}" \
-            "${patchxml}"; then
-      module_status ${i} -1 "" "${module} cannot run computeBugHistory from findbugs"
-      ((result=result+1))
-      savestop=$(stop_clock)
-      MODULE_STATUS_TIMER[${i}]=${savestop}
-      ((i=i+1))
-      popd >/dev/null || return 1
-      continue
-    fi
-
-    # shellcheck disable=SC2016
-    patch_warnings=$("${FINDBUGS_HOME}/bin/filterBugs" -first \
-        "patch" \
-        "${patchxml}" \
-        "${patchxml}" \
-        | ${AWK} '{print $1}')
-
-    #shellcheck disable=SC2016
-    add_warnings=$("${FINDBUGS_HOME}/bin/filterBugs" -first patch \
-        "${combined_xml}" "${newbugsbase}.xml" | ${AWK} '{print $1}')
-    retval=$?
-    if [[ ${retval} != 0 ]]; then
-      module_status ${i} -1 "" "${module} cannot run filterBugs (#1) from findbugs"
-      ((result=result+1))
-      savestop=$(stop_clock)
-      MODULE_STATUS_TIMER[${i}]=${savestop}
-      ((i=i+1))
-      popd >/dev/null || return 1
-      continue
-    fi
-
-    #shellcheck disable=SC2016
-    fixed_warnings=$("${FINDBUGS_HOME}/bin/filterBugs" -fixed patch \
-        "${combined_xml}" "${fixedbugsbase}.xml" | ${AWK} '{print $1}')
-    retval=$?
-    if [[ ${retval} != 0 ]]; then
-      module_status ${i} -1 "" "${module} cannot run filterBugs (#2) from findbugs"
-      ((result=result+1))
-      savestop=$(stop_clock)
-      MODULE_STATUS_TIMER[${i}]=${savestop}
-      ((i=i+1))
-      popd >/dev/null || return 1
-      continue
-    fi
-
-    statstring=$(generic_calcdiff_status "${branch_warnings}" "${patch_warnings}" "${add_warnings}")
-
-    if ! "${FINDBUGS_HOME}/bin/convertXmlToText" -html "${newbugsbase}.xml" \
-        "${newbugsbase}.html"; then
-      module_status ${i} -1 "" "${module} cannot run convertXmlToText from findbugs"
-      ((result=result+1))
-      savestop=$(stop_clock)
-      MODULE_STATUS_TIMER[${i}]=${savestop}
-      ((i=i+1))
-      popd >/dev/null || return 1
-      continue
-    fi
-
-    if [[ ${add_warnings} -gt 0 ]] ; then
-      populate_test_table FindBugs "module:${module}"
-      #shellcheck disable=SC2162
-      while read line; do
-        firstpart=$(echo "${line}" | cut -f2 -d:)
-        secondpart=$(echo "${line}" | cut -f9- -d' ')
-        add_test_table "" "${firstpart}:${secondpart}"
-      done < <("${FINDBUGS_HOME}/bin/convertXmlToText" "${newbugsbase}.xml")
-
-      module_status ${i} -1 "new-findbugs-${fn}.html" "${module} ${statstring}"
-      ((result=result+1))
-    elif [[ ${fixed_warnings} -gt 0 ]]; then
-      module_status ${i} +1 "" "${module} ${statstring}"
-      summarize=false
-    fi
-    savestop=$(stop_clock)
-    MODULE_STATUS_TIMER[${i}]=${savestop}
-    popd >/dev/null || return 1
-    ((i=i+1))
-  done
-
-  modules_messages patch findbugs "${summarize}"
-  if [[ ${result} != 0 ]]; then
-    return 1
-  fi
-  return 0
-}
-
-function findbugs_rebuild
-{
-  declare repostatus=$1
-
-  if [[ "${repostatus}" = branch || "${BUILDMODE}" = full ]]; then
-    findbugs_preapply
-  else
-    findbugs_postinstall
-  fi
-}
diff --git a/precommit/src/main/shell/test-patch.d/gradle.sh b/precommit/src/main/shell/test-patch.d/gradle.sh
index 64e9714..6e2382c 100755
--- a/precommit/src/main/shell/test-patch.d/gradle.sh
+++ b/precommit/src/main/shell/test-patch.d/gradle.sh
@@ -284,6 +284,7 @@
   fi
 
   if [[ ${filename} =~ \.java$ ]]; then
+    add_test spotbugs
     add_test findbugs
   fi
 }
diff --git a/precommit/src/main/shell/test-patch.d/maven.sh b/precommit/src/main/shell/test-patch.d/maven.sh
index 64fbcc2..5b2d9ab 100755
--- a/precommit/src/main/shell/test-patch.d/maven.sh
+++ b/precommit/src/main/shell/test-patch.d/maven.sh
@@ -326,6 +326,9 @@
     scaladoc)
       modules_workers "${repostatus}" scaladoc clean scala:doc -DskipTests=true
     ;;
+    spotbugs)
+      modules_workers "${repostatus}" spotbugs test-compile spotbugs:spotbugs -DskipTests=true
+    ;;
     unit)
       if [[ -n "${maven_unit_test_filter}" ]]; then
         modules_workers "${repostatus}" unit clean test -fae "${maven_unit_test_filter}"
@@ -525,6 +528,7 @@
   fi
 
   if [[ ${filename} =~ \.java$ ]]; then
+    add_test spotbugs
     add_test findbugs
   fi
 }
@@ -629,7 +633,8 @@
   modules_workers "${repostatus}" mvninstall -fae \
     clean install \
     -DskipTests=true -Dmaven.javadoc.skip=true \
-    -Dcheckstyle.skip=true -Dfindbugs.skip=true
+    -Dcheckstyle.skip=true -Dfindbugs.skip=true \
+    -Dspotbugs.skip=true
   result=$?
   modules_messages "${repostatus}" mvninstall true
   if [[ ${result} != 0 ]]; then
diff --git a/precommit/src/main/shell/test-patch.d/spotbugs.sh b/precommit/src/main/shell/test-patch.d/spotbugs.sh
new file mode 100755
index 0000000..57c5815
--- /dev/null
+++ b/precommit/src/main/shell/test-patch.d/spotbugs.sh
@@ -0,0 +1,583 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# SHELLDOC-IGNORE
+
+SPOTBUGS_HOME=${SPOTBUGS_HOME:-}
+ANT_SPOTBUGSXML=${ANT_SPOTBUGSXML:-}
+SPOTBUGS_WARNINGS_FAIL_PRECHECK=false
+SPOTBUGS_TABLE_DUPE=false
+
+if [[ -z "${SPOTBUGS_HOME}" && -n "${FINDBUGS_HOME}" ]]; then
+  SPOTBUGS_MODE=findbugs
+else
+  SPOTBUGS_MODE=spotbugs
+fi
+
+add_test_type spotbugs
+
+function spotbugs_deprecate_test_type
+{
+  if [[ "${SPOTBUGS_MODE}" == spotbugs ]]; then
+    if replace_test_type spotbugs findbugs; then
+      yetus_error "WARNING: Found both spotbugs and findbugs. Disabling findbugs."
+      SPOTBUGS_TABLE_DUPE=true
+    fi
+  else
+    if replace_test_type findbugs spotbugs; then
+      yetus_error "WARNING: spotbugs has deprecated findbugs, but only found findbugs."
+    fi
+  fi
+}
+
+function spotbugs_usage
+{
+  yetus_add_option "--spotbugs-home=<path>" "SpotBugs home directory (default \${SPOTBUGS_HOME})"
+  yetus_add_option "--spotbugs-strict-precheck" "If there are SpotBugs warnings during precheck, fail"
+}
+
+function spotbugs_parse_args
+{
+  declare i
+
+  for i in "$@"; do
+    case ${i} in
+    --spotbugs-home=*)
+      SPOTBUGS_HOME=${i#*=}
+    ;;
+    --spotbugs-strict-precheck)
+      SPOTBUGS_WARNINGS_FAIL_PRECHECK=true
+    ;;
+    esac
+  done
+}
+
+## @description  initialize the spotbugs plug-in
+## @audience     private
+## @stability    evolving
+## @replaceable  no
+function spotbugs_initialize
+{
+  if [[ "${SPOTBUGS_MODE}" == findbugs ]]; then
+    FINDBUGS_HOME=${SPOTBUGS_HOME:-${FINDBUGS_HOME}}
+  fi
+
+  if declare -f maven_add_install >/dev/null 2>&1; then
+    maven_add_install "${SPOTBUGS_MODE}"
+  fi
+}
+
+function spotbugs_filefilter
+{
+  declare filename=$1
+
+  if [[ ${BUILDTOOL} == maven
+    || ${BUILDTOOL} == ant ]]; then
+    if [[ ${filename} =~ \.java$
+      || ${filename} =~ (^|/)${SPOTBUGS_MODE}-exclude.xml$ ]]; then
+      add_test "${SPOTBUGS_MODE}"
+    fi
+  fi
+}
+
+function spotbugs_precheck
+{
+  declare exec
+  declare status=0
+
+  if [[ -z ${SPOTBUGS_HOME} ]]; then
+    yetus_error "SPOTBUGS_HOME (or FINDBUGS_HOME) was not specified."
+    status=1
+  else
+    for exec in computeBugHistory \
+                convertXmlToText \
+                filterBugs \
+                setBugDatabaseInfo\
+                unionBugs; do
+      if ! verify_command "${exec}" "${SPOTBUGS_HOME}/bin/${exec}"; then
+        status=1
+      fi
+    done
+  fi
+  if [[ ${status} == 1 ]]; then
+    add_vote_table 0 "${SPOTBUGS_MODE}" "${SPOTBUGS_MODE} executables are not available."
+    delete_test "${SPOTBUGS_MODE}"
+  fi
+}
+
+## @description  Run the maven spotbugs plugin and record found issues in a bug database
+## @audience     private
+## @stability    evolving
+## @replaceable  no
+## @return       0 on success
+## @return       1 on failure
+## @param        repostatus
+function spotbugs_runner
+{
+  declare name=$1
+  declare module
+  declare result=0
+  declare fn
+  declare warnings_file
+  declare i=0
+  declare savestop
+  declare retval
+
+
+  personality_modules "${name}" "${SPOTBUGS_MODE}"
+
+  "${BUILDTOOL}_modules_worker" "${name}" "${SPOTBUGS_MODE}"
+
+  if [[ ${UNSUPPORTED_TEST} = true ]]; then
+    return 0
+  fi
+
+  echo ""
+  echo "Building ${SPOTBUGS_MODE} database(s) using ${SPOTBUGS_HOME} for executables."
+  echo ""
+
+  if [[ "${SPOTBUGS_TABLE_DUPE}" == true ]] && [[ "${name}" == branch ]]; then
+    add_vote_table 0 spotbugs "Both FindBugs and SpotBugs are enabled, using SpotBugs."
+  fi
+
+  #shellcheck disable=SC2153
+  until [[ ${i} -eq ${#MODULE[@]} ]]; do
+    if [[ ${MODULE_STATUS[${i}]} == -1 ]]; then
+      ((result=result+1))
+      ((i=i+1))
+      continue
+    fi
+    start_clock
+    offset_clock "${MODULE_STATUS_TIMER[${i}]}"
+    module="${MODULE[${i}]}"
+    fn=$(module_file_fragment "${module}")
+
+    if [[ "${module}" == . ]]; then
+      module=root
+    fi
+
+    case ${BUILDTOOL} in
+      maven)
+        targetfile="${SPOTBUGS_MODE}Xml.xml"
+      ;;
+      ant)
+        targetfile="${ANT_SPOTBUGSXML}"
+      ;;
+    esac
+
+    buildtool_cwd "${i}"
+
+    files=()
+    while read -r line; do
+      files+=("${line}")
+    done < <(find . -name "${targetfile}")
+
+    warnings_file="${PATCH_DIR}/${name}-${SPOTBUGS_MODE}-${fn}-warnings"
+
+    if [[ "${#files[@]}" -lt 1 ]]; then
+      module_status ${i} 0 "" "${name}/${module} no ${SPOTBUGS_MODE} output file (${targetfile})"
+      ((i=i+1))
+      popd >/dev/null || return 1
+      continue
+    elif [[ "${#files[@]}" -eq 1 ]]; then
+      cp -p "${files[0]}" "${warnings_file}.xml"
+    else
+      "${SPOTBUGS_HOME}/bin/unionBugs" -withMessages -output "${warnings_file}.xml" "${files[@]}"
+    fi
+
+    popd >/dev/null || return 1
+
+    if [[ ${name} == branch ]]; then
+      "${SPOTBUGS_HOME}/bin/setBugDatabaseInfo" -name "${PATCH_BRANCH}" \
+          "${warnings_file}.xml" "${warnings_file}.xml"
+      retval=$?
+    else
+      "${SPOTBUGS_HOME}/bin/setBugDatabaseInfo" -name patch \
+          "${warnings_file}.xml" "${warnings_file}.xml"
+      retval=$?
+    fi
+
+    if [[ ${retval} != 0 ]]; then
+      savestop=$(stop_clock)
+      MODULE_STATUS_TIMER[${i}]=${savestop}
+      module_status ${i} -1 "" "${name}/${module} cannot run setBugDatabaseInfo from ${SPOTBUGS_MODE}"
+      ((result=result+1))
+      ((i=i+1))
+      continue
+    fi
+
+    if [[ ! -f "${warnings_file}.xml" ]]; then
+      module_status ${i} 0 "" "${name}/${module} no data in SpotBugs/FindBugs output file (${targetfile})"
+      ((i=i+1))
+      popd >/dev/null || return 1
+      continue
+    fi
+
+    if ! "${SPOTBUGS_HOME}/bin/convertXmlToText" -html \
+      "${warnings_file}.xml" \
+      "${warnings_file}.html"; then
+      savestop=$(stop_clock)
+      MODULE_STATUS_TIMER[${i}]=${savestop}
+      module_status ${i} -1 "" "${name}/${module} cannot run convertXmlToText from ${SPOTBUGS_MODE}"
+      ((result=result+1))
+    fi
+
+    if [[ -z ${SPOTBUGS_VERSION}
+        && ${name} == branch ]]; then
+      SPOTBUGS_VERSION=$("${GREP}" -i "BugCollection version=" "${warnings_file}.xml" \
+        | cut -f2 -d\" \
+        | cut -f1 -d\" )
+      if [[ -n ${SPOTBUGS_VERSION} ]]; then
+        add_footer_table "${SPOTBUGS_MODE}" "v${SPOTBUGS_VERSION}"
+      fi
+    fi
+
+    ((i=i+1))
+  done
+
+  return ${result}
+}
+
+## @description  Track pre-existing spotbugs warnings
+## @audience     private
+## @stability    evolving
+## @replaceable  no
+## @return       0 on success
+## @return       1 on failure
+function spotbugs_preapply
+{
+  declare fn
+  declare module
+  declare modindex=0
+  declare warnings_file
+  declare module_spotbugs_warnings
+  declare result=0
+  declare msg
+
+  if ! verify_needed_test "${SPOTBUGS_MODE}"; then
+    return 0
+  fi
+
+  big_console_header "${SPOTBUGS_MODE} detection: ${PATCH_BRANCH}"
+
+  spotbugs_runner branch
+  result=$?
+
+  if [[ ${UNSUPPORTED_TEST} = true ]]; then
+    return 0
+  fi
+
+  if [[ "${SPOTBUGS_MODE}" == findbugs ]]; then
+    add_vote_table 0 spotbugs "Used deprecated FindBugs config; considering switching to SpotBugs."
+  fi
+
+  until [[ ${modindex} -eq ${#MODULE[@]} ]]; do
+    if [[ ${MODULE_STATUS[${modindex}]} == -1 ]]; then
+      ((result=result+1))
+      ((modindex=modindex+1))
+      continue
+    fi
+
+    module=${MODULE[${modindex}]}
+    start_clock
+    offset_clock "${MODULE_STATUS_TIMER[${modindex}]}"
+    fn=$(module_file_fragment "${module}")
+
+    if [[ "${module}" == . ]]; then
+      module=root
+    fi
+
+    warnings_file="${PATCH_DIR}/branch-${SPOTBUGS_MODE}-${fn}-warnings"
+    if [[ ! -f "${warnings_file}.xml" ]]; then
+      savestop=$(stop_clock)
+      MODULE_STATUS_TIMER[${modindex}]=${savestop}
+      ((modindex=modindex+1))
+      continue
+    fi
+
+    # shellcheck disable=SC2016
+    module_spotbugs_warnings=$("${SPOTBUGS_HOME}/bin/filterBugs" -first \
+        "${PATCH_BRANCH}" \
+        "${warnings_file}.xml" \
+        "${warnings_file}.xml" \
+        | "${AWK}" '{print $1}')
+
+    if [[ ${module_spotbugs_warnings} -gt 0 ]] ; then
+      msg="${module} in ${PATCH_BRANCH} has ${module_spotbugs_warnings} extant ${SPOTBUGS_MODE} warnings."
+      if [[ "${SPOTBUGS_WARNINGS_FAIL_PRECHECK}" = "true" ]]; then
+        module_status ${modindex} -1 "branch-${SPOTBUGS_MODE}-${fn}-warnings.html" "${msg}"
+        ((result=result+1))
+      elif [[ "${BUILDMODE}" = full ]]; then
+        module_status ${modindex} -1 "branch-${SPOTBUGS_MODE}-${fn}-warnings.html" "${msg}"
+        ((result=result+1))
+        populate_test_table "${SPOTBUGS_MODE}" "module:${module}"
+        #shellcheck disable=SC2162
+        while read line; do
+          firstpart=$(echo "${line}" | cut -f2 -d:)
+          secondpart=$(echo "${line}" | cut -f9- -d' ')
+          add_test_table "" "${firstpart}:${secondpart}"
+        done < <("${SPOTBUGS_HOME}/bin/convertXmlToText" "${warnings_file}.xml")
+      else
+        module_status ${modindex} 0 "branch-${SPOTBUGS_MODE}-${fn}-warnings.html" "${msg}"
+      fi
+    fi
+
+    savestop=$(stop_clock)
+    MODULE_STATUS_TIMER[${modindex}]=${savestop}
+    ((modindex=modindex+1))
+  done
+  modules_messages branch "${SPOTBUGS_MODE}" true
+
+  if [[ ${result} != 0 ]]; then
+    return 1
+  fi
+  return 0
+}
+
+## @description  Verify patch does not trigger any spotbugs warnings
+## @audience     private
+## @stability    evolving
+## @replaceable  no
+## @return       0 on success
+## @return       1 on failure
+function spotbugs_postinstall
+{
+  declare module
+  declare fn
+  declare combined_xml
+  declare branchxml
+  declare patchxml
+  declare newbugsbase
+  declare fixedbugsbase
+  declare branch_warnings
+  declare patch_warnings
+  declare fixed_warnings
+  declare line
+  declare firstpart
+  declare secondpart
+  declare i=0
+  declare result=0
+  declare savestop
+  declare summarize=true
+  declare statstring
+
+  if ! verify_needed_test "${SPOTBUGS_MODE}"; then
+    return 0
+  fi
+
+  big_console_header "${SPOTBUGS_MODE} detection: ${BUILDMODE}"
+
+  spotbugs_runner patch
+
+  if [[ ${UNSUPPORTED_TEST} = true ]]; then
+    return 0
+  fi
+
+  until [[ $i -eq ${#MODULE[@]} ]]; do
+    if [[ ${MODULE_STATUS[${i}]} == -1 ]]; then
+      ((result=result+1))
+      ((i=i+1))
+      continue
+    fi
+
+    start_clock
+    offset_clock "${MODULE_STATUS_TIMER[${i}]}"
+    module="${MODULE[${i}]}"
+
+    buildtool_cwd "${i}"
+
+    fn=$(module_file_fragment "${module}")
+
+    if [[ "${module}" == . ]]; then
+      module=root
+    fi
+
+    combined_xml="${PATCH_DIR}/combined-${SPOTBUGS_MODE}-${fn}.xml"
+    branchxml="${PATCH_DIR}/branch-${SPOTBUGS_MODE}-${fn}-warnings.xml"
+    patchxml="${PATCH_DIR}/patch-${SPOTBUGS_MODE}-${fn}-warnings.xml"
+
+    if [[ -f "${branchxml}" ]]; then
+      # shellcheck disable=SC2016
+      branch_warnings=$("${SPOTBUGS_HOME}/bin/filterBugs" -first \
+          "${PATCH_BRANCH}" \
+          "${branchxml}" \
+          "${branchxml}" \
+          | ${AWK} '{print $1}')
+    else
+      branchxml=${patchxml}
+    fi
+
+    newbugsbase="${PATCH_DIR}/new-${SPOTBUGS_MODE}-${fn}"
+    fixedbugsbase="${PATCH_DIR}/fixed-${SPOTBUGS_MODE}-${fn}"
+
+    if [[ ! -f "${branchxml}" ]] && [[ ! -f "${patchxml}" ]]; then
+      module_status ${i} 0 "" "${module} has no data from ${SPOTBUGS_MODE}"
+      ((result=result+1))
+      savestop=$(stop_clock)
+      MODULE_STATUS_TIMER[${i}]=${savestop}
+      ((i=i+1))
+      popd >/dev/null || return 1
+      continue
+    fi
+
+    echo ""
+
+    if ! "${SPOTBUGS_HOME}/bin/computeBugHistory" -useAnalysisTimes -withMessages \
+            -output "${combined_xml}" \
+            "${branchxml}" \
+            "${patchxml}"; then
+      module_status ${i} -1 "" "${module} cannot run computeBugHistory from ${SPOTBUGS_MODE}"
+      ((result=result+1))
+      savestop=$(stop_clock)
+      MODULE_STATUS_TIMER[${i}]=${savestop}
+      ((i=i+1))
+      popd >/dev/null || return 1
+      continue
+    fi
+
+    # shellcheck disable=SC2016
+    patch_warnings=$("${SPOTBUGS_HOME}/bin/filterBugs" -first \
+        "patch" \
+        "${patchxml}" \
+        "${patchxml}" \
+        | ${AWK} '{print $1}')
+
+    #shellcheck disable=SC2016
+    add_warnings=$("${SPOTBUGS_HOME}/bin/filterBugs" -first patch \
+        "${combined_xml}" "${newbugsbase}.xml" | ${AWK} '{print $1}')
+    retval=$?
+    if [[ ${retval} != 0 ]]; then
+      module_status ${i} -1 "" "${module} cannot run filterBugs (#1) from ${SPOTBUGS_MODE}"
+      ((result=result+1))
+      savestop=$(stop_clock)
+      MODULE_STATUS_TIMER[${i}]=${savestop}
+      ((i=i+1))
+      popd >/dev/null || return 1
+      continue
+    fi
+
+    #shellcheck disable=SC2016
+    fixed_warnings=$("${SPOTBUGS_HOME}/bin/filterBugs" -fixed patch \
+        "${combined_xml}" "${fixedbugsbase}.xml" | ${AWK} '{print $1}')
+    retval=$?
+    if [[ ${retval} != 0 ]]; then
+      module_status ${i} -1 "" "${module} cannot run filterBugs (#2) from ${SPOTBUGS_MODE}"
+      ((result=result+1))
+      savestop=$(stop_clock)
+      MODULE_STATUS_TIMER[${i}]=${savestop}
+      ((i=i+1))
+      popd >/dev/null || return 1
+      continue
+    fi
+
+    statstring=$(generic_calcdiff_status "${branch_warnings}" "${patch_warnings}" "${add_warnings}")
+
+    if ! "${SPOTBUGS_HOME}/bin/convertXmlToText" -html "${newbugsbase}.xml" \
+        "${newbugsbase}.html"; then
+      module_status ${i} -1 "" "${module} cannot run convertXmlToText from ${SPOTBUGS_MODE}"
+      ((result=result+1))
+      savestop=$(stop_clock)
+      MODULE_STATUS_TIMER[${i}]=${savestop}
+      ((i=i+1))
+      popd >/dev/null || return 1
+      continue
+    fi
+
+    if [[ ${add_warnings} -gt 0 ]] ; then
+      populate_test_table FindBugs "module:${module}"
+      #shellcheck disable=SC2162
+      while read line; do
+        firstpart=$(echo "${line}" | cut -f2 -d:)
+        secondpart=$(echo "${line}" | cut -f9- -d' ')
+        add_test_table "" "${firstpart}:${secondpart}"
+      done < <("${SPOTBUGS_HOME}/bin/convertXmlToText" "${newbugsbase}.xml")
+
+      module_status ${i} -1 "new-${SPOTBUGS_MODE}-${fn}.html" "${module} ${statstring}"
+      ((result=result+1))
+    elif [[ ${fixed_warnings} -gt 0 ]]; then
+      module_status ${i} +1 "" "${module} ${statstring}"
+      summarize=false
+    fi
+    savestop=$(stop_clock)
+    MODULE_STATUS_TIMER[${i}]=${savestop}
+    popd >/dev/null || return 1
+    ((i=i+1))
+  done
+
+  modules_messages patch ${SPOTBUGS_MODE} "${summarize}"
+  if [[ ${result} != 0 ]]; then
+    return 1
+  fi
+  return 0
+}
+
+function spotbugs_rebuild
+{
+  declare repostatus=$1
+
+  if [[ "${repostatus}" = branch || "${BUILDMODE}" = full ]]; then
+    spotbugs_preapply
+  else
+    spotbugs_postinstall
+  fi
+}
+
+
+##
+## To be removed:  FindBugs instead of SpotBugs
+##
+
+add_test_type findbugs
+
+function findbugs_usage
+{
+  yetus_add_option "--findbugs-home=<path>" "Findbugs home directory (default \${FINDBUGS_HOME})"
+  yetus_add_option "--findbugs-strict-precheck" "If there are Findbugs warnings during precheck, fail"
+}
+
+function findbugs_parse_args
+{
+  declare i
+
+  for i in "$@"; do
+    case ${i} in
+    --findbugs-home=*)
+      SPOTBUGS_HOME=${i#*=}
+    ;;
+    --findbugs-strict-precheck)
+      SPOTBUGS_WARNINGS_FAIL_PRECHECK=true
+    ;;
+    esac
+  done
+}
+
+function findbugs_initialize
+{
+  SPOTBUGS_MODE="findbugs"
+  ANT_SPOTBUGSXML=${ANT_FINDBUGSXML}
+  SPOTBUGS_HOME=${FINDBUGS_HOME}
+  spotbugs_initialize "$@"
+}
+
+function findbugs_filefilter
+{
+  spotbugs_initialize "$@"
+}
+
+function findbugs_rebuild
+{
+  spotbugs_rebuild "$@"
+}
\ No newline at end of file
