diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index f1b6f82..b75e842 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -5778,23 +5778,39 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 
 	public void store_property (Property prop, Expression? instance, TargetValue value) {
 		if (instance is BaseAccess) {
+			var base_prop = prop;
 			if (prop.base_property != null) {
-				var base_class = (Class) prop.base_property.parent_symbol;
+				base_prop = prop.base_property;
+			} else if (prop.base_interface_property != null) {
+				base_prop = prop.base_interface_property;
+			}
+			if (base_prop.parent_symbol is Class) {
+				var base_class = (Class) base_prop.parent_symbol;
 				var vcast = new CCodeFunctionCall (new CCodeIdentifier ("%s_CLASS".printf (get_ccode_upper_case_name (base_class, null))));
 				vcast.add_argument (new CCodeIdentifier ("%s_parent_class".printf (get_ccode_lower_case_name (current_class, null))));
-				
+
 				var ccall = new CCodeFunctionCall (new CCodeMemberAccess.pointer (vcast, "set_%s".printf (prop.name)));
 				ccall.add_argument ((CCodeExpression) get_ccodenode (instance));
-				ccall.add_argument (get_cvalue_ (value));
+				var cexpr = get_cvalue_ (value);
+
+				if (prop.property_type.is_real_non_null_struct_type ()) {
+					cexpr = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, cexpr);
+				}
+				ccall.add_argument (cexpr);
 
 				ccode.add_expression (ccall);
-			} else if (prop.base_interface_property != null) {
-				var base_iface = (Interface) prop.base_interface_property.parent_symbol;
+			} else if (base_prop.parent_symbol is Interface) {
+				var base_iface = (Interface) base_prop.parent_symbol;
 				string parent_iface_var = "%s_%s_parent_iface".printf (get_ccode_lower_case_name (current_class), get_ccode_lower_case_name (base_iface));
 
 				var ccall = new CCodeFunctionCall (new CCodeMemberAccess.pointer (new CCodeIdentifier (parent_iface_var), "set_%s".printf (prop.name)));
 				ccall.add_argument ((CCodeExpression) get_ccodenode (instance));
-				ccall.add_argument (get_cvalue_ (value));
+				var cexpr = get_cvalue_ (value);
+
+				if (prop.property_type.is_real_non_null_struct_type ()) {
+					cexpr = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, cexpr);
+				}
+				ccall.add_argument (cexpr);
 
 				ccode.add_expression (ccall);
 			}
diff --git a/codegen/valaccodememberaccessmodule.vala b/codegen/valaccodememberaccessmodule.vala
index afe8104..df5b26d 100644
--- a/codegen/valaccodememberaccessmodule.vala
+++ b/codegen/valaccodememberaccessmodule.vala
@@ -179,17 +179,35 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
 					var base_class = (Class) base_prop.parent_symbol;
 					var vcast = new CCodeFunctionCall (new CCodeIdentifier ("%s_CLASS".printf (get_ccode_upper_case_name (base_class, null))));
 					vcast.add_argument (new CCodeIdentifier ("%s_parent_class".printf (get_ccode_lower_case_name (current_class, null))));
-					
+
 					var ccall = new CCodeFunctionCall (new CCodeMemberAccess.pointer (vcast, "get_%s".printf (prop.name)));
 					ccall.add_argument (get_cvalue (expr.inner));
-					set_cvalue (expr, ccall);
+
+					if (prop.property_type.is_real_non_null_struct_type ()) {
+						var temp_value = (GLibValue) create_temp_value (prop.get_accessor.value_type, false, expr);
+						expr.target_value = load_temp_value (temp_value);
+						var ctemp = get_cvalue_ (temp_value);
+						ccall.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, ctemp));
+						ccode.add_expression (ccall);
+					} else {
+						set_cvalue (expr, ccall);
+					}
 				} else if (base_prop.parent_symbol is Interface) {
 					var base_iface = (Interface) base_prop.parent_symbol;
 					string parent_iface_var = "%s_%s_parent_iface".printf (get_ccode_lower_case_name (current_class), get_ccode_lower_case_name (base_iface));
 
 					var ccall = new CCodeFunctionCall (new CCodeMemberAccess.pointer (new CCodeIdentifier (parent_iface_var), "get_%s".printf (prop.name)));
 					ccall.add_argument (get_cvalue (expr.inner));
-					set_cvalue (expr, ccall);
+
+					if (prop.property_type.is_real_non_null_struct_type ()) {
+						var temp_value = (GLibValue) create_temp_value (prop.get_accessor.value_type, false, expr);
+						expr.target_value = load_temp_value (temp_value);
+						var ctemp = get_cvalue_ (temp_value);
+						ccall.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, ctemp));
+						ccode.add_expression (ccall);
+					} else {
+						set_cvalue (expr, ccall);
+					}
 				}
 			} else if (prop.binding == MemberBinding.INSTANCE &&
 			    prop.get_accessor.automatic_body &&
-- 
1.9.1
