diff --git a/modules/openapi-generator-gradle-plugin/README.adoc b/modules/openapi-generator-gradle-plugin/README.adoc
index f7f22550b4f409342607493f033c9cbaee6a210e..a0c81fe2c7ad9036d51619f148240984c2e82d47 100644
--- a/modules/openapi-generator-gradle-plugin/README.adoc
+++ b/modules/openapi-generator-gradle-plugin/README.adoc
@@ -330,6 +330,10 @@ apply plugin: 'org.openapi.generator'
 |false
 |To generate alias (array, list, map) as model. When false, top-level objects defined as array, list, or map will result in those definitions generated as top-level Array-of-items, List-of-items, Map-of-items definitions. When true, A model representation either containing or extending the array,list,map (depending on specific generator implementation) will be generated.
 
+|engine
+|String
+|mustache
+|Templating engine: "mustache" (default) or "handlebars" (beta)
 |===
 
 [NOTE]
diff --git a/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/OpenApiGeneratorPlugin.kt b/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/OpenApiGeneratorPlugin.kt
index 82105777a66419bcf0307bf48ed187a211beeb6b..dcc3ce08915ddab990ff0c9a7e21331e247b10b2 100644
--- a/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/OpenApiGeneratorPlugin.kt
+++ b/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/OpenApiGeneratorPlugin.kt
@@ -138,6 +138,7 @@ class OpenApiGeneratorPlugin : Plugin<Project> {
                     enablePostProcessFile.set(generate.enablePostProcessFile)
                     skipValidateSpec.set(generate.skipValidateSpec)
                     generateAliasAsModel.set(generate.generateAliasAsModel)
+                    engine.set(generate.engine)
                 }
             }
         }
diff --git a/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/extensions/OpenApiGeneratorGenerateExtension.kt b/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/extensions/OpenApiGeneratorGenerateExtension.kt
index 55dee4400e29a873d637adc4894317686b82c46c..846a03d29417b71d0e33b60a855300b7fd24c11b 100644
--- a/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/extensions/OpenApiGeneratorGenerateExtension.kt
+++ b/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/extensions/OpenApiGeneratorGenerateExtension.kt
@@ -307,6 +307,11 @@ open class OpenApiGeneratorGenerateExtension(project: Project) {
      */
     val configOptions = project.objects.mapProperty<String, String>()
 
+    /**
+     * Templating engine: "mustache" (default) or "handlebars" (beta)
+     */
+    val engine = project.objects.property<String?>()
+
     init {
         applyDefaults()
     }
diff --git a/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/tasks/GenerateTask.kt b/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/tasks/GenerateTask.kt
index 0ffc93cf4fea037a5780d6d6c09b34d91fab2a85..e0dee13cafe4bd3adaf22979e86d72677c6d367a 100644
--- a/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/tasks/GenerateTask.kt
+++ b/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/tasks/GenerateTask.kt
@@ -375,6 +375,12 @@ open class GenerateTask : DefaultTask() {
     @get:Internal
     val configOptions = project.objects.mapProperty<String, String>()
 
+    /**
+     * Templating engine: "mustache" (default) or "handlebars" (beta)
+     */
+    @get:Internal
+    val engine = project.objects.property<String?>()
+
     private fun <T : Any?> Property<T>.ifNotEmpty(block: Property<T>.(T) -> Unit) {
         if (isPresent) {
             val item: T? = get()
@@ -561,6 +567,12 @@ open class GenerateTask : DefaultTask() {
                 configurator.setGenerateAliasAsModel(value)
             }
 
+            engine.ifNotEmpty { value ->
+                if ("handlebars".equals(value, ignoreCase = true)) {
+                    configurator.setTemplatingEngineName("handlebars")
+                }
+            }
+
             if (systemProperties.isPresent) {
                 systemProperties.get().forEach { entry ->
                     configurator.addSystemProperty(entry.key, entry.value)
diff --git a/modules/openapi-generator-gradle-plugin/src/test/kotlin/GenerateTaskDslTest.kt b/modules/openapi-generator-gradle-plugin/src/test/kotlin/GenerateTaskDslTest.kt
index 9f62e7e9feedf9de3afcca6b371c3a47e521a787..6aecc119252b54b4bd07657308871d5cac81b799 100644
--- a/modules/openapi-generator-gradle-plugin/src/test/kotlin/GenerateTaskDslTest.kt
+++ b/modules/openapi-generator-gradle-plugin/src/test/kotlin/GenerateTaskDslTest.kt
@@ -126,4 +126,40 @@ class GenerateTaskDslTest : TestBase()  {
         assertEquals(TaskOutcome.SUCCESS, result.task(":openApiGenerate")?.outcome,
                 "Expected a successful run, but found ${result.task(":openApiGenerate")?.outcome}")
     }
+
+    @Test
+    fun `openapiGenerate should attempt to set handlebars when specified as engine`(){
+        // Arrange
+        val projectFiles = mapOf(
+            "spec.yaml" to javaClass.classLoader.getResourceAsStream("specs/petstore-v3.0.yaml")
+        )
+
+        withProject("""
+        plugins {
+          id 'org.openapi.generator'
+        }
+        openApiGenerate {
+            generatorName = "kotlin"
+            inputSpec = file("spec.yaml").absolutePath
+            outputDir = file("build/kotlin").absolutePath
+            apiPackage = "org.openapitools.example.api"
+            invokerPackage = "org.openapitools.example.invoker"
+            modelPackage = "org.openapitools.example.model"
+            engine = "handlebars"
+        }
+    """.trimIndent(), projectFiles)
+
+        // Act
+        val result = GradleRunner.create()
+            .withProjectDir(temp)
+            .withArguments("openApiGenerate")
+            .withPluginClasspath()
+            .buildAndFail()
+
+        // Assert
+        // rather than write out full handlebars generator templates, we'll just test that the configurator has set handlebars as the engine.
+        assertTrue(result.output.contains("kotlin-client/model.handlebars (No such file or directory)"), "Build should have attempted to use handlebars.")
+        assertEquals(TaskOutcome.FAILED, result.task(":openApiGenerate")?.outcome,
+            "Expected a failed run, but found ${result.task(":openApiGenerate")?.outcome}")
+    }
 }
\ No newline at end of file