diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinClientCodegen.java
index 17afe550c7097ff0fc8c4055f39ba69a4834150b..ac7275bba3130f36f1e04d308dede03f73c84550 100644
--- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinClientCodegen.java
+++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinClientCodegen.java
@@ -18,14 +18,7 @@
 package org.openapitools.codegen.languages;
 
 import org.apache.commons.lang3.StringUtils;
-import org.openapitools.codegen.CliOption;
-import org.openapitools.codegen.CodegenConstants;
-import org.openapitools.codegen.CodegenModel;
-import org.openapitools.codegen.CodegenOperation;
-import org.openapitools.codegen.CodegenParameter;
-import org.openapitools.codegen.CodegenProperty;
-import org.openapitools.codegen.CodegenType;
-import org.openapitools.codegen.SupportingFile;
+import org.openapitools.codegen.*;
 import org.openapitools.codegen.meta.features.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -49,6 +42,8 @@ public class KotlinClientCodegen extends AbstractKotlinCodegen {
     protected static final String JVM_RETROFIT2 = "jvm-retrofit2";
     protected static final String MULTIPLATFORM = "multiplatform";
 
+    public static final String USE_SEALED_CLASS = "useSealedClass";
+
     public static final String USE_RX_JAVA = "useRxJava";
     public static final String USE_RX_JAVA2 = "useRxJava2";
     public static final String USE_RX_JAVA3 = "useRxJava3";
@@ -60,6 +55,7 @@ public class KotlinClientCodegen extends AbstractKotlinCodegen {
     public static final String COLLECTION_TYPE = "collectionType";
 
     protected static final String VENDOR_EXTENSION_BASE_NAME_LITERAL = "x-base-name-literal";
+    protected static final String VENDOR_EXTENSION_DISCRIMINATOR_BASE_NAME_LITERAL = "x-base-name-discriminator-literal";
 
     protected String dateLibrary = DateLibrary.JAVA8.value;
     protected String requestDateConverter = RequestDateConverter.TO_JSON.value;
@@ -179,10 +175,10 @@ public class KotlinClientCodegen extends AbstractKotlinCodegen {
         collectionType.setDefault(this.collectionType);
         cliOptions.add(collectionType);
 
-        supportedLibraries.put(JVM_OKHTTP4, "[DEFAULT] Platform: Java Virtual Machine. HTTP client: OkHttp 4.2.0 (Android 5.0+ and Java 8+). JSON processing: Moshi 1.8.0.");
-        supportedLibraries.put(JVM_OKHTTP3, "Platform: Java Virtual Machine. HTTP client: OkHttp 3.12.4 (Android 2.3+ and Java 7+). JSON processing: Moshi 1.8.0.");
-        supportedLibraries.put(JVM_RETROFIT2, "Platform: Java Virtual Machine. HTTP client: Retrofit 2.6.2.");
-        supportedLibraries.put(MULTIPLATFORM, "Platform: Kotlin multiplatform. HTTP client: Ktor 1.2.4. JSON processing: Kotlinx Serialization: 0.12.0.");
+        supportedLibraries.put(JVM_OKHTTP4, "[DEFAULT] Platform: Java Virtual Machine. HTTP client: OkHttp 4.9.0 (Android 5.0+ and Java 8+).");
+        supportedLibraries.put(JVM_OKHTTP3, "Platform: Java Virtual Machine. HTTP client: OkHttp 3.12.4 (Android 2.3+ and Java 7+).");
+        supportedLibraries.put(JVM_RETROFIT2, "Platform: Java Virtual Machine. HTTP client: Retrofit 2.7.2.");
+        supportedLibraries.put(MULTIPLATFORM, "Platform: Kotlin multiplatform. HTTP client: Ktor 1.2.4. JSON processing: Kotlinx Serialization: 1.1.0.");
 
         CliOption libraryOption = new CliOption(CodegenConstants.LIBRARY, "Library template (sub-template) to use");
         libraryOption.setEnum(supportedLibraries);
@@ -198,6 +194,8 @@ public class KotlinClientCodegen extends AbstractKotlinCodegen {
         requestDateConverter.setDefault(this.requestDateConverter);
         cliOptions.add(requestDateConverter);
 
+        cliOptions.add(CliOption.newBoolean(USE_SEALED_CLASS, "Use sealed classes instead of interfaces."));
+
         cliOptions.add(CliOption.newBoolean(USE_RX_JAVA, "Whether to use the RxJava adapter with the retrofit2 library."));
         cliOptions.add(CliOption.newBoolean(USE_RX_JAVA2, "Whether to use the RxJava2 adapter with the retrofit2 library."));
         cliOptions.add(CliOption.newBoolean(USE_RX_JAVA3, "Whether to use the RxJava3 adapter with the retrofit2 library."));
@@ -368,7 +366,7 @@ public class KotlinClientCodegen extends AbstractKotlinCodegen {
             additionalProperties.put("isList", true);
         }
 
-        if(usesRetrofit2Library()) {
+        if (usesRetrofit2Library()) {
             if (ProcessUtils.hasOAuthMethods(openAPI)) {
                 supportingFiles.add(new SupportingFile("auth/ApiKeyAuth.kt.mustache", authFolder, "ApiKeyAuth.kt"));
                 supportingFiles.add(new SupportingFile("auth/OAuth.kt.mustache", authFolder, "OAuth.kt"));
@@ -376,11 +374,11 @@ public class KotlinClientCodegen extends AbstractKotlinCodegen {
                 supportingFiles.add(new SupportingFile("auth/OAuthOkHttpClient.kt.mustache", authFolder, "OAuthOkHttpClient.kt"));
             }
 
-            if(ProcessUtils.hasHttpBearerMethods(openAPI)) {
+            if (ProcessUtils.hasHttpBearerMethods(openAPI)) {
                 supportingFiles.add(new SupportingFile("auth/HttpBearerAuth.kt.mustache", authFolder, "HttpBearerAuth.kt"));
             }
 
-            if(ProcessUtils.hasHttpBasicMethods(openAPI)) {
+            if (ProcessUtils.hasHttpBasicMethods(openAPI)) {
                 supportingFiles.add(new SupportingFile("auth/HttpBasicAuth.kt.mustache", authFolder, "HttpBasicAuth.kt"));
             }
         }
@@ -589,6 +587,32 @@ public class KotlinClientCodegen extends AbstractKotlinCodegen {
         supportingFiles.add(new SupportingFile("gradle-wrapper.jar", "gradle.wrapper".replace(".", File.separator), "gradle-wrapper.jar"));
     }
 
+    @SuppressWarnings("unchecked")
+    @Override
+    public Map<String, Object> postProcessAllModels(Map<String, Object> objs) {
+        Map<String, Object> result = super.postProcessAllModels(objs);
+
+        // We have to remove duplicate classes if we use sealed classes. So do nothing if we don't use sealed classes.
+        boolean useSealedClass = additionalProperties.containsKey(USE_SEALED_CLASS) && (boolean) additionalProperties.get(USE_SEALED_CLASS);
+        if (!useSealedClass) {
+            return result;
+        }
+
+        Map<String, Object> newMap = new HashMap<String, Object>(result);
+        for (Map.Entry<String, Object> entry : result.entrySet()) {
+            Map<String, Object> inner = (Map<String, Object>) entry.getValue();
+            List<Map<String, Object>> models = (List<Map<String, Object>>) inner.get("models");
+            for (Map<String, Object> mo : models) {
+                CodegenModel cm = (CodegenModel) mo.get("model");
+                if (cm.discriminator != null && cm.children != null) {
+                    // Remove the children from the "normal" models. We have to place it into the sealed classes.
+                    cm.children.forEach(child -> newMap.remove(child.getName()));
+                }
+            }
+        }
+        return newMap;
+    }
+
     @Override
     public Map<String, Object> postProcessModels(Map<String, Object> objs) {
         Map<String, Object> objects = super.postProcessModels(objs);
@@ -614,6 +638,11 @@ public class KotlinClientCodegen extends AbstractKotlinCodegen {
             for (CodegenProperty var : vars) {
                 var.vendorExtensions.put(VENDOR_EXTENSION_BASE_NAME_LITERAL, var.baseName.replace("$", "\\$"));
             }
+
+            CodegenDiscriminator discriminator = cm.getDiscriminator();
+            if (discriminator != null) {
+                cm.vendorExtensions.put(VENDOR_EXTENSION_DISCRIMINATOR_BASE_NAME_LITERAL, discriminator.getPropertyBaseName().replace("$", "\\$"));
+            }
         }
 
         return objects;
diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/build.gradle.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/build.gradle.mustache
index 415a8c2557444ab0cca58334612409157183bd26..cb4c5a6c493f8a2c99b1cd43011ea4a783dd527e 100644
--- a/modules/openapi-generator/src/main/resources/kotlin-client/build.gradle.mustache
+++ b/modules/openapi-generator/src/main/resources/kotlin-client/build.gradle.mustache
@@ -20,6 +20,9 @@ buildscript {
     {{#useRxJava3}}
     ext.rxJava3Version = '3.0.10'
     {{/useRxJava3}}
+    {{#moshi}}
+    ext.moshiVersion = '1.11.0'
+    {{/moshi}}
 
     repositories {
         maven { url "https://repo1.maven.org/maven2" }
@@ -56,12 +59,13 @@ dependencies {
     {{#moshi}}
     {{^moshiCodeGen}}
     compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
-    compile "com.squareup.moshi:moshi-kotlin:1.11.0"
+    compile "com.squareup.moshi:moshi-kotlin:$moshiVersion"
     {{/moshiCodeGen}}
     {{#moshiCodeGen}}
-    compile "com.squareup.moshi:moshi:1.11.0"
-    kapt "com.squareup.moshi:moshi-kotlin-codegen:1.11.0"
+    compile "com.squareup.moshi:moshi:$moshiVersion"
+    kapt "com.squareup.moshi:moshi-kotlin-codegen:$moshiVersion"
     {{/moshiCodeGen}}
+    compile "com.squareup.moshi:moshi-adapters:$moshiVersion"
     {{/moshi}}
     {{#gson}}
     compile "com.google.code.gson:gson:2.8.6"
diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/data_class.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/data_class.mustache
index b83b7aff9527e58a16d98329e14657c20584ed20..44d7f77d4ad9fbde8e55019571ca7387df7b0f1a 100644
--- a/modules/openapi-generator/src/main/resources/kotlin-client/data_class.mustache
+++ b/modules/openapi-generator/src/main/resources/kotlin-client/data_class.mustache
@@ -1,41 +1,3 @@
-{{^multiplatform}}
-{{#gson}}
-import com.google.gson.annotations.SerializedName
-{{/gson}}
-{{#moshi}}
-import com.squareup.moshi.Json
-{{#moshiCodeGen}}
-import com.squareup.moshi.JsonClass
-{{/moshiCodeGen}}
-{{/moshi}}
-{{#jackson}}
-import com.fasterxml.jackson.annotation.JsonProperty
-{{#discriminator}}
-import com.fasterxml.jackson.annotation.JsonSubTypes
-import com.fasterxml.jackson.annotation.JsonTypeInfo
-{{/discriminator}}
-{{/jackson}}
-{{#kotlinx_serialization}}
-import {{#serializableModel}}kotlinx.serialization.Serializable as KSerializable{{/serializableModel}}{{^serializableModel}}kotlinx.serialization.Serializable{{/serializableModel}}
-import kotlinx.serialization.SerialName
-import kotlinx.serialization.Contextual
-{{#hasEnums}}
-{{/hasEnums}}
-{{/kotlinx_serialization}}
-{{#parcelizeModels}}
-import android.os.Parcelable
-import kotlinx.parcelize.Parcelize
-
-{{/parcelizeModels}}
-{{/multiplatform}}
-{{#multiplatform}}
-import kotlinx.serialization.*
-import kotlinx.serialization.internal.CommonEnumSerializer
-{{/multiplatform}}
-{{#serializableModel}}
-import java.io.Serializable
-{{/serializableModel}}
-
 /**
  * {{{description}}}
 {{#allVars}}
@@ -45,24 +7,25 @@ import java.io.Serializable
 {{#parcelizeModels}}
 @Parcelize
 {{/parcelizeModels}}
-{{#multiplatform}}@Serializable{{/multiplatform}}{{#kotlinx_serialization}}{{#serializableModel}}@KSerializable{{/serializableModel}}{{^serializableModel}}@Serializable{{/serializableModel}}{{/kotlinx_serialization}}{{#moshi}}{{#moshiCodeGen}}@JsonClass(generateAdapter = true){{/moshiCodeGen}}{{/moshi}}{{#jackson}}{{#discriminator}}{{>typeInfoAnnotation}}{{/discriminator}}{{/jackson}}
+{{#multiplatform}}@Serializable{{/multiplatform}}{{#kotlinx_serialization}}{{#serializableModel}}@KSerializable{{/serializableModel}}{{^serializableModel}}@Serializable{{/serializableModel}}{{/kotlinx_serialization}}{{#moshi}}{{^discriminator}}{{#moshiCodeGen}}@JsonClass(generateAdapter = true){{/moshiCodeGen}}{{/discriminator}}{{/moshi}}{{#jackson}}{{#discriminator}}{{>typeInfoAnnotation}}{{/discriminator}}{{/jackson}}
 {{#isDeprecated}}
 @Deprecated(message = "This schema is deprecated.")
 {{/isDeprecated}}
-{{#nonPublicApi}}internal {{/nonPublicApi}}{{#discriminator}}interface{{/discriminator}}{{^discriminator}}data class{{/discriminator}} {{classname}}{{^discriminator}} (
+{{#nonPublicApi}}internal {{/nonPublicApi}}{{#discriminator}}{{#useSealedClass}}sealed class{{/useSealedClass}}{{^useSealedClass}}interface{{/useSealedClass}}{{/discriminator}}{{^discriminator}}data class{{/discriminator}} {{classname}}{{^discriminator}} (
 {{#allVars}}
 {{#required}}{{>data_class_req_var}}{{/required}}{{^required}}{{>data_class_opt_var}}{{/required}}{{^-last}},{{/-last}}
 {{/allVars}}
-){{/discriminator}}{{#parent}}{{^serializableModel}}{{^parcelizeModels}} : {{{parent}}}{{#isMap}}(){{/isMap}}{{#isArray}}(){{/isArray}}{{/parcelizeModels}}{{/serializableModel}}{{/parent}}{{#parent}}{{#serializableModel}}{{^parcelizeModels}} : {{{parent}}}{{#isMap}}(){{/isMap}}{{#isArray}}(){{/isArray}}, Serializable{{/parcelizeModels}}{{/serializableModel}}{{/parent}}{{#parent}}{{^serializableModel}}{{#parcelizeModels}} : {{{parent}}}{{#isMap}}(){{/isMap}}{{#isArray}}(){{/isArray}}, Parcelable{{/parcelizeModels}}{{/serializableModel}}{{/parent}}{{#parent}}{{#serializableModel}}{{#parcelizeModels}} : {{{parent}}}{{#isMap}}(){{/isMap}}{{#isArray}}(){{/isArray}}, Serializable, Parcelable{{/parcelizeModels}}{{/serializableModel}}{{/parent}}{{^parent}}{{#serializableModel}}{{^parcelizeModels}} : Serializable{{/parcelizeModels}}{{/serializableModel}}{{/parent}}{{^parent}}{{^serializableModel}}{{#parcelizeModels}} : Parcelable{{/parcelizeModels}}{{/serializableModel}}{{/parent}}{{^parent}}{{#serializableModel}}{{#parcelizeModels}} : Serializable, Parcelable{{/parcelizeModels}}{{/serializableModel}}{{/parent}}{{#vendorExtensions.x-has-data-class-body}} {
+){{/discriminator}}{{#parent}}{{^serializableModel}}{{^parcelizeModels}} : {{{parent}}}{{#isMap}}(){{/isMap}}{{#isArray}}(){{/isArray}}{{#useSealedClass}}(){{/useSealedClass}}{{/parcelizeModels}}{{/serializableModel}}{{/parent}}{{#parent}}{{#serializableModel}}{{^parcelizeModels}} : {{{parent}}}{{#isMap}}(){{/isMap}}{{#isArray}}(){{/isArray}}{{#useSealedClass}}(){{/useSealedClass}}, Serializable{{/parcelizeModels}}{{/serializableModel}}{{/parent}}{{#parent}}{{^serializableModel}}{{#parcelizeModels}} : {{{parent}}}{{#isMap}}(){{/isMap}}{{#isArray}}(){{/isArray}}{{#useSealedClass}}(){{/useSealedClass}}, Parcelable{{/parcelizeModels}}{{/serializableModel}}{{/parent}}{{#parent}}{{#serializableModel}}{{#parcelizeModels}} : {{{parent}}}{{#isMap}}(){{/isMap}}{{#isArray}}(){{/isArray}}{{#useSealedClass}}(){{/useSealedClass}}, Serializable, Parcelable{{/parcelizeModels}}{{/serializableModel}}{{/parent}}{{^parent}}{{#serializableModel}}{{^parcelizeModels}} : Serializable{{/parcelizeModels}}{{/serializableModel}}{{/parent}}{{^parent}}{{^serializableModel}}{{#parcelizeModels}} : Parcelable{{/parcelizeModels}}{{/serializableModel}}{{/parent}}{{^parent}}{{#serializableModel}}{{#parcelizeModels}} : Serializable, Parcelable{{/parcelizeModels}}{{/serializableModel}}{{/parent}}{{#vendorExtensions.x-has-data-class-body}} {
 {{/vendorExtensions.x-has-data-class-body}}
 {{#serializableModel}}
     {{#nonPublicApi}}internal {{/nonPublicApi}}companion object {
         private const val serialVersionUID: Long = 123
     }
 {{/serializableModel}}
-{{#discriminator}}{{#vars}}{{#required}}
+{{#discriminator}}{{#vars}}{{#useSealedClass}}
+{{>sealed_class_var}}{{/useSealedClass}}{{^useSealedClass}}{{#required}}
 {{>interface_req_var}}{{/required}}{{^required}}
-{{>interface_opt_var}}{{/required}}{{/vars}}{{/discriminator}}
+{{>interface_opt_var}}{{/required}}{{/useSealedClass}}{{/vars}}{{/discriminator}}
 {{#hasEnums}}
 {{#vars}}
 {{#isEnum}}
diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/data_class_header.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/data_class_header.mustache
new file mode 100644
index 0000000000000000000000000000000000000000..e05998ded22235cb4f207950ae59c8d942ad579e
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/kotlin-client/data_class_header.mustache
@@ -0,0 +1,37 @@
+{{^multiplatform}}
+{{#gson}}
+import com.google.gson.annotations.SerializedName
+{{/gson}}
+{{#moshi}}
+import com.squareup.moshi.Json
+{{#moshiCodeGen}}
+import com.squareup.moshi.JsonClass
+{{/moshiCodeGen}}
+{{/moshi}}
+{{#jackson}}
+import com.fasterxml.jackson.annotation.JsonProperty
+{{#discriminator}}
+import com.fasterxml.jackson.annotation.JsonSubTypes
+import com.fasterxml.jackson.annotation.JsonTypeInfo
+{{/discriminator}}
+{{/jackson}}
+{{#kotlinx_serialization}}
+import {{#serializableModel}}kotlinx.serialization.Serializable as KSerializable{{/serializableModel}}{{^serializableModel}}kotlinx.serialization.Serializable{{/serializableModel}}
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Contextual
+{{#hasEnums}}
+{{/hasEnums}}
+{{/kotlinx_serialization}}
+{{#parcelizeModels}}
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
+{{/parcelizeModels}}
+{{/multiplatform}}
+{{#multiplatform}}
+import kotlinx.serialization.*
+import kotlinx.serialization.internal.CommonEnumSerializer
+{{/multiplatform}}
+{{#serializableModel}}
+import java.io.Serializable
+{{/serializableModel}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/interface_opt_var.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/interface_opt_var.mustache
index 6d23fb240a0ca0e327c6a0b30ae74d439815dbb5..9b5ea02923b58247a1d5ba01425e5b2dcad89951 100644
--- a/modules/openapi-generator/src/main/resources/kotlin-client/interface_opt_var.mustache
+++ b/modules/openapi-generator/src/main/resources/kotlin-client/interface_opt_var.mustache
@@ -2,9 +2,7 @@
     /* {{{description}}} */
 {{/description}}
     {{^multiplatform}}
-    {{#moshi}}
-    @Json(name = "{{{vendorExtensions.x-base-name-literal}}}")
-    {{/moshi}}
+    {{#moshi}}{{^discriminator}}@Json(name = "{{{vendorExtensions.x-base-name-literal}}}"){{/discriminator}}{{/moshi}}
     {{#gson}}
     @get:SerializedName("{{{vendorExtensions.x-base-name-literal}}}")
     {{/gson}}
diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/jvm-common/infrastructure/Serializer.kt.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/jvm-common/infrastructure/Serializer.kt.mustache
index e9ed019095e0c46690b470a3330b440bcfcb8b65..df4e709b12034e92d962b594d6f8e66acda622ab 100644
--- a/modules/openapi-generator/src/main/resources/kotlin-client/jvm-common/infrastructure/Serializer.kt.mustache
+++ b/modules/openapi-generator/src/main/resources/kotlin-client/jvm-common/infrastructure/Serializer.kt.mustache
@@ -2,6 +2,7 @@ package {{packageName}}.infrastructure
 
 {{#moshi}}
 import com.squareup.moshi.Moshi
+import com.squareup.moshi.adapters.PolymorphicJsonAdapterFactory
 {{^moshiCodeGen}}
 import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
 {{/moshiCodeGen}}
@@ -50,6 +51,9 @@ import java.util.concurrent.atomic.AtomicBoolean
 import java.util.concurrent.atomic.AtomicInteger
 import java.util.concurrent.atomic.AtomicLong
 {{/kotlinx_serialization}}
+{{#moshi}}
+import {{modelPackage}}.*
+{{/moshi}}
 
 {{#nonPublicApi}}internal {{/nonPublicApi}}object Serializer {
 {{#moshi}}
@@ -60,6 +64,13 @@ import java.util.concurrent.atomic.AtomicLong
         .add(LocalDateAdapter())
         .add(UUIDAdapter())
         .add(ByteArrayAdapter())
+        {{#models}}{{#model}}{{#discriminator}}
+        .add(PolymorphicJsonAdapterFactory.of({{classname}}::class.java, "{{{vendorExtensions.x-base-name-discriminator-literal}}}")
+        {{#mappedModels}}
+            .withSubtype({{modelName}}::class.java, "{{mappingName}}")
+        {{/mappedModels}}
+        )
+        {{/discriminator}}{{/model}}{{/models}}
         {{^moshiCodeGen}}
         .add(KotlinJsonAdapterFactory())
         {{/moshiCodeGen}}
@@ -76,7 +87,7 @@ import java.util.concurrent.atomic.AtomicLong
         .registerTypeAdapter(LocalDateTime::class.java, LocalDateTimeAdapter())
         .registerTypeAdapter(LocalDate::class.java, LocalDateAdapter())
         .registerTypeAdapter(ByteArray::class.java, ByteArrayAdapter())
-    
+
     @JvmStatic
     val gson: Gson by lazy {
         gsonBuilder.create()
diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/model.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/model.mustache
index abd168abce8ee27d4a38583c361448a76f220f05..8aae9e68c391ab3ee797b0345bd9344cb258c4e8 100644
--- a/modules/openapi-generator/src/main/resources/kotlin-client/model.mustache
+++ b/modules/openapi-generator/src/main/resources/kotlin-client/model.mustache
@@ -6,6 +6,9 @@ package {{modelPackage}}
 
 {{#models}}
 {{#model}}
-{{#isEnum}}{{>enum_class}}{{/isEnum}}{{^isEnum}}{{#isAlias}}typealias {{classname}} = {{{dataType}}}{{/isAlias}}{{^isAlias}}{{>data_class}}{{/isAlias}}{{/isEnum}}
+{{#isEnum}}{{>enum_class}}{{/isEnum}}{{^isEnum}}{{#isAlias}}typealias {{classname}} = {{{dataType}}}{{/isAlias}}{{^isAlias}}{{>data_class_header}}
+{{>data_class}}{{/isAlias}}{{/isEnum}}{{#useSealedClass}}
+{{#children}}{{>data_class}}
+{{/children}}{{/useSealedClass}}
 {{/model}}
 {{/models}}
diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/sealed_class_var.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/sealed_class_var.mustache
new file mode 100644
index 0000000000000000000000000000000000000000..5e1e4632b6aa48b7c19f721f503dc24ac543886c
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/kotlin-client/sealed_class_var.mustache
@@ -0,0 +1,4 @@
+{{#description}}
+    /* {{{description}}} */
+{{/description}}
+    abstract {{>modelMutable}} {{{name}}}: {{#isArray}}{{#isList}}kotlin.collections.List{{/isList}}{{^isList}}kotlin.Array{{/isList}}<{{^items.isEnum}}{{{items.dataType}}}{{/items.isEnum}}{{#items.isEnum}}{{classname}}.{{{nameInCamelCase}}}{{/items.isEnum}}>{{/isArray}}{{^isEnum}}{{^isArray}}{{{dataType}}}{{/isArray}}{{/isEnum}}{{#isEnum}}{{^isArray}}{{classname}}.{{{nameInCamelCase}}}{{/isArray}}{{/isEnum}}{{^required}}?{{/required}}
\ No newline at end of file
diff --git a/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt b/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
index b80e0390de2d33aa5140c42df6455bdb4b909042..c05c85ca359369b91e1fd5465f4b7d525a3c9114 100644
--- a/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
+++ b/samples/client/petstore/kotlin-gson/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
@@ -15,7 +15,7 @@ object Serializer {
         .registerTypeAdapter(LocalDateTime::class.java, LocalDateTimeAdapter())
         .registerTypeAdapter(LocalDate::class.java, LocalDateAdapter())
         .registerTypeAdapter(ByteArray::class.java, ByteArrayAdapter())
-    
+
     @JvmStatic
     val gson: Gson by lazy {
         gsonBuilder.create()
diff --git a/samples/client/petstore/kotlin-json-request-string/build.gradle b/samples/client/petstore/kotlin-json-request-string/build.gradle
index 60e5056e03163b56773e5305d94d70148f8fa6cd..34d16649ec0edd45e7c85eb483568da15d03ba41 100644
--- a/samples/client/petstore/kotlin-json-request-string/build.gradle
+++ b/samples/client/petstore/kotlin-json-request-string/build.gradle
@@ -8,6 +8,7 @@ wrapper {
 
 buildscript {
     ext.kotlin_version = '1.4.30'
+    ext.moshiVersion = '1.11.0'
 
     repositories {
         maven { url "https://repo1.maven.org/maven2" }
@@ -30,7 +31,8 @@ test {
 dependencies {
     compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
     compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
-    compile "com.squareup.moshi:moshi-kotlin:1.11.0"
+    compile "com.squareup.moshi:moshi-kotlin:$moshiVersion"
+    compile "com.squareup.moshi:moshi-adapters:$moshiVersion"
     compile "com.squareup.okhttp3:okhttp:4.9.0"
     testCompile "io.kotlintest:kotlintest-runner-junit5:3.4.2"
 }
diff --git a/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt b/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
index 9a45b67d9b1a435f1ebfa35c6d6c0fd329cea27b..ec6ef7b8a5d078dc9b9f84af3787c2acd56f8192 100644
--- a/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
+++ b/samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
@@ -1,8 +1,10 @@
 package org.openapitools.client.infrastructure
 
 import com.squareup.moshi.Moshi
+import com.squareup.moshi.adapters.PolymorphicJsonAdapterFactory
 import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
 import java.util.Date
+import org.openapitools.client.models.*
 
 object Serializer {
     @JvmStatic
@@ -12,6 +14,7 @@ object Serializer {
         .add(LocalDateAdapter())
         .add(UUIDAdapter())
         .add(ByteArrayAdapter())
+        
         .add(KotlinJsonAdapterFactory())
 
     @JvmStatic
diff --git a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
index b80e0390de2d33aa5140c42df6455bdb4b909042..c05c85ca359369b91e1fd5465f4b7d525a3c9114 100644
--- a/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
+++ b/samples/client/petstore/kotlin-jvm-okhttp4-coroutines/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
@@ -15,7 +15,7 @@ object Serializer {
         .registerTypeAdapter(LocalDateTime::class.java, LocalDateTimeAdapter())
         .registerTypeAdapter(LocalDate::class.java, LocalDateAdapter())
         .registerTypeAdapter(ByteArray::class.java, ByteArrayAdapter())
-    
+
     @JvmStatic
     val gson: Gson by lazy {
         gsonBuilder.create()
diff --git a/samples/client/petstore/kotlin-moshi-codegen/build.gradle b/samples/client/petstore/kotlin-moshi-codegen/build.gradle
index 5e86b0b1a36277acc8ceaaf9195260a907caf2b3..1fc6265e462a2b0794909de3cb0db93934b83f4a 100644
--- a/samples/client/petstore/kotlin-moshi-codegen/build.gradle
+++ b/samples/client/petstore/kotlin-moshi-codegen/build.gradle
@@ -8,6 +8,7 @@ wrapper {
 
 buildscript {
     ext.kotlin_version = '1.4.30'
+    ext.moshiVersion = '1.11.0'
 
     repositories {
         maven { url "https://repo1.maven.org/maven2" }
@@ -30,8 +31,9 @@ test {
 
 dependencies {
     compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
-    compile "com.squareup.moshi:moshi:1.11.0"
-    kapt "com.squareup.moshi:moshi-kotlin-codegen:1.11.0"
+    compile "com.squareup.moshi:moshi:$moshiVersion"
+    kapt "com.squareup.moshi:moshi-kotlin-codegen:$moshiVersion"
+    compile "com.squareup.moshi:moshi-adapters:$moshiVersion"
     compile "com.squareup.okhttp3:okhttp:4.9.0"
     testCompile "io.kotlintest:kotlintest-runner-junit5:3.4.2"
 }
diff --git a/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt b/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
index 25447c818e668d4113a94a0d6a1c4a2471c52e6c..899cc9a1ccc361ba57bd053b2818d31436abde41 100644
--- a/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
+++ b/samples/client/petstore/kotlin-moshi-codegen/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
@@ -1,7 +1,9 @@
 package org.openapitools.client.infrastructure
 
 import com.squareup.moshi.Moshi
+import com.squareup.moshi.adapters.PolymorphicJsonAdapterFactory
 import java.util.Date
+import org.openapitools.client.models.*
 
 object Serializer {
     @JvmStatic
@@ -11,6 +13,7 @@ object Serializer {
         .add(LocalDateAdapter())
         .add(UUIDAdapter())
         .add(ByteArrayAdapter())
+        
 
     @JvmStatic
     val moshi: Moshi by lazy {
diff --git a/samples/client/petstore/kotlin-nonpublic/build.gradle b/samples/client/petstore/kotlin-nonpublic/build.gradle
index 60e5056e03163b56773e5305d94d70148f8fa6cd..34d16649ec0edd45e7c85eb483568da15d03ba41 100644
--- a/samples/client/petstore/kotlin-nonpublic/build.gradle
+++ b/samples/client/petstore/kotlin-nonpublic/build.gradle
@@ -8,6 +8,7 @@ wrapper {
 
 buildscript {
     ext.kotlin_version = '1.4.30'
+    ext.moshiVersion = '1.11.0'
 
     repositories {
         maven { url "https://repo1.maven.org/maven2" }
@@ -30,7 +31,8 @@ test {
 dependencies {
     compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
     compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
-    compile "com.squareup.moshi:moshi-kotlin:1.11.0"
+    compile "com.squareup.moshi:moshi-kotlin:$moshiVersion"
+    compile "com.squareup.moshi:moshi-adapters:$moshiVersion"
     compile "com.squareup.okhttp3:okhttp:4.9.0"
     testCompile "io.kotlintest:kotlintest-runner-junit5:3.4.2"
 }
diff --git a/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt b/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
index 7265f759142849dae9d1e7c7d4f9d769c2a0f9a8..da0ca243ce9e917ce70a012de81c0a41f4446051 100644
--- a/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
+++ b/samples/client/petstore/kotlin-nonpublic/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
@@ -1,8 +1,10 @@
 package org.openapitools.client.infrastructure
 
 import com.squareup.moshi.Moshi
+import com.squareup.moshi.adapters.PolymorphicJsonAdapterFactory
 import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
 import java.util.Date
+import org.openapitools.client.models.*
 
 internal object Serializer {
     @JvmStatic
@@ -12,6 +14,7 @@ internal object Serializer {
         .add(LocalDateAdapter())
         .add(UUIDAdapter())
         .add(ByteArrayAdapter())
+        
         .add(KotlinJsonAdapterFactory())
 
     @JvmStatic
diff --git a/samples/client/petstore/kotlin-nullable/build.gradle b/samples/client/petstore/kotlin-nullable/build.gradle
index 60e5056e03163b56773e5305d94d70148f8fa6cd..34d16649ec0edd45e7c85eb483568da15d03ba41 100644
--- a/samples/client/petstore/kotlin-nullable/build.gradle
+++ b/samples/client/petstore/kotlin-nullable/build.gradle
@@ -8,6 +8,7 @@ wrapper {
 
 buildscript {
     ext.kotlin_version = '1.4.30'
+    ext.moshiVersion = '1.11.0'
 
     repositories {
         maven { url "https://repo1.maven.org/maven2" }
@@ -30,7 +31,8 @@ test {
 dependencies {
     compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
     compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
-    compile "com.squareup.moshi:moshi-kotlin:1.11.0"
+    compile "com.squareup.moshi:moshi-kotlin:$moshiVersion"
+    compile "com.squareup.moshi:moshi-adapters:$moshiVersion"
     compile "com.squareup.okhttp3:okhttp:4.9.0"
     testCompile "io.kotlintest:kotlintest-runner-junit5:3.4.2"
 }
diff --git a/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt b/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
index 9a45b67d9b1a435f1ebfa35c6d6c0fd329cea27b..ec6ef7b8a5d078dc9b9f84af3787c2acd56f8192 100644
--- a/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
+++ b/samples/client/petstore/kotlin-nullable/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
@@ -1,8 +1,10 @@
 package org.openapitools.client.infrastructure
 
 import com.squareup.moshi.Moshi
+import com.squareup.moshi.adapters.PolymorphicJsonAdapterFactory
 import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
 import java.util.Date
+import org.openapitools.client.models.*
 
 object Serializer {
     @JvmStatic
@@ -12,6 +14,7 @@ object Serializer {
         .add(LocalDateAdapter())
         .add(UUIDAdapter())
         .add(ByteArrayAdapter())
+        
         .add(KotlinJsonAdapterFactory())
 
     @JvmStatic
diff --git a/samples/client/petstore/kotlin-okhttp3/build.gradle b/samples/client/petstore/kotlin-okhttp3/build.gradle
index 1da4409df35fad64697c81cec4d7c0c93e76fae9..6bdf65f4c7e183c6d1530b4bda3d237acd509662 100644
--- a/samples/client/petstore/kotlin-okhttp3/build.gradle
+++ b/samples/client/petstore/kotlin-okhttp3/build.gradle
@@ -8,6 +8,7 @@ wrapper {
 
 buildscript {
     ext.kotlin_version = '1.4.30'
+    ext.moshiVersion = '1.11.0'
 
     repositories {
         maven { url "https://repo1.maven.org/maven2" }
@@ -30,7 +31,8 @@ test {
 dependencies {
     compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
     compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
-    compile "com.squareup.moshi:moshi-kotlin:1.11.0"
+    compile "com.squareup.moshi:moshi-kotlin:$moshiVersion"
+    compile "com.squareup.moshi:moshi-adapters:$moshiVersion"
     compile "com.squareup.okhttp3:okhttp:3.12.13"
     testCompile "io.kotlintest:kotlintest-runner-junit5:3.4.2"
 }
diff --git a/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt b/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
index 9a45b67d9b1a435f1ebfa35c6d6c0fd329cea27b..ec6ef7b8a5d078dc9b9f84af3787c2acd56f8192 100644
--- a/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
+++ b/samples/client/petstore/kotlin-okhttp3/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
@@ -1,8 +1,10 @@
 package org.openapitools.client.infrastructure
 
 import com.squareup.moshi.Moshi
+import com.squareup.moshi.adapters.PolymorphicJsonAdapterFactory
 import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
 import java.util.Date
+import org.openapitools.client.models.*
 
 object Serializer {
     @JvmStatic
@@ -12,6 +14,7 @@ object Serializer {
         .add(LocalDateAdapter())
         .add(UUIDAdapter())
         .add(ByteArrayAdapter())
+        
         .add(KotlinJsonAdapterFactory())
 
     @JvmStatic
diff --git a/samples/client/petstore/kotlin-retrofit2-rx3/build.gradle b/samples/client/petstore/kotlin-retrofit2-rx3/build.gradle
index b55dfb35245f84edb324a23d2402fd599af8bc05..f9da2bd483f06b97c0eedd91013977b2734139f6 100644
--- a/samples/client/petstore/kotlin-retrofit2-rx3/build.gradle
+++ b/samples/client/petstore/kotlin-retrofit2-rx3/build.gradle
@@ -10,6 +10,7 @@ buildscript {
     ext.kotlin_version = '1.4.30'
     ext.retrofitVersion = '2.7.2'
     ext.rxJava3Version = '3.0.10'
+    ext.moshiVersion = '1.11.0'
 
     repositories {
         maven { url "https://repo1.maven.org/maven2" }
@@ -32,7 +33,8 @@ test {
 dependencies {
     compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
     compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
-    compile "com.squareup.moshi:moshi-kotlin:1.11.0"
+    compile "com.squareup.moshi:moshi-kotlin:$moshiVersion"
+    compile "com.squareup.moshi:moshi-adapters:$moshiVersion"
     compile "org.apache.oltu.oauth2:org.apache.oltu.oauth2.client:1.0.0"
     compile "com.squareup.okhttp3:logging-interceptor:4.9.0"
     compile "io.reactivex.rxjava3:rxjava:$rxJava3Version"
diff --git a/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt b/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
index 9a45b67d9b1a435f1ebfa35c6d6c0fd329cea27b..ec6ef7b8a5d078dc9b9f84af3787c2acd56f8192 100644
--- a/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
+++ b/samples/client/petstore/kotlin-retrofit2-rx3/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
@@ -1,8 +1,10 @@
 package org.openapitools.client.infrastructure
 
 import com.squareup.moshi.Moshi
+import com.squareup.moshi.adapters.PolymorphicJsonAdapterFactory
 import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
 import java.util.Date
+import org.openapitools.client.models.*
 
 object Serializer {
     @JvmStatic
@@ -12,6 +14,7 @@ object Serializer {
         .add(LocalDateAdapter())
         .add(UUIDAdapter())
         .add(ByteArrayAdapter())
+        
         .add(KotlinJsonAdapterFactory())
 
     @JvmStatic
diff --git a/samples/client/petstore/kotlin-retrofit2/build.gradle b/samples/client/petstore/kotlin-retrofit2/build.gradle
index 109eb2ca069f5f5257fd46ef23fc7ee3c25f1e2e..68dacc2360a7fbceeb43c7c2fbea9d45860db09e 100644
--- a/samples/client/petstore/kotlin-retrofit2/build.gradle
+++ b/samples/client/petstore/kotlin-retrofit2/build.gradle
@@ -9,6 +9,7 @@ wrapper {
 buildscript {
     ext.kotlin_version = '1.4.30'
     ext.retrofitVersion = '2.7.2'
+    ext.moshiVersion = '1.11.0'
 
     repositories {
         maven { url "https://repo1.maven.org/maven2" }
@@ -31,7 +32,8 @@ test {
 dependencies {
     compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
     compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
-    compile "com.squareup.moshi:moshi-kotlin:1.11.0"
+    compile "com.squareup.moshi:moshi-kotlin:$moshiVersion"
+    compile "com.squareup.moshi:moshi-adapters:$moshiVersion"
     compile "org.apache.oltu.oauth2:org.apache.oltu.oauth2.client:1.0.0"
     compile "com.squareup.okhttp3:logging-interceptor:4.9.0"
     compile "com.squareup.retrofit2:retrofit:$retrofitVersion"
diff --git a/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt b/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
index 9a45b67d9b1a435f1ebfa35c6d6c0fd329cea27b..ec6ef7b8a5d078dc9b9f84af3787c2acd56f8192 100644
--- a/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
+++ b/samples/client/petstore/kotlin-retrofit2/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
@@ -1,8 +1,10 @@
 package org.openapitools.client.infrastructure
 
 import com.squareup.moshi.Moshi
+import com.squareup.moshi.adapters.PolymorphicJsonAdapterFactory
 import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
 import java.util.Date
+import org.openapitools.client.models.*
 
 object Serializer {
     @JvmStatic
@@ -12,6 +14,7 @@ object Serializer {
         .add(LocalDateAdapter())
         .add(UUIDAdapter())
         .add(ByteArrayAdapter())
+        
         .add(KotlinJsonAdapterFactory())
 
     @JvmStatic
diff --git a/samples/client/petstore/kotlin-string/build.gradle b/samples/client/petstore/kotlin-string/build.gradle
index 60e5056e03163b56773e5305d94d70148f8fa6cd..34d16649ec0edd45e7c85eb483568da15d03ba41 100644
--- a/samples/client/petstore/kotlin-string/build.gradle
+++ b/samples/client/petstore/kotlin-string/build.gradle
@@ -8,6 +8,7 @@ wrapper {
 
 buildscript {
     ext.kotlin_version = '1.4.30'
+    ext.moshiVersion = '1.11.0'
 
     repositories {
         maven { url "https://repo1.maven.org/maven2" }
@@ -30,7 +31,8 @@ test {
 dependencies {
     compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
     compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
-    compile "com.squareup.moshi:moshi-kotlin:1.11.0"
+    compile "com.squareup.moshi:moshi-kotlin:$moshiVersion"
+    compile "com.squareup.moshi:moshi-adapters:$moshiVersion"
     compile "com.squareup.okhttp3:okhttp:4.9.0"
     testCompile "io.kotlintest:kotlintest-runner-junit5:3.4.2"
 }
diff --git a/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt b/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
index 9a45b67d9b1a435f1ebfa35c6d6c0fd329cea27b..ec6ef7b8a5d078dc9b9f84af3787c2acd56f8192 100644
--- a/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
+++ b/samples/client/petstore/kotlin-string/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
@@ -1,8 +1,10 @@
 package org.openapitools.client.infrastructure
 
 import com.squareup.moshi.Moshi
+import com.squareup.moshi.adapters.PolymorphicJsonAdapterFactory
 import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
 import java.util.Date
+import org.openapitools.client.models.*
 
 object Serializer {
     @JvmStatic
@@ -12,6 +14,7 @@ object Serializer {
         .add(LocalDateAdapter())
         .add(UUIDAdapter())
         .add(ByteArrayAdapter())
+        
         .add(KotlinJsonAdapterFactory())
 
     @JvmStatic
diff --git a/samples/client/petstore/kotlin-threetenbp/build.gradle b/samples/client/petstore/kotlin-threetenbp/build.gradle
index 87605daa9d22ace0baf820cf948d0a7a29b8d3fa..9623adba5f99c88e6c59863069df44904e43ab6a 100644
--- a/samples/client/petstore/kotlin-threetenbp/build.gradle
+++ b/samples/client/petstore/kotlin-threetenbp/build.gradle
@@ -8,6 +8,7 @@ wrapper {
 
 buildscript {
     ext.kotlin_version = '1.4.30'
+    ext.moshiVersion = '1.11.0'
 
     repositories {
         maven { url "https://repo1.maven.org/maven2" }
@@ -30,7 +31,8 @@ test {
 dependencies {
     compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
     compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
-    compile "com.squareup.moshi:moshi-kotlin:1.11.0"
+    compile "com.squareup.moshi:moshi-kotlin:$moshiVersion"
+    compile "com.squareup.moshi:moshi-adapters:$moshiVersion"
     compile "com.squareup.okhttp3:okhttp:4.9.0"
     compile "org.threeten:threetenbp:1.5.0"
     testCompile "io.kotlintest:kotlintest-runner-junit5:3.4.2"
diff --git a/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt b/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
index 9a45b67d9b1a435f1ebfa35c6d6c0fd329cea27b..ec6ef7b8a5d078dc9b9f84af3787c2acd56f8192 100644
--- a/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
+++ b/samples/client/petstore/kotlin-threetenbp/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
@@ -1,8 +1,10 @@
 package org.openapitools.client.infrastructure
 
 import com.squareup.moshi.Moshi
+import com.squareup.moshi.adapters.PolymorphicJsonAdapterFactory
 import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
 import java.util.Date
+import org.openapitools.client.models.*
 
 object Serializer {
     @JvmStatic
@@ -12,6 +14,7 @@ object Serializer {
         .add(LocalDateAdapter())
         .add(UUIDAdapter())
         .add(ByteArrayAdapter())
+        
         .add(KotlinJsonAdapterFactory())
 
     @JvmStatic
diff --git a/samples/client/petstore/kotlin-uppercase-enum/build.gradle b/samples/client/petstore/kotlin-uppercase-enum/build.gradle
index 60e5056e03163b56773e5305d94d70148f8fa6cd..34d16649ec0edd45e7c85eb483568da15d03ba41 100644
--- a/samples/client/petstore/kotlin-uppercase-enum/build.gradle
+++ b/samples/client/petstore/kotlin-uppercase-enum/build.gradle
@@ -8,6 +8,7 @@ wrapper {
 
 buildscript {
     ext.kotlin_version = '1.4.30'
+    ext.moshiVersion = '1.11.0'
 
     repositories {
         maven { url "https://repo1.maven.org/maven2" }
@@ -30,7 +31,8 @@ test {
 dependencies {
     compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
     compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
-    compile "com.squareup.moshi:moshi-kotlin:1.11.0"
+    compile "com.squareup.moshi:moshi-kotlin:$moshiVersion"
+    compile "com.squareup.moshi:moshi-adapters:$moshiVersion"
     compile "com.squareup.okhttp3:okhttp:4.9.0"
     testCompile "io.kotlintest:kotlintest-runner-junit5:3.4.2"
 }
diff --git a/samples/client/petstore/kotlin-uppercase-enum/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt b/samples/client/petstore/kotlin-uppercase-enum/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
index 9a45b67d9b1a435f1ebfa35c6d6c0fd329cea27b..ec6ef7b8a5d078dc9b9f84af3787c2acd56f8192 100644
--- a/samples/client/petstore/kotlin-uppercase-enum/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
+++ b/samples/client/petstore/kotlin-uppercase-enum/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
@@ -1,8 +1,10 @@
 package org.openapitools.client.infrastructure
 
 import com.squareup.moshi.Moshi
+import com.squareup.moshi.adapters.PolymorphicJsonAdapterFactory
 import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
 import java.util.Date
+import org.openapitools.client.models.*
 
 object Serializer {
     @JvmStatic
@@ -12,6 +14,7 @@ object Serializer {
         .add(LocalDateAdapter())
         .add(UUIDAdapter())
         .add(ByteArrayAdapter())
+        
         .add(KotlinJsonAdapterFactory())
 
     @JvmStatic
diff --git a/samples/client/petstore/kotlin/build.gradle b/samples/client/petstore/kotlin/build.gradle
index 60e5056e03163b56773e5305d94d70148f8fa6cd..34d16649ec0edd45e7c85eb483568da15d03ba41 100644
--- a/samples/client/petstore/kotlin/build.gradle
+++ b/samples/client/petstore/kotlin/build.gradle
@@ -8,6 +8,7 @@ wrapper {
 
 buildscript {
     ext.kotlin_version = '1.4.30'
+    ext.moshiVersion = '1.11.0'
 
     repositories {
         maven { url "https://repo1.maven.org/maven2" }
@@ -30,7 +31,8 @@ test {
 dependencies {
     compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
     compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
-    compile "com.squareup.moshi:moshi-kotlin:1.11.0"
+    compile "com.squareup.moshi:moshi-kotlin:$moshiVersion"
+    compile "com.squareup.moshi:moshi-adapters:$moshiVersion"
     compile "com.squareup.okhttp3:okhttp:4.9.0"
     testCompile "io.kotlintest:kotlintest-runner-junit5:3.4.2"
 }
diff --git a/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt b/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
index 9a45b67d9b1a435f1ebfa35c6d6c0fd329cea27b..ec6ef7b8a5d078dc9b9f84af3787c2acd56f8192 100644
--- a/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
+++ b/samples/client/petstore/kotlin/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt
@@ -1,8 +1,10 @@
 package org.openapitools.client.infrastructure
 
 import com.squareup.moshi.Moshi
+import com.squareup.moshi.adapters.PolymorphicJsonAdapterFactory
 import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
 import java.util.Date
+import org.openapitools.client.models.*
 
 object Serializer {
     @JvmStatic
@@ -12,6 +14,7 @@ object Serializer {
         .add(LocalDateAdapter())
         .add(UUIDAdapter())
         .add(ByteArrayAdapter())
+        
         .add(KotlinJsonAdapterFactory())
 
     @JvmStatic