You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@grails.apache.org by jd...@apache.org on 2026/08/23 04:24:41 UTC

(grails-quartz) branch 4.0.x updated: Moved to grails-core repo

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

jdaugherty pushed a commit to branch 4.0.x
in repository https://gitbox.apache.org/repos/asf/grails-quartz.git


The following commit(s) were added to refs/heads/4.0.x by this push:
     new 63840bb  Moved to grails-core repo
63840bb is described below

commit 63840bb7cf2efd35609c34e8295fd9afb5542636
Author: James Daugherty <jd...@jdresources.net>
AuthorDate: Sun Aug 23 00:24:23 2026 -0400

    Moved to grails-core repo
---
 .github/release-drafter.yml                        | 149 -------
 .github/renovate.json                              |  16 -
 .github/scripts/releaseDistributions.sh            |  90 ----
 .github/scripts/releaseJarFiles.sh                 | 142 ------
 .github/vote_templates/announce.txt                |  20 -
 .github/vote_templates/staged.txt                  |  35 --
 .github/vote_templates/vote_succeeded.txt          |  12 -
 .github/workflows/gradle.yml                       |  81 ----
 .github/workflows/rat.yml                          |  60 ---
 .github/workflows/release-abort.yml                | 130 ------
 .github/workflows/release-notes.yml                |  38 --
 .github/workflows/release.yml                      | 495 ---------------------
 .gitignore                                         |  10 -
 .sdkmanrc                                          |   3 -
 CODE_OF_CONDUCT.md                                 |   6 -
 HEADER                                             |  16 -
 LICENSE                                            | 201 ---------
 NOTICE                                             |   5 -
 README.md                                          | 140 +-----
 build.gradle                                       |  86 ----
 buildSrc/build.gradle                              |  53 ---
 etc/bin/Dockerfile                                 |  45 --
 etc/bin/download-release-artifacts.sh              |  76 ----
 etc/bin/extract-build-artifact.sh                  |  56 ---
 etc/bin/generate-build-artifact-hashes.groovy      |  84 ----
 etc/bin/reset-verify.sh                            |  42 --
 etc/bin/test-reproducible-builds.sh                |  64 ---
 etc/bin/verify-jar-artifacts.sh                    | 137 ------
 etc/bin/verify-reproducible.sh                     | 173 -------
 etc/bin/verify-source-distribution.sh              |  92 ----
 etc/bin/verify.sh                                  |  90 ----
 gradle-bootstrap/build.gradle                      |  39 --
 gradle-bootstrap/settings.gradle                   |  18 -
 gradle.properties                                  |  33 --
 gradle/docs-config.gradle                          | 104 -----
 gradle/java-config.gradle                          |  34 --
 gradle/publish-config.gradle                       | 184 --------
 gradle/rat-root-config.gradle                      |  46 --
 gradle/reproducible-config.gradle                  |  32 --
 gradle/test-config.gradle                          |  39 --
 gradle/wrapper/gradle-wrapper.jar                  | Bin 43764 -> 0 bytes
 gradle/wrapper/gradle-wrapper.properties           |   7 -
 gradlew                                            | 251 -----------
 gradlew.bat                                        |  94 ----
 grails-app/conf/plugin.yml                         |  17 -
 .../grails/plugins/quartz/JobManagerService.groovy | 122 -----
 settings.gradle                                    |  53 ---
 src/docs/configuration.adoc                        | 106 -----
 src/docs/index.adoc                                |  46 --
 src/docs/introduction.adoc                         |  24 -
 src/docs/ref/Command Line/create-job.adoc          |  32 --
 src/docs/ref/Triggers/cron.adoc                    |  48 --
 src/docs/ref/Triggers/custom.adoc                  |  49 --
 src/docs/ref/Triggers/simple.adoc                  |  45 --
 src/docs/scheduling.adoc                           |  96 ----
 src/docs/triggers.adoc                             | 118 -----
 .../plugins/quartz/CustomTriggerFactoryBean.java   | 124 ------
 .../plugins/quartz/DefaultGrailsJobClass.java      | 113 -----
 .../grails/plugins/quartz/GrailsJobClass.java      |  90 ----
 .../plugins/quartz/GrailsJobClassConstants.java    |  92 ----
 .../grails/plugins/quartz/GrailsJobFactory.java    | 175 --------
 .../plugins/quartz/JobArtefactHandler.groovy       |  75 ----
 .../grails/plugins/quartz/JobDescriptor.groovy     |  53 ---
 .../plugins/quartz/JobDetailFactoryBean.java       | 107 -----
 .../groovy/grails/plugins/quartz/QuartzJob.groovy  |  97 ----
 .../plugins/quartz/QuartzJobTraitInjector.groovy   |  33 --
 .../grails/plugins/quartz/TriggerDescriptor.groovy |  51 ---
 .../grails/plugins/quartz/TriggerUtils.groovy      |  63 ---
 .../plugins/quartz/cleanup/JdbcCleanup.groovy      |  66 ---
 .../quartz/config/TriggersConfigBuilder.groovy     | 256 -----------
 .../listeners/ExceptionPrinterJobListener.java     |  46 --
 .../quartz/listeners/SessionBinderJobListener.java |  93 ----
 src/main/groovy/quartz/QuartzGrailsPlugin.groovy   | 363 ---------------
 src/main/scripts/CreateJob.groovy                  |  39 --
 src/main/templates/Job.groovy                      |  11 -
 .../quartz/CustomTriggerFactoryBeanSpec.groovy     |  90 ----
 .../quartz/DefaultGrailsJobClassSpec.groovy        |  96 ----
 .../plugins/quartz/JobArtefactHandlerSpec.groovy   |  61 ---
 .../grails/plugins/quartz/JobDescriptorSpec.groovy |  64 ---
 .../plugins/quartz/JobDetailFactoryBeanSpec.groovy | 137 ------
 .../grails/plugins/quartz/MockDoWithSpring.groovy  |  49 --
 .../quartz/QuartzJobTraitInjectorSpec.groovy       |  34 --
 .../grails/plugins/quartz/TestQuartzJob.groovy     |  32 --
 .../plugins/quartz/TriggerDescriptorSpec.groovy    |  73 ---
 .../quartz/config/TriggersConfigBuilderSpec.groovy | 166 -------
 85 files changed, 3 insertions(+), 7030 deletions(-)

diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml
deleted file mode 100644
index 20443bc..0000000
--- a/.github/release-drafter.yml
+++ /dev/null
@@ -1,149 +0,0 @@
-# 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
-#
-#     https://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.
-
-name-template: $RESOLVED_VERSION
-tag-template: v$RESOLVED_VERSION
-pull-request:
-  title-templates:
-    fix: '🐛 $TITLE (#$NUMBER)'
-    feat: '🚀 $TITLE (#$NUMBER)'
-    default: '$TITLE (#$NUMBER)'
-autolabeler:
-  - label: 'bug'
-    branch:
-      - '/fix\/.+/'
-    title:
-      - '/fix/i'
-  - label: 'improvement'
-    branch:
-      - '/improv\/.+/'
-    title:
-      - '/improv/i'
-  - label: 'feature'
-    branch:
-      - '/feature\/.+/'
-    title:
-      - '/feat/i'
-  - label: 'documentation'
-    branch:
-      - '/docs\/.+/'
-    title:
-      - '/docs/i'
-  - label: 'maintenance'
-    branch:
-      - '/(chore|refactor|style|test|ci|perf|build)\/.+/'
-    title:
-      - '/(chore|refactor|style|test|ci|perf|build)/i'
-  - label: 'chore'
-    branch:
-      - '/chore\/.+/'
-    title:
-      - '/chore/i'
-  - label: 'refactor'
-    branch:
-      - '/refactor\/.+/'
-    title:
-      - '/refactor/i'
-  - label: 'style'
-    branch:
-      - '/style\/.+/'
-    title:
-      - '/style/i'
-  - label: 'test'
-    branch:
-      - '/test\/.+/'
-    title:
-      - '/test/i'
-  - label: 'ci'
-    branch:
-      - '/ci\/.+/'
-    title:
-      - '/ci/i'
-  - label: 'perf'
-    branch:
-      - '/perf\/.+/'
-    title:
-      - '/perf/i'
-  - label: 'build'
-    branch:
-      - '/build\/.+/'
-    title:
-      - '/build/i'
-  - label: 'deps'
-    branch:
-      - '/deps\/.+/'
-    title:
-      - '/deps/i'
-  - label: 'revert'
-    branch:
-      - '/revert\/.+/'
-    title:
-      - '/revert/i'
-categories:
-  - title: '🚀 Features'
-    labels:
-      - 'feature'
-      - "type: enhancement"
-      - "type: new feature"
-      - "type: major"
-      - "type: minor"
-  - title: '💡 Improvements'
-    labels:
-      - 'improvement'
-      - "type: improvement"
-
-  - title: '🐛 Bug Fixes'
-    labels:
-      - 'fix'
-      - 'bug'
-      - "type: bug"
-  - title: '📚 Documentation'
-    labels:
-      - 'docs'
-  - title: '🔧 Maintenance'
-    labels:
-      - 'maintenance'
-      - 'chore'
-      - 'refactor'
-      - 'style'
-      - 'test'
-      - 'ci'
-      - 'perf'
-      - 'build'
-      - "type: ci"
-      - "type: build"
-  - title: 'âĒ Reverts'
-    labels:
-      - 'revert'
-change-template: '- $TITLE @$AUTHOR (#$NUMBER)'
-version-resolver:
-  major:
-    labels:
-      - 'type: major'
-  minor:
-    labels:
-      - 'type: minor'
-  patch:
-    labels:
-      - 'type: patch'
-  default: patch
-template: |
-  ## What's Changed
-
-  $CHANGES
-
-  ## Contributors
-
-  $CONTRIBUTORS
\ No newline at end of file
diff --git a/.github/renovate.json b/.github/renovate.json
deleted file mode 100644
index 3c7345f..0000000
--- a/.github/renovate.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
-  "extends": [
-    "config:base"
-  ],
-  "labels": ["type: dependency upgrade"],
-  "packageRules": [
-    {
-      "matchUpdateTypes": ["major"],
-      "enabled": false
-    },
-    {
-      "matchPackagePatterns": ["*"],
-      "allowedVersions": "!/SNAPSHOT$/"
-    }
-  ]
-}
\ No newline at end of file
diff --git a/.github/scripts/releaseDistributions.sh b/.github/scripts/releaseDistributions.sh
deleted file mode 100755
index b0fc7fe..0000000
--- a/.github/scripts/releaseDistributions.sh
+++ /dev/null
@@ -1,90 +0,0 @@
-#!/bin/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
-#
-#    https://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.
-#
-
-# ./releaseDistributions.sh <tag> <username> <svn_folder>
-
-set -euo pipefail
-
-if [[ $# -ne 3 ]]; then
-  echo "Usage: $0 <tag> <svn_folder> <username>" >&2
-  exit 1
-fi
-
-RELEASE_TAG="$1"
-RELEASE_VERSION="${RELEASE_TAG#v}"
-SVN_FOLDER="$2"
-SVN_USER="$3"
-RELEASE_ROOT="https://dist.apache.org/repos/dist/release/grails/${SVN_FOLDER}"
-DEV_ROOT="https://dist.apache.org/repos/dist/dev/grails/${SVN_FOLDER}"
-
-read -r -s -p "Password: " SVN_PASS
-echo
-
-if [[ -z "${RELEASE_TAG}" ]]; then
-  echo "❌ ERROR: Release Tag must not be empty." >&2
-  exit 1
-fi
-if [[ -z "${SVN_FOLDER}" ]]; then
-  echo "❌ ERROR: SVN folder name must not be empty." >&2
-  exit 1
-fi
-if [[ -z "${SVN_USER}" ]]; then
-  echo "❌ ERROR: Username must not be empty." >&2
-  exit 1
-fi
-if [[ -z "${SVN_PASS}" ]]; then
-  echo "❌ ERROR: Password must not be empty." >&2
-  exit 1
-fi
-
-svn_flags=(--non-interactive --trust-server-cert --username "${SVN_USER}" --password "${SVN_PASS}")
-
-svn_exists() {
-  local url="$1"
-  svn ls "${svn_flags[@]}" --depth=empty "${url}" >/dev/null 2>&1
-}
-
-old_release_folder="$(svn ls "${svn_flags[@]}" "${RELEASE_ROOT}" | awk -F/ 'NF{print $1; exit}')"
-if [[ -n "${old_release_folder}" ]]; then
-  PRIOR_RELEASE_URL="${RELEASE_ROOT}/${old_release_folder}"
-  echo "đŸ—‘ī¸ Deleting old release folder: ${PRIOR_RELEASE_URL}"
-  svn rm "${svn_flags[@]}" -m "Remove previous release ${old_release_folder}" "${PRIOR_RELEASE_URL}"
-  echo "✅ Deleted old release folder"
-else
-  echo "â„šī¸ No existing release subfolder found under ${RELEASE_ROOT}"
-fi
-
-DEV_VERSION_URL="$DEV_ROOT/${RELEASE_VERSION}"
-RELEASE_VERSION_URL="$RELEASE_ROOT/${RELEASE_VERSION}"
-
-if ! svn_exists "${DEV_VERSION_URL}"; then
-  echo "❌ ERROR: dev folder for ${RELEASE_VERSION} does not exist at: ${DEV_VERSION_URL}" >&2
-  exit 2
-fi
-
-if svn_exists "${RELEASE_VERSION_URL}"; then
-  echo "❌ ERROR: release folder for ${RELEASE_VERSION} already exists at: ${RELEASE_VERSION_URL}" >&2
-  exit 3
-fi
-
-echo "🚀 Promoting ${DEV_VERSION_URL} -> ${RELEASE_VERSION_URL}"
-svn mv "${svn_flags[@]}" -m "Promote Apache Grails ${RELEASE_VERSION} from dev to release" "${DEV_VERSION_URL}" "${RELEASE_VERSION_URL}"
-echo "✅ Promoted"
diff --git a/.github/scripts/releaseJarFiles.sh b/.github/scripts/releaseJarFiles.sh
deleted file mode 100755
index 4e781e0..0000000
--- a/.github/scripts/releaseJarFiles.sh
+++ /dev/null
@@ -1,142 +0,0 @@
-#!/bin/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
-#
-#    https://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.
-#
-
-# ./releaseJarFiles.sh <staging repo description> <username>
-
-set -euo pipefail
-
-if [[ $# -ne 2 ]]; then
-  echo "Usage: $0 <staging repo description> <username>" >&2
-  exit 1
-fi
-
-NEXUS_URL="https://repository.apache.org"
-STAGING_DESCRIPTION="$1"
-NEXUS_USER="$2"
-read -r -s -p "Password: " NEXUS_PASS
-echo
-
-if [[ -z "${STAGING_DESCRIPTION}" ]]; then
-  echo "ERROR: Staging Description must not be empty." >&2
-  exit 1
-fi
-if [[ -z "${NEXUS_USER}" ]]; then
-  echo "ERROR: Username must not be empty." >&2
-  exit 1
-fi
-if [[ -z "${NEXUS_PASS}" ]]; then
-  echo "ERROR: Password must not be empty." >&2
-  exit 1
-fi
-
-nexusApi() {
-  local request_method="$1"; shift
-  local path="$1"; shift
-  curl -fsS -u "${NEXUS_USER}:${NEXUS_PASS}" \
-    -H 'Accept: application/json' \
-    -H 'Content-Type: application/json' \
-    -X "${request_method}" "${NEXUS_URL}/service/local/${path}" "$@"
-}
-
-wait_for_promotion() {
-  local repoId="$1"
-  local timeout_s="${2:-600}"   # default 10 minutes
-  local interval_s="${3:-3}"
-  local started
-  started="$(date +%s)"
-
-  echo "Waiting for release promotion to complete (timeout ${timeout_s}s)â€Ļ"
-
-  while :; do
-    # 1) If any ERROR appears in activity, fail fast
-    act="$(nexusApi GET "/staging/repository/${repoId}/activity" || true)"
-    if [[ -n "$act" ]]; then
-      err_count="$(jq -r '[.. | objects? | select(has("severity")) | select(.severity=="ERROR")] | length' <<<"$act" 2>/dev/null || echo 0)"
-      if [[ "$err_count" != "0" ]]; then
-        echo "ERROR: Staging activity contains failure(s). Aborting." >&2
-        # Optionally dump recent relevant lines:
-        jq -r '.. | objects? | select(has("severity")) | "\(.severity): \(.name // "event") - \(.message // "")"' <<<"$act" || true
-        return 1
-      fi
-    fi
-
-    # 2) Check transitioning flag — when false after promote, action is done
-    trans="$(nexusApi GET '/staging/profile_repositories' \
-      | jq -r --arg r "$repoId" '.data[]? | select(.repositoryId==$r) | .transitioning' 2>/dev/null || echo "true")"
-
-    if [[ "$trans" == "false" ]]; then
-      # sanity: make sure we actually saw some "release/promote" activity; otherwise keep waiting a bit
-      if [[ -n "$act" ]]; then
-        # did we see any promote/release-ish step?
-        saw_promote="$(jq -r '
-          [ .. | objects? | .name? // empty | ascii_downcase
-            | select(test("release|promote|finish")) ] | length' <<<"$act" 2>/dev/null || echo 0)"
-        if [[ "$saw_promote" -gt 0 ]]; then
-          echo "Promotion appears complete."
-          return 0
-        fi
-      fi
-    fi
-
-    # timeout?
-    now="$(date +%s)"
-    if (( now - started >= timeout_s )); then
-      echo "ERROR: Timed out waiting for promotion to complete." >&2
-      # Show a short summary to aid debugging
-      if [[ -n "$act" ]]; then
-        echo "--- Recent activity snapshot ---"
-        jq -r '.. | objects? | select(has("severity") or has("name")) | "\(.severity // "")\t\(.name // "")\t\(.message // "")"' <<<"$act" | tail -n 20 || true
-      fi
-      return 1
-    fi
-
-    sleep "$interval_s"
-  done
-}
-
-repos_json="$(nexusApi GET '/staging/profile_repositories')"
-repoId="$(jq -r --arg d "${STAGING_DESCRIPTION}" '.data[] | select(.description==$d) | .repositoryId' <<<"${repos_json}")"
-profileId="$(jq -r --arg d "${STAGING_DESCRIPTION}" '.data[] | select(.description==$d) | .profileId' <<<"${repos_json}")"
-state="$(jq -r --arg d "${STAGING_DESCRIPTION}" '.data[] | select(.description==$d) | .type' <<<"${repos_json}")"
-
-if [[ -z "${repoId}" || -z "${profileId}" ]]; then
-  echo "ERROR: No staged repository found with description: ${STAGING_DESCRIPTION}" >&2
-  exit 2
-fi
-echo "Found staged repo: ${repoId} (profile: ${profileId}, state: ${state})"
-if [[ "${state}" == "open" ]]; then
-  echo "ERROR: Staged Repo is not closed: ${STAGING_DESCRIPTION}" >&2
-  exit 3
-fi
-
-if [[ "${state}" == "closed" ]]; then
-  echo "Promoting (release) ${repoId}â€Ļ"
-  nexusApi POST "/staging/profiles/${profileId}/promote" \
-  --data "$(jq -n --arg r "${repoId}" --arg d "${STAGING_DESCRIPTION}" '{data:{stagedRepositoryId:$r,description:$d}}')"
-fi
-
-wait_for_promotion "$repoId" 600 3
-
-echo "Dropping staging repository ${repoId}â€Ļ"
-nexusApi POST "/staging/profiles/${profileId}/drop" \
-  --data "$(jq -n --arg r "$repoId" --arg d "${STAGING_DESCRIPTION}" '{data:{stagedRepositoryId:$r,description:$d}}')"
-
-echo "Done. Released ${repoId}."
\ No newline at end of file
diff --git a/.github/vote_templates/announce.txt b/.github/vote_templates/announce.txt
deleted file mode 100644
index cb621a8..0000000
--- a/.github/vote_templates/announce.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-The Apache Grails community is pleased to announce the release of ${PROJECT_NAME} ${VERSION}.
-
-${PROJECT_DESC}
-
-More information can be found here: https://apache.github.io/${REPO_NAME}/${VERSION}/guide
-
-The release notes are available here:
-https://github.com/${REPO_SLUG}/releases/tag/${TAG}
-
-Apache Grails website: https://grails.apache.org/
-
-Download Links: https://grails.apache.org/download.html
-
-Grails Resources:
-- ${PROJECT_NAME} GitHub repo: https://github.com/${REPO_SLUG}
-- Issues: https://github.com/${REPO_SLUG}/issues
-- Mailing lists: https://grails.apache.org/community.html
-
-Happy Coding,
-The Apache Grails Team
diff --git a/.github/vote_templates/staged.txt b/.github/vote_templates/staged.txt
deleted file mode 100644
index ca37a8e..0000000
--- a/.github/vote_templates/staged.txt
+++ /dev/null
@@ -1,35 +0,0 @@
-Hi Everyone,
-
-I am happy to start the VOTE thread for an ${PROJECT_NAME} release of version ${VERSION}!
-
-Release notes for the release are here:
-https://github.com/${REPO_SLUG}/releases/tag/${TAG}
-
-The tag for this release is:
-https://github.com/${REPO_SLUG}/releases/tag/${TAG}
-Tag commit id: ${SHA}
-
-The artifacts to be voted on are located as follows (r${DIST_SVN_REVISION}):
-Source release: https://dist.apache.org/repos/dist/dev/grails/${SVN_FOLDER}/${VERSION}/sources
-
-Release artifacts are signed with a key from the following file:
-https://dist.apache.org/repos/dist/release/grails/KEYS
-
-Please vote on releasing this package as: ${PROJECT_NAME} ${VERSION}.
-
-Reminder on ASF release approval requirements for PMC members:
-https://www.apache.org/legal/release-policy.html#release-approval
-
-Hints on validating checksums/signatures (but replace md5sum with sha512sum):
-https://www.apache.org/info/verification.html
-
-The vote is open for a minimum of 72 hours and passes if a majority of at least
-three +1 PMC votes are cast.
-
-[ ] +1 Release ${PROJECT_NAME} ${VERSION}
-[ ]  0 I don't have a strong opinion about this, but I assume it's ok
-[ ] -1 Do not release ${PROJECT_NAME} ${VERSION} because...
-
-Here is my vote:
-
-+1 (binding)
diff --git a/.github/vote_templates/vote_succeeded.txt b/.github/vote_templates/vote_succeeded.txt
deleted file mode 100644
index 4cf55c9..0000000
--- a/.github/vote_templates/vote_succeeded.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-The vote has passed with <X> +1 binding votes and <Y> +1 additional votes.
-
-<IF NEW EMAIL>
-Vote thread: <VOTE THREAD PERMALINK>
-</IF NEW EMAIL>
-
-I'll proceed with the release and announce it shortly.
-
-Thanks to everyone who participated in the vote!
-
-Regards
-<NAME>
\ No newline at end of file
diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml
deleted file mode 100644
index aad525c..0000000
--- a/.github/workflows/gradle.yml
+++ /dev/null
@@ -1,81 +0,0 @@
-# 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
-#
-#     https://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.
-
-name: "Java CI"
-on:
-  push:
-    branches:
-      - '[3-9]+.[0-9]+.x'
-  pull_request:
-    branches:
-      - '[3-9]+.[0-9]+.x'
-  workflow_dispatch:
-permissions:
-  packages: read
-jobs:
-  test_project:
-    name: "Test Project"
-    if: github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch'
-    runs-on: ubuntu-24.04
-    steps:
-      - name: "đŸ“Ĩ Checkout repository"
-        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
-      - name: "â˜•ī¸ Setup JDK"
-        uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0
-        with:
-          java-version: 17
-          distribution: liberica
-      - name: "🐘 Setup Gradle"
-        uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0
-        with:
-          cache-provider: basic # 'basic' uses the MIT-licensed, open-source cache provider; the default 'enhanced' provider (v6+) is proprietary (Gradle commercial Terms of Use)
-          develocity-access-key: ${{ secrets.GRAILS_DEVELOCITY_ACCESS_KEY }}
-      - name: "đŸƒâ€â™‚ī¸ Run Tests"
-        run: ./gradlew check --continue
-  publish_snapshot:
-    name: "Build Project and Publish Snapshot"
-    runs-on: ubuntu-24.04
-    if: (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && github.repository_owner == 'apache'
-    permissions:
-      contents: write
-    steps:
-      - name: "đŸ“Ĩ Checkout repository"
-        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
-      - name: "â˜•ī¸ Setup JDK"
-        uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0
-        with:
-          java-version: 17
-          distribution: liberica
-      - name: "🐘 Setup Gradle"
-        uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0
-        with:
-          cache-provider: basic # 'basic' uses the MIT-licensed, open-source cache provider; the default 'enhanced' provider (v6+) is proprietary (Gradle commercial Terms of Use)
-          develocity-access-key: ${{ secrets.GRAILS_DEVELOCITY_ACCESS_KEY }}
-      - name: "📤 Publish Snapshot artifacts"
-        env:
-          GITHUB_MAVEN_PASSWORD: ${{ secrets.GITHUB_TOKEN }}
-          GRAILS_PUBLISH_RELEASE: 'false'
-          MAVEN_PUBLISH_USERNAME: ${{ secrets.NEXUS_USER }}
-          MAVEN_PUBLISH_PASSWORD: ${{ secrets.NEXUS_PW }}
-          MAVEN_PUBLISH_URL: ${{ secrets.GRAILS_NEXUS_PUBLISH_SNAPSHOT_URL }}
-        run: ./gradlew --no-build-cache publish
-      - name: "🔨 Generate Snapshot Documentation"
-        run: ./gradlew docs
-      - name: "🚀 Publish to Github Pages"
-        uses: apache/grails-github-actions/deploy-github-pages@asf
-        env:
-          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-          GRADLE_PUBLISH_RELEASE: 'false'
-          SOURCE_FOLDER: build/docs
diff --git a/.github/workflows/rat.yml b/.github/workflows/rat.yml
deleted file mode 100644
index b7a5b3b..0000000
--- a/.github/workflows/rat.yml
+++ /dev/null
@@ -1,60 +0,0 @@
-# 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
-#
-#     https://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.
-
-name: RAT Report
-on:
-  push:
-    branches:
-      - '[3-9]+.[0-9]+.x'
-      - license-audit
-  pull_request:
-    branches:
-      - '[3-9]+.[0-9]+.x'
-      - license-audit
-  workflow_dispatch:
-# queue jobs and only allow 1 run per branch due to the likelihood of hitting GitHub resource limits
-concurrency:
-  group: ${{ github.workflow }}-${{ github.ref }}
-  cancel-in-progress: false
-jobs:
-  rat-audit:
-    runs-on: ubuntu-24.04
-    steps:
-      - name: "đŸ“Ĩ Checkout repository"
-        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
-      - name: "â˜•ī¸ Setup JDK"
-        uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0
-        with:
-          distribution: liberica
-          java-version: 17
-      - name: "🐘 Setup Gradle"
-        uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0
-        with:
-          cache-provider: basic # 'basic' uses the MIT-licensed, open-source cache provider; the default 'enhanced' provider (v6+) is proprietary (Gradle commercial Terms of Use)
-          develocity-access-key: ${{ secrets.GRAILS_DEVELOCITY_ACCESS_KEY }}
-      - name: "🧐 Apache License - Release Audit Tool"
-        run: ./gradlew rat
-      - name: "📤 Upload RAT HTML report"
-        if: always()
-        uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
-        with:
-          name: rat-report
-          path: build/reports/rat/index.html
-      - name: "đŸ—žī¸ Publish RAT report in Job Summary"
-        if: always()
-        run: |
-          echo "## 📋 Apache RAT Report" >> $GITHUB_STEP_SUMMARY
-          # inject raw HTML (it will render as HTML in the summary)
-          sed -n '/<body[^>]*>/,/<\/body>/ { /<h3>Archives:<\/h3>/,/<\/body>/d; /<body[^>]*>/d; /<\/body>/d; s/^[[:space:]]*//; p; }' build/reports/rat/index.html >> $GITHUB_STEP_SUMMARY
\ No newline at end of file
diff --git a/.github/workflows/release-abort.yml b/.github/workflows/release-abort.yml
deleted file mode 100644
index 6a063c5..0000000
--- a/.github/workflows/release-abort.yml
+++ /dev/null
@@ -1,130 +0,0 @@
-# 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
-#
-#     https://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.
-
-name: "Release - Abort Release"
-on:
-  workflow_dispatch:
-    inputs:
-      release_tag:
-        description: 'Release tag (e.g., v7.0.0-M5)'
-        required: true
-        type: string
-permissions:
-  contents: write
-  actions: write
-jobs:
-  abort:
-    name: "Abort Release"
-    runs-on: ubuntu-latest
-    steps:
-      - name: "Output Agent IP" # in the event RAO blocks this agent, this can be used to debug it
-        run: curl -s https://api.ipify.org
-      - name: "Setup SVN and Tools"
-        run: sudo apt-get install -y subversion subversion-tools tree
-      - name: "Extract repository name"
-        id: extract_repository_name
-        run: |
-          echo "repository_name=${GITHUB_REPOSITORY##*/}" >> $GITHUB_OUTPUT
-      - name: "Extract release version"
-        id: release_version
-        run: |
-          version="${{ github.event.inputs.release_tag }}"
-          version="${version#v}"
-          echo "Extracted version: $version"
-          echo "value=${version}" >> $GITHUB_OUTPUT
-      - name: "Drop staging repository from Nexus"
-        continue-on-error: true
-        env:
-          NEXUS_STAGE_DEPLOYER_USER: ${{ secrets.NEXUS_STAGE_DEPLOYER_USER }}
-          NEXUS_STAGE_DEPLOYER_PW: ${{ secrets.NEXUS_STAGE_DEPLOYER_PW }}
-        run: |
-          export REPO_DESCRIPTION="${{ steps.extract_repository_name.outputs.repository_name }}:${{ steps.release_version.outputs.value }}"
-          export STAGING_REPOSITORY_ID=$(curl -s -u "$NEXUS_STAGE_DEPLOYER_USER:$NEXUS_STAGE_DEPLOYER_PW" -H "Accept: application/json" \
-            "https://repository.apache.org/service/local/staging/profile_repositories/${{ secrets.STAGING_PROFILE_ID }}" |
-            jq -r '.data[] | select(.description=="'"$REPO_DESCRIPTION"'") | .repositoryId')
-          
-          test -n "$STAGING_REPOSITORY_ID" || { echo "No repo with that description"; exit 1; }
-          
-          response=$(curl -s --request POST -u "$NEXUS_STAGE_DEPLOYER_USER:$NEXUS_STAGE_DEPLOYER_PW" \
-            --url https://repository.apache.org/service/local/staging/bulk/drop \
-            --header 'Content-Type: application/json' \
-            --header 'Accept: application/json' \
-            --header 'User-Agent: Grails Github Actions' \
-            --data '{ "data" : {"stagedRepositoryIds":["'"$STAGING_REPOSITORY_ID"'"], "description":"Drop '"$STAGING_REPOSITORY_ID"'." } }')
-
-          if [ ! -z "$response" ]; then
-              echo "Error while dropping staged repository $STAGING_REPOSITORY_ID : $response."
-              exit 1
-          else
-              echo "Successfully dropped repository $STAGING_REPOSITORY_ID."
-          fi
-      - name: "Remove Staged Artifacts"
-        continue-on-error: true
-        env:
-          SVN_USERNAME: ${{ secrets.SVC_DIST_GRAILS_USERNAME }}
-          SVN_PASSWORD: ${{ secrets.SVC_DIST_GRAILS_PASSWORD }}
-        run: |
-          export VERSION="${{ steps.release_version.outputs.value }}"
-          svnmucc --username "$SVN_USERNAME" --password "$SVN_PASSWORD" --non-interactive \
-                      -m "Remove grails dev version $VERSION" \
-                      rm "https://dist.apache.org/repos/dist/dev/grails/quartz/$VERSION"
-      - name: "Cancel GitHub Actions"
-        continue-on-error: true
-        env:
-          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-          OWNER: ${{ github.repository_owner }}
-          REPO: ${{ steps.extract_repository_name.outputs.repository_name }}
-        run: |
-          for status in queued in_progress; do
-            curl -s -H "Authorization: Bearer $GITHUB_TOKEN" \
-                 -H "Accept: application/vnd.github+json" \
-                 "https://api.github.com/repos/$OWNER/$REPO/actions/runs?event=release&status=$status&per_page=100" |
-            jq -r '.workflow_runs[].id'
-          done > run-ids.txt
-          
-          while read run_id; do
-            echo "cancelling $run_id"
-            curl -s -X POST \
-            -H "Authorization: Bearer $GITHUB_TOKEN" \
-            -H "Accept: application/vnd.github+json" \
-            "https://api.github.com/repos/$OWNER/$REPO/actions/runs/$run_id/cancel"
-          done < run-ids.txt
-          rm -f run-ids.txt || true
-      - name: "Remove GitHub Release & Tag"
-        env:
-          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-          TAG: ${{ github.event.inputs.release_tag }}
-          OWNER: ${{ github.repository_owner }}
-          REPO: ${{ steps.extract_repository_name.outputs.repository_name }}
-        run: |
-          set -euo pipefail
-
-          if release_json="$(gh api -H 'Accept: application/vnd.github+json' \
-                                  "/repos/$OWNER/$REPO/releases/tags/$TAG" 2>/dev/null)"; then
-              if [ "$(jq -r '.prerelease' <<<"$release_json")" != "true" ]; then
-                  echo "❌ Release $TAG exists but is *not* marked as a pre-release. Aborting."
-                  exit 1
-              fi
-
-              release_id="$(jq -r '.id' <<<"$release_json")"
-              echo "Deleting pre-release $release_id linked to tag $TAG"
-              gh api -X DELETE "/repos/$OWNER/$REPO/releases/$release_id"
-          else
-              echo "No GitHub release found for tag $TAG – skipping release deletion"
-          fi
-          
-          ref="tags/$TAG"
-          echo "Deleting git ref $ref"
-          gh api -X DELETE "/repos/$OWNER/$REPO/git/refs/$ref" || echo "Tag $TAG already absent"
\ No newline at end of file
diff --git a/.github/workflows/release-notes.yml b/.github/workflows/release-notes.yml
deleted file mode 100644
index fcacc19..0000000
--- a/.github/workflows/release-notes.yml
+++ /dev/null
@@ -1,38 +0,0 @@
-# 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
-#
-#     https://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.
-
-name: "Release Drafter"
-on:
-  issues:
-    types: [closed,reopened]
-  push:
-    branches:
-      - '[3-9]+.[0-9]+.x'
-  pull_request:
-    types: [opened, reopened, synchronize]
-  pull_request_target:
-    types: [opened, reopened, synchronize]
-  workflow_dispatch:
-jobs:
-  update_release_draft:
-    permissions:
-      contents: read # limit to read access
-    runs-on: ubuntu-latest
-    steps:
-      - name: "📝 Update Release Draft"
-        uses: release-drafter/release-drafter@e1247478eabc9f6d9cf5ec2b3547469b0e1d2767 # v7.3.1
-        continue-on-error: true # this pull_request-triggered run only has contents:read; the draft is created/updated by the pull_request_target run
-        env:
-          GITHUB_TOKEN: ${{ secrets.GRAILS_GH_TOKEN }}
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
deleted file mode 100644
index ded1658..0000000
--- a/.github/workflows/release.yml
+++ /dev/null
@@ -1,495 +0,0 @@
-# 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
-#
-#     https://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.
-
-name: "Release"
-on:
-  release:
-    types: [published]
-permissions: {}
-env:
-  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-  GRAILS_PUBLISH_RELEASE: true
-  JAVA_DISTRIBUTION: liberica
-  JAVA_VERSION: 17.0.17 # this must be a specific version for reproducible builds, keep it synced with .sdkmanrc
-  PROJECT_DESC: >
-    The Apache Grails Quartz Plugin brings production-grade scheduling
-    to Apache Grails applications adding support for Grails-style job
-    classes with cron and interval schedules.
-  PROJECT_NAME: Apache Grails Quartz Plugin
-  REPO_NAME: ${{ github.event.repository.name }}
-  REPO_SLUG: ${{ github.repository }}
-  SVN_FOLDER: quartz
-  TAG: ${{ github.event.release.tag_name }}
-  VERSION: will be computed in each job
-jobs:
-  publish:
-    name: "Stage Jar Files"
-    permissions:
-      contents: write # to stage distributions to the GitHub release page
-      issues: write # to modify milestones
-    runs-on: ubuntu-24.04
-    steps:
-      - name: "🌐 Output Agent IP" # in the event RAO blocks this agent, this can be used to debug it
-        run: curl -s https://api.ipify.org
-      - name: "📝 Establish release version"
-        run: echo "VERSION=${TAG#v}" >> "$GITHUB_ENV"
-      - name: "đŸ“Ĩ Checkout repository"
-        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
-        with:
-          ref: ${{ env.TAG }}
-          token: ${{ secrets.GITHUB_TOKEN }} # This should not be needed as ${{ github.token }} is the default, but there have been issues with it.
-      - name: "📅 Store common build date" # to ensure a reproducible build
-        run: echo "SOURCE_DATE_EPOCH=$(git log -1 --pretty=%ct)" >> "$GITHUB_ENV"
-      - name: "📅 Ensure source files use common date"
-        run: find . -depth \( -type f -o -type d \) -exec touch -d "@${SOURCE_DATE_EPOCH}" {} +
-      - name: "🔐 Set up GPG"
-        run: |
-          echo "${{ secrets.GRAILS_GPG_KEY }}" | gpg --batch --import
-          gpg --list-keys
-        env:
-          GPG_KEY_ID: ${{ secrets.GPG_KEY_ID }}
-      - name: "â˜•ī¸ Setup JDK"
-        uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0
-        with:
-          distribution: ${{ env.JAVA_DISTRIBUTION }}
-          java-version: ${{ env.JAVA_VERSION }}
-      - name: "🐘 Setup Gradle"
-        uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0
-        with:
-          cache-provider: basic # 'basic' uses the MIT-licensed, open-source cache provider; the default 'enhanced' provider (v6+) is proprietary (Gradle commercial Terms of Use)
-          develocity-access-key: ${{ secrets.GRAILS_DEVELOCITY_ACCESS_KEY }}
-      - name: "âš™ī¸ Run pre-release"
-        uses: apache/grails-github-actions/pre-release@asf
-        env:
-          RELEASE_VERSION: ${{ env.VERSION }}
-      - name: "✨ Create Staging Repository"
-        env:
-          NEXUS_PUBLISH_USERNAME: ${{ secrets.NEXUS_STAGE_DEPLOYER_USER }}
-          NEXUS_PUBLISH_PASSWORD: ${{ secrets.NEXUS_STAGE_DEPLOYER_PW }}
-          NEXUS_PUBLISH_URL: ${{ vars.STAGING_URL }}
-          NEXUS_PUBLISH_STAGING_PROFILE_ID: ${{ secrets.STAGING_PROFILE_ID }}
-          NEXUS_PUBLISH_DESCRIPTION: '${{ env.REPO_NAME }}:${{ env.VERSION }}'
-          SIGNING_KEY: ${{ secrets.GPG_KEY_ID }}
-        run: ./gradlew initializeSonatypeStagingRepository
-      - name: "📤 Publish to Staging Repository"
-        env:
-          NEXUS_PUBLISH_USERNAME: ${{ secrets.NEXUS_STAGE_DEPLOYER_USER }}
-          NEXUS_PUBLISH_PASSWORD: ${{ secrets.NEXUS_STAGE_DEPLOYER_PW }}
-          NEXUS_PUBLISH_URL: ${{ vars.STAGING_URL }}
-          NEXUS_PUBLISH_STAGING_PROFILE_ID: ${{ secrets.STAGING_PROFILE_ID }}
-          NEXUS_PUBLISH_DESCRIPTION: '${{ env.REPO_NAME }}:${{ env.VERSION }}'
-          SIGNING_KEY: ${{ secrets.GPG_KEY_ID }}
-        run: >
-          ./gradlew findSonatypeStagingRepository 
-          publishToSonatype 
-          aggregateChecksums
-          aggregatePublishedArtifacts
-          -x initializeSonatypeStagingRepository
-      - name: "✅ Close Staging Repository"
-        env:
-          NEXUS_PUBLISH_USERNAME: ${{ secrets.NEXUS_STAGE_DEPLOYER_USER }}
-          NEXUS_PUBLISH_PASSWORD: ${{ secrets.NEXUS_STAGE_DEPLOYER_PW }}
-          NEXUS_PUBLISH_URL: ${{ vars.STAGING_URL }}
-          NEXUS_PUBLISH_STAGING_PROFILE_ID: ${{ secrets.STAGING_PROFILE_ID }}
-          NEXUS_PUBLISH_DESCRIPTION: '${{ env.REPO_NAME }}:${{ env.VERSION }}'
-          SIGNING_KEY: ${{ secrets.GPG_KEY_ID }}
-        run: >
-          ./gradlew findSonatypeStagingRepository 
-          closeSonatypeStagingRepository
-          -x initializeSonatypeStagingRepository
-      - name: "📅 Generate build date file"
-        run: echo "$SOURCE_DATE_EPOCH" >> build/BUILD_DATE.txt
-      - name: "📤 Upload build date, checksums and published artifacts files"
-        uses: softprops/action-gh-release@b4309332981a82ec1c5618f44dd2e27cc8bfbfda # v3.0.0
-        with:
-          tag_name: ${{ env.TAG }}
-          files: |
-            build/BUILD_DATE.txt
-            build/CHECKSUMS.txt
-            build/PUBLISHED_ARTIFACTS.txt
-  source:
-    # to ensure we never publish any build artifacts, run the source distribution as a separate build workflow
-    name: "Create Source Distribution"
-    needs: publish
-    permissions:
-      contents: write
-    runs-on: ubuntu-24.04
-    steps:
-      - name: "📝 Establish release version"
-        run: echo "VERSION=${TAG#v}" >> "$GITHUB_ENV"
-      - name: "đŸ“Ĩ Checkout repository"
-        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
-        with:
-          path: ${{ env.REPO_NAME }}
-          ref: ${{ env.TAG }}
-          token: ${{ secrets.GITHUB_TOKEN }} # This should not be needed as ${{ github.token }} is the default, but there have been issues with it.
-      - name: "đŸ—‘ī¸ Remove unnecessary files"
-        working-directory: ${{ env.REPO_NAME }}
-        run: |
-          rm -f gradle/wrapper/gradle-wrapper.jar
-          rm -f gradle/wrapper/gradle-wrapper.properties
-          rm -f gradlew
-          rm -f gradlew.bat
-          rm -f .asf.yaml
-      - name: "đŸ“Ĩ Download CHECKSUMS.txt and rename to CHECKSUMS"
-        working-directory: ${{ env.REPO_NAME }}
-        env:
-          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-        run: |
-          release_url=$(gh release view "$TAG" --json assets --repo "$REPO_SLUG" --jq '.assets[] | select(.name == "CHECKSUMS.txt") | .url')
-          curl -f -L -H "Authorization: token $GH_TOKEN" -o CHECKSUMS "$release_url"
-      - name: "đŸ“Ĩ Download PUBLISHED_ARTIFACTS.txt and rename to PUBLISHED_ARTIFACTS"
-        working-directory: ${{ env.REPO_NAME }}
-        env:
-          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-        run: |
-          release_url=$(gh release view "$TAG" --json assets --repo "$REPO_SLUG" --jq '.assets[] | select(.name == "PUBLISHED_ARTIFACTS.txt") | .url')
-          curl -f -L -H "Authorization: token $GH_TOKEN" -o PUBLISHED_ARTIFACTS "$release_url"
-      - name: "đŸ“Ĩ Download BUILD_DATE.txt and rename to BUILD_DATE"
-        working-directory: ${{ env.REPO_NAME }}
-        env:
-          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-        run: |
-          release_url=$(gh release view "$TAG" --json assets --repo "$REPO_SLUG" --jq '.assets[] | select(.name == "BUILD_DATE.txt") | .url')
-          curl -f -L -H "Authorization: token $GH_TOKEN" -o BUILD_DATE "$release_url"
-      - name: "📅 Ensure source files use common date"
-        run: |
-          SOURCE_DATE_EPOCH=$(cat ${REPO_NAME}/BUILD_DATE)
-          find . -depth \( -type f -o -type d \) -exec touch -d "@${SOURCE_DATE_EPOCH}" {} +
-      - name: "đŸ“Ļ Create source distribution ZIP"
-        run: |
-          zip -r \
-          "apache-${REPO_NAME}-${VERSION}-src.zip" \
-          "$REPO_NAME" \
-          -x "${REPO_NAME}/.git/*" \
-          -x "${REPO_NAME}/.github/*"
-      - name: "🔐 Set up GPG"
-        run: |
-          echo "${{ secrets.GRAILS_GPG_KEY }}" | gpg --batch --import
-          gpg --list-keys
-        env:
-          GPG_KEY_ID: ${{ secrets.GPG_KEY_ID }}
-      - name: "🔏 Sign source distribution ZIP"
-        env:
-          GPG_KEY_ID: ${{ secrets.GPG_KEY_ID }}
-        run: |
-          gpg \
-          --default-key "$GPG_KEY_ID" \
-          --batch \
-          --yes \
-          --pinentry-mode loopback \
-          --armor \
-          --detach-sign "apache-${REPO_NAME}-${VERSION}-src.zip"
-      - name: "đŸ“Ļ Create source distribution checksum"
-        run: |
-          sha512sum "./apache-${REPO_NAME}-${VERSION}-src.zip" \
-          > "apache-${REPO_NAME}-${VERSION}-src.zip.sha512"
-          cat "./apache-${REPO_NAME}-${VERSION}-src.zip.sha512"
-      - name: "🚀 Upload ZIP and Signature to GitHub Release"
-        uses: softprops/action-gh-release@b4309332981a82ec1c5618f44dd2e27cc8bfbfda # v3.0.0
-        with:
-          tag_name: ${{ env.TAG }}
-          files: |
-            apache-${{ env.REPO_NAME }}-${{ env.VERSION }}-src.zip
-            apache-${{ env.REPO_NAME }}-${{ env.VERSION }}-src.zip.sha512
-            apache-${{ env.REPO_NAME }}-${{ env.VERSION }}-src.zip.asc
-      - name: "đŸ—‘ī¸ Remove CHECKSUMS.txt asset from release"
-        env:
-          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-        run: |
-          set -e
-          gh release delete-asset \
-          "$TAG" \
-          CHECKSUMS.txt \
-          --repo "$REPO_SLUG" \
-          --yes
-      - name: "đŸ—‘ī¸ Remove BUILD_DATE.txt asset from release"
-        env:
-          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-        run: |
-          set -e
-          gh release delete-asset \
-          "$TAG" \
-          BUILD_DATE.txt \
-          --repo "$REPO_SLUG" \
-          --yes
-      - name: "đŸ—‘ī¸ Remove PUBLISHED_ARTIFACTS.txt asset from release"
-        env:
-          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-        run: |
-          set -e
-          gh release delete-asset \
-          "$TAG" \
-          PUBLISHED_ARTIFACTS.txt \
-          --repo "$REPO_SLUG" \
-          --yes
-  upload:
-    name: "Upload Source Distribution"
-    needs: [ publish, source ]
-    runs-on: ubuntu-24.04
-    permissions:
-      contents: write
-    env:
-      SVN_USERNAME: ${{ secrets.SVC_DIST_GRAILS_USERNAME }}
-      SVN_PASSWORD: ${{ secrets.SVC_DIST_GRAILS_PASSWORD }}
-    steps:
-      - name: "📝 Establish release version"
-        run: echo "VERSION=${TAG#v}" >> "$GITHUB_ENV"
-      - name: "âš™ī¸ Setup SVN and Tools"
-        run: sudo apt-get install -y subversion subversion-tools tree gettext-base
-      - name: "👀 Ensure grails dev folder exists"
-        run: |
-          set -e
-          if svn ls https://dist.apache.org/repos/dist/dev/grails --username "$SVN_USERNAME" --password "$SVN_PASSWORD" --non-interactive; then
-            echo "Dev Folder [grails] already exists — skipping creation"
-          else
-            echo "Dev Folder [grails] does not exist, creating"
-            svnmucc --username "$SVN_USERNAME" --password "$SVN_PASSWORD" --non-interactive \
-              mkdir https://dist.apache.org/repos/dist/dev/grails \
-              -m "Create 'grails' dev folder"
-          fi
-      - name: "👀 Ensure grails ${{ env.SVN_FOLDER }} folder exists"
-        run: |
-          set -e
-          if svn ls "https://dist.apache.org/repos/dist/dev/grails/${SVN_FOLDER}" --username "$SVN_USERNAME" --password "$SVN_PASSWORD" --non-interactive; then
-            echo "Dev Folder [grails/${SVN_FOLDER}] already exists — skipping creation"
-          else
-            echo "Dev Folder [grails/${SVN_FOLDER}] does not exist, creating"
-            svnmucc --username "$SVN_USERNAME" --password "$SVN_PASSWORD" --non-interactive \
-              mkdir "https://dist.apache.org/repos/dist/dev/grails/${SVN_FOLDER}" \
-              -m "Create 'grails ${SVN_FOLDER}' dev folder"
-          fi
-      - name: "đŸ“Ĩ Checkout dev repo"
-        run: |
-          svn checkout --username "$SVN_USERNAME" --password "$SVN_PASSWORD" --non-interactive "https://dist.apache.org/repos/dist/dev/grails/${SVN_FOLDER}" dev-repo
-      - name: "đŸ—‘ī¸ Remove existing dev version"
-        run: |
-          cd dev-repo
-          if [ -d "$VERSION" ]; then
-            svn delete "$VERSION"
-            svn commit -m "Remove grails ${SVN_FOLDER} dev version ${VERSION}" --username "$SVN_USERNAME" --password "$SVN_PASSWORD" --non-interactive
-          else
-            echo "No existing dev version ${VERSION} to remove"
-          fi
-      - name: "đŸ“Ĩ Fetch source distributions"
-        run: |
-          cd dev-repo
-          mkdir -p "${VERSION}/sources"          
-          cd "${VERSION}/sources"
-          curl -f -LO "https://github.com/${REPO_SLUG}/releases/download/${TAG}/apache-${REPO_NAME}-${VERSION}-src.zip"
-          curl -f -LO "https://github.com/${REPO_SLUG}/releases/download/${TAG}/apache-${REPO_NAME}-${VERSION}-src.zip.sha512"
-          curl -f -LO "https://github.com/${REPO_SLUG}/releases/download/${TAG}/apache-${REPO_NAME}-${VERSION}-src.zip.asc"
-          echo "Downloaded the following files:"
-          ls -l
-      - name: "🚀 Upload distributions"
-        run: |
-          cd dev-repo
-          echo "Adding the following files to SVN:"
-          tree
-          svn add "$VERSION" --force
-          svn commit -m "Upload ${PROJECT_NAME} distribution files for ${VERSION}" --username "$SVN_USERNAME" --password "$SVN_PASSWORD" --non-interactive
-          pwd
-      - name: "💾 Store Distribution SVN revision in a file"
-        run: |
-          cd dev-repo
-          svn info "$VERSION" > "DIST_SVN_REVISION.txt"
-      - name: "📤 Upload the Distribution SVN revision file"
-        uses: softprops/action-gh-release@b4309332981a82ec1c5618f44dd2e27cc8bfbfda # v3.0.0
-        with:
-          tag_name: ${{ env.TAG }}
-          files: dev-repo/DIST_SVN_REVISION.txt
-      - name: "đŸ“Ĩ Checkout repository"
-        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
-        with:
-          path: ${{ env.REPO_NAME }}
-          ref: ${{ env.TAG }}
-      - name: "📝 Fetch new sha for the release tag after pre-prelease commit"
-        env:
-          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-        run: |
-          ref_json=$(gh api "repos/${REPO_SLUG}/git/ref/tags/${TAG}")
-          type=$(jq -r '.object.type' <<<"$ref_json")
-          sha=$(jq -r '.object.sha'  <<<"$ref_json")
-          if [ "$type" = "tag" ]; then
-            sha=$(gh api "repos/${REPO_SLUG}/git/tags/${sha}" --jq '.object.sha')
-          fi
-          echo "Found sha: $sha"
-          echo "SHA=${sha}" >> "$GITHUB_ENV"
-      - name: "📧 Print Grails Vote Email"
-        run: |
-          export DIST_SVN_REVISION=$(awk '/Last Changed Rev:/ {print $4}' dev-repo/DIST_SVN_REVISION.txt)
-          
-          echo "::group::Grails PMC Vote Email"
-          echo ""
-          echo "TO:"
-          echo "*************************************************"
-          echo "dev@grails.apache.org"
-          echo "*************************************************"
-          echo ""
-          echo "Subject:"
-          echo "*************************************************"
-          echo "[VOTE] Release ${PROJECT_NAME} ${VERSION}"
-          echo "*************************************************"
-          echo "Body:"
-          echo "*************************************************"
-          cat ${REPO_NAME}/.github/vote_templates/staged.txt | envsubst
-          echo "*************************************************"          
-          echo "::endgroup::"
-  release:
-    environment: release
-    name: 'VOTE SUCCEEDED - Release Artifacts'
-    needs: [ publish, source, upload ]
-    runs-on: ubuntu-24.04
-    steps:
-      - name: "📝 Establish release version"
-        run: echo "VERSION=${TAG#v}" >> "$GITHUB_ENV"
-      - name: "đŸ“Ĩ Checkout repository"
-        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
-        with:
-          ref: ${{ env.TAG }}
-      - name: "âš™ī¸ Setup SVN and Tools"
-        run: sudo apt-get install -y subversion subversion-tools tree gettext-base
-      - name: "đŸ—ŗ MANUAL - Confirm Grails PMC Vote succeeded"
-        run: |
-          echo "::group::Manual Confirmation"
-          echo "🔎 Make sure that the vote confirmation on dev@grails.apache.org completed successfully before proceeding."
-          echo "::endgroup::"
-      - name: "âœ‰ī¸ MANUAL - Send Vote Result Email"
-        run: |
-          echo "::group::Manual Vote Result Email"
-          echo ""
-          echo "Send a new email or reply to the original vote email by changing the subject."
-          echo ""
-          echo "TO:"
-          echo "*************************************************"
-          echo "dev@grails.apache.org"
-          echo "*************************************************"
-          echo ""
-          echo "Subject:"
-          echo "*************************************************"
-          echo "[RESULT][VOTE] ${PROJECT_NAME} ${VERSION}"
-          echo "*************************************************"
-          echo ""
-          echo "Body:"
-          echo "*************************************************"
-          cat .github/vote_templates/vote_succeeded.txt | envsubst
-          echo "*************************************************"
-          echo "::endgroup::"
-      - name: "🚀 MANUAL - Release JAR files"
-        run: |
-          echo "::group::Manual Jar Promotion"
-          echo "Run .github/scripts/releaseJarFiles.sh ${TAG} ${REPO_NAME}:${VERSION} <ASF_USER>"
-          echo "::endgroup::"
-      - name: "🚀 MANUAL - Release distribution artifacts"
-        run: |
-          echo "::group::Manual ASF Artifact Promotion"
-          echo "Run .github/scripts/releaseDistributions.sh ${TAG} ${SVN_FOLDER} <ASF_USER>"
-          echo "::endgroup::"
-      - name: "✅ MANUAL - Update ASF Reporter"
-        run: |
-          echo "::group::Manual ASF Reporter Update"
-          TODAY=$(date +"%Y-%m-%d")
-          echo "Check email from no-reply@reporter.apache.org & update https://reporter.apache.org/addrelease.html?grails to add ${SVN_FOLDER^^}-${VERSION} as complete as of ${TODAY}"
-          echo "::endgroup::"
-  docs:
-    environment: docs
-    name: "VOTE SUCCEEDED - Publish Documentation"
-    needs: [ publish, source, upload, release ]
-    runs-on: ubuntu-24.04
-    permissions:
-      contents: write # required for gradle.properties revert
-      issues: write # required for milestone closing
-    steps:
-      - name: "📝 Establish release version"
-        run: echo "VERSION=${TAG#v}" >> "$GITHUB_ENV"
-      - name: "đŸ“Ĩ Checkout repository"
-        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
-        with:
-          ref: ${{ env.TAG }}
-          token: ${{ secrets.GITHUB_TOKEN }}
-      - name: "📅 Ensure Common Build Date" # to ensure a reproducible build
-        run: echo "SOURCE_DATE_EPOCH=$(git log -1 --pretty=%ct)" >> "$GITHUB_ENV"
-      - name: "â˜•ī¸ Setup JDK"
-        uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0
-        with:
-          distribution: ${{ env.JAVA_DISTRIBUTION }}
-          java-version: ${{ env.JAVA_VERSION }}
-      - name: "🐘 Setup Gradle"
-        uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0
-        with:
-          cache-provider: basic # 'basic' uses the MIT-licensed, open-source cache provider; the default 'enhanced' provider (v6+) is proprietary (Gradle commercial Terms of Use)
-          develocity-access-key: ${{ secrets.GRAILS_DEVELOCITY_ACCESS_KEY }}
-      - name: "🔨 Build Documentation"
-        run: ./gradlew docs
-      - name: "🚀 Publish to Github Pages"
-        uses: apache/grails-github-actions/deploy-github-pages@asf
-        env:
-          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-          GRADLE_PUBLISH_RELEASE: 'true'
-          SOURCE_FOLDER: build/docs
-  close:
-    name: "VOTE SUCCEEDED - Close Release"
-    environment: release
-    needs: [ publish, source, upload, release, docs ]
-    runs-on: ubuntu-24.04
-    permissions:
-      contents: write # required for gradle.properties revert
-      issues: write # required for milestone closing
-      pull-requests: write # to open PR
-      actions: write # in case there are pending changes to release.yml in the target branch
-    steps:
-      - name: "📝 Establish release version"
-        run: echo "VERSION=${TAG#v}" >> "$GITHUB_ENV"
-      - name: "đŸ“Ĩ Checkout repository"
-        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
-        with:
-          ref: ${{ env.TAG }}
-          token: ${{ secrets.GITHUB_TOKEN }}
-      - name: "â˜•ī¸ Setup JDK"
-        uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0
-        with:
-          distribution: ${{ env.JAVA_DISTRIBUTION }}
-          java-version: ${{ env.JAVA_VERSION }}
-      - name: "🐘 Setup Gradle"
-        uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0
-        with:
-          cache-provider: basic # 'basic' uses the MIT-licensed, open-source cache provider; the default 'enhanced' provider (v6+) is proprietary (Gradle commercial Terms of Use)
-          develocity-access-key: ${{ secrets.GRAILS_DEVELOCITY_ACCESS_KEY }}
-      - name: "âš™ī¸ Run post-release"
-        uses: apache/grails-github-actions/post-release@asf
-      - name: '🌎 MANUAL - Create Blog Post'
-        run: |
-          echo "::group::Blog Post Creation - MANUAL"
-          echo "Publish a blog post on https://grails.apache.org/blog/ about the new release [${VERSION}] using the repo https://github.com/apache/grails-static-website"
-          echo "::endgroup::"
-      - name: "📧 MANUAL - Send Announcement Email"
-        run: |
-          echo "::group::Announcement Email"
-          echo ""
-          echo "TO:"
-          echo "*************************************************"
-          echo "announce@apache.org, dev@grails.apache.org, users@grails.apache.org"
-          echo "*************************************************"
-          echo ""
-          echo "Subject:"
-          echo "*************************************************"
-          echo "[ANNOUNCE] ${PROJECT_NAME} ${VERSION}"
-          echo "*************************************************"
-          echo ""
-          echo "Body:"
-          echo "*************************************************"
-          cat .github/vote_templates/announce.txt | envsubst
-          echo "*************************************************"
-          echo "::endgroup::"
diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 771469b..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,10 +0,0 @@
-.gradle/
-.idea/
-build/
-classes/
-.project
-.settings
-.classpath
-*.iml
-*.ipr 
-*.iws
diff --git a/.sdkmanrc b/.sdkmanrc
deleted file mode 100644
index 60ac5bf..0000000
--- a/.sdkmanrc
+++ /dev/null
@@ -1,3 +0,0 @@
-# Enable auto-env through the sdkman_auto_env config - https://sdkman.io/usage#env
-java=17.0.17-librca
-gradle=8.14.4
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
deleted file mode 100644
index 779f7ce..0000000
--- a/CODE_OF_CONDUCT.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# Code of Conduct
-
-Apache Grails follows the ASF [Code of Conduct](https://www.apache.org/foundation/policies/conduct).
-
-If you observe behavior that violates those rules, please follow the
-[ASF reporting guidelines](https://www.apache.org/foundation/policies/conduct#reporting-guidelines).
diff --git a/HEADER b/HEADER
deleted file mode 100644
index 4f38e29..0000000
--- a/HEADER
+++ /dev/null
@@ -1,16 +0,0 @@
- 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
-
-   https://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.
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index 261eeb9..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,201 +0,0 @@
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/NOTICE b/NOTICE
deleted file mode 100644
index c36ecac..0000000
--- a/NOTICE
+++ /dev/null
@@ -1,5 +0,0 @@
-Apache Grails Quartz Plugin
-Copyright 2007-2025 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
\ No newline at end of file
diff --git a/README.md b/README.md
index ffe9630..887cbda 100644
--- a/README.md
+++ b/README.md
@@ -1,138 +1,4 @@
-<!--
-SPDX-License-Identifier: Apache-2.0
+Grails Quartz
+======================
 
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    https://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.
--->
-
-# Grails Quartz Plugin
-
-[![Maven Central](https://img.shields.io/maven-central/v/org.apache.grails/grails-quartz.svg?label=Maven%20Central)](https://central.sonatype.com/artifact/org.apache.grails/grails-quartz)
-[![Java CI](https://github.com/apache/grails-quartz/actions/workflows/gradle.yml/badge.svg?event=push)](https://github.com/apache/grails-quartz/actions/workflows/gradle.yml)
-
-## Documentation
-
-[Latest documentation](https://apache.github.io/grails-quartz/latest/) and [snapshots](https://apache.github.io/grails-quartz/snapshot/) are available.
-
-## Branches
-
-| Branch | Grails Version |
-|--------|----------------|
-| 1.x    | 2              |
-| 2.0.x  | 3-5            |
-| 3.0.x  | 6              |
-| 4.0.x  | 7              |
-
-## Using
-### Quick start
-To start using Quartz plugin just simply add
-`implementation 'org.apache.grails:grails-quartz:{version}'` in your `build.gradle`.
-
->[!NOTE]
-> __2.0.13 for Grails 3.3.*__\
-> Properties changed to `static` from `def`.\
-> For example: `def concurrent` will be now `static concurrent`.
-
-### Scheduling Jobs
-To create a new job run the `grails create-job` command and enter the name of the job. Grails will create a new job and place it in the `grails-app/jobs` directory:
-```groovy
-package com.mycompany.myapp
-
-class MyJob {
-
-    static triggers = {
-        simple repeatInterval: 1000
-    }
-
-    void execute() {
-        println 'Job run!'
-    }
-}
-```
-
-The above example will call the `execute()` method every second.
-
-### Scheduling configuration syntax
-
-Currently, the plugin supports three types of [triggers](http://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/tutorial-lesson-02.html):
-* **simple trigger** — executes once per defined interval (ex. "every 10 seconds");
-* **cron trigger** — executes a job with cron expression (ex. "at 8:00 am every Monday through Friday");
-* **custom trigger** — your implementation of [Trigger](http://www.quartz-scheduler.org/api/2.3.0/org/quartz/Trigger.html) interface.
-
-Multiple triggers per job are allowed.
-```groovy
-class MyJob {
-
-    static triggers = {
-        simple name: 'simpleTrigger', startDelay: 10000, repeatInterval: 30000, repeatCount: 10
-        cron name: 'cronTrigger', startDelay: 10000, cronExpression: '0/6 * 15 * * ?'
-        custom name: 'customTrigger', triggerClass: MyTriggerClass, myParam: myValue, myAnotherParam: myAnotherValue
-    }
-
-    void execute() {
-        println 'Job run!'
-    }
-}
-```
-
-With this configuration, job will be executed 11 times with 30 seconds interval with first run in 10 seconds after scheduler startup (simple trigger), also it'll be executed each 6 second during 15th hour (15:00:00, 15:00:06, 15:00:12, ... — this configured by cron trigger) and also it'll be executed each time your custom trigger will fire.
-
-Three kinds of triggers are supported with the following parameters. The name field must be unique:
-* `simple`:
-  * `name` — the name that identifies the trigger;
-  * `startDelay` — delay (in milliseconds) between scheduler startup and first job's execution;
-  * `repeatInterval` — timeout (in milliseconds) between consecutive job's executions;
-  * `repeatCount` — trigger will fire job execution `(1 + repeatCount)` times and stop after that (specify `0`  here to have one-shot job or `-1` to repeat job executions indefinitely);
-* `cron`:
-  * `name` — the name that identifies the trigger;
-  * `startDelay` — delay (in milliseconds) between scheduler startup and first job's execution;
-  * `cronExpression` — [cron expression](http://www.quartz-scheduler.org/api/2.3.0/org/quartz/CronExpression.html)
-* `custom`:
-  * `triggerClass`  — your class which implements [CalendarIntervalTriggerImpl](http://www.quartz-scheduler.org/api/2.3.0/org/quartz/impl/triggers/CalendarIntervalTriggerImpl.html) impl;
-  * any params needed by your trigger.
-
-### Configuration plugin syntax
-
-You can add the following properties to control persistence or not persistence:
-* `quartz.pluginEnabled` - defaults to `true`, can disable plugin for test cases etc.
-* `quartz.jdbcStore` - `true` to enable database store, `false` to use RamStore (default: `true`)
-* `quartz.autoStartup` - delays jobs until after bootstrap startup phase (default: `false`)
-* `quartz.jdbcStoreDataSource` - jdbc data source alternate name
-* `quartz.waitForJobsToCompleteOnShutdown` - wait for jobs to complete on shutdown (default: `true`)
-* `quartz.exposeSchedulerInRepository` - expose Schedule in repository
-* `quartz.scheduler.instanceName` - name of the scheduler to avoid conflicts between apps
-* `quartz.purgeQuartzTablesOnStartup` - when jdbcStore set to `true` and this is `true`, clears out all quartz tables on startup
-
-## Building from Source
-
-To build this project from source, you'll need Gradle installed.\
-First, to bootstrap Gradle Wrapper with the correct version in the project directory, run the following commands:
-```console
-cd gradle-bootstrap
-gradle
-cd -
-```
-
-After bootstrapping Gradle Wrapper, you can build and run the tests with the command:
-```console
-./gradlew build
-```
-
-To run only run the build and skip the tests, run:
-```console
-./gradlew build -PskipTests
-``` 
-
-Then publish the jar files to `mavenLocal` for usage:
-```console
-./gradlew publishToMavenLocal
-```
+This project has been relocated to [grails-core](https://github.com/apache/grails-core) as of Grails 7.  Going forward versions for this plugin will match the Grails version and be included in the Grails Bom.
diff --git a/build.gradle b/build.gradle
deleted file mode 100644
index 31e059a..0000000
--- a/build.gradle
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- *  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
- *
- *    https://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.
- */
-
-import java.time.Instant
-import java.time.ZoneOffset
-import java.time.format.DateTimeFormatter
-
-plugins {
-    id 'java-library'
-    id 'org.apache.grails.gradle.grails-plugin'
-}
-
-version =  projectVersion
-group = 'org.apache.grails'
-
-def buildInstant = java.util.Optional.ofNullable(System.getenv('SOURCE_DATE_EPOCH'))
-        .filter(s -> !s.isEmpty())
-        .map(Long::parseLong)
-        .map(Instant::ofEpochSecond)
-        .orElseGet(Instant::now) as Instant
-ext {
-    formattedBuildDate = DateTimeFormatter.ISO_INSTANT.format(buildInstant)
-    buildDate = buildInstant.atZone(ZoneOffset.UTC) // for reproducible builds
-    isCiBuild = System.getenv().containsKey('CI')
-}
-
-repositories {
-    mavenCentral()
-    maven { url = 'https://repo.grails.org/grails/restricted' }
-    maven {
-        url = 'https://repository.apache.org/content/groups/snapshots'
-        content {
-            includeVersionByRegex('org[.]apache[.]grails.*', '.*', '.*SNAPSHOT')
-        }
-    }
-    maven {
-        url = 'https://repository.apache.org/content/groups/staging'
-        content {
-            includeGroupByRegex('org[.]apache[.]grails.*')
-        }
-    }
-}
-
-grails {
-    springDependencyManagement = false
-}
-
-dependencies {
-
-    implementation platform("org.apache.grails:grails-bom:$grailsVersion")
-
-    api "org.quartz-scheduler:quartz", {
-        // api: AdaptableJobFactory, InterruptableJob, JobExecutionContext, JobExecutionException,
-        //      UnableToInterruptJobException, TriggerFiredBundle,
-        // runtime: @DisallowConcurrentExecution(runtime), @PersistJobDataAfterExecution(runtime)
-    }
-
-    compileOnly 'org.apache.grails:grails-dependencies-starter-web'
-
-    testImplementation 'org.apache.grails:grails-dependencies-test'
-}
-
-apply {
-    from layout.projectDirectory.file('gradle/docs-config.gradle')
-    from layout.projectDirectory.file('gradle/java-config.gradle')
-    from layout.projectDirectory.file('gradle/publish-config.gradle')
-    from layout.projectDirectory.file('gradle/test-config.gradle')
-    from layout.projectDirectory.file('gradle/rat-root-config.gradle')
-    from layout.projectDirectory.file('gradle/reproducible-config.gradle')
-}
\ No newline at end of file
diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle
deleted file mode 100644
index 0f2a474..0000000
--- a/buildSrc/build.gradle
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- *  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
- *
- *    https://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.
- */
-
-plugins {
-    id 'groovy-gradle-plugin'
-}
-
-Properties versions = new Properties()
-file('../gradle.properties').withInputStream {
-    versions.load(it)
-}
-
-repositories {
-    mavenCentral()
-    maven { url = 'https://repo.grails.org/grails/restricted' }
-    maven {
-        url = 'https://repository.apache.org/content/groups/snapshots'
-        content {
-            includeVersionByRegex('org[.]apache[.]grails.*', '.*', '.*SNAPSHOT')
-        }
-    }
-    maven {
-        url = 'https://repository.apache.org/content/groups/staging'
-        content {
-            includeGroupByRegex('org[.]apache[.]grails.*')
-        }
-    }
-}
-
-dependencies {
-    implementation platform("org.apache.grails:grails-bom:${versions.get('grailsVersion')}")
-    implementation "org.asciidoctor:asciidoctor-gradle-jvm:${versions.get('asciidoctorGradlePluginVersion')}"
-    implementation 'org.apache.grails:grails-gradle-plugins'
-    implementation 'org.apache.grails.gradle:grails-publish'
-    implementation "org.nosphere.apache.rat:org.nosphere.apache.rat.gradle.plugin:${versions.get('ratVersion')}"
-    implementation "org.gradle.crypto.checksum:org.gradle.crypto.checksum.gradle.plugin:${versions.get('gradleCryptoChecksumVersion')}"
-}
diff --git a/etc/bin/Dockerfile b/etc/bin/Dockerfile
deleted file mode 100644
index 35d1855..0000000
--- a/etc/bin/Dockerfile
+++ /dev/null
@@ -1,45 +0,0 @@
-# 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.
-
-# for testing in a container that is similar to the github action linux build environment
-# run this from the root of the project
-# `docker build -t grails:testing -f etc/bin/Dockerfile . && docker run -it --rm -v $(pwd):/home/groovy/project grails:testing bash`
-FROM bellsoft/liberica-openjdk-debian:17.0.17
-
-USER root
-RUN apt-get update && apt-get install -y curl unzip coreutils libdigest-sha-perl gpg vim sudo psmisc locales groovy rsync
-
-RUN sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \
-    dpkg-reconfigure --frontend=noninteractive locales && \
-    update-locale LANG=en_US.UTF-8
-
-RUN useradd --system --create-home --home-dir /home/groovy groovy
-RUN usermod -s /bin/bash -g root -G sudo groovy
-RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
-USER groovy
-
-WORKDIR /home/groovy
-RUN mkdir -p /home/groovy/scripts/etc/bin && mkdir -p /home/groovy/scripts/gradle/wrapper && mkdir -p /home/groovy/grails-verify && mkdir -p /home/groovy/project
-ADD --chown=groovy etc/bin /home/groovy/scripts/etc/bin
-ADD --chown=groovy gradlew /home/groovy/scripts
-ADD --chown=groovy gradle/wrapper/gradle-wrapper.jar /home/groovy/scripts/gradle/wrapper
-ADD --chown=groovy gradle/wrapper/gradle-wrapper.properties /home/groovy/scripts/gradle/wrapper
-ENV PATH="/home/groovy/scripts:/home/groovy/scripts/etc/bin:$PATH"
-ENV CI=true
-ENV LANG=C.UTF-8
-ENV LC_ALL=en_US.UTF-8
-ENV LC_CTYPE=en_US.UTF-8
-
-CMD ["/bin/bash", "-ec", "while :; do echo '.'; sleep 1000 ; done"]
\ No newline at end of file
diff --git a/etc/bin/download-release-artifacts.sh b/etc/bin/download-release-artifacts.sh
deleted file mode 100755
index 2379fee..0000000
--- a/etc/bin/download-release-artifacts.sh
+++ /dev/null
@@ -1,76 +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
-#
-#    https://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.
-#
-set -e
-
-PROJECT_NAME='grails-quartz'
-REPO_NAME='apache/grails-quartz'
-SVN_FOLDER='quartz'
-RELEASE_TAG=$1
-DOWNLOAD_LOCATION="${2:-downloads}"
-
-if [ -z "${RELEASE_TAG}" ]; then
-  echo "Usage: $0 [release-tag] <optional download location>"
-  exit 1
-fi
-
-echo "Downloading files to ${DOWNLOAD_LOCATION}"
-mkdir -p "${DOWNLOAD_LOCATION}"
-
-VERSION=${RELEASE_TAG#v}
-
-# Source distro
-echo "Downloading GitHub Release files"
-curl -f -L -o "${DOWNLOAD_LOCATION}/github-apache-${PROJECT_NAME}-${VERSION}-src.zip" "https://github.com/${REPO_NAME}/releases/download/${RELEASE_TAG}/apache-${PROJECT_NAME}-${VERSION}-src.zip"
-curl -f -L -o "${DOWNLOAD_LOCATION}/github-apache-${PROJECT_NAME}-${VERSION}-src.zip.asc" "https://github.com/${REPO_NAME}/releases/download/${RELEASE_TAG}/apache-${PROJECT_NAME}-${VERSION}-src.zip.asc"
-curl -f -L -o "${DOWNLOAD_LOCATION}/github-apache-${PROJECT_NAME}-${VERSION}-src.zip.sha512" "https://github.com/${REPO_NAME}/releases/download/${RELEASE_TAG}/apache-${PROJECT_NAME}-${VERSION}-src.zip.sha512"
-
-echo "Downloading SVN Release files"
-curl -f -L -o "${DOWNLOAD_LOCATION}/apache-${PROJECT_NAME}-${VERSION}-src.zip" "https://dist.apache.org/repos/dist/dev/grails/${SVN_FOLDER}/${VERSION}/sources/apache-${PROJECT_NAME}-${VERSION}-src.zip"
-curl -f -L -o "${DOWNLOAD_LOCATION}/apache-${PROJECT_NAME}-${VERSION}-src.zip.asc" "https://dist.apache.org/repos/dist/dev/grails/${SVN_FOLDER}/${VERSION}/sources/apache-${PROJECT_NAME}-${VERSION}-src.zip.asc"
-curl -f -L -o "${DOWNLOAD_LOCATION}/apache-${PROJECT_NAME}-${VERSION}-src.zip.sha512" "https://dist.apache.org/repos/dist/dev/grails/${SVN_FOLDER}/${VERSION}/sources/apache-${PROJECT_NAME}-${VERSION}-src.zip.sha512"
-
-echo "Comparing SVN vs GitHub Release files"
-set +e
-
-cmp -s "${DOWNLOAD_LOCATION}/apache-${PROJECT_NAME}-${VERSION}-src.zip.asc" "${DOWNLOAD_LOCATION}/github-apache-${PROJECT_NAME}-${VERSION}-src.zip.asc"
-if [ $? -eq 0 ]; then
-  echo "✅ Identical SVN vs GitHub Upload for apache-${PROJECT_NAME}-${VERSION}-src.zip.asc"
-else
-  echo "❌Different SVN vs GitHub Upload for apache-${PROJECT_NAME}-${VERSION}-src.zip.asc"
-  exit 1
-fi
-
-set +e
-cmp -s "${DOWNLOAD_LOCATION}/apache-${PROJECT_NAME}-${VERSION}-src.zip.sha512" "${DOWNLOAD_LOCATION}/github-apache-${PROJECT_NAME}-${VERSION}-src.zip.sha512"
-if [ $? -eq 0 ]; then
-  echo "✅ Identical SVN vs GitHub Upload for apache-${PROJECT_NAME}-${VERSION}-src.zip.sha512"
-else
-  echo "❌ Different SVN vs GitHub Upload for apache-${PROJECT_NAME}-${VERSION}-src.zip.sha512"
-  exit 1
-fi
-
-ZIP_SVN_CHECKSUM=$(shasum -a 512 "${DOWNLOAD_LOCATION}/apache-${PROJECT_NAME}-${VERSION}-src.zip" | awk '{print $1}')
-ZIP_GITHUB_CHECKSUM=$(shasum -a 512 "${DOWNLOAD_LOCATION}/github-apache-${PROJECT_NAME}-${VERSION}-src.zip" | awk '{print $1}')
-if [ "${ZIP_SVN_CHECKSUM}" != "${ZIP_GITHUB_CHECKSUM}" ]; then
-    echo "❌ Checksum mismatch between SVN and GitHub source zip files"
-    exit 1
-else
-    echo "✅ Checksum matches between SVN and GitHub source zip files"
-fi
\ No newline at end of file
diff --git a/etc/bin/extract-build-artifact.sh b/etc/bin/extract-build-artifact.sh
deleted file mode 100755
index ea67448..0000000
--- a/etc/bin/extract-build-artifact.sh
+++ /dev/null
@@ -1,56 +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
-#
-#    https://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.
-#
-set -e
-
-ARTIFACT_NAME=$1
-
-if [ -z "${ARTIFACT_NAME}" ]; then
-  echo "Usage: $0 <artifact-name> <optional location>"
-  exit 1
-fi
-
-SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
-EXTRACT_LOCATION="${2:-${SCRIPT_DIR}/results}"
-
-echo "Looking for build artifact ${ARTIFACT_NAME} in ${EXTRACT_LOCATION}"
-
-if [ -z "${EXTRACT_LOCATION}/first/${ARTIFACT_NAME}" ]; then
-    echo "❌ First Artifact Not found: ${ARTIFACT_NAME} could not be found under ${EXTRACT_LOCATION}/first/${ARTIFACT_NAME}"
-    exit 1;
-else
-  echo "     ✅ First Artifact Found @ ${EXTRACT_LOCATION}/first/${ARTIFACT_NAME}"
-fi
-if [ -z "${EXTRACT_LOCATION}/second/${ARTIFACT_NAME}" ]; then
-    echo "❌ Second Artifact Not found: ${ARTIFACT_NAME} could not be found under ${EXTRACT_LOCATION}/second/${ARTIFACT_NAME}"
-    exit 1;
-else
-  echo "     ✅ Second Artifact Found @ ${EXTRACT_LOCATION}/second/${ARTIFACT_NAME}"
-fi
-
-rm -rf "${EXTRACT_LOCATION}/firstArtifact" || true
-rm -rf "${EXTRACT_LOCATION}/secondArtifact" || true
-
-echo "     Extracting ${ARTIFACT_NAME} from first to ${EXTRACT_LOCATION}/firstArtifact"
-unzip -q "${EXTRACT_LOCATION}/first/${ARTIFACT_NAME}" -d "${EXTRACT_LOCATION}/firstArtifact"
-echo "     ✅ First Artifact Extracted"
-
-echo "     Extracting ${ARTIFACT_NAME} from second to ${EXTRACT_LOCATION}/secondArtifact"
-unzip -q "${EXTRACT_LOCATION}/second/${ARTIFACT_NAME}" -d "${EXTRACT_LOCATION}/secondArtifact"
-echo "     ✅ Second Artifact Extracted"
diff --git a/etc/bin/generate-build-artifact-hashes.groovy b/etc/bin/generate-build-artifact-hashes.groovy
deleted file mode 100755
index 43a148f..0000000
--- a/etc/bin/generate-build-artifact-hashes.groovy
+++ /dev/null
@@ -1,84 +0,0 @@
-#!/usr/bin/env groovy
-/*
- *  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
- *
- *    https://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.
- */
-import java.nio.file.*
-import java.security.MessageDigest
-
-// ---------------------------------------------------------------------------
-String sha512(Path file) {
-    MessageDigest md = MessageDigest.getInstance('SHA-512')
-    file.withInputStream { is ->
-        byte[] buf = new byte[8192]
-        for (int r = is.read(buf); r > 0; r = is.read(buf))
-            md.update(buf, 0, r)
-    }
-    md.digest().collect { String.format('%02x', it) }.join()
-}
-
-Path scriptDir = Paths.get(getClass()
-        .protectionDomain
-        .codeSource
-        .location
-        .toURI())
-        .toAbsolutePath()
-        .parent
-
-
-Path root = scriptDir.resolve('..').resolve('..').normalize()
-if(args && args.length > 0) {
-    System.out.println("Finding jars in: ${args[0]}" as String)
-    root = Paths.get(args[0]).toAbsolutePath().normalize()
-}
-
-// ---------------------------------------------------------------------------
-// Decide where to search: project root by default, or user-supplied path
-// (absolute or relative to project root) when an argument is given.
-Path scanRoot
-if (this.args && this.args.length > 0) {
-    Path argPath = Paths.get(this.args[0])
-    scanRoot = argPath.isAbsolute() ? argPath : root.resolve(argPath).normalize()
-    if (!Files.exists(scanRoot)) {
-        System.err.println "❌  Path '${scanRoot}' does not exist."
-        System.exit(1)
-    }
-} else {
-    scanRoot = root
-}
-List<Path> artifacts = []
-Files.walk(scanRoot)
-            .filter {
-                Files.isRegularFile(it) &&
-                        !it.toString().contains("buildSrc") &&
-                        !it.toString().contains("etc") &&
-                        it.toString().endsWith('.jar') &&
-                        it.toString().contains("${File.separator}build${File.separator}libs${File.separator}" as String)
-            }
-            .forEach { artifacts << it }
-
-artifacts.findAll {
-    !it.toString().contains("${File.separator}buildSrc${File.separator}" as String) // build src jars aren't published
-    !it.toString().contains("${File.separator}examples${File.separator}" as String) // test examples aren't published
-}.sort { a, b -> a.toString() <=> b.toString()
-}.collect { Path jar ->
-    String hash = sha512(jar)
-    String relative = root.relativize(jar).toString()
-    "${relative} ${hash}"
-}.sort().each {
-    println it
-}
\ No newline at end of file
diff --git a/etc/bin/reset-verify.sh b/etc/bin/reset-verify.sh
deleted file mode 100755
index 7aba717..0000000
--- a/etc/bin/reset-verify.sh
+++ /dev/null
@@ -1,42 +0,0 @@
-#
-#  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
-#
-#    https://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing,
-#  software distributed under the License is distributed on an
-#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#  KIND, either express or implied.  See the License for the
-#  specific language governing permissions and limitations
-#  under the License.
-#
-PROJECT_NAME='grails-quartz'
-RELEASE_TAG=$1
-DOWNLOAD_LOCATION="${2:-downloads}"
-DOWNLOAD_LOCATION=$(realpath "${DOWNLOAD_LOCATION}")
-
-if [ -z "${RELEASE_TAG}" ]; then
-  echo "Usage: $0 [release-tag] <optional download location>"
-  exit 1
-fi
-
-VERSION=${RELEASE_TAG#v}
-
-SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
-CWD=$(pwd)
-
-cd "${DOWNLOAD_LOCATION}"
-rm *.zip *.asc *.sha512
-cd "${PROJECT_NAME}"
-find . -mindepth 1 -path ./etc -prune -o -exec rm -rf {} +
-cd etc
-find . -mindepth 1 -path ./bin -prune -o -exec rm -rf {} +
-cd bin
-find . -mindepth 1 -path ./results -prune -o -exec rm -rf {} +
-cd "${CWD}"
\ No newline at end of file
diff --git a/etc/bin/test-reproducible-builds.sh b/etc/bin/test-reproducible-builds.sh
deleted file mode 100755
index 0ab1e82..0000000
--- a/etc/bin/test-reproducible-builds.sh
+++ /dev/null
@@ -1,64 +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
-#
-#      https://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing, software
-#  distributed under the License is distributed on an "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  See the License for the specific language governing permissions and
-#  limitations under the License.
-#
-
-# This file assumes the gnu version of coreutils is installed, which is not installed by default on a mac
-set -e
-
-export SOURCE_DATE_EPOCH=$(git log -1 --pretty=%ct)
-
-CWD=$(pwd)
-SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
-cd "${SCRIPT_DIR}/../.."
-
-rm -rf "${SCRIPT_DIR}/results" || true
-mkdir -p "${SCRIPT_DIR}/results"
-
-git clean -xdf --exclude='etc/bin' --exclude='.idea' --exclude='.gradle'
-killall -e java || true
-./gradlew build --rerun-tasks -PskipTests --no-build-cache
-"${SCRIPT_DIR}/generate-build-artifact-hashes.groovy" > "${SCRIPT_DIR}/results/first.txt"
-mkdir -p "${SCRIPT_DIR}/results/first"
-find . -path ./etc -prune -o -type f -path '*/build/libs/*.jar' -print0 | xargs -0 cp --parents -t "${SCRIPT_DIR}/results/first/"
-
-git clean -xdf --exclude='etc/bin' --exclude='.idea' --exclude='.gradle'
-killall -e java || true
-./gradlew build --rerun-tasks -PskipTests --no-build-cache
-"${SCRIPT_DIR}/generate-build-artifact-hashes.groovy" > "${SCRIPT_DIR}/results/second.txt"
-mkdir -p "${SCRIPT_DIR}/results/second"
-find . -path ./etc -prune -o -type f -path '*/build/libs/*.jar' -print0 | xargs -0 cp --parents -t "${SCRIPT_DIR}/results/second/"
-
-cd "${SCRIPT_DIR}/results"
-
-# diff -u first.txt second.txt
-DIFF_RESULTS=$(comm -3 first.txt second.txt | cut -d' ' -f1 | sed 's/^[[:space:]]*//;s/[[:space:]]*$//' | grep -v '^$' | uniq | sort)
-echo "Differing artifacts:"
-echo "$DIFF_RESULTS" > diff.txt
-cat diff.txt
-
-printf '%s\n' "$DIFF_RESULTS" | sed 's|^etc/bin/results/||' > toPurge.txt
-find first -type f -name '*.jar' -print | sed 's|^first/||' | grep -F -x -v -f toPurge.txt |
-  while IFS= read -r f; do
-    rm -f "./first/$f"
-  done
-find second -type f -name '*.jar' -print | sed 's|^second/||' | grep -F -x -v -f toPurge.txt |
-  while IFS= read -r f; do
-    rm -f "./second/$f"
-  done
-rm toPurge.txt
-find . -type d -empty -delete
-cd "$CWD"
diff --git a/etc/bin/verify-jar-artifacts.sh b/etc/bin/verify-jar-artifacts.sh
deleted file mode 100755
index 3789852..0000000
--- a/etc/bin/verify-jar-artifacts.sh
+++ /dev/null
@@ -1,137 +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
-#
-#    https://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.
-#
-
-set -euo pipefail
-
-PROJECT_NAME='grails-quartz'
-RELEASE_TAG=$1
-DOWNLOAD_LOCATION="${2:-downloads}"
-DOWNLOAD_LOCATION=$(realpath "${DOWNLOAD_LOCATION}")
-CWD=$(pwd)
-
-if [ -z "${RELEASE_TAG}" ]; then
-  echo "Usage: $0 [release-tag] <optional download location>"
-  exit 1
-fi
-
-VERSION=${RELEASE_TAG#v}
-
-ARTIFACTS_FILE="${DOWNLOAD_LOCATION}/${PROJECT_NAME}/PUBLISHED_ARTIFACTS"
-CHECKSUMS_FILE="${DOWNLOAD_LOCATION}/${PROJECT_NAME}/CHECKSUMS"
-SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
-
-if [ ! -f "${ARTIFACTS_FILE}" ]; then
-  echo "Required file ${ARTIFACTS_FILE} not found."
-  exit 1
-fi
-
-if [ ! -f "${CHECKSUMS_FILE}" ]; then
-  echo "Required file ${CHECKSUMS_FILE} not found."
-  exit 1
-fi
-
-export GRAILS_GPG_HOME=$(mktemp -d)
-cleanup() {
-  rm -rf "${GRAILS_GPG_HOME}"
-  cd "$CWD"
-}
-trap cleanup EXIT
-error() {
-  echo "❌ JAR Verification failed ❌"
-}
-trap error ERR
-cd "${DOWNLOAD_LOCATION}"
-
-echo "Importing GPG key to independent GPG home ..."
-gpg --homedir "${GRAILS_GPG_HOME}" --import "${DOWNLOAD_LOCATION}/KEYS"
-echo "✅ GPG Key Imported"
-
-REPO_BASE_URL="https://repository.apache.org/content/groups/staging"
-
-# switch to the extracted project source directory
-cd "${PROJECT_NAME}"
-
-# Create a temporary directory to work in
-WORK_DIR='etc/bin/results/first'
-mkdir -p "${WORK_DIR}"
-echo "Using temp dir: ${WORK_DIR}"
-cd "${WORK_DIR}"
-
-# Read each line from ARTIFACTS_FILE
-while IFS= read -r line; do
-  JAR_FILE=$(echo "${line}" | awk '{print $1}')
-  [[ "${JAR_FILE}" != *.jar ]] && continue
-  
-  COORDINATES=$(echo "${line}" | awk '{print $2}')
-
-  GROUP_ID=$(echo "${COORDINATES}" | cut -d: -f1 | tr '.' '/')
-  ARTIFACT_ID=$(echo "${COORDINATES}" | cut -d: -f2)
-  VERSION=$(echo "${COORDINATES}" | cut -d: -f3)
-  CLASSIFIER=$(echo "${COORDINATES}" | cut -d: -f4-)
-
-  if [[ -n "${CLASSIFIER}" ]]; then
-    FILE_NAME="${ARTIFACT_ID}-${VERSION}-${CLASSIFIER}.jar"
-  else
-    FILE_NAME="${ARTIFACT_ID}-${VERSION}.jar"
-  fi
-
-  JAR_URL="${REPO_BASE_URL}/${GROUP_ID}/${ARTIFACT_ID}/${VERSION}/${FILE_NAME}"
-  ASC_URL="${JAR_URL}.asc"
-
-  echo "🔎 Checking artifact: ${FILE_NAME} as ${JAR_FILE}"
-  if [ ! -f "${JAR_FILE}" ]; then
-    echo "... Downloading: ${JAR_URL} to ${JAR_FILE}"
-    curl -sSfL "${JAR_URL}" -o ${JAR_FILE}
-  else
-    echo "... Skipping download, already exists: ${JAR_FILE}"
-  fi
-
- if [ ! -f "${FILE_NAME}.asc" ]; then
-    echo "... Downloading signature: ${ASC_URL}"
-     curl -sSfLO "${ASC_URL}"
-  else
-    echo "... Skipping download, already exists: ${FILE_NAME}.asc"
-  fi
-
-  echo "... Verifying GPG signature..."
-  gpg --homedir "${GRAILS_GPG_HOME}" --verify "${FILE_NAME}.asc" "${JAR_FILE}"
-  echo "✅ Verified GPG signature for ${JAR_FILE}"
-
-  EXPECTED_CHECKSUM=$(grep "^${JAR_FILE} " "${CHECKSUMS_FILE}" | awk '{print $2}' || true)
-  if [ -z "${EXPECTED_CHECKSUM}" ]; then
-    echo "❌ Checksum not found for ${FILE_NAME}"
-    exit 1
-  fi
-
-  echo "... Verifying checksum..."
-  ACTUAL_CHECKSUM=$(shasum -a 512 "${JAR_FILE}" | awk '{print $1}')
-  echo "✅ Verified Checksum for ${JAR_FILE}: ${ACTUAL_CHECKSUM}"
-
-  if [ "${ACTUAL_CHECKSUM}" != "${EXPECTED_CHECKSUM}" ]; then
-    echo "❌ Checksum mismatch for ${JAR_FILE}"
-    echo "Expected: ${EXPECTED_CHECKSUM}"
-    echo "Actual:   ${ACTUAL_CHECKSUM}"
-    exit 1
-  fi
-
-  echo "✅ Verified: ${JAR_FILE}"
-done < "${ARTIFACTS_FILE}"
-
-echo "✅✅✅ All artifacts verified successfully. ✅✅✅"
diff --git a/etc/bin/verify-reproducible.sh b/etc/bin/verify-reproducible.sh
deleted file mode 100755
index 0379f53..0000000
--- a/etc/bin/verify-reproducible.sh
+++ /dev/null
@@ -1,173 +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
-#
-#      https://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing, software
-#  distributed under the License is distributed on an "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  See the License for the specific language governing permissions and
-#  limitations under the License.
-#
-
-# This file assumes the gnu version of coreutils is installed, which is not installed by default on a mac
-set -e
-
-PROJECT_NAME='grails-quartz'
-DOWNLOAD_LOCATION="${1:-downloads}"
-DOWNLOAD_LOCATION=$(realpath "${DOWNLOAD_LOCATION}")
-SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
-
-CWD=$(pwd)
-
-cleanup() {
-  echo "❌ Verification failed. ❌"
-}
-trap cleanup ERR
-
-cd "${DOWNLOAD_LOCATION}/${PROJECT_NAME}"
-echo "Searching under ${DOWNLOAD_LOCATION}"
-
-mkdir -p "${DOWNLOAD_LOCATION}/${PROJECT_NAME}/etc/bin/results"
-if [[ -f "${DOWNLOAD_LOCATION}/${PROJECT_NAME}/CHECKSUMS" ]]; then
-  echo "✅ File 'CHECKSUMS' exists."
-else
-  echo "❌ File 'CHECKSUMS' not found. ${PROJECT_NAME} Source Distributions should have a CHECKSUMS file at the root..."
-  exit 1
-fi
-
-if [[ -f "${DOWNLOAD_LOCATION}/${PROJECT_NAME}/BUILD_DATE" ]]; then
-  echo "✅ File 'BUILD_DATE' exists."
-else
-  echo "❌ File 'BUILD_DATE' not found. ${PROJECT_NAME} Source Distributions should have a BUILD_DATE file at the root..."
-  exit 1
-fi
-export SOURCE_DATE_EPOCH=$(cat "${DOWNLOAD_LOCATION}/${PROJECT_NAME}/BUILD_DATE")
-export TEST_BUILD_REPRODUCIBLE='true'
-
-if [[ -d "${DOWNLOAD_LOCATION}/${PROJECT_NAME}/etc/bin/results/first" ]]; then
-  echo "✅ Directory containing downloaded jar files exists ('first')."
-else
-  echo "❌ Directory 'first' not found. Please place the published jar files under ${DOWNLOAD_LOCATION}/${PROJECT_NAME}/etc/bin/results/first..."
-  exit 1
-fi
-
-killall -e java || true
-./gradlew publishToMavenLocal --rerun-tasks -PskipTests --no-build-cache
-echo "Generating Checksums for Built Jars"
-"${SCRIPT_DIR}/generate-build-artifact-hashes.groovy" "${DOWNLOAD_LOCATION}/${PROJECT_NAME}" > "${DOWNLOAD_LOCATION}/${PROJECT_NAME}/etc/bin/results/second.txt"
-if [ -e "${DOWNLOAD_LOCATION}/${PROJECT_NAME}/etc/bin/results/second.txt" ] && [ ! -s "${DOWNLOAD_LOCATION}/${PROJECT_NAME}/etc/bin/results/second.txt" ]; then
-  echo "❌ Error: Could not find any checksums for built jar files!"
-  exit 1
-fi
-
-echo "Flattening Checksum file"
-## Flatten the jar files since our published artifacts are flat
-tmpfile=$(mktemp)
-while read -r filepath checksum; do
-  printf '%s %s\n' "$(basename "$filepath")" "$checksum"
-done < "${DOWNLOAD_LOCATION}/${PROJECT_NAME}/etc/bin/results/second.txt" > "$tmpfile" && mv "$tmpfile" "${DOWNLOAD_LOCATION}/${PROJECT_NAME}/etc/bin/results/second.txt"
-
-echo "Filtering non-published jars"
-# filter to only published jars to compare against
-cut -d' ' -f1 "${DOWNLOAD_LOCATION}/${PROJECT_NAME}/CHECKSUMS" | grep -Ff - "${DOWNLOAD_LOCATION}/${PROJECT_NAME}/etc/bin/results/second.txt" > "${DOWNLOAD_LOCATION}/${PROJECT_NAME}/etc/bin/results/filtered.txt"
-rm -f "${DOWNLOAD_LOCATION}/${PROJECT_NAME}/etc/bin/results/second.txt"
-mv "${DOWNLOAD_LOCATION}/${PROJECT_NAME}/etc/bin/results/filtered.txt" "${DOWNLOAD_LOCATION}/${PROJECT_NAME}/etc/bin/results/second.txt"
-
-mkdir -p "${DOWNLOAD_LOCATION}/${PROJECT_NAME}/etc/bin/results/second"
-find . -path ./etc -prune -o -type f -path '*/build/libs/*.jar' ! -name "buildSrc.jar" -exec cp -t "${DOWNLOAD_LOCATION}/${PROJECT_NAME}/etc/bin/results/second/" -- {} +
-
-cd "${DOWNLOAD_LOCATION}/${PROJECT_NAME}/etc/bin/results"
-
-echo "Checking for differences in checksums"
-# diff -u CHECKSUMS second.txt
-DIFF_RESULTS=$(comm -3 <(sort ../../../CHECKSUMS) <(sort second.txt) | cut -d' ' -f1 | sed 's/^[[:space:]]*//;s/[[:space:]]*$//' | grep -v '^$' | uniq | sort)
-echo "${DIFF_RESULTS}" > diff.txt
-
-if [ -n "${DIFF_RESULTS}" ]; then
-  echo "${DIFF_RESULTS}" > diff.txt
-else
-  > diff.txt  # Empty the file explicitly
-fi
-
-if [ -s diff.txt ]; then
-  echo "Differences were found, diffing jar files ..."
-  if [[ ! -f "vineflower.jar" ]]; then
-      echo "Downloading Vineflower decompiler..."
-      curl -sL -o "vineflower.jar" https://github.com/Vineflower/vineflower/releases/download/1.11.1/vineflower-1.11.1.jar
-      if [[ $? -ne 0 ]]; then
-          echo "❌ Failed to download vineflower.jar ❌"
-          exit 1
-      fi
-  fi
-
-  while IFS= read -r jar_file; do
-      echo "Checking jar '${jar_file}'..."
-
-      echo "Extracting ${jar_file}"
-      "${SCRIPT_DIR}/extract-build-artifact.sh" "${jar_file}" "${DOWNLOAD_LOCATION}/${PROJECT_NAME}/etc/bin/results"
-      echo "✅ Extracted ${jar_file} to firstArtifact and secondArtifact directories."
-
-      # Check extraction success
-      if [[ ! -d "firstArtifact" || ! -d "secondArtifact" ]]; then
-          echo "❌ Missing extracted artifacts for ${jar_file} ❌"
-          echo "${jar_file}" >> diff_purged.txt
-          continue
-      fi
-
-      rm -rf "firstSource" "secondSource" || true
-      mkdir -p "firstSource" "secondSource"
-
-      echo "Decompiling ${jar_file} class files..."
-      java -jar vineflower.jar firstArtifact firstSource > /dev/null 2>&1
-      java -jar vineflower.jar secondArtifact secondSource > /dev/null 2>&1
-      echo "✅ Decompiled ${jar_file}"
-
-      set +e
-      DIFF_RESULT=$(diff -r -q "firstSource" "secondSource")
-      set -e
-
-      if [[ -z "${DIFF_RESULT}" ]]; then
-          echo "✅ No differences remain for ${jar_file}. Removing from diff.txt."
-      else
-          echo "❌ Differences still found in ${jar_file}."
-          echo "${jar_file}" >> diff_purged.txt
-      fi
-
-  done < diff.txt
-  : > diff_purged.txt  # Ensure the file exists and is empty
-  mv diff_purged.txt diff.txt
-  rm -rf firstArtifact secondArtifact firstSource secondSource || true
-
-  if [ -s diff.txt ]; then
-  echo "❌ Differences Found ❌"
-  cat diff.txt
-  echo "❌ Differences Found ❌"
-  else
-    echo "✅ Differences were resolved via decompilation. ✅"
-    exit 0
-  fi
-else
-  echo "✅ No Differences Found. ✅"
-  exit 0
-fi
-
-printf '%s\n' "${DIFF_RESULTS}" | sed 's|^etc/bin/results/||' > toPurge.txt
-find first -type f -name '*.jar' -print | sed 's|^first/||' | grep -F -x -v -f toPurge.txt |
-  while IFS= read -r f; do
-    rm -f "./first/$f"
-  done
-find second -type f -name '*.jar' -print | sed 's|^second/||' | grep -F -x -v -f toPurge.txt |
-  while IFS= read -r f; do
-    rm -f "./second/$f"
-  done
-rm toPurge.txt
-find . -type d -empty -delete
-cd "$CWD"
-exit 1
\ No newline at end of file
diff --git a/etc/bin/verify-source-distribution.sh b/etc/bin/verify-source-distribution.sh
deleted file mode 100755
index c1e0956..0000000
--- a/etc/bin/verify-source-distribution.sh
+++ /dev/null
@@ -1,92 +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
-#
-#    https://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.
-#
-set -euo pipefail
-
-PROJECT_NAME='grails-quartz'
-RELEASE_TAG=$1
-DOWNLOAD_LOCATION="${2:-downloads}"
-SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
-
-if [ -z "${RELEASE_TAG}" ]; then
-  echo "Usage: $0 [release-tag] <optional download location>"
-  exit 1
-fi
-
-VERSION=${RELEASE_TAG#v}
-
-cd "${DOWNLOAD_LOCATION}"
-ZIP_FILE=$(ls "apache-${PROJECT_NAME}-${VERSION}-src.zip" 2>/dev/null | head -n 1)
-
-if [ -z "${ZIP_FILE}" ]; then
-  echo "Error: Could not find apache-${PROJECT_NAME}-${VERSION}-src.zip in ${DOWNLOAD_LOCATION}"
-  exit 1
-fi
-
-export GRAILS_GPG_HOME=$(mktemp -d)
-cleanup() {
-  rm -rf "${GRAILS_GPG_HOME}"
-}
-trap cleanup EXIT
-
-echo "Verifying checksum..."
-shasum -a 512 -c "apache-${PROJECT_NAME}-${VERSION}-src.zip.sha512"
-echo "✅ Checksum Verified"
-
-echo "Importing GPG key to independent GPG home ..."
-gpg --homedir "${GRAILS_GPG_HOME}" --import "${DOWNLOAD_LOCATION}/KEYS"
-echo "✅ GPG Key Imported"
-
-echo "Verifying GPG signature..."
-gpg --homedir "${GRAILS_GPG_HOME}" --verify "apache-${PROJECT_NAME}-${VERSION}-src.zip.asc" "apache-${PROJECT_NAME}-${VERSION}-src.zip"
-echo "✅ GPG Verified"
-
-SRC_DIR="${PROJECT_NAME}"
-
-if [ -d "${SRC_DIR}" ]; then
-  echo "Previous ${SRC_DIR} directory found, purging"
-  cd "${SRC_DIR}"
-  find . -mindepth 1 -path ./etc -prune -o -exec rm -rf {} +
-  cd etc
-  find . -mindepth 1 -path ./bin -prune -o -exec rm -rf {} +
-  cd bin
-  find . -mindepth 1 -path ./results -prune -o -exec rm -rf {} +
-  cd "${DOWNLOAD_LOCATION}"
-fi
-echo "Extracting zip file..."
-unzip -q "apache-${PROJECT_NAME}-${VERSION}-src.zip"
-
-if [ ! -d "${SRC_DIR}" ]; then
-  echo "Error: Expected extracted folder '${SRC_DIR}' not found."
-  exit 1
-fi
-
-echo "Checking for required files existence..."
-REQUIRED_FILES=("LICENSE" "NOTICE" "README.md" "PUBLISHED_ARTIFACTS" "CHECKSUMS" "BUILD_DATE")
-
-for FILE in "${REQUIRED_FILES[@]}"; do
-  if [ ! -f "${SRC_DIR}/$FILE" ]; then
-    echo "❌ Missing required file: $FILE"
-    exit 1
-  fi
-
-  echo "✅ Found required file: $FILE"
-done
-
-echo "✅ All source distribution checks passed successfully for ${VERSION}."
\ No newline at end of file
diff --git a/etc/bin/verify.sh b/etc/bin/verify.sh
deleted file mode 100755
index ff3b6dd..0000000
--- a/etc/bin/verify.sh
+++ /dev/null
@@ -1,90 +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
-#
-#    https://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.
-#
-set -euo pipefail
-
-PROJECT_NAME='grails-quartz'
-RELEASE_TAG=$1
-DOWNLOAD_LOCATION="${2:-.}"
-DOWNLOAD_LOCATION=$(realpath "${DOWNLOAD_LOCATION}")
-
-if [ -z "${RELEASE_TAG}" ]; then
-  echo "Usage: $0 [release-tag] <optional download location>"
-  exit 1
-fi
-
-SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
-CWD=$(pwd)
-VERSION=${RELEASE_TAG#v}
-
-cleanup() {
-  echo "❌ Verification failed. ❌"
-}
-trap cleanup ERR
-
-cd "${DOWNLOAD_LOCATION}"
-
-echo "Downloading KEYS file ..."
-curl -sSfLO "https://dist.apache.org/repos/dist/release/grails/KEYS"
-echo "✅ KEYS Downloaded"
-
-echo "Downloading Artifacts ..."
-"${SCRIPT_DIR}/download-release-artifacts.sh" "${RELEASE_TAG}" "${DOWNLOAD_LOCATION}"
-echo "✅ Artifacts Downloaded"
-
-echo "Verifying Source Distribution ..."
-"${SCRIPT_DIR}/verify-source-distribution.sh" "${RELEASE_TAG}" "${DOWNLOAD_LOCATION}"
-echo "✅ Source Distribution Verified"
-
-echo "Verifying JAR Artifacts ..."
-"${SCRIPT_DIR}/verify-jar-artifacts.sh" "${RELEASE_TAG}" "${DOWNLOAD_LOCATION}"
-echo "✅ JAR Artifacts Verified"
-
-echo "Using Java at ..."
-which java
-java -version
-
-echo "Bootstrap Gradle ..."
-cd "${DOWNLOAD_LOCATION}/${PROJECT_NAME}/gradle-bootstrap"
-
-if GRADLE_CMD="$(command -v gradlew 2>/dev/null)"; then
-    :   # found the wrapper on PATH
-elif GRADLE_CMD="$(command -v gradle 2>/dev/null)"; then
-    :   # fall back to system-wide Gradle
-else
-    echo "ERROR: Neither gradlew nor gradle found on \$PATH." >&2
-    exit 1
-fi
-${GRADLE_CMD}
-echo "✅ Gradle Bootstrapped"
-
-echo "Applying License Audit ..."
-cd "${DOWNLOAD_LOCATION}/${PROJECT_NAME}"
-./gradlew rat
-echo "✅ RAT passed"
-
-echo "Verifying Reproducible Build ..."
-set +e # because we have known issues here
-"${SCRIPT_DIR}/verify-reproducible.sh" "${DOWNLOAD_LOCATION}"
-set -e
-echo "✅ Reproducible Build Verified"
-
-echo "✅✅✅ Verification finished, see above instructions for remaining manual testing."
-
-cd "${CWD}"
\ No newline at end of file
diff --git a/gradle-bootstrap/build.gradle b/gradle-bootstrap/build.gradle
deleted file mode 100644
index 71cf177..0000000
--- a/gradle-bootstrap/build.gradle
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  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
- *
- *    https://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.
- */
-
-def props = new Properties()
-layout.projectDirectory.file('../.sdkmanrc').asFile.withInputStream {
-    props.load(it)
-}
-
-tasks.withType(Wrapper).configureEach {
-    gradleVersion = props.gradle
-}
-
-defaultTasks 'bootstrap'
-tasks.register('bootstrap') {
-    dependsOn('wrapper')
-    doLast {
-        ant.move(file: "$projectDir/gradlew", todir: "$projectDir/../")
-        ant.move(file: "$projectDir/gradlew.bat", todir: "$projectDir/../")
-        ant.move(file: "$projectDir/gradle/wrapper", todir: "$projectDir/../gradle")
-        ant.chmod(file: "$projectDir/../gradlew", perm: '755')
-        ant.chmod(file: "$projectDir/../gradlew.bat", perm: '755')
-    }
-}
diff --git a/gradle-bootstrap/settings.gradle b/gradle-bootstrap/settings.gradle
deleted file mode 100644
index 16c619f..0000000
--- a/gradle-bootstrap/settings.gradle
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- *  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
- *
- *    https://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.
- */
diff --git a/gradle.properties b/gradle.properties
deleted file mode 100644
index 3c72a6c..0000000
--- a/gradle.properties
+++ /dev/null
@@ -1,33 +0,0 @@
-#
-#  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
-#
-#    https://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.
-#
-projectVersion=4.0.2-SNAPSHOT
-grailsVersion=7.0.7
-javaVersion=17
-
-asciidoctorGradlePluginVersion=4.0.4
-gradleCryptoChecksumVersion=1.4.0
-ratVersion=0.8.1
-
-# This prevents the Grails Gradle Plugin from unnecessarily excluding slf4j-simple in the generated POMs
-# https://github.com/apache/grails-gradle-plugin/issues/222
-slf4jPreventExclusion=true
-
-org.gradle.caching=true
-org.gradle.daemon=true
-org.gradle.parallel=true
diff --git a/gradle/docs-config.gradle b/gradle/docs-config.gradle
deleted file mode 100644
index ab4fc55..0000000
--- a/gradle/docs-config.gradle
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- *  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
- *
- *    https://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.
- */
-
-import org.asciidoctor.gradle.jvm.AsciidoctorTask
-
-apply plugin: 'org.asciidoctor.jvm.convert'
-
-configurations.register('documentation') {
-    canBeConsumed = false
-    canBeResolved = true
-    attributes {
-        attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category, Category.LIBRARY))
-        attribute(Bundling.BUNDLING_ATTRIBUTE, objects.named(Bundling, Bundling.EXTERNAL))
-        attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage, Usage.JAVA_RUNTIME))
-    }
-
-}
-
-dependencies {
-    documentation platform("org.apache.grails:grails-bom:$grailsVersion")
-    documentation 'org.apache.groovy:groovy-ant'
-    documentation 'org.apache.groovy:groovy-groovydoc'
-}
-
-tasks.withType(Groovydoc).configureEach {
-    access = GroovydocAccess.PROTECTED
-    processScripts = false
-    includeMainForScripts = false
-    includeAuthor = false
-    classpath = configurations.documentation
-    groovyClasspath = configurations.documentation
-}
-
-tasks.named('asciidoctor', AsciidoctorTask) {
-    group = 'documentation'
-    description = 'Generates the reference documentation'
-    sourceDir = layout.projectDirectory.dir('src/docs')
-    outputDir = layout.buildDirectory.dir('docs/guide').get().asFile
-    baseDirFollowsSourceDir()
-    jvm {
-        jvmArgs(
-                '--add-opens', 'java.base/sun.nio.ch=ALL-UNNAMED',
-                '--add-opens', 'java.base/java.io=ALL-UNNAMED'
-        )
-    }
-    attributes(
-            copyright            : 'Apache License, Version 2.0',
-            docinfo1             : 'true',
-            doctype              : 'book',
-            encoding             : 'utf-8',
-            icons                : 'font',
-            id                   : name + ':' + version,
-            idprefix             : '',
-            idseparator          : '-',
-            lang                 : 'en',
-            linkattrs            : true,
-            numbered             : '',
-            producer             : 'Asciidoctor',
-            revnumber            : version,
-            setanchors           : true,
-            'source-highlighter' : 'prettify',
-            toc                  : 'left',
-            toc2                 : '',
-            toclevels            : '2'
-    )
-    inputs.dir(sourceDir)
-    outputs.dir(outputDir)
-}
-
-tasks.register('docs') {
-    group = 'documentation'
-    description = 'Generates both API and Guide documentation'
-    dependsOn('groovydoc', 'asciidoctor')
-    def redirectFile = layout.buildDirectory.file('docs/index.html')
-    outputs.file(redirectFile)
-    doLast {
-        redirectFile.get().asFile.text = """\
-            <html lang="en">
-                <head>
-                    <title>Grails Quartz Plugin Documentation</title>
-                    <meta http-equiv="refresh" content="0; url=guide/index.html" />
-                </head>
-                <body>
-                </body>
-            </html>
-        """.stripIndent(12)
-    }
-}
\ No newline at end of file
diff --git a/gradle/java-config.gradle b/gradle/java-config.gradle
deleted file mode 100644
index bb949ff..0000000
--- a/gradle/java-config.gradle
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  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
- *
- *    https://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.
- */
-
-compileJava.options.release = javaVersion.toInteger()
-
-tasks.withType(Javadoc).configureEach {
-    (options as StandardJavadocDocletOptions).noTimestamp(true) // prevent the file header with the date
-    (options as StandardJavadocDocletOptions).bottom("Generated $formattedBuildDate (UTC)")
-}
-
-tasks.withType(GroovyCompile).configureEach {
-    groovyOptions.encoding = 'UTF-8' // encoding needs to be the same since it's different across platforms
-    // Preserve method parameter names in Groovy classes for IDE parameter hints.
-    groovyOptions.parameters = true
-    options.encoding = 'UTF-8' // encoding needs to be the same since it's different across platforms
-    options.fork = true
-    options.forkOptions.jvmArgs = ['-Xms128M', '-Xmx2G']
-}
\ No newline at end of file
diff --git a/gradle/publish-config.gradle b/gradle/publish-config.gradle
deleted file mode 100644
index d5da86a..0000000
--- a/gradle/publish-config.gradle
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- *  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
- *
- *    https://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.
- */
-
-import org.gradle.crypto.checksum.Checksum
-
-apply plugin: 'org.apache.grails.gradle.grails-publish'
-
-grailsPublish {
-    githubSlug = 'apache/grails-quartz'
-    license.name = 'Apache-2.0'
-    title = 'Grails Quartz Plugin'
-    desc = 'This plugin allows your Grails application to schedule jobs to be executed using a specified interval or cron expression.'
-    organization {
-        name = 'Apache Software Foundation'
-        url = 'https://apache.org/'
-    }
-    developers = [
-            burtbeckwith: 'Burt Beckwith',
-            jeffscottbrown: 'Jeff Scott Brown',
-            graemerocher: 'Graeme Rocher',
-            ryanvanderwerf: 'Ryan Vanderwerf',
-            sergeynebolsin: 'Sergey Nebolsin',
-            puneetbehl: 'Puneet Behl',
-            vitaliisamolovskikh: 'Vitalii Samolovskikh'
-    ]
-}
-
-afterEvaluate {
-    if (plugins.hasPlugin('signing') && System.getenv('TEST_BUILD_REPRODUCIBLE')) {
-        logger.lifecycle('Signing is disabled for this build to test build reproducibility.')
-        tasks.withType(Sign).configureEach {
-            enabled = false
-        }
-    }
-    if (plugins.hasPlugin('maven-publish')) {
-        def checksumTask = tasks.register('publishedChecksums', Checksum) {
-            checksumAlgorithm = Checksum.Algorithm.SHA512
-            outputDirectory = layout.buildDirectory.dir('checksums')
-            dependsOn(tasks.withType(Jar))
-        }
-        def artifactsDir = layout.buildDirectory.dir('artifacts')
-        def artifactsTask = tasks.register('savePublishedArtifacts') {
-            outputs.dir(artifactsDir)
-            dependsOn(tasks.withType(Jar))
-        }
-
-        gradle.taskGraph.whenReady {
-            List filesToChecksum = []
-            publishing.publications.withType(MavenPublication).configureEach {
-                artifacts.each {
-                    if (it.file.name == 'grails-plugin.xml' || it.file.name == 'profile.yml') {
-                        return
-                    }
-                    filesToChecksum << it.file
-                }
-            }
-
-            checksumTask.configure { Checksum check ->
-                check.inputFiles.from = filesToChecksum.unique()
-                check.finalizedBy(artifactsTask)
-            }
-
-            artifactsTask.configure {
-                doLast {
-                    Map<String, String> artifacts = [:]
-                    publishing.publications.withType(MavenPublication).configureEach { mavenPublication ->
-                        mavenPublication.artifacts.each { artifact ->
-                            if (!artifact.file.exists() || artifact.file.name == 'grails-plugin.xml' || artifact.file.name == 'profile.yml') {
-                                return
-                            }
-                            if(artifact.classifier) {
-                                artifacts[artifact.file.name] = "$groupId:$artifactId:$version:$artifact.classifier".toString()
-                            }
-                            else {
-                                artifacts[artifact.file.name] = "$groupId:$artifactId:$version".toString()
-                            }
-                        }
-                    }
-
-                    File artifactsFile = artifactsDir.get().asFile
-                    artifactsFile.mkdirs()
-
-                    artifacts.each {
-                        File published = new File(artifactsFile, "${it.key}.txt")
-                        published.text = it.value
-                    }
-                }
-            }
-        }
-
-        Set<String> publishTasks = tasks.names.findAll { it.startsWith('publishMavenPublication') }
-        publishTasks.each { taskName ->
-            tasks.named(taskName) {
-                finalizedBy(checksumTask)
-            }
-        }
-
-
-        def aggregatePublishedArtifacts = tasks.register('aggregatePublishedArtifacts')
-
-        tasks.register("aggregateChecksums").configure {
-            group = "publishing"
-            description = "Aggregates all SHA-256 checksums into a single file."
-
-            def outputFileProvider = rootProject.layout.buildDirectory.file("CHECKSUMS.txt")
-            outputs.file(outputFileProvider)
-
-            dependsOn(checksumTask)
-            finalizedBy(aggregatePublishedArtifacts)
-
-            outputs.upToDateWhen { false } // not worth caching
-
-            doLast {
-                def outputFile = outputFileProvider.get().asFile
-                outputFile.withPrintWriter { writer ->
-                    def checksumDir = layout.buildDirectory.dir("checksums").get().asFile
-                    if (checksumDir.exists()) {
-                        checksumDir.listFiles(new FilenameFilter() {
-                            boolean accept(File dir, String name) {
-                                return name.endsWith(".sha512")
-                            }
-                        })?.each { checksumFile ->
-                            def jarName = checksumFile.name - ".sha512"
-                            def checksumLine = checksumFile.text.trim()
-                            def checksum = checksumLine.tokenize()[0]
-                            writer.println("${jarName} ${checksum}")
-                        }
-                    }
-                }
-
-                println "Checksum manifest written to ${outputFile}"
-            }
-        }
-
-        aggregatePublishedArtifacts.configure {
-            group = "publishing"
-            description = "Aggregates all published artifacts into a single file."
-
-            def outputFileProvider = rootProject.layout.buildDirectory.file("PUBLISHED_ARTIFACTS.txt")
-            outputs.file(outputFileProvider)
-
-            outputs.upToDateWhen { false } // not worth caching
-
-            dependsOn(artifactsTask)
-
-            doLast {
-                def outputFile = outputFileProvider.get().asFile
-                outputFile.text = "" // clear previous
-                outputFile.withPrintWriter { writer ->
-                    def publishedArtifactsDir = artifactsDir.get().asFile
-                    if (publishedArtifactsDir.exists()) {
-                        publishedArtifactsDir.listFiles(new FilenameFilter() {
-                            boolean accept(File dir, String name) {
-                                return name.endsWith(".txt")
-                            }
-                        })?.each { checksumFile ->
-                            def artifactName = checksumFile.name - ".txt"
-                            def coordinates = checksumFile.text.trim()
-                            writer.println("${artifactName} ${coordinates}")
-                        }
-                    }
-                }
-
-                println "Published artifacts written to ${outputFile}"
-            }
-        }
-    }
-}
diff --git a/gradle/rat-root-config.gradle b/gradle/rat-root-config.gradle
deleted file mode 100644
index b48251b..0000000
--- a/gradle/rat-root-config.gradle
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *  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
- *
- *      https://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.
- */
-
-import org.nosphere.apache.rat.RatTask
-
-apply plugin: 'org.nosphere.apache.rat'
-
-tasks.named('rat', RatTask) {
-    excludes.addAll(
-            '.asf.yaml', // ASF metadata for github integration excluded from src zip
-            'CODE_OF_CONDUCT.md',
-            'BUILD_DATE', // build artifact for storing the build date / verifying
-            'CHECKSUMS', // build artifact for storing checksums for easy verification
-            'PUBLISHED_ARTIFACTS', // build artifact for storing published artifacts coordinates & paths
-            'licenses/**', // licenses directory excluded
-            '**/build/**', // Gradle generated build directories
-            '**/.gitattributes', // git configuration isn't code
-            '.github/**', // github configuration isn't shipped in the source distro
-            '**/.gradle/**', '**/wrapper/**', 'gradlew*',  // gradle wrapper files excluded from src zip
-            'out/**', '*.ipr', '**/*.iml', '*.iws', '.idea/**', // Intellij generated files
-            '**/.sdkmanrc', // tool selection files aren't code
-            '**/.gitignore', // git configuration isn't code
-            '**/.gitkeep', // git configuration isn't code
-            'etc/bin/results/**', // exclude build directories
-            '**/*.png', '**/*.svg', '**/*.ico', '**/*.eps', '**/*.icns', '**/*.jpg', '**/*.jpeg', '**/*.gif', // Image files
-            '**/*.db', // H2 database test files
-            '**/*.gitkeep', // Empty Gitkeep file
-            'src/main/templates/**', // Exclude template files
-    )
-    // never cache license audits
-    outputs.upToDateWhen { false }
-}
\ No newline at end of file
diff --git a/gradle/reproducible-config.gradle b/gradle/reproducible-config.gradle
deleted file mode 100644
index b0f891c..0000000
--- a/gradle/reproducible-config.gradle
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  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
- *
- *    https://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.
- */
-
-// Any jar, zip, or archive should be reproducible
-// No longer needed after https://github.com/gradle/gradle/issues/30871
-tasks.withType(AbstractArchiveTask).configureEach {
-    preserveFileTimestamps = false // to prevent timestamp mismatches
-    reproducibleFileOrder = true // to keep the same ordering
-    // to avoid platform specific defaults, set the permissions consistently
-    filePermissions { permissions ->
-        permissions.unix(0644)
-    }
-    dirPermissions { permissions ->
-        permissions.unix(0755)
-    }
-}
\ No newline at end of file
diff --git a/gradle/test-config.gradle b/gradle/test-config.gradle
deleted file mode 100644
index 10177fa..0000000
--- a/gradle/test-config.gradle
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  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
- *
- *    https://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.
- */
-
-dependencies {
-    add('testRuntimeOnly', 'org.slf4j:slf4j-nop') // Get rid of warning about missing slf4j implementation during test task
-    add('testRuntimeOnly', 'org.junit.platform:junit-platform-launcher') // Gradle 9+ requires this
-}
-
-tasks.withType(Test).configureEach {
-    onlyIf { !project.hasProperty('skipTests') }
-    useJUnitPlatform()
-    testLogging {
-        exceptionFormat = 'full'
-        events('passed', 'skipped', 'failed')
-    }
-}
-
-['bootRun', 'bootTestRun'].each { taskName ->
-    tasks.named(taskName) {
-        // Disable bootRun and bootTestRun tasks as no application class is available
-        enabled = false
-    }
-}
\ No newline at end of file
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
deleted file mode 100644
index 1b33c55..0000000
Binary files a/gradle/wrapper/gradle-wrapper.jar and /dev/null differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
deleted file mode 100644
index aaaabb3..0000000
--- a/gradle/wrapper/gradle-wrapper.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-distributionBase=GRADLE_USER_HOME
-distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.4-bin.zip
-networkTimeout=10000
-validateDistributionUrl=true
-zipStoreBase=GRADLE_USER_HOME
-zipStorePath=wrapper/dists
diff --git a/gradlew b/gradlew
deleted file mode 100755
index 23d15a9..0000000
--- a/gradlew
+++ /dev/null
@@ -1,251 +0,0 @@
-#!/bin/sh
-
-#
-# Copyright Š 2015-2021 the original authors.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      https://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.
-#
-# SPDX-License-Identifier: Apache-2.0
-#
-
-##############################################################################
-#
-#   Gradle start up script for POSIX generated by Gradle.
-#
-#   Important for running:
-#
-#   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
-#       noncompliant, but you have some other compliant shell such as ksh or
-#       bash, then to run this script, type that shell name before the whole
-#       command line, like:
-#
-#           ksh Gradle
-#
-#       Busybox and similar reduced shells will NOT work, because this script
-#       requires all of these POSIX shell features:
-#         * functions;
-#         * expansions ÂĢ$varÂģ, ÂĢ${var}Âģ, ÂĢ${var:-default}Âģ, ÂĢ${var+SET}Âģ,
-#           ÂĢ${var#prefix}Âģ, ÂĢ${var%suffix}Âģ, and ÂĢ$( cmd )Âģ;
-#         * compound commands having a testable exit status, especially ÂĢcaseÂģ;
-#         * various built-in commands including ÂĢcommandÂģ, ÂĢsetÂģ, and ÂĢulimitÂģ.
-#
-#   Important for patching:
-#
-#   (2) This script targets any POSIX shell, so it avoids extensions provided
-#       by Bash, Ksh, etc; in particular arrays are avoided.
-#
-#       The "traditional" practice of packing multiple parameters into a
-#       space-separated string is a well documented source of bugs and security
-#       problems, so this is (mostly) avoided, by progressively accumulating
-#       options in "$@", and eventually passing that to Java.
-#
-#       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
-#       and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
-#       see the in-line comments for details.
-#
-#       There are tweaks for specific operating systems such as AIX, CygWin,
-#       Darwin, MinGW, and NonStop.
-#
-#   (3) This script is generated from the Groovy template
-#       https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
-#       within the Gradle project.
-#
-#       You can find Gradle at https://github.com/gradle/gradle/.
-#
-##############################################################################
-
-# Attempt to set APP_HOME
-
-# Resolve links: $0 may be a link
-app_path=$0
-
-# Need this for daisy-chained symlinks.
-while
-    APP_HOME=${app_path%"${app_path##*/}"}  # leaves a trailing /; empty if no leading path
-    [ -h "$app_path" ]
-do
-    ls=$( ls -ld "$app_path" )
-    link=${ls#*' -> '}
-    case $link in             #(
-      /*)   app_path=$link ;; #(
-      *)    app_path=$APP_HOME$link ;;
-    esac
-done
-
-# This is normally unused
-# shellcheck disable=SC2034
-APP_BASE_NAME=${0##*/}
-# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
-APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
-
-# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD=maximum
-
-warn () {
-    echo "$*"
-} >&2
-
-die () {
-    echo
-    echo "$*"
-    echo
-    exit 1
-} >&2
-
-# OS specific support (must be 'true' or 'false').
-cygwin=false
-msys=false
-darwin=false
-nonstop=false
-case "$( uname )" in                #(
-  CYGWIN* )         cygwin=true  ;; #(
-  Darwin* )         darwin=true  ;; #(
-  MSYS* | MINGW* )  msys=true    ;; #(
-  NONSTOP* )        nonstop=true ;;
-esac
-
-CLASSPATH="\\\"\\\""
-
-
-# Determine the Java command to use to start the JVM.
-if [ -n "$JAVA_HOME" ] ; then
-    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
-        # IBM's JDK on AIX uses strange locations for the executables
-        JAVACMD=$JAVA_HOME/jre/sh/java
-    else
-        JAVACMD=$JAVA_HOME/bin/java
-    fi
-    if [ ! -x "$JAVACMD" ] ; then
-        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
-    fi
-else
-    JAVACMD=java
-    if ! command -v java >/dev/null 2>&1
-    then
-        die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
-    fi
-fi
-
-# Increase the maximum file descriptors if we can.
-if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
-    case $MAX_FD in #(
-      max*)
-        # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
-        # shellcheck disable=SC2039,SC3045
-        MAX_FD=$( ulimit -H -n ) ||
-            warn "Could not query maximum file descriptor limit"
-    esac
-    case $MAX_FD in  #(
-      '' | soft) :;; #(
-      *)
-        # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
-        # shellcheck disable=SC2039,SC3045
-        ulimit -n "$MAX_FD" ||
-            warn "Could not set maximum file descriptor limit to $MAX_FD"
-    esac
-fi
-
-# Collect all arguments for the java command, stacking in reverse order:
-#   * args from the command line
-#   * the main class name
-#   * -classpath
-#   * -D...appname settings
-#   * --module-path (only if needed)
-#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
-
-# For Cygwin or MSYS, switch paths to Windows format before running java
-if "$cygwin" || "$msys" ; then
-    APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
-    CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
-
-    JAVACMD=$( cygpath --unix "$JAVACMD" )
-
-    # Now convert the arguments - kludge to limit ourselves to /bin/sh
-    for arg do
-        if
-            case $arg in                                #(
-              -*)   false ;;                            # don't mess with options #(
-              /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX filepath
-                    [ -e "$t" ] ;;                      #(
-              *)    false ;;
-            esac
-        then
-            arg=$( cygpath --path --ignore --mixed "$arg" )
-        fi
-        # Roll the args list around exactly as many times as the number of
-        # args, so each arg winds up back in the position where it started, but
-        # possibly modified.
-        #
-        # NB: a `for` loop captures its iteration list before it begins, so
-        # changing the positional parameters here affects neither the number of
-        # iterations, nor the values presented in `arg`.
-        shift                   # remove old arg
-        set -- "$@" "$arg"      # push replacement arg
-    done
-fi
-
-
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
-
-# Collect all arguments for the java command:
-#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
-#     and any embedded shellness will be escaped.
-#   * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
-#     treated as '${Hostname}' itself on the command line.
-
-set -- \
-        "-Dorg.gradle.appname=$APP_BASE_NAME" \
-        -classpath "$CLASSPATH" \
-        -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
-        "$@"
-
-# Stop when "xargs" is not available.
-if ! command -v xargs >/dev/null 2>&1
-then
-    die "xargs is not available"
-fi
-
-# Use "xargs" to parse quoted args.
-#
-# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
-#
-# In Bash we could simply go:
-#
-#   readarray ARGS < <( xargs -n1 <<<"$var" ) &&
-#   set -- "${ARGS[@]}" "$@"
-#
-# but POSIX shell has neither arrays nor command substitution, so instead we
-# post-process each arg (as a line of input to sed) to backslash-escape any
-# character that might be a shell metacharacter, then use eval to reverse
-# that process (while maintaining the separation between arguments), and wrap
-# the whole thing up as a single "set" statement.
-#
-# This will of course break if any of these variables contains a newline or
-# an unmatched quote.
-#
-
-eval "set -- $(
-        printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
-        xargs -n1 |
-        sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
-        tr '\n' ' '
-    )" '"$@"'
-
-exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
deleted file mode 100644
index 5eed7ee..0000000
--- a/gradlew.bat
+++ /dev/null
@@ -1,94 +0,0 @@
-@rem
-@rem Copyright 2015 the original author or authors.
-@rem
-@rem Licensed under the Apache License, Version 2.0 (the "License");
-@rem you may not use this file except in compliance with the License.
-@rem You may obtain a copy of the License at
-@rem
-@rem      https://www.apache.org/licenses/LICENSE-2.0
-@rem
-@rem Unless required by applicable law or agreed to in writing, software
-@rem distributed under the License is distributed on an "AS IS" BASIS,
-@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-@rem See the License for the specific language governing permissions and
-@rem limitations under the License.
-@rem
-@rem SPDX-License-Identifier: Apache-2.0
-@rem
-
-@if "%DEBUG%"=="" @echo off
-@rem ##########################################################################
-@rem
-@rem  Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
-
-set DIRNAME=%~dp0
-if "%DIRNAME%"=="" set DIRNAME=.
-@rem This is normally unused
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Resolve any "." and ".." in APP_HOME to make it shorter.
-for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if %ERRORLEVEL% equ 0 goto execute
-
-echo. 1>&2
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
-echo. 1>&2
-echo Please set the JAVA_HOME variable in your environment to match the 1>&2
-echo location of your Java installation. 1>&2
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto execute
-
-echo. 1>&2
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
-echo. 1>&2
-echo Please set the JAVA_HOME variable in your environment to match the 1>&2
-echo location of your Java installation. 1>&2
-
-goto fail
-
-:execute
-@rem Setup the command line
-
-set CLASSPATH=
-
-
-@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
-
-:end
-@rem End local scope for the variables with windows NT shell
-if %ERRORLEVEL% equ 0 goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-set EXIT_CODE=%ERRORLEVEL%
-if %EXIT_CODE% equ 0 set EXIT_CODE=1
-if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
-exit /b %EXIT_CODE%
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
diff --git a/grails-app/conf/plugin.yml b/grails-app/conf/plugin.yml
deleted file mode 100644
index d84e390..0000000
--- a/grails-app/conf/plugin.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-# 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
-#
-#     https://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.
-
-quartz:
-  jdbcStore: false
diff --git a/grails-app/services/grails/plugins/quartz/JobManagerService.groovy b/grails-app/services/grails/plugins/quartz/JobManagerService.groovy
deleted file mode 100644
index 5c862cd..0000000
--- a/grails-app/services/grails/plugins/quartz/JobManagerService.groovy
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (c) 2011 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package grails.plugins.quartz
-
-import org.quartz.JobKey
-import org.quartz.Scheduler
-import org.quartz.TriggerKey
-import org.quartz.impl.matchers.GroupMatcher
-
-/**
- * JobManagerService simplifies interaction with the Quartz Scheduler from Grails application.
- *
- * @author Marco Mornati (mmornati@byte-code.com)
- * @author Sergey Nebolsin (nebolsin@gmail.com)
- *
- * @since 0.4
- */
-class JobManagerService {
-
-    Scheduler quartzScheduler
-
-    /**
-     * Returns all the jobs, registered in the Quartz Scheduler, grouped bu their corresponding job groups.
-     *
-     * @return Map <String , List<JobDescriptor>> with job group names as keys
-     */
-    Map <String , List<JobDescriptor>> getAllJobs() {
-        quartzScheduler.jobGroupNames.collectEntries([:]) { group -> [(group):getJobs(group)]}
-    }
-
-    /**
-     * Returns all the jobs, registered in the Quartz Scheduler, which belong to the specified group.
-     *
-     * @param group — the jobs group name
-     * @return a list of corresponding JobDescriptor objects
-     */
-    List<JobDescriptor> getJobs(String group) {
-        List<JobDescriptor> list = new ArrayList<JobDescriptor>()
-        quartzScheduler.getJobKeys(GroupMatcher.groupEquals(group)).each { jobKey ->
-            def jobDetail = quartzScheduler.getJobDetail(jobKey)
-            if(jobDetail!=null){
-                list.add(JobDescriptor.build(jobDetail, quartzScheduler))
-            }
-        }
-        return list
-    }
-
-    /**
-     * Returns a list of all currently executing jobs.
-     *
-     * @return a List<JobExecutionContext>, containing all currently executing jobs.
-     */
-    def getRunningJobs() {
-        quartzScheduler.getCurrentlyExecutingJobs()
-    }
-
-    def pauseJob(String group, String name) {
-        quartzScheduler.pauseJob(new JobKey(name, group))
-    }
-
-    def resumeJob(String group, String name) {
-        quartzScheduler.resumeJob(new JobKey(name, group))
-    }
-
-    def pauseTrigger(String group, String name) {
-        quartzScheduler.pauseTrigger(new TriggerKey(name, group))
-    }
-
-    def resumeTrigger(String group, String name) {
-        quartzScheduler.resumeTrigger(new TriggerKey(name, group))
-    }
-
-    def pauseTriggerGroup(String group) {
-        quartzScheduler.pauseTriggers(GroupMatcher.groupEquals(group))
-    }
-
-    def resumeTriggerGroup(String group) {
-        quartzScheduler.resumeTriggers(GroupMatcher.groupEquals(group))
-    }
-
-    def pauseJobGroup(String group) {
-        quartzScheduler.pauseJobs(GroupMatcher.groupEquals(group))
-    }
-
-    def resumeJobGroup(String group) {
-        quartzScheduler.resumeJobs(GroupMatcher.groupEquals(group))
-    }
-
-    def pauseAll(){
-        quartzScheduler.pauseAll()
-    }
-
-    def resumeAll(){
-        quartzScheduler.resumeAll()
-    }
-
-    def removeJob(String group, String name) {
-        quartzScheduler.deleteJob(new JobKey(name, group))
-    }
-
-    def unscheduleJob(String group, String name) {
-        quartzScheduler.unscheduleJobs(quartzScheduler.getTriggersOfJob(new JobKey(name, group))*.key)
-    }
-
-    def interruptJob(String group, String name) {
-        quartzScheduler.interrupt(new JobKey(name, group))
-    }
-}
diff --git a/settings.gradle b/settings.gradle
deleted file mode 100644
index 524048a..0000000
--- a/settings.gradle
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- *  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
- *
- *    https://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.
- */
-
-plugins {
-    id 'com.gradle.develocity' version '4.0.2'
-    id 'com.gradle.common-custom-user-data-gradle-plugin' version '2.3'
-}
-
-def isCI = System.getenv().containsKey('CI')
-def isLocal = !isCI
-def isReproducibleBuild = System.getenv('SOURCE_DATE_EPOCH') != null
-if (isReproducibleBuild) {
-    gradle.settingsEvaluated {
-        logger.warn('*************** Remote Build Cache Disabled due to Reproducible Build ********************')
-        logger.warn('Build date will be set to (SOURCE_DATE_EPOCH={})', System.getenv('SOURCE_DATE_EPOCH'))
-    }
-}
-
-develocity {
-    server = 'https://develocity.apache.org'
-    buildScan {
-        tag('grails')
-        tag('grails-quartz')
-        publishing.onlyIf { it.authenticated }
-        uploadInBackground = isLocal
-    }
-}
-
-buildCache {
-    local { enabled = (isLocal && !isReproducibleBuild) || (isCI && isReproducibleBuild) }
-    remote(develocity.buildCache) {
-        push = isCI
-        enabled = !isReproducibleBuild
-    }
-}
-
-rootProject.name = 'grails-quartz'
diff --git a/src/docs/configuration.adoc b/src/docs/configuration.adoc
deleted file mode 100644
index 4e24649..0000000
--- a/src/docs/configuration.adoc
+++ /dev/null
@@ -1,106 +0,0 @@
-////
-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
-
-https://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.
-////
-
-[[configuration]]
-== Plugin Configuration
-
-
-=== Configuring the plugin
-
-The plugin supports configuration settings defined in grails-app/conf/application.yml.
-
-[source,yml]
-----
-quartz:
-    autoStartup: true
-----
-
-Currently supported options:
-
-* `autoStartup` Controls automatic startup of the Quartz scheduler during application bootstrap (default: true).
-* `jdbcStore` Set to true if you want Quartz to persist jobs in your DB (default: false). You'll also need to provide a `quartz.properties` file and make sure that required tables exist in your db (see the <<_clustering>> section below for the sample config and automatic tables creation using Hibernate).
-
-
-==== Logging
-
-A log is auto-injected into your task Job class without having to enable it. To set the logging level, add something like this to your grails-app/conf/Config.groovy log4j configuration.
-
-[,groovy]
-----
-debug 'grails.app.jobs'
-----
-
-
-==== Hibernate Sessions and Jobs
-
-Jobs are configured by default to have Hibernate Session bounded to thread each time a job is executed. This is required if you are using Hibernate, which requires open session (such as lazy loading of collections) or working with domain objects with unique persistent constraint (it uses Hibernate Session behind the scene). If you want to override this behavior (rarely useful) you can use `sessionRequired` property:
-
-[,groovy]
-----
-static sessionRequired = false
-----
-
-
-==== Configuring concurrent execution
-
-By default, jobs are executed in concurrent fashion, so new job execution can start even if the previous execution of the same job is still running. If you want to override this behavior, you can use `concurrent` property. In this case Quartz's `StatefulJob` will be used (you can find more info about it here).
-
-[,groovy]
-----
-static concurrent = false
-----
-
-
-==== Configuring Job Enabled
-
-By default, all jobs are considered enabled. In some cases it may be desired to temporarily disable a job. This can be done by overriding the `jobEnabled` property behavior.
-
-[,groovy]
-----
-static jobEnabled = false
-----
-
-
-==== Configuring description
-
-Quartz allows for each job to have a short description. This may be configured by adding a description field to your Job. The description can be accessed at runtime using the `JobManagerService` and inspecting the `JobDetail` object.
-
-[,groovy]
-----
-static description = 'Example Job Description'
-----
-
-
-[#_clustering]
-==== Clustering
-
-Quartz plugin doesn't support clustering out-of-the-box now. However, you could use a standard Quartz clustering configuration. You'll also need to set `jdbcStore` configuration option to `true`.
-
-There are also two parameters for configuring store/clustering on jobs, volatility and durability (both are true by default) and one for triggers, volatility (also true by default). A volatile job and trigger will not persist between Quartz runs, and a durable job will live even when there are no triggers referring to it.
-
-Read Quartz documentation for more information on clustering and job stores as well as volatility and durability.
-
-Now that the plugin supports Quartz `2.1.x`, you can use current versions of open source Terracotta see https://github.com/rvanderwerf/terracotta-grails-demo for an example app.
-
-
-==== Recovering
-
-Since `0.4.2` recovering from a 'recovery' or 'fail-over' situation is supported with the `requestsRecovery` job-level flag (false by default).
-
-If a job "requests recovery", and it is executing during a 'hard shutdown' of the scheduler, (i.e., the process it is running within crashes, or the machine is shut off), then it is re-executed when the scheduler is started again. In this case, the `JobExecutionContext.isRecovering()` method will return `true`.
diff --git a/src/docs/index.adoc b/src/docs/index.adoc
deleted file mode 100644
index a44a7a7..0000000
--- a/src/docs/index.adoc
+++ /dev/null
@@ -1,46 +0,0 @@
-////
-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
-
-https://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.
-////
-
-= Grails Quartz Plugin - Reference Documentation
-
-include::introduction.adoc[]
-
-include::scheduling.adoc[]
-
-include::triggers.adoc[]
-
-include::configuration.adoc[]
-
-[[reference]]
-== Reference
-
-[[ref-command-line]]
-=== Command Line
-
-include::ref/Command Line/create-job.adoc[]
-
-[[ref-triggers]]
-=== Triggers
-
-include::ref/Triggers/cron.adoc[]
-
-include::ref/Triggers/custom.adoc[]
-
-include::ref/Triggers/simple.adoc[]
-
diff --git a/src/docs/introduction.adoc b/src/docs/introduction.adoc
deleted file mode 100644
index 1cf0bd0..0000000
--- a/src/docs/introduction.adoc
+++ /dev/null
@@ -1,24 +0,0 @@
-////
-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
-
-https://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.
-////
-
-[[introduction]]
-== Introduction
-
-The Quartz Plugin allows your Grails application to schedule jobs to be executed using a specified interval or cron expression. The underlying system uses the https://www.quartz-scheduler.org/[Quartz Enterprise Job Scheduler] configured via Spring, but is made simpler by the coding-by-convention paradigm.
-Since version `1.0-RC3`, this plugin requires Quartz version `2.1.x` or higher and no longer supports Quartz version `1.8.x`.
diff --git a/src/docs/ref/Command Line/create-job.adoc b/src/docs/ref/Command Line/create-job.adoc
deleted file mode 100644
index c2350f0..0000000
--- a/src/docs/ref/Command Line/create-job.adoc	
+++ /dev/null
@@ -1,32 +0,0 @@
-////
-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
-
-https://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.
-////
-
-[[ref-command-line-create-job]]
-==== create-job
-
-===== Purpose
-
-Create a job class
-
-===== Examples
-
-[,console]
-----
-grails create-job MyJob
-----
diff --git a/src/docs/ref/Triggers/cron.adoc b/src/docs/ref/Triggers/cron.adoc
deleted file mode 100644
index 5d4b76a..0000000
--- a/src/docs/ref/Triggers/cron.adoc
+++ /dev/null
@@ -1,48 +0,0 @@
-////
-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
-
-https://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.
-////
-
-[[ref-triggers-cron]]
-==== cron
-
-
-===== Purpose
-
-A cron trigger that executes based on the defined cron expression
-
-
-===== Examples
-
-[source,groovy]
-----
-class MyJob {
-
-    static triggers = {
-        cron(
-                name: 'cronTrigger',
-                startDelay: 10000,
-                cronExpression: '0/6 * 15 * * ?',
-                timeZone: TimeZone.getTimeZone('GMT-8') // timeZone is optional
-        )
-   }
-
-   void execute() {
-      println 'Job run!'
-   }
-}
-----
diff --git a/src/docs/ref/Triggers/custom.adoc b/src/docs/ref/Triggers/custom.adoc
deleted file mode 100644
index fc1b0c1..0000000
--- a/src/docs/ref/Triggers/custom.adoc
+++ /dev/null
@@ -1,49 +0,0 @@
-////
-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
-
-https://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.
-////
-
-
-[[ref-triggers-custom]]
-==== custom
-
-
-===== Purpose
-
-A custom trigger that executes based on the result of a custom `Trigger` implementation
-
-
-===== Examples
-
-[source,groovy]
-----
-class MyJob {
-
-    static triggers = {
-        custom(
-                name: 'customTrigger',
-                triggerClass: MyTriggerClass,
-                myParam: myValue,
-                myAnotherParam: myAnotherValue
-        )
-   }
-
-   void execute() {
-      println 'Job run!'
-   }
-}
-----
diff --git a/src/docs/ref/Triggers/simple.adoc b/src/docs/ref/Triggers/simple.adoc
deleted file mode 100644
index e5b17fc..0000000
--- a/src/docs/ref/Triggers/simple.adoc
+++ /dev/null
@@ -1,45 +0,0 @@
-////
-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
-
-https://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.
-////
-
-
-[[ref-triggers-simple]]
-==== simple
-
-
-===== Purpose
-
-A simple trigger that executes on a set interval.
-
-
-===== Examples
-
-[source,groovy]
-----
-class MyJob {
-
-    static triggers = {
-        simple(
-                name: 'simpleTrigger',
-                startDelay: 10000,
-                repeatInterval: 30000,
-                repeatCount: 10
-        )
-    }
-}
-----
diff --git a/src/docs/scheduling.adoc b/src/docs/scheduling.adoc
deleted file mode 100644
index aab2a05..0000000
--- a/src/docs/scheduling.adoc
+++ /dev/null
@@ -1,96 +0,0 @@
-////
-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
-
-https://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.
-////
-
-[[scheduling]]
-== Scheduling Basics
-
-=== Scheduling Jobs
-
-To create a new job, run the `grails create-job` command and enter the name of the job. Grails will create a new job and place it in the `grails-app/jobs` directory:
-
-[source,groovy]
-----
-class MyJob {
-
-    static group = 'MyGroup'
-    static description = 'Example job with Simple Trigger'
-    static triggers = {
-        simple(
-            name: 'mySimpleTrigger',
-            startDelay: 60000,
-            repeatInterval: 1000
-        )
-    }
-
-    void execute() {
-        println 'Job run!'
-    }
-}
-----
-
-The above example will wait for 1 minute and after that will call the `execute()` method every second. The `repeatInterval` and `startDelay` properties are specified in milliseconds and must have Integer or Long type. If these properties are not specified, default values are applied (1 minute for `repeatInterval` property and 30 seconds for `startDelay` property). Jobs can optionally be placed in different groups.
-The trigger name property must be unique across all triggers in the application.
-
-By default, jobs will not be executed when running under the test environment.
-
-
-==== Scheduling a Cron Job
-
-Jobs can be scheduled using a cron expression. For those unfamiliar with `cron`, this means being able to create a firing schedule such as "At 8:00am every Monday through Friday" or "At 1:30am every last Friday of the month". (See the API docs for the `CronTrigger` class in Quartz for more info on cron expressions).
-
-[source,groovy]
-----
-class MyJob  {
-
-    static group = 'MyGroup'
-    static description = 'Example job with Cron Trigger'
-    static triggers = {
-        cron(
-            name: 'myTrigger',
-            cronExpression: '0 0 6 * * ?'
-        )
-    }
-
-    void execute() {
-        println 'Job run!'
-    }
-}
-----
-
-The fields in the cronExpression are: (summarizing the Quartz CronTrigger Tutorial)
-
-[,]
-----
-cronExpression: "s m h D M W Y"
-                 | | | | | | - Year <<optional>>
-                 | | | | | - Day of Week, 1-7 or SUN-SAT, ?
-                 | | | | - Month, 1-12 or JAN-DEC
-                 | | | - Day of Month, 1-31, ?
-                 | | - Hour, 0-23
-                 | - Minute, 0-59
-                 - Second, 0-59
-----
-
-[NOTE]
-====
-* Year is the only optional field and may be omitted, the rest are mandatory.
-* Day-of-Week and Month are case-insensitive, so "DEC" = "dec" = "Dec"
-* Either Day-of-Week or Day-of-Month must be "?", or you will get an error since support by the underlying library is not complete. So you can't specify both fields, nor leave both as the all-values wildcard "*"; this is a departure from the unix crontab specification.
-* See the CronTrigger Tutorial for an explanation of all the special characters you may use.
-====
\ No newline at end of file
diff --git a/src/docs/triggers.adoc b/src/docs/triggers.adoc
deleted file mode 100644
index 3b8fe95..0000000
--- a/src/docs/triggers.adoc
+++ /dev/null
@@ -1,118 +0,0 @@
-////
-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
-
-https://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.
-////
-
-[[triggers]]
-== Understanding Triggers
-
-=== Scheduling configuration syntax
-
-
-Currently, plugin supports three types of triggers:
-
-* *simple* — executes once per defined interval (ex. “every 10 seconds”);
-* *cron* — executes job with cron expression (ex. “at 8:00am every Monday through Friday”);
-* *custom*  — your implementation of Trigger interface.
-
-Multiple triggers per job are allowed.
-
-[source,groovy]
-----
-class MyJob {
-
-    static triggers = {
-        simple(
-                name: 'simpleTrigger',
-                startDelay: 10000,
-                repeatInterval: 30000,
-                repeatCount: 10
-        )
-        cron(
-                name: 'cronTrigger',
-                startDelay: 10000,
-                cronExpression: '0/6 * 15 * * ?',
-                timeZone: TimeZone.getTimeZone('GMT-8') // timeZone is optional
-        )
-        custom(
-            name: 'customTrigger',
-            triggerClass: MyTriggerClass,
-            myParam: myValue,
-            myAnotherParam: myAnotherValue
-        )
-    }
-
-    void execute() {
-        println 'Job run!'
-    }
-}
-----
-
-With this configuration a job will be executed 11 times with a 30-second interval with the first run in 10 seconds after scheduler startup (simple trigger). It will also be executed each 6 seconds during the 15th hour (15:00:00, 15:00:06, 15:00:12, â€Ļ — this configured by cron trigger), and also each time your custom trigger will fire.
-
-Three kinds of triggers are supported with the following parameters:
-
-* `simple`:
-** `name` — the name that identifies the trigger
-** `startDelay` — delay (in milliseconds) between scheduler startup and first job’s execution
-** `repeatInterval` — timeout (in milliseconds) between consecutive job’s executions
-** `repeatCount` — trigger will fire job execution (1 + repeatCount) times and stop after that (specify zero here to have a one-shot job or -1 to repeat job executions indefinitely)
-* `cron`:
-** `name` — the name that identifies the trigger
-** `startDelay` — delay (in milliseconds) between scheduler startup and first job’s execution
-** `cronExpression` — cron expression
-* `custom`:
-** `triggerClass` — your class which implements Trigger interface
-any params needed by your trigger.
-
-It is also possible to adjust properties in a trigger Closure by the Grails configuration since the triggers block is given access to the grailsApplication object.
-
-
-==== Dynamic Job Scheduling
-
-Starting from the 0.4.1 version, you can schedule job executions dynamically.
-
-These methods are available:
-
-[,groovy]
-----
-// creates cron trigger
-MyJob.schedule(String cronExpression, Map params)
-
-//  creates simple trigger: repeats job repeatCount+1 times with delay of repeatInterval milliseconds
-MyJob.schedule(Long repeatInterval, Integer repeatCount, Map params)
-
-// schedules one job execution to the specific date
-MyJob.schedule(Date scheduleDate, Map params)
-
-//schedules job's execution with a custom trigger
-MyJob.schedule(Trigger trigger)
-
-// force immediate execution of the job
-MyJob.triggerNow(Map params)
-
-// Each method (except the one for custom trigger) takes optional 'params' argument.
-// You can use it to pass some data to your job and then access it from the job.
-class MyJob {
-    void execute(context) {
-        println(context.mergedJobDataMap.foo)
-    }
-}
-
-// now in your controller (or service, or something else):
-MyJob.triggerNow([foo: 'It Works!'])
-----
diff --git a/src/main/groovy/grails/plugins/quartz/CustomTriggerFactoryBean.java b/src/main/groovy/grails/plugins/quartz/CustomTriggerFactoryBean.java
deleted file mode 100644
index 669d411..0000000
--- a/src/main/groovy/grails/plugins/quartz/CustomTriggerFactoryBean.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (c) 2011 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package grails.plugins.quartz;
-
-import org.quartz.JobDetail;
-import org.quartz.Trigger;
-import org.quartz.impl.triggers.AbstractTrigger;
-import org.springframework.beans.BeanUtils;
-import org.springframework.beans.BeanWrapper;
-import org.springframework.beans.PropertyAccessorFactory;
-import org.springframework.beans.factory.FactoryBean;
-import org.springframework.beans.factory.InitializingBean;
-
-import java.beans.PropertyEditorSupport;
-import java.text.ParseException;
-import java.util.Date;
-import java.util.Map;
-
-/**
- * The factory bean to create and register trigger beans in Spring context.
- *
- * @author Sergey Nebolsin (nebolsin@gmail.com)
- */
-public class CustomTriggerFactoryBean implements FactoryBean<Trigger>, InitializingBean {
-    private Class<Trigger> triggerClass;
-    private Trigger customTrigger;
-    private JobDetail jobDetail;
-
-    private Map triggerAttributes;
-
-    public void afterPropertiesSet() throws ParseException {
-        // Create a trigger by the class name
-        customTrigger = BeanUtils.instantiateClass(triggerClass);
-
-        // If trigger is a standard trigger, set standard properties
-        if(customTrigger instanceof AbstractTrigger){
-            AbstractTrigger at =(AbstractTrigger) customTrigger;
-
-            // Set job details
-            if(jobDetail!=null){
-                at.setJobKey(jobDetail.getKey());
-            }
-
-            // Set start delay
-            if (triggerAttributes.containsKey(GrailsJobClassConstants.START_DELAY)) {
-                Number startDelay = (Number) triggerAttributes.remove(GrailsJobClassConstants.START_DELAY);
-                at.setStartTime(new Date(System.currentTimeMillis() + startDelay.longValue()));
-            } else {
-            	at.setStartTime(new Date());
-			}
-        }
-
-        // Set non standard properties.
-        BeanWrapper customTriggerWrapper = PropertyAccessorFactory.forBeanPropertyAccess(customTrigger);
-        customTriggerWrapper.registerCustomEditor(String.class, new StringEditor());
-        customTriggerWrapper.setPropertyValues(triggerAttributes);
-    }
-
-    /**
-     * {@inheritDoc}
-     *
-     * @see org.springframework.beans.factory.FactoryBean#getObject()
-     */
-    public Trigger getObject() throws Exception {
-        return customTrigger;
-    }
-
-    /**
-     * {@inheritDoc}
-     *
-     * @see org.springframework.beans.factory.FactoryBean#getObjectType()
-     */
-    public Class<? extends Trigger> getObjectType() {
-        return triggerClass;
-    }
-
-    /**
-     * {@inheritDoc}
-     *
-     * @see org.springframework.beans.factory.FactoryBean#isSingleton()
-     */
-    public boolean isSingleton() {
-        return true;
-    }
-
-    public void setJobDetail(JobDetail jobDetail) {
-        this.jobDetail = jobDetail;
-    }
-
-    public void setTriggerClass(Class<Trigger> triggerClass) {
-        this.triggerClass = triggerClass;
-    }
-
-    public void setTriggerAttributes(Map triggerAttributes) {
-        this.triggerAttributes = triggerAttributes;
-    }
-}
-
-// We need this additional editor to support GString -> String convertion for trigger's properties.
-class StringEditor extends PropertyEditorSupport {
-    @Override
-    public void setValue(Object value) {
-        super.setValue(value == null ? null : value.toString());
-    }
-
-    @Override
-    public void setAsText(String text) throws IllegalArgumentException {
-        setValue(text);
-    }
-}
diff --git a/src/main/groovy/grails/plugins/quartz/DefaultGrailsJobClass.java b/src/main/groovy/grails/plugins/quartz/DefaultGrailsJobClass.java
deleted file mode 100644
index 02828bb..0000000
--- a/src/main/groovy/grails/plugins/quartz/DefaultGrailsJobClass.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright (c) 2011 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package grails.plugins.quartz;
-
-import grails.plugins.quartz.config.TriggersConfigBuilder;
-import grails.util.GrailsClassUtils;
-import groovy.lang.Closure;
-import org.grails.core.AbstractGrailsClass;
-import org.quartz.JobExecutionContext;
-
-import java.util.HashMap;
-import java.util.Map;
-import static grails.plugins.quartz.GrailsJobClassConstants.*;
-
-
-/**
- * Grails artifact class which represents a Quartz job.
- *
- * @author Micha?? K??ujszo
- * @author Marcel Overdijk
- * @author Sergey Nebolsin (nebolsin@gmail.com)
- * @since 0.1
- */
-public class DefaultGrailsJobClass extends AbstractGrailsClass implements GrailsJobClass {
-
-    public static final String JOB = "Job";
-    private Map triggers = new HashMap();
-    private boolean triggersEvaluated = false;
-
-
-    public DefaultGrailsJobClass(Class clazz) {
-        super(clazz, JOB);
-    }
-
-    private void evaluateTriggers() {
-        // registering additional triggersClosure from 'triggersClosure' closure if present
-        Closure triggersClosure = (Closure) GrailsClassUtils.getStaticPropertyValue(getClazz(), "triggers");
-
-        TriggersConfigBuilder builder = new TriggersConfigBuilder(getFullName(), grailsApplication);
-
-        if (triggersClosure != null) {
-            builder.build(triggersClosure);
-            triggers = (Map) builder.getTriggers();
-        }
-        triggersEvaluated = true;
-    }
-
-    public void execute() {
-        getMetaClass().invokeMethod(getReferenceInstance(), EXECUTE, new Object[]{});
-    }
-
-    public void execute(JobExecutionContext context) {
-        getMetaClass().invokeMethod(getReferenceInstance(), EXECUTE, new Object[]{context});
-    }
-
-    public String getGroup() {
-        String group = getStaticPropertyValue(GROUP, String.class);
-        if (group == null || "".equals(group)) return DEFAULT_GROUP;
-        return group;
-    }
-
-    public boolean isConcurrent() {
-        Boolean concurrent = getStaticPropertyValue(CONCURRENT, Boolean.class);
-        return concurrent == null ? DEFAULT_CONCURRENT : concurrent;
-    }
-
-    public boolean isSessionRequired() {
-        Boolean sessionRequired = getStaticPropertyValue(SESSION_REQUIRED, Boolean.class);
-        return sessionRequired == null ? DEFAULT_SESSION_REQUIRED : sessionRequired;
-    }
-
-    public boolean isDurability() {
-        Boolean durability = getStaticPropertyValue(DURABILITY, Boolean.class);
-        return durability == null ? DEFAULT_DURABILITY : durability;
-    }
-
-    public boolean isRequestsRecovery() {
-        Boolean requestsRecovery = getStaticPropertyValue(REQUESTS_RECOVERY, Boolean.class);
-        return requestsRecovery == null ? DEFAULT_REQUESTS_RECOVERY : requestsRecovery;
-    }
-
-    public boolean isEnabled() {
-        Boolean enabled = getStaticPropertyValue(ENABLED, Boolean.class);
-        return enabled == null ? DEFAULT_ENABLED : enabled;
-    }
-
-    public String getDescription() {
-        String description = (String) getPropertyOrStaticPropertyOrFieldValue(DESCRIPTION, String.class);
-        if (description == null || "".equals(description)) return DEFAULT_DESCRIPTION;
-        return description;
-    }
-
-    public Map getTriggers() {
-        if (triggersEvaluated == false) {
-            evaluateTriggers();
-        }
-        return triggers;
-    }
-}
diff --git a/src/main/groovy/grails/plugins/quartz/GrailsJobClass.java b/src/main/groovy/grails/plugins/quartz/GrailsJobClass.java
deleted file mode 100644
index 519398a..0000000
--- a/src/main/groovy/grails/plugins/quartz/GrailsJobClass.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (c) 2011 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package grails.plugins.quartz;
-
-import grails.core.GrailsClass;
-
-import java.util.Map;
-
-/**
- * Represents a job class in Grails.
- *
- * @author Micha?? K??ujszo
- * @author Graeme Rocher
- * @author Marcel Overdijk
- * @author Sergey Nebolsin (nebolsin@gmail.com)
- * @since 0.1
- */
-public interface GrailsJobClass extends GrailsClass {
-
-    /**
-     * Method which is executed by the job scheduler.
-     */
-    public void execute();
-
-    /**
-     * Get group name used for configuring scheduler.
-     *
-     * @return jobs group name for this job
-     */
-    public String getGroup();
-
-    /**
-     * If jobs can be executed concurrently returns true.
-     *
-     * @return true if several instances of this job can run concurrently
-     */
-    public boolean isConcurrent();
-
-    /**
-     * If job requires Hibernate Session bounded to thread returns true.
-     *
-     * @return true if this job require a Hibernate Session bounded to thread
-     */
-    public boolean isSessionRequired();
-
-    /**
-     * If job is durable returns true.
-     *
-     * @return true if this job is durable
-     */
-    public boolean isDurability();
-
-    /**
-     * If job should be re-executed if a 'recovery' or 'fail-over' situation is encountered returns true.
-     *
-     * @return true if this job requests recovery
-     */
-    public boolean isRequestsRecovery();
-
-	/**
-	 * If job should be enabled or at all. Useful for testing new jobs and temporarily disabling jobs at the class property level
-	 *
-	 * @return true if this job is enabled
-	 */
-	public boolean isEnabled();
-
-
-	/**
-     * Get job's description used for configuring job details.
-     *
-     * @return description for this job
-     */
-    public String getDescription();
-
-    public Map getTriggers();
-}
diff --git a/src/main/groovy/grails/plugins/quartz/GrailsJobClassConstants.java b/src/main/groovy/grails/plugins/quartz/GrailsJobClassConstants.java
deleted file mode 100644
index 0c9beb8..0000000
--- a/src/main/groovy/grails/plugins/quartz/GrailsJobClassConstants.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (c) 2011 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package grails.plugins.quartz;
-
-import org.quartz.SimpleTrigger;
-
-/**
- * <p>Holds plugin constants.</p>
- *
- * @author Micha?? K??ujszo
- * @author Graeme Rocher
- * @author Marcel Overdijk
- * @author Sergey Nebolsin (nebolsin@gmail.com)
- * @see GrailsJobClass
- * @since 0.1
- */
-public final class GrailsJobClassConstants {
-
-    // restrict instantiation
-    private GrailsJobClassConstants() {}
-
-    public static final String EXECUTE = "execute";
-
-    public static final String INTERRUPT = "interrupt";
-
-    public static final String START_DELAY = "startDelay";
-
-    public static final String CRON_EXPRESSION = "cronExpression";
-
-    public static final String NAME = "name";
-
-    public static final String GROUP = "group";
-
-    public static final String DESCRIPTION = "description";
-
-    public static final String CONCURRENT = "concurrent";
-
-    public static final String SESSION_REQUIRED = "sessionRequired";
-
-    // TODO: deprecated, remove in the next release
-    public static final String TIMEOUT = "timeout";
-
-    public static final String REPEAT_INTERVAL = "repeatInterval";
-
-    public static final String REPEAT_COUNT = "repeatCount";
-
-    public static final String DURABILITY = "durability";
-
-    public static final String REQUESTS_RECOVERY = "requestsRecovery";
-
-	public static final String ENABLED = "jobEnabled";
-
-    // Default values for Job's properties
-
-    public static final long DEFAULT_REPEAT_INTERVAL = 60000l;    // one minute
-
-    public static final long DEFAULT_START_DELAY = 0l;  // no delay by default
-
-    public static final int DEFAULT_REPEAT_COUNT = SimpleTrigger.REPEAT_INDEFINITELY;
-
-    public static final String DEFAULT_CRON_EXPRESSION = "0 0 6 * * ?";
-
-    public static final String DEFAULT_GROUP = "GRAILS_JOBS";
-
-    public static final String DEFAULT_DESCRIPTION = "Grails Job";
-
-    public static final boolean DEFAULT_CONCURRENT = true;
-
-    public static final boolean DEFAULT_SESSION_REQUIRED = true;
-
-    public static final String DEFAULT_TRIGGERS_GROUP = "GRAILS_TRIGGERS";
-
-    public static final boolean DEFAULT_DURABILITY = true;
-
-    public static final boolean DEFAULT_REQUESTS_RECOVERY = false;
-
-	public static final boolean DEFAULT_ENABLED = true;
-}
diff --git a/src/main/groovy/grails/plugins/quartz/GrailsJobFactory.java b/src/main/groovy/grails/plugins/quartz/GrailsJobFactory.java
deleted file mode 100644
index c50bbac..0000000
--- a/src/main/groovy/grails/plugins/quartz/GrailsJobFactory.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Copyright (c) 2011 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package grails.plugins.quartz;
-
-import org.quartz.DisallowConcurrentExecution;
-import org.quartz.InterruptableJob;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-import org.quartz.PersistJobDataAfterExecution;
-import org.quartz.UnableToInterruptJobException;
-import org.quartz.spi.TriggerFiredBundle;
-import org.springframework.beans.BeansException;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.ApplicationContextAware;
-import org.springframework.scheduling.quartz.AdaptableJobFactory;
-import org.springframework.util.ReflectionUtils;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.text.MessageFormat;
-
-/**
- * Job factory which retrieves Job instances from ApplicationContext.
- * <p>
- * It is used by the quartz scheduler to create an instance of the job class for executing.
- * </p>
- * @author Sergey Nebolsin (nebolsin@gmail.com)
- * @since 0.3.2
- */
-public class GrailsJobFactory extends AdaptableJobFactory implements ApplicationContextAware {
-    private ApplicationContext applicationContext;
-
-    @Override
-    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
-        String grailsJobName = (String) bundle.getJobDetail().getJobDataMap().get(
-                JobDetailFactoryBean.JOB_NAME_PARAMETER
-        );
-        if (grailsJobName != null) {
-            return new GrailsJob(applicationContext.getBean(grailsJobName));
-        } else {
-            return super.createJobInstance(bundle);
-        }
-    }
-
-    /**
-     * Quartz Job implementation that invokes execute() on the application's job class.
-     */
-    public static class GrailsJob implements InterruptableJob {
-        private Object job;
-        private Method executeMethod;
-        private Method interruptMethod;
-        boolean passExecutionContext;
-
-        public GrailsJob(Object job) {
-            this.job = job;
-
-            // Finds an execute method with zero or one parameter.
-            this.executeMethod = ReflectionUtils.findMethod(
-                    job.getClass(), GrailsJobClassConstants.EXECUTE, (Class<?>[]) null
-            );
-            if (executeMethod == null) {
-                throw new IllegalArgumentException(
-                        MessageFormat.format(
-                                "{0} should declare #{1}() method",
-                                job.getClass().getName(), GrailsJobClassConstants.EXECUTE
-                        )
-                );
-            }
-            switch (executeMethod.getParameterTypes().length) {
-                case 0:
-                    passExecutionContext = false;
-                    break;
-                case 1:
-                    passExecutionContext = true;
-                    break;
-                default:
-                    throw new IllegalArgumentException(
-                            MessageFormat.format(
-                                    "{0}#{1}() method should take either no arguments or one argument of type JobExecutionContext",
-                                    job.getClass().getName(), GrailsJobClassConstants.EXECUTE
-                            )
-                    );
-            }
-
-            // Find interrupt method
-            this.interruptMethod = ReflectionUtils.findMethod(job.getClass(), GrailsJobClassConstants.INTERRUPT);
-        }
-
-        // Execute Job
-        public void execute(final JobExecutionContext context) throws JobExecutionException {
-            try {
-                if (passExecutionContext) {
-                    executeMethod.invoke(job, context);
-                } else {
-                    executeMethod.invoke(job);
-                }
-            } catch (InvocationTargetException ite) {
-                Throwable targetException = ite.getTargetException();
-                if (targetException instanceof JobExecutionException) {
-                    throw (JobExecutionException) targetException;
-                } else {
-                    throw new JobExecutionException(targetException);
-                }
-            } catch (IllegalAccessException iae) {
-                JobExecutionException criticalError = new JobExecutionException(
-                        MessageFormat.format(
-                                "Cannot invoke {0}#{1}() method",
-                                job.getClass().getName(), executeMethod.getName()
-                        ),
-                        iae
-                );
-                criticalError.setUnscheduleAllTriggers(true);
-                throw criticalError;
-            }
-        }
-
-        // Interrupt Job
-        public void interrupt() throws UnableToInterruptJobException {
-            if (interruptMethod != null) {
-                try {
-                    interruptMethod.invoke(job);
-                } catch (Throwable e) {
-                    throw new UnableToInterruptJobException(e);
-                }
-            } else {
-                throw new UnableToInterruptJobException(job.getClass().getName() + " doesn't support interruption");
-            }
-        }
-
-        /**
-         * It's needed for the quartz-monitor plugin.
-         *
-         * @return the GrailsJobClass object.
-         */
-        @SuppressWarnings("UnusedDeclaration")
-        public Object getJob() {
-            return job;
-        }
-    }
-
-    /**
-     * Extension of the GrailsJob, has concurrent annotations.
-     * Quartz checks whether or not jobs are stateful and if so,
-     * won't let jobs interfere with each other.
-     */
-    @PersistJobDataAfterExecution
-    @DisallowConcurrentExecution
-    public static class StatefulGrailsJob extends GrailsJob {
-        public StatefulGrailsJob(Object job) {
-            super(job);
-        }
-    }
-
-    /**
-     * Override from ApplicationContextAware.
-     */
-    @Override
-    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
-        this.applicationContext = applicationContext;
-    }
-}
diff --git a/src/main/groovy/grails/plugins/quartz/JobArtefactHandler.groovy b/src/main/groovy/grails/plugins/quartz/JobArtefactHandler.groovy
deleted file mode 100644
index 324c607..0000000
--- a/src/main/groovy/grails/plugins/quartz/JobArtefactHandler.groovy
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (c) 2011 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package grails.plugins.quartz
-
-import grails.core.ArtefactHandlerAdapter
-import org.codehaus.groovy.ast.ClassNode
-import org.grails.compiler.injection.GrailsASTUtils
-import org.quartz.JobExecutionContext
-import org.springframework.util.ReflectionUtils
-
-import java.lang.reflect.Method
-import java.util.regex.Pattern
-
-import static org.grails.io.support.GrailsResourceUtils.GRAILS_APP_DIR
-import static org.grails.io.support.GrailsResourceUtils.REGEX_FILE_SEPARATOR
-
-/**
- * Grails artifact handler for job classes.
- *
- * @author Marc Palmer (marc@anyware.co.uk)
- * @author Sergey Nebolsin (nebolsin@gmail.com)
- * @since 0.1
- */
-public class JobArtefactHandler extends ArtefactHandlerAdapter {
-
-    static final String TYPE = "Job"
-    public static Pattern JOB_PATH_PATTERN = Pattern.compile(".+" + REGEX_FILE_SEPARATOR + GRAILS_APP_DIR + REGEX_FILE_SEPARATOR + "jobs" + REGEX_FILE_SEPARATOR + "(.+)\\.(groovy)");
-
-    public JobArtefactHandler() {
-        super(TYPE, GrailsJobClass.class, DefaultGrailsJobClass.class, TYPE)
-    }
-
-    boolean isArtefact(ClassNode classNode) {
-        if(classNode == null ||
-           !isValidArtefactClassNode(classNode, classNode.getModifiers()) ||
-           !classNode.getName().endsWith(DefaultGrailsJobClass.JOB) ||
-           !classNode.getMethods(GrailsJobClassConstants.EXECUTE)) {
-            return false
-        }
-
-        URL url = GrailsASTUtils.getSourceUrl(classNode)
-
-        url &&  JOB_PATH_PATTERN.matcher(url.getFile()).find()
-    }
-
-    boolean isArtefactClass(Class clazz) {
-        // class shouldn't be null and should ends with Job suffix
-        if (clazz == null || !clazz.getName().endsWith(DefaultGrailsJobClass.JOB)) return false
-        // and should have one of execute() or execute(JobExecutionContext) methods defined
-        Method method = ReflectionUtils.findMethod(clazz, GrailsJobClassConstants.EXECUTE)
-        if (method == null) {
-            // we're using Object as a param here to allow groovy-style 'def execute(param)' method
-            method = ReflectionUtils.findMethod(clazz, GrailsJobClassConstants.EXECUTE, [Object] as Class[])
-        }
-        if (method == null) {
-            // also check for the execution context as a variable because that's what's being passed
-            method = ReflectionUtils.findMethod(clazz, GrailsJobClassConstants.EXECUTE, [JobExecutionContext] as Class[])
-        }
-        method != null
-    }
-}
diff --git a/src/main/groovy/grails/plugins/quartz/JobDescriptor.groovy b/src/main/groovy/grails/plugins/quartz/JobDescriptor.groovy
deleted file mode 100644
index e871c76..0000000
--- a/src/main/groovy/grails/plugins/quartz/JobDescriptor.groovy
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (c) 2011 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package grails.plugins.quartz
-
-import groovy.transform.CompileStatic
-import org.quartz.JobDetail
-import org.quartz.Scheduler
-import org.quartz.Trigger
-
-/**
- * JobDescriptor that stores information about the Quartz job to show on webapp.
- *
- * @author Marco Mornati (mmornati@byte-code.com)
- * @author Sergey Nebolsin (nebolsin@gmail.com)
- *
- * @since 0.4
- */
-@CompileStatic
-class JobDescriptor {
-    JobDetail jobDetail
-
-    List<TriggerDescriptor> triggerDescriptors
-
-    static build(JobDetail jobDetail, Scheduler scheduler) {
-        def job = new JobDescriptor(jobDetail: jobDetail)
-        job.triggerDescriptors = (List <TriggerDescriptor>)scheduler.getTriggersOfJob(jobDetail.key).collect { trigger ->
-            TriggerDescriptor.build(job, (Trigger)trigger, scheduler)
-        }
-        return job
-    }
-
-    String getName() {
-        jobDetail.key.name
-    }
-
-    String getGroup() {
-        jobDetail.key.group
-    }
-}
\ No newline at end of file
diff --git a/src/main/groovy/grails/plugins/quartz/JobDetailFactoryBean.java b/src/main/groovy/grails/plugins/quartz/JobDetailFactoryBean.java
deleted file mode 100644
index d7f759f..0000000
--- a/src/main/groovy/grails/plugins/quartz/JobDetailFactoryBean.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright (c) 2011 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package grails.plugins.quartz;
-
-import org.quartz.JobDetail;
-import org.springframework.beans.factory.FactoryBean;
-import org.springframework.beans.factory.InitializingBean;
-
-import static org.quartz.JobBuilder.newJob;
-
-/**
- * Simplified version of Spring's <a href='http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/scheduling/quartz/MethodInvokingJobDetailFactoryBean.html'>MethodInvokingJobDetailFactoryBean</a>
- * that avoids issues with non-serializable classes (for JDBC storage).
- *
- * @author <a href='mailto:burt@burtbeckwith.com'>Burt Beckwith</a>
- * @author Sergey Nebolsin (nebolsin@gmail.com)
- * @since 0.3.2
- */
-public class JobDetailFactoryBean implements FactoryBean<JobDetail>, InitializingBean {
-    public static final transient String JOB_NAME_PARAMETER = "org.grails.plugins.quartz.grailsJobName";
-
-    // Properties
-    private GrailsJobClass jobClass;
-
-    // Returned object
-    private JobDetail jobDetail;
-
-
-    public void setJobClass(GrailsJobClass jobClass) {
-        this.jobClass = jobClass;
-    }
-
-    /**
-     * {@inheritDoc}
-     *
-     * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
-     */
-    public void afterPropertiesSet() {
-        String name = jobClass.getFullName();
-        if (name == null) {
-            throw new IllegalStateException("name is required");
-        }
-
-        String group = jobClass.getGroup();
-        if (group == null) {
-            throw new IllegalStateException("group is required");
-        }
-
-        // Consider the concurrent flag to choose between stateful and stateless job.
-        Class<? extends GrailsJobFactory.GrailsJob> clazz =
-                jobClass.isConcurrent() ? GrailsJobFactory.GrailsJob.class : GrailsJobFactory.StatefulGrailsJob.class;
-
-        // Build JobDetail instance.
-        jobDetail =
-                newJob(clazz)
-                        .withIdentity(name, group)
-                        .storeDurably(jobClass.isDurability())
-                        .requestRecovery(jobClass.isRequestsRecovery())
-                        .usingJobData(JOB_NAME_PARAMETER, name)
-                        .withDescription(jobClass.getDescription())
-                        .build();
-    }
-
-    /**
-     * {@inheritDoc}
-     *
-     * @see org.springframework.beans.factory.FactoryBean#getObject()
-     */
-    @Override
-    public JobDetail getObject() {
-        return jobDetail;
-    }
-
-    /**
-     * {@inheritDoc}
-     *
-     * @see org.springframework.beans.factory.FactoryBean#getObjectType()
-     */
-    @Override
-    public Class<JobDetail> getObjectType() {
-        return JobDetail.class;
-    }
-
-    /**
-     * {@inheritDoc}
-     *
-     * @see org.springframework.beans.factory.FactoryBean#isSingleton()
-     */
-    @Override
-    public boolean isSingleton() {
-        return true;
-    }
-}
diff --git a/src/main/groovy/grails/plugins/quartz/QuartzJob.groovy b/src/main/groovy/grails/plugins/quartz/QuartzJob.groovy
deleted file mode 100644
index 2ca19c4..0000000
--- a/src/main/groovy/grails/plugins/quartz/QuartzJob.groovy
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright 2015 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package grails.plugins.quartz
-
-import grails.core.GrailsApplication
-import grails.core.support.GrailsApplicationAware
-import groovy.transform.CompileDynamic
-import groovy.transform.CompileStatic
-import org.quartz.JobDataMap
-import org.quartz.JobKey
-import org.quartz.Scheduler
-import org.quartz.SimpleTrigger
-import org.quartz.Trigger
-import org.quartz.TriggerKey
-import org.quartz.spi.MutableTrigger
-import org.springframework.util.Assert
-
-@CompileStatic
-trait QuartzJob implements GrailsApplicationAware {
-    private static Scheduler internalScheduler
-    private static GrailsJobClass internalJobArtefact
-
-    GrailsApplication grailsApplication
-
-    static triggerNow(Map params = null) {
-        internalScheduler.triggerJob(new JobKey(this.getName(), internalJobArtefact.group), params ? new JobDataMap(params) : null)
-    }
-
-    @CompileDynamic
-    static schedule(Long repeatInterval, Integer repeatCount = SimpleTrigger.REPEAT_INDEFINITELY, Map params = null) {
-        internalScheduleTrigger(TriggerUtils.buildSimpleTrigger(this.getName(), internalJobArtefact.group, repeatInterval, repeatCount), params)
-    }
-
-    @CompileDynamic
-    static schedule(Date scheduleDate, Map params = null) {
-        internalScheduleTrigger(TriggerUtils.buildDateTrigger(this.getName(), internalJobArtefact.group, scheduleDate), params)
-    }
-
-    @CompileDynamic
-    static schedule(String cronExpression, Map params = null) {
-        internalScheduleTrigger(TriggerUtils.buildCronTrigger(this.getName(), internalJobArtefact.group, cronExpression), params)
-    }
-
-    static schedule(Trigger trigger, Map params = null) {
-        def jobKey = new JobKey(this.getName(), internalJobArtefact.group)
-        Assert.isTrue trigger.jobKey == jobKey || (trigger instanceof MutableTrigger),
-                "The trigger job key is not equal to the job key or the trigger is immutable"
-
-        ((MutableTrigger)trigger).jobKey = jobKey
-
-        if (params) {
-            trigger.jobDataMap.putAll(params)
-        }
-        internalScheduler.scheduleJob(trigger)
-    }
-
-    static removeJob() {
-        internalScheduler.deleteJob(new JobKey(this.getName(), internalJobArtefact.group))
-    }
-
-    static reschedule(Trigger trigger, Map params = null) {
-        if (params) trigger.jobDataMap.putAll(params)
-        internalScheduler.rescheduleJob(trigger.key, trigger)
-    }
-
-    static unschedule(String triggerName, String triggerGroup = GrailsJobClassConstants.DEFAULT_TRIGGERS_GROUP) {
-        internalScheduler.unscheduleJob(TriggerKey.triggerKey(triggerName, triggerGroup))
-    }
-
-    private static internalScheduleTrigger(Trigger trigger, Map params = null) {
-        if (params) {
-            trigger.jobDataMap.putAll(params)
-        }
-        internalScheduler.scheduleJob(trigger)
-    }
-
-    public static setScheduler(Scheduler scheduler) {
-        internalScheduler = scheduler
-    }
-
-    public static setGrailsJobClass(GrailsJobClass gjc) {
-        internalJobArtefact = gjc
-    }
-}
diff --git a/src/main/groovy/grails/plugins/quartz/QuartzJobTraitInjector.groovy b/src/main/groovy/grails/plugins/quartz/QuartzJobTraitInjector.groovy
deleted file mode 100644
index 2edc04e..0000000
--- a/src/main/groovy/grails/plugins/quartz/QuartzJobTraitInjector.groovy
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright 2015 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package grails.plugins.quartz
-
-import grails.compiler.traits.TraitInjector
-import groovy.transform.CompileStatic
-
-@CompileStatic
-class QuartzJobTraitInjector implements TraitInjector {
-
-    @Override
-    Class getTrait() {
-        QuartzJob
-    }
-
-    @Override
-    String[] getArtefactTypes() {
-        [DefaultGrailsJobClass.JOB] as String[]
-    }
-}
diff --git a/src/main/groovy/grails/plugins/quartz/TriggerDescriptor.groovy b/src/main/groovy/grails/plugins/quartz/TriggerDescriptor.groovy
deleted file mode 100644
index da33404..0000000
--- a/src/main/groovy/grails/plugins/quartz/TriggerDescriptor.groovy
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2011 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package grails.plugins.quartz
-
-import groovy.transform.CompileStatic
-import org.quartz.Scheduler
-import org.quartz.Trigger
-
-/**
- * TriggerDescriptor that stores information about the Quartz trigger to show on webapp.
- *
- * @author Sergey Nebolsin (nebolsin@gmail.com)
- *
- * @since 1.0
- */
-@CompileStatic
-class TriggerDescriptor {
-    JobDescriptor jobDescriptor
-
-    Trigger trigger
-
-    Trigger.TriggerState state
-
-    static build(JobDescriptor jobDescriptor, Trigger trigger, Scheduler scheduler) {
-        def result = new TriggerDescriptor(jobDescriptor: jobDescriptor, trigger: trigger)
-        result.state = scheduler.getTriggerState(trigger.key)
-        return result
-    }
-
-    String getName() {
-        trigger.key.name
-    }
-
-    String getGroup() {
-        trigger.key.group
-    }
-}
diff --git a/src/main/groovy/grails/plugins/quartz/TriggerUtils.groovy b/src/main/groovy/grails/plugins/quartz/TriggerUtils.groovy
deleted file mode 100644
index ff97e71..0000000
--- a/src/main/groovy/grails/plugins/quartz/TriggerUtils.groovy
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright 2015 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package grails.plugins.quartz
-
-import groovy.transform.CompileStatic
-import org.quartz.CronScheduleBuilder
-import org.quartz.CronTrigger
-import org.quartz.SimpleScheduleBuilder
-import org.quartz.SimpleTrigger
-import org.quartz.Trigger
-import org.quartz.TriggerBuilder
-
-/**
- * The util class which helps to build triggers for schedule methods.
- *
- * @author Vitalii Samolovskikh aka Kefir
- */
-@CompileStatic
-class TriggerUtils {
-    private static String generateTriggerName() {
-        "GRAILS_" + UUID.randomUUID().toString()
-    }
-
-    static Trigger buildDateTrigger(String jobName, String jobGroup, Date scheduleDate) {
-        return TriggerBuilder.newTrigger()
-                .withIdentity(generateTriggerName(), GrailsJobClassConstants.DEFAULT_TRIGGERS_GROUP)
-                .withPriority(6)
-                .forJob(jobName, jobGroup)
-                .startAt(scheduleDate)
-                .build()
-    }
-
-    static SimpleTrigger buildSimpleTrigger(String jobName, String jobGroup, long repeatInterval, int repeatCount) {
-        return TriggerBuilder.newTrigger()
-                .withIdentity(generateTriggerName(), GrailsJobClassConstants.DEFAULT_TRIGGERS_GROUP)
-                .withPriority(6)
-                .forJob(jobName, jobGroup)
-                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInMilliseconds(repeatInterval).withRepeatCount(repeatCount))
-                .build()
-    }
-
-    static CronTrigger buildCronTrigger(String jobName, String jobGroup, String cronExpression) {
-        return TriggerBuilder.newTrigger()
-                .withIdentity(generateTriggerName(), GrailsJobClassConstants.DEFAULT_TRIGGERS_GROUP)
-                .withPriority(6)
-                .forJob(jobName, jobGroup)
-                .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression))
-                .build()
-    }
-}
diff --git a/src/main/groovy/grails/plugins/quartz/cleanup/JdbcCleanup.groovy b/src/main/groovy/grails/plugins/quartz/cleanup/JdbcCleanup.groovy
deleted file mode 100644
index 61f4def..0000000
--- a/src/main/groovy/grails/plugins/quartz/cleanup/JdbcCleanup.groovy
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *  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
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package grails.plugins.quartz.cleanup
-
-import groovy.sql.Sql
-import groovy.util.logging.Slf4j
-import jakarta.annotation.PostConstruct;
-
-
-
-/**
- * Contributed by Rocketmiles
- * This class can purge all of the quartz tables on startup if you set the config flag quartz.purgeQuartzTablesOnStartup = true
- * Mostly used for testing or development purposes. It is not recommended you use this for production as you can
- * miss missfire recoveries, persisted jobs/triggers, etc.
- */
-
-@Slf4j
-public class JdbcCleanup {
-
-    def dataSource
-
-    @PostConstruct
-    void init() {
-
-        log.info "[quartz-plugin] Purging Quartz tables...."
-
-        def queries = []
-        queries.add("DELETE FROM QRTZ_FIRED_TRIGGERS")
-        queries.add("DELETE FROM QRTZ_PAUSED_TRIGGER_GRPS")
-        queries.add("DELETE FROM QRTZ_SCHEDULER_STATE")
-        queries.add("DELETE FROM QRTZ_LOCKS")
-        queries.add("DELETE FROM QRTZ_SIMPLE_TRIGGERS")
-        queries.add("DELETE FROM QRTZ_SIMPROP_TRIGGERS")
-        queries.add("DELETE FROM QRTZ_CRON_TRIGGERS")
-        queries.add("DELETE FROM QRTZ_BLOB_TRIGGERS")
-        queries.add("DELETE FROM QRTZ_TRIGGERS")
-        queries.add("DELETE FROM QRTZ_JOB_DETAILS")
-        queries.add("DELETE FROM QRTZ_CALENDARS")
-
-        def sql = new Sql(dataSource)
-        queries.each { query ->
-                log.info("Executing " + query)
-            sql.execute(query)
-        }
-
-
-    }
-}
diff --git a/src/main/groovy/grails/plugins/quartz/config/TriggersConfigBuilder.groovy b/src/main/groovy/grails/plugins/quartz/config/TriggersConfigBuilder.groovy
deleted file mode 100644
index 59d615c..0000000
--- a/src/main/groovy/grails/plugins/quartz/config/TriggersConfigBuilder.groovy
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- * Copyright (c) 2011 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package grails.plugins.quartz.config
-
-import grails.plugins.quartz.CustomTriggerFactoryBean
-import grails.plugins.quartz.GrailsJobClassConstants as Constants
-import grails.util.GrailsUtil
-import grails.core.GrailsApplication
-import org.quartz.CronExpression
-import org.quartz.SimpleTrigger
-import org.quartz.Trigger
-import org.quartz.impl.triggers.CronTriggerImpl
-import org.quartz.impl.triggers.SimpleTriggerImpl
-
-/**
- * Groovy Builder for parsing triggers configuration info.
- *
- * @author Sergey Nebolsin (nebolsin@gmail.com)
- *
- * @since 0.3
- */
-class TriggersConfigBuilder extends BuilderSupport {
-    private triggerNumber = 0
-    private jobName
-	GrailsApplication grailsApplication
-    def triggers = [:]
-
-    TriggersConfigBuilder(String jobName, GrailsApplication grailsApplication) {
-        this.jobName = jobName
-		this.grailsApplication = grailsApplication
-    }
-
-    /**
-     * Evaluate triggers closure
-     */
-    def build(closure) {
-        closure.delegate = this
-        closure.call()
-        return triggers
-    }
-
-    /**
-     * Create a trigger.
-     *
-     * @param name the name of the method to create trigger. It's trigger type: simple, cron, custom.
-     * @param attributes trigger attributes
-     * @return trigger definitions
-     */
-    Expando createTrigger(name, Map attributes) {
-        def triggerClass
-
-        def triggerAttributes = attributes ? new HashMap(attributes) : [:]
-
-        prepareCommonTriggerAttributes(triggerAttributes)
-
-        String triggerType = normalizeTriggerType(name)
-
-        switch (triggerType) {
-            case 'simple':
-                triggerClass = SimpleTriggerImpl
-                prepareSimpleTriggerAttributes(triggerAttributes)
-                break
-            case 'cron':
-                triggerClass = CronTriggerImpl
-                prepareCronTriggerAttributes(triggerAttributes)
-                break
-            case 'custom':
-                if (!triggerAttributes?.triggerClass) {
-                    throw new Exception("Custom trigger must have 'triggerClass' attribute")
-                }
-                triggerClass = (Class) triggerAttributes.remove('triggerClass')
-                if (!Trigger.isAssignableFrom(triggerClass)){
-                    throw new Exception("Custom trigger class must implement org.quartz.Trigger class.")
-                }
-                break
-            default:
-                throw new Exception("Invalid format")
-        }
-
-        new Expando(clazz: CustomTriggerFactoryBean, triggerClass: triggerClass, triggerAttributes: triggerAttributes)
-    }
-
-    /**
-     * Convert old trigger types' names
-     *
-     * @param old or new trigger type
-     * @return new trigger type
-     */
-    private String normalizeTriggerType(name) {
-        def triggerType = name
-
-        if (triggerType == 'simpleTrigger') {
-            GrailsUtil.deprecated("You're using deprecated 'simpleTrigger' construction in the ${jobName}, use 'simple' instead.")
-            triggerType = 'simple'
-        } else if (triggerType == 'cronTrigger') {
-            GrailsUtil.deprecated("You're using deprecated 'cronTrigger' construction in the ${jobName}, use 'cron' instead.")
-            triggerType = 'cron'
-        } else if (triggerType == 'customTrigger') {
-            GrailsUtil.deprecated("You're using deprecated 'customTrigger' construction in the ${jobName}, use 'custom' instead.")
-            triggerType = 'custom'
-        }
-        triggerType
-    }
-
-    private prepareCommonTriggerAttributes(Map triggerAttributes) {
-        def prepare = prepareTriggerAttribute.curry(triggerAttributes)
-
-        if(triggerAttributes[Constants.NAME] == null) {
-            triggerAttributes[Constants.NAME] = "${jobName}${triggerNumber++}".toString()
-        }
-
-        prepare(Constants.GROUP, Constants.DEFAULT_TRIGGERS_GROUP.toString())
-        prepare(
-                Constants.START_DELAY,
-                Constants.DEFAULT_START_DELAY,
-                {
-                    if (!(it instanceof Integer || it instanceof Long)) {
-                        throw new IllegalArgumentException(
-                                "startDelay trigger property in the job class ${jobName} must be Integer or Long"
-                        )
-                    }
-                    if (((Number) it).longValue() < 0) {
-                        throw new IllegalArgumentException(
-                                "startDelay trigger property in the job class ${jobName} is negative (possibly integer overflow error)"
-                        )
-                    }
-                }
-        )
-    }
-
-    private prepareSimpleTriggerAttributes(Map triggerAttributes) {
-        def prepare = prepareTriggerAttribute.curry(triggerAttributes)
-
-        // Process the old deprecated property "timeout"
-        if (triggerAttributes[Constants.TIMEOUT] != null) {
-            GrailsUtil.deprecated("You're using deprecated 'timeout' property in the ${jobName}, use 'repeatInterval' instead")
-
-            if (!(triggerAttributes[Constants.TIMEOUT] instanceof Integer || triggerAttributes[Constants.TIMEOUT] instanceof Long)) {
-                throw new IllegalArgumentException(
-                        "timeout trigger property in the job class ${jobName} must be Integer or Long"
-                )
-            }
-            if (((Number) triggerAttributes[Constants.TIMEOUT]).longValue() < 0) {
-                throw new IllegalArgumentException(
-                        "timeout trigger property for job class ${jobName} is negative (possibly integer overflow error)"
-                )
-            }
-            triggerAttributes[Constants.REPEAT_INTERVAL] = triggerAttributes.remove(Constants.TIMEOUT)
-        }
-
-        // Validate repeat interval
-        prepare(
-                Constants.REPEAT_INTERVAL,
-                Constants.DEFAULT_REPEAT_INTERVAL,
-                {
-                    if (!(it instanceof Integer || it instanceof Long)) {
-                        throw new IllegalArgumentException("repeatInterval trigger property in the job class ${jobName} must be Integer or Long")
-                    }
-                    if (((Number) it).longValue() < 0) {
-                        throw new IllegalArgumentException("repeatInterval trigger property for job class ${jobName} is negative (possibly integer overflow error)")
-                    }
-                }
-        )
-
-        // Validate repeat count
-        prepare(
-                Constants.REPEAT_COUNT,
-                Constants.DEFAULT_REPEAT_COUNT,
-                {
-                    if (!(it instanceof Integer || it instanceof Long)) {
-                        throw new IllegalArgumentException(
-                                "repeatCount trigger property in the job class ${jobName} must be Integer or Long"
-                        )
-                    }
-                    if (((Number) it).longValue() < 0 && ((Number) it).longValue() != SimpleTrigger.REPEAT_INDEFINITELY) {
-                        throw new IllegalArgumentException(
-                                "repeatCount trigger property for job class ${jobName} is negative (possibly integer overflow error)"
-                        )
-                    }
-                }
-        )
-    }
-
-    private prepareCronTriggerAttributes(Map triggerAttributes) {
-        prepareTriggerAttribute(
-                triggerAttributes,
-                Constants.CRON_EXPRESSION,
-                Constants.DEFAULT_CRON_EXPRESSION,
-                {
-                    if (!CronExpression.isValidExpression(it.toString())) {
-                        throw new IllegalArgumentException(
-                                "Cron expression '${it}' in the job class ${jobName} is not a valid cron expression"
-                        )
-                    }
-                }
-        )
-    }
-
-    private prepareTriggerAttribute = {Map attributes, String name, defaultValue, validate = {} ->
-        if(attributes[name] == null){
-            attributes[name] = defaultValue
-        }
-        validate(attributes[name])
-    }
-
-    /**
-     * Does nothing. Implements the BuilderSupport method.
-     */
-    protected void setParent(parent, child) {
-        // Nothing!
-    }
-
-    /**
-     * Implements the BuilderSupport method.
-     */
-    protected createNode(name) {
-        createNode(name, null, null)
-    }
-
-    /**
-     * Implements the BuilderSupport method.
-     */
-    protected createNode(name, value) {
-        createNode(name, null, value)
-    }
-
-    /**
-     * Implements the BuilderSupport method.
-     */
-    protected createNode(name, Map attributes) {
-        createNode(name, attributes, null)
-    }
-
-    /**
-     * Create a trigger. Implements the BuilderSupport method.
-     */
-    protected Object createNode(name, Map attributes, Object value) {
-        def trigger = createTrigger(name, attributes)
-        triggers[trigger.triggerAttributes.name.toString()] = trigger
-        trigger
-    }
-}
diff --git a/src/main/groovy/grails/plugins/quartz/listeners/ExceptionPrinterJobListener.java b/src/main/groovy/grails/plugins/quartz/listeners/ExceptionPrinterJobListener.java
deleted file mode 100644
index e186b1e..0000000
--- a/src/main/groovy/grails/plugins/quartz/listeners/ExceptionPrinterJobListener.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (c) 2011-2025 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package grails.plugins.quartz.listeners;
-
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-import org.quartz.listeners.JobListenerSupport;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * JobListener implementation which logs an exceptions occurred during job's execution.
- *
- * @author Sergey Nebolsin (nebolsin@gmail.com)
- * @since 0.2
- */
-public class ExceptionPrinterJobListener extends JobListenerSupport {
-
-    private static final Logger LOG = LoggerFactory.getLogger(ExceptionPrinterJobListener.class);
-
-    public static final String NAME = "exceptionPrinterListener";
-
-    public String getName() {
-        return NAME;
-    }
-
-    public void jobWasExecuted(JobExecutionContext context, JobExecutionException exception) {
-        if (exception != null) {
-            LOG.error("Exception occurred in job: " + context.getJobDetail().getDescription(), exception);
-        }
-    }
-}
\ No newline at end of file
diff --git a/src/main/groovy/grails/plugins/quartz/listeners/SessionBinderJobListener.java b/src/main/groovy/grails/plugins/quartz/listeners/SessionBinderJobListener.java
deleted file mode 100644
index 33079d9..0000000
--- a/src/main/groovy/grails/plugins/quartz/listeners/SessionBinderJobListener.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (c) 2011-2025 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package grails.plugins.quartz.listeners;
-
-import grails.persistence.support.PersistenceContextInterceptor;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-import org.quartz.listeners.JobListenerSupport;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * JobListener implementation which wraps the execution of a Quartz Job in a
- * persistence context, via the persistenceInterceptor.
- *
- * @author Sergey Nebolsin (nebolsin@gmail.com)
- * @since 0.2
- */
-public class SessionBinderJobListener extends JobListenerSupport {
-
-    private static final Logger LOG = LoggerFactory.getLogger(SessionBinderJobListener.class);
-
-    public static final String NAME = "sessionBinderListener";
-
-    private PersistenceContextInterceptor persistenceInterceptor;
-
-    public String getName() {
-        return NAME;
-    }
-
-    /**
-     * It is used by the Spring to inject a persistence interceptor.
-	 * @return the reference of the currently active bean implementation of persistenceInterceptor
-     */
-    @SuppressWarnings("UnusedDeclaration")
-    public PersistenceContextInterceptor getPersistenceInterceptor() {
-        return persistenceInterceptor;
-    }
-
-    /**
-     * It is used by the Spring to inject a persistence interceptor.
-	 * @param persistenceInterceptor - Normally applied by bean injection to set the reference to the persistenceInterceptor
-     */
-    @SuppressWarnings("UnusedDeclaration")
-    public void setPersistenceInterceptor(PersistenceContextInterceptor persistenceInterceptor) {
-        this.persistenceInterceptor = persistenceInterceptor;
-    }
-
-    /**
-     * Before job executing. Init persistence context.
-     */
-    public void jobToBeExecuted(JobExecutionContext context) {
-        if (persistenceInterceptor != null) {
-            persistenceInterceptor.init();
-            LOG.debug("Persistence session is opened.");
-        }
-    }
-
-    /**
-     * After job executing. Flush and destroy persistence context.
-     */
-    public void jobWasExecuted(JobExecutionContext context, JobExecutionException exception) {
-        if (persistenceInterceptor != null) {
-            try {
-                persistenceInterceptor.flush();
-                persistenceInterceptor.clear();
-                LOG.debug("Persistence session is flushed.");
-            } catch (Exception e) {
-                LOG.error("Failed to flush session after job: " + context.getJobDetail().getDescription(), e);
-            } finally {
-                try {
-                    persistenceInterceptor.destroy();
-                } catch (Exception e) {
-                    LOG.error("Failed to finalize session after job: " + context.getJobDetail().getDescription(), e);
-                }
-            }
-        }
-    }
-}
diff --git a/src/main/groovy/quartz/QuartzGrailsPlugin.groovy b/src/main/groovy/quartz/QuartzGrailsPlugin.groovy
deleted file mode 100644
index 5403524..0000000
--- a/src/main/groovy/quartz/QuartzGrailsPlugin.groovy
+++ /dev/null
@@ -1,363 +0,0 @@
-/*
- * Copyright 2015-2025 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package quartz
-
-import grails.plugins.Plugin
-import grails.plugins.quartz.*
-import grails.plugins.quartz.cleanup.JdbcCleanup
-import grails.plugins.quartz.listeners.ExceptionPrinterJobListener
-import grails.plugins.quartz.listeners.SessionBinderJobListener
-import groovy.util.logging.Slf4j
-import org.quartz.*
-import org.quartz.impl.matchers.GroupMatcher
-import org.quartz.impl.matchers.KeyMatcher
-import org.springframework.beans.factory.config.MethodInvokingFactoryBean
-import org.springframework.context.ApplicationContext
-import org.springframework.scheduling.quartz.SchedulerFactoryBean
-
-@Slf4j
-class QuartzGrailsPlugin extends Plugin {
-
-    def grailsVersion = '7.0.0-SNAPSHOT > *'
-	def watchedResources = 'file:./grails-app/jobs/**/*Job.groovy'
-	def title = 'Quartz'
-	def author = 'Jeff Brown'
-    def description = 'Adds Quartz job scheduling features'
-    def profiles = ['web']
-    List loadAfter = ['hibernate3', 'hibernate4', 'hibernate5', 'services']
-    def documentation = 'https://apache.github.io/grails-quartz/latest/'
-    def license = 'APACHE'
-    def issueManagement = [ system: 'Github Issues', url: 'https://github.com/apache/grails-quartz/issues' ]
-
-    // Any additional developers beyond the author specified above.
-    def developers = [
-            [name: 'Sergey Nebolsin', email: 'nebolsin@gmail.com'],
-            [name: 'Graeme Rocher', email: 'graeme.rocher@gmail.com'],
-            [name: 'Ryan Vanderwerf', email: 'rvanderwerf@gmail.com'],
-            [name: 'Vitalii Samolovskikh', email: 'kefir@perm.ru']
-    ]
-
-    // Online location of the plugin's browsable source code.
-    def scm = [url: 'https://github.com/apache/grails-quartz']
-
-    Closure doWithSpring() {
-
-                { ->
-            Properties properties = loadQuartzProperties()
-
-
-            boolean hasHibernate = hasHibernate(manager)
-            def hasJdbcStore = properties['org.quartz.jdbcStore']?.toBoolean()
-            if (hasJdbcStore==null) {
-                hasJdbcStore = true
-            }
-
-            def pluginEnabled = properties['org.quartz.pluginEnabled']?.toBoolean()
-            if (pluginEnabled==null) {
-                pluginEnabled = true
-            }
-
-            if (pluginEnabled) {
-                def purgeTables = properties['org.quartz.purgeQuartzTablesOnStartup']?.toBoolean()
-
-                if (purgeTables==null) {
-                    purgeTables = false
-                }
-
-                if (hasJdbcStore && hasHibernate && purgeTables) {
-                    purgeTablesBean(JdbcCleanup) { bean ->
-                        dataSource = ref(properties['org.quartz.jdbcStoreDataSource'] ?: 'dataSource')
-                        bean.autowire = 'byName'
-                    }
-                }
-                // Configure job beans
-                grailsApplication.jobClasses.each { GrailsJobClass jobClass ->
-                    configureJobBeans.delegate = delegate
-                    configureJobBeans(jobClass, hasHibernate)
-                }
-
-                // Configure the session listener if there is the Hibernate is configured
-                if (hasHibernate) {
-                    log.debug("Registering hibernate SessionBinderJobListener")
-
-                    // register SessionBinderJobListener to bind Hibernate Session to each Job's thread
-                    "${SessionBinderJobListener.NAME}"(SessionBinderJobListener) { bean ->
-                        bean.autowire = "byName"
-                    }
-                }
-
-                // register global ExceptionPrinterJobListener which will log exceptions occured
-                // during job's execution
-                "${ExceptionPrinterJobListener.NAME}"(ExceptionPrinterJobListener)
-
-                // Configure the job factory to create job instances on executions.
-                quartzJobFactory(GrailsJobFactory)
-
-                // Configure Scheduler
-                configureScheduler.delegate = delegate
-                configureScheduler()
-            }
-        }
-    }
-
-    /**
-     * Configure job beans.
-     */
-    def configureJobBeans = { GrailsJobClass jobClass, boolean hasHibernate = true ->
-        def fullName = jobClass.fullName
-
-        try {
-            "${fullName}Class"(MethodInvokingFactoryBean) {
-                targetObject = ref("grailsApplication", false)
-                targetMethod = "getArtefact"
-                arguments = [JobArtefactHandler.TYPE, jobClass.fullName]
-            }
-
-            "${fullName}"(ref("${fullName}Class")) { bean ->
-                bean.factoryMethod = "newInstance"
-                bean.autowire = "byName"
-                bean.scope = "prototype"
-            }
-        } catch (Exception e) {
-            log.error("Error declaring ${fullName}Detail bean in context", e)
-        }
-    }
-
-    /**
-     * Loads the quartz stanza from the grails configuration and turns it into a
-     * flattened Properties object suitable for use by the Quartz SchedulerFactoryBean.
-     * @return Quartz properties as defined in the Grails Configuration object
-     */
-    def loadQuartzProperties() {
-        Properties quartzProperties = new Properties()
-        if (config.get('quartz')) {
-            // Convert to a properties file adding a prefix to each property
-            ConfigObject configObject = new ConfigObject()
-            configObject.putAll(config.get('quartz') ?: [:])
-            quartzProperties << configObject.toProperties('org.quartz')
-        }
-        quartzProperties
-    }
-
-    def configureScheduler = { ->
-        Properties properties = loadQuartzProperties()
-        quartzScheduler(SchedulerFactoryBean) { bean ->
-                quartzProperties = properties
-                // The bean name is used by the factory bean as the scheduler name so you must explicitly set it if
-                // you want a name different from the bean name.
-                if (quartzProperties['org.quartz.scheduler.instanceName']) {
-                    schedulerName = properties['org.quartz.scheduler.instanceName']
-                }
-
-                // delay scheduler startup to after-bootstrap stage
-                if (quartzProperties['org.quartz.autoStartup']) {
-                    autoStartup = false // we dont want to auto startup this bean as this bean autostartup is not grails aware.
-                }
-                // Store
-                def hasJdbcStore = quartzProperties['org.quartz.jdbcStore']?.toBoolean()
-                if (hasJdbcStore == null) {
-                    hasJdbcStore = true
-                }
-                if (hasJdbcStore) {
-                    dataSource = ref(quartzProperties['org.quartz.jdbcStoreDataSource'] ?: 'dataSource')
-                    transactionManager = ref('transactionManager')
-                }
-                if (quartzProperties['org.quartz.waitForJobsToCompleteOnShutdown']) {
-                    waitForJobsToCompleteOnShutdown = quartzProperties['org.quartz.waitForJobsToCompleteOnShutdown']?.toBoolean()
-                }
-                if (quartzProperties['org.quartz.exposeSchedulerInRepository']) {
-                    exposeSchedulerInRepository = quartzProperties['org.quartz.exposeSchedulerInRepository']?.toBoolean()
-                }
-
-
-                jobFactory = quartzJobFactory
-
-                // Global listeners on each job.
-                globalJobListeners = [ref(ExceptionPrinterJobListener.NAME)]
-
-
-        }
-    }
-
-	void onChange( Map<String, Object> event) {
-		def pluginEnabled = properties['org.quartz.pluginEnabled']?.toBoolean()
-		if (pluginEnabled==null) {
-			pluginEnabled = true
-		}
-
-		if (pluginEnabled) {
-			if(event.source) {
-				boolean hasHibernate = hasHibernate(manager)
-				def jobClass = grailsApplication.addArtefact(JobArtefactHandler.TYPE,event.source)
-				def jobName = "${jobClass.propertyName}"
-				beans {
-					configureJobBeans.delegate = delegate
-					configureJobBeans(jobClass, hasHibernate)
-				}
-			}
-			refreshJobs(true)
-		}
-	}
-
-    /**
-     * Schedules jobs. Creates job details and trigger beans. And schedules them.
-     */
-    def scheduleJob(GrailsJobClass jobClass, ApplicationContext ctx, boolean hasHibernate) {
-            Scheduler scheduler = ctx.quartzScheduler
-            if (scheduler) {
-                def fullName = jobClass.fullName
-
-                // Creates job details
-                JobDetailFactoryBean jdfb = new JobDetailFactoryBean()
-                jdfb.jobClass = jobClass
-                jdfb.afterPropertiesSet()
-                JobDetail jobDetail = jdfb.object
-
-                // adds the job to the scheduler, and associates triggers with it
-                scheduler.addJob(jobDetail, true)
-                def hasJdbcStore = grailsApplication.config.getProperty('quartz.jdbcStore')?.toBoolean()
-                if (hasJdbcStore == null) {
-                    hasJdbcStore = true
-                }
-
-                // The session listener if is needed
-                if (hasHibernate && (jobClass.sessionRequired || hasJdbcStore)) {
-                    SessionBinderJobListener listener = ctx.getBean(SessionBinderJobListener.NAME)
-                    if (listener != null) {
-                        ListenerManager listenerManager = scheduler.getListenerManager()
-                        KeyMatcher<JobKey> matcher = KeyMatcher.keyEquals(jobDetail.key)
-                        if (listenerManager.getJobListener(listener.getName()) == null) {
-                            listenerManager.addJobListener(listener, matcher)
-                        } else {
-                            listenerManager.addJobListenerMatcher(listener.getName(), matcher)
-                        }
-                    } else {
-                        log.error("The SessionBinderJobListener has not been initialized.")
-                    }
-                }
-
-                // Creates and schedules triggers
-                jobClass.triggers.each { name, Expando descriptor ->
-                    CustomTriggerFactoryBean factory = new CustomTriggerFactoryBean()
-                    factory.triggerClass = descriptor.triggerClass
-                    factory.triggerAttributes = descriptor.triggerAttributes
-                    factory.jobDetail = jobDetail
-                    factory.afterPropertiesSet()
-                    Trigger trigger = factory.object
-
-                    TriggerKey key = trigger.key
-                    log.debug("Scheduling $fullName with trigger $key: ${trigger}")
-                    if (scheduler.getTrigger(key) != null) {
-                        scheduler.rescheduleJob(key, trigger)
-                    } else {
-                        scheduler.scheduleJob(trigger)
-                    }
-                    log.debug("Job ${fullName} scheduled")
-                }
-            } else {
-                log.error("Failed to schedule job details and job triggers: scheduler not found.")
-            }
-        //}
-    }
-
-
-
-	private boolean hasHibernate(manager) {
-        manager?.hasGrailsPlugin("hibernate") ||
-                manager?.hasGrailsPlugin("hibernate3") ||
-                manager?.hasGrailsPlugin("hibernate4") ||
-                manager?.hasGrailsPlugin("hibernate5")
-    }
-
-	void refreshJobs(ignoreErrors=false) {
-		def pluginEnabled = grailsApplication.config.getProperty('quartz.pluginEnabled')?.toBoolean()
-		if (pluginEnabled == null) {
-			pluginEnabled = true
-		}
-		if(pluginEnabled) {
-			def quartzScheduler = applicationContext.quartzScheduler
-
-			Set<JobKey> jobKeys = applicationContext.quartzScheduler.getJobKeys(GroupMatcher.anyGroup())
-
-			//Remove any recently removed / disabled Jobs
-			jobKeys.each { JobKey key ->
-				def match = grailsApplication.jobClasses.find{ GrailsJobClass jobClass -> jobClass.isEnabled() && jobClass.group == key.group && jobClass.clazz.name == key.name }
-				if(!match) {
-					log.info("Removing No longer Active Job: ${key.name}")
-					def triggersForJob = quartzScheduler.getTriggersOfJob(key)?.collect{it.key}
-					if(triggersForJob) {
-						//clean up triggers before we remove the job
-						quartzScheduler.unscheduleJobs(triggersForJob)
-					}
-					quartzScheduler.deleteJob(key)
-				}
-			}
-
-			//Add new jobs
-			grailsApplication.jobClasses.findAll{GrailsJobClass jobClass -> jobClass.isEnabled()}.each { GrailsJobClass jobClass ->
-				try {
-					scheduleJob(jobClass, applicationContext, hasHibernate(manager))
-					def clz = jobClass.clazz
-					clz.scheduler = applicationContext.quartzScheduler
-					clz.grailsJobClass = jobClass
-				} catch(ex) {
-					if(ignoreErrors) {
-						log.error("Error Scheduling Job Class ${jobClass} - ${ex.message}",ex)
-					} else {
-						throw ex
-					}
-				}
-
-			}
-		}
-
-	}
-
-	void onStartup(Map<String, Object> event) {
-		def autoStart = grailsApplication.config.getProperty('quartz.autoStartup')?.toBoolean()
-		if (autoStart == null) {
-			autoStart = true
-		}
-		def pluginEnabled = grailsApplication.config.getProperty('quartz.pluginEnabled')?.toBoolean()
-		if (pluginEnabled == null) {
-			pluginEnabled = true
-		}
-
-		if (pluginEnabled) {
-			refreshJobs()
-			if(autoStart) {
-				applicationContext.quartzScheduler.start()
-				log.info("Quartz Scheduler - Started")
-			}
-		}
-		log.debug("Scheduled Job Classes count: " + grailsApplication.jobClasses.size())
-	}
-
-    void onShutdown(Map<String, Object> event) {
-        def pluginEnabled = grailsApplication.config.getProperty('quartz.pluginEnabled')?.toBoolean()
-        if (pluginEnabled == null) {
-            pluginEnabled = true
-        }
-
-        if (pluginEnabled) {
-            Boolean waitForJobsToCompleteOnShutdown = grailsApplication.config.getProperty('quartz.waitForJobsToCompleteOnShutdown')?.toBoolean()
-            if (waitForJobsToCompleteOnShutdown == null) {
-                waitForJobsToCompleteOnShutdown = true
-            }
-            applicationContext.quartzScheduler.shutdown(waitForJobsToCompleteOnShutdown)
-        }
-    }
-}
diff --git a/src/main/scripts/CreateJob.groovy b/src/main/scripts/CreateJob.groovy
deleted file mode 100644
index 2f8fb3a..0000000
--- a/src/main/scripts/CreateJob.groovy
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2015 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-description("Creates a new Quartz scheduled job") {
-    usage "grails create-job [JOB NAME]"
-    argument name:'Job Name', description:"The name of the job"
-}
-
-model = model(trimTrailingJobFromJobName(args[0]) )
-render  template:"Job.groovy",
-        destination: file( "grails-app/jobs/$model.packagePath/${trimTrailingJobFromJobName(model.simpleName)}Job.groovy"),
-        model: model
-
-/**
- * //if 'Job' already exists in the end of JobName, then remove it from jobName.
- * @param name
- * @return
- */
-String trimTrailingJobFromJobName(String name){
-    String type = "Job"
-    String processedName = name
-    Integer lastIndexOfJOBInJobName = name.lastIndexOf(type)
-    if(lastIndexOfJOBInJobName == (name.length() - type.length())){
-        processedName = name.substring(0, lastIndexOfJOBInJobName)
-    }
-    return processedName
-}
\ No newline at end of file
diff --git a/src/main/templates/Job.groovy b/src/main/templates/Job.groovy
deleted file mode 100644
index 14f1cca..0000000
--- a/src/main/templates/Job.groovy
+++ /dev/null
@@ -1,11 +0,0 @@
-package ${packageName}
-
-class ${className}Job {
-    static triggers = {
-      simple repeatInterval: 5000l // execute job once in 5 seconds
-    }
-
-    def execute() {
-        // execute job
-    }
-}
diff --git a/src/test/groovy/grails/plugins/quartz/CustomTriggerFactoryBeanSpec.groovy b/src/test/groovy/grails/plugins/quartz/CustomTriggerFactoryBeanSpec.groovy
deleted file mode 100644
index 31c977a..0000000
--- a/src/test/groovy/grails/plugins/quartz/CustomTriggerFactoryBeanSpec.groovy
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- *  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
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package grails.plugins.quartz
-
-import grails.plugins.quartz.config.TriggersConfigBuilder
-
-import org.quartz.CronTrigger
-import org.quartz.DailyTimeIntervalTrigger
-import org.quartz.DateBuilder
-import org.quartz.SimpleTrigger
-import org.quartz.TimeOfDay
-import org.quartz.Trigger
-import org.quartz.impl.triggers.DailyTimeIntervalTriggerImpl
-import spock.lang.Specification
-
-/**
- * Tests for CustomTriggerFactoryBean
- *
- * @author Vitalii Samolovskikh aka Kefir
- */
-class CustomTriggerFactoryBeanSpec extends Specification {
-
-    private static final String CRON_EXPRESSION = '0 15 6 * * ?'
-    private static final TimeOfDay START_TIME = new TimeOfDay(10, 0)
-    private static final TimeOfDay END_TIME = new TimeOfDay(11, 30)
-
-    void 'testFactory'() {
-        setup:
-            def builder = new TriggersConfigBuilder('TestJob', null)
-            def closure = {
-                simple name: 'simple', group: 'group', startDelay: 500, repeatInterval: 1000, repeatCount: 3
-                cron name: 'cron', group: 'group', cronExpression: CRON_EXPRESSION
-                custom name: 'custom', group: 'group', triggerClass: DailyTimeIntervalTriggerImpl,
-                        startTimeOfDay: START_TIME, endTimeOfDay: END_TIME,
-                        repeatIntervalUnit: DateBuilder.IntervalUnit.MINUTE, repeatInterval: 5
-            }
-            builder.build(closure)
-
-            Map<String, Trigger> triggers = [:]
-
-            builder.triggers.values().each {
-                CustomTriggerFactoryBean factory = new CustomTriggerFactoryBean()
-                factory.setTriggerClass(it.triggerClass)
-                factory.setTriggerAttributes(it.triggerAttributes)
-                factory.afterPropertiesSet()
-                Trigger trigger = factory.getObject() as Trigger
-                triggers.put(trigger.key.name, trigger)
-            }
-
-        expect:
-            assert triggers['simple'] instanceof SimpleTrigger
-            SimpleTrigger simpleTrigger = triggers['simple'] as SimpleTrigger
-            assert 'simple' == simpleTrigger.key.name
-            assert 'group' == simpleTrigger.key.group
-            assert 1000 == simpleTrigger.repeatInterval
-            assert 3 == simpleTrigger.repeatCount
-
-            assert triggers['cron'] instanceof CronTrigger
-            CronTrigger cronTrigger = triggers['cron'] as CronTrigger
-            assert 'cron' == cronTrigger.key.name
-            assert 'group' == cronTrigger.key.group
-            assert CRON_EXPRESSION == cronTrigger.getCronExpression()
-
-            assert triggers['custom'] instanceof DailyTimeIntervalTrigger
-            DailyTimeIntervalTrigger customTrigger = triggers['custom'] as DailyTimeIntervalTrigger
-            assert 'custom' == customTrigger.key.name
-            assert 'group' == customTrigger.key.group
-            assert START_TIME == customTrigger.startTimeOfDay
-            assert END_TIME == customTrigger.endTimeOfDay
-            assert DateBuilder.IntervalUnit.MINUTE == customTrigger.repeatIntervalUnit
-            assert 5 == customTrigger.repeatInterval
-    }
-}
diff --git a/src/test/groovy/grails/plugins/quartz/DefaultGrailsJobClassSpec.groovy b/src/test/groovy/grails/plugins/quartz/DefaultGrailsJobClassSpec.groovy
deleted file mode 100644
index 9a6d390..0000000
--- a/src/test/groovy/grails/plugins/quartz/DefaultGrailsJobClassSpec.groovy
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (c) 2011 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package grails.plugins.quartz
-
-import spock.lang.Specification
-
-class DefaultGrailsJobClassSpec extends Specification {
-    protected GroovyClassLoader gcl = new GroovyClassLoader()
-
-    def cleanup() {
-        gcl.clearCache()
-    }
-
-    void 'default properties are set correctly'() {
-        setup:
-            def jobClass = gcl.parseClass('class TestJob { def execute(){} }')
-            def grailsJobClass = new DefaultGrailsJobClass(jobClass)
-        expect:
-            assert 'GRAILS_JOBS' == grailsJobClass.group: "Wrong default group"
-            assert grailsJobClass.sessionRequired: "Job should require Hibernate session by default"
-            assert grailsJobClass.concurrent: "Job should be concurrent by default"
-    }
-
-    void 'job class execute method works correctly'() {
-        setup:
-            boolean wasExecuted = false
-            def testClosure = { wasExecuted = true }
-            Class jobClass = gcl.parseClass("""
-                class TestJob {
-                    static testClosure
-                    def execute() {
-                        testClosure.call()
-                    }
-                }
-                """.stripIndent())
-            GrailsJobClass grailsJobClass = new DefaultGrailsJobClass(jobClass)
-            grailsJobClass.referenceInstance.testClosure = testClosure
-        when:
-            grailsJobClass.execute()
-        then:
-            assert wasExecuted: "Job wasn't executed"
-    }
-
-    void 'session required parameter is handled correctly'() {
-        setup:
-            Class jobClass = gcl.parseClass("""
-                class TestJob {
-                    static sessionRequired = false
-                    def execute() {}
-                }
-                """.stripIndent())
-            GrailsJobClass grailsJobClass = new DefaultGrailsJobClass(jobClass)
-        expect:
-            assert !grailsJobClass.sessionRequired: "Hibernate Session shouldn't be required"
-    }
-
-    void 'concurrent parameter is handled correctly'() {
-        setup:
-            Class jobClass = gcl.parseClass("""
-                class TestJob {
-                    static concurrent = false
-                    def execute() {}
-                }
-                """.stripIndent())
-            GrailsJobClass grailsJobClass = new DefaultGrailsJobClass(jobClass)
-        expect:
-            assert !grailsJobClass.concurrent: "Job class shouldn't be marked as concurrent"
-    }
-
-    void 'group parameter is handled correctly'() {
-        setup:
-            Class jobClass = gcl.parseClass("""
-                class TestJob {
-                    static group = 'myGroup'
-                    def execute() {}
-                }
-                """.stripIndent())
-            GrailsJobClass grailsJobClass = new DefaultGrailsJobClass(jobClass)
-        expect:
-            'myGroup' == grailsJobClass.group
-    }
-}
diff --git a/src/test/groovy/grails/plugins/quartz/JobArtefactHandlerSpec.groovy b/src/test/groovy/grails/plugins/quartz/JobArtefactHandlerSpec.groovy
deleted file mode 100644
index fbb3836..0000000
--- a/src/test/groovy/grails/plugins/quartz/JobArtefactHandlerSpec.groovy
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (c) 2011 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package grails.plugins.quartz
-
-import grails.core.ArtefactHandler
-import spock.lang.Specification
-
-/**
- * Test case for Job artefact handler.
- *
- * @author Sergey Nebolsin
- * @since 0.2
- */
-class JobArtefactHandlerSpec extends Specification {
-
-    private ArtefactHandler handler = new JobArtefactHandler()
-    protected GroovyClassLoader gcl = new GroovyClassLoader()
-
-    void 'class with execute() method should be recognized as a Job class'() {
-        setup:
-            Class c = gcl.parseClass("class TestJob { def execute() { }}\n")
-        expect:
-            assert handler.isArtefact(c): "Class *Job which defines execute() method should be recognized as a Job class"
-    }
-
-    void 'class with execute(param) method should be recognized as a Job class'() {
-        setup:
-            Class c = gcl.parseClass("class TestJob { def execute(param) { }}\n")
-        expect:
-            assert handler.isArtefact(c): "Class *Job which defines execute(param) method should be recognized as a Job class"
-    }
-
-    void 'class with wrong name should not be recognized as a Job class'() {
-        setup:
-            Class c = gcl.parseClass("class TestController { def execute() { }}\n")
-        expect:
-            assert !handler.isArtefact(c): "Class which name doesn't end with 'Job' shouldn't be recognized as a Job class"
-    }
-
-    void 'class without execute() method should not be recognized as a Job class'() {
-        setup:
-            Class c = gcl.parseClass("class TestJob { def execute1() { }}\n")
-        expect:
-            assert !handler.isArtefact(c): "Class which doesn't declare 'execute' method shouldn't be recognized as a Job class"
-    }
-
-}
diff --git a/src/test/groovy/grails/plugins/quartz/JobDescriptorSpec.groovy b/src/test/groovy/grails/plugins/quartz/JobDescriptorSpec.groovy
deleted file mode 100644
index af69742..0000000
--- a/src/test/groovy/grails/plugins/quartz/JobDescriptorSpec.groovy
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- *  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
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package grails.plugins.quartz
-
-import org.quartz.*
-import org.quartz.impl.StdSchedulerFactory
-import spock.lang.Specification
-
-/**
- * Unit tests for JobDescriptor.
- *
- * @author Vitalii Samolovskikh aka Kefir
- */
-class JobDescriptorSpec extends Specification {
-
-    private Scheduler scheduler
-    private JobDetail job
-    private Trigger trigger
-
-
-    def setup() {
-        scheduler = StdSchedulerFactory.getDefaultScheduler()
-        scheduler.start()
-        job = JobBuilder.newJob(TestQuartzJob).withIdentity(new JobKey("job", "group")).build()
-        trigger = TriggerBuilder.newTrigger()
-                .withIdentity(new TriggerKey("trigger", "group"))
-                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInMinutes(2).repeatForever())
-                .startNow()
-                .build()
-        scheduler.scheduleJob(job, trigger)
-    }
-
-    def cleanup() {
-        scheduler.shutdown()
-    }
-
-    void 'JobDescriptor builds correctly from a job and scheduler'() {
-        when:
-            JobDescriptor descriptor = JobDescriptor.build(job, scheduler)
-        then:
-            descriptor.name == 'job'
-            descriptor.group == 'group'
-            descriptor.triggerDescriptors.size() == 1
-            descriptor.triggerDescriptors[0].name == 'trigger'
-    }
-
-}
diff --git a/src/test/groovy/grails/plugins/quartz/JobDetailFactoryBeanSpec.groovy b/src/test/groovy/grails/plugins/quartz/JobDetailFactoryBeanSpec.groovy
deleted file mode 100644
index 71a396f..0000000
--- a/src/test/groovy/grails/plugins/quartz/JobDetailFactoryBeanSpec.groovy
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- *  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
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package grails.plugins.quartz
-
-import grails.core.GrailsApplication
-import org.quartz.JobDetail
-import org.quartz.JobKey
-import org.springframework.beans.BeanWrapper
-import spock.lang.Specification
-
-/**
- * Tests for the JobDetailFactoryBean
- *
- * @author Vitalii Samolovskikh aka Kefir
- */
-class JobDetailFactoryBeanSpec extends Specification {
-
-    private static final String JOB_NAME = 'jobName'
-    private static final String JOB_GROUP = 'jobGroup'
-    private static final String JOB_DESCRIPTION = 'The job description'
-    JobDetailFactoryBean factory = new JobDetailFactoryBean()
-
-
-    void 'testFactory1'() {
-        setup:
-            factory.jobClass = new GrailsJobClassMock(
-                    [
-                            fullName        : JOB_NAME,
-                            group           : JOB_GROUP,
-                            concurrent      : true,
-                            durability      : true,
-                            sessionRequired : true,
-                            requestsRecovery: true,
-                            description     : JOB_DESCRIPTION
-                    ]
-            )
-            factory.afterPropertiesSet()
-        when:
-            JobDetail jobDetail = factory.object
-        then:
-            new JobKey(JOB_NAME, JOB_GROUP) == jobDetail.key
-            JOB_NAME == jobDetail.getJobDataMap().get(JobDetailFactoryBean.JOB_NAME_PARAMETER)
-            jobDetail.durable
-            !jobDetail.isConcurrentExecutionDisallowed()
-            !jobDetail.persistJobDataAfterExecution
-            jobDetail.requestsRecovery()
-            JOB_DESCRIPTION == jobDetail.description
-    }
-
-    void 'testFactory2'() {
-        setup:
-            factory.jobClass = new GrailsJobClassMock(
-                    [
-                            fullName        : JOB_NAME,
-                            group           : JOB_GROUP,
-                            concurrent      : false,
-                            durability      : false,
-                            sessionRequired : false,
-                            requestsRecovery: false
-                    ]
-            )
-            factory.afterPropertiesSet()
-        when:
-            JobDetail jobDetail = factory.object
-        then:
-            new JobKey(JOB_NAME, JOB_GROUP) == jobDetail.key
-            JOB_NAME == jobDetail.getJobDataMap().get(JobDetailFactoryBean.JOB_NAME_PARAMETER)
-            !jobDetail.durable
-            jobDetail.isConcurrentExecutionDisallowed()
-            jobDetail.persistJobDataAfterExecution
-            !jobDetail.requestsRecovery()
-            jobDetail.description == null
-    }
-}
-
-class GrailsJobClassMock implements GrailsJobClass {
-    String group
-    String fullName
-    boolean concurrent
-	boolean jobEnabled
-    boolean durability
-    boolean sessionRequired
-    boolean requestsRecovery
-    String description
-
-    void execute() {}
-    Map getTriggers() {}
-    boolean byName() { false }
-    boolean byType() { false }
-    boolean getAvailable() { false }
-    boolean isAbstract() { false }
-	boolean isEnabled() { true }
-    GrailsApplication getGrailsApplication() {}
-
-    @Override
-    grails.core.GrailsApplication getApplication() {
-        return null
-    }
-
-    Object getPropertyValue(String name) {}
-    boolean hasProperty(String name) { false }
-    Object newInstance() {}
-    String getName() {}
-    String getShortName() {}
-    String getPropertyName() {}
-    String getLogicalPropertyName() {}
-    String getNaturalName() {}
-    String getPackageName() {}
-    Class getClazz() {}
-    BeanWrapper getReference() {}
-    Object getReferenceInstance() {}
-    def <T> T getPropertyValue(String name, Class<T> type) {}
-
-    @Override
-    String getPluginName() {
-        return null
-    }
-
-    void setGrailsApplication(GrailsApplication grailsApplication) {}
-}
diff --git a/src/test/groovy/grails/plugins/quartz/MockDoWithSpring.groovy b/src/test/groovy/grails/plugins/quartz/MockDoWithSpring.groovy
deleted file mode 100644
index e22c362..0000000
--- a/src/test/groovy/grails/plugins/quartz/MockDoWithSpring.groovy
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (c) 2011 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package grails.plugins.quartz
-
-class MockDoWithSpring {
-
-    def quartzProperties
-    def application = [jobClasses: null, config: new ConfigObject()]
-    def manager
-
-    def ref(whatever) {
-        null
-    }
-
-    def quartzJobFactory(whatever) {
-        null
-    }
-
-    def exceptionPrinterListener(whatever) {
-        null
-    }
-
-    def sessionBinderListener(something, whatever) {
-        null
-    }
-
-    void quartzScheduler(whatever, Closure props) {
-        def data = [:]
-        props.delegate = data
-        props.resolveStrategy = Closure.DELEGATE_FIRST
-        props.call([:])
-        println "xxxxxxxx=$data"
-        this.quartzProperties = data.quartzProperties
-    }
-}
diff --git a/src/test/groovy/grails/plugins/quartz/QuartzJobTraitInjectorSpec.groovy b/src/test/groovy/grails/plugins/quartz/QuartzJobTraitInjectorSpec.groovy
deleted file mode 100644
index 4b530c9..0000000
--- a/src/test/groovy/grails/plugins/quartz/QuartzJobTraitInjectorSpec.groovy
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  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
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package grails.plugins.quartz
-
-import grails.artefact.Artefact
-import spock.lang.Specification
-
-class QuartzJobTraitInjectorSpec extends Specification {
-
-    void 'test that the job trait is applied'() {
-        expect:
-        QuartzJob.isAssignableFrom TraitTestJob
-    }
-}
-
-@Artefact('Job')
-class TraitTestJob {}
diff --git a/src/test/groovy/grails/plugins/quartz/TestQuartzJob.groovy b/src/test/groovy/grails/plugins/quartz/TestQuartzJob.groovy
deleted file mode 100644
index 4db2219..0000000
--- a/src/test/groovy/grails/plugins/quartz/TestQuartzJob.groovy
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  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
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package grails.plugins.quartz
-
-import org.quartz.Job
-import org.quartz.JobExecutionContext
-import org.quartz.JobExecutionException
-
-/**
- * @author Vitalii Samolovskikh aka Kefir
- */
-class TestQuartzJob implements Job {
-    @Override
-    void execute(JobExecutionContext context) throws JobExecutionException {}
-}
diff --git a/src/test/groovy/grails/plugins/quartz/TriggerDescriptorSpec.groovy b/src/test/groovy/grails/plugins/quartz/TriggerDescriptorSpec.groovy
deleted file mode 100644
index 2b9f68e..0000000
--- a/src/test/groovy/grails/plugins/quartz/TriggerDescriptorSpec.groovy
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- *  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
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package grails.plugins.quartz
-
-import org.quartz.JobBuilder
-import org.quartz.JobDetail
-import org.quartz.JobKey
-import org.quartz.Scheduler
-import org.quartz.SimpleScheduleBuilder
-import org.quartz.Trigger
-import org.quartz.TriggerBuilder
-import org.quartz.TriggerKey
-import org.quartz.impl.StdSchedulerFactory
-import spock.lang.Specification
-
-/**
- * Unit tests for TriggerDescriptor
- *
- * @author Vitalii Samolovskikh aka Kefir
- */
-class TriggerDescriptorSpec extends Specification {
-
-    private Scheduler scheduler
-    private JobDetail job
-    private Trigger trigger
-
-    def setup() {
-        scheduler = StdSchedulerFactory.getDefaultScheduler()
-
-        scheduler.start()
-
-        job = JobBuilder.newJob(TestQuartzJob).withIdentity(new JobKey("job", "group")).build()
-        trigger = TriggerBuilder.newTrigger()
-                .withIdentity(new TriggerKey("trigger", "group"))
-                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInMinutes(2).repeatForever())
-                .startNow()
-                .build()
-
-        scheduler.scheduleJob(job, trigger)
-    }
-
-    def cleanup() {
-        scheduler.shutdown()
-    }
-
-
-    void 'build TriggerDescriptor correctly'() {
-        when:
-            TriggerDescriptor descriptor =
-                    TriggerDescriptor.build(JobDescriptor.build(job, scheduler), trigger, scheduler)
-        then:
-            descriptor.name == 'trigger'
-            descriptor.group == 'group'
-            descriptor.state == Trigger.TriggerState.NORMAL
-    }
-}
diff --git a/src/test/groovy/grails/plugins/quartz/config/TriggersConfigBuilderSpec.groovy b/src/test/groovy/grails/plugins/quartz/config/TriggersConfigBuilderSpec.groovy
deleted file mode 100644
index c73f290..0000000
--- a/src/test/groovy/grails/plugins/quartz/config/TriggersConfigBuilderSpec.groovy
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Copyright (c) 2011 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package grails.plugins.quartz.config
-
-import grails.plugins.quartz.CustomTriggerFactoryBean
-import grails.plugins.quartz.GrailsJobClassConstants as Constants
-import spock.lang.Specification
-
-/**
- * Create 10 triggers with different attributes.
- *
- * @author Sergey Nebolsin (nebolsin@gmail.com)
- */
-class TriggersConfigBuilderSpec extends Specification {
-
-
-    void 'testConfigBuilder'() {
-        setup:
-            def builder = new TriggersConfigBuilder('TestJob', null)
-            def closure = {
-                simple()
-                simple timeout: 1000
-                simple startDelay: 500
-                simple startDelay: 500, timeout: 1000
-                simple startDelay: 500, timeout: 1000, repeatCount: 3
-                simple name: 'everySecond', timeout: 1000
-                cron()
-                cron cronExpression: '0 15 6 * * ?'
-                cron name: 'myTrigger', cronExpression: '0 15 6 * * ?'
-                simple startDelay: 500, timeout: 1000, repeatCount: 0
-            }
-            builder.build(closure)
-        expect:
-            assert 10 == builder.triggers.size(): 'Invalid triggers count'
-        when: 'TestJob0'
-            def triggerName = 'TestJob0'
-        then: 'Verify attributes for TestJob0'
-            assert builder.triggers[triggerName]?.clazz == CustomTriggerFactoryBean
-            assertPropertiesEquals(new Expando(
-                    name: triggerName,
-                    group: Constants.DEFAULT_TRIGGERS_GROUP,
-                    startDelay: Constants.DEFAULT_START_DELAY,
-                    repeatInterval: Constants.DEFAULT_REPEAT_INTERVAL,
-                    repeatCount: Constants.DEFAULT_REPEAT_COUNT,
-            ), builder.triggers[triggerName].triggerAttributes)
-        when: 'TestJob1'
-            triggerName = 'TestJob1'
-        then: 'Verify attributes for TestJob1'
-            assert builder.triggers[triggerName]?.clazz == CustomTriggerFactoryBean
-            assertPropertiesEquals(new Expando(
-                    name: triggerName,
-                    group: Constants.DEFAULT_TRIGGERS_GROUP,
-                    startDelay: Constants.DEFAULT_START_DELAY,
-                    repeatInterval: 1000,
-                    repeatCount: Constants.DEFAULT_REPEAT_COUNT,
-            ), builder.triggers[triggerName].triggerAttributes)
-        when: 'TestJob2'
-            triggerName = 'TestJob2'
-        then: 'Verify attributes for TestJob2'
-            assert builder.triggers[triggerName]?.clazz == CustomTriggerFactoryBean
-            assertPropertiesEquals(new Expando(
-                    name: triggerName,
-                    group: Constants.DEFAULT_TRIGGERS_GROUP,
-                    startDelay: 500,
-                    repeatInterval: Constants.DEFAULT_REPEAT_INTERVAL,
-                    repeatCount: Constants.DEFAULT_REPEAT_COUNT,
-            ), builder.triggers[triggerName].triggerAttributes)
-        when: 'TestJob3'
-            triggerName = 'TestJob3'
-        then: 'Verify attributes for TestJob3'
-            assert builder.triggers[triggerName]?.clazz == CustomTriggerFactoryBean
-            assertPropertiesEquals(new Expando(
-                    name: triggerName,
-                    group: Constants.DEFAULT_TRIGGERS_GROUP,
-                    startDelay: 500,
-                    repeatInterval: 1000,
-                    repeatCount: Constants.DEFAULT_REPEAT_COUNT,
-            ), builder.triggers[triggerName].triggerAttributes)
-        when: 'TestJob4'
-            triggerName = 'TestJob4'
-        then: 'Verify attributes for TestJob4'
-            assert builder.triggers[triggerName]?.clazz == CustomTriggerFactoryBean
-            assertPropertiesEquals(new Expando(
-                    name: triggerName,
-                    group: Constants.DEFAULT_TRIGGERS_GROUP,
-                    startDelay: 500,
-                    repeatInterval: 1000,
-                    repeatCount: 3,
-            ), builder.triggers[triggerName].triggerAttributes)
-        when: 'everySecond'
-            triggerName = 'everySecond'
-        then: 'Verify attribute everySecond'
-            assert builder.triggers[triggerName]?.clazz == CustomTriggerFactoryBean
-            assertPropertiesEquals(new Expando(
-                    name: triggerName,
-                    group: Constants.DEFAULT_TRIGGERS_GROUP,
-                    startDelay: Constants.DEFAULT_START_DELAY,
-                    repeatInterval: 1000,
-                    repeatCount: Constants.DEFAULT_REPEAT_COUNT,
-            ), builder.triggers[triggerName].triggerAttributes
-            )
-        when: 'TestJob5'
-            triggerName = 'TestJob5'
-        then: 'Verify attributes TestJob5'
-            assert builder.triggers[triggerName]?.clazz == CustomTriggerFactoryBean
-            assertPropertiesEquals(new Expando(
-                    name: triggerName,
-                    group: Constants.DEFAULT_TRIGGERS_GROUP,
-                    startDelay: Constants.DEFAULT_START_DELAY,
-                    cronExpression: Constants.DEFAULT_CRON_EXPRESSION,
-            ), builder.triggers[triggerName].triggerAttributes
-            )
-        when: 'TestJob6'
-            triggerName = 'TestJob6'
-        then: 'Verify attributes TestJob6'
-            assert builder.triggers[triggerName]?.clazz == CustomTriggerFactoryBean
-            assertPropertiesEquals(new Expando(
-                    name: triggerName,
-                    group: Constants.DEFAULT_TRIGGERS_GROUP,
-                    cronExpression: '0 15 6 * * ?',
-                    startDelay: Constants.DEFAULT_START_DELAY,
-            ), builder.triggers[triggerName].triggerAttributes)
-        when: 'myTrigger'
-            triggerName = 'myTrigger'
-        then: 'Verify attribute myTrigger'
-            assert builder.triggers[triggerName]?.clazz == CustomTriggerFactoryBean
-            assertPropertiesEquals(new Expando(
-                    name: triggerName,
-                    group: Constants.DEFAULT_TRIGGERS_GROUP,
-                    startDelay: Constants.DEFAULT_START_DELAY,
-                    cronExpression: '0 15 6 * * ?',
-            ), builder.triggers[triggerName].triggerAttributes)
-        when: 'TestJob7'
-            triggerName = 'TestJob7'
-        then: 'Verify attribute TestJob7'
-            assert builder.triggers[triggerName]?.clazz == CustomTriggerFactoryBean
-            assertPropertiesEquals(new Expando(
-                    name: triggerName,
-                    group: Constants.DEFAULT_TRIGGERS_GROUP,
-                    startDelay: 500,
-                    repeatInterval: 1000,
-                    repeatCount: 0,
-            ), builder.triggers[triggerName].triggerAttributes)
-    }
-
-    private static void assertPropertiesEquals(expected, actual) {
-        expected.properties.each { entry ->
-            assert actual[entry.key] == entry.value, "Unexpected value for property: ${entry.key}"
-        }
-        assert actual.size() == expected.properties?.size(), 'Different number of properties'
-    }
-}