diff --git a/bin/configs/go-echo-server-petstore-new.yaml b/bin/configs/go-echo-server-petstore-new.yaml
new file mode 100644
index 00000000000..bfc2e946c58
--- /dev/null
+++ b/bin/configs/go-echo-server-petstore-new.yaml
@@ -0,0 +1,6 @@
+generatorName: go-echo-server
+outputDir: samples/server/petstore/go-echo-server
+inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore.yaml
+templateDir: modules/openapi-generator/src/main/resources/go-echo-server
+additionalProperties:
+ hideGenerationTimestamp: "true"
diff --git a/docs/generators.md b/docs/generators.md
index e581cc54fb1..00a114c52ec 100644
--- a/docs/generators.md
+++ b/docs/generators.md
@@ -86,6 +86,7 @@ The following generators are available:
* [erlang-server](generators/erlang-server.md)
* [fsharp-functions (beta)](generators/fsharp-functions.md)
* [fsharp-giraffe-server (beta)](generators/fsharp-giraffe-server.md)
+* [go-echo-server](generators/go-echo-server.md)
* [go-gin-server](generators/go-gin-server.md)
* [go-server](generators/go-server.md)
* [graphql-nodejs-express-server](generators/graphql-nodejs-express-server.md)
diff --git a/docs/generators/go-echo-server.md b/docs/generators/go-echo-server.md
new file mode 100644
index 00000000000..53c726fb85e
--- /dev/null
+++ b/docs/generators/go-echo-server.md
@@ -0,0 +1,206 @@
+---
+title: Config Options for go-echo-server
+sidebar_label: go-echo-server
+---
+
+These options may be applied as additional-properties (cli) or configOptions (plugins). Refer to [configuration docs](https://openapi-generator.tech/docs/configuration) for more details.
+
+| Option | Description | Values | Default |
+| ------ | ----------- | ------ | ------- |
+|hideGenerationTimestamp|Hides the generation timestamp when files are generated.| |true|
+|packageName|Go package name (convention: lowercase).| |openapi|
+|packageVersion|Go package version.| |1.0.0|
+|serverPort|The network port the generated server binds to| |8080|
+
+## IMPORT MAPPING
+
+| Type/Alias | Imports |
+| ---------- | ------- |
+
+
+## INSTANTIATION TYPES
+
+| Type/Alias | Instantiated By |
+| ---------- | --------------- |
+
+
+## LANGUAGE PRIMITIVES
+
+
+- bool
+- byte
+- complex128
+- complex64
+- float32
+- float64
+- int
+- int32
+- int64
+- interface{}
+- map[string]interface{}
+- rune
+- string
+- uint
+- uint32
+- uint64
+
+
+## RESERVED WORDS
+
+
+- bool
+- break
+- byte
+- case
+- chan
+- complex128
+- complex64
+- const
+- continue
+- default
+- defer
+- else
+- error
+- fallthrough
+- float32
+- float64
+- for
+- func
+- go
+- goto
+- if
+- import
+- int
+- int16
+- int32
+- int64
+- int8
+- interface
+- map
+- nil
+- package
+- range
+- return
+- rune
+- select
+- string
+- struct
+- switch
+- type
+- uint
+- uint16
+- uint32
+- uint64
+- uint8
+- uintptr
+- var
+
+
+## FEATURE SET
+
+
+### Client Modification Feature
+| Name | Supported | Defined By |
+| ---- | --------- | ---------- |
+|BasePath|✗|ToolingExtension
+|Authorizations|✗|ToolingExtension
+|UserAgent|✗|ToolingExtension
+|MockServer|✗|ToolingExtension
+
+### Data Type Feature
+| Name | Supported | Defined By |
+| ---- | --------- | ---------- |
+|Custom|✗|OAS2,OAS3
+|Int32|✓|OAS2,OAS3
+|Int64|✓|OAS2,OAS3
+|Float|✓|OAS2,OAS3
+|Double|✓|OAS2,OAS3
+|Decimal|✓|ToolingExtension
+|String|✓|OAS2,OAS3
+|Byte|✓|OAS2,OAS3
+|Binary|✓|OAS2,OAS3
+|Boolean|✓|OAS2,OAS3
+|Date|✓|OAS2,OAS3
+|DateTime|✓|OAS2,OAS3
+|Password|✓|OAS2,OAS3
+|File|✓|OAS2
+|Array|✓|OAS2,OAS3
+|Maps|✓|ToolingExtension
+|CollectionFormat|✓|OAS2
+|CollectionFormatMulti|✓|OAS2
+|Enum|✓|OAS2,OAS3
+|ArrayOfEnum|✓|ToolingExtension
+|ArrayOfModel|✓|ToolingExtension
+|ArrayOfCollectionOfPrimitives|✓|ToolingExtension
+|ArrayOfCollectionOfModel|✓|ToolingExtension
+|ArrayOfCollectionOfEnum|✓|ToolingExtension
+|MapOfEnum|✓|ToolingExtension
+|MapOfModel|✓|ToolingExtension
+|MapOfCollectionOfPrimitives|✓|ToolingExtension
+|MapOfCollectionOfModel|✓|ToolingExtension
+|MapOfCollectionOfEnum|✓|ToolingExtension
+
+### Documentation Feature
+| Name | Supported | Defined By |
+| ---- | --------- | ---------- |
+|Readme|✓|ToolingExtension
+|Model|✓|ToolingExtension
+|Api|✓|ToolingExtension
+
+### Global Feature
+| Name | Supported | Defined By |
+| ---- | --------- | ---------- |
+|Host|✓|OAS2,OAS3
+|BasePath|✓|OAS2,OAS3
+|Info|✓|OAS2,OAS3
+|Schemes|✗|OAS2,OAS3
+|PartialSchemes|✓|OAS2,OAS3
+|Consumes|✓|OAS2
+|Produces|✓|OAS2
+|ExternalDocumentation|✓|OAS2,OAS3
+|Examples|✓|OAS2,OAS3
+|XMLStructureDefinitions|✗|OAS2,OAS3
+|MultiServer|✗|OAS3
+|ParameterizedServer|✗|OAS3
+|ParameterStyling|✗|OAS3
+|Callbacks|✗|OAS3
+|LinkObjects|✗|OAS3
+
+### Parameter Feature
+| Name | Supported | Defined By |
+| ---- | --------- | ---------- |
+|Path|✓|OAS2,OAS3
+|Query|✓|OAS2,OAS3
+|Header|✓|OAS2,OAS3
+|Body|✓|OAS2
+|FormUnencoded|✓|OAS2
+|FormMultipart|✓|OAS2
+|Cookie|✗|OAS3
+
+### Schema Support Feature
+| Name | Supported | Defined By |
+| ---- | --------- | ---------- |
+|Simple|✓|OAS2,OAS3
+|Composite|✓|OAS2,OAS3
+|Polymorphism|✗|OAS2,OAS3
+|Union|✗|OAS3
+
+### Security Feature
+| Name | Supported | Defined By |
+| ---- | --------- | ---------- |
+|BasicAuth|✗|OAS2,OAS3
+|ApiKey|✗|OAS2,OAS3
+|OpenIDConnect|✗|OAS3
+|BearerToken|✗|OAS3
+|OAuth2_Implicit|✗|OAS2,OAS3
+|OAuth2_Password|✗|OAS2,OAS3
+|OAuth2_ClientCredentials|✗|OAS2,OAS3
+|OAuth2_AuthorizationCode|✗|OAS2,OAS3
+
+### Wire Format Feature
+| Name | Supported | Defined By |
+| ---- | --------- | ---------- |
+|JSON|✓|OAS2,OAS3
+|XML|✓|OAS2,OAS3
+|PROTOBUF|✗|ToolingExtension
+|Custom|✗|OAS2,OAS3
diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GoEchoServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GoEchoServerCodegen.java
new file mode 100644
index 00000000000..093818d7425
--- /dev/null
+++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GoEchoServerCodegen.java
@@ -0,0 +1,162 @@
+package org.openapitools.codegen.languages;
+
+import org.openapitools.codegen.*;
+
+import java.io.File;
+import java.util.*;
+
+import org.openapitools.codegen.meta.features.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class GoEchoServerCodegen extends AbstractGoCodegen {
+ static final Logger LOGGER = LoggerFactory.getLogger(GoEchoServerCodegen.class);
+
+ protected String apiVersion = "1.0.0";
+ protected int serverPort = 8080;
+ protected String projectName = "openapi-go-echo-server";
+ protected String apiPath = "go";
+
+ private static final String MODEL_PACKAGE_NAME = "models";
+ private static final String API_PACKAGE_NAME = "handlers";
+ private static final String OUTPUT_PATH = "generated-code" + File.separator + "go-echo-server";
+
+ public CodegenType getTag() {
+ return CodegenType.SERVER;
+ }
+
+ public String getName() {
+ return "go-echo-server";
+ }
+
+ public String getHelp() {
+ return "Generates a go-echo server. (Beta)";
+ }
+
+ public GoEchoServerCodegen() {
+ super();
+
+ modifyFeatureSet(features -> features
+ .includeDocumentationFeatures(DocumentationFeature.Readme)
+ .wireFormatFeatures(EnumSet.of(WireFormatFeature.JSON, WireFormatFeature.XML))
+ .securityFeatures(EnumSet.noneOf(
+ SecurityFeature.class
+ ))
+ .excludeGlobalFeatures(
+ GlobalFeature.XMLStructureDefinitions,
+ GlobalFeature.Callbacks,
+ GlobalFeature.LinkObjects,
+ GlobalFeature.ParameterStyling
+ )
+ .excludeSchemaSupportFeatures(
+ SchemaSupportFeature.Polymorphism
+ )
+ .excludeParameterFeatures(
+ ParameterFeature.Cookie
+ )
+ );
+
+ outputFolder = OUTPUT_PATH;
+ modelTemplateFiles.put("model.mustache", ".go");
+ setModelPackage(MODEL_PACKAGE_NAME);
+ apiTemplateFiles.put("api.mustache", ".go");
+ embeddedTemplateDir = templateDir = "go-echo-server";
+
+ /*
+ * Reserved words. Override this with reserved words specific to your language
+ */
+ setReservedWordsLowerCase(
+ Arrays.asList(
+ // data type
+ "string", "bool", "uint", "uint8", "uint16", "uint32", "uint64",
+ "int", "int8", "int16", "int32", "int64", "float32", "float64",
+ "complex64", "complex128", "rune", "byte", "uintptr",
+ "break", "default", "func", "interface", "select",
+ "case", "defer", "go", "map", "struct",
+ "chan", "else", "goto", "package", "switch",
+ "const", "fallthrough", "if", "range", "type",
+ "continue", "for", "import", "return", "var", "error", "nil")
+ // Added "error" as it's used so frequently that it may as well be a keyword
+ );
+
+ CliOption optServerPort = new CliOption("serverPort", "The network port the generated server binds to");
+ optServerPort.setType("int");
+ optServerPort.defaultValue(Integer.toString(serverPort));
+ cliOptions.add(optServerPort);
+ }
+
+ @Override
+ public Map postProcessOperationsWithModels(Map objs, List