diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPythonCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPythonCodegen.java
index f07cef7e4dec41bcaabde13aacbd891fe8d63373..ff05cc5d12f1b693ecb91911013a988f1e370f26 100644
--- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPythonCodegen.java
+++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPythonCodegen.java
@@ -672,11 +672,8 @@ public abstract class AbstractPythonCodegen extends DefaultCodegen implements Co
 
     @Override
     public String toApiFilename(String name) {
-        // replace - with _ e.g. created-at => created_at
-        name = name.replaceAll("-", "_");
-
         // e.g. PhoneNumberApi.py => phone_number_api.py
-        return underscore(name + "_" + apiNameSuffix);
+        return underscore(toApiName(name));
     }
 
     @Override
@@ -691,10 +688,7 @@ public abstract class AbstractPythonCodegen extends DefaultCodegen implements Co
 
     @Override
     public String toApiVarName(String name) {
-        if (name.length() == 0) {
-            return "default_api";
-        }
-        return underscore(name + "_" + apiNameSuffix);
+        return underscore(toApiName(name));
     }
 
     protected static String dropDots(String str) {
diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPythonConnexionServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPythonConnexionServerCodegen.java
index 400e417a85b352a2cb5df9f7ccaa8c22601ba3d6..b9ddac1fecd03a8cffca925f06edcb93d6a8b94a 100644
--- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPythonConnexionServerCodegen.java
+++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPythonConnexionServerCodegen.java
@@ -297,10 +297,7 @@ public abstract class AbstractPythonConnexionServerCodegen extends AbstractPytho
         return camelize(name, false) + "Controller";
     }
 
-    @Override
-    public String toApiFilename(String name) {
-        return underscore(toApiName(name));
-    }
+
 
     @Override
     public String toApiTestFilename(String name) {
diff --git a/samples/client/petstore/python-asyncio/.openapi-generator/FILES b/samples/client/petstore/python-asyncio/.openapi-generator/FILES
index 4beeb0e176e39df5e21d35ae2b24a3bbc3193d8c..5835827fb98fa7f134bd56100a6681ee2c1d1703 100644
--- a/samples/client/petstore/python-asyncio/.openapi-generator/FILES
+++ b/samples/client/petstore/python-asyncio/.openapi-generator/FILES
@@ -61,7 +61,7 @@ petstore_api/__init__.py
 petstore_api/api/__init__.py
 petstore_api/api/another_fake_api.py
 petstore_api/api/fake_api.py
-petstore_api/api/fake_classname_tags_123_api.py
+petstore_api/api/fake_classname_tags123_api.py
 petstore_api/api/pet_api.py
 petstore_api/api/store_api.py
 petstore_api/api/user_api.py
diff --git a/samples/client/petstore/python-asyncio/petstore_api/__init__.py b/samples/client/petstore/python-asyncio/petstore_api/__init__.py
index b9fdaf07ac19eef5ede2f951a9f89634de0677f1..62a0d6bb97f5f7fd3dd6d8dd641175a544433a7c 100644
--- a/samples/client/petstore/python-asyncio/petstore_api/__init__.py
+++ b/samples/client/petstore/python-asyncio/petstore_api/__init__.py
@@ -19,7 +19,7 @@ __version__ = "1.0.0"
 # import apis into sdk package
 from petstore_api.api.another_fake_api import AnotherFakeApi
 from petstore_api.api.fake_api import FakeApi
-from petstore_api.api.fake_classname_tags_123_api import FakeClassnameTags123Api
+from petstore_api.api.fake_classname_tags123_api import FakeClassnameTags123Api
 from petstore_api.api.pet_api import PetApi
 from petstore_api.api.store_api import StoreApi
 from petstore_api.api.user_api import UserApi
diff --git a/samples/client/petstore/python-asyncio/petstore_api/api/__init__.py b/samples/client/petstore/python-asyncio/petstore_api/api/__init__.py
index 74496adb5a2b95328f1a2288598713bede13b41e..ea4a9e3acb7daa9d52e3ac92349a58415ce27c11 100644
--- a/samples/client/petstore/python-asyncio/petstore_api/api/__init__.py
+++ b/samples/client/petstore/python-asyncio/petstore_api/api/__init__.py
@@ -5,7 +5,7 @@ from __future__ import absolute_import
 # import apis into api package
 from petstore_api.api.another_fake_api import AnotherFakeApi
 from petstore_api.api.fake_api import FakeApi
-from petstore_api.api.fake_classname_tags_123_api import FakeClassnameTags123Api
+from petstore_api.api.fake_classname_tags123_api import FakeClassnameTags123Api
 from petstore_api.api.pet_api import PetApi
 from petstore_api.api.store_api import StoreApi
 from petstore_api.api.user_api import UserApi
diff --git a/samples/client/petstore/python-asyncio/petstore_api/api/fake_classname_tags123_api.py b/samples/client/petstore/python-asyncio/petstore_api/api/fake_classname_tags123_api.py
new file mode 100644
index 0000000000000000000000000000000000000000..2b46147fed581d76eef5e735b901288c0b975ef1
--- /dev/null
+++ b/samples/client/petstore/python-asyncio/petstore_api/api/fake_classname_tags123_api.py
@@ -0,0 +1,180 @@
+# coding: utf-8
+
+"""
+    OpenAPI Petstore
+
+    This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\  # noqa: E501
+
+    The version of the OpenAPI document: 1.0.0
+    Generated by: https://openapi-generator.tech
+"""
+
+
+from __future__ import absolute_import
+
+import re  # noqa: F401
+
+# python 2 and python 3 compatibility library
+import six
+
+from petstore_api.api_client import ApiClient
+from petstore_api.exceptions import (  # noqa: F401
+    ApiTypeError,
+    ApiValueError
+)
+
+
+class FakeClassnameTags123Api(object):
+    """NOTE: This class is auto generated by OpenAPI Generator
+    Ref: https://openapi-generator.tech
+
+    Do not edit the class manually.
+    """
+
+    def __init__(self, api_client=None):
+        if api_client is None:
+            api_client = ApiClient()
+        self.api_client = api_client
+
+    def test_classname(self, body, **kwargs):  # noqa: E501
+        """To test class name in snake case  # noqa: E501
+
+        To test class name in snake case  # noqa: E501
+        This method makes a synchronous HTTP request by default. To make an
+        asynchronous HTTP request, please pass async_req=True
+
+        >>> thread = api.test_classname(body, async_req=True)
+        >>> result = thread.get()
+
+        :param body: client model (required)
+        :type body: Client
+        :param async_req: Whether to execute the request asynchronously.
+        :type async_req: bool, optional
+        :param _preload_content: if False, the urllib3.HTTPResponse object will
+                                 be returned without reading/decoding response
+                                 data. Default is True.
+        :type _preload_content: bool, optional
+        :param _request_timeout: timeout setting for this request. If one
+                                 number provided, it will be total request
+                                 timeout. It can also be a pair (tuple) of
+                                 (connection, read) timeouts.
+        :return: Returns the result object.
+                 If the method is called asynchronously,
+                 returns the request thread.
+        :rtype: Client
+        """
+        kwargs['_return_http_data_only'] = True
+        return self.test_classname_with_http_info(body, **kwargs)  # noqa: E501
+
+    def test_classname_with_http_info(self, body, **kwargs):  # noqa: E501
+        """To test class name in snake case  # noqa: E501
+
+        To test class name in snake case  # noqa: E501
+        This method makes a synchronous HTTP request by default. To make an
+        asynchronous HTTP request, please pass async_req=True
+
+        >>> thread = api.test_classname_with_http_info(body, async_req=True)
+        >>> result = thread.get()
+
+        :param body: client model (required)
+        :type body: Client
+        :param async_req: Whether to execute the request asynchronously.
+        :type async_req: bool, optional
+        :param _return_http_data_only: response data without head status code
+                                       and headers
+        :type _return_http_data_only: bool, optional
+        :param _preload_content: if False, the urllib3.HTTPResponse object will
+                                 be returned without reading/decoding response
+                                 data. Default is True.
+        :type _preload_content: bool, optional
+        :param _request_timeout: timeout setting for this request. If one
+                                 number provided, it will be total request
+                                 timeout. It can also be a pair (tuple) of
+                                 (connection, read) timeouts.
+        :param _request_auth: set to override the auth_settings for an a single
+                              request; this effectively ignores the authentication
+                              in the spec for a single request.
+        :type _request_auth: dict, optional
+        :type _content_type: string, optional: force content-type for the request
+        :return: Returns the result object.
+                 If the method is called asynchronously,
+                 returns the request thread.
+        :rtype: tuple(Client, status_code(int), headers(HTTPHeaderDict))
+        """
+
+        local_var_params = locals()
+
+        all_params = [
+            'body'
+        ]
+        all_params.extend(
+            [
+                'async_req',
+                '_return_http_data_only',
+                '_preload_content',
+                '_request_timeout',
+                '_request_auth',
+                '_content_type'
+            ]
+        )
+
+        for key, val in six.iteritems(local_var_params['kwargs']):
+            if key not in all_params:
+                raise ApiTypeError(
+                    "Got an unexpected keyword argument '%s'"
+                    " to method test_classname" % key
+                )
+            local_var_params[key] = val
+        del local_var_params['kwargs']
+        # verify the required parameter 'body' is set
+        if self.api_client.client_side_validation and ('body' not in local_var_params or  # noqa: E501
+                                                        local_var_params['body'] is None):  # noqa: E501
+            raise ApiValueError("Missing the required parameter `body` when calling `test_classname`")  # noqa: E501
+
+        collection_formats = {}
+
+        path_params = {}
+
+        query_params = []
+
+        header_params = {}
+
+        form_params = []
+        local_var_files = {}
+
+        body_params = None
+        if 'body' in local_var_params:
+            body_params = local_var_params['body']
+        # HTTP header `Accept`
+        header_params['Accept'] = self.api_client.select_header_accept(
+            ['application/json'])  # noqa: E501
+
+        # HTTP header `Content-Type`
+        header_params['Content-Type'] = local_var_params.get('_content_type',
+            self.api_client.select_header_content_type(
+                ['application/json'],
+                'PATCH', body_params))  # noqa: E501
+
+        # Authentication setting
+        auth_settings = ['api_key_query']  # noqa: E501
+
+        response_types_map = {
+            200: "Client",
+        }
+
+        return self.api_client.call_api(
+            '/fake_classname_test', 'PATCH',
+            path_params,
+            query_params,
+            header_params,
+            body=body_params,
+            post_params=form_params,
+            files=local_var_files,
+            response_types_map=response_types_map,
+            auth_settings=auth_settings,
+            async_req=local_var_params.get('async_req'),
+            _return_http_data_only=local_var_params.get('_return_http_data_only'),  # noqa: E501
+            _preload_content=local_var_params.get('_preload_content', True),
+            _request_timeout=local_var_params.get('_request_timeout'),
+            collection_formats=collection_formats,
+            _request_auth=local_var_params.get('_request_auth'))
diff --git a/samples/client/petstore/python-asyncio/test/test_fake_classname_tags123_api.py b/samples/client/petstore/python-asyncio/test/test_fake_classname_tags123_api.py
new file mode 100644
index 0000000000000000000000000000000000000000..f54e0d06644f261ea603b460db974f7adfda0e58
--- /dev/null
+++ b/samples/client/petstore/python-asyncio/test/test_fake_classname_tags123_api.py
@@ -0,0 +1,40 @@
+# coding: utf-8
+
+"""
+    OpenAPI Petstore
+
+    This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\  # noqa: E501
+
+    The version of the OpenAPI document: 1.0.0
+    Generated by: https://openapi-generator.tech
+"""
+
+
+from __future__ import absolute_import
+
+import unittest
+
+import petstore_api
+from petstore_api.api.fake_classname_tags_123_api import FakeClassnameTags123Api  # noqa: E501
+from petstore_api.rest import ApiException
+
+
+class TestFakeClassnameTags123Api(unittest.TestCase):
+    """FakeClassnameTags123Api unit test stubs"""
+
+    def setUp(self):
+        self.api = petstore_api.api.fake_classname_tags_123_api.FakeClassnameTags123Api()  # noqa: E501
+
+    def tearDown(self):
+        pass
+
+    def test_test_classname(self):
+        """Test case for test_classname
+
+        To test class name in snake case  # noqa: E501
+        """
+        pass
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/samples/client/petstore/python-legacy/.openapi-generator/FILES b/samples/client/petstore/python-legacy/.openapi-generator/FILES
index 4beeb0e176e39df5e21d35ae2b24a3bbc3193d8c..5835827fb98fa7f134bd56100a6681ee2c1d1703 100644
--- a/samples/client/petstore/python-legacy/.openapi-generator/FILES
+++ b/samples/client/petstore/python-legacy/.openapi-generator/FILES
@@ -61,7 +61,7 @@ petstore_api/__init__.py
 petstore_api/api/__init__.py
 petstore_api/api/another_fake_api.py
 petstore_api/api/fake_api.py
-petstore_api/api/fake_classname_tags_123_api.py
+petstore_api/api/fake_classname_tags123_api.py
 petstore_api/api/pet_api.py
 petstore_api/api/store_api.py
 petstore_api/api/user_api.py
diff --git a/samples/client/petstore/python-legacy/petstore_api/__init__.py b/samples/client/petstore/python-legacy/petstore_api/__init__.py
index b9fdaf07ac19eef5ede2f951a9f89634de0677f1..62a0d6bb97f5f7fd3dd6d8dd641175a544433a7c 100644
--- a/samples/client/petstore/python-legacy/petstore_api/__init__.py
+++ b/samples/client/petstore/python-legacy/petstore_api/__init__.py
@@ -19,7 +19,7 @@ __version__ = "1.0.0"
 # import apis into sdk package
 from petstore_api.api.another_fake_api import AnotherFakeApi
 from petstore_api.api.fake_api import FakeApi
-from petstore_api.api.fake_classname_tags_123_api import FakeClassnameTags123Api
+from petstore_api.api.fake_classname_tags123_api import FakeClassnameTags123Api
 from petstore_api.api.pet_api import PetApi
 from petstore_api.api.store_api import StoreApi
 from petstore_api.api.user_api import UserApi
diff --git a/samples/client/petstore/python-legacy/petstore_api/api/__init__.py b/samples/client/petstore/python-legacy/petstore_api/api/__init__.py
index 74496adb5a2b95328f1a2288598713bede13b41e..ea4a9e3acb7daa9d52e3ac92349a58415ce27c11 100644
--- a/samples/client/petstore/python-legacy/petstore_api/api/__init__.py
+++ b/samples/client/petstore/python-legacy/petstore_api/api/__init__.py
@@ -5,7 +5,7 @@ from __future__ import absolute_import
 # import apis into api package
 from petstore_api.api.another_fake_api import AnotherFakeApi
 from petstore_api.api.fake_api import FakeApi
-from petstore_api.api.fake_classname_tags_123_api import FakeClassnameTags123Api
+from petstore_api.api.fake_classname_tags123_api import FakeClassnameTags123Api
 from petstore_api.api.pet_api import PetApi
 from petstore_api.api.store_api import StoreApi
 from petstore_api.api.user_api import UserApi
diff --git a/samples/client/petstore/python-legacy/petstore_api/api/fake_classname_tags123_api.py b/samples/client/petstore/python-legacy/petstore_api/api/fake_classname_tags123_api.py
new file mode 100644
index 0000000000000000000000000000000000000000..2b46147fed581d76eef5e735b901288c0b975ef1
--- /dev/null
+++ b/samples/client/petstore/python-legacy/petstore_api/api/fake_classname_tags123_api.py
@@ -0,0 +1,180 @@
+# coding: utf-8
+
+"""
+    OpenAPI Petstore
+
+    This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\  # noqa: E501
+
+    The version of the OpenAPI document: 1.0.0
+    Generated by: https://openapi-generator.tech
+"""
+
+
+from __future__ import absolute_import
+
+import re  # noqa: F401
+
+# python 2 and python 3 compatibility library
+import six
+
+from petstore_api.api_client import ApiClient
+from petstore_api.exceptions import (  # noqa: F401
+    ApiTypeError,
+    ApiValueError
+)
+
+
+class FakeClassnameTags123Api(object):
+    """NOTE: This class is auto generated by OpenAPI Generator
+    Ref: https://openapi-generator.tech
+
+    Do not edit the class manually.
+    """
+
+    def __init__(self, api_client=None):
+        if api_client is None:
+            api_client = ApiClient()
+        self.api_client = api_client
+
+    def test_classname(self, body, **kwargs):  # noqa: E501
+        """To test class name in snake case  # noqa: E501
+
+        To test class name in snake case  # noqa: E501
+        This method makes a synchronous HTTP request by default. To make an
+        asynchronous HTTP request, please pass async_req=True
+
+        >>> thread = api.test_classname(body, async_req=True)
+        >>> result = thread.get()
+
+        :param body: client model (required)
+        :type body: Client
+        :param async_req: Whether to execute the request asynchronously.
+        :type async_req: bool, optional
+        :param _preload_content: if False, the urllib3.HTTPResponse object will
+                                 be returned without reading/decoding response
+                                 data. Default is True.
+        :type _preload_content: bool, optional
+        :param _request_timeout: timeout setting for this request. If one
+                                 number provided, it will be total request
+                                 timeout. It can also be a pair (tuple) of
+                                 (connection, read) timeouts.
+        :return: Returns the result object.
+                 If the method is called asynchronously,
+                 returns the request thread.
+        :rtype: Client
+        """
+        kwargs['_return_http_data_only'] = True
+        return self.test_classname_with_http_info(body, **kwargs)  # noqa: E501
+
+    def test_classname_with_http_info(self, body, **kwargs):  # noqa: E501
+        """To test class name in snake case  # noqa: E501
+
+        To test class name in snake case  # noqa: E501
+        This method makes a synchronous HTTP request by default. To make an
+        asynchronous HTTP request, please pass async_req=True
+
+        >>> thread = api.test_classname_with_http_info(body, async_req=True)
+        >>> result = thread.get()
+
+        :param body: client model (required)
+        :type body: Client
+        :param async_req: Whether to execute the request asynchronously.
+        :type async_req: bool, optional
+        :param _return_http_data_only: response data without head status code
+                                       and headers
+        :type _return_http_data_only: bool, optional
+        :param _preload_content: if False, the urllib3.HTTPResponse object will
+                                 be returned without reading/decoding response
+                                 data. Default is True.
+        :type _preload_content: bool, optional
+        :param _request_timeout: timeout setting for this request. If one
+                                 number provided, it will be total request
+                                 timeout. It can also be a pair (tuple) of
+                                 (connection, read) timeouts.
+        :param _request_auth: set to override the auth_settings for an a single
+                              request; this effectively ignores the authentication
+                              in the spec for a single request.
+        :type _request_auth: dict, optional
+        :type _content_type: string, optional: force content-type for the request
+        :return: Returns the result object.
+                 If the method is called asynchronously,
+                 returns the request thread.
+        :rtype: tuple(Client, status_code(int), headers(HTTPHeaderDict))
+        """
+
+        local_var_params = locals()
+
+        all_params = [
+            'body'
+        ]
+        all_params.extend(
+            [
+                'async_req',
+                '_return_http_data_only',
+                '_preload_content',
+                '_request_timeout',
+                '_request_auth',
+                '_content_type'
+            ]
+        )
+
+        for key, val in six.iteritems(local_var_params['kwargs']):
+            if key not in all_params:
+                raise ApiTypeError(
+                    "Got an unexpected keyword argument '%s'"
+                    " to method test_classname" % key
+                )
+            local_var_params[key] = val
+        del local_var_params['kwargs']
+        # verify the required parameter 'body' is set
+        if self.api_client.client_side_validation and ('body' not in local_var_params or  # noqa: E501
+                                                        local_var_params['body'] is None):  # noqa: E501
+            raise ApiValueError("Missing the required parameter `body` when calling `test_classname`")  # noqa: E501
+
+        collection_formats = {}
+
+        path_params = {}
+
+        query_params = []
+
+        header_params = {}
+
+        form_params = []
+        local_var_files = {}
+
+        body_params = None
+        if 'body' in local_var_params:
+            body_params = local_var_params['body']
+        # HTTP header `Accept`
+        header_params['Accept'] = self.api_client.select_header_accept(
+            ['application/json'])  # noqa: E501
+
+        # HTTP header `Content-Type`
+        header_params['Content-Type'] = local_var_params.get('_content_type',
+            self.api_client.select_header_content_type(
+                ['application/json'],
+                'PATCH', body_params))  # noqa: E501
+
+        # Authentication setting
+        auth_settings = ['api_key_query']  # noqa: E501
+
+        response_types_map = {
+            200: "Client",
+        }
+
+        return self.api_client.call_api(
+            '/fake_classname_test', 'PATCH',
+            path_params,
+            query_params,
+            header_params,
+            body=body_params,
+            post_params=form_params,
+            files=local_var_files,
+            response_types_map=response_types_map,
+            auth_settings=auth_settings,
+            async_req=local_var_params.get('async_req'),
+            _return_http_data_only=local_var_params.get('_return_http_data_only'),  # noqa: E501
+            _preload_content=local_var_params.get('_preload_content', True),
+            _request_timeout=local_var_params.get('_request_timeout'),
+            collection_formats=collection_formats,
+            _request_auth=local_var_params.get('_request_auth'))
diff --git a/samples/client/petstore/python-legacy/test/test_fake_classname_tags123_api.py b/samples/client/petstore/python-legacy/test/test_fake_classname_tags123_api.py
new file mode 100644
index 0000000000000000000000000000000000000000..f54e0d06644f261ea603b460db974f7adfda0e58
--- /dev/null
+++ b/samples/client/petstore/python-legacy/test/test_fake_classname_tags123_api.py
@@ -0,0 +1,40 @@
+# coding: utf-8
+
+"""
+    OpenAPI Petstore
+
+    This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\  # noqa: E501
+
+    The version of the OpenAPI document: 1.0.0
+    Generated by: https://openapi-generator.tech
+"""
+
+
+from __future__ import absolute_import
+
+import unittest
+
+import petstore_api
+from petstore_api.api.fake_classname_tags_123_api import FakeClassnameTags123Api  # noqa: E501
+from petstore_api.rest import ApiException
+
+
+class TestFakeClassnameTags123Api(unittest.TestCase):
+    """FakeClassnameTags123Api unit test stubs"""
+
+    def setUp(self):
+        self.api = petstore_api.api.fake_classname_tags_123_api.FakeClassnameTags123Api()  # noqa: E501
+
+    def tearDown(self):
+        pass
+
+    def test_test_classname(self):
+        """Test case for test_classname
+
+        To test class name in snake case  # noqa: E501
+        """
+        pass
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/samples/client/petstore/python-tornado/.openapi-generator/FILES b/samples/client/petstore/python-tornado/.openapi-generator/FILES
index 4beeb0e176e39df5e21d35ae2b24a3bbc3193d8c..5835827fb98fa7f134bd56100a6681ee2c1d1703 100644
--- a/samples/client/petstore/python-tornado/.openapi-generator/FILES
+++ b/samples/client/petstore/python-tornado/.openapi-generator/FILES
@@ -61,7 +61,7 @@ petstore_api/__init__.py
 petstore_api/api/__init__.py
 petstore_api/api/another_fake_api.py
 petstore_api/api/fake_api.py
-petstore_api/api/fake_classname_tags_123_api.py
+petstore_api/api/fake_classname_tags123_api.py
 petstore_api/api/pet_api.py
 petstore_api/api/store_api.py
 petstore_api/api/user_api.py
diff --git a/samples/client/petstore/python-tornado/petstore_api/__init__.py b/samples/client/petstore/python-tornado/petstore_api/__init__.py
index b9fdaf07ac19eef5ede2f951a9f89634de0677f1..62a0d6bb97f5f7fd3dd6d8dd641175a544433a7c 100644
--- a/samples/client/petstore/python-tornado/petstore_api/__init__.py
+++ b/samples/client/petstore/python-tornado/petstore_api/__init__.py
@@ -19,7 +19,7 @@ __version__ = "1.0.0"
 # import apis into sdk package
 from petstore_api.api.another_fake_api import AnotherFakeApi
 from petstore_api.api.fake_api import FakeApi
-from petstore_api.api.fake_classname_tags_123_api import FakeClassnameTags123Api
+from petstore_api.api.fake_classname_tags123_api import FakeClassnameTags123Api
 from petstore_api.api.pet_api import PetApi
 from petstore_api.api.store_api import StoreApi
 from petstore_api.api.user_api import UserApi
diff --git a/samples/client/petstore/python-tornado/petstore_api/api/__init__.py b/samples/client/petstore/python-tornado/petstore_api/api/__init__.py
index 74496adb5a2b95328f1a2288598713bede13b41e..ea4a9e3acb7daa9d52e3ac92349a58415ce27c11 100644
--- a/samples/client/petstore/python-tornado/petstore_api/api/__init__.py
+++ b/samples/client/petstore/python-tornado/petstore_api/api/__init__.py
@@ -5,7 +5,7 @@ from __future__ import absolute_import
 # import apis into api package
 from petstore_api.api.another_fake_api import AnotherFakeApi
 from petstore_api.api.fake_api import FakeApi
-from petstore_api.api.fake_classname_tags_123_api import FakeClassnameTags123Api
+from petstore_api.api.fake_classname_tags123_api import FakeClassnameTags123Api
 from petstore_api.api.pet_api import PetApi
 from petstore_api.api.store_api import StoreApi
 from petstore_api.api.user_api import UserApi
diff --git a/samples/client/petstore/python-tornado/petstore_api/api/fake_classname_tags123_api.py b/samples/client/petstore/python-tornado/petstore_api/api/fake_classname_tags123_api.py
new file mode 100644
index 0000000000000000000000000000000000000000..2b46147fed581d76eef5e735b901288c0b975ef1
--- /dev/null
+++ b/samples/client/petstore/python-tornado/petstore_api/api/fake_classname_tags123_api.py
@@ -0,0 +1,180 @@
+# coding: utf-8
+
+"""
+    OpenAPI Petstore
+
+    This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\  # noqa: E501
+
+    The version of the OpenAPI document: 1.0.0
+    Generated by: https://openapi-generator.tech
+"""
+
+
+from __future__ import absolute_import
+
+import re  # noqa: F401
+
+# python 2 and python 3 compatibility library
+import six
+
+from petstore_api.api_client import ApiClient
+from petstore_api.exceptions import (  # noqa: F401
+    ApiTypeError,
+    ApiValueError
+)
+
+
+class FakeClassnameTags123Api(object):
+    """NOTE: This class is auto generated by OpenAPI Generator
+    Ref: https://openapi-generator.tech
+
+    Do not edit the class manually.
+    """
+
+    def __init__(self, api_client=None):
+        if api_client is None:
+            api_client = ApiClient()
+        self.api_client = api_client
+
+    def test_classname(self, body, **kwargs):  # noqa: E501
+        """To test class name in snake case  # noqa: E501
+
+        To test class name in snake case  # noqa: E501
+        This method makes a synchronous HTTP request by default. To make an
+        asynchronous HTTP request, please pass async_req=True
+
+        >>> thread = api.test_classname(body, async_req=True)
+        >>> result = thread.get()
+
+        :param body: client model (required)
+        :type body: Client
+        :param async_req: Whether to execute the request asynchronously.
+        :type async_req: bool, optional
+        :param _preload_content: if False, the urllib3.HTTPResponse object will
+                                 be returned without reading/decoding response
+                                 data. Default is True.
+        :type _preload_content: bool, optional
+        :param _request_timeout: timeout setting for this request. If one
+                                 number provided, it will be total request
+                                 timeout. It can also be a pair (tuple) of
+                                 (connection, read) timeouts.
+        :return: Returns the result object.
+                 If the method is called asynchronously,
+                 returns the request thread.
+        :rtype: Client
+        """
+        kwargs['_return_http_data_only'] = True
+        return self.test_classname_with_http_info(body, **kwargs)  # noqa: E501
+
+    def test_classname_with_http_info(self, body, **kwargs):  # noqa: E501
+        """To test class name in snake case  # noqa: E501
+
+        To test class name in snake case  # noqa: E501
+        This method makes a synchronous HTTP request by default. To make an
+        asynchronous HTTP request, please pass async_req=True
+
+        >>> thread = api.test_classname_with_http_info(body, async_req=True)
+        >>> result = thread.get()
+
+        :param body: client model (required)
+        :type body: Client
+        :param async_req: Whether to execute the request asynchronously.
+        :type async_req: bool, optional
+        :param _return_http_data_only: response data without head status code
+                                       and headers
+        :type _return_http_data_only: bool, optional
+        :param _preload_content: if False, the urllib3.HTTPResponse object will
+                                 be returned without reading/decoding response
+                                 data. Default is True.
+        :type _preload_content: bool, optional
+        :param _request_timeout: timeout setting for this request. If one
+                                 number provided, it will be total request
+                                 timeout. It can also be a pair (tuple) of
+                                 (connection, read) timeouts.
+        :param _request_auth: set to override the auth_settings for an a single
+                              request; this effectively ignores the authentication
+                              in the spec for a single request.
+        :type _request_auth: dict, optional
+        :type _content_type: string, optional: force content-type for the request
+        :return: Returns the result object.
+                 If the method is called asynchronously,
+                 returns the request thread.
+        :rtype: tuple(Client, status_code(int), headers(HTTPHeaderDict))
+        """
+
+        local_var_params = locals()
+
+        all_params = [
+            'body'
+        ]
+        all_params.extend(
+            [
+                'async_req',
+                '_return_http_data_only',
+                '_preload_content',
+                '_request_timeout',
+                '_request_auth',
+                '_content_type'
+            ]
+        )
+
+        for key, val in six.iteritems(local_var_params['kwargs']):
+            if key not in all_params:
+                raise ApiTypeError(
+                    "Got an unexpected keyword argument '%s'"
+                    " to method test_classname" % key
+                )
+            local_var_params[key] = val
+        del local_var_params['kwargs']
+        # verify the required parameter 'body' is set
+        if self.api_client.client_side_validation and ('body' not in local_var_params or  # noqa: E501
+                                                        local_var_params['body'] is None):  # noqa: E501
+            raise ApiValueError("Missing the required parameter `body` when calling `test_classname`")  # noqa: E501
+
+        collection_formats = {}
+
+        path_params = {}
+
+        query_params = []
+
+        header_params = {}
+
+        form_params = []
+        local_var_files = {}
+
+        body_params = None
+        if 'body' in local_var_params:
+            body_params = local_var_params['body']
+        # HTTP header `Accept`
+        header_params['Accept'] = self.api_client.select_header_accept(
+            ['application/json'])  # noqa: E501
+
+        # HTTP header `Content-Type`
+        header_params['Content-Type'] = local_var_params.get('_content_type',
+            self.api_client.select_header_content_type(
+                ['application/json'],
+                'PATCH', body_params))  # noqa: E501
+
+        # Authentication setting
+        auth_settings = ['api_key_query']  # noqa: E501
+
+        response_types_map = {
+            200: "Client",
+        }
+
+        return self.api_client.call_api(
+            '/fake_classname_test', 'PATCH',
+            path_params,
+            query_params,
+            header_params,
+            body=body_params,
+            post_params=form_params,
+            files=local_var_files,
+            response_types_map=response_types_map,
+            auth_settings=auth_settings,
+            async_req=local_var_params.get('async_req'),
+            _return_http_data_only=local_var_params.get('_return_http_data_only'),  # noqa: E501
+            _preload_content=local_var_params.get('_preload_content', True),
+            _request_timeout=local_var_params.get('_request_timeout'),
+            collection_formats=collection_formats,
+            _request_auth=local_var_params.get('_request_auth'))
diff --git a/samples/client/petstore/python-tornado/test/test_fake_classname_tags123_api.py b/samples/client/petstore/python-tornado/test/test_fake_classname_tags123_api.py
new file mode 100644
index 0000000000000000000000000000000000000000..f54e0d06644f261ea603b460db974f7adfda0e58
--- /dev/null
+++ b/samples/client/petstore/python-tornado/test/test_fake_classname_tags123_api.py
@@ -0,0 +1,40 @@
+# coding: utf-8
+
+"""
+    OpenAPI Petstore
+
+    This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\  # noqa: E501
+
+    The version of the OpenAPI document: 1.0.0
+    Generated by: https://openapi-generator.tech
+"""
+
+
+from __future__ import absolute_import
+
+import unittest
+
+import petstore_api
+from petstore_api.api.fake_classname_tags_123_api import FakeClassnameTags123Api  # noqa: E501
+from petstore_api.rest import ApiException
+
+
+class TestFakeClassnameTags123Api(unittest.TestCase):
+    """FakeClassnameTags123Api unit test stubs"""
+
+    def setUp(self):
+        self.api = petstore_api.api.fake_classname_tags_123_api.FakeClassnameTags123Api()  # noqa: E501
+
+    def tearDown(self):
+        pass
+
+    def test_test_classname(self):
+        """Test case for test_classname
+
+        To test class name in snake case  # noqa: E501
+        """
+        pass
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/samples/client/petstore/python/.openapi-generator/FILES b/samples/client/petstore/python/.openapi-generator/FILES
index a5adeaaddc688602711747ca2d0da49b07be5798..417028fbd1f82239d91bca6df27cefa28799ba48 100644
--- a/samples/client/petstore/python/.openapi-generator/FILES
+++ b/samples/client/petstore/python/.openapi-generator/FILES
@@ -76,7 +76,7 @@ petstore_api/__init__.py
 petstore_api/api/__init__.py
 petstore_api/api/another_fake_api.py
 petstore_api/api/fake_api.py
-petstore_api/api/fake_classname_tags_123_api.py
+petstore_api/api/fake_classname_tags123_api.py
 petstore_api/api/pet_api.py
 petstore_api/api/store_api.py
 petstore_api/api/user_api.py
diff --git a/samples/client/petstore/python/docs/FakeClassnameTags123Api.md b/samples/client/petstore/python/docs/FakeClassnameTags123Api.md
index af671645dd65c58aa0a85792ec34bd4694b03e4a..411d4bb4b745f6e764339f94971c419f2728aec3 100644
--- a/samples/client/petstore/python/docs/FakeClassnameTags123Api.md
+++ b/samples/client/petstore/python/docs/FakeClassnameTags123Api.md
@@ -21,7 +21,7 @@ To test class name in snake case
 ```python
 import time
 import petstore_api
-from petstore_api.api import fake_classname_tags_123_api
+from petstore_api.api import fake_classname_tags123_api
 from petstore_api.model.client import Client
 from pprint import pprint
 # Defining the host is optional and defaults to http://petstore.swagger.io:80/v2
@@ -44,7 +44,7 @@ configuration.api_key['api_key_query'] = 'YOUR_API_KEY'
 # Enter a context with an instance of the API client
 with petstore_api.ApiClient(configuration) as api_client:
     # Create an instance of the API class
-    api_instance = fake_classname_tags_123_api.FakeClassnameTags123Api(api_client)
+    api_instance = fake_classname_tags123_api.FakeClassnameTags123Api(api_client)
     body = Client(
         client="client_example",
     ) # Client | client model
diff --git a/samples/client/petstore/python/petstore_api/api/fake_classname_tags123_api.py b/samples/client/petstore/python/petstore_api/api/fake_classname_tags123_api.py
new file mode 100644
index 0000000000000000000000000000000000000000..76e35824fbe1452b6b79b3eb55c5d9fb710a3a8a
--- /dev/null
+++ b/samples/client/petstore/python/petstore_api/api/fake_classname_tags123_api.py
@@ -0,0 +1,161 @@
+"""
+    OpenAPI Petstore
+
+    This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\  # noqa: E501
+
+    The version of the OpenAPI document: 1.0.0
+    Generated by: https://openapi-generator.tech
+"""
+
+
+import re  # noqa: F401
+import sys  # noqa: F401
+
+from petstore_api.api_client import ApiClient, Endpoint as _Endpoint
+from petstore_api.model_utils import (  # noqa: F401
+    check_allowed_values,
+    check_validations,
+    date,
+    datetime,
+    file_type,
+    none_type,
+    validate_and_convert_types
+)
+from petstore_api.model.client import Client
+
+
+class FakeClassnameTags123Api(object):
+    """NOTE: This class is auto generated by OpenAPI Generator
+    Ref: https://openapi-generator.tech
+
+    Do not edit the class manually.
+    """
+
+    def __init__(self, api_client=None):
+        if api_client is None:
+            api_client = ApiClient()
+        self.api_client = api_client
+        self.test_classname_endpoint = _Endpoint(
+            settings={
+                'response_type': (Client,),
+                'auth': [
+                    'api_key_query'
+                ],
+                'endpoint_path': '/fake_classname_test',
+                'operation_id': 'test_classname',
+                'http_method': 'PATCH',
+                'servers': None,
+            },
+            params_map={
+                'all': [
+                    'body',
+                ],
+                'required': [
+                    'body',
+                ],
+                'nullable': [
+                ],
+                'enum': [
+                ],
+                'validation': [
+                ]
+            },
+            root_map={
+                'validations': {
+                },
+                'allowed_values': {
+                },
+                'openapi_types': {
+                    'body':
+                        (Client,),
+                },
+                'attribute_map': {
+                },
+                'location_map': {
+                    'body': 'body',
+                },
+                'collection_format_map': {
+                }
+            },
+            headers_map={
+                'accept': [
+                    'application/json'
+                ],
+                'content_type': [
+                    'application/json'
+                ]
+            },
+            api_client=api_client
+        )
+
+    def test_classname(
+        self,
+        body,
+        **kwargs
+    ):
+        """To test class name in snake case  # noqa: E501
+
+        To test class name in snake case  # noqa: E501
+        This method makes a synchronous HTTP request by default. To make an
+        asynchronous HTTP request, please pass async_req=True
+
+        >>> thread = api.test_classname(body, async_req=True)
+        >>> result = thread.get()
+
+        Args:
+            body (Client): client model
+
+        Keyword Args:
+            _return_http_data_only (bool): response data without head status
+                code and headers. Default is True.
+            _preload_content (bool): if False, the urllib3.HTTPResponse object
+                will be returned without reading/decoding response data.
+                Default is True.
+            _request_timeout (int/float/tuple): timeout setting for this request. If
+                one number provided, it will be total request timeout. It can also
+                be a pair (tuple) of (connection, read) timeouts.
+                Default is None.
+            _check_input_type (bool): specifies if type checking
+                should be done one the data sent to the server.
+                Default is True.
+            _check_return_type (bool): specifies if type checking
+                should be done one the data received from the server.
+                Default is True.
+            _content_type (str/None): force body content-type.
+                Default is None and content-type will be predicted by allowed
+                content-types and body.
+            _host_index (int/None): specifies the index of the server
+                that we want to use.
+                Default is read from the configuration.
+            async_req (bool): execute request asynchronously
+
+        Returns:
+            Client
+                If the method is called asynchronously, returns the request
+                thread.
+        """
+        kwargs['async_req'] = kwargs.get(
+            'async_req', False
+        )
+        kwargs['_return_http_data_only'] = kwargs.get(
+            '_return_http_data_only', True
+        )
+        kwargs['_preload_content'] = kwargs.get(
+            '_preload_content', True
+        )
+        kwargs['_request_timeout'] = kwargs.get(
+            '_request_timeout', None
+        )
+        kwargs['_check_input_type'] = kwargs.get(
+            '_check_input_type', True
+        )
+        kwargs['_check_return_type'] = kwargs.get(
+            '_check_return_type', True
+        )
+        kwargs['_content_type'] = kwargs.get(
+            '_content_type')
+        kwargs['_host_index'] = kwargs.get('_host_index')
+        kwargs['body'] = \
+            body
+        return self.test_classname_endpoint.call_with_http_info(**kwargs)
+
diff --git a/samples/client/petstore/python/petstore_api/apis/__init__.py b/samples/client/petstore/python/petstore_api/apis/__init__.py
index e4c52458a0c2f28d7dafd56929be425e89fe432e..302dcf25c4470cdb2750b3c195a2c4eba0cfec06 100644
--- a/samples/client/petstore/python/petstore_api/apis/__init__.py
+++ b/samples/client/petstore/python/petstore_api/apis/__init__.py
@@ -16,7 +16,7 @@
 # Import APIs into API package:
 from petstore_api.api.another_fake_api import AnotherFakeApi
 from petstore_api.api.fake_api import FakeApi
-from petstore_api.api.fake_classname_tags_123_api import FakeClassnameTags123Api
+from petstore_api.api.fake_classname_tags123_api import FakeClassnameTags123Api
 from petstore_api.api.pet_api import PetApi
 from petstore_api.api.store_api import StoreApi
 from petstore_api.api.user_api import UserApi
diff --git a/samples/client/petstore/python/test/test_fake_classname_tags123_api.py b/samples/client/petstore/python/test/test_fake_classname_tags123_api.py
new file mode 100644
index 0000000000000000000000000000000000000000..cf77b62fab70fe30c58688e9f14295d6e6c118b8
--- /dev/null
+++ b/samples/client/petstore/python/test/test_fake_classname_tags123_api.py
@@ -0,0 +1,35 @@
+"""
+    OpenAPI Petstore
+
+    This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\  # noqa: E501
+
+    The version of the OpenAPI document: 1.0.0
+    Generated by: https://openapi-generator.tech
+"""
+
+
+import unittest
+
+import petstore_api
+from petstore_api.api.fake_classname_tags_123_api import FakeClassnameTags123Api  # noqa: E501
+
+
+class TestFakeClassnameTags123Api(unittest.TestCase):
+    """FakeClassnameTags123Api unit test stubs"""
+
+    def setUp(self):
+        self.api = FakeClassnameTags123Api()  # noqa: E501
+
+    def tearDown(self):
+        pass
+
+    def test_test_classname(self):
+        """Test case for test_classname
+
+        To test class name in snake case  # noqa: E501
+        """
+        pass
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/samples/client/petstore/python_disallowAdditionalPropertiesIfNotPresent/.openapi-generator/FILES b/samples/client/petstore/python_disallowAdditionalPropertiesIfNotPresent/.openapi-generator/FILES
index a5adeaaddc688602711747ca2d0da49b07be5798..417028fbd1f82239d91bca6df27cefa28799ba48 100644
--- a/samples/client/petstore/python_disallowAdditionalPropertiesIfNotPresent/.openapi-generator/FILES
+++ b/samples/client/petstore/python_disallowAdditionalPropertiesIfNotPresent/.openapi-generator/FILES
@@ -76,7 +76,7 @@ petstore_api/__init__.py
 petstore_api/api/__init__.py
 petstore_api/api/another_fake_api.py
 petstore_api/api/fake_api.py
-petstore_api/api/fake_classname_tags_123_api.py
+petstore_api/api/fake_classname_tags123_api.py
 petstore_api/api/pet_api.py
 petstore_api/api/store_api.py
 petstore_api/api/user_api.py
diff --git a/samples/client/petstore/python_disallowAdditionalPropertiesIfNotPresent/docs/FakeClassnameTags123Api.md b/samples/client/petstore/python_disallowAdditionalPropertiesIfNotPresent/docs/FakeClassnameTags123Api.md
index af671645dd65c58aa0a85792ec34bd4694b03e4a..411d4bb4b745f6e764339f94971c419f2728aec3 100644
--- a/samples/client/petstore/python_disallowAdditionalPropertiesIfNotPresent/docs/FakeClassnameTags123Api.md
+++ b/samples/client/petstore/python_disallowAdditionalPropertiesIfNotPresent/docs/FakeClassnameTags123Api.md
@@ -21,7 +21,7 @@ To test class name in snake case
 ```python
 import time
 import petstore_api
-from petstore_api.api import fake_classname_tags_123_api
+from petstore_api.api import fake_classname_tags123_api
 from petstore_api.model.client import Client
 from pprint import pprint
 # Defining the host is optional and defaults to http://petstore.swagger.io:80/v2
@@ -44,7 +44,7 @@ configuration.api_key['api_key_query'] = 'YOUR_API_KEY'
 # Enter a context with an instance of the API client
 with petstore_api.ApiClient(configuration) as api_client:
     # Create an instance of the API class
-    api_instance = fake_classname_tags_123_api.FakeClassnameTags123Api(api_client)
+    api_instance = fake_classname_tags123_api.FakeClassnameTags123Api(api_client)
     body = Client(
         client="client_example",
     ) # Client | client model
diff --git a/samples/client/petstore/python_disallowAdditionalPropertiesIfNotPresent/petstore_api/api/fake_classname_tags123_api.py b/samples/client/petstore/python_disallowAdditionalPropertiesIfNotPresent/petstore_api/api/fake_classname_tags123_api.py
new file mode 100644
index 0000000000000000000000000000000000000000..76e35824fbe1452b6b79b3eb55c5d9fb710a3a8a
--- /dev/null
+++ b/samples/client/petstore/python_disallowAdditionalPropertiesIfNotPresent/petstore_api/api/fake_classname_tags123_api.py
@@ -0,0 +1,161 @@
+"""
+    OpenAPI Petstore
+
+    This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\  # noqa: E501
+
+    The version of the OpenAPI document: 1.0.0
+    Generated by: https://openapi-generator.tech
+"""
+
+
+import re  # noqa: F401
+import sys  # noqa: F401
+
+from petstore_api.api_client import ApiClient, Endpoint as _Endpoint
+from petstore_api.model_utils import (  # noqa: F401
+    check_allowed_values,
+    check_validations,
+    date,
+    datetime,
+    file_type,
+    none_type,
+    validate_and_convert_types
+)
+from petstore_api.model.client import Client
+
+
+class FakeClassnameTags123Api(object):
+    """NOTE: This class is auto generated by OpenAPI Generator
+    Ref: https://openapi-generator.tech
+
+    Do not edit the class manually.
+    """
+
+    def __init__(self, api_client=None):
+        if api_client is None:
+            api_client = ApiClient()
+        self.api_client = api_client
+        self.test_classname_endpoint = _Endpoint(
+            settings={
+                'response_type': (Client,),
+                'auth': [
+                    'api_key_query'
+                ],
+                'endpoint_path': '/fake_classname_test',
+                'operation_id': 'test_classname',
+                'http_method': 'PATCH',
+                'servers': None,
+            },
+            params_map={
+                'all': [
+                    'body',
+                ],
+                'required': [
+                    'body',
+                ],
+                'nullable': [
+                ],
+                'enum': [
+                ],
+                'validation': [
+                ]
+            },
+            root_map={
+                'validations': {
+                },
+                'allowed_values': {
+                },
+                'openapi_types': {
+                    'body':
+                        (Client,),
+                },
+                'attribute_map': {
+                },
+                'location_map': {
+                    'body': 'body',
+                },
+                'collection_format_map': {
+                }
+            },
+            headers_map={
+                'accept': [
+                    'application/json'
+                ],
+                'content_type': [
+                    'application/json'
+                ]
+            },
+            api_client=api_client
+        )
+
+    def test_classname(
+        self,
+        body,
+        **kwargs
+    ):
+        """To test class name in snake case  # noqa: E501
+
+        To test class name in snake case  # noqa: E501
+        This method makes a synchronous HTTP request by default. To make an
+        asynchronous HTTP request, please pass async_req=True
+
+        >>> thread = api.test_classname(body, async_req=True)
+        >>> result = thread.get()
+
+        Args:
+            body (Client): client model
+
+        Keyword Args:
+            _return_http_data_only (bool): response data without head status
+                code and headers. Default is True.
+            _preload_content (bool): if False, the urllib3.HTTPResponse object
+                will be returned without reading/decoding response data.
+                Default is True.
+            _request_timeout (int/float/tuple): timeout setting for this request. If
+                one number provided, it will be total request timeout. It can also
+                be a pair (tuple) of (connection, read) timeouts.
+                Default is None.
+            _check_input_type (bool): specifies if type checking
+                should be done one the data sent to the server.
+                Default is True.
+            _check_return_type (bool): specifies if type checking
+                should be done one the data received from the server.
+                Default is True.
+            _content_type (str/None): force body content-type.
+                Default is None and content-type will be predicted by allowed
+                content-types and body.
+            _host_index (int/None): specifies the index of the server
+                that we want to use.
+                Default is read from the configuration.
+            async_req (bool): execute request asynchronously
+
+        Returns:
+            Client
+                If the method is called asynchronously, returns the request
+                thread.
+        """
+        kwargs['async_req'] = kwargs.get(
+            'async_req', False
+        )
+        kwargs['_return_http_data_only'] = kwargs.get(
+            '_return_http_data_only', True
+        )
+        kwargs['_preload_content'] = kwargs.get(
+            '_preload_content', True
+        )
+        kwargs['_request_timeout'] = kwargs.get(
+            '_request_timeout', None
+        )
+        kwargs['_check_input_type'] = kwargs.get(
+            '_check_input_type', True
+        )
+        kwargs['_check_return_type'] = kwargs.get(
+            '_check_return_type', True
+        )
+        kwargs['_content_type'] = kwargs.get(
+            '_content_type')
+        kwargs['_host_index'] = kwargs.get('_host_index')
+        kwargs['body'] = \
+            body
+        return self.test_classname_endpoint.call_with_http_info(**kwargs)
+
diff --git a/samples/client/petstore/python_disallowAdditionalPropertiesIfNotPresent/petstore_api/apis/__init__.py b/samples/client/petstore/python_disallowAdditionalPropertiesIfNotPresent/petstore_api/apis/__init__.py
index e4c52458a0c2f28d7dafd56929be425e89fe432e..302dcf25c4470cdb2750b3c195a2c4eba0cfec06 100644
--- a/samples/client/petstore/python_disallowAdditionalPropertiesIfNotPresent/petstore_api/apis/__init__.py
+++ b/samples/client/petstore/python_disallowAdditionalPropertiesIfNotPresent/petstore_api/apis/__init__.py
@@ -16,7 +16,7 @@
 # Import APIs into API package:
 from petstore_api.api.another_fake_api import AnotherFakeApi
 from petstore_api.api.fake_api import FakeApi
-from petstore_api.api.fake_classname_tags_123_api import FakeClassnameTags123Api
+from petstore_api.api.fake_classname_tags123_api import FakeClassnameTags123Api
 from petstore_api.api.pet_api import PetApi
 from petstore_api.api.store_api import StoreApi
 from petstore_api.api.user_api import UserApi
diff --git a/samples/client/petstore/python_disallowAdditionalPropertiesIfNotPresent/test/test_fake_classname_tags123_api.py b/samples/client/petstore/python_disallowAdditionalPropertiesIfNotPresent/test/test_fake_classname_tags123_api.py
new file mode 100644
index 0000000000000000000000000000000000000000..cf77b62fab70fe30c58688e9f14295d6e6c118b8
--- /dev/null
+++ b/samples/client/petstore/python_disallowAdditionalPropertiesIfNotPresent/test/test_fake_classname_tags123_api.py
@@ -0,0 +1,35 @@
+"""
+    OpenAPI Petstore
+
+    This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\  # noqa: E501
+
+    The version of the OpenAPI document: 1.0.0
+    Generated by: https://openapi-generator.tech
+"""
+
+
+import unittest
+
+import petstore_api
+from petstore_api.api.fake_classname_tags_123_api import FakeClassnameTags123Api  # noqa: E501
+
+
+class TestFakeClassnameTags123Api(unittest.TestCase):
+    """FakeClassnameTags123Api unit test stubs"""
+
+    def setUp(self):
+        self.api = FakeClassnameTags123Api()  # noqa: E501
+
+    def tearDown(self):
+        pass
+
+    def test_test_classname(self):
+        """Test case for test_classname
+
+        To test class name in snake case  # noqa: E501
+        """
+        pass
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/samples/openapi3/client/petstore/python-legacy/.openapi-generator/FILES b/samples/openapi3/client/petstore/python-legacy/.openapi-generator/FILES
index b6fc57881bd307f2e80ae76761ee7ea232b58c43..4b8573e41171743c63cb360640d29d9f814613b1 100755
--- a/samples/openapi3/client/petstore/python-legacy/.openapi-generator/FILES
+++ b/samples/openapi3/client/petstore/python-legacy/.openapi-generator/FILES
@@ -61,7 +61,7 @@ petstore_api/api/__init__.py
 petstore_api/api/another_fake_api.py
 petstore_api/api/default_api.py
 petstore_api/api/fake_api.py
-petstore_api/api/fake_classname_tags_123_api.py
+petstore_api/api/fake_classname_tags123_api.py
 petstore_api/api/pet_api.py
 petstore_api/api/store_api.py
 petstore_api/api/user_api.py
diff --git a/samples/openapi3/client/petstore/python-legacy/petstore_api/__init__.py b/samples/openapi3/client/petstore/python-legacy/petstore_api/__init__.py
index c5b730adc53d228b47fef793530320f2a28e13c6..420638f929395465a020f7f3e1f9408cd4ebc0f3 100755
--- a/samples/openapi3/client/petstore/python-legacy/petstore_api/__init__.py
+++ b/samples/openapi3/client/petstore/python-legacy/petstore_api/__init__.py
@@ -20,7 +20,7 @@ __version__ = "1.0.0"
 from petstore_api.api.another_fake_api import AnotherFakeApi
 from petstore_api.api.default_api import DefaultApi
 from petstore_api.api.fake_api import FakeApi
-from petstore_api.api.fake_classname_tags_123_api import FakeClassnameTags123Api
+from petstore_api.api.fake_classname_tags123_api import FakeClassnameTags123Api
 from petstore_api.api.pet_api import PetApi
 from petstore_api.api.store_api import StoreApi
 from petstore_api.api.user_api import UserApi
diff --git a/samples/openapi3/client/petstore/python-legacy/petstore_api/api/__init__.py b/samples/openapi3/client/petstore/python-legacy/petstore_api/api/__init__.py
index fa4e54a80091f1f0a8f855f2a4a48a4d38847b6a..bc45197c40f006cd22569a64b20e56c12c823d05 100755
--- a/samples/openapi3/client/petstore/python-legacy/petstore_api/api/__init__.py
+++ b/samples/openapi3/client/petstore/python-legacy/petstore_api/api/__init__.py
@@ -6,7 +6,7 @@ from __future__ import absolute_import
 from petstore_api.api.another_fake_api import AnotherFakeApi
 from petstore_api.api.default_api import DefaultApi
 from petstore_api.api.fake_api import FakeApi
-from petstore_api.api.fake_classname_tags_123_api import FakeClassnameTags123Api
+from petstore_api.api.fake_classname_tags123_api import FakeClassnameTags123Api
 from petstore_api.api.pet_api import PetApi
 from petstore_api.api.store_api import StoreApi
 from petstore_api.api.user_api import UserApi
diff --git a/samples/openapi3/client/petstore/python-legacy/petstore_api/api/fake_classname_tags123_api.py b/samples/openapi3/client/petstore/python-legacy/petstore_api/api/fake_classname_tags123_api.py
new file mode 100644
index 0000000000000000000000000000000000000000..1dd90624e719e4e00c17782d23d663af44566b04
--- /dev/null
+++ b/samples/openapi3/client/petstore/python-legacy/petstore_api/api/fake_classname_tags123_api.py
@@ -0,0 +1,180 @@
+# coding: utf-8
+
+"""
+    OpenAPI Petstore
+
+    This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\  # noqa: E501
+
+    The version of the OpenAPI document: 1.0.0
+    Generated by: https://openapi-generator.tech
+"""
+
+
+from __future__ import absolute_import
+
+import re  # noqa: F401
+
+# python 2 and python 3 compatibility library
+import six
+
+from petstore_api.api_client import ApiClient
+from petstore_api.exceptions import (  # noqa: F401
+    ApiTypeError,
+    ApiValueError
+)
+
+
+class FakeClassnameTags123Api(object):
+    """NOTE: This class is auto generated by OpenAPI Generator
+    Ref: https://openapi-generator.tech
+
+    Do not edit the class manually.
+    """
+
+    def __init__(self, api_client=None):
+        if api_client is None:
+            api_client = ApiClient()
+        self.api_client = api_client
+
+    def test_classname(self, client, **kwargs):  # noqa: E501
+        """To test class name in snake case  # noqa: E501
+
+        To test class name in snake case  # noqa: E501
+        This method makes a synchronous HTTP request by default. To make an
+        asynchronous HTTP request, please pass async_req=True
+
+        >>> thread = api.test_classname(client, async_req=True)
+        >>> result = thread.get()
+
+        :param client: client model (required)
+        :type client: Client
+        :param async_req: Whether to execute the request asynchronously.
+        :type async_req: bool, optional
+        :param _preload_content: if False, the urllib3.HTTPResponse object will
+                                 be returned without reading/decoding response
+                                 data. Default is True.
+        :type _preload_content: bool, optional
+        :param _request_timeout: timeout setting for this request. If one
+                                 number provided, it will be total request
+                                 timeout. It can also be a pair (tuple) of
+                                 (connection, read) timeouts.
+        :return: Returns the result object.
+                 If the method is called asynchronously,
+                 returns the request thread.
+        :rtype: Client
+        """
+        kwargs['_return_http_data_only'] = True
+        return self.test_classname_with_http_info(client, **kwargs)  # noqa: E501
+
+    def test_classname_with_http_info(self, client, **kwargs):  # noqa: E501
+        """To test class name in snake case  # noqa: E501
+
+        To test class name in snake case  # noqa: E501
+        This method makes a synchronous HTTP request by default. To make an
+        asynchronous HTTP request, please pass async_req=True
+
+        >>> thread = api.test_classname_with_http_info(client, async_req=True)
+        >>> result = thread.get()
+
+        :param client: client model (required)
+        :type client: Client
+        :param async_req: Whether to execute the request asynchronously.
+        :type async_req: bool, optional
+        :param _return_http_data_only: response data without head status code
+                                       and headers
+        :type _return_http_data_only: bool, optional
+        :param _preload_content: if False, the urllib3.HTTPResponse object will
+                                 be returned without reading/decoding response
+                                 data. Default is True.
+        :type _preload_content: bool, optional
+        :param _request_timeout: timeout setting for this request. If one
+                                 number provided, it will be total request
+                                 timeout. It can also be a pair (tuple) of
+                                 (connection, read) timeouts.
+        :param _request_auth: set to override the auth_settings for an a single
+                              request; this effectively ignores the authentication
+                              in the spec for a single request.
+        :type _request_auth: dict, optional
+        :type _content_type: string, optional: force content-type for the request
+        :return: Returns the result object.
+                 If the method is called asynchronously,
+                 returns the request thread.
+        :rtype: tuple(Client, status_code(int), headers(HTTPHeaderDict))
+        """
+
+        local_var_params = locals()
+
+        all_params = [
+            'client'
+        ]
+        all_params.extend(
+            [
+                'async_req',
+                '_return_http_data_only',
+                '_preload_content',
+                '_request_timeout',
+                '_request_auth',
+                '_content_type'
+            ]
+        )
+
+        for key, val in six.iteritems(local_var_params['kwargs']):
+            if key not in all_params:
+                raise ApiTypeError(
+                    "Got an unexpected keyword argument '%s'"
+                    " to method test_classname" % key
+                )
+            local_var_params[key] = val
+        del local_var_params['kwargs']
+        # verify the required parameter 'client' is set
+        if self.api_client.client_side_validation and ('client' not in local_var_params or  # noqa: E501
+                                                        local_var_params['client'] is None):  # noqa: E501
+            raise ApiValueError("Missing the required parameter `client` when calling `test_classname`")  # noqa: E501
+
+        collection_formats = {}
+
+        path_params = {}
+
+        query_params = []
+
+        header_params = {}
+
+        form_params = []
+        local_var_files = {}
+
+        body_params = None
+        if 'client' in local_var_params:
+            body_params = local_var_params['client']
+        # HTTP header `Accept`
+        header_params['Accept'] = self.api_client.select_header_accept(
+            ['application/json'])  # noqa: E501
+
+        # HTTP header `Content-Type`
+        header_params['Content-Type'] = local_var_params.get('_content_type',
+            self.api_client.select_header_content_type(
+                ['application/json'],
+                'PATCH', body_params))  # noqa: E501
+
+        # Authentication setting
+        auth_settings = ['api_key_query']  # noqa: E501
+
+        response_types_map = {
+            200: "Client",
+        }
+
+        return self.api_client.call_api(
+            '/fake_classname_test', 'PATCH',
+            path_params,
+            query_params,
+            header_params,
+            body=body_params,
+            post_params=form_params,
+            files=local_var_files,
+            response_types_map=response_types_map,
+            auth_settings=auth_settings,
+            async_req=local_var_params.get('async_req'),
+            _return_http_data_only=local_var_params.get('_return_http_data_only'),  # noqa: E501
+            _preload_content=local_var_params.get('_preload_content', True),
+            _request_timeout=local_var_params.get('_request_timeout'),
+            collection_formats=collection_formats,
+            _request_auth=local_var_params.get('_request_auth'))
diff --git a/samples/openapi3/client/petstore/python-legacy/test/test_fake_classname_tags123_api.py b/samples/openapi3/client/petstore/python-legacy/test/test_fake_classname_tags123_api.py
new file mode 100644
index 0000000000000000000000000000000000000000..f54e0d06644f261ea603b460db974f7adfda0e58
--- /dev/null
+++ b/samples/openapi3/client/petstore/python-legacy/test/test_fake_classname_tags123_api.py
@@ -0,0 +1,40 @@
+# coding: utf-8
+
+"""
+    OpenAPI Petstore
+
+    This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\  # noqa: E501
+
+    The version of the OpenAPI document: 1.0.0
+    Generated by: https://openapi-generator.tech
+"""
+
+
+from __future__ import absolute_import
+
+import unittest
+
+import petstore_api
+from petstore_api.api.fake_classname_tags_123_api import FakeClassnameTags123Api  # noqa: E501
+from petstore_api.rest import ApiException
+
+
+class TestFakeClassnameTags123Api(unittest.TestCase):
+    """FakeClassnameTags123Api unit test stubs"""
+
+    def setUp(self):
+        self.api = petstore_api.api.fake_classname_tags_123_api.FakeClassnameTags123Api()  # noqa: E501
+
+    def tearDown(self):
+        pass
+
+    def test_test_classname(self):
+        """Test case for test_classname
+
+        To test class name in snake case  # noqa: E501
+        """
+        pass
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/samples/openapi3/client/petstore/python/.openapi-generator/FILES b/samples/openapi3/client/petstore/python/.openapi-generator/FILES
index 4b9b1323443f2ae2a6b6a6cb89ae752b51f58676..e92c58a3c89a9c8756289e7863cec2c433fa4692 100644
--- a/samples/openapi3/client/petstore/python/.openapi-generator/FILES
+++ b/samples/openapi3/client/petstore/python/.openapi-generator/FILES
@@ -110,7 +110,7 @@ petstore_api/api/__init__.py
 petstore_api/api/another_fake_api.py
 petstore_api/api/default_api.py
 petstore_api/api/fake_api.py
-petstore_api/api/fake_classname_tags_123_api.py
+petstore_api/api/fake_classname_tags123_api.py
 petstore_api/api/pet_api.py
 petstore_api/api/store_api.py
 petstore_api/api/user_api.py
diff --git a/samples/openapi3/client/petstore/python/docs/FakeClassnameTags123Api.md b/samples/openapi3/client/petstore/python/docs/FakeClassnameTags123Api.md
index a83c7e53949964b1348277a82dccd51fe5aba024..57b52cf8fdad8a9eefeace5c0c0f0642fa17bab5 100644
--- a/samples/openapi3/client/petstore/python/docs/FakeClassnameTags123Api.md
+++ b/samples/openapi3/client/petstore/python/docs/FakeClassnameTags123Api.md
@@ -21,7 +21,7 @@ To test class name in snake case
 ```python
 import time
 import petstore_api
-from petstore_api.api import fake_classname_tags_123_api
+from petstore_api.api import fake_classname_tags123_api
 from petstore_api.model.client import Client
 from pprint import pprint
 # Defining the host is optional and defaults to http://petstore.swagger.io:80/v2
@@ -44,7 +44,7 @@ configuration.api_key['api_key_query'] = 'YOUR_API_KEY'
 # Enter a context with an instance of the API client
 with petstore_api.ApiClient(configuration) as api_client:
     # Create an instance of the API class
-    api_instance = fake_classname_tags_123_api.FakeClassnameTags123Api(api_client)
+    api_instance = fake_classname_tags123_api.FakeClassnameTags123Api(api_client)
     client = Client(
         client="client_example",
     ) # Client | client model
diff --git a/samples/openapi3/client/petstore/python/petstore_api/api/fake_classname_tags123_api.py b/samples/openapi3/client/petstore/python/petstore_api/api/fake_classname_tags123_api.py
new file mode 100644
index 0000000000000000000000000000000000000000..0284c348b363493a7c985b15a060f9e4bf51e22e
--- /dev/null
+++ b/samples/openapi3/client/petstore/python/petstore_api/api/fake_classname_tags123_api.py
@@ -0,0 +1,161 @@
+"""
+    OpenAPI Petstore
+
+    This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\  # noqa: E501
+
+    The version of the OpenAPI document: 1.0.0
+    Generated by: https://openapi-generator.tech
+"""
+
+
+import re  # noqa: F401
+import sys  # noqa: F401
+
+from petstore_api.api_client import ApiClient, Endpoint as _Endpoint
+from petstore_api.model_utils import (  # noqa: F401
+    check_allowed_values,
+    check_validations,
+    date,
+    datetime,
+    file_type,
+    none_type,
+    validate_and_convert_types
+)
+from petstore_api.model.client import Client
+
+
+class FakeClassnameTags123Api(object):
+    """NOTE: This class is auto generated by OpenAPI Generator
+    Ref: https://openapi-generator.tech
+
+    Do not edit the class manually.
+    """
+
+    def __init__(self, api_client=None):
+        if api_client is None:
+            api_client = ApiClient()
+        self.api_client = api_client
+        self.test_classname_endpoint = _Endpoint(
+            settings={
+                'response_type': (Client,),
+                'auth': [
+                    'api_key_query'
+                ],
+                'endpoint_path': '/fake_classname_test',
+                'operation_id': 'test_classname',
+                'http_method': 'PATCH',
+                'servers': None,
+            },
+            params_map={
+                'all': [
+                    'client',
+                ],
+                'required': [
+                    'client',
+                ],
+                'nullable': [
+                ],
+                'enum': [
+                ],
+                'validation': [
+                ]
+            },
+            root_map={
+                'validations': {
+                },
+                'allowed_values': {
+                },
+                'openapi_types': {
+                    'client':
+                        (Client,),
+                },
+                'attribute_map': {
+                },
+                'location_map': {
+                    'client': 'body',
+                },
+                'collection_format_map': {
+                }
+            },
+            headers_map={
+                'accept': [
+                    'application/json'
+                ],
+                'content_type': [
+                    'application/json'
+                ]
+            },
+            api_client=api_client
+        )
+
+    def test_classname(
+        self,
+        client,
+        **kwargs
+    ):
+        """To test class name in snake case  # noqa: E501
+
+        To test class name in snake case  # noqa: E501
+        This method makes a synchronous HTTP request by default. To make an
+        asynchronous HTTP request, please pass async_req=True
+
+        >>> thread = api.test_classname(client, async_req=True)
+        >>> result = thread.get()
+
+        Args:
+            client (Client): client model
+
+        Keyword Args:
+            _return_http_data_only (bool): response data without head status
+                code and headers. Default is True.
+            _preload_content (bool): if False, the urllib3.HTTPResponse object
+                will be returned without reading/decoding response data.
+                Default is True.
+            _request_timeout (int/float/tuple): timeout setting for this request. If
+                one number provided, it will be total request timeout. It can also
+                be a pair (tuple) of (connection, read) timeouts.
+                Default is None.
+            _check_input_type (bool): specifies if type checking
+                should be done one the data sent to the server.
+                Default is True.
+            _check_return_type (bool): specifies if type checking
+                should be done one the data received from the server.
+                Default is True.
+            _content_type (str/None): force body content-type.
+                Default is None and content-type will be predicted by allowed
+                content-types and body.
+            _host_index (int/None): specifies the index of the server
+                that we want to use.
+                Default is read from the configuration.
+            async_req (bool): execute request asynchronously
+
+        Returns:
+            Client
+                If the method is called asynchronously, returns the request
+                thread.
+        """
+        kwargs['async_req'] = kwargs.get(
+            'async_req', False
+        )
+        kwargs['_return_http_data_only'] = kwargs.get(
+            '_return_http_data_only', True
+        )
+        kwargs['_preload_content'] = kwargs.get(
+            '_preload_content', True
+        )
+        kwargs['_request_timeout'] = kwargs.get(
+            '_request_timeout', None
+        )
+        kwargs['_check_input_type'] = kwargs.get(
+            '_check_input_type', True
+        )
+        kwargs['_check_return_type'] = kwargs.get(
+            '_check_return_type', True
+        )
+        kwargs['_content_type'] = kwargs.get(
+            '_content_type')
+        kwargs['_host_index'] = kwargs.get('_host_index')
+        kwargs['client'] = \
+            client
+        return self.test_classname_endpoint.call_with_http_info(**kwargs)
+
diff --git a/samples/openapi3/client/petstore/python/petstore_api/apis/__init__.py b/samples/openapi3/client/petstore/python/petstore_api/apis/__init__.py
index 24c40abbed0e962cdd21a5e076761c7f162c194f..2fec461eafed74bc92f15e4b956b01c8c12dbdbc 100644
--- a/samples/openapi3/client/petstore/python/petstore_api/apis/__init__.py
+++ b/samples/openapi3/client/petstore/python/petstore_api/apis/__init__.py
@@ -17,7 +17,7 @@
 from petstore_api.api.another_fake_api import AnotherFakeApi
 from petstore_api.api.default_api import DefaultApi
 from petstore_api.api.fake_api import FakeApi
-from petstore_api.api.fake_classname_tags_123_api import FakeClassnameTags123Api
+from petstore_api.api.fake_classname_tags123_api import FakeClassnameTags123Api
 from petstore_api.api.pet_api import PetApi
 from petstore_api.api.store_api import StoreApi
 from petstore_api.api.user_api import UserApi
diff --git a/samples/openapi3/client/petstore/python/test/test_fake_classname_tags123_api.py b/samples/openapi3/client/petstore/python/test/test_fake_classname_tags123_api.py
new file mode 100644
index 0000000000000000000000000000000000000000..cf77b62fab70fe30c58688e9f14295d6e6c118b8
--- /dev/null
+++ b/samples/openapi3/client/petstore/python/test/test_fake_classname_tags123_api.py
@@ -0,0 +1,35 @@
+"""
+    OpenAPI Petstore
+
+    This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\  # noqa: E501
+
+    The version of the OpenAPI document: 1.0.0
+    Generated by: https://openapi-generator.tech
+"""
+
+
+import unittest
+
+import petstore_api
+from petstore_api.api.fake_classname_tags_123_api import FakeClassnameTags123Api  # noqa: E501
+
+
+class TestFakeClassnameTags123Api(unittest.TestCase):
+    """FakeClassnameTags123Api unit test stubs"""
+
+    def setUp(self):
+        self.api = FakeClassnameTags123Api()  # noqa: E501
+
+    def tearDown(self):
+        pass
+
+    def test_test_classname(self):
+        """Test case for test_classname
+
+        To test class name in snake case  # noqa: E501
+        """
+        pass
+
+
+if __name__ == '__main__':
+    unittest.main()