diff --git a/compiler/cpp/src/thrift/generate/t_netstd_generator.cc b/compiler/cpp/src/thrift/generate/t_netstd_generator.cc
index 8b1c4c4..766d2b6 100644
--- a/compiler/cpp/src/thrift/generate/t_netstd_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_netstd_generator.cc
@@ -52,6 +52,7 @@
 {
     (void)option_string;
     suppress_deepcopy = false;
+    add_async_postfix = false;
     use_pascal_case_properties = false;
     union_ = false;
     serialize_ = false;
@@ -80,6 +81,9 @@
         else if (iter->first.compare("no_deepcopy") == 0) {
           suppress_deepcopy = true;
         }
+        else if (iter->first.compare("async_postfix") == 0) {
+          add_async_postfix = true;
+        }
         else {
           throw "unknown option netstd:" + iter->first;
         }
@@ -179,11 +183,12 @@
     }
 
     pverbose(".NET Standard options:\n");
-    pverbose("- union ......... %s\n", (is_union_enabled() ? "ON" : "off"));
-    pverbose("- serialize ..... %s\n", (is_serialize_enabled() ? "ON" : "off"));
-    pverbose("- wcf ........... %s\n", (is_wcf_enabled() ? "ON" : "off"));
-    pverbose("- pascal ........ %s\n", (use_pascal_case_properties ? "ON" : "off"));
-    pverbose("- no_deepcopy ... %s\n", (suppress_deepcopy ? "ON" : "off"));
+    pverbose("- union ........... %s\n", (is_union_enabled() ? "ON" : "off"));
+    pverbose("- serialize ....... %s\n", (is_serialize_enabled() ? "ON" : "off"));
+    pverbose("- wcf ............. %s\n", (is_wcf_enabled() ? "ON" : "off"));
+    pverbose("- pascal .......... %s\n", (use_pascal_case_properties ? "ON" : "off"));
+    pverbose("- no_deepcopy ..... %s\n", (suppress_deepcopy ? "ON" : "off"));
+    pverbose("- async_postfix ... %s\n", (add_async_postfix ? "ON" : "off"));
 }
 
 string t_netstd_generator::normalize_name(string name)
@@ -1914,6 +1919,7 @@
         out << indent() << "[ServiceContract(Namespace=\"" << wcf_namespace_ << "\")]" << endl;
     }
 
+    prepare_member_name_mapping(tservice);
     out << indent() << "public interface IAsync" << extends_iface << endl
         << indent() << "{" << endl;
 
@@ -1941,6 +1947,7 @@
     }
     indent_down();
     out << indent() << "}" << endl << endl;
+    cleanup_member_name_mapping(tservice);
 }
 
 void t_netstd_generator::generate_service_helpers(ostream& out, t_service* tservice)
@@ -1948,6 +1955,7 @@
     vector<t_function*> functions = tservice->get_functions();
     vector<t_function*>::iterator f_iter;
 
+    prepare_member_name_mapping(tservice);
     out << indent() << "public class InternalStructs" << endl;
     out << indent() << "{" << endl;
     indent_up();
@@ -1962,6 +1970,7 @@
 
     indent_down();
     out << indent() << "}" << endl << endl;
+    cleanup_member_name_mapping(tservice);
 }
 
 void t_netstd_generator::generate_service_client(ostream& out, t_service* tservice)
@@ -1981,7 +1990,7 @@
     out << endl;
 
     generate_netstd_doc(out, tservice);
-
+    prepare_member_name_mapping(tservice);
     out << indent() << "public class Client : " << extends_client << "IAsync" << endl
         << indent() << "{" << endl;
     indent_up();
@@ -2000,7 +2009,7 @@
     for (functions_iterator = functions.begin(); functions_iterator != functions.end(); ++functions_iterator)
     {
         string raw_func_name = (*functions_iterator)->get_name();
-        string function_name = raw_func_name + "Async";
+        string function_name = raw_func_name + (add_async_postfix ? "Async" : "");
 
         // async
         out << indent() << "public async " << function_signature_async(*functions_iterator, "") << endl
@@ -2093,7 +2102,7 @@
                     << function_name << " failed: unknown result\");" << endl;
             }
 
-            cleanup_member_name_mapping((*functions_iterator)->get_xceptions());
+            cleanup_member_name_mapping(xs);
             indent_down();
             out << indent() << "}" << endl << endl;
         }
@@ -2102,10 +2111,13 @@
             indent_down();
             out << indent() << "}" << endl;
         }
+
+        cleanup_member_name_mapping(arg_struct);
     }
 
     indent_down();
     out << indent() << "}" << endl << endl;
+    cleanup_member_name_mapping(tservice);
 }
 
 void t_netstd_generator::generate_service_server(ostream& out, t_service* tservice)
@@ -2121,6 +2133,7 @@
         extends_processor = extends + ".AsyncProcessor, ";
     }
 
+    prepare_member_name_mapping(tservice);
     out << indent() << "public class AsyncProcessor : " << extends_processor << "ITAsyncProcessor" << endl
         << indent() << "{" << endl;
 
@@ -2232,6 +2245,7 @@
 
     indent_down();
     out << indent() << "}" << endl << endl;
+    cleanup_member_name_mapping(tservice);
 }
 
 void t_netstd_generator::generate_function_helpers(ostream& out, t_function* tfunction)
@@ -2304,7 +2318,7 @@
         out << "result.Success = ";
     }
 
-    out << "await _iAsync." << normalize_name(tfunction->get_name()) << "Async(";
+    out << "await _iAsync." << func_name(normalize_name(tfunction->get_name()) + (add_async_postfix ? "Async" : "")) << "(";
 
     bool first = true;
     collect_extensions_types(arg_struct);
@@ -2996,12 +3010,17 @@
     return name;
 }
 
+void t_netstd_generator::prepare_member_name_mapping(t_service* tservice)
+{
+    prepare_member_name_mapping(tservice, tservice->get_functions(), tservice->get_name());
+}
+
 void t_netstd_generator::prepare_member_name_mapping(t_struct* tstruct)
 {
     prepare_member_name_mapping(tstruct, tstruct->get_members(), tstruct->get_name());
 }
 
-void t_netstd_generator::prepare_member_name_mapping(void* scope, const vector<t_field*>& members, const string& structname)
+void t_netstd_generator::prepare_member_name_mapping(t_struct* scope, const vector<t_field*>& members, const string& structname)
 {
     // begin new scope
     member_mapping_scopes.emplace_back();
@@ -3014,11 +3033,9 @@
     std::set<string> used_member_names;
     vector<t_field*>::const_iterator iter;
 
-    // prevent name conflicts with struct (CS0542 error)
+    // prevent name conflicts with struct (CS0542 error + THRIFT-2942)
     used_member_names.insert(structname);
     used_member_names.insert("Isset");
-
-    // prevent name conflicts with known methods (THRIFT-2942)
     used_member_names.insert("Read");
     used_member_names.insert("Write");
 
@@ -3047,6 +3064,51 @@
 }
 
 
+void t_netstd_generator::prepare_member_name_mapping(t_service* scope, const vector<t_function*>& members, const string& structname)
+{
+    // begin new scope
+    member_mapping_scopes.emplace_back();
+    member_mapping_scope& active = member_mapping_scopes.back();
+    active.scope_member = scope;
+
+    // current C# generator policy:
+    // - prop names are always rendered with an Uppercase first letter
+    // - struct names are used as given
+    std::set<string> used_member_names;
+    vector<t_function*>::const_iterator iter;
+
+    // prevent name conflicts with service/intf
+    used_member_names.insert(structname);
+    used_member_names.insert("Client");
+    used_member_names.insert("IAsync");
+    used_member_names.insert("AsyncProcessor");
+    used_member_names.insert("InternalStructs");
+
+    for (iter = members.begin(); iter != members.end(); ++iter)
+    {
+        string oldname = (*iter)->get_name();
+        string newname = func_name(*iter, true);
+        while (true)
+        {
+            // new name conflicts with another method
+            if (used_member_names.find(newname) != used_member_names.end())
+            {
+                pverbose("service %s: method %s conflicts with another method\n", structname.c_str(), newname.c_str());
+                newname += '_';
+                continue;
+            }
+
+            // add always, this helps us to detect edge cases like
+            // different spellings ("foo" and "Foo") within the same service
+            pverbose("service %s: method mapping %s => %s\n", structname.c_str(), oldname.c_str(), newname.c_str());
+            active.mapping_table[oldname] = newname;
+            used_member_names.insert(newname);
+            break;
+        }
+    }
+}
+
+
 string t_netstd_generator::convert_to_pascal_case(const string& str) {
   string out;
   bool must_capitalize = true;
@@ -3088,6 +3150,18 @@
   return name;
 }
 
+string t_netstd_generator::func_name(t_function* tfunc, bool suppress_mapping) {
+  return func_name(tfunc->get_name(), suppress_mapping);
+}
+
+string t_netstd_generator::func_name(std::string fname, bool suppress_mapping) {
+  if (suppress_mapping) {
+    return fname;
+  }
+
+  return get_mapped_member_name(fname);
+}
+
 string t_netstd_generator::type_name(t_type* ttype)
 {
     ttype = resolve_typedef(ttype);
@@ -3248,7 +3322,7 @@
 string t_netstd_generator::function_signature(t_function* tfunction, string prefix)
 {
     t_type* ttype = tfunction->get_returntype();
-    return type_name(ttype) + " " + normalize_name(prefix + tfunction->get_name()) + "(" + argument_list(tfunction->get_arglist()) + ")";
+    return type_name(ttype) + " " + func_name(normalize_name(prefix + tfunction->get_name())) + "(" + argument_list(tfunction->get_arglist()) + ")";
 }
 
 string t_netstd_generator::function_signature_async(t_function* tfunction, string prefix)
@@ -3260,7 +3334,7 @@
         task += "<" + type_name(ttype) + ">";
     }
 
-    string result = task + " " + normalize_name(prefix + tfunction->get_name()) + "Async(";
+    string result = task + " " + func_name(normalize_name(prefix + tfunction->get_name()) + (add_async_postfix ? "Async" : "")) + "(";
     string args = argument_list(tfunction->get_arglist());
     result += args;
     if (!args.empty())
@@ -3447,4 +3521,5 @@
     "    union:           Use new union typing, which includes a static read function for union types.\n"
     "    pascal:          Generate Pascal Case property names according to Microsoft naming convention.\n"
     "    no_deepcopy:     Suppress generation of DeepCopy() method.\n"
+    "    async_postfix:   Append \"Async\" to all service methods (maintains compatibility with existing code).\n"
 )
diff --git a/compiler/cpp/src/thrift/generate/t_netstd_generator.h b/compiler/cpp/src/thrift/generate/t_netstd_generator.h
index 1217cc8..8a812a3 100644
--- a/compiler/cpp/src/thrift/generate/t_netstd_generator.h
+++ b/compiler/cpp/src/thrift/generate/t_netstd_generator.h
@@ -139,6 +139,8 @@
   string argument_list(t_struct* tstruct);
   string type_to_enum(t_type* ttype);
   string prop_name(t_field* tfield, bool suppress_mapping = false);
+  string func_name(t_function* tfunc, bool suppress_mapping = false);
+  string func_name(std::string fname, bool suppress_mapping = false);
   string convert_to_pascal_case(const string& str);
   string get_enum_class_name(t_type* type);
 
@@ -152,6 +154,7 @@
   bool wcf_;
   bool use_pascal_case_properties;
   bool suppress_deepcopy;
+  bool add_async_postfix;
 
   string wcf_namespace_;
   map<string, int> netstd_keywords;
@@ -162,8 +165,10 @@
   void init_keywords();
   string normalize_name(string name);
   string make_valid_csharp_identifier(string const& fromName);
+  void prepare_member_name_mapping(t_service* tservice);
   void prepare_member_name_mapping(t_struct* tstruct);
-  void prepare_member_name_mapping(void* scope, const vector<t_field*>& members, const string& structname);
+  void prepare_member_name_mapping(t_struct* scope, const vector<t_field*>& members, const string& structname);
+  void prepare_member_name_mapping(t_service* scope, const vector<t_function*>& members, const string& structname);
   void cleanup_member_name_mapping(void* scope);
   string get_mapped_member_name(string oldname);
   string get_isset_name(const string& str);
diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/GlobalSuppressions.cs b/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/GlobalSuppressions.cs
new file mode 100644
index 0000000..77cd3fc
--- /dev/null
+++ b/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/GlobalSuppressions.cs
@@ -0,0 +1,9 @@
+// This file is used by Code Analysis to maintain SuppressMessage
+// attributes that are applied to this project.
+// Project-level suppressions either have no target or are given
+// a specific target and scoped to a namespace, type, member, etc.
+
+using System.Diagnostics.CodeAnalysis;
+
+[assembly: SuppressMessage("Performance", "CA1822", Justification = "<Ausstehend>", Scope = "module")]
+[assembly: SuppressMessage("Style", "IDE0090", Justification = "<Ausstehend>", Scope = "module")]
diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Impl/Thrift5253/MyService.cs b/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Impl/Thrift5253/MyService.cs
index 1b8d99f..660b2b7 100644
--- a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Impl/Thrift5253/MyService.cs
+++ b/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Impl/Thrift5253/MyService.cs
@@ -26,42 +26,43 @@
 {
     class MyServiceImpl : MyService.IAsync
     {
-        public Task<AsyncProcessor> AsyncProcessorAsync(AsyncProcessor input, CancellationToken cancellationToken = default)
+        public Task<AsyncProcessor> AsyncProcessor_(AsyncProcessor input, CancellationToken cancellationToken = default)
         {
             return Task.FromResult(new AsyncProcessor() { Foo = input.Foo });
         }
 
-        public Task<BrokenResult> BrokenAsync(BrokenArgs input, CancellationToken cancellationToken = default)
+        public Task<BrokenResult> Broken(BrokenArgs input, CancellationToken cancellationToken = default)
         {
             return Task.FromResult(new BrokenResult() { Foo = input.Foo });
         }
 
-        public Task<Client> ClientAsync(Client input, CancellationToken cancellationToken = default)
+        public Task<Client> Client_(Client input, CancellationToken cancellationToken = default)
         {
+            _ = cancellationToken;
             return Task.FromResult(new Client() { Foo = input.Foo });
         }
 
-        public Task<IAsync> IAsyncAsync(IAsync input, CancellationToken cancellationToken = default)
+        public Task<IAsync> IAsync_(IAsync input, CancellationToken cancellationToken = default)
         {
             return Task.FromResult(new IAsync() { Foo = input.Foo });
         }
 
-        public Task<InternalStructs> InternalStructsAsync(InternalStructs input, CancellationToken cancellationToken = default)
+        public Task<InternalStructs> InternalStructs_(InternalStructs input, CancellationToken cancellationToken = default)
         {
             return Task.FromResult(new InternalStructs() { Foo = input.Foo });
         }
 
-        public Task TestAsyncAsync(CancellationToken cancellationToken = default)
+        public Task TestAsync(CancellationToken cancellationToken = default)
         {
             return Task.CompletedTask;
         }
 
-        public Task TestXsyncAsync(CancellationToken cancellationToken = default)
+        public Task TestXsync(CancellationToken cancellationToken = default)
         {
             return Task.CompletedTask;
         }
 
-        public Task<WorksRslt> WorksAsync(WorksArrrgs input, CancellationToken cancellationToken = default)
+        public Task<WorksRslt> Works(WorksArrrgs input, CancellationToken cancellationToken = default)
         {
             return Task.FromResult(new WorksRslt() { Foo = input.Foo });
         }
diff --git a/test/netstd/Client/GlobalSuppressions.cs b/test/netstd/Client/GlobalSuppressions.cs
deleted file mode 100644
index 34fdc79..0000000
--- a/test/netstd/Client/GlobalSuppressions.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-// Licensed to the Apache Software Foundation(ASF) under one
-// or more contributor license agreements.See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License. You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied. See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-// This file is used by Code Analysis to maintain SuppressMessage
-// attributes that are applied to this project.
-// Project-level suppressions either have no target or are given
-// a specific target and scoped to a namespace, type, member, etc.
-
-using System.Diagnostics.CodeAnalysis;
-
-[assembly: SuppressMessage("Performance", "CA1822", Justification = "<Ausstehend>", Scope = "module")]
-[assembly: SuppressMessage("Style", "IDE0083", Justification = "<Ausstehend>", Scope = "module")]
diff --git a/test/netstd/Client/TestClient.cs b/test/netstd/Client/TestClient.cs
index ec90250..70a21e1 100644
--- a/test/netstd/Client/TestClient.cs
+++ b/test/netstd/Client/TestClient.cs
@@ -353,7 +353,7 @@
 
                     try
                     {
-                        ReturnCode |= ExecuteClientTestAsync(client).GetAwaiter().GetResult(); ;
+                        ReturnCode |= ExecuteClientTest(client).GetAwaiter().GetResult(); ;
                     }
                     catch (Exception ex)
                     {
@@ -469,7 +469,7 @@
                     amount = 15 * 1024 * 1024;
                     break;
                 default:
-                    throw new ArgumentException(nameof(testcase));
+                    throw new ArgumentException("invalid argument",nameof(testcase));
             }
 
             var retval = new byte[amount];
@@ -499,16 +499,16 @@
             return token.Token;
         }
 
-        public static async Task<int> ExecuteClientTestAsync(ThriftTest.Client client)
+        public static async Task<int> ExecuteClientTest(ThriftTest.Client client)
         {
             var returnCode = 0;
 
             Console.Write("testVoid()");
-            await client.testVoidAsync(MakeTimeoutToken());
+            await client.testVoid(MakeTimeoutToken());
             Console.WriteLine(" = void");
 
             Console.Write("testString(\"Test\")");
-            var s = await client.testStringAsync("Test", MakeTimeoutToken());
+            var s = await client.testString("Test", MakeTimeoutToken());
             Console.WriteLine(" = \"" + s + "\"");
             if ("Test" != s)
             {
@@ -517,7 +517,7 @@
             }
 
             Console.Write("testBool(true)");
-            var t = await client.testBoolAsync((bool)true, MakeTimeoutToken());
+            var t = await client.testBool((bool)true, MakeTimeoutToken());
             Console.WriteLine(" = " + t);
             if (!t)
             {
@@ -525,7 +525,7 @@
                 returnCode |= ErrorBaseTypes;
             }
             Console.Write("testBool(false)");
-            var f = await client.testBoolAsync((bool)false, MakeTimeoutToken());
+            var f = await client.testBool((bool)false, MakeTimeoutToken());
             Console.WriteLine(" = " + f);
             if (f)
             {
@@ -534,7 +534,7 @@
             }
 
             Console.Write("testByte(1)");
-            var i8 = await client.testByteAsync((sbyte)1, MakeTimeoutToken());
+            var i8 = await client.testByte((sbyte)1, MakeTimeoutToken());
             Console.WriteLine(" = " + i8);
             if (1 != i8)
             {
@@ -543,7 +543,7 @@
             }
 
             Console.Write("testI32(-1)");
-            var i32 = await client.testI32Async(-1, MakeTimeoutToken());
+            var i32 = await client.testI32(-1, MakeTimeoutToken());
             Console.WriteLine(" = " + i32);
             if (-1 != i32)
             {
@@ -552,7 +552,7 @@
             }
 
             Console.Write("testI64(-34359738368)");
-            var i64 = await client.testI64Async(-34359738368, MakeTimeoutToken());
+            var i64 = await client.testI64(-34359738368, MakeTimeoutToken());
             Console.WriteLine(" = " + i64);
             if (-34359738368 != i64)
             {
@@ -562,7 +562,7 @@
 
             // TODO: Validate received message
             Console.Write("testDouble(5.325098235)");
-            var dub = await client.testDoubleAsync(5.325098235, MakeTimeoutToken());
+            var dub = await client.testDouble(5.325098235, MakeTimeoutToken());
             Console.WriteLine(" = " + dub);
             if (5.325098235 != dub)
             {
@@ -570,7 +570,7 @@
                 returnCode |= ErrorBaseTypes;
             }
             Console.Write("testDouble(-0.000341012439638598279)");
-            dub = await client.testDoubleAsync(-0.000341012439638598279, MakeTimeoutToken());
+            dub = await client.testDouble(-0.000341012439638598279, MakeTimeoutToken());
             Console.WriteLine(" = " + dub);
             if (-0.000341012439638598279 != dub)
             {
@@ -586,7 +586,7 @@
                 Console.Write("testBinary({0} bytes)", binOut.Length);
                 try
                 {
-                    var binIn = await client.testBinaryAsync(binOut, MakeTimeoutToken());
+                    var binIn = await client.testBinary(binOut, MakeTimeoutToken());
                     Console.WriteLine(" = {0} bytes", binIn.Length);
                     if (binIn.Length != binOut.Length)
                     {
@@ -636,7 +636,7 @@
                 I32_thing = -3,
                 I64_thing = -5
             };
-            var i = await client.testStructAsync(o, MakeTimeoutToken());
+            var i = await client.testStruct(o, MakeTimeoutToken());
             Console.WriteLine(" = {\"" + i.String_thing + "\", " + i.Byte_thing + ", " + i.I32_thing + ", " + i.I64_thing + "}");
 
             // TODO: Validate received message
@@ -647,7 +647,7 @@
                 Struct_thing = o,
                 I32_thing = 5
             };
-            var i2 = await client.testNestAsync(o2, MakeTimeoutToken());
+            var i2 = await client.testNest(o2, MakeTimeoutToken());
             i = i2.Struct_thing;
             Console.WriteLine(" = {" + i2.Byte_thing + ", {\"" + i.String_thing + "\", " + i.Byte_thing + ", " + i.I32_thing + ", " + i.I64_thing + "}, " + i2.I32_thing + "}");
 
@@ -672,7 +672,7 @@
             }
             Console.Write("})");
 
-            var mapin = await client.testMapAsync(mapout, MakeTimeoutToken());
+            var mapin = await client.testMap(mapout, MakeTimeoutToken());
 
             Console.Write(" = {");
             first = true;
@@ -712,7 +712,7 @@
             }
             Console.Write("})");
 
-            var listin = await client.testListAsync(listout, MakeTimeoutToken());
+            var listin = await client.testList(listout, MakeTimeoutToken());
 
             Console.Write(" = {");
             first = true;
@@ -753,7 +753,7 @@
             }
             Console.Write("})");
 
-            var setin = await client.testSetAsync(setout, MakeTimeoutToken());
+            var setin = await client.testSet(setout, MakeTimeoutToken());
 
             Console.Write(" = {");
             first = true;
@@ -773,7 +773,7 @@
 
 
             Console.Write("testEnum(ONE)");
-            var ret = await client.testEnumAsync(Numberz.ONE, MakeTimeoutToken());
+            var ret = await client.testEnum(Numberz.ONE, MakeTimeoutToken());
             Console.WriteLine(" = " + ret);
             if (Numberz.ONE != ret)
             {
@@ -782,7 +782,7 @@
             }
 
             Console.Write("testEnum(TWO)");
-            ret = await client.testEnumAsync(Numberz.TWO, MakeTimeoutToken());
+            ret = await client.testEnum(Numberz.TWO, MakeTimeoutToken());
             Console.WriteLine(" = " + ret);
             if (Numberz.TWO != ret)
             {
@@ -791,7 +791,7 @@
             }
 
             Console.Write("testEnum(THREE)");
-            ret = await client.testEnumAsync(Numberz.THREE, MakeTimeoutToken());
+            ret = await client.testEnum(Numberz.THREE, MakeTimeoutToken());
             Console.WriteLine(" = " + ret);
             if (Numberz.THREE != ret)
             {
@@ -800,7 +800,7 @@
             }
 
             Console.Write("testEnum(FIVE)");
-            ret = await client.testEnumAsync(Numberz.FIVE, MakeTimeoutToken());
+            ret = await client.testEnum(Numberz.FIVE, MakeTimeoutToken());
             Console.WriteLine(" = " + ret);
             if (Numberz.FIVE != ret)
             {
@@ -809,7 +809,7 @@
             }
 
             Console.Write("testEnum(EIGHT)");
-            ret = await client.testEnumAsync(Numberz.EIGHT, MakeTimeoutToken());
+            ret = await client.testEnum(Numberz.EIGHT, MakeTimeoutToken());
             Console.WriteLine(" = " + ret);
             if (Numberz.EIGHT != ret)
             {
@@ -818,7 +818,7 @@
             }
 
             Console.Write("testTypedef(309858235082523)");
-            var uid = await client.testTypedefAsync(309858235082523L, MakeTimeoutToken());
+            var uid = await client.testTypedef(309858235082523L, MakeTimeoutToken());
             Console.WriteLine(" = " + uid);
             if (309858235082523L != uid)
             {
@@ -828,7 +828,7 @@
 
             // TODO: Validate received message
             Console.Write("testMapMap(1)");
-            var mm = await client.testMapMapAsync(1, MakeTimeoutToken());
+            var mm = await client.testMapMap(1, MakeTimeoutToken());
             Console.Write(" = {");
             foreach (var key in mm.Keys)
             {
@@ -862,7 +862,7 @@
                 truck
             };
             Console.Write("testInsanity()");
-            var whoa = await client.testInsanityAsync(insane, MakeTimeoutToken());
+            var whoa = await client.testInsanity(insane, MakeTimeoutToken());
             Console.Write(" = {");
             foreach (var key in whoa.Keys)
             {
@@ -927,14 +927,14 @@
             var arg4 = Numberz.FIVE;
             long arg5 = 5000000;
             Console.Write("Test Multi(" + arg0 + "," + arg1 + "," + arg2 + ",{" + string.Join(",", tmpMultiDict) + "}," + arg4 + "," + arg5 + ")");
-            var multiResponse = await client.testMultiAsync(arg0, arg1, arg2, multiDict, arg4, arg5, MakeTimeoutToken());
+            var multiResponse = await client.testMulti(arg0, arg1, arg2, multiDict, arg4, arg5, MakeTimeoutToken());
             Console.Write(" = Xtruct(byte_thing:" + multiResponse.Byte_thing + ",String_thing:" + multiResponse.String_thing
                           + ",i32_thing:" + multiResponse.I32_thing + ",i64_thing:" + multiResponse.I64_thing + ")\n");
 
             try
             {
                 Console.WriteLine("testException(\"Xception\")");
-                await client.testExceptionAsync("Xception", MakeTimeoutToken());
+                await client.testException("Xception", MakeTimeoutToken());
                 Console.WriteLine("*** FAILED ***");
                 returnCode |= ErrorExceptions;
             }
@@ -955,7 +955,7 @@
             try
             {
                 Console.WriteLine("testException(\"TException\")");
-                await client.testExceptionAsync("TException", MakeTimeoutToken());
+                await client.testException("TException", MakeTimeoutToken());
                 Console.WriteLine("*** FAILED ***");
                 returnCode |= ErrorExceptions;
             }
@@ -972,7 +972,7 @@
             try
             {
                 Console.WriteLine("testException(\"ok\")");
-                await client.testExceptionAsync("ok", MakeTimeoutToken());
+                await client.testException("ok", MakeTimeoutToken());
                 // OK
             }
             catch (Exception ex)
@@ -985,7 +985,7 @@
             try
             {
                 Console.WriteLine("testMultiException(\"Xception\", ...)");
-                await client.testMultiExceptionAsync("Xception", "ignore", MakeTimeoutToken());
+                await client.testMultiException("Xception", "ignore", MakeTimeoutToken());
                 Console.WriteLine("*** FAILED ***");
                 returnCode |= ErrorExceptions;
             }
@@ -1006,7 +1006,7 @@
             try
             {
                 Console.WriteLine("testMultiException(\"Xception2\", ...)");
-                await client.testMultiExceptionAsync("Xception2", "ignore", MakeTimeoutToken());
+                await client.testMultiException("Xception2", "ignore", MakeTimeoutToken());
                 Console.WriteLine("*** FAILED ***");
                 returnCode |= ErrorExceptions;
             }
@@ -1027,7 +1027,7 @@
             try
             {
                 Console.WriteLine("testMultiException(\"success\", \"OK\")");
-                if ("OK" != (await client.testMultiExceptionAsync("success", "OK", MakeTimeoutToken())).String_thing)
+                if ("OK" != (await client.testMultiException("success", "OK", MakeTimeoutToken())).String_thing)
                 {
                     Console.WriteLine("*** FAILED ***");
                     returnCode |= ErrorExceptions;
@@ -1043,7 +1043,7 @@
             Console.WriteLine("Test Oneway(1)");
             var sw = new Stopwatch();
             sw.Start();
-            await client.testOnewayAsync(1, MakeTimeoutToken());
+            await client.testOneway(1, MakeTimeoutToken());
             sw.Stop();
             if (sw.ElapsedMilliseconds > 1000)
             {
@@ -1057,7 +1057,7 @@
             sw.Start();
             var token = MakeTimeoutToken(20000);
             for (var k = 0; k < times; ++k)
-                await client.testVoidAsync(token);
+                await client.testVoid(token);
             sw.Stop();
             Console.WriteLine(" = {0} ms a testVoid() call", sw.ElapsedMilliseconds / times);
             return returnCode;
diff --git a/test/netstd/Server/GlobalSuppressions.cs b/test/netstd/Server/GlobalSuppressions.cs
deleted file mode 100644
index 34fdc79..0000000
--- a/test/netstd/Server/GlobalSuppressions.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-// Licensed to the Apache Software Foundation(ASF) under one
-// or more contributor license agreements.See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License. You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied. See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-// This file is used by Code Analysis to maintain SuppressMessage
-// attributes that are applied to this project.
-// Project-level suppressions either have no target or are given
-// a specific target and scoped to a namespace, type, member, etc.
-
-using System.Diagnostics.CodeAnalysis;
-
-[assembly: SuppressMessage("Performance", "CA1822", Justification = "<Ausstehend>", Scope = "module")]
-[assembly: SuppressMessage("Style", "IDE0083", Justification = "<Ausstehend>", Scope = "module")]
diff --git a/test/netstd/Server/TestServer.cs b/test/netstd/Server/TestServer.cs
index bec9fae..895c3ff 100644
--- a/test/netstd/Server/TestServer.cs
+++ b/test/netstd/Server/TestServer.cs
@@ -35,6 +35,7 @@
 using Thrift.Transport.Server;
 
 #pragma warning disable IDE0063  // using can be simplified, we don't
+#pragma warning disable IDE0057  // substr can be simplified, we don't
 
 namespace ThriftTest
 {
@@ -190,7 +191,7 @@
         {
             public TServer Server { get; set; }
             private readonly int handlerID;
-            private readonly StringBuilder sb = new StringBuilder();
+            private readonly StringBuilder sb = new();
             private readonly TestLogDelegate logger;
 
             public TestHandlerAsync()
@@ -209,61 +210,61 @@
                 Console.Write(sb.ToString());
             }
 
-            public Task testVoidAsync(CancellationToken cancellationToken)
+            public Task testVoid(CancellationToken cancellationToken)
             {
                 logger.Invoke("testVoid()");
                 return Task.CompletedTask;
             }
 
-            public Task<string> testStringAsync(string thing, CancellationToken cancellationToken)
+            public Task<string> testString(string thing, CancellationToken cancellationToken)
             {
                 logger.Invoke("testString({0})", thing);
                 return Task.FromResult(thing);
             }
 
-            public Task<bool> testBoolAsync(bool thing, CancellationToken cancellationToken)
+            public Task<bool> testBool(bool thing, CancellationToken cancellationToken)
             {
                 logger.Invoke("testBool({0})", thing);
                 return Task.FromResult(thing);
             }
 
-            public Task<sbyte> testByteAsync(sbyte thing, CancellationToken cancellationToken)
+            public Task<sbyte> testByte(sbyte thing, CancellationToken cancellationToken)
             {
                 logger.Invoke("testByte({0})", thing);
                 return Task.FromResult(thing);
             }
 
-            public Task<int> testI32Async(int thing, CancellationToken cancellationToken)
+            public Task<int> testI32(int thing, CancellationToken cancellationToken)
             {
                 logger.Invoke("testI32({0})", thing);
                 return Task.FromResult(thing);
             }
 
-            public Task<long> testI64Async(long thing, CancellationToken cancellationToken)
+            public Task<long> testI64(long thing, CancellationToken cancellationToken)
             {
                 logger.Invoke("testI64({0})", thing);
                 return Task.FromResult(thing);
             }
 
-            public Task<double> testDoubleAsync(double thing, CancellationToken cancellationToken)
+            public Task<double> testDouble(double thing, CancellationToken cancellationToken)
             {
                 logger.Invoke("testDouble({0})", thing);
                 return Task.FromResult(thing);
             }
 
-            public Task<byte[]> testBinaryAsync(byte[] thing, CancellationToken cancellationToken)
+            public Task<byte[]> testBinary(byte[] thing, CancellationToken cancellationToken)
             {
                 logger.Invoke("testBinary({0} bytes)", thing.Length);
                 return Task.FromResult(thing);
             }
 
-            public Task<Xtruct> testStructAsync(Xtruct thing, CancellationToken cancellationToken)
+            public Task<Xtruct> testStruct(Xtruct thing, CancellationToken cancellationToken)
             {
                 logger.Invoke("testStruct({{\"{0}\", {1}, {2}, {3}}})", thing.String_thing, thing.Byte_thing, thing.I32_thing, thing.I64_thing);
                 return Task.FromResult(thing);
             }
 
-            public Task<Xtruct2> testNestAsync(Xtruct2 nest, CancellationToken cancellationToken)
+            public Task<Xtruct2> testNest(Xtruct2 nest, CancellationToken cancellationToken)
             {
                 var thing = nest.Struct_thing;
                 logger.Invoke("testNest({{{0}, {{\"{1}\", {2}, {3}, {4}, {5}}}}})",
@@ -276,7 +277,7 @@
                 return Task.FromResult(nest);
             }
 
-            public Task<Dictionary<int, int>> testMapAsync(Dictionary<int, int> thing, CancellationToken cancellationToken)
+            public Task<Dictionary<int, int>> testMap(Dictionary<int, int> thing, CancellationToken cancellationToken)
             {
                 sb.Clear();
                 sb.Append("testMap({{");
@@ -298,7 +299,7 @@
                 return Task.FromResult(thing);
             }
 
-            public Task<Dictionary<string, string>> testStringMapAsync(Dictionary<string, string> thing, CancellationToken cancellationToken)
+            public Task<Dictionary<string, string>> testStringMap(Dictionary<string, string> thing, CancellationToken cancellationToken)
             {
                 sb.Clear();
                 sb.Append("testStringMap({{");
@@ -320,7 +321,7 @@
                 return Task.FromResult(thing);
             }
 
-            public Task<THashSet<int>> testSetAsync(THashSet<int> thing, CancellationToken cancellationToken)
+            public Task<THashSet<int>> testSet(THashSet<int> thing, CancellationToken cancellationToken)
             {
                 sb.Clear();
                 sb.Append("testSet({{");
@@ -342,7 +343,7 @@
                 return Task.FromResult(thing);
             }
 
-            public Task<List<int>> testListAsync(List<int> thing, CancellationToken cancellationToken)
+            public Task<List<int>> testList(List<int> thing, CancellationToken cancellationToken)
             {
                 sb.Clear();
                 sb.Append("testList({{");
@@ -364,19 +365,19 @@
                 return Task.FromResult(thing);
             }
 
-            public Task<Numberz> testEnumAsync(Numberz thing, CancellationToken cancellationToken)
+            public Task<Numberz> testEnum(Numberz thing, CancellationToken cancellationToken)
             {
                 logger.Invoke("testEnum({0})", thing);
                 return Task.FromResult(thing);
             }
 
-            public Task<long> testTypedefAsync(long thing, CancellationToken cancellationToken)
+            public Task<long> testTypedef(long thing, CancellationToken cancellationToken)
             {
                 logger.Invoke("testTypedef({0})", thing);
                 return Task.FromResult(thing);
             }
 
-            public Task<Dictionary<int, Dictionary<int, int>>> testMapMapAsync(int hello, CancellationToken cancellationToken)
+            public Task<Dictionary<int, Dictionary<int, int>>> testMapMap(int hello, CancellationToken cancellationToken)
             {
                 logger.Invoke("testMapMap({0})", hello);
                 var mapmap = new Dictionary<int, Dictionary<int, int>>();
@@ -395,7 +396,7 @@
                 return Task.FromResult(mapmap);
             }
 
-            public Task<Dictionary<long, Dictionary<Numberz, Insanity>>> testInsanityAsync(Insanity argument, CancellationToken cancellationToken)
+            public Task<Dictionary<long, Dictionary<Numberz, Insanity>>> testInsanity(Insanity argument, CancellationToken cancellationToken)
             {
                 logger.Invoke("testInsanity()");
 
@@ -428,7 +429,7 @@
                 return Task.FromResult(insane);
             }
 
-            public Task<Xtruct> testMultiAsync(sbyte arg0, int arg1, long arg2, Dictionary<short, string> arg3, Numberz arg4, long arg5,
+            public Task<Xtruct> testMulti(sbyte arg0, int arg1, long arg2, Dictionary<short, string> arg3, Numberz arg4, long arg5,
                 CancellationToken cancellationToken)
             {
                 logger.Invoke("testMulti()");
@@ -441,7 +442,7 @@
                 return Task.FromResult(hello);
             }
 
-            public Task testExceptionAsync(string arg, CancellationToken cancellationToken)
+            public Task testException(string arg, CancellationToken cancellationToken)
             {
                 logger.Invoke("testException({0})", arg);
                 if (arg == "Xception")
@@ -460,7 +461,7 @@
                 return Task.CompletedTask;
             }
 
-            public Task<Xtruct> testMultiExceptionAsync(string arg0, string arg1, CancellationToken cancellationToken)
+            public Task<Xtruct> testMultiException(string arg0, string arg1, CancellationToken cancellationToken)
             {
                 logger.Invoke("testMultiException({0}, {1})", arg0, arg1);
                 if (arg0 == "Xception")
@@ -487,7 +488,7 @@
                 return Task.FromResult(result);
             }
 
-            public Task testOnewayAsync(int secondsToSleep, CancellationToken cancellationToken)
+            public Task testOneway(int secondsToSleep, CancellationToken cancellationToken)
             {
                 logger.Invoke("testOneway({0}), sleeping...", secondsToSleep);
                 Task.Delay(secondsToSleep * 1000, cancellationToken).GetAwaiter().GetResult();
diff --git a/tutorial/netstd/Client/Program.cs b/tutorial/netstd/Client/Program.cs
index f3e93ce..9c47450 100644
--- a/tutorial/netstd/Client/Program.cs
+++ b/tutorial/netstd/Client/Program.cs
@@ -41,7 +41,7 @@
 {
     public class Program
     {
-        private static readonly ServiceCollection ServiceCollection = new ServiceCollection();
+        private static readonly ServiceCollection ServiceCollection = new();
         private static ILogger Logger;
         private static readonly TConfiguration Configuration = null;  // new TConfiguration() if  needed
 
@@ -287,17 +287,13 @@
         private static TProtocol MakeProtocol(string[] args, TTransport transport)
         {
             Protocol selectedProtocol = GetProtocol(args);
-            switch (selectedProtocol)
+            return selectedProtocol switch
             {
-                case Protocol.Binary:
-                    return new TBinaryProtocol(transport);
-                case Protocol.Compact:
-                    return new TCompactProtocol(transport);
-                case Protocol.Json:
-                    return new TJsonProtocol(transport);
-                default:
-                    throw new Exception("unhandled protocol");
-            }
+                Protocol.Binary => new TBinaryProtocol(transport),
+                Protocol.Compact => new TCompactProtocol(transport),
+                Protocol.Json => new TJsonProtocol(transport),
+                _ => throw new Exception("unhandled protocol"),
+            };
         }
 
         private static async Task RunClientAsync(TProtocol protocol, bool multiplex, CancellationToken cancellationToken)
@@ -333,12 +329,12 @@
 
             // Async version
 
-            Logger.LogInformation($"{client.ClientId} PingAsync()");
-            await client.pingAsync(cancellationToken);
+            Logger.LogInformation($"{client.ClientId} Ping()");
+            await client.ping(cancellationToken);
 
-            Logger.LogInformation($"{client.ClientId} AddAsync(1,1)");
-            var sum = await client.addAsync(1, 1, cancellationToken);
-            Logger.LogInformation($"{client.ClientId} AddAsync(1,1)={sum}");
+            Logger.LogInformation($"{client.ClientId} Add(1,1)");
+            var sum = await client.add(1, 1, cancellationToken);
+            Logger.LogInformation($"{client.ClientId} Add(1,1)={sum}");
 
             var work = new Work
             {
@@ -349,8 +345,8 @@
 
             try
             {
-                Logger.LogInformation($"{client.ClientId} CalculateAsync(1)");
-                await client.calculateAsync(1, work, cancellationToken);
+                Logger.LogInformation($"{client.ClientId} Calculate(1)");
+                await client.calculate(1, work, cancellationToken);
                 Logger.LogInformation($"{client.ClientId} Whoa we can divide by 0");
             }
             catch (InvalidOperation io)
@@ -364,8 +360,8 @@
 
             try
             {
-                Logger.LogInformation($"{client.ClientId} CalculateAsync(1)");
-                var diff = await client.calculateAsync(1, work, cancellationToken);
+                Logger.LogInformation($"{client.ClientId} Calculate(1)");
+                var diff = await client.calculate(1, work, cancellationToken);
                 Logger.LogInformation($"{client.ClientId} 15-10={diff}");
             }
             catch (InvalidOperation io)
@@ -373,12 +369,12 @@
                 Logger.LogInformation($"{client.ClientId} Invalid operation: " + io);
             }
 
-            Logger.LogInformation($"{client.ClientId} GetStructAsync(1)");
-            var log = await client.getStructAsync(1, cancellationToken);
+            Logger.LogInformation($"{client.ClientId} GetStruct(1)");
+            var log = await client.getStruct(1, cancellationToken);
             Logger.LogInformation($"{client.ClientId} Check log: {log.Value}");
 
-            Logger.LogInformation($"{client.ClientId} ZipAsync() with delay 100mc on server side");
-            await client.zipAsync(cancellationToken);
+            Logger.LogInformation($"{client.ClientId} Zip() with delay 100mc on server side");
+            await client.zip(cancellationToken);
         }
 
 
diff --git a/tutorial/netstd/Server/Program.cs b/tutorial/netstd/Server/Program.cs
index df8f390..80205d5 100644
--- a/tutorial/netstd/Server/Program.cs
+++ b/tutorial/netstd/Server/Program.cs
@@ -45,7 +45,7 @@
 {
     public class Program
     {
-        private static readonly ServiceCollection ServiceCollection = new ServiceCollection();
+        private static readonly ServiceCollection ServiceCollection = new();
         private static ILogger Logger;
         private static readonly TConfiguration Configuration = null;  // new TConfiguration() if  needed
 
@@ -186,55 +186,30 @@
 
         private static async Task RunSelectedConfigurationAsync(Transport transport, Buffering buffering, Protocol protocol, bool multiplex, CancellationToken cancellationToken)
         {
-            TServerTransport serverTransport = null;
-            switch (transport)
+            TServerTransport serverTransport = transport switch
             {
-                case Transport.Tcp:
-                    serverTransport = new TServerSocketTransport(9090, Configuration);
-                    break;
-                case Transport.NamedPipe:
-                    serverTransport = new TNamedPipeServerTransport(".test", Configuration);
-                    break;
-                case Transport.TcpTls:
-                    serverTransport = new TTlsServerSocketTransport(9090, Configuration,
-                        GetCertificate(), ClientCertValidator, LocalCertificateSelectionCallback);
-                    break;
-            }
+                Transport.Tcp => new TServerSocketTransport(9090, Configuration),
+                Transport.NamedPipe => new TNamedPipeServerTransport(".test", Configuration, NamedPipeClientFlags.None),
+                Transport.TcpTls => new TTlsServerSocketTransport(9090, Configuration, GetCertificate(), ClientCertValidator, LocalCertificateSelectionCallback),
+                _ => throw new ArgumentException("unsupported value $transport", nameof(transport)),
+            };
 
-            TTransportFactory transportFactory = null;
-            switch (buffering)
+            TTransportFactory transportFactory = buffering switch
             {
-                case Buffering.Buffered:
-                    transportFactory = new TBufferedTransport.Factory();
-                    break;
+                Buffering.Buffered => new TBufferedTransport.Factory(),
+                Buffering.Framed => new TFramedTransport.Factory(),
+                // layered transport(s) are optional
+                Buffering.None => null,
+                _ => throw new ArgumentException("unsupported value $buffering", nameof(buffering)),
+            };
 
-                case Buffering.Framed:
-                    transportFactory = new TFramedTransport.Factory();
-                    break;
-
-                default: // layered transport(s) are optional
-                    Debug.Assert(buffering == Buffering.None, "unhandled case");
-                    break;
-            }
-
-            TProtocolFactory protocolFactory = null;
-            switch (protocol)
+            TProtocolFactory protocolFactory = protocol switch
             {
-                case Protocol.Binary:
-                    protocolFactory = new TBinaryProtocol.Factory();
-                    break;
-
-                case Protocol.Compact:
-                    protocolFactory = new TCompactProtocol.Factory();
-                    break;
-
-                case Protocol.Json:
-                    protocolFactory = new TJsonProtocol.Factory();
-                    break;
-
-                default:
-                    throw new ArgumentOutOfRangeException(nameof(protocol), protocol, null);
-            }
+                Protocol.Binary => new TBinaryProtocol.Factory(),
+                Protocol.Compact => new TCompactProtocol.Factory(),
+                Protocol.Json => new TJsonProtocol.Factory(),
+                _ => throw new ArgumentException("unsupported value $protocol", nameof(protocol)),
+            };
 
             var handler = new CalculatorAsyncHandler();
             ITAsyncProcessor processor = new Calculator.AsyncProcessor(handler);
@@ -395,34 +370,34 @@
 
         public class CalculatorAsyncHandler : Calculator.IAsync
         {
-            private readonly Dictionary<int, SharedStruct> _log = new Dictionary<int, SharedStruct>();
+            private readonly Dictionary<int, SharedStruct> _log = new();
 
             public CalculatorAsyncHandler()
             {
             }
 
-            public async Task<SharedStruct> getStructAsync(int key,
+            public async Task<SharedStruct> getStruct(int key,
                 CancellationToken cancellationToken)
             {
-                Logger.LogInformation("GetStructAsync({0})", key);
+                Logger.LogInformation("GetStruct({0})", key);
                 return await Task.FromResult(_log[key]);
             }
 
-            public async Task pingAsync(CancellationToken cancellationToken)
+            public async Task ping(CancellationToken cancellationToken)
             {
-                Logger.LogInformation("PingAsync()");
+                Logger.LogInformation("Ping()");
                 await Task.CompletedTask;
             }
 
-            public async Task<int> addAsync(int num1, int num2, CancellationToken cancellationToken)
+            public async Task<int> add(int num1, int num2, CancellationToken cancellationToken)
             {
-                Logger.LogInformation($"AddAsync({num1},{num2})");
+                Logger.LogInformation($"Add({num1},{num2})");
                 return await Task.FromResult(num1 + num2);
             }
 
-            public async Task<int> calculateAsync(int logid, Work w, CancellationToken cancellationToken)
+            public async Task<int> calculate(int logid, Work w, CancellationToken cancellationToken)
             {
-                Logger.LogInformation($"CalculateAsync({logid}, [{w.Op},{w.Num1},{w.Num2}])");
+                Logger.LogInformation($"Calculate({logid}, [{w.Op},{w.Num1},{w.Num2}])");
 
                 int val;
                 switch (w.Op)
@@ -476,22 +451,22 @@
                 return await Task.FromResult(val);
             }
 
-            public async Task zipAsync(CancellationToken cancellationToken)
+            public async Task zip(CancellationToken cancellationToken)
             {
-                Logger.LogInformation("ZipAsync() with delay 100mc");
+                Logger.LogInformation("Zip() with delay 100mc");
                 await Task.Delay(100, CancellationToken.None);
             }
         }
 
         public class SharedServiceAsyncHandler : SharedService.IAsync
         {
-            public async Task<SharedStruct> getStructAsync(int key, CancellationToken cancellationToken)
+            public async Task<SharedStruct> getStruct(int key, CancellationToken cancellationToken)
             {
-                Logger.LogInformation("GetStructAsync({0})", key);
+                Logger.LogInformation("GetStruct({0})", key);
                 return await Task.FromResult(new SharedStruct()
                 {
                     Key = key,
-                    Value = "GetStructAsync"
+                    Value = "GetStruct"
                 });
             }
         }
