diff --git a/component/core.py b/component/core.py
index 49b3c26827d6c3026d99f58b7a0209496e183923..2c1967f37aa6b0e025eba8e1d4e48e44fa4c9ad9 100644
--- a/component/core.py
+++ b/component/core.py
@@ -252,7 +252,8 @@ class AbstractComponent:
         if self.capacity is None:
             return []
         else:
-            return [(self.name + ".capacity", VariableKind.UNINDEXED)]
+            return [(self.name + ".capacity", VariableKind.UNINDEXED),(self.name + ".capital_cost", VariableKind.UNINDEXED)]
+
 
     # TODO make these functions into generator functions
     def non_state_base_variable_names(self):
@@ -264,6 +265,7 @@ class AbstractComponent:
 
     def add_design_variables(self, d_block):
         if self.capacity is not None:
+            d_block.add(self.name + ".capital_cost", pyo.Var())
             if isinstance(self.capacity, tuple):
                 d_block.add(self.name + ".capacity", pyo.Var(bounds=self.capacity))
             elif isinstance(self.capacity, (int, float)):
@@ -402,6 +404,13 @@ class AbstractComponent:
                 T_N = T
             f_b = self.factor_effort_maintenance_operation
             self_design_annuity = design_annuity(A_0, T, T_N, r, q, f_b)
+            if self.capacity is not None:
+                d_annuity = model.component_dict[self.name + ".capital_cost"]
+
+                def rule(m):
+                    return d_annuity == self_design_annuity
+
+                model.add(self.name + ".cost_design_annuity", pyo.Constraint(rule=rule))
 
         return self_design_annuity
 
@@ -417,6 +426,15 @@ class AbstractComponent:
             self_operational_annuity = 0.0
         else:
             self_operational_annuity = operational_annuity(T, r, q, A_V)
+            model.add(self.name + ".operation_cost", pyo.Var())
+            o_annuity = model.component_dict[self.name + ".operation_cost"]
+
+            def rule(m):
+
+                return o_annuity == self_operational_annuity / pyo.quicksum(model.step_size(t)
+                                                                            for t in model.T) * 365 * 24
+
+            model.add(self.name + ".cost_operation_annuity", pyo.Constraint(rule=rule))
 
         return self_operational_annuity
 
@@ -758,6 +776,7 @@ class BaseGrid(AbstractComponent):
         return [
             (self.name + ".input_1", VariableKind.INDEXED),
             (self.name + ".output_1", VariableKind.INDEXED),
+            (self.name + ".operation_cost", VariableKind.UNINDEXED),
         ]
 
     def add_non_state_variables(self, o_block):
@@ -767,6 +786,8 @@ class BaseGrid(AbstractComponent):
         output = pyo.Var(o_block.T, bounds=(0, None))
         o_block.add(self.name + ".output_1", output)
 
+
+
     def add_non_state_model(self, d_block, o_block):
         input = o_block.component_dict[self.name + ".input_1"]