diff --git a/src/Generator/Driver.cs b/src/Generator/Driver.cs
index a90cbb41..ff02888a 100644
--- a/src/Generator/Driver.cs
+++ b/src/Generator/Driver.cs
@@ -241,7 +241,10 @@ namespace CppSharp
             TranslationUnitPasses.AddPass(new CheckFlagEnumsPass());
             TranslationUnitPasses.AddPass(new CheckDuplicatedNamesPass());
             if (Options.IsCSharpGenerator && Options.GenerateDefaultValuesForArguments)
+            {
                 TranslationUnitPasses.AddPass(new HandleDefaultParamValuesPass());
+                TranslationUnitPasses.AddPass(new FixDefaultParamValuesOfOverridesPass());
+            }
 
             if (Options.GenerateAbstractImpls)
                 TranslationUnitPasses.AddPass(new GenerateAbstractImplementationsPass());
diff --git a/src/Generator/Passes/FixDefaultParamValuesOfOverridesPass.cs b/src/Generator/Passes/FixDefaultParamValuesOfOverridesPass.cs
new file mode 100644
index 00000000..ab1c852b
--- /dev/null
+++ b/src/Generator/Passes/FixDefaultParamValuesOfOverridesPass.cs
@@ -0,0 +1,20 @@
+using CppSharp.AST;
+
+namespace CppSharp.Passes
+{
+    public class FixDefaultParamValuesOfOverridesPass : TranslationUnitPass
+    {
+        public override bool VisitMethodDecl(Method method)
+        {
+            if (method.IsOverride && !method.IsSynthetized)
+            {
+                Method rootBaseMethod = ((Class) method.Namespace).GetRootBaseMethod(method);
+                for (int i = 0; i < method.Parameters.Count; i++)
+                {
+                    method.Parameters[i].DefaultArgument = rootBaseMethod.Parameters[i].DefaultArgument;
+                }
+            }
+            return base.VisitMethodDecl(method);
+        }
+    }
+}
diff --git a/tests/CSharpTemp/CSharpTemp.Tests.cs b/tests/CSharpTemp/CSharpTemp.Tests.cs
index ec7e2b92..928c0c55 100644
--- a/tests/CSharpTemp/CSharpTemp.Tests.cs
+++ b/tests/CSharpTemp/CSharpTemp.Tests.cs
@@ -144,4 +144,10 @@ public class CSharpTempTests : GeneratorTestFixture
     {
         AnotherUnit.FunctionInAnotherUnit();
     }
+
+    [Test]
+    public void TestPrivateOverride()
+    {
+        new HasPrivateOverride().PrivateOverride();
+    }
 }
\ No newline at end of file
diff --git a/tests/CSharpTemp/CSharpTemp.cpp b/tests/CSharpTemp/CSharpTemp.cpp
index c2301bbe..74c8cc20 100644
--- a/tests/CSharpTemp/CSharpTemp.cpp
+++ b/tests/CSharpTemp/CSharpTemp.cpp
@@ -234,3 +234,11 @@ void MethodsWithDefaultValues::DefaultRefTypeBeforeAndAfterOthers(int i, Foo foo
 void MethodsWithDefaultValues::DefaultIntAssignedAnEnum(int i)
 {
 }
+
+void HasPrivateOverrideBase::privateOverride(int i)
+{
+}
+
+void HasPrivateOverride::privateOverride(int i)
+{
+}
diff --git a/tests/CSharpTemp/CSharpTemp.h b/tests/CSharpTemp/CSharpTemp.h
index 9c1902fc..3952ddca 100644
--- a/tests/CSharpTemp/CSharpTemp.h
+++ b/tests/CSharpTemp/CSharpTemp.h
@@ -186,3 +186,15 @@ public:
     void DefaultRefTypeBeforeAndAfterOthers(int i = 5, Foo foo = Foo(), Bar::Items item = Bar::Item2, Baz baz = Baz());
     void DefaultIntAssignedAnEnum(int i = Bar::Item1);
 };
+
+class DLL_API HasPrivateOverrideBase
+{
+public:
+    virtual void privateOverride(int i = 5);
+};
+
+class DLL_API HasPrivateOverride : public HasPrivateOverrideBase
+{
+private:
+    virtual void privateOverride(int i);
+};