diff --git a/pom.xml b/pom.xml
index 07b9d6d842..64ef6697a0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -349,7 +349,6 @@
-
@@ -523,7 +522,6 @@
-
diff --git a/grails/.gitignore b/web-modules/grails/.gitignore
similarity index 100%
rename from grails/.gitignore
rename to web-modules/grails/.gitignore
diff --git a/grails/README.md b/web-modules/grails/README.md
similarity index 100%
rename from grails/README.md
rename to web-modules/grails/README.md
diff --git a/grails/build.gradle b/web-modules/grails/build.gradle
similarity index 100%
rename from grails/build.gradle
rename to web-modules/grails/build.gradle
diff --git a/grails/gradle.properties b/web-modules/grails/gradle.properties
similarity index 100%
rename from grails/gradle.properties
rename to web-modules/grails/gradle.properties
diff --git a/grails/gradle/wrapper/gradle-wrapper.properties b/web-modules/grails/gradle/wrapper/gradle-wrapper.properties
similarity index 100%
rename from grails/gradle/wrapper/gradle-wrapper.properties
rename to web-modules/grails/gradle/wrapper/gradle-wrapper.properties
diff --git a/grails/gradlew b/web-modules/grails/gradlew
similarity index 100%
rename from grails/gradlew
rename to web-modules/grails/gradlew
diff --git a/grails/gradlew.bat b/web-modules/grails/gradlew.bat
similarity index 100%
rename from grails/gradlew.bat
rename to web-modules/grails/gradlew.bat
diff --git a/grails/grails-app/assets/images/apple-touch-icon-retina.png b/web-modules/grails/grails-app/assets/images/apple-touch-icon-retina.png
similarity index 100%
rename from grails/grails-app/assets/images/apple-touch-icon-retina.png
rename to web-modules/grails/grails-app/assets/images/apple-touch-icon-retina.png
diff --git a/grails/grails-app/assets/images/apple-touch-icon.png b/web-modules/grails/grails-app/assets/images/apple-touch-icon.png
similarity index 100%
rename from grails/grails-app/assets/images/apple-touch-icon.png
rename to web-modules/grails/grails-app/assets/images/apple-touch-icon.png
diff --git a/grails/grails-app/assets/images/favicon.ico b/web-modules/grails/grails-app/assets/images/favicon.ico
similarity index 100%
rename from grails/grails-app/assets/images/favicon.ico
rename to web-modules/grails/grails-app/assets/images/favicon.ico
diff --git a/grails/grails-app/assets/images/grails-cupsonly-logo-white.svg b/web-modules/grails/grails-app/assets/images/grails-cupsonly-logo-white.svg
similarity index 100%
rename from grails/grails-app/assets/images/grails-cupsonly-logo-white.svg
rename to web-modules/grails/grails-app/assets/images/grails-cupsonly-logo-white.svg
diff --git a/grails/grails-app/assets/images/grails.svg b/web-modules/grails/grails-app/assets/images/grails.svg
similarity index 100%
rename from grails/grails-app/assets/images/grails.svg
rename to web-modules/grails/grails-app/assets/images/grails.svg
diff --git a/grails/grails-app/assets/images/skin/database_add.png b/web-modules/grails/grails-app/assets/images/skin/database_add.png
similarity index 100%
rename from grails/grails-app/assets/images/skin/database_add.png
rename to web-modules/grails/grails-app/assets/images/skin/database_add.png
diff --git a/grails/grails-app/assets/images/skin/database_delete.png b/web-modules/grails/grails-app/assets/images/skin/database_delete.png
similarity index 100%
rename from grails/grails-app/assets/images/skin/database_delete.png
rename to web-modules/grails/grails-app/assets/images/skin/database_delete.png
diff --git a/grails/grails-app/assets/images/skin/database_edit.png b/web-modules/grails/grails-app/assets/images/skin/database_edit.png
similarity index 100%
rename from grails/grails-app/assets/images/skin/database_edit.png
rename to web-modules/grails/grails-app/assets/images/skin/database_edit.png
diff --git a/grails/grails-app/assets/images/skin/database_save.png b/web-modules/grails/grails-app/assets/images/skin/database_save.png
similarity index 100%
rename from grails/grails-app/assets/images/skin/database_save.png
rename to web-modules/grails/grails-app/assets/images/skin/database_save.png
diff --git a/grails/grails-app/assets/images/skin/database_table.png b/web-modules/grails/grails-app/assets/images/skin/database_table.png
similarity index 100%
rename from grails/grails-app/assets/images/skin/database_table.png
rename to web-modules/grails/grails-app/assets/images/skin/database_table.png
diff --git a/grails/grails-app/assets/images/skin/exclamation.png b/web-modules/grails/grails-app/assets/images/skin/exclamation.png
similarity index 100%
rename from grails/grails-app/assets/images/skin/exclamation.png
rename to web-modules/grails/grails-app/assets/images/skin/exclamation.png
diff --git a/grails/grails-app/assets/images/skin/house.png b/web-modules/grails/grails-app/assets/images/skin/house.png
similarity index 100%
rename from grails/grails-app/assets/images/skin/house.png
rename to web-modules/grails/grails-app/assets/images/skin/house.png
diff --git a/grails/grails-app/assets/images/skin/information.png b/web-modules/grails/grails-app/assets/images/skin/information.png
similarity index 100%
rename from grails/grails-app/assets/images/skin/information.png
rename to web-modules/grails/grails-app/assets/images/skin/information.png
diff --git a/grails/grails-app/assets/images/skin/shadow.jpg b/web-modules/grails/grails-app/assets/images/skin/shadow.jpg
similarity index 100%
rename from grails/grails-app/assets/images/skin/shadow.jpg
rename to web-modules/grails/grails-app/assets/images/skin/shadow.jpg
diff --git a/grails/grails-app/assets/images/skin/sorted_asc.gif b/web-modules/grails/grails-app/assets/images/skin/sorted_asc.gif
similarity index 100%
rename from grails/grails-app/assets/images/skin/sorted_asc.gif
rename to web-modules/grails/grails-app/assets/images/skin/sorted_asc.gif
diff --git a/grails/grails-app/assets/images/skin/sorted_desc.gif b/web-modules/grails/grails-app/assets/images/skin/sorted_desc.gif
similarity index 100%
rename from grails/grails-app/assets/images/skin/sorted_desc.gif
rename to web-modules/grails/grails-app/assets/images/skin/sorted_desc.gif
diff --git a/grails/grails-app/assets/images/spinner.gif b/web-modules/grails/grails-app/assets/images/spinner.gif
similarity index 100%
rename from grails/grails-app/assets/images/spinner.gif
rename to web-modules/grails/grails-app/assets/images/spinner.gif
diff --git a/grails/grails-app/assets/javascripts/application.js b/web-modules/grails/grails-app/assets/javascripts/application.js
similarity index 100%
rename from grails/grails-app/assets/javascripts/application.js
rename to web-modules/grails/grails-app/assets/javascripts/application.js
diff --git a/grails/grails-app/assets/javascripts/bootstrap.js b/web-modules/grails/grails-app/assets/javascripts/bootstrap.js
similarity index 100%
rename from grails/grails-app/assets/javascripts/bootstrap.js
rename to web-modules/grails/grails-app/assets/javascripts/bootstrap.js
diff --git a/grails/grails-app/assets/javascripts/jquery-2.2.0.min.js b/web-modules/grails/grails-app/assets/javascripts/jquery-2.2.0.min.js
similarity index 100%
rename from grails/grails-app/assets/javascripts/jquery-2.2.0.min.js
rename to web-modules/grails/grails-app/assets/javascripts/jquery-2.2.0.min.js
diff --git a/grails/grails-app/assets/stylesheets/application.css b/web-modules/grails/grails-app/assets/stylesheets/application.css
similarity index 100%
rename from grails/grails-app/assets/stylesheets/application.css
rename to web-modules/grails/grails-app/assets/stylesheets/application.css
diff --git a/grails/grails-app/assets/stylesheets/bootstrap.css b/web-modules/grails/grails-app/assets/stylesheets/bootstrap.css
similarity index 100%
rename from grails/grails-app/assets/stylesheets/bootstrap.css
rename to web-modules/grails/grails-app/assets/stylesheets/bootstrap.css
diff --git a/grails/grails-app/assets/stylesheets/errors.css b/web-modules/grails/grails-app/assets/stylesheets/errors.css
similarity index 100%
rename from grails/grails-app/assets/stylesheets/errors.css
rename to web-modules/grails/grails-app/assets/stylesheets/errors.css
diff --git a/grails/grails-app/assets/stylesheets/grails.css b/web-modules/grails/grails-app/assets/stylesheets/grails.css
similarity index 100%
rename from grails/grails-app/assets/stylesheets/grails.css
rename to web-modules/grails/grails-app/assets/stylesheets/grails.css
diff --git a/grails/grails-app/assets/stylesheets/main.css b/web-modules/grails/grails-app/assets/stylesheets/main.css
similarity index 100%
rename from grails/grails-app/assets/stylesheets/main.css
rename to web-modules/grails/grails-app/assets/stylesheets/main.css
diff --git a/grails/grails-app/assets/stylesheets/mobile.css b/web-modules/grails/grails-app/assets/stylesheets/mobile.css
similarity index 100%
rename from grails/grails-app/assets/stylesheets/mobile.css
rename to web-modules/grails/grails-app/assets/stylesheets/mobile.css
diff --git a/grails/grails-app/conf/application.yml b/web-modules/grails/grails-app/conf/application.yml
similarity index 100%
rename from grails/grails-app/conf/application.yml
rename to web-modules/grails/grails-app/conf/application.yml
diff --git a/grails/grails-app/conf/logback.groovy b/web-modules/grails/grails-app/conf/logback.groovy
similarity index 100%
rename from grails/grails-app/conf/logback.groovy
rename to web-modules/grails/grails-app/conf/logback.groovy
diff --git a/grails/grails-app/conf/spring/resources.groovy b/web-modules/grails/grails-app/conf/spring/resources.groovy
similarity index 100%
rename from grails/grails-app/conf/spring/resources.groovy
rename to web-modules/grails/grails-app/conf/spring/resources.groovy
diff --git a/grails/grails-app/controllers/com/baeldung/grails/StudentController.groovy b/web-modules/grails/grails-app/controllers/com/baeldung/grails/StudentController.groovy
similarity index 100%
rename from grails/grails-app/controllers/com/baeldung/grails/StudentController.groovy
rename to web-modules/grails/grails-app/controllers/com/baeldung/grails/StudentController.groovy
diff --git a/grails/grails-app/controllers/grails/UrlMappings.groovy b/web-modules/grails/grails-app/controllers/grails/UrlMappings.groovy
similarity index 100%
rename from grails/grails-app/controllers/grails/UrlMappings.groovy
rename to web-modules/grails/grails-app/controllers/grails/UrlMappings.groovy
diff --git a/grails/grails-app/domain/com/baeldung/grails/Student.groovy b/web-modules/grails/grails-app/domain/com/baeldung/grails/Student.groovy
similarity index 100%
rename from grails/grails-app/domain/com/baeldung/grails/Student.groovy
rename to web-modules/grails/grails-app/domain/com/baeldung/grails/Student.groovy
diff --git a/grails/grails-app/i18n/messages.properties b/web-modules/grails/grails-app/i18n/messages.properties
similarity index 100%
rename from grails/grails-app/i18n/messages.properties
rename to web-modules/grails/grails-app/i18n/messages.properties
diff --git a/grails/grails-app/i18n/messages_cs.properties b/web-modules/grails/grails-app/i18n/messages_cs.properties
similarity index 100%
rename from grails/grails-app/i18n/messages_cs.properties
rename to web-modules/grails/grails-app/i18n/messages_cs.properties
diff --git a/grails/grails-app/i18n/messages_da.properties b/web-modules/grails/grails-app/i18n/messages_da.properties
similarity index 100%
rename from grails/grails-app/i18n/messages_da.properties
rename to web-modules/grails/grails-app/i18n/messages_da.properties
diff --git a/grails/grails-app/i18n/messages_de.properties b/web-modules/grails/grails-app/i18n/messages_de.properties
similarity index 100%
rename from grails/grails-app/i18n/messages_de.properties
rename to web-modules/grails/grails-app/i18n/messages_de.properties
diff --git a/grails/grails-app/i18n/messages_es.properties b/web-modules/grails/grails-app/i18n/messages_es.properties
similarity index 100%
rename from grails/grails-app/i18n/messages_es.properties
rename to web-modules/grails/grails-app/i18n/messages_es.properties
diff --git a/grails/grails-app/i18n/messages_fr.properties b/web-modules/grails/grails-app/i18n/messages_fr.properties
similarity index 100%
rename from grails/grails-app/i18n/messages_fr.properties
rename to web-modules/grails/grails-app/i18n/messages_fr.properties
diff --git a/grails/grails-app/i18n/messages_it.properties b/web-modules/grails/grails-app/i18n/messages_it.properties
similarity index 100%
rename from grails/grails-app/i18n/messages_it.properties
rename to web-modules/grails/grails-app/i18n/messages_it.properties
diff --git a/grails/grails-app/i18n/messages_ja.properties b/web-modules/grails/grails-app/i18n/messages_ja.properties
similarity index 100%
rename from grails/grails-app/i18n/messages_ja.properties
rename to web-modules/grails/grails-app/i18n/messages_ja.properties
diff --git a/grails/grails-app/i18n/messages_nb.properties b/web-modules/grails/grails-app/i18n/messages_nb.properties
similarity index 100%
rename from grails/grails-app/i18n/messages_nb.properties
rename to web-modules/grails/grails-app/i18n/messages_nb.properties
diff --git a/grails/grails-app/i18n/messages_nl.properties b/web-modules/grails/grails-app/i18n/messages_nl.properties
similarity index 100%
rename from grails/grails-app/i18n/messages_nl.properties
rename to web-modules/grails/grails-app/i18n/messages_nl.properties
diff --git a/grails/grails-app/i18n/messages_pl.properties b/web-modules/grails/grails-app/i18n/messages_pl.properties
similarity index 100%
rename from grails/grails-app/i18n/messages_pl.properties
rename to web-modules/grails/grails-app/i18n/messages_pl.properties
diff --git a/grails/grails-app/i18n/messages_pt_BR.properties b/web-modules/grails/grails-app/i18n/messages_pt_BR.properties
similarity index 100%
rename from grails/grails-app/i18n/messages_pt_BR.properties
rename to web-modules/grails/grails-app/i18n/messages_pt_BR.properties
diff --git a/grails/grails-app/i18n/messages_pt_PT.properties b/web-modules/grails/grails-app/i18n/messages_pt_PT.properties
similarity index 100%
rename from grails/grails-app/i18n/messages_pt_PT.properties
rename to web-modules/grails/grails-app/i18n/messages_pt_PT.properties
diff --git a/grails/grails-app/i18n/messages_ru.properties b/web-modules/grails/grails-app/i18n/messages_ru.properties
similarity index 100%
rename from grails/grails-app/i18n/messages_ru.properties
rename to web-modules/grails/grails-app/i18n/messages_ru.properties
diff --git a/grails/grails-app/i18n/messages_sk.properties b/web-modules/grails/grails-app/i18n/messages_sk.properties
similarity index 100%
rename from grails/grails-app/i18n/messages_sk.properties
rename to web-modules/grails/grails-app/i18n/messages_sk.properties
diff --git a/grails/grails-app/i18n/messages_sv.properties b/web-modules/grails/grails-app/i18n/messages_sv.properties
similarity index 100%
rename from grails/grails-app/i18n/messages_sv.properties
rename to web-modules/grails/grails-app/i18n/messages_sv.properties
diff --git a/grails/grails-app/i18n/messages_th.properties b/web-modules/grails/grails-app/i18n/messages_th.properties
similarity index 100%
rename from grails/grails-app/i18n/messages_th.properties
rename to web-modules/grails/grails-app/i18n/messages_th.properties
diff --git a/grails/grails-app/i18n/messages_zh_CN.properties b/web-modules/grails/grails-app/i18n/messages_zh_CN.properties
similarity index 100%
rename from grails/grails-app/i18n/messages_zh_CN.properties
rename to web-modules/grails/grails-app/i18n/messages_zh_CN.properties
diff --git a/grails/grails-app/init/grails/Application.groovy b/web-modules/grails/grails-app/init/grails/Application.groovy
similarity index 100%
rename from grails/grails-app/init/grails/Application.groovy
rename to web-modules/grails/grails-app/init/grails/Application.groovy
diff --git a/grails/grails-app/init/grails/BootStrap.groovy b/web-modules/grails/grails-app/init/grails/BootStrap.groovy
similarity index 100%
rename from grails/grails-app/init/grails/BootStrap.groovy
rename to web-modules/grails/grails-app/init/grails/BootStrap.groovy
diff --git a/grails/grails-app/services/com/baeldung/grails/StudentService.groovy b/web-modules/grails/grails-app/services/com/baeldung/grails/StudentService.groovy
similarity index 100%
rename from grails/grails-app/services/com/baeldung/grails/StudentService.groovy
rename to web-modules/grails/grails-app/services/com/baeldung/grails/StudentService.groovy
diff --git a/grails/grails-app/views/error.gsp b/web-modules/grails/grails-app/views/error.gsp
similarity index 100%
rename from grails/grails-app/views/error.gsp
rename to web-modules/grails/grails-app/views/error.gsp
diff --git a/grails/grails-app/views/index.gsp b/web-modules/grails/grails-app/views/index.gsp
similarity index 100%
rename from grails/grails-app/views/index.gsp
rename to web-modules/grails/grails-app/views/index.gsp
diff --git a/grails/grails-app/views/layouts/main.gsp b/web-modules/grails/grails-app/views/layouts/main.gsp
similarity index 100%
rename from grails/grails-app/views/layouts/main.gsp
rename to web-modules/grails/grails-app/views/layouts/main.gsp
diff --git a/grails/grails-app/views/notFound.gsp b/web-modules/grails/grails-app/views/notFound.gsp
similarity index 100%
rename from grails/grails-app/views/notFound.gsp
rename to web-modules/grails/grails-app/views/notFound.gsp
diff --git a/grails/grails-app/views/student/create.gsp b/web-modules/grails/grails-app/views/student/create.gsp
similarity index 100%
rename from grails/grails-app/views/student/create.gsp
rename to web-modules/grails/grails-app/views/student/create.gsp
diff --git a/grails/grails-app/views/student/index.gsp b/web-modules/grails/grails-app/views/student/index.gsp
similarity index 100%
rename from grails/grails-app/views/student/index.gsp
rename to web-modules/grails/grails-app/views/student/index.gsp
diff --git a/grails/grails-app/views/student/show.gsp b/web-modules/grails/grails-app/views/student/show.gsp
similarity index 100%
rename from grails/grails-app/views/student/show.gsp
rename to web-modules/grails/grails-app/views/student/show.gsp
diff --git a/grails/grailsw b/web-modules/grails/grailsw
similarity index 100%
rename from grails/grailsw
rename to web-modules/grails/grailsw
diff --git a/grails/grailsw.bat b/web-modules/grails/grailsw.bat
similarity index 100%
rename from grails/grailsw.bat
rename to web-modules/grails/grailsw.bat
diff --git a/grails/src/integration-test/groovy/com/baeldung/grails/StudentIntegrationSpec.groovy b/web-modules/grails/src/integration-test/groovy/com/baeldung/grails/StudentIntegrationSpec.groovy
similarity index 100%
rename from grails/src/integration-test/groovy/com/baeldung/grails/StudentIntegrationSpec.groovy
rename to web-modules/grails/src/integration-test/groovy/com/baeldung/grails/StudentIntegrationSpec.groovy
diff --git a/grails/src/integration-test/resources/GebConfig.groovy b/web-modules/grails/src/integration-test/resources/GebConfig.groovy
similarity index 100%
rename from grails/src/integration-test/resources/GebConfig.groovy
rename to web-modules/grails/src/integration-test/resources/GebConfig.groovy
diff --git a/grails/src/test/groovy/com/baeldung/grails/StudentControllerSpec.groovy b/web-modules/grails/src/test/groovy/com/baeldung/grails/StudentControllerSpec.groovy
similarity index 100%
rename from grails/src/test/groovy/com/baeldung/grails/StudentControllerSpec.groovy
rename to web-modules/grails/src/test/groovy/com/baeldung/grails/StudentControllerSpec.groovy
diff --git a/web-modules/pom.xml b/web-modules/pom.xml
index 684283b546..57810f90de 100644
--- a/web-modules/pom.xml
+++ b/web-modules/pom.xml
@@ -19,6 +19,7 @@
bootique
dropwizard
google-web-toolkit
+
jakarta-ee
javax-servlets