diff --git a/k8s-openapi-tests/src/api_versions.rs b/k8s-openapi-tests/src/api_versions.rs
new file mode 100644
index 0000000000..579baf85de
--- /dev/null
+++ b/k8s-openapi-tests/src/api_versions.rs
@@ -0,0 +1,21 @@
+#[test]
+fn list() {
+	#[cfg(feature = "v1_7")] use ::k8s_openapi::v1_7 as k8s;
+
+	#[cfg(feature = "v1_8")] use ::k8s_openapi::v1_8 as k8s;
+
+	#[cfg(feature = "v1_9")] use ::k8s_openapi::v1_9 as k8s;
+
+	#[cfg(feature = "v1_10")] use ::k8s_openapi::v1_10 as k8s;
+
+	let client = ::Client::new().expect("couldn't create client");
+
+	let api_versions =
+		k8s::get_api_versions(&client)
+		.expect("couldn't get API versions");
+	let api_versions = match api_versions {
+		k8s::GetAPIVersionsResponse::Ok(api_versions) => api_versions,
+		other => panic!("couldn't get API versions: {:?}", other),
+	};
+	assert_eq!(api_versions.kind, Some("APIGroupList".to_string()));
+}
diff --git a/k8s-openapi-tests/src/custom_resource_definition.rs b/k8s-openapi-tests/src/custom_resource_definition.rs
new file mode 100644
index 0000000000..1d6ef05ba6
--- /dev/null
+++ b/k8s-openapi-tests/src/custom_resource_definition.rs
@@ -0,0 +1,53 @@
+#[test]
+fn list() {
+	#[cfg(feature = "v1_8")] use ::k8s_openapi::v1_8::apiextensions_apiserver::pkg::apis::apiextensions::v1beta1 as apiextensions;
+	#[cfg(feature = "v1_8")] use ::k8s_openapi::v1_8::apimachinery::pkg::apis::meta::v1 as meta;
+
+	#[cfg(feature = "v1_9")] use ::k8s_openapi::v1_9::apiextensions_apiserver::pkg::apis::apiextensions::v1beta1 as apiextensions;
+	#[cfg(feature = "v1_9")] use ::k8s_openapi::v1_9::apimachinery::pkg::apis::meta::v1 as meta;
+
+	#[cfg(feature = "v1_10")] use ::k8s_openapi::v1_10::apiextensions_apiserver::pkg::apis::apiextensions::v1beta1 as apiextensions;
+	#[cfg(feature = "v1_10")] use ::k8s_openapi::v1_10::apimachinery::pkg::apis::meta::v1 as meta;
+
+	let client = ::Client::new().expect("couldn't create client");
+
+	let custom_resource_definition = apiextensions::CustomResourceDefinition {
+		metadata: Some(meta::ObjectMeta {
+			name: Some("foobars.k8s-openapi-tests-custom-resource-definition.com".to_string()),
+			..Default::default()
+		}),
+		spec: Some(apiextensions::CustomResourceDefinitionSpec {
+			group: "k8s-openapi-tests-custom-resource-definition.com".to_string(),
+			names: apiextensions::CustomResourceDefinitionNames {
+				kind: "FooBar".to_string(),
+				plural: "foobars".to_string(),
+				short_names: Some(vec!["fb".to_string()]),
+				singular: Some("foobar".to_string()),
+				..Default::default()
+			},
+			scope: "Namespaced".to_string(),
+			version: "v1".to_string(),
+			..Default::default()
+		}),
+		..Default::default()
+	};
+
+	let custom_resource_definition = apiextensions::CustomResourceDefinition::create_apiextensions_v1beta1_custom_resource_definition(
+		&client,
+		&custom_resource_definition,
+		None).expect("couldn't create custom resource definition");;
+	let custom_resource_definition: apiextensions::CustomResourceDefinition = match custom_resource_definition {
+		#[cfg(feature = "v1_8")] apiextensions::CreateApiextensionsV1beta1CustomResourceDefinitionResponse::Other(::http::StatusCode::CREATED, mut response) =>
+			response.json().expect("couldn't create custom resource definition"),
+		#[cfg(not(feature = "v1_8"))] apiextensions::CreateApiextensionsV1beta1CustomResourceDefinitionResponse::Created(custom_resource_definition) =>
+			custom_resource_definition,
+		other => panic!("couldn't create custom resource definition: {:?}", other),
+	};
+
+	let custom_resource_definition_self_link = {
+		let metadata = custom_resource_definition.metadata.expect("couldn't get custom resource definition metadata");
+		metadata.self_link.expect("couldn't get custom resource definition self link")
+	};
+
+	client.delete(&custom_resource_definition_self_link).expect("couldn't delete custom resource definition");
+}
diff --git a/k8s-openapi-tests/src/lib.rs b/k8s-openapi-tests/src/lib.rs
index 7f55b25db3..d98ab0e7a3 100644
--- a/k8s-openapi-tests/src/lib.rs
+++ b/k8s-openapi-tests/src/lib.rs
@@ -231,6 +231,11 @@ struct KubeConfigUser {
 	client_key: std::path::PathBuf,
 }
 
+mod api_versions;
+
+#[cfg(not(feature = "v1_7"))] // CRDs not supported in v1.7
+mod custom_resource_definition;
+
 mod deployment;
 
 mod job;
diff --git a/k8s-openapi/src/v1_10/api/policy/v1beta1/pod_disruption_budget_status.rs b/k8s-openapi/src/v1_10/api/policy/v1beta1/pod_disruption_budget_status.rs
index 609f6d279e..a70501ace4 100644
--- a/k8s-openapi/src/v1_10/api/policy/v1beta1/pod_disruption_budget_status.rs
+++ b/k8s-openapi/src/v1_10/api/policy/v1beta1/pod_disruption_budget_status.rs
@@ -10,7 +10,7 @@ pub struct PodDisruptionBudgetStatus {
     pub desired_healthy: i32,
 
     /// DisruptedPods contains information about pods whose eviction was processed by the API server eviction subresource handler but has not yet been observed by the PodDisruptionBudget controller. A pod will be in this map from the time when the API server processed the eviction request to the time when the pod is seen by PDB controller as having been marked for deletion (or after a timeout). The key in the map is the name of the pod and the value is the time when the API server processed the eviction request. If the deletion didn't occur and a pod is still there it will be removed from the list automatically by PodDisruptionBudget controller after some time. If everything goes smooth this map should be empty for the most of the time. Large number of entries in the map may indicate problems with pod deletions.
-    pub disrupted_pods: ::std::collections::BTreeMap<String, ::v1_10::apimachinery::pkg::apis::meta::v1::Time>,
+    pub disrupted_pods: Option<::std::collections::BTreeMap<String, ::v1_10::apimachinery::pkg::apis::meta::v1::Time>>,
 
     /// Number of pod disruptions that are currently allowed.
     pub disruptions_allowed: i32,
@@ -84,7 +84,7 @@ impl<'de> ::serde::Deserialize<'de> for PodDisruptionBudgetStatus {
                     match key {
                         Field::Key_current_healthy => value_current_healthy = Some(::serde::de::MapAccess::next_value(&mut map)?),
                         Field::Key_desired_healthy => value_desired_healthy = Some(::serde::de::MapAccess::next_value(&mut map)?),
-                        Field::Key_disrupted_pods => value_disrupted_pods = Some(::serde::de::MapAccess::next_value(&mut map)?),
+                        Field::Key_disrupted_pods => value_disrupted_pods = ::serde::de::MapAccess::next_value(&mut map)?,
                         Field::Key_disruptions_allowed => value_disruptions_allowed = Some(::serde::de::MapAccess::next_value(&mut map)?),
                         Field::Key_expected_pods => value_expected_pods = Some(::serde::de::MapAccess::next_value(&mut map)?),
                         Field::Key_observed_generation => value_observed_generation = ::serde::de::MapAccess::next_value(&mut map)?,
@@ -95,7 +95,7 @@ impl<'de> ::serde::Deserialize<'de> for PodDisruptionBudgetStatus {
                 Ok(PodDisruptionBudgetStatus {
                     current_healthy: value_current_healthy.ok_or_else(|| ::serde::de::Error::missing_field("currentHealthy"))?,
                     desired_healthy: value_desired_healthy.ok_or_else(|| ::serde::de::Error::missing_field("desiredHealthy"))?,
-                    disrupted_pods: value_disrupted_pods.ok_or_else(|| ::serde::de::Error::missing_field("disruptedPods"))?,
+                    disrupted_pods: value_disrupted_pods,
                     disruptions_allowed: value_disruptions_allowed.ok_or_else(|| ::serde::de::Error::missing_field("disruptionsAllowed"))?,
                     expected_pods: value_expected_pods.ok_or_else(|| ::serde::de::Error::missing_field("expectedPods"))?,
                     observed_generation: value_observed_generation,
@@ -125,14 +125,16 @@ impl ::serde::Serialize for PodDisruptionBudgetStatus {
             0 +
             1 +
             1 +
-            1 +
+            self.disrupted_pods.as_ref().map_or(0, |_| 1) +
             1 +
             1 +
             self.observed_generation.as_ref().map_or(0, |_| 1),
         )?;
         ::serde::ser::SerializeStruct::serialize_field(&mut state, "currentHealthy", &self.current_healthy)?;
         ::serde::ser::SerializeStruct::serialize_field(&mut state, "desiredHealthy", &self.desired_healthy)?;
-        ::serde::ser::SerializeStruct::serialize_field(&mut state, "disruptedPods", &self.disrupted_pods)?;
+        if let Some(value) = &self.disrupted_pods {
+            ::serde::ser::SerializeStruct::serialize_field(&mut state, "disruptedPods", value)?;
+        }
         ::serde::ser::SerializeStruct::serialize_field(&mut state, "disruptionsAllowed", &self.disruptions_allowed)?;
         ::serde::ser::SerializeStruct::serialize_field(&mut state, "expectedPods", &self.expected_pods)?;
         if let Some(value) = &self.observed_generation {
diff --git a/k8s-openapi/src/v1_10/apiextensions_apiserver/pkg/apis/apiextensions/v1beta1/custom_resource_definition_status.rs b/k8s-openapi/src/v1_10/apiextensions_apiserver/pkg/apis/apiextensions/v1beta1/custom_resource_definition_status.rs
index 4c4bf3939d..369fc9efa4 100644
--- a/k8s-openapi/src/v1_10/apiextensions_apiserver/pkg/apis/apiextensions/v1beta1/custom_resource_definition_status.rs
+++ b/k8s-openapi/src/v1_10/apiextensions_apiserver/pkg/apis/apiextensions/v1beta1/custom_resource_definition_status.rs
@@ -7,7 +7,7 @@ pub struct CustomResourceDefinitionStatus {
     pub accepted_names: ::v1_10::apiextensions_apiserver::pkg::apis::apiextensions::v1beta1::CustomResourceDefinitionNames,
 
     /// Conditions indicate state for particular aspects of a CustomResourceDefinition
-    pub conditions: Vec<::v1_10::apiextensions_apiserver::pkg::apis::apiextensions::v1beta1::CustomResourceDefinitionCondition>,
+    pub conditions: Option<Vec<::v1_10::apiextensions_apiserver::pkg::apis::apiextensions::v1beta1::CustomResourceDefinitionCondition>>,
 }
 
 impl<'de> ::serde::Deserialize<'de> for CustomResourceDefinitionStatus {
@@ -59,14 +59,14 @@ impl<'de> ::serde::Deserialize<'de> for CustomResourceDefinitionStatus {
                 while let Some(key) = ::serde::de::MapAccess::next_key::<Field>(&mut map)? {
                     match key {
                         Field::Key_accepted_names => value_accepted_names = Some(::serde::de::MapAccess::next_value(&mut map)?),
-                        Field::Key_conditions => value_conditions = Some(::serde::de::MapAccess::next_value(&mut map)?),
+                        Field::Key_conditions => value_conditions = ::serde::de::MapAccess::next_value(&mut map)?,
                         Field::Other => { let _: ::serde::de::IgnoredAny = ::serde::de::MapAccess::next_value(&mut map)?; },
                     }
                 }
 
                 Ok(CustomResourceDefinitionStatus {
                     accepted_names: value_accepted_names.ok_or_else(|| ::serde::de::Error::missing_field("acceptedNames"))?,
-                    conditions: value_conditions.ok_or_else(|| ::serde::de::Error::missing_field("conditions"))?,
+                    conditions: value_conditions,
                 })
             }
         }
@@ -88,10 +88,12 @@ impl ::serde::Serialize for CustomResourceDefinitionStatus {
             "CustomResourceDefinitionStatus",
             0 +
             1 +
-            1,
+            self.conditions.as_ref().map_or(0, |_| 1),
         )?;
         ::serde::ser::SerializeStruct::serialize_field(&mut state, "acceptedNames", &self.accepted_names)?;
-        ::serde::ser::SerializeStruct::serialize_field(&mut state, "conditions", &self.conditions)?;
+        if let Some(value) = &self.conditions {
+            ::serde::ser::SerializeStruct::serialize_field(&mut state, "conditions", value)?;
+        }
         ::serde::ser::SerializeStruct::end(state)
     }
 }
diff --git a/k8s-openapi/src/v1_10/apimachinery/pkg/apis/meta/v1/api_group.rs b/k8s-openapi/src/v1_10/apimachinery/pkg/apis/meta/v1/api_group.rs
index 18e25123b5..3670a714f6 100644
--- a/k8s-openapi/src/v1_10/apimachinery/pkg/apis/meta/v1/api_group.rs
+++ b/k8s-openapi/src/v1_10/apimachinery/pkg/apis/meta/v1/api_group.rs
@@ -16,7 +16,7 @@ pub struct APIGroup {
     pub preferred_version: Option<::v1_10::apimachinery::pkg::apis::meta::v1::GroupVersionForDiscovery>,
 
     /// a map of client CIDR to server address that is serving this group. This is to help clients reach servers in the most network-efficient way possible. Clients can use the appropriate server address as per the CIDR that they match. In case of multiple matches, clients should use the longest matching CIDR. The server returns only those CIDRs that it thinks that the client can match. For example: the master will return an internal IP CIDR only, if the client reaches the server using an internal IP. Server looks at X-Forwarded-For header or X-Real-Ip header or request.RemoteAddr (in that order) to get the client IP.
-    pub server_address_by_client_cidrs: Vec<::v1_10::apimachinery::pkg::apis::meta::v1::ServerAddressByClientCIDR>,
+    pub server_address_by_client_cidrs: Option<Vec<::v1_10::apimachinery::pkg::apis::meta::v1::ServerAddressByClientCIDR>>,
 
     /// versions are the versions supported in this group.
     pub versions: Vec<::v1_10::apimachinery::pkg::apis::meta::v1::GroupVersionForDiscovery>,
@@ -86,7 +86,7 @@ impl<'de> ::serde::Deserialize<'de> for APIGroup {
                         Field::Key_kind => value_kind = ::serde::de::MapAccess::next_value(&mut map)?,
                         Field::Key_name => value_name = Some(::serde::de::MapAccess::next_value(&mut map)?),
                         Field::Key_preferred_version => value_preferred_version = ::serde::de::MapAccess::next_value(&mut map)?,
-                        Field::Key_server_address_by_client_cidrs => value_server_address_by_client_cidrs = Some(::serde::de::MapAccess::next_value(&mut map)?),
+                        Field::Key_server_address_by_client_cidrs => value_server_address_by_client_cidrs = ::serde::de::MapAccess::next_value(&mut map)?,
                         Field::Key_versions => value_versions = Some(::serde::de::MapAccess::next_value(&mut map)?),
                         Field::Other => { let _: ::serde::de::IgnoredAny = ::serde::de::MapAccess::next_value(&mut map)?; },
                     }
@@ -97,7 +97,7 @@ impl<'de> ::serde::Deserialize<'de> for APIGroup {
                     kind: value_kind,
                     name: value_name.ok_or_else(|| ::serde::de::Error::missing_field("name"))?,
                     preferred_version: value_preferred_version,
-                    server_address_by_client_cidrs: value_server_address_by_client_cidrs.ok_or_else(|| ::serde::de::Error::missing_field("serverAddressByClientCIDRs"))?,
+                    server_address_by_client_cidrs: value_server_address_by_client_cidrs,
                     versions: value_versions.ok_or_else(|| ::serde::de::Error::missing_field("versions"))?,
                 })
             }
@@ -127,7 +127,7 @@ impl ::serde::Serialize for APIGroup {
             self.kind.as_ref().map_or(0, |_| 1) +
             1 +
             self.preferred_version.as_ref().map_or(0, |_| 1) +
-            1 +
+            self.server_address_by_client_cidrs.as_ref().map_or(0, |_| 1) +
             1,
         )?;
         if let Some(value) = &self.api_version {
@@ -140,7 +140,9 @@ impl ::serde::Serialize for APIGroup {
         if let Some(value) = &self.preferred_version {
             ::serde::ser::SerializeStruct::serialize_field(&mut state, "preferredVersion", value)?;
         }
-        ::serde::ser::SerializeStruct::serialize_field(&mut state, "serverAddressByClientCIDRs", &self.server_address_by_client_cidrs)?;
+        if let Some(value) = &self.server_address_by_client_cidrs {
+            ::serde::ser::SerializeStruct::serialize_field(&mut state, "serverAddressByClientCIDRs", value)?;
+        }
         ::serde::ser::SerializeStruct::serialize_field(&mut state, "versions", &self.versions)?;
         ::serde::ser::SerializeStruct::end(state)
     }
diff --git a/k8s-openapi/src/v1_7/apimachinery/pkg/apis/meta/v1/api_group.rs b/k8s-openapi/src/v1_7/apimachinery/pkg/apis/meta/v1/api_group.rs
index 4151d93488..c34d05c3eb 100644
--- a/k8s-openapi/src/v1_7/apimachinery/pkg/apis/meta/v1/api_group.rs
+++ b/k8s-openapi/src/v1_7/apimachinery/pkg/apis/meta/v1/api_group.rs
@@ -16,7 +16,7 @@ pub struct APIGroup {
     pub preferred_version: Option<::v1_7::apimachinery::pkg::apis::meta::v1::GroupVersionForDiscovery>,
 
     /// a map of client CIDR to server address that is serving this group. This is to help clients reach servers in the most network-efficient way possible. Clients can use the appropriate server address as per the CIDR that they match. In case of multiple matches, clients should use the longest matching CIDR. The server returns only those CIDRs that it thinks that the client can match. For example: the master will return an internal IP CIDR only, if the client reaches the server using an internal IP. Server looks at X-Forwarded-For header or X-Real-Ip header or request.RemoteAddr (in that order) to get the client IP.
-    pub server_address_by_client_cidrs: Vec<::v1_7::apimachinery::pkg::apis::meta::v1::ServerAddressByClientCIDR>,
+    pub server_address_by_client_cidrs: Option<Vec<::v1_7::apimachinery::pkg::apis::meta::v1::ServerAddressByClientCIDR>>,
 
     /// versions are the versions supported in this group.
     pub versions: Vec<::v1_7::apimachinery::pkg::apis::meta::v1::GroupVersionForDiscovery>,
@@ -86,7 +86,7 @@ impl<'de> ::serde::Deserialize<'de> for APIGroup {
                         Field::Key_kind => value_kind = ::serde::de::MapAccess::next_value(&mut map)?,
                         Field::Key_name => value_name = Some(::serde::de::MapAccess::next_value(&mut map)?),
                         Field::Key_preferred_version => value_preferred_version = ::serde::de::MapAccess::next_value(&mut map)?,
-                        Field::Key_server_address_by_client_cidrs => value_server_address_by_client_cidrs = Some(::serde::de::MapAccess::next_value(&mut map)?),
+                        Field::Key_server_address_by_client_cidrs => value_server_address_by_client_cidrs = ::serde::de::MapAccess::next_value(&mut map)?,
                         Field::Key_versions => value_versions = Some(::serde::de::MapAccess::next_value(&mut map)?),
                         Field::Other => { let _: ::serde::de::IgnoredAny = ::serde::de::MapAccess::next_value(&mut map)?; },
                     }
@@ -97,7 +97,7 @@ impl<'de> ::serde::Deserialize<'de> for APIGroup {
                     kind: value_kind,
                     name: value_name.ok_or_else(|| ::serde::de::Error::missing_field("name"))?,
                     preferred_version: value_preferred_version,
-                    server_address_by_client_cidrs: value_server_address_by_client_cidrs.ok_or_else(|| ::serde::de::Error::missing_field("serverAddressByClientCIDRs"))?,
+                    server_address_by_client_cidrs: value_server_address_by_client_cidrs,
                     versions: value_versions.ok_or_else(|| ::serde::de::Error::missing_field("versions"))?,
                 })
             }
@@ -127,7 +127,7 @@ impl ::serde::Serialize for APIGroup {
             self.kind.as_ref().map_or(0, |_| 1) +
             1 +
             self.preferred_version.as_ref().map_or(0, |_| 1) +
-            1 +
+            self.server_address_by_client_cidrs.as_ref().map_or(0, |_| 1) +
             1,
         )?;
         if let Some(value) = &self.api_version {
@@ -140,7 +140,9 @@ impl ::serde::Serialize for APIGroup {
         if let Some(value) = &self.preferred_version {
             ::serde::ser::SerializeStruct::serialize_field(&mut state, "preferredVersion", value)?;
         }
-        ::serde::ser::SerializeStruct::serialize_field(&mut state, "serverAddressByClientCIDRs", &self.server_address_by_client_cidrs)?;
+        if let Some(value) = &self.server_address_by_client_cidrs {
+            ::serde::ser::SerializeStruct::serialize_field(&mut state, "serverAddressByClientCIDRs", value)?;
+        }
         ::serde::ser::SerializeStruct::serialize_field(&mut state, "versions", &self.versions)?;
         ::serde::ser::SerializeStruct::end(state)
     }
diff --git a/k8s-openapi/src/v1_8/api/policy/v1beta1/pod_disruption_budget_status.rs b/k8s-openapi/src/v1_8/api/policy/v1beta1/pod_disruption_budget_status.rs
index 8162f443d1..c888f86ae2 100644
--- a/k8s-openapi/src/v1_8/api/policy/v1beta1/pod_disruption_budget_status.rs
+++ b/k8s-openapi/src/v1_8/api/policy/v1beta1/pod_disruption_budget_status.rs
@@ -10,7 +10,7 @@ pub struct PodDisruptionBudgetStatus {
     pub desired_healthy: i32,
 
     /// DisruptedPods contains information about pods whose eviction was processed by the API server eviction subresource handler but has not yet been observed by the PodDisruptionBudget controller. A pod will be in this map from the time when the API server processed the eviction request to the time when the pod is seen by PDB controller as having been marked for deletion (or after a timeout). The key in the map is the name of the pod and the value is the time when the API server processed the eviction request. If the deletion didn't occur and a pod is still there it will be removed from the list automatically by PodDisruptionBudget controller after some time. If everything goes smooth this map should be empty for the most of the time. Large number of entries in the map may indicate problems with pod deletions.
-    pub disrupted_pods: ::std::collections::BTreeMap<String, ::v1_8::apimachinery::pkg::apis::meta::v1::Time>,
+    pub disrupted_pods: Option<::std::collections::BTreeMap<String, ::v1_8::apimachinery::pkg::apis::meta::v1::Time>>,
 
     /// Number of pod disruptions that are currently allowed.
     pub disruptions_allowed: i32,
@@ -84,7 +84,7 @@ impl<'de> ::serde::Deserialize<'de> for PodDisruptionBudgetStatus {
                     match key {
                         Field::Key_current_healthy => value_current_healthy = Some(::serde::de::MapAccess::next_value(&mut map)?),
                         Field::Key_desired_healthy => value_desired_healthy = Some(::serde::de::MapAccess::next_value(&mut map)?),
-                        Field::Key_disrupted_pods => value_disrupted_pods = Some(::serde::de::MapAccess::next_value(&mut map)?),
+                        Field::Key_disrupted_pods => value_disrupted_pods = ::serde::de::MapAccess::next_value(&mut map)?,
                         Field::Key_disruptions_allowed => value_disruptions_allowed = Some(::serde::de::MapAccess::next_value(&mut map)?),
                         Field::Key_expected_pods => value_expected_pods = Some(::serde::de::MapAccess::next_value(&mut map)?),
                         Field::Key_observed_generation => value_observed_generation = ::serde::de::MapAccess::next_value(&mut map)?,
@@ -95,7 +95,7 @@ impl<'de> ::serde::Deserialize<'de> for PodDisruptionBudgetStatus {
                 Ok(PodDisruptionBudgetStatus {
                     current_healthy: value_current_healthy.ok_or_else(|| ::serde::de::Error::missing_field("currentHealthy"))?,
                     desired_healthy: value_desired_healthy.ok_or_else(|| ::serde::de::Error::missing_field("desiredHealthy"))?,
-                    disrupted_pods: value_disrupted_pods.ok_or_else(|| ::serde::de::Error::missing_field("disruptedPods"))?,
+                    disrupted_pods: value_disrupted_pods,
                     disruptions_allowed: value_disruptions_allowed.ok_or_else(|| ::serde::de::Error::missing_field("disruptionsAllowed"))?,
                     expected_pods: value_expected_pods.ok_or_else(|| ::serde::de::Error::missing_field("expectedPods"))?,
                     observed_generation: value_observed_generation,
@@ -125,14 +125,16 @@ impl ::serde::Serialize for PodDisruptionBudgetStatus {
             0 +
             1 +
             1 +
-            1 +
+            self.disrupted_pods.as_ref().map_or(0, |_| 1) +
             1 +
             1 +
             self.observed_generation.as_ref().map_or(0, |_| 1),
         )?;
         ::serde::ser::SerializeStruct::serialize_field(&mut state, "currentHealthy", &self.current_healthy)?;
         ::serde::ser::SerializeStruct::serialize_field(&mut state, "desiredHealthy", &self.desired_healthy)?;
-        ::serde::ser::SerializeStruct::serialize_field(&mut state, "disruptedPods", &self.disrupted_pods)?;
+        if let Some(value) = &self.disrupted_pods {
+            ::serde::ser::SerializeStruct::serialize_field(&mut state, "disruptedPods", value)?;
+        }
         ::serde::ser::SerializeStruct::serialize_field(&mut state, "disruptionsAllowed", &self.disruptions_allowed)?;
         ::serde::ser::SerializeStruct::serialize_field(&mut state, "expectedPods", &self.expected_pods)?;
         if let Some(value) = &self.observed_generation {
diff --git a/k8s-openapi/src/v1_8/apiextensions_apiserver/pkg/apis/apiextensions/v1beta1/custom_resource_definition_status.rs b/k8s-openapi/src/v1_8/apiextensions_apiserver/pkg/apis/apiextensions/v1beta1/custom_resource_definition_status.rs
index dab8202fd5..d1395c99c9 100644
--- a/k8s-openapi/src/v1_8/apiextensions_apiserver/pkg/apis/apiextensions/v1beta1/custom_resource_definition_status.rs
+++ b/k8s-openapi/src/v1_8/apiextensions_apiserver/pkg/apis/apiextensions/v1beta1/custom_resource_definition_status.rs
@@ -7,7 +7,7 @@ pub struct CustomResourceDefinitionStatus {
     pub accepted_names: ::v1_8::apiextensions_apiserver::pkg::apis::apiextensions::v1beta1::CustomResourceDefinitionNames,
 
     /// Conditions indicate state for particular aspects of a CustomResourceDefinition
-    pub conditions: Vec<::v1_8::apiextensions_apiserver::pkg::apis::apiextensions::v1beta1::CustomResourceDefinitionCondition>,
+    pub conditions: Option<Vec<::v1_8::apiextensions_apiserver::pkg::apis::apiextensions::v1beta1::CustomResourceDefinitionCondition>>,
 }
 
 impl<'de> ::serde::Deserialize<'de> for CustomResourceDefinitionStatus {
@@ -59,14 +59,14 @@ impl<'de> ::serde::Deserialize<'de> for CustomResourceDefinitionStatus {
                 while let Some(key) = ::serde::de::MapAccess::next_key::<Field>(&mut map)? {
                     match key {
                         Field::Key_accepted_names => value_accepted_names = Some(::serde::de::MapAccess::next_value(&mut map)?),
-                        Field::Key_conditions => value_conditions = Some(::serde::de::MapAccess::next_value(&mut map)?),
+                        Field::Key_conditions => value_conditions = ::serde::de::MapAccess::next_value(&mut map)?,
                         Field::Other => { let _: ::serde::de::IgnoredAny = ::serde::de::MapAccess::next_value(&mut map)?; },
                     }
                 }
 
                 Ok(CustomResourceDefinitionStatus {
                     accepted_names: value_accepted_names.ok_or_else(|| ::serde::de::Error::missing_field("acceptedNames"))?,
-                    conditions: value_conditions.ok_or_else(|| ::serde::de::Error::missing_field("conditions"))?,
+                    conditions: value_conditions,
                 })
             }
         }
@@ -88,10 +88,12 @@ impl ::serde::Serialize for CustomResourceDefinitionStatus {
             "CustomResourceDefinitionStatus",
             0 +
             1 +
-            1,
+            self.conditions.as_ref().map_or(0, |_| 1),
         )?;
         ::serde::ser::SerializeStruct::serialize_field(&mut state, "acceptedNames", &self.accepted_names)?;
-        ::serde::ser::SerializeStruct::serialize_field(&mut state, "conditions", &self.conditions)?;
+        if let Some(value) = &self.conditions {
+            ::serde::ser::SerializeStruct::serialize_field(&mut state, "conditions", value)?;
+        }
         ::serde::ser::SerializeStruct::end(state)
     }
 }
diff --git a/k8s-openapi/src/v1_8/apimachinery/pkg/apis/meta/v1/api_group.rs b/k8s-openapi/src/v1_8/apimachinery/pkg/apis/meta/v1/api_group.rs
index aee6b7b74e..615a1500e5 100644
--- a/k8s-openapi/src/v1_8/apimachinery/pkg/apis/meta/v1/api_group.rs
+++ b/k8s-openapi/src/v1_8/apimachinery/pkg/apis/meta/v1/api_group.rs
@@ -16,7 +16,7 @@ pub struct APIGroup {
     pub preferred_version: Option<::v1_8::apimachinery::pkg::apis::meta::v1::GroupVersionForDiscovery>,
 
     /// a map of client CIDR to server address that is serving this group. This is to help clients reach servers in the most network-efficient way possible. Clients can use the appropriate server address as per the CIDR that they match. In case of multiple matches, clients should use the longest matching CIDR. The server returns only those CIDRs that it thinks that the client can match. For example: the master will return an internal IP CIDR only, if the client reaches the server using an internal IP. Server looks at X-Forwarded-For header or X-Real-Ip header or request.RemoteAddr (in that order) to get the client IP.
-    pub server_address_by_client_cidrs: Vec<::v1_8::apimachinery::pkg::apis::meta::v1::ServerAddressByClientCIDR>,
+    pub server_address_by_client_cidrs: Option<Vec<::v1_8::apimachinery::pkg::apis::meta::v1::ServerAddressByClientCIDR>>,
 
     /// versions are the versions supported in this group.
     pub versions: Vec<::v1_8::apimachinery::pkg::apis::meta::v1::GroupVersionForDiscovery>,
@@ -86,7 +86,7 @@ impl<'de> ::serde::Deserialize<'de> for APIGroup {
                         Field::Key_kind => value_kind = ::serde::de::MapAccess::next_value(&mut map)?,
                         Field::Key_name => value_name = Some(::serde::de::MapAccess::next_value(&mut map)?),
                         Field::Key_preferred_version => value_preferred_version = ::serde::de::MapAccess::next_value(&mut map)?,
-                        Field::Key_server_address_by_client_cidrs => value_server_address_by_client_cidrs = Some(::serde::de::MapAccess::next_value(&mut map)?),
+                        Field::Key_server_address_by_client_cidrs => value_server_address_by_client_cidrs = ::serde::de::MapAccess::next_value(&mut map)?,
                         Field::Key_versions => value_versions = Some(::serde::de::MapAccess::next_value(&mut map)?),
                         Field::Other => { let _: ::serde::de::IgnoredAny = ::serde::de::MapAccess::next_value(&mut map)?; },
                     }
@@ -97,7 +97,7 @@ impl<'de> ::serde::Deserialize<'de> for APIGroup {
                     kind: value_kind,
                     name: value_name.ok_or_else(|| ::serde::de::Error::missing_field("name"))?,
                     preferred_version: value_preferred_version,
-                    server_address_by_client_cidrs: value_server_address_by_client_cidrs.ok_or_else(|| ::serde::de::Error::missing_field("serverAddressByClientCIDRs"))?,
+                    server_address_by_client_cidrs: value_server_address_by_client_cidrs,
                     versions: value_versions.ok_or_else(|| ::serde::de::Error::missing_field("versions"))?,
                 })
             }
@@ -127,7 +127,7 @@ impl ::serde::Serialize for APIGroup {
             self.kind.as_ref().map_or(0, |_| 1) +
             1 +
             self.preferred_version.as_ref().map_or(0, |_| 1) +
-            1 +
+            self.server_address_by_client_cidrs.as_ref().map_or(0, |_| 1) +
             1,
         )?;
         if let Some(value) = &self.api_version {
@@ -140,7 +140,9 @@ impl ::serde::Serialize for APIGroup {
         if let Some(value) = &self.preferred_version {
             ::serde::ser::SerializeStruct::serialize_field(&mut state, "preferredVersion", value)?;
         }
-        ::serde::ser::SerializeStruct::serialize_field(&mut state, "serverAddressByClientCIDRs", &self.server_address_by_client_cidrs)?;
+        if let Some(value) = &self.server_address_by_client_cidrs {
+            ::serde::ser::SerializeStruct::serialize_field(&mut state, "serverAddressByClientCIDRs", value)?;
+        }
         ::serde::ser::SerializeStruct::serialize_field(&mut state, "versions", &self.versions)?;
         ::serde::ser::SerializeStruct::end(state)
     }
diff --git a/k8s-openapi/src/v1_9/api/policy/v1beta1/pod_disruption_budget_status.rs b/k8s-openapi/src/v1_9/api/policy/v1beta1/pod_disruption_budget_status.rs
index 806745fa79..cac858b1f6 100644
--- a/k8s-openapi/src/v1_9/api/policy/v1beta1/pod_disruption_budget_status.rs
+++ b/k8s-openapi/src/v1_9/api/policy/v1beta1/pod_disruption_budget_status.rs
@@ -10,7 +10,7 @@ pub struct PodDisruptionBudgetStatus {
     pub desired_healthy: i32,
 
     /// DisruptedPods contains information about pods whose eviction was processed by the API server eviction subresource handler but has not yet been observed by the PodDisruptionBudget controller. A pod will be in this map from the time when the API server processed the eviction request to the time when the pod is seen by PDB controller as having been marked for deletion (or after a timeout). The key in the map is the name of the pod and the value is the time when the API server processed the eviction request. If the deletion didn't occur and a pod is still there it will be removed from the list automatically by PodDisruptionBudget controller after some time. If everything goes smooth this map should be empty for the most of the time. Large number of entries in the map may indicate problems with pod deletions.
-    pub disrupted_pods: ::std::collections::BTreeMap<String, ::v1_9::apimachinery::pkg::apis::meta::v1::Time>,
+    pub disrupted_pods: Option<::std::collections::BTreeMap<String, ::v1_9::apimachinery::pkg::apis::meta::v1::Time>>,
 
     /// Number of pod disruptions that are currently allowed.
     pub disruptions_allowed: i32,
@@ -84,7 +84,7 @@ impl<'de> ::serde::Deserialize<'de> for PodDisruptionBudgetStatus {
                     match key {
                         Field::Key_current_healthy => value_current_healthy = Some(::serde::de::MapAccess::next_value(&mut map)?),
                         Field::Key_desired_healthy => value_desired_healthy = Some(::serde::de::MapAccess::next_value(&mut map)?),
-                        Field::Key_disrupted_pods => value_disrupted_pods = Some(::serde::de::MapAccess::next_value(&mut map)?),
+                        Field::Key_disrupted_pods => value_disrupted_pods = ::serde::de::MapAccess::next_value(&mut map)?,
                         Field::Key_disruptions_allowed => value_disruptions_allowed = Some(::serde::de::MapAccess::next_value(&mut map)?),
                         Field::Key_expected_pods => value_expected_pods = Some(::serde::de::MapAccess::next_value(&mut map)?),
                         Field::Key_observed_generation => value_observed_generation = ::serde::de::MapAccess::next_value(&mut map)?,
@@ -95,7 +95,7 @@ impl<'de> ::serde::Deserialize<'de> for PodDisruptionBudgetStatus {
                 Ok(PodDisruptionBudgetStatus {
                     current_healthy: value_current_healthy.ok_or_else(|| ::serde::de::Error::missing_field("currentHealthy"))?,
                     desired_healthy: value_desired_healthy.ok_or_else(|| ::serde::de::Error::missing_field("desiredHealthy"))?,
-                    disrupted_pods: value_disrupted_pods.ok_or_else(|| ::serde::de::Error::missing_field("disruptedPods"))?,
+                    disrupted_pods: value_disrupted_pods,
                     disruptions_allowed: value_disruptions_allowed.ok_or_else(|| ::serde::de::Error::missing_field("disruptionsAllowed"))?,
                     expected_pods: value_expected_pods.ok_or_else(|| ::serde::de::Error::missing_field("expectedPods"))?,
                     observed_generation: value_observed_generation,
@@ -125,14 +125,16 @@ impl ::serde::Serialize for PodDisruptionBudgetStatus {
             0 +
             1 +
             1 +
-            1 +
+            self.disrupted_pods.as_ref().map_or(0, |_| 1) +
             1 +
             1 +
             self.observed_generation.as_ref().map_or(0, |_| 1),
         )?;
         ::serde::ser::SerializeStruct::serialize_field(&mut state, "currentHealthy", &self.current_healthy)?;
         ::serde::ser::SerializeStruct::serialize_field(&mut state, "desiredHealthy", &self.desired_healthy)?;
-        ::serde::ser::SerializeStruct::serialize_field(&mut state, "disruptedPods", &self.disrupted_pods)?;
+        if let Some(value) = &self.disrupted_pods {
+            ::serde::ser::SerializeStruct::serialize_field(&mut state, "disruptedPods", value)?;
+        }
         ::serde::ser::SerializeStruct::serialize_field(&mut state, "disruptionsAllowed", &self.disruptions_allowed)?;
         ::serde::ser::SerializeStruct::serialize_field(&mut state, "expectedPods", &self.expected_pods)?;
         if let Some(value) = &self.observed_generation {
diff --git a/k8s-openapi/src/v1_9/apiextensions_apiserver/pkg/apis/apiextensions/v1beta1/custom_resource_definition_status.rs b/k8s-openapi/src/v1_9/apiextensions_apiserver/pkg/apis/apiextensions/v1beta1/custom_resource_definition_status.rs
index 658f7fba55..3d28c4de03 100644
--- a/k8s-openapi/src/v1_9/apiextensions_apiserver/pkg/apis/apiextensions/v1beta1/custom_resource_definition_status.rs
+++ b/k8s-openapi/src/v1_9/apiextensions_apiserver/pkg/apis/apiextensions/v1beta1/custom_resource_definition_status.rs
@@ -7,7 +7,7 @@ pub struct CustomResourceDefinitionStatus {
     pub accepted_names: ::v1_9::apiextensions_apiserver::pkg::apis::apiextensions::v1beta1::CustomResourceDefinitionNames,
 
     /// Conditions indicate state for particular aspects of a CustomResourceDefinition
-    pub conditions: Vec<::v1_9::apiextensions_apiserver::pkg::apis::apiextensions::v1beta1::CustomResourceDefinitionCondition>,
+    pub conditions: Option<Vec<::v1_9::apiextensions_apiserver::pkg::apis::apiextensions::v1beta1::CustomResourceDefinitionCondition>>,
 }
 
 impl<'de> ::serde::Deserialize<'de> for CustomResourceDefinitionStatus {
@@ -59,14 +59,14 @@ impl<'de> ::serde::Deserialize<'de> for CustomResourceDefinitionStatus {
                 while let Some(key) = ::serde::de::MapAccess::next_key::<Field>(&mut map)? {
                     match key {
                         Field::Key_accepted_names => value_accepted_names = Some(::serde::de::MapAccess::next_value(&mut map)?),
-                        Field::Key_conditions => value_conditions = Some(::serde::de::MapAccess::next_value(&mut map)?),
+                        Field::Key_conditions => value_conditions = ::serde::de::MapAccess::next_value(&mut map)?,
                         Field::Other => { let _: ::serde::de::IgnoredAny = ::serde::de::MapAccess::next_value(&mut map)?; },
                     }
                 }
 
                 Ok(CustomResourceDefinitionStatus {
                     accepted_names: value_accepted_names.ok_or_else(|| ::serde::de::Error::missing_field("acceptedNames"))?,
-                    conditions: value_conditions.ok_or_else(|| ::serde::de::Error::missing_field("conditions"))?,
+                    conditions: value_conditions,
                 })
             }
         }
@@ -88,10 +88,12 @@ impl ::serde::Serialize for CustomResourceDefinitionStatus {
             "CustomResourceDefinitionStatus",
             0 +
             1 +
-            1,
+            self.conditions.as_ref().map_or(0, |_| 1),
         )?;
         ::serde::ser::SerializeStruct::serialize_field(&mut state, "acceptedNames", &self.accepted_names)?;
-        ::serde::ser::SerializeStruct::serialize_field(&mut state, "conditions", &self.conditions)?;
+        if let Some(value) = &self.conditions {
+            ::serde::ser::SerializeStruct::serialize_field(&mut state, "conditions", value)?;
+        }
         ::serde::ser::SerializeStruct::end(state)
     }
 }
diff --git a/k8s-openapi/src/v1_9/apimachinery/pkg/apis/meta/v1/api_group.rs b/k8s-openapi/src/v1_9/apimachinery/pkg/apis/meta/v1/api_group.rs
index b1c1f886e0..4774219cc7 100644
--- a/k8s-openapi/src/v1_9/apimachinery/pkg/apis/meta/v1/api_group.rs
+++ b/k8s-openapi/src/v1_9/apimachinery/pkg/apis/meta/v1/api_group.rs
@@ -16,7 +16,7 @@ pub struct APIGroup {
     pub preferred_version: Option<::v1_9::apimachinery::pkg::apis::meta::v1::GroupVersionForDiscovery>,
 
     /// a map of client CIDR to server address that is serving this group. This is to help clients reach servers in the most network-efficient way possible. Clients can use the appropriate server address as per the CIDR that they match. In case of multiple matches, clients should use the longest matching CIDR. The server returns only those CIDRs that it thinks that the client can match. For example: the master will return an internal IP CIDR only, if the client reaches the server using an internal IP. Server looks at X-Forwarded-For header or X-Real-Ip header or request.RemoteAddr (in that order) to get the client IP.
-    pub server_address_by_client_cidrs: Vec<::v1_9::apimachinery::pkg::apis::meta::v1::ServerAddressByClientCIDR>,
+    pub server_address_by_client_cidrs: Option<Vec<::v1_9::apimachinery::pkg::apis::meta::v1::ServerAddressByClientCIDR>>,
 
     /// versions are the versions supported in this group.
     pub versions: Vec<::v1_9::apimachinery::pkg::apis::meta::v1::GroupVersionForDiscovery>,
@@ -86,7 +86,7 @@ impl<'de> ::serde::Deserialize<'de> for APIGroup {
                         Field::Key_kind => value_kind = ::serde::de::MapAccess::next_value(&mut map)?,
                         Field::Key_name => value_name = Some(::serde::de::MapAccess::next_value(&mut map)?),
                         Field::Key_preferred_version => value_preferred_version = ::serde::de::MapAccess::next_value(&mut map)?,
-                        Field::Key_server_address_by_client_cidrs => value_server_address_by_client_cidrs = Some(::serde::de::MapAccess::next_value(&mut map)?),
+                        Field::Key_server_address_by_client_cidrs => value_server_address_by_client_cidrs = ::serde::de::MapAccess::next_value(&mut map)?,
                         Field::Key_versions => value_versions = Some(::serde::de::MapAccess::next_value(&mut map)?),
                         Field::Other => { let _: ::serde::de::IgnoredAny = ::serde::de::MapAccess::next_value(&mut map)?; },
                     }
@@ -97,7 +97,7 @@ impl<'de> ::serde::Deserialize<'de> for APIGroup {
                     kind: value_kind,
                     name: value_name.ok_or_else(|| ::serde::de::Error::missing_field("name"))?,
                     preferred_version: value_preferred_version,
-                    server_address_by_client_cidrs: value_server_address_by_client_cidrs.ok_or_else(|| ::serde::de::Error::missing_field("serverAddressByClientCIDRs"))?,
+                    server_address_by_client_cidrs: value_server_address_by_client_cidrs,
                     versions: value_versions.ok_or_else(|| ::serde::de::Error::missing_field("versions"))?,
                 })
             }
@@ -127,7 +127,7 @@ impl ::serde::Serialize for APIGroup {
             self.kind.as_ref().map_or(0, |_| 1) +
             1 +
             self.preferred_version.as_ref().map_or(0, |_| 1) +
-            1 +
+            self.server_address_by_client_cidrs.as_ref().map_or(0, |_| 1) +
             1,
         )?;
         if let Some(value) = &self.api_version {
@@ -140,7 +140,9 @@ impl ::serde::Serialize for APIGroup {
         if let Some(value) = &self.preferred_version {
             ::serde::ser::SerializeStruct::serialize_field(&mut state, "preferredVersion", value)?;
         }
-        ::serde::ser::SerializeStruct::serialize_field(&mut state, "serverAddressByClientCIDRs", &self.server_address_by_client_cidrs)?;
+        if let Some(value) = &self.server_address_by_client_cidrs {
+            ::serde::ser::SerializeStruct::serialize_field(&mut state, "serverAddressByClientCIDRs", value)?;
+        }
         ::serde::ser::SerializeStruct::serialize_field(&mut state, "versions", &self.versions)?;
         ::serde::ser::SerializeStruct::end(state)
     }
diff --git a/src/main.rs b/src/main.rs
index 79569080f7..3cebf62904 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -477,30 +477,82 @@ fn run(input: &str, out_dir_base: &std::path::Path, mod_root: &str, client: &req
 
 #[derive(Debug, Default)]
 struct Fixups {
+	apigroup_optional_properties: bool,
 	apiresource_gkv: bool,
 	apiservicev1_gkv: bool,
 	apiservicev1beta1_gkv: bool,
 	crd_gkv: bool,
+	crdstatus_optional_properties: bool,
+	poddisruptionbudgetstatus_optional_properties: bool,
 	raw_extension_ty: bool,
 }
 
 impl Fixups {
 	fn apply(&mut self, spec: &mut swagger20::Spec) {
 		for (definition_path, definition) in &mut spec.definitions {
-			if &**definition_path == "io.k8s.apimachinery.pkg.runtime.RawExtension" {
-				// The spec says that `RawExtension` is an object with a property `raw` that's a byte-formatted string.
-				// While the golang type is indeed a struct with a `Raw []byte` field, the type is serialized by just emitting the value of that field.
-				// The value of that field is itself a JSON-serialized value. For example, a `WatchEvent` of `Pod`s has the `Pod` object serialized as
-				// the value of the `WatchEvent::object` property.
-				//
-				// Thus `RawExtension` is really an arbitrary JSON value, and should be represented by `serde_json::Value`
-				//
-				// Ref: https://github.com/kubernetes/kubernetes/issues/55890
-				//
-				// https://github.com/kubernetes/kubernetes/pull/56434 will remove RawExtension and replace it with `{ type: "object" }`,
-				// which would've already been mapped to `Ty(Any)` by `Ty::parse`, so just replicate that for `RawExtension` here.
-				definition.kind = swagger20::SchemaKind::Ty(swagger20::Type::Any);
-				self.raw_extension_ty = true;
+			match &**definition_path {
+				"io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionStatus" =>
+					// The spec says that `CustomResourceDefinitionStatus::conditions` is an array, but it can be null.
+					//
+					// Override it to be optional to achieve the same effect.
+					//
+					// Ref: https://github.com/kubernetes/kubernetes/pull/64996
+					if let swagger20::SchemaKind::Properties(properties) = &mut definition.kind {
+						if let Some(property) = properties.get_mut(&swagger20::PropertyName("conditions".to_string())) {
+							if property.1 {
+								property.1 = false;
+								self.crdstatus_optional_properties = true;
+							}
+						}
+					},
+
+				"io.k8s.apimachinery.pkg.apis.meta.v1.APIGroup" =>
+					// The spec says that `APIGroup::serverAddressByClientCIDRs` is an array, but it can be null.
+					//
+					// Override it to be optional to achieve the same effect.
+					//
+					// Ref: https://github.com/kubernetes/kubernetes/pull/61963
+					if let swagger20::SchemaKind::Properties(properties) = &mut definition.kind {
+						if let Some(property) = properties.get_mut(&swagger20::PropertyName("serverAddressByClientCIDRs".to_string())) {
+							if property.1 {
+								property.1 = false;
+								self.apigroup_optional_properties = true;
+							}
+						}
+					},
+
+				"io.k8s.apimachinery.pkg.runtime.RawExtension" => {
+					// The spec says that `RawExtension` is an object with a property `raw` that's a byte-formatted string.
+					// While the golang type is indeed a struct with a `Raw []byte` field, the type is serialized by just emitting the value of that field.
+					// The value of that field is itself a JSON-serialized value. For example, a `WatchEvent` of `Pod`s has the `Pod` object serialized as
+					// the value of the `WatchEvent::object` property.
+					//
+					// Thus `RawExtension` is really an arbitrary JSON value, and should be represented by `serde_json::Value`
+					//
+					// Ref: https://github.com/kubernetes/kubernetes/issues/55890
+					//
+					// https://github.com/kubernetes/kubernetes/pull/56434 will remove RawExtension and replace it with `{ type: "object" }`,
+					// which would've already been mapped to `Ty(Any)` by `Ty::parse`, so just replicate that for `RawExtension` here.
+					definition.kind = swagger20::SchemaKind::Ty(swagger20::Type::Any);
+					self.raw_extension_ty = true;
+				},
+
+				"io.k8s.api.policy.v1beta1.PodDisruptionBudgetStatus" =>
+					// The spec says that `APIGroup::serverAddressByClientCIDRs` is an array, but it can be null.
+					//
+					// Override it to be optional to achieve the same effect.
+					//
+					// Ref: https://github.com/kubernetes/kubernetes/pull/65041
+					if let swagger20::SchemaKind::Properties(properties) = &mut definition.kind {
+						if let Some(property) = properties.get_mut(&swagger20::PropertyName("disruptedPods".to_string())) {
+							if property.1 {
+								property.1 = false;
+								self.poddisruptionbudgetstatus_optional_properties = true;
+							}
+						}
+					},
+
+				_ => (),
 			}
 
 			if definition.kubernetes_group_kind_versions.is_none() {
@@ -552,9 +604,14 @@ impl Fixups {
 	}
 
 	fn verify(&self) -> Result<(), Error> {
+		if !self.apigroup_optional_properties {
+			return Err("never applied APIGroups optional properties override".into());
+		}
+
 		if !self.apiresource_gkv {
 			return Err("never applied APIResource kubernetes_group_kind_version override".into());
 		}
+
 		if !self.apiservicev1_gkv {
 			return Err("never applied APIService v1 kubernetes_group_kind_version override".into());
 		}
@@ -567,6 +624,14 @@ impl Fixups {
 			return Err("never applied CustomResourceDefinition kubernetes_group_kind_version override".into());
 		}
 
+		if !self.crdstatus_optional_properties {
+			return Err("never applied CustomResourceDefinitionStatus optional properties override".into());
+		}
+
+		if !self.poddisruptionbudgetstatus_optional_properties {
+			return Err("never applied PodDisruptionBudgetStatus optional properties override".into());
+		}
+
 		if !self.raw_extension_ty {
 			return Err("never applied RawExtension override".into());
 		}