diff --git a/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java b/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java
index 87cd8a4..06ebf11 100644
--- a/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java
+++ b/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java
@@ -635,4 +635,44 @@
 			}
 		};
 	}
+	
+	protected IResourceStateAccessor getRefAccessor() {
+		return new IResourceStateAccessor() {
+			@Override
+			public Expression getCurrentStateAccessorFor(ChannelMember target, ChannelMember from) {
+				ResourcePath targetRes= target.getResource();
+				ResourcePath fromRes= from.getResource();
+				if (targetRes.equals(fromRes)) {
+					return new Field(fieldOfResourceState,
+							targetRes.getResourceStateType() != null ? targetRes.getResourceStateType()
+									: DataConstraintModel.typeInt);
+				}
+				// use the cached value as the current state
+				return new Parameter(targetRes.getResourceName(),
+						targetRes.getResourceStateType() != null ? targetRes.getResourceStateType()
+								: DataConstraintModel.typeInt);
+			}
+
+			@Override
+			public Expression getNextStateAccessorFor(ChannelMember target, ChannelMember from) {
+				ResourcePath targerRes= target.getResource();
+				return new Parameter(targerRes.getResourceName(),
+						targerRes.getResourceStateType() != null ? targerRes.getResourceStateType()
+								: DataConstraintModel.typeInt);
+			}
+
+			@Override
+			public Expression getDirectStateAccessorFor(ResourcePath targetRes, ResourcePath fromRes) {
+				if (fromRes != null && targetRes.equals(fromRes)) {
+					return new Field(fieldOfResourceState,
+							targetRes.getResourceStateType() != null ? targetRes.getResourceStateType()
+									: DataConstraintModel.typeInt);
+				}
+				// for reference channel member
+				return new Parameter(targetRes.getResourceName(),
+						targetRes.getResourceStateType() != null ? targetRes.getResourceStateType()
+								: DataConstraintModel.typeInt);
+			}
+		};
+	}
 }