diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6aed1071a8909a68dfbb625d6fcce1098581dc9d..68583486202354aae54304d7972bc5ea47bef48b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
   definition.
 - JSON schema validation can also be used in the DictElementConverter
 - YAMLFileConverter class; to parse YAML files
+- Variables can now be substituted within the definition of yaml macros
 
 ### Changed ###
 
@@ -30,6 +31,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 
 ### Deprecated ###
+
 - The DictXYElements are now depricated and are now synonyms for the
   XYElements.
 
diff --git a/src/caoscrawler/macros/macro_yaml_object.py b/src/caoscrawler/macros/macro_yaml_object.py
index 2849986e6deb5cb2cba9e45516e6ce8e1a93dfa0..c6b5de27d7f498d9b1db6b6a90d986487340a880 100644
--- a/src/caoscrawler/macros/macro_yaml_object.py
+++ b/src/caoscrawler/macros/macro_yaml_object.py
@@ -135,6 +135,7 @@ def macro_constructor(loader, node):
                             raise RuntimeError("params type not supported")
                     else:
                         raise RuntimeError("params type must not be None")
+                    params = substitute_dict(params, params)
                     definition = substitute_dict(macro.definition, params)
                     res.update(definition)
             else:
@@ -146,6 +147,7 @@ def macro_constructor(loader, node):
                         params.update(params_setter)
                     else:
                         raise RuntimeError("params type not supported")
+                params = substitute_dict(params, params)
                 definition = substitute_dict(macro.definition, params)
                 res.update(definition)
         else:
diff --git a/unittests/test_macros.py b/unittests/test_macros.py
index 4e27e42f8d1e633cf97fa142e2c0ec8aa013af05..b5ea5d84846f5f33853910c292132d7b5026600e 100644
--- a/unittests/test_macros.py
+++ b/unittests/test_macros.py
@@ -456,3 +456,60 @@ extroot: !macro
     assert cfood["extroot"]["default_name"]["a"] == "default_name"
     assert cfood["extroot"]["default_name"]["v"] == "default_name"
     assert cfood["extroot"]["default_name"]["macro_name"] == "default_name"
+
+
+def test_list_macro_application(register_macros, macro_store_reset):
+    dat = yaml.load("""
+defs:
+- !defmacro
+  name: test
+  params:
+    a: 2
+  definition:
+    expanded_$a:
+      param: $a
+- !defmacro
+  name: test2
+  params:
+    a: 2
+  definition:
+    expanded_${a}_test2:
+      param: $a
+
+testnode:
+  obl: !macro
+    test:
+    - a: 4
+    - a: 2
+    test2:
+      a: 4
+""", Loader=yaml.SafeLoader)
+    assert dat["testnode"]["obl"]["expanded_4"]["param"] == "4"
+    assert dat["testnode"]["obl"]["expanded_2"]["param"] == "2"
+    assert dat["testnode"]["obl"]["expanded_4_test2"]["param"] == "4"
+
+
+def test_variable_in_macro_definition(register_macros, macro_store_reset):
+    dat = yaml.load("""
+defs:
+- !defmacro
+  name: test
+  params:
+    a: 2
+    b: $a
+  definition:
+    expanded_$a:
+      param: $a
+      param_b: $b
+
+testnode:
+  obl: !macro
+    test:
+    - a: 4
+    - a: 2
+      b: 4
+""", Loader=yaml.SafeLoader)
+    assert dat["testnode"]["obl"]["expanded_4"]["param"] == "4"
+    assert dat["testnode"]["obl"]["expanded_4"]["param_b"] == "4"
+    assert dat["testnode"]["obl"]["expanded_2"]["param"] == "2"
+    assert dat["testnode"]["obl"]["expanded_2"]["param_b"] == "4"