diff --git a/gobject/valaccodememberaccessmodule.vala b/gobject/valaccodememberaccessmodule.vala
index b061106..488d545 100644
--- a/gobject/valaccodememberaccessmodule.vala
+++ b/gobject/valaccodememberaccessmodule.vala
@@ -34,7 +34,7 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
 
 		CCodeExpression pub_inst = null;
 		DataType base_type = null;
-	
+
 		if (expr.inner != null) {
 			pub_inst = (CCodeExpression) expr.inner.ccodenode;
 
@@ -107,6 +107,19 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
 				}
 				if (instance_target_type.data_type.is_reference_type () || (expr.inner != null && expr.inner.value_type is PointerType)) {
 					expr.ccodenode = new CCodeMemberAccess.pointer (inst, f.get_cname ());
+				} else if (st != null && base_type is StructValueType && !(f in ((Struct)(base_type.data_type)).get_fields ())) {
+					// recurse through the parents of a struct to access the desired field
+					var parent_struct = ((Struct) base_type.data_type).base_struct;
+					var parent_struct_access = new CCodeMemberAccess (inst, "parent_struct");
+
+					while (parent_struct != null) {
+						if (f in parent_struct.get_fields ()) {
+							expr.ccodenode = new CCodeMemberAccess (parent_struct_access, f.get_cname ());
+							break;
+						}
+						parent_struct = parent_struct.base_struct;
+						parent_struct_access = new CCodeMemberAccess (parent_struct_access, "parent_struct");
+					}
 				} else {
 					expr.ccodenode = new CCodeMemberAccess (inst, f.get_cname ());
 				}
diff --git a/vala/valastruct.vala b/vala/valastruct.vala
index 62bb249..55a7e22 100644
--- a/vala/valastruct.vala
+++ b/vala/valastruct.vala
@@ -52,6 +52,18 @@ public class Vala.Struct : TypeSymbol {
 	private string destroy_function;
 
 	/**
+	 * Specifies the resolved base struct.
+	 */
+	 public Struct? base_struct {
+		get {
+			if (base_type != null && base_type.data_type is Struct) {
+				return (Struct) base_type.data_type;
+			}
+			return null;
+		}
+	}
+
+	/**
 	 * Specifies the default construction method.
 	 */
 	public Method default_construction_method { get; set; }
