diff --git a/src/rougail/annotator/variable.py b/src/rougail/annotator/variable.py
index 21e317d0..006eeb34 100644
--- a/src/rougail/annotator/variable.py
+++ b/src/rougail/annotator/variable.py
@@ -120,7 +120,11 @@ class VariableAnnotator: # pylint: disable=R0903
families.doc = families.name
families.path = families.name
for family in families.family.values():
- family.doc = family.name
+ if not hasattr(family, 'description'):
+ family.description = family.name
+ for key, value in RENAME_ATTIBUTES.items():
+ setattr(family, value, getattr(family, key))
+ setattr(family, key, None)
family.name = normalize_family(family.name)
if not hasattr(family, 'variable'):
continue
diff --git a/src/rougail/tiramisureflector.py b/src/rougail/tiramisureflector.py
index 0b9962e0..fd202672 100644
--- a/src/rougail/tiramisureflector.py
+++ b/src/rougail/tiramisureflector.py
@@ -299,7 +299,7 @@ class Variable(Common):
value = getattr(self.elt, key)
if key in FORCE_INFORMATIONS:
if key == 'test': # pragma: no cover
- value = value.split(',')
+ value = value.split('|')
if self.object_type == 'IntOption':
value = [int(v) for v in value]
elif self.object_type == 'FloatOption':
diff --git a/tests/dictionaries/01family_description/00-base.xml b/tests/dictionaries/01family_description/00-base.xml
new file mode 100644
index 00000000..6ecb2e8e
--- /dev/null
+++ b/tests/dictionaries/01family_description/00-base.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+ non
+
+
+
+
+
diff --git a/tests/dictionaries/01family_description/__init__.py b/tests/dictionaries/01family_description/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/tests/dictionaries/01family_description/makedict/base.json b/tests/dictionaries/01family_description/makedict/base.json
new file mode 100644
index 00000000..797595b0
--- /dev/null
+++ b/tests/dictionaries/01family_description/makedict/base.json
@@ -0,0 +1 @@
+{"rougail.general.mode_conteneur_actif": "non"}
diff --git a/tests/dictionaries/01family_description/tiramisu/__init__.py b/tests/dictionaries/01family_description/tiramisu/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/tests/dictionaries/01family_description/tiramisu/base.py b/tests/dictionaries/01family_description/tiramisu/base.py
new file mode 100644
index 00000000..2c10d346
--- /dev/null
+++ b/tests/dictionaries/01family_description/tiramisu/base.py
@@ -0,0 +1,18 @@
+from importlib.machinery import SourceFileLoader
+from importlib.util import spec_from_loader, module_from_spec
+loader = SourceFileLoader('func', 'tests/dictionaries/../eosfunc/test.py')
+spec = spec_from_loader(loader.name, loader)
+func = module_from_spec(spec)
+loader.exec_module(func)
+for key, value in dict(locals()).items():
+ if key != ['SourceFileLoader', 'func']:
+ setattr(func, key, value)
+try:
+ from tiramisu3 import *
+except:
+ from tiramisu import *
+from rougail.tiramisu import ConvertDynOptionDescription
+option_3 = StrOption(properties=frozenset({'mandatory', 'normal'}), name='mode_conteneur_actif', doc='mode_conteneur_actif', multi=False, default='non')
+option_2 = OptionDescription(name='general', doc='Other description', properties=frozenset({'normal'}), children=[option_3])
+option_1 = OptionDescription(name='rougail', doc='rougail', children=[option_2])
+option_0 = OptionDescription(name='baseoption', doc='baseoption', children=[option_1])
diff --git a/tests/dictionaries/20family_dynamic_description/00-base.xml b/tests/dictionaries/20family_dynamic_description/00-base.xml
new file mode 100644
index 00000000..5d234aa0
--- /dev/null
+++ b/tests/dictionaries/20family_dynamic_description/00-base.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+ val1
+ val2
+
+
+
+
+
+
+
diff --git a/tests/dictionaries/20family_dynamic_description/__init__.py b/tests/dictionaries/20family_dynamic_description/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/tests/dictionaries/20family_dynamic_description/makedict/base.json b/tests/dictionaries/20family_dynamic_description/makedict/base.json
new file mode 100644
index 00000000..64024485
--- /dev/null
+++ b/tests/dictionaries/20family_dynamic_description/makedict/base.json
@@ -0,0 +1 @@
+{"rougail.general.varname": ["val1", "val2"], "rougail.dynval1.vardynval1": null, "rougail.dynval2.vardynval2": null}
diff --git a/tests/dictionaries/20family_dynamic_description/tiramisu/__init__.py b/tests/dictionaries/20family_dynamic_description/tiramisu/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/tests/dictionaries/20family_dynamic_description/tiramisu/base.py b/tests/dictionaries/20family_dynamic_description/tiramisu/base.py
new file mode 100644
index 00000000..73fa3ba2
--- /dev/null
+++ b/tests/dictionaries/20family_dynamic_description/tiramisu/base.py
@@ -0,0 +1,20 @@
+from importlib.machinery import SourceFileLoader
+from importlib.util import spec_from_loader, module_from_spec
+loader = SourceFileLoader('func', 'tests/dictionaries/../eosfunc/test.py')
+spec = spec_from_loader(loader.name, loader)
+func = module_from_spec(spec)
+loader.exec_module(func)
+for key, value in dict(locals()).items():
+ if key != ['SourceFileLoader', 'func']:
+ setattr(func, key, value)
+try:
+ from tiramisu3 import *
+except:
+ from tiramisu import *
+from rougail.tiramisu import ConvertDynOptionDescription
+option_3 = StrOption(properties=frozenset({'mandatory', 'normal'}), name='varname', doc='No change', multi=True, default=['val1', 'val2'], default_multi='val2')
+option_2 = OptionDescription(name='general', doc='general', properties=frozenset({'normal'}), children=[option_3])
+option_5 = StrOption(properties=frozenset({'normal'}), name='vardyn', doc='No change', multi=False)
+option_4 = ConvertDynOptionDescription(name='dyn', doc='Dyn ', suffixes=Calculation(func.calc_value, Params((ParamOption(option_3)))), properties=frozenset({'normal'}), children=[option_5])
+option_1 = OptionDescription(name='rougail', doc='rougail', children=[option_2, option_4])
+option_0 = OptionDescription(name='baseoption', doc='baseoption', children=[option_1])