diff --git a/docs/generators/groovy.md b/docs/generators/groovy.md
index 16d4e284a1ea8ff61a33336ec90cdfb5b6250b77..e5ac52bafbab16bd1820e84d23119e06eb1b3896 100644
--- a/docs/generators/groovy.md
+++ b/docs/generators/groovy.md
@@ -17,8 +17,6 @@ sidebar_label: groovy
 |groupId|groupId in generated pom.xml| |org.openapitools|
 |artifactId|artifactId in generated pom.xml. This also becomes part of the generated library's filename| |openapi-groovy|
 |artifactVersion|artifact version in generated pom.xml. This also becomes part of the generated library's filename| |1.0.0|
-|artifactUrl|artifact URL in generated pom.xml| |https://github.com/openapitools/openapi-generator|
-|artifactDescription|artifact description in generated pom.xml| |OpenAPI Java|
 |scmConnection|SCM connection in generated pom.xml| |scm:git:git@github.com:openapitools/openapi-generator.git|
 |scmDeveloperConnection|SCM developer connection in generated pom.xml| |scm:git:git@github.com:openapitools/openapi-generator.git|
 |scmUrl|SCM URL in generated pom.xml| |https://github.com/openapitools/openapi-generator|
diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java
index 5a89e31a19a79e3b03a498447a331846d04cbb15..7c928dee6ceaadcf8999b33317c40a5c9cf3cd3b 100644
--- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java
+++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java
@@ -4862,7 +4862,7 @@ public class DefaultCodegen implements CodegenConfig {
      *
      * @param objs map of object
      */
-    public void generateJSONSpecFile(Map<String, Object> objs) {
+    protected void generateJSONSpecFile(Map<String, Object> objs) {
         OpenAPI openAPI = (OpenAPI) objs.get("openAPI");
         if (openAPI != null) {
             try {
diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractApexCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractApexCodegen.java
index 4f4e60730d6700b1945d711eacf6d47a11e4ade8..d2a20593f52ef054df11b8348a68292894666bef 100644
--- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractApexCodegen.java
+++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractApexCodegen.java
@@ -652,19 +652,6 @@ public abstract class AbstractApexCodegen extends DefaultCodegen implements Code
         return escapeText(pattern);
     }
 
-    public boolean convertPropertyToBoolean(String propertyKey) {
-        boolean booleanValue = false;
-        if (additionalProperties.containsKey(propertyKey)) {
-            booleanValue = Boolean.valueOf(additionalProperties.get(propertyKey).toString());
-        }
-
-        return booleanValue;
-    }
-
-    public void writePropertyBack(String propertyKey, boolean value) {
-        additionalProperties.put(propertyKey, value);
-    }
-
     @Override
     public String sanitizeTag(String tag) {
         return camelize(sanitizeName(tag));
diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java
index 3c4ec0102c8fc978bdba14383bfee51faff67f67..8c7260f3b3eba2bababd35249de331bfca1350d6 100644
--- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java
+++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java
@@ -1060,7 +1060,7 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code
         String defaultContentType = "application/json";
         Set<String> producesInfo = getProducesInfo(openAPI, operation);
         if (producesInfo != null && !producesInfo.isEmpty()) {
-            ArrayList<String> produces = new ArrayList<String>(producesInfo);
+            ArrayList<String> produces = new ArrayList<>(producesInfo);
             StringBuilder sb = new StringBuilder();
             for (String produce : produces) {
                 if (defaultContentType.equalsIgnoreCase(produce)) {
@@ -1085,7 +1085,7 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code
 
     @Override
     protected boolean needToImport(String type) {
-        return super.needToImport(type) && type.indexOf(".") < 0;
+        return super.needToImport(type) && !type.contains(".");
     }
 
     @Override
@@ -1183,10 +1183,11 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code
 
         if (removedChildEnum) {
             // If we removed an entry from this model's vars, we need to ensure hasMore is updated
-            int count = 0, numVars = codegenProperties.size();
+            int count = 0;
+            int numVars = codegenProperties.size();
             for (CodegenProperty codegenProperty : codegenProperties) {
                 count += 1;
-                codegenProperty.hasMore = (count < numVars) ? true : false;
+                codegenProperty.hasMore = count < numVars;
             }
             codegenModel.vars = codegenProperties;
         }
@@ -1444,27 +1445,13 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code
         return escapeText(pattern);
     }
 
-    @Override
-    public boolean convertPropertyToBoolean(String propertyKey) {
-        boolean booleanValue = false;
-        if (additionalProperties.containsKey(propertyKey)) {
-            booleanValue = Boolean.valueOf(additionalProperties.get(propertyKey).toString());
-        }
-
-        return booleanValue;
-    }
-
-    @Override
-    public void writePropertyBack(String propertyKey, boolean value) {
-        additionalProperties.put(propertyKey, value);
-    }
-
     /**
      * Output the Getter name for boolean property, e.g. isActive
      *
      * @param name the name of the property
      * @return getter name based on naming convention
      */
+    @Override
     public String toBooleanGetter(String name) {
         return booleanGetterPrefix + getterAndSetterCapitalize(name);
     }
@@ -1505,7 +1492,6 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code
         return camelize(name, lowercaseFirstLetter);
     }
 
-
     @Override
     public void postProcessFile(File file, String fileType) {
         if (file == null) {
diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GroovyClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GroovyClientCodegen.java
index 94332fed9d831cf9a40ae6da8382120a26f3e3e8..ecae95083c902bc8b5f84b613a43cf8d9d4e80c1 100644
--- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GroovyClientCodegen.java
+++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GroovyClientCodegen.java
@@ -56,13 +56,15 @@ public class GroovyClientCodegen extends AbstractJavaCodegen {
         artifactId = "openapi-groovy";
         dateLibrary = "legacy"; //TODO: add joda support to groovy
 
-        // clioOptions default redefinition need to be updated
+        // cliOptions default redefinition need to be updated
         updateOption(CodegenConstants.SOURCE_FOLDER, this.getSourceFolder());
         updateOption(CodegenConstants.INVOKER_PACKAGE, this.getInvokerPackage());
         updateOption(CodegenConstants.ARTIFACT_ID, this.getArtifactId());
         updateOption(CodegenConstants.API_PACKAGE, apiPackage);
         updateOption(CodegenConstants.MODEL_PACKAGE, modelPackage);
         updateOption(DATE_LIBRARY, this.getDateLibrary());
+        removeOption(CodegenConstants.ARTIFACT_URL);
+        removeOption(CodegenConstants.ARTIFACT_DESCRIPTION);
 
     }
 
@@ -95,7 +97,6 @@ public class GroovyClientCodegen extends AbstractJavaCodegen {
     @Override
     public Map<String, Object> postProcessOperationsWithModels(Map<String, Object> operations, List<Object> allModels) {
         Map<String, Object> objs = (Map<String, Object>) operations.get("operations");
-
         List<CodegenOperation> ops = (List<CodegenOperation>) objs.get("operation");
         for (CodegenOperation op : ops) {
             // Overwrite path to map variable with path parameters
diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaJAXRSSpecServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaJAXRSSpecServerCodegen.java
index 67a8f39b0834d65aa856e9a13a58867d71cce157..776915734a33a60ae7ff79ff619f663b753998c1 100644
--- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaJAXRSSpecServerCodegen.java
+++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaJAXRSSpecServerCodegen.java
@@ -54,7 +54,7 @@ public class JavaJAXRSSpecServerCodegen extends AbstractJavaJAXRSServerCodegen {
         apiPackage = "org.openapitools.api";
         modelPackage = "org.openapitools.model";
 
-        // clioOptions default redifinition need to be updated
+        // cliOptions default redefinition need to be updated
         updateOption(CodegenConstants.INVOKER_PACKAGE, this.getInvokerPackage());
         updateOption(CodegenConstants.ARTIFACT_ID, this.getArtifactId());
         updateOption(CodegenConstants.API_PACKAGE, apiPackage);
@@ -80,13 +80,7 @@ public class JavaJAXRSSpecServerCodegen extends AbstractJavaJAXRSServerCodegen {
 
         super.embeddedTemplateDir = templateDir = JAXRS_TEMPLATE_DIRECTORY_NAME + File.separator + "spec";
 
-        for (int i = 0; i < cliOptions.size(); i++) {
-            if (CodegenConstants.LIBRARY.equals(cliOptions.get(i).getOpt())) {
-                cliOptions.remove(i);
-                break;
-            }
-        }
-
+        removeOption(CodegenConstants.LIBRARY);
         CliOption library = new CliOption(CodegenConstants.LIBRARY, CodegenConstants.LIBRARY_DESC).defaultValue(DEFAULT_LIBRARY);
         Map<String, String> supportedLibraries = new LinkedHashMap<>();
         supportedLibraries.put(DEFAULT_LIBRARY, "JAXRS");
diff --git a/modules/openapi-generator/src/main/resources/Groovy/api.mustache b/modules/openapi-generator/src/main/resources/Groovy/api.mustache
index 20fe23f96237fb65a0ad6378034266edb45684fc..daa1351ff744721f1c294c5ed4b5f42c6f8a6284 100644
--- a/modules/openapi-generator/src/main/resources/Groovy/api.mustache
+++ b/modules/openapi-generator/src/main/resources/Groovy/api.mustache
@@ -20,12 +20,14 @@ class {{classname}} {
         def bodyParams
         def contentType
 
-        {{#allParams}}{{#required}}
+        {{#allParams}}
+        {{#required}}
         // verify required params are set
         if ({{paramName}} == null) {
             throw new RuntimeException("missing required params {{paramName}}")
         }
-        {{/required}}{{/allParams}}
+        {{/required}}
+        {{/allParams}}
 
         {{#queryParams}}
         if ({{paramName}} != null) {
@@ -47,15 +49,19 @@ class {{classname}} {
         contentType = '{{{mediaType}}}';
         {{/consumes.0}}
         {{/bodyParam}}
+        {{#bodyParams.0}}
+        {{^hasMore}}
+        bodyParams = {{paramName}}
+        {{/hasMore}}
+        {{#hasMore}}
+        bodyParams = [:]
+        bodyParams.put("{{baseName}}", {{paramName}})
+        {{/hasMore}}
+        {{/bodyParams.0}}
         {{#bodyParams}}
-        // only one body parameter
-        if (1 == {{bodyParams.size}}) {
-            bodyParams = {{paramName}}
-        }
-        // array of body parameters
-        else {
-            bodyParams.put("{{baseName}}", {{paramName}})
-        }
+        {{#secondaryParam}}
+        bodyParams.put("{{baseName}}", {{paramName}})
+        {{/secondaryParam}}
         {{/bodyParams}}
 
         {{#hasFormParams}}
@@ -63,20 +69,18 @@ class {{classname}} {
         contentType = '{{{mediaType}}}';
         {{/consumes.0}}
         {{#formParams.0}}
-        // only one form parameter
-        if (1 == {{formParams.size}}) {
-            bodyParams = {{paramName}}
-        }
-        // array of form parameters
-        else {
-            bodyParams = [:]
-        }
+        {{^hasMore}}
+        bodyParams = {{paramName}}
+        {{/hasMore}}
+        {{#hasMore}}
+        bodyParams = [:]
+        bodyParams.put("{{baseName}}", {{paramName}})
+        {{/hasMore}}
         {{/formParams.0}}
         {{#formParams}}
-        // array of form parameters
-        if (1 < {{formParams.size}}) {
-            bodyParams.put("{{baseName}}", {{paramName}})
-        }
+        {{#secondaryParam}}
+        bodyParams.put("{{baseName}}", {{paramName}})
+        {{/secondaryParam}}
         {{/formParams}}
         {{/hasFormParams}}
 
diff --git a/samples/client/petstore/groovy/src/main/groovy/org/openapitools/api/PetApi.groovy b/samples/client/petstore/groovy/src/main/groovy/org/openapitools/api/PetApi.groovy
index c022982020af0d0ba1e86994e50c145047479349..60f3f7d45da174b0930b7fcb0b18317f34528b71 100644
--- a/samples/client/petstore/groovy/src/main/groovy/org/openapitools/api/PetApi.groovy
+++ b/samples/client/petstore/groovy/src/main/groovy/org/openapitools/api/PetApi.groovy
@@ -18,24 +18,15 @@ class PetApi {
         def bodyParams
         def contentType
 
-        
         // verify required params are set
         if (body == null) {
             throw new RuntimeException("missing required params body")
         }
-        
 
 
 
         contentType = 'application/json';
-        // only one body parameter
-        if (1 == 1) {
-            bodyParams = body
-        }
-        // array of body parameters
-        else {
-            bodyParams.put("body", body)
-        }
+        bodyParams = body
 
 
         apiUtils.invokeApi(onSuccess, onFailure, basePath, versionPath, resourcePath, queryParams, headerParams, bodyParams, contentType,
@@ -53,12 +44,10 @@ class PetApi {
         def bodyParams
         def contentType
 
-        
         // verify required params are set
         if (petId == null) {
             throw new RuntimeException("missing required params petId")
         }
-        
 
 
         if (apiKey != null) {
@@ -82,12 +71,10 @@ class PetApi {
         def bodyParams
         def contentType
 
-        
         // verify required params are set
         if (status == null) {
             throw new RuntimeException("missing required params status")
         }
-        
 
         if (status != null) {
             queryParams.put("status", status)
@@ -111,12 +98,10 @@ class PetApi {
         def bodyParams
         def contentType
 
-        
         // verify required params are set
         if (tags == null) {
             throw new RuntimeException("missing required params tags")
         }
-        
 
         if (tags != null) {
             queryParams.put("tags", tags)
@@ -140,12 +125,10 @@ class PetApi {
         def bodyParams
         def contentType
 
-        
         // verify required params are set
         if (petId == null) {
             throw new RuntimeException("missing required params petId")
         }
-        
 
 
 
@@ -166,24 +149,15 @@ class PetApi {
         def bodyParams
         def contentType
 
-        
         // verify required params are set
         if (body == null) {
             throw new RuntimeException("missing required params body")
         }
-        
 
 
 
         contentType = 'application/json';
-        // only one body parameter
-        if (1 == 1) {
-            bodyParams = body
-        }
-        // array of body parameters
-        else {
-            bodyParams.put("body", body)
-        }
+        bodyParams = body
 
 
         apiUtils.invokeApi(onSuccess, onFailure, basePath, versionPath, resourcePath, queryParams, headerParams, bodyParams, contentType,
@@ -201,33 +175,18 @@ class PetApi {
         def bodyParams
         def contentType
 
-        
         // verify required params are set
         if (petId == null) {
             throw new RuntimeException("missing required params petId")
         }
-        
 
 
 
 
         contentType = 'application/x-www-form-urlencoded';
-        // only one form parameter
-        if (1 == 2) {
-            bodyParams = name
-        }
-        // array of form parameters
-        else {
-            bodyParams = [:]
-        }
-        // array of form parameters
-        if (1 < 2) {
-            bodyParams.put("name", name)
-        }
-        // array of form parameters
-        if (1 < 2) {
-            bodyParams.put("status", status)
-        }
+        bodyParams = [:]
+        bodyParams.put("name", name)
+        bodyParams.put("status", status)
 
         apiUtils.invokeApi(onSuccess, onFailure, basePath, versionPath, resourcePath, queryParams, headerParams, bodyParams, contentType,
                     "POST", "",
@@ -244,33 +203,18 @@ class PetApi {
         def bodyParams
         def contentType
 
-        
         // verify required params are set
         if (petId == null) {
             throw new RuntimeException("missing required params petId")
         }
-        
 
 
 
 
         contentType = 'multipart/form-data';
-        // only one form parameter
-        if (1 == 2) {
-            bodyParams = additionalMetadata
-        }
-        // array of form parameters
-        else {
-            bodyParams = [:]
-        }
-        // array of form parameters
-        if (1 < 2) {
-            bodyParams.put("additionalMetadata", additionalMetadata)
-        }
-        // array of form parameters
-        if (1 < 2) {
-            bodyParams.put("file", file)
-        }
+        bodyParams = [:]
+        bodyParams.put("additionalMetadata", additionalMetadata)
+        bodyParams.put("file", file)
 
         apiUtils.invokeApi(onSuccess, onFailure, basePath, versionPath, resourcePath, queryParams, headerParams, bodyParams, contentType,
                     "POST", "",
diff --git a/samples/client/petstore/groovy/src/main/groovy/org/openapitools/api/StoreApi.groovy b/samples/client/petstore/groovy/src/main/groovy/org/openapitools/api/StoreApi.groovy
index 154551d18805e26b30f43a5427da57b6e576cc15..8e7a0ee9d2798373cfa574e8ee081209558d30db 100644
--- a/samples/client/petstore/groovy/src/main/groovy/org/openapitools/api/StoreApi.groovy
+++ b/samples/client/petstore/groovy/src/main/groovy/org/openapitools/api/StoreApi.groovy
@@ -17,12 +17,10 @@ class StoreApi {
         def bodyParams
         def contentType
 
-        
         // verify required params are set
         if (orderId == null) {
             throw new RuntimeException("missing required params orderId")
         }
-        
 
 
 
@@ -43,7 +41,6 @@ class StoreApi {
         def bodyParams
         def contentType
 
-        
 
 
 
@@ -64,12 +61,10 @@ class StoreApi {
         def bodyParams
         def contentType
 
-        
         // verify required params are set
         if (orderId == null) {
             throw new RuntimeException("missing required params orderId")
         }
-        
 
 
 
@@ -90,24 +85,15 @@ class StoreApi {
         def bodyParams
         def contentType
 
-        
         // verify required params are set
         if (body == null) {
             throw new RuntimeException("missing required params body")
         }
-        
 
 
 
         contentType = 'application/json';
-        // only one body parameter
-        if (1 == 1) {
-            bodyParams = body
-        }
-        // array of body parameters
-        else {
-            bodyParams.put("body", body)
-        }
+        bodyParams = body
 
 
         apiUtils.invokeApi(onSuccess, onFailure, basePath, versionPath, resourcePath, queryParams, headerParams, bodyParams, contentType,
diff --git a/samples/client/petstore/groovy/src/main/groovy/org/openapitools/api/UserApi.groovy b/samples/client/petstore/groovy/src/main/groovy/org/openapitools/api/UserApi.groovy
index 2d0ec2ab73c35517c36aacbeec6cab1ad324068b..8cc83986808959c98ea509eb16087b75ce04b49d 100644
--- a/samples/client/petstore/groovy/src/main/groovy/org/openapitools/api/UserApi.groovy
+++ b/samples/client/petstore/groovy/src/main/groovy/org/openapitools/api/UserApi.groovy
@@ -18,24 +18,15 @@ class UserApi {
         def bodyParams
         def contentType
 
-        
         // verify required params are set
         if (body == null) {
             throw new RuntimeException("missing required params body")
         }
-        
 
 
 
         contentType = 'application/json';
-        // only one body parameter
-        if (1 == 1) {
-            bodyParams = body
-        }
-        // array of body parameters
-        else {
-            bodyParams.put("body", body)
-        }
+        bodyParams = body
 
 
         apiUtils.invokeApi(onSuccess, onFailure, basePath, versionPath, resourcePath, queryParams, headerParams, bodyParams, contentType,
@@ -53,24 +44,15 @@ class UserApi {
         def bodyParams
         def contentType
 
-        
         // verify required params are set
         if (body == null) {
             throw new RuntimeException("missing required params body")
         }
-        
 
 
 
         contentType = 'application/json';
-        // only one body parameter
-        if (1 == 1) {
-            bodyParams = body
-        }
-        // array of body parameters
-        else {
-            bodyParams.put("body", body)
-        }
+        bodyParams = body
 
 
         apiUtils.invokeApi(onSuccess, onFailure, basePath, versionPath, resourcePath, queryParams, headerParams, bodyParams, contentType,
@@ -88,24 +70,15 @@ class UserApi {
         def bodyParams
         def contentType
 
-        
         // verify required params are set
         if (body == null) {
             throw new RuntimeException("missing required params body")
         }
-        
 
 
 
         contentType = 'application/json';
-        // only one body parameter
-        if (1 == 1) {
-            bodyParams = body
-        }
-        // array of body parameters
-        else {
-            bodyParams.put("body", body)
-        }
+        bodyParams = body
 
 
         apiUtils.invokeApi(onSuccess, onFailure, basePath, versionPath, resourcePath, queryParams, headerParams, bodyParams, contentType,
@@ -123,12 +96,10 @@ class UserApi {
         def bodyParams
         def contentType
 
-        
         // verify required params are set
         if (username == null) {
             throw new RuntimeException("missing required params username")
         }
-        
 
 
 
@@ -149,12 +120,10 @@ class UserApi {
         def bodyParams
         def contentType
 
-        
         // verify required params are set
         if (username == null) {
             throw new RuntimeException("missing required params username")
         }
-        
 
 
 
@@ -175,17 +144,14 @@ class UserApi {
         def bodyParams
         def contentType
 
-        
         // verify required params are set
         if (username == null) {
             throw new RuntimeException("missing required params username")
         }
-        
         // verify required params are set
         if (password == null) {
             throw new RuntimeException("missing required params password")
         }
-        
 
         if (username != null) {
             queryParams.put("username", username)
@@ -212,7 +178,6 @@ class UserApi {
         def bodyParams
         def contentType
 
-        
 
 
 
@@ -233,29 +198,19 @@ class UserApi {
         def bodyParams
         def contentType
 
-        
         // verify required params are set
         if (username == null) {
             throw new RuntimeException("missing required params username")
         }
-        
         // verify required params are set
         if (body == null) {
             throw new RuntimeException("missing required params body")
         }
-        
 
 
 
         contentType = 'application/json';
-        // only one body parameter
-        if (1 == 1) {
-            bodyParams = body
-        }
-        // array of body parameters
-        else {
-            bodyParams.put("body", body)
-        }
+        bodyParams = body
 
 
         apiUtils.invokeApi(onSuccess, onFailure, basePath, versionPath, resourcePath, queryParams, headerParams, bodyParams, contentType,