diff --git a/src/AST/Type.cs b/src/AST/Type.cs
index 384c8f94..7210a8e1 100644
--- a/src/AST/Type.cs
+++ b/src/AST/Type.cs
@@ -896,6 +896,8 @@ namespace CppSharp.AST
         {
         }
 
+        public Type Desugared { get; set; }
+
         public override T Visit<T>(ITypeVisitor<T> visitor,
                                    TypeQualifiers quals = new TypeQualifiers())
         {
diff --git a/src/Core/Parser/ASTConverter.cs b/src/Core/Parser/ASTConverter.cs
index 22185842..52539678 100644
--- a/src/Core/Parser/ASTConverter.cs
+++ b/src/Core/Parser/ASTConverter.cs
@@ -620,7 +620,7 @@ namespace CppSharp
 
         public override AST.Type VisitTemplateParameterSubstitution(TemplateParameterSubstitutionType type)
         {
-            var _type = new CppSharp.AST.TemplateParameterSubstitutionType();
+            var _type = new AST.TemplateParameterSubstitutionType();
             _type.Replacement = VisitQualified(type.Replacement);
             VisitType(type, _type);
             return _type;
@@ -628,7 +628,7 @@ namespace CppSharp
 
         public override AST.Type VisitInjectedClassName(InjectedClassNameType type)
         {
-            var _type = new CppSharp.AST.InjectedClassNameType();
+            var _type = new AST.InjectedClassNameType();
             _type.Class = declConverter.Visit(type.Class) as AST.Class;
             _type.InjectedSpecializationType = VisitQualified(type.InjectedSpecializationType);
             VisitType(type, _type);
@@ -637,14 +637,16 @@ namespace CppSharp
 
         public override AST.Type VisitDependentName(DependentNameType type)
         {
-            var _type = new CppSharp.AST.DependentNameType();
+            var _type = new AST.DependentNameType();
             VisitType(type, _type);
+            if (type.Desugared != null)
+                _type.Desugared = Visit(type.Desugared);
             return _type;
         }
 
         public override AST.Type VisitBuiltin(BuiltinType type)
         {
-            var _type = new CppSharp.AST.BuiltinType();
+            var _type = new AST.BuiltinType();
             _type.Type = VisitPrimitive(type.Type);
             VisitType(type, _type);
             return _type;
diff --git a/src/CppParser/AST.cpp b/src/CppParser/AST.cpp
index e15054d4..98ba88f7 100644
--- a/src/CppParser/AST.cpp
+++ b/src/CppParser/AST.cpp
@@ -179,7 +179,7 @@ InjectedClassNameType::InjectedClassNameType()
 {
 }
 
-DependentNameType::DependentNameType() : Type(TypeKind::DependentName) {}
+DependentNameType::DependentNameType() : Type(TypeKind::DependentName), Desugared(0) {}
 
 PackExpansionType::PackExpansionType() : Type(TypeKind::PackExpansion) {}
 
diff --git a/src/CppParser/AST.h b/src/CppParser/AST.h
index 412d8e9b..82da6349 100644
--- a/src/CppParser/AST.h
+++ b/src/CppParser/AST.h
@@ -240,6 +240,7 @@ class CS_API DependentNameType : public Type
 {
 public:
     DECLARE_TYPE_KIND(DependentName)
+    Type* Desugared;
 };
 
 class CS_API PackExpansionType : public Type
diff --git a/src/CppParser/Bindings/CLI/AST.cpp b/src/CppParser/Bindings/CLI/AST.cpp
index 50f8d0a0..4b61d378 100644
--- a/src/CppParser/Bindings/CLI/AST.cpp
+++ b/src/CppParser/Bindings/CLI/AST.cpp
@@ -1074,6 +1074,16 @@ CppSharp::Parser::AST::DependentNameType::DependentNameType(CppSharp::Parser::AS
     NativePtr = new ::CppSharp::CppParser::AST::DependentNameType(__arg0);
 }
 
+CppSharp::Parser::AST::Type^ CppSharp::Parser::AST::DependentNameType::Desugared::get()
+{
+    return (((::CppSharp::CppParser::AST::DependentNameType*)NativePtr)->Desugared == nullptr) ? nullptr : gcnew CppSharp::Parser::AST::Type((::CppSharp::CppParser::AST::Type*)((::CppSharp::CppParser::AST::DependentNameType*)NativePtr)->Desugared);
+}
+
+void CppSharp::Parser::AST::DependentNameType::Desugared::set(CppSharp::Parser::AST::Type^ value)
+{
+    ((::CppSharp::CppParser::AST::DependentNameType*)NativePtr)->Desugared = (::CppSharp::CppParser::AST::Type*)value->NativePtr;
+}
+
 CppSharp::Parser::AST::PackExpansionType::PackExpansionType(::CppSharp::CppParser::AST::PackExpansionType* native)
     : CppSharp::Parser::AST::Type((::CppSharp::CppParser::AST::Type*)native)
 {
diff --git a/src/CppParser/Bindings/CLI/AST.h b/src/CppParser/Bindings/CLI/AST.h
index f6a7a0a5..644abe98 100644
--- a/src/CppParser/Bindings/CLI/AST.h
+++ b/src/CppParser/Bindings/CLI/AST.h
@@ -910,6 +910,12 @@ namespace CppSharp
                 DependentNameType(CppSharp::Parser::AST::DependentNameType^ _0);
 
                 ~DependentNameType();
+
+                property CppSharp::Parser::AST::Type^ Desugared
+                {
+                    CppSharp::Parser::AST::Type^ get();
+                    void set(CppSharp::Parser::AST::Type^);
+                }
             };
 
             public ref class PackExpansionType : CppSharp::Parser::AST::Type
diff --git a/src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/CppSharp.CppParser.cs b/src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/CppSharp.CppParser.cs
index d2d5107f..86536f21 100644
--- a/src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/CppSharp.CppParser.cs
+++ b/src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/CppSharp.CppParser.cs
@@ -2466,7 +2466,7 @@ namespace CppSharp
 
             public unsafe partial class DependentNameType : global::CppSharp.Parser.AST.Type, IDisposable
             {
-                [StructLayout(LayoutKind.Explicit, Size = 8)]
+                [StructLayout(LayoutKind.Explicit, Size = 12)]
                 public new partial struct Internal
                 {
                     [FieldOffset(0)]
@@ -2475,6 +2475,9 @@ namespace CppSharp
                     [FieldOffset(4)]
                     public byte IsDependent;
 
+                    [FieldOffset(8)]
+                    public global::System.IntPtr Desugared;
+
                     [SuppressUnmanagedCodeSecurity]
                     [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
                         EntryPoint="_ZN8CppSharp9CppParser3AST17DependentNameTypeC2Ev")]
@@ -2498,7 +2501,7 @@ namespace CppSharp
 
                 private static void* __CopyValue(DependentNameType.Internal native)
                 {
-                    var ret = Marshal.AllocHGlobal(8);
+                    var ret = Marshal.AllocHGlobal(12);
                     global::CppSharp.Parser.AST.DependentNameType.Internal.cctor_2(ret, new global::System.IntPtr(&native));
                     return ret.ToPointer();
                 }
@@ -2522,7 +2525,7 @@ namespace CppSharp
                 public DependentNameType()
                     : this((void*) null)
                 {
-                    __Instance = Marshal.AllocHGlobal(8);
+                    __Instance = Marshal.AllocHGlobal(12);
                     __ownsNativeInstance = true;
                     NativeToManagedMap[__Instance] = this;
                     Internal.ctor_0((__Instance + __PointerAdjustment));
@@ -2531,7 +2534,7 @@ namespace CppSharp
                 public DependentNameType(global::CppSharp.Parser.AST.DependentNameType _0)
                     : this((void*) null)
                 {
-                    __Instance = Marshal.AllocHGlobal(8);
+                    __Instance = Marshal.AllocHGlobal(12);
                     __ownsNativeInstance = true;
                     NativeToManagedMap[__Instance] = this;
                     if (ReferenceEquals(_0, null))
@@ -2539,6 +2542,24 @@ namespace CppSharp
                     var __arg0 = _0.__Instance;
                     Internal.cctor_2((__Instance + __PointerAdjustment), __arg0);
                 }
+
+                public global::CppSharp.Parser.AST.Type Desugared
+                {
+                    get
+                    {
+                        global::CppSharp.Parser.AST.Type __result0;
+                        if (((Internal*) __Instance)->Desugared == IntPtr.Zero) __result0 = null;
+                        else if (global::CppSharp.Parser.AST.Type.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->Desugared))
+                            __result0 = (global::CppSharp.Parser.AST.Type) global::CppSharp.Parser.AST.Type.NativeToManagedMap[((Internal*) __Instance)->Desugared];
+                        else __result0 = global::CppSharp.Parser.AST.Type.__CreateInstance(((Internal*) __Instance)->Desugared);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Desugared = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
             }
 
             public unsafe partial class PackExpansionType : global::CppSharp.Parser.AST.Type, IDisposable
diff --git a/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/CppSharp.CppParser.cs b/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/CppSharp.CppParser.cs
index 6b1c4132..b0cc2fdb 100644
--- a/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/CppSharp.CppParser.cs
+++ b/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/CppSharp.CppParser.cs
@@ -2466,7 +2466,7 @@ namespace CppSharp
 
             public unsafe partial class DependentNameType : global::CppSharp.Parser.AST.Type, IDisposable
             {
-                [StructLayout(LayoutKind.Explicit, Size = 8)]
+                [StructLayout(LayoutKind.Explicit, Size = 12)]
                 public new partial struct Internal
                 {
                     [FieldOffset(0)]
@@ -2475,6 +2475,9 @@ namespace CppSharp
                     [FieldOffset(4)]
                     public byte IsDependent;
 
+                    [FieldOffset(8)]
+                    public global::System.IntPtr Desugared;
+
                     [SuppressUnmanagedCodeSecurity]
                     [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.ThisCall,
                         EntryPoint="??0DependentNameType@AST@CppParser@CppSharp@@QAE@XZ")]
@@ -2498,7 +2501,7 @@ namespace CppSharp
 
                 private static void* __CopyValue(DependentNameType.Internal native)
                 {
-                    var ret = Marshal.AllocHGlobal(8);
+                    var ret = Marshal.AllocHGlobal(12);
                     global::CppSharp.Parser.AST.DependentNameType.Internal.cctor_2(ret, new global::System.IntPtr(&native));
                     return ret.ToPointer();
                 }
@@ -2522,7 +2525,7 @@ namespace CppSharp
                 public DependentNameType()
                     : this((void*) null)
                 {
-                    __Instance = Marshal.AllocHGlobal(8);
+                    __Instance = Marshal.AllocHGlobal(12);
                     __ownsNativeInstance = true;
                     NativeToManagedMap[__Instance] = this;
                     Internal.ctor_0((__Instance + __PointerAdjustment));
@@ -2531,7 +2534,7 @@ namespace CppSharp
                 public DependentNameType(global::CppSharp.Parser.AST.DependentNameType _0)
                     : this((void*) null)
                 {
-                    __Instance = Marshal.AllocHGlobal(8);
+                    __Instance = Marshal.AllocHGlobal(12);
                     __ownsNativeInstance = true;
                     NativeToManagedMap[__Instance] = this;
                     if (ReferenceEquals(_0, null))
@@ -2539,6 +2542,24 @@ namespace CppSharp
                     var __arg0 = _0.__Instance;
                     Internal.cctor_2((__Instance + __PointerAdjustment), __arg0);
                 }
+
+                public global::CppSharp.Parser.AST.Type Desugared
+                {
+                    get
+                    {
+                        global::CppSharp.Parser.AST.Type __result0;
+                        if (((Internal*) __Instance)->Desugared == IntPtr.Zero) __result0 = null;
+                        else if (global::CppSharp.Parser.AST.Type.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->Desugared))
+                            __result0 = (global::CppSharp.Parser.AST.Type) global::CppSharp.Parser.AST.Type.NativeToManagedMap[((Internal*) __Instance)->Desugared];
+                        else __result0 = global::CppSharp.Parser.AST.Type.__CreateInstance(((Internal*) __Instance)->Desugared);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Desugared = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
             }
 
             public unsafe partial class PackExpansionType : global::CppSharp.Parser.AST.Type, IDisposable
diff --git a/src/CppParser/Bindings/CSharp/x86_64-apple-darwin12.4.0/CppSharp.CppParser.cs b/src/CppParser/Bindings/CSharp/x86_64-apple-darwin12.4.0/CppSharp.CppParser.cs
index 1da768b3..3d0870b8 100644
--- a/src/CppParser/Bindings/CSharp/x86_64-apple-darwin12.4.0/CppSharp.CppParser.cs
+++ b/src/CppParser/Bindings/CSharp/x86_64-apple-darwin12.4.0/CppSharp.CppParser.cs
@@ -2466,7 +2466,7 @@ namespace CppSharp
 
             public unsafe partial class DependentNameType : global::CppSharp.Parser.AST.Type, IDisposable
             {
-                [StructLayout(LayoutKind.Explicit, Size = 8)]
+                [StructLayout(LayoutKind.Explicit, Size = 16)]
                 public new partial struct Internal
                 {
                     [FieldOffset(0)]
@@ -2475,6 +2475,9 @@ namespace CppSharp
                     [FieldOffset(4)]
                     public byte IsDependent;
 
+                    [FieldOffset(8)]
+                    public global::System.IntPtr Desugared;
+
                     [SuppressUnmanagedCodeSecurity]
                     [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
                         EntryPoint="_ZN8CppSharp9CppParser3AST17DependentNameTypeC2Ev")]
@@ -2498,7 +2501,7 @@ namespace CppSharp
 
                 private static void* __CopyValue(DependentNameType.Internal native)
                 {
-                    var ret = Marshal.AllocHGlobal(8);
+                    var ret = Marshal.AllocHGlobal(16);
                     global::CppSharp.Parser.AST.DependentNameType.Internal.cctor_2(ret, new global::System.IntPtr(&native));
                     return ret.ToPointer();
                 }
@@ -2522,7 +2525,7 @@ namespace CppSharp
                 public DependentNameType()
                     : this((void*) null)
                 {
-                    __Instance = Marshal.AllocHGlobal(8);
+                    __Instance = Marshal.AllocHGlobal(16);
                     __ownsNativeInstance = true;
                     NativeToManagedMap[__Instance] = this;
                     Internal.ctor_0((__Instance + __PointerAdjustment));
@@ -2531,7 +2534,7 @@ namespace CppSharp
                 public DependentNameType(global::CppSharp.Parser.AST.DependentNameType _0)
                     : this((void*) null)
                 {
-                    __Instance = Marshal.AllocHGlobal(8);
+                    __Instance = Marshal.AllocHGlobal(16);
                     __ownsNativeInstance = true;
                     NativeToManagedMap[__Instance] = this;
                     if (ReferenceEquals(_0, null))
@@ -2539,6 +2542,24 @@ namespace CppSharp
                     var __arg0 = _0.__Instance;
                     Internal.cctor_2((__Instance + __PointerAdjustment), __arg0);
                 }
+
+                public global::CppSharp.Parser.AST.Type Desugared
+                {
+                    get
+                    {
+                        global::CppSharp.Parser.AST.Type __result0;
+                        if (((Internal*) __Instance)->Desugared == IntPtr.Zero) __result0 = null;
+                        else if (global::CppSharp.Parser.AST.Type.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->Desugared))
+                            __result0 = (global::CppSharp.Parser.AST.Type) global::CppSharp.Parser.AST.Type.NativeToManagedMap[((Internal*) __Instance)->Desugared];
+                        else __result0 = global::CppSharp.Parser.AST.Type.__CreateInstance(((Internal*) __Instance)->Desugared);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Desugared = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
             }
 
             public unsafe partial class PackExpansionType : global::CppSharp.Parser.AST.Type, IDisposable
diff --git a/src/CppParser/Bindings/CSharp/x86_64-linux-gnu-cxx11abi/CppSharp.CppParser.cs b/src/CppParser/Bindings/CSharp/x86_64-linux-gnu-cxx11abi/CppSharp.CppParser.cs
index b3a4a36b..cabceac0 100644
--- a/src/CppParser/Bindings/CSharp/x86_64-linux-gnu-cxx11abi/CppSharp.CppParser.cs
+++ b/src/CppParser/Bindings/CSharp/x86_64-linux-gnu-cxx11abi/CppSharp.CppParser.cs
@@ -2466,7 +2466,7 @@ namespace CppSharp
 
             public unsafe partial class DependentNameType : global::CppSharp.Parser.AST.Type, IDisposable
             {
-                [StructLayout(LayoutKind.Explicit, Size = 8)]
+                [StructLayout(LayoutKind.Explicit, Size = 16)]
                 public new partial struct Internal
                 {
                     [FieldOffset(0)]
@@ -2475,6 +2475,9 @@ namespace CppSharp
                     [FieldOffset(4)]
                     public byte IsDependent;
 
+                    [FieldOffset(8)]
+                    public global::System.IntPtr Desugared;
+
                     [SuppressUnmanagedCodeSecurity]
                     [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
                         EntryPoint="_ZN8CppSharp9CppParser3AST17DependentNameTypeC2Ev")]
@@ -2498,7 +2501,7 @@ namespace CppSharp
 
                 private static void* __CopyValue(DependentNameType.Internal native)
                 {
-                    var ret = Marshal.AllocHGlobal(8);
+                    var ret = Marshal.AllocHGlobal(16);
                     global::CppSharp.Parser.AST.DependentNameType.Internal.cctor_2(ret, new global::System.IntPtr(&native));
                     return ret.ToPointer();
                 }
@@ -2522,7 +2525,7 @@ namespace CppSharp
                 public DependentNameType()
                     : this((void*) null)
                 {
-                    __Instance = Marshal.AllocHGlobal(8);
+                    __Instance = Marshal.AllocHGlobal(16);
                     __ownsNativeInstance = true;
                     NativeToManagedMap[__Instance] = this;
                     Internal.ctor_0((__Instance + __PointerAdjustment));
@@ -2531,7 +2534,7 @@ namespace CppSharp
                 public DependentNameType(global::CppSharp.Parser.AST.DependentNameType _0)
                     : this((void*) null)
                 {
-                    __Instance = Marshal.AllocHGlobal(8);
+                    __Instance = Marshal.AllocHGlobal(16);
                     __ownsNativeInstance = true;
                     NativeToManagedMap[__Instance] = this;
                     if (ReferenceEquals(_0, null))
@@ -2539,6 +2542,24 @@ namespace CppSharp
                     var __arg0 = _0.__Instance;
                     Internal.cctor_2((__Instance + __PointerAdjustment), __arg0);
                 }
+
+                public global::CppSharp.Parser.AST.Type Desugared
+                {
+                    get
+                    {
+                        global::CppSharp.Parser.AST.Type __result0;
+                        if (((Internal*) __Instance)->Desugared == IntPtr.Zero) __result0 = null;
+                        else if (global::CppSharp.Parser.AST.Type.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->Desugared))
+                            __result0 = (global::CppSharp.Parser.AST.Type) global::CppSharp.Parser.AST.Type.NativeToManagedMap[((Internal*) __Instance)->Desugared];
+                        else __result0 = global::CppSharp.Parser.AST.Type.__CreateInstance(((Internal*) __Instance)->Desugared);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Desugared = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
             }
 
             public unsafe partial class PackExpansionType : global::CppSharp.Parser.AST.Type, IDisposable
diff --git a/src/CppParser/Bindings/CSharp/x86_64-linux-gnu/CppSharp.CppParser.cs b/src/CppParser/Bindings/CSharp/x86_64-linux-gnu/CppSharp.CppParser.cs
index b3a4a36b..cabceac0 100644
--- a/src/CppParser/Bindings/CSharp/x86_64-linux-gnu/CppSharp.CppParser.cs
+++ b/src/CppParser/Bindings/CSharp/x86_64-linux-gnu/CppSharp.CppParser.cs
@@ -2466,7 +2466,7 @@ namespace CppSharp
 
             public unsafe partial class DependentNameType : global::CppSharp.Parser.AST.Type, IDisposable
             {
-                [StructLayout(LayoutKind.Explicit, Size = 8)]
+                [StructLayout(LayoutKind.Explicit, Size = 16)]
                 public new partial struct Internal
                 {
                     [FieldOffset(0)]
@@ -2475,6 +2475,9 @@ namespace CppSharp
                     [FieldOffset(4)]
                     public byte IsDependent;
 
+                    [FieldOffset(8)]
+                    public global::System.IntPtr Desugared;
+
                     [SuppressUnmanagedCodeSecurity]
                     [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
                         EntryPoint="_ZN8CppSharp9CppParser3AST17DependentNameTypeC2Ev")]
@@ -2498,7 +2501,7 @@ namespace CppSharp
 
                 private static void* __CopyValue(DependentNameType.Internal native)
                 {
-                    var ret = Marshal.AllocHGlobal(8);
+                    var ret = Marshal.AllocHGlobal(16);
                     global::CppSharp.Parser.AST.DependentNameType.Internal.cctor_2(ret, new global::System.IntPtr(&native));
                     return ret.ToPointer();
                 }
@@ -2522,7 +2525,7 @@ namespace CppSharp
                 public DependentNameType()
                     : this((void*) null)
                 {
-                    __Instance = Marshal.AllocHGlobal(8);
+                    __Instance = Marshal.AllocHGlobal(16);
                     __ownsNativeInstance = true;
                     NativeToManagedMap[__Instance] = this;
                     Internal.ctor_0((__Instance + __PointerAdjustment));
@@ -2531,7 +2534,7 @@ namespace CppSharp
                 public DependentNameType(global::CppSharp.Parser.AST.DependentNameType _0)
                     : this((void*) null)
                 {
-                    __Instance = Marshal.AllocHGlobal(8);
+                    __Instance = Marshal.AllocHGlobal(16);
                     __ownsNativeInstance = true;
                     NativeToManagedMap[__Instance] = this;
                     if (ReferenceEquals(_0, null))
@@ -2539,6 +2542,24 @@ namespace CppSharp
                     var __arg0 = _0.__Instance;
                     Internal.cctor_2((__Instance + __PointerAdjustment), __arg0);
                 }
+
+                public global::CppSharp.Parser.AST.Type Desugared
+                {
+                    get
+                    {
+                        global::CppSharp.Parser.AST.Type __result0;
+                        if (((Internal*) __Instance)->Desugared == IntPtr.Zero) __result0 = null;
+                        else if (global::CppSharp.Parser.AST.Type.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->Desugared))
+                            __result0 = (global::CppSharp.Parser.AST.Type) global::CppSharp.Parser.AST.Type.NativeToManagedMap[((Internal*) __Instance)->Desugared];
+                        else __result0 = global::CppSharp.Parser.AST.Type.__CreateInstance(((Internal*) __Instance)->Desugared);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Desugared = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
             }
 
             public unsafe partial class PackExpansionType : global::CppSharp.Parser.AST.Type, IDisposable
diff --git a/src/CppParser/Bindings/CSharp/x86_64-pc-win32-msvc/CppSharp.CppParser.cs b/src/CppParser/Bindings/CSharp/x86_64-pc-win32-msvc/CppSharp.CppParser.cs
index 05aa8420..1fca3ba5 100644
--- a/src/CppParser/Bindings/CSharp/x86_64-pc-win32-msvc/CppSharp.CppParser.cs
+++ b/src/CppParser/Bindings/CSharp/x86_64-pc-win32-msvc/CppSharp.CppParser.cs
@@ -2466,7 +2466,7 @@ namespace CppSharp
 
             public unsafe partial class DependentNameType : global::CppSharp.Parser.AST.Type, IDisposable
             {
-                [StructLayout(LayoutKind.Explicit, Size = 8)]
+                [StructLayout(LayoutKind.Explicit, Size = 16)]
                 public new partial struct Internal
                 {
                     [FieldOffset(0)]
@@ -2475,6 +2475,9 @@ namespace CppSharp
                     [FieldOffset(4)]
                     public byte IsDependent;
 
+                    [FieldOffset(8)]
+                    public global::System.IntPtr Desugared;
+
                     [SuppressUnmanagedCodeSecurity]
                     [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
                         EntryPoint="??0DependentNameType@AST@CppParser@CppSharp@@QEAA@XZ")]
@@ -2498,7 +2501,7 @@ namespace CppSharp
 
                 private static void* __CopyValue(DependentNameType.Internal native)
                 {
-                    var ret = Marshal.AllocHGlobal(8);
+                    var ret = Marshal.AllocHGlobal(16);
                     global::CppSharp.Parser.AST.DependentNameType.Internal.cctor_2(ret, new global::System.IntPtr(&native));
                     return ret.ToPointer();
                 }
@@ -2522,7 +2525,7 @@ namespace CppSharp
                 public DependentNameType()
                     : this((void*) null)
                 {
-                    __Instance = Marshal.AllocHGlobal(8);
+                    __Instance = Marshal.AllocHGlobal(16);
                     __ownsNativeInstance = true;
                     NativeToManagedMap[__Instance] = this;
                     Internal.ctor_0((__Instance + __PointerAdjustment));
@@ -2531,7 +2534,7 @@ namespace CppSharp
                 public DependentNameType(global::CppSharp.Parser.AST.DependentNameType _0)
                     : this((void*) null)
                 {
-                    __Instance = Marshal.AllocHGlobal(8);
+                    __Instance = Marshal.AllocHGlobal(16);
                     __ownsNativeInstance = true;
                     NativeToManagedMap[__Instance] = this;
                     if (ReferenceEquals(_0, null))
@@ -2539,6 +2542,24 @@ namespace CppSharp
                     var __arg0 = _0.__Instance;
                     Internal.cctor_2((__Instance + __PointerAdjustment), __arg0);
                 }
+
+                public global::CppSharp.Parser.AST.Type Desugared
+                {
+                    get
+                    {
+                        global::CppSharp.Parser.AST.Type __result0;
+                        if (((Internal*) __Instance)->Desugared == IntPtr.Zero) __result0 = null;
+                        else if (global::CppSharp.Parser.AST.Type.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->Desugared))
+                            __result0 = (global::CppSharp.Parser.AST.Type) global::CppSharp.Parser.AST.Type.NativeToManagedMap[((Internal*) __Instance)->Desugared];
+                        else __result0 = global::CppSharp.Parser.AST.Type.__CreateInstance(((Internal*) __Instance)->Desugared);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Desugared = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
             }
 
             public unsafe partial class PackExpansionType : global::CppSharp.Parser.AST.Type, IDisposable
diff --git a/src/CppParser/Parser.cpp b/src/CppParser/Parser.cpp
index 8a2f6b99..284414fd 100644
--- a/src/CppParser/Parser.cpp
+++ b/src/CppParser/Parser.cpp
@@ -2357,6 +2357,8 @@ Type* Parser::WalkType(clang::QualType QualType, clang::TypeLoc* TL,
     {
         auto DN = Type->getAs<clang::DependentNameType>();
         auto DNT = new DependentNameType();
+        if (DN->isSugared())
+            DNT->Desugared = WalkType(DN->desugar(), TL);
 
         Ty = DNT;
         break;
diff --git a/src/Generator/Generators/CLI/CLITypePrinter.cs b/src/Generator/Generators/CLI/CLITypePrinter.cs
index 1a7956bc..3a80ea14 100644
--- a/src/Generator/Generators/CLI/CLITypePrinter.cs
+++ b/src/Generator/Generators/CLI/CLITypePrinter.cs
@@ -304,7 +304,7 @@ namespace CppSharp.Generators.CLI
 
         public string VisitDependentNameType(DependentNameType dependent, TypeQualifiers quals)
         {
-            return string.Empty;
+            return dependent.Desugared != null ? dependent.Desugared.Visit(this) : string.Empty;
         }
 
         public string VisitPackExpansionType(PackExpansionType packExpansionType, TypeQualifiers quals)
diff --git a/src/Generator/Generators/CSharp/CSharpTypePrinter.cs b/src/Generator/Generators/CSharp/CSharpTypePrinter.cs
index 592289ea..dcf88132 100644
--- a/src/Generator/Generators/CSharp/CSharpTypePrinter.cs
+++ b/src/Generator/Generators/CSharp/CSharpTypePrinter.cs
@@ -461,7 +461,7 @@ namespace CppSharp.Generators.CSharp
         public CSharpTypePrinterResult VisitDependentNameType(DependentNameType dependent,
             TypeQualifiers quals)
         {
-            throw new NotImplementedException();
+            return dependent.Desugared != null ? dependent.Desugared.Visit(this) : string.Empty;
         }
 
         public CSharpTypePrinterResult VisitPackExpansionType(PackExpansionType type,
diff --git a/src/Generator/Types/CppTypePrinter.cs b/src/Generator/Types/CppTypePrinter.cs
index 630aabb9..fc44f250 100644
--- a/src/Generator/Types/CppTypePrinter.cs
+++ b/src/Generator/Types/CppTypePrinter.cs
@@ -187,7 +187,7 @@ namespace CppSharp.Types
 
         public string VisitDependentNameType(DependentNameType dependent, TypeQualifiers quals)
         {
-            return string.Empty;
+            return dependent.Desugared != null ? dependent.Desugared.Visit(this) : string.Empty;
         }
 
         public string VisitPackExpansionType(PackExpansionType packExpansionType, TypeQualifiers quals)