diff --git a/applications/pom.xml b/applications/pom.xml
index fe94fc51a28..11f735c69a9 100644
--- a/applications/pom.xml
+++ b/applications/pom.xml
@@ -47,8 +47,8 @@
3.1.2
1.6.0
3.0.0-M5
- 3.0.0-RC2
- 3.0.0-RC2
+ 3.0.0-RC3
+ 3.0.0-RC3
3.0.2
1.5.0.Final
0.5.1
diff --git a/archetypes/helidon/filters.properties b/archetypes/helidon/filters.properties
new file mode 100644
index 00000000000..e28316a0176
--- /dev/null
+++ b/archetypes/helidon/filters.properties
@@ -0,0 +1,123 @@
+#
+# Copyright (c) 2022 Oracle and/or its affiliates.
+#
+# 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.
+#
+
+# This file contains permutation input filters, the property names are not used only the values.
+#
+# The number of computed permutations can be very large and quickly become un-manageable.
+# The build will output warnings when the number of computed permutations for a node is > 150000.
+# Filters are used to restrain the computed permutations.
+#
+# Filters are taken into account when they evaluate successfully. If a variable is unresolved, the result is ignored.
+# A filter that needs to restrain a specific combination should only reference variables in the scope of the target node.
+
+# never combine multipart with other media options
+multipart=${media} == 'multipart' || !(${media} contains 'multipart')
+
+# group metrics, tracing and health together
+observability=!(${metrics} || ${tracing} || ${health}) || \
+ (${metrics} && ${tracing} && ${health})
+
+# force health.builtin=true
+health=!${health} || (${health.builtin})
+
+# force metrics.builtin=true
+metrics=!${metrics} || (${metrics.builtin})
+
+# force metrics.provider='microprofile' when tracing=true
+tracing=!${tracing} || (${tracing} && ${metrics.provider} == 'microprofile')
+
+# group extra options
+extra=${extra} == [] || ${extra} == ['cors', 'webclient', 'fault-tolerance']
+
+# group docker, k8s and v8o
+packaging=!(${docker} || ${k8s} || ${v8o}) || (${docker} && ${k8s} && ${v8o})
+
+# force docker.native-image=true and docker.jlink-image=true when docker=true
+docker=!${docker} || (${docker.native-image} && ${docker.jlink-image})
+
+# force single option for security.atn
+security-atn=\
+ ${security.atn} == ['oidc'] || \
+ ${security.atn} == ['jwt'] || \
+ ${security.atn} == ['google'] || \
+ ${security.atn} == ['http-signature']
+
+# only combine security.atz with security.atn=oidc
+security-atz=\
+ ${security.atz} == [] || \
+ (${security.atz} == 'abac' && ${security.atn} == 'oidc')
+
+# do not combine media and security
+security-media=\
+ ${app-type} != 'custom' || (${app-type} == 'custom' && \
+ (${security} && ${media} == []) || !${security})
+
+# do not combine metrics and media
+metrics-media=\
+ ${app-type} != 'custom' || (${app-type} == 'custom' && \
+ (${metrics} && ${media} == []) || !${metrics})
+
+# do not combine metrics and security
+security-metrics=\
+ ${app-type} != 'custom' || (${app-type} == 'custom' && \
+ (${metrics} && !${security}) || !${metrics})
+
+# do not combine docker and media
+docker-media=\
+ ${app-type} != 'custom' || (${app-type} == 'custom' && \
+ (${docker} && ${media} == []) || !${docker})
+
+# do not combine docker and security
+docker-security=\
+ ${app-type} != 'custom' || (${app-type} == 'custom' && \
+ (${docker} && !${security}) || !${docker})
+
+# do not combine docker and tracing
+docker-tracing=\
+ ${app-type} != 'custom' || (${app-type} == 'custom' && \
+ (${docker} && !${tracing}) || !${docker})
+
+# do not combine docker and extra
+docker-extra=\
+ ${app-type} != 'custom' || (${app-type} == 'custom' && \
+ (${docker} && ${extra} != []) || !${docker})
+
+# do not combine security and extra
+extra-security=\
+ ${app-type} != 'custom' || (${app-type} == 'custom' && \
+ (!${security} && ${extra} != []) || (${security} && ${extra} == []))
+
+# do not combine custom and db
+custom-db=\
+ ${app-type} != 'custom' || (${app-type} == 'custom' && \
+ !${db})
+
+# do not combine media.json-lib=jackson when db.auto-ddl=true
+ddl-media=\
+ ${app-type} != 'database' || (${app-type} == 'database' && \
+ (${db.auto-ddl} && ${media.json-lib} == 'jackson') || \
+ (!${db.auto-ddl} && ${media.json-lib} != 'jackson'))
+
+# do not combine media.json-lib=jackson when db.cp=hikaricp
+hikaricp-media=\
+ ${app-type} != 'database' || (${app-type} == 'database' && \
+ (${db.cp} == 'hikaricp' && ${media.json-lib} == 'jackson') || \
+ (${db.cp} != 'hikaricp' && ${media.json-lib} != 'jackson'))
+
+# do not combine app-type=database when health=true
+db-health=\
+ ${app-type} != 'database' || (${app-type} == 'database' && \
+ !${health})
diff --git a/archetypes/helidon/pom.xml b/archetypes/helidon/pom.xml
index 93408973f3f..579e57b7b44 100644
--- a/archetypes/helidon/pom.xml
+++ b/archetypes/helidon/pom.xml
@@ -54,51 +54,7 @@
-
-
-
-
-
- ${media} == 'multipart' || !(${media} contains 'multipart')
-
- !(${metrics} || ${tracing} || ${health}) || (${metrics} && ${tracing} && ${health})
-
- !${health} || (${health.builtin})
-
- !${metrics} || (${metrics.builtin})
-
- !${tracing} || (${tracing} && ${metrics.provider} == 'microprofile')
-
- ${extra} == [] || (${extra} contains 'cors' && ${extra} contains 'webclient' && ${extra} contains 'fault-tolerance')
-
- !(${docker} || ${k8s} || ${v8o}) || (${docker} && ${k8s} && ${v8o})
-
- !${docker} || (${docker.native-image} && ${docker.jlink-image})
-
- ${security.atn} == 'oidc' || ${security.atn} == 'jwt' || ${security.atn} == 'google' || ${security.atn} == 'http-signature'
-
- (${security.atz} == 'abac' && ${security.atn} == 'oidc') || ${security.atz} == 'none'
-
- (${app-type} == 'custom' && ${security} == 'true' && ${media} == 'none') || ${security} == 'false' || ${app-type} != 'custom'
-
- (${app-type} == 'custom' && ${metrics} == 'true' && ${media} == 'none') || ${metrics} == 'false' || ${app-type} != 'custom'
-
- (${app-type} == 'custom' && ${metrics} == 'true' && ${security} == 'false') || ${metrics} == 'false' || ${app-type} != 'custom'
-
- (${app-type} == 'custom' && ${docker} == 'true' && ${media} == 'none') || ${docker} == 'false' || ${app-type} != 'custom'
-
- (${app-type} == 'custom' && ${docker} == 'true' && ${security} == 'false') || ${docker} == 'false' || ${app-type} != 'custom'
-
- (${app-type} == 'custom' && ${docker} == 'true' && ${tracing} == 'false') || ${docker} == 'false' || ${app-type} != 'custom'
-
- (${app-type} == 'custom' && ${db} == 'false') || ${app-type} != 'custom'
-
- (${app-type} == 'database' && ${db.auto-ddl} == 'true') && ${media.json-lib} == 'jackson' || (${db.auto-ddl} == 'false' && ${media.json-lib} != 'jackson') || ${app-type} != 'database'
-
- (${app-type} == 'database' && ${db.cp} == 'hikaricp') && ${media.json-lib} == 'jackson' || (${db.cp} != 'hikaricp' && ${media.json-lib} != 'jackson' ) || ${app-type} != 'database'
-
- (${app-type} == 'database' && ${health} == 'false') || ${app-type} != 'database'
-
+ filters.properties
diff --git a/archetypes/helidon/src/main/archetype/common/extra.xml b/archetypes/helidon/src/main/archetype/common/extra.xml
index 1f16cdde5e1..edf47467171 100644
--- a/archetypes/helidon/src/main/archetype/common/extra.xml
+++ b/archetypes/helidon/src/main/archetype/common/extra.xml
@@ -23,7 +23,7 @@
-