diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenModel.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenModel.java
index f2f0ee97ca39dabcc0a3dbe609d44bf30381fe11..7c16b0ca74a655d640ea8400623590c6c4c0b437 100644
--- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenModel.java
+++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenModel.java
@@ -75,6 +75,7 @@ public class CodegenModel implements IJsonSchemaValidationProperties {
 
     public Set<String> imports = new TreeSet<String>();
     public boolean hasVars, emptyVars, hasMoreModels, hasEnums, isEnum;
+    public CodegenProperty parentContainer;
     /**
      * Indicates the OAS schema specifies "nullable: true".
      */
diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenProperty.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenProperty.java
index bc1101c015e99c68388761f34aa4a96ddc22cd7b..40d1fbcf9a5d8de8410aa2b33d6836627740c03e 100644
--- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenProperty.java
+++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenProperty.java
@@ -154,6 +154,7 @@ public class CodegenProperty implements Cloneable, IJsonSchemaValidationProperti
     public List<String> _enum;
     public Map<String, Object> allowableValues;
     public CodegenProperty items;
+    public Integer itemsDepth;
     public CodegenProperty mostInnerItems;
     public Map<String, Object> vendorExtensions = new HashMap<String, Object>();
     public boolean hasValidation; // true if pattern, maximum, etc are set (only used in the mustache template)
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 6394f1ace4cba32af2ba44cafe0ab15bff71e773..c4d152e9159833af97fcb9a735660248786a42f6 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
@@ -2816,6 +2816,10 @@ public class DefaultCodegen implements CodegenConfig {
      * @return Codegen Property object
      */
     public CodegenProperty fromProperty(String name, Schema p) {
+        return fromProperty(name, p, null);
+    }
+
+    private CodegenProperty fromProperty(String name, Schema p, Integer itemsDepth) {
         if (p == null) {
             LOGGER.error("Undefined property/schema for `{}`. Default to type:string.", name);
             return null;
@@ -2829,6 +2833,7 @@ public class DefaultCodegen implements CodegenConfig {
 
         ModelUtils.syncValidationProperties(p, property);
 
+        property.itemsDepth = itemsDepth;
         property.name = toVarName(name);
         property.baseName = name;
         if (p.getType() == null) {
@@ -3070,7 +3075,11 @@ public class DefaultCodegen implements CodegenConfig {
             }
             ArraySchema arraySchema = (ArraySchema) p;
             Schema innerSchema = ModelUtils.unaliasSchema(this.openAPI, getSchemaItems(arraySchema), importMapping);
-            CodegenProperty cp = fromProperty(itemName, innerSchema);
+            if (arraySchema.getItems() == null) {
+                arraySchema.setItems(innerSchema);
+            }
+            CodegenProperty cp = fromProperty(itemName, innerSchema,
+                    itemsDepth == null ? 1 : itemsDepth.intValue() + 1);
             updatePropertyForArray(property, cp);
         } else if (ModelUtils.isMapSchema(p)) {
             property.isContainer = true;
@@ -3088,7 +3097,8 @@ public class DefaultCodegen implements CodegenConfig {
                 innerSchema = new StringSchema().description("//TODO automatically added by openapi-generator due to undefined type");
                 p.setAdditionalProperties(innerSchema);
             }
-            CodegenProperty cp = fromProperty("inner", innerSchema);
+            CodegenProperty cp = fromProperty("inner", innerSchema,
+                    itemsDepth == null ? 1 : itemsDepth.intValue() + 1);
             updatePropertyForMap(property, cp);
         } else if (ModelUtils.isFreeFormObject(p)) {
             property.isFreeFormObject = true;
@@ -4407,10 +4417,10 @@ public class DefaultCodegen implements CodegenConfig {
     }
 
     protected void addParentContainer(CodegenModel model, String name, Schema schema) {
-        final CodegenProperty property = fromProperty(name, schema);
-        addImport(model, property.complexType);
+        model.parentContainer = fromProperty(name, schema);
+        addImport(model, model.parentContainer.complexType);
         model.parent = toInstantiationType(schema);
-        final String containerType = property.containerType;
+        final String containerType = model.parentContainer.containerType;
         final String instantiationType = instantiationTypes.get(containerType);
         if (instantiationType != null) {
             addImport(model, instantiationType);