diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ProtobufSchemaCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ProtobufSchemaCodegen.java
index 5f55e9d47f0448be795e860b008661c9720ba024..9fafff0fcfc6abc5b5b8e91a9bfa40dcaab36a52 100644
--- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ProtobufSchemaCodegen.java
+++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ProtobufSchemaCodegen.java
@@ -91,7 +91,7 @@ public class ProtobufSchemaCodegen extends DefaultCodegen implements CodegenConf
         apiTemplateFiles.put("api.mustache", ".proto");
         embeddedTemplateDir = templateDir = "protobuf-schema";
         hideGenerationTimestamp = Boolean.TRUE;
-        modelPackage = "messages";
+        modelPackage = "models";
         apiPackage = "services";
 
         defaultIncludes = new HashSet<>(
@@ -167,12 +167,20 @@ public class ProtobufSchemaCodegen extends DefaultCodegen implements CodegenConf
         apiDocTemplateFiles.clear(); // TODO: add api doc template
         modelDocTemplateFiles.clear(); // TODO: add model doc template
 
-        modelPackage = "models";
-        apiPackage = "services";
-
         if (additionalProperties.containsKey(CodegenConstants.PACKAGE_NAME)) {
             setPackageName((String) additionalProperties.get(CodegenConstants.PACKAGE_NAME));
         }
+        else {
+            additionalProperties.put(CodegenConstants.PACKAGE_NAME, packageName);
+        }
+
+        if (!additionalProperties.containsKey(CodegenConstants.API_PACKAGE)) {
+            additionalProperties.put(CodegenConstants.API_PACKAGE, apiPackage);
+        }
+
+        if (!additionalProperties.containsKey(CodegenConstants.MODEL_PACKAGE)) {
+            additionalProperties.put(CodegenConstants.MODEL_PACKAGE, modelPackage);
+        }
 
         if (additionalProperties.containsKey(this.NUMBERED_FIELD_NUMBER_LIST)) {
             this.numberedFieldNumberList = convertPropertyToBooleanAndWriteBack(NUMBERED_FIELD_NUMBER_LIST);
diff --git a/modules/openapi-generator/src/main/resources/protobuf-schema/api.mustache b/modules/openapi-generator/src/main/resources/protobuf-schema/api.mustache
index ccf06f93c6dfa49841ee37dcacc9d06ffbd8393c..dc4ec5e1c3928f1e05a0499d54b66553e2f53b77 100644
--- a/modules/openapi-generator/src/main/resources/protobuf-schema/api.mustache
+++ b/modules/openapi-generator/src/main/resources/protobuf-schema/api.mustache
@@ -1,7 +1,7 @@
 {{>partial_header}}
 syntax = "proto3";
 
-package {{{packageName}}};
+package {{#lambda.lowercase}}{{{packageName}}}.{{{apiPackage}}}.{{{classname}}};{{/lambda.lowercase}}
 
 import "google/protobuf/empty.proto";
 {{#imports}}
diff --git a/modules/openapi-generator/src/main/resources/protobuf-schema/model.mustache b/modules/openapi-generator/src/main/resources/protobuf-schema/model.mustache
index 2a609db9a8d1616cdbee14c9f55f60a556c82bc2..2aca6336c955ea26a0883bf4938e377c3ba58e02 100644
--- a/modules/openapi-generator/src/main/resources/protobuf-schema/model.mustache
+++ b/modules/openapi-generator/src/main/resources/protobuf-schema/model.mustache
@@ -1,7 +1,7 @@
 {{>partial_header}}
 syntax = "proto3";
 
-package {{{packageName}}};
+package {{#lambda.lowercase}}{{{packageName}}};{{/lambda.lowercase}}
 
 {{#imports}}
 {{#import}}
diff --git a/modules/openapi-generator/src/test/resources/3_0/protobuf-schema/pet.proto b/modules/openapi-generator/src/test/resources/3_0/protobuf-schema/pet.proto
index 7ba4adc282a17d5b6ca9cc6165d6be5b16d7ecb9..be5371035c98b631d590c03502d0272c25aad72f 100644
--- a/modules/openapi-generator/src/test/resources/3_0/protobuf-schema/pet.proto
+++ b/modules/openapi-generator/src/test/resources/3_0/protobuf-schema/pet.proto
@@ -10,7 +10,7 @@
 
 syntax = "proto3";
 
-package ;
+package openapitools;
 
 import public "models/lizard_all_of.proto";
 import public "models/snake_all_of.proto";
diff --git a/samples/config/petstore/protobuf-schema/services/pet_service.proto b/samples/config/petstore/protobuf-schema/services/pet_service.proto
index 6ac05f1deeb6fe8749e5d795d50004690588d51d..ba8b4c18e31cd39a06eb88c12bc72a71865a0874 100644
--- a/samples/config/petstore/protobuf-schema/services/pet_service.proto
+++ b/samples/config/petstore/protobuf-schema/services/pet_service.proto
@@ -10,7 +10,7 @@
 
 syntax = "proto3";
 
-package petstore;
+package petstore.services.petservice;
 
 import "google/protobuf/empty.proto";
 import public "models/api_response.proto";
diff --git a/samples/config/petstore/protobuf-schema/services/store_service.proto b/samples/config/petstore/protobuf-schema/services/store_service.proto
index e30382ad502ab8cbda9a8522580106f5c97c97b6..05ebe84e1f4a6bc9f7fb3e281e7653007a1adad1 100644
--- a/samples/config/petstore/protobuf-schema/services/store_service.proto
+++ b/samples/config/petstore/protobuf-schema/services/store_service.proto
@@ -10,7 +10,7 @@
 
 syntax = "proto3";
 
-package petstore;
+package petstore.services.storeservice;
 
 import "google/protobuf/empty.proto";
 import public "models/order.proto";
diff --git a/samples/config/petstore/protobuf-schema/services/user_service.proto b/samples/config/petstore/protobuf-schema/services/user_service.proto
index 8130b04aadd2fb5014ab3e28e6c3a3de4d051422..119219d6fc8f05ce26ed91ccb73fbeb3f5e11e78 100644
--- a/samples/config/petstore/protobuf-schema/services/user_service.proto
+++ b/samples/config/petstore/protobuf-schema/services/user_service.proto
@@ -10,7 +10,7 @@
 
 syntax = "proto3";
 
-package petstore;
+package petstore.services.userservice;
 
 import "google/protobuf/empty.proto";
 import public "models/user.proto";