diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PowerShellExperimentalClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PowerShellExperimentalClientCodegen.java
index ff2e1d0b75ebcf4ae368994c421cf0307346beef..8de0ecb5cdd84107102741896a007ccef57d5b01 100644
--- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PowerShellExperimentalClientCodegen.java
+++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PowerShellExperimentalClientCodegen.java
@@ -372,39 +372,75 @@ public class PowerShellExperimentalClientCodegen extends DefaultCodegen implemen
                 "System.Nullable[Boolean]"
         ));
 
-        // https://richardspowershellblog.wordpress.com/2009/05/02/powershell-reserved-words/
+        // list of reserved words - must be in lower case
         reservedWords = new HashSet<String>(Arrays.asList(
-                "Begin",
-                "Break",
-                "Catch",
-                "Continue",
-                "Data",
-                "Do",
-                "Dynamicparam",
-                "Else",
-                "Elseif",
-                "End",
-                "Exit",
-                "Filter",
-                "Finally",
-                "For",
-                "Foreach",
-                "From",
-                "Function",
-                "If",
-                "In",
-                "Param",
-                "Process",
-                "Return",
-                "Switch",
-                "Throw",
-                "Trap",
-                "Try",
-                "Until",
-                "While",
-                "Local",
-                "Private",
-                "Where"
+                // https://richardspowershellblog.wordpress.com/2009/05/02/powershell-reserved-words/
+                "begin",
+                "break",
+                "catch",
+                "continue",
+                "data",
+                "do",
+                "dynamicparam",
+                "else",
+                "elseif",
+                "end",
+                "exit",
+                "filter",
+                "finally",
+                "for",
+                "foreach",
+                "from",
+                "function",
+                "if",
+                "in",
+                "param",
+                "process",
+                "return",
+                "switch",
+                "throw",
+                "trap",
+                "try",
+                "until",
+                "while",
+                "local",
+                "private",
+                "where",
+                // special variables 
+                "args",
+                "consolefilename",
+                "error",
+                "event",
+                "eventargs",
+                "eventsubscriber",
+                "executioncontext",
+                "false",
+                "foreach",
+                "home",
+                "host",
+                "input",
+                "lastexitcode",
+                "matches",
+                "myinvocation",
+                "nestedpromptlevel",
+                "null",
+                "pid",
+                "profile",
+                "pscmdlet",
+                "pscommandpath",
+                "psculture",
+                "psdebugcontext",
+                "pshome",
+                "psitem",
+                "psscriptroot",
+                "pssenderinfo",
+                "psuiculture",
+                "psversiontable",
+                "sender",
+                "shellid",
+                "stacktrace",
+                "this",
+                "true"
         ));
 
         defaultIncludes = new HashSet<String>(Arrays.asList(
@@ -634,7 +670,7 @@ public class PowerShellExperimentalClientCodegen extends DefaultCodegen implemen
 
     @Override
     public String escapeReservedWord(String name) {
-        return "_" + name;
+        return "Var" + name;
     }
 
     /**
@@ -654,23 +690,23 @@ public class PowerShellExperimentalClientCodegen extends DefaultCodegen implemen
             name = name + "_" + modelNameSuffix;
         }
 
-        name = sanitizeName(name);
+        // camelize the model name
+        // phone_number => PhoneNumber
+        name = camelize(sanitizeName(name));
 
         // model name cannot use reserved keyword, e.g. return
         if (isReservedWord(name)) {
-            LOGGER.warn(name + " (reserved word) cannot be used as model name. Renamed to " + camelize("model_" + name));
-            name = "model_" + name; // e.g. return => ModelReturn (after camelize)
+            LOGGER.warn(name + " (reserved word or special variable name) cannot be used as model name. Renamed to " + camelize("model_" + name));
+            name = camelize("model_" + name); // e.g. return => ModelReturn (after camelize)
         }
 
         // model name starts with number
         if (name.matches("^\\d.*")) {
             LOGGER.warn(name + " (model name starts with number) cannot be used as model name. Renamed to " + camelize("model_" + name));
-            name = "model_" + name; // e.g. 200Response => Model200Response (after camelize)
+            name = camelize("model_" + name); // e.g. 200Response => Model200Response (after camelize)
         }
 
-        // camelize the model name
-        // phone_number => PhoneNumber
-        return camelize(name);
+        return name;
     }
 
     @Override
@@ -736,27 +772,7 @@ public class PowerShellExperimentalClientCodegen extends DefaultCodegen implemen
 
     @Override
     public String toParamName(String name) {
-        // sanitize name
-        name = sanitizeName(name);
-
-        // replace - with _ e.g. created-at => created_at
-        name = name.replaceAll("-", "_");
-
-        // if it's all upper case, do nothing
-        if (name.matches("^[A-Z_]*$")) {
-            return name;
-        }
-
-        // camelize the variable name
-        // pet_id => PetId
-        name = camelize(name, false);
-
-        // for reserved word or word starting with number, append _
-        if (isReservedWord(name) || name.matches("^\\d.*")) {
-            name = escapeReservedWord(name);
-        }
-
-        return name;
+        return toVarName(name);
     }
 
     @Override
@@ -835,17 +851,13 @@ public class PowerShellExperimentalClientCodegen extends DefaultCodegen implemen
         // sanitize name
         name = sanitizeName(name);
 
-        // if it's all uppper case, do nothing
-        if (name.matches("^[A-Z_]*$")) {
-            return name;
-        }
-
         // camelize the variable name
         // pet_id => PetId
         name = camelize(name);
 
         // for reserved word or word starting with number, append _
         if (isReservedWord(name) || name.matches("^\\d.*")) {
+            LOGGER.warn(name + " (reserved word or special variable name) cannot be used in naming. Renamed to " + escapeReservedWord(name));
             name = escapeReservedWord(name);
         }
 
@@ -1028,4 +1040,5 @@ public class PowerShellExperimentalClientCodegen extends DefaultCodegen implemen
     public String toRegularExpression(String pattern) {
         return escapeText(pattern);
     }
+
 }
diff --git a/samples/client/petstore/powershell-experimental/src/PSPetstore/PSPetstore.psd1 b/samples/client/petstore/powershell-experimental/src/PSPetstore/PSPetstore.psd1
index a481d378d49a2d62815b0ff9f37e9f6d172b3df3..726f4ea51112527f65decd050a8191e1c0498cae 100644
--- a/samples/client/petstore/powershell-experimental/src/PSPetstore/PSPetstore.psd1
+++ b/samples/client/petstore/powershell-experimental/src/PSPetstore/PSPetstore.psd1
@@ -3,7 +3,7 @@
 #
 # Generated by: OpenAPI Generator Team
 #
-# Generated on: 4/9/20
+# Generated on: 4/10/20
 #
 
 @{