Repository: hed-standard/hed-python (language: python)

Issue:
Fixed tests after environment problem.



Discussion / hints:

Fix patch:
diff --git a/README.md b/README.md
index 81e463a90..0172040a5 100644
--- a/README.md
+++ b/README.md
@@ -64,6 +64,12 @@ The [Github pull request](https://github.com/hed-standard/hed-python/pulls)
 may also be used for contributions.
 Usually these updates should be made to the `develop` branch, not the `master`.
 
+#### Local Settings Storage
+Cached Schemas by default are stored in "home/.hedtools/" 
+Location of "home" directory varies by OS.
+
+Use hed.schema.set_cache_directory to change the location.
+The HED cache can be shared across processes.
 
 ### Other links of interest
 
diff --git a/docs/requirements.txt b/docs/requirements.txt
index a0ce8b42a..4f3e034f8 100644
--- a/docs/requirements.txt
+++ b/docs/requirements.txt
@@ -1,29 +1,29 @@
-click==8.1.3
+click>=8.1.3
 coverage>=6.3.2
-defusedxml==0.7.1
-et-xmlfile==1.1.0
-Flask==2.1.2
-Flask-WTF==1.0.1
+defusedxml>=0.7.1
+et-xmlfile>=1.1.0
+Flask>=2.1.2
+Flask-WTF>=1.0.1
 inflect>=5.5.2
-itsdangerous==2.1.2
-jdcal==1.4.1
+itsdangerous>=2.1.2
+jdcal>=1.4.1
 Jinja2>=3.0.0
-jupyter==1.0.0
-MarkupSafe==2.1.1
+jupyter>=1.0.0
+MarkupSafe>=2.1.1
 numpy>=1.20.3
-numpydoc==1.3.1
+numpydoc>=1.3.1
 openpyxl>=3.0.9
 pandas>=1.3.5
-portalocker==2.4.0
-python-dateutil==2.8.2
-pytz==2022.1
-Pygments==2.12.0
+portalocker>=2.4.0
+python-dateutil>=2.8.2
+pytz>=2022.1
+Pygments>=2.12.0
 semantic_version>=2.9.0
-six==1.16.0
+six>=1.16.0
 Sphinx>=4,<5
-SphinxExtensions==0.2.0
-sphinx_rtd_theme==1.0.0
-Werkzeug==2.1.2
-WTForms==3.0.1
-xlrd==2.0.1
+SphinxExtensions>=0.2.0
+sphinx_rtd_theme>=1.0.0
+Werkzeug>=2.1.2
+WTForms>=3.0.1
+xlrd>=2.0.1
 myst-parser>=0.17.2
diff --git a/docs/source/api.rst b/docs/source/api.rst
index 2da7cc193..4c3417a11 100644
--- a/docs/source/api.rst
+++ b/docs/source/api.rst
@@ -27,7 +27,6 @@ HED models
    hed.models.Sidecar
    hed.models.SpreadsheetInput
    hed.models.TabularInput
-   hed.models.hed_ops
 
 .. currentmodule:: hed
 
@@ -55,30 +54,37 @@ HED schema handling
 
 .. currentmodule:: hed
 
+.. _calibration_ref2:
+
 HED tools
 ---------
 
 .. autosummary:: hed.tools
    :toctree: generated/
 
-   hed.tools.BidsDataset
-   hed.tools.BidsDatasetSummary
-   hed.tools.BidsFile
-   hed.tools.BidsFileDictionary
-   hed.tools.BidsFileGroup
-   hed.tools.BidsSidecarFile
-   hed.tools.BidsTabularDictionary
-   hed.tools.BidsTabularFile
-   hed.tools.BidsTabularSummary
-
-   hed.tools.FileDictionary
-   hed.tools.KeyMap
-   hed.tools.TagSummary
+   hed.tools.bids.bids_dataset.BidsDataset
+   hed.tools.bids.bids_dataset_summary.BidsDatasetSummary
+   hed.tools.bids.bids_file.BidsFile
+   hed.tools.bids.bids_file_dictionary.BidsFileDictionary
+   hed.tools.bids.bids_file_group.BidsFileGroup
+   hed.tools.bids.bids_sidecar_file.BidsSidecarFile
+   hed.tools.bids.bids_tabular_dictionary.BidsTabularDictionary
+   hed.tools.bids.bids_tabular_file.BidsTabularFile
+   hed.tools.bids.bids_tabular_summary.BidsTabularSummary
+   hed.tools.analysis.definition_manager.DefinitionManager
+   hed.tools.analysis.file_dictionary.FileDictionary
+   hed.tools.analysis.key_map.KeyMap
+   hed.tools.analysis.context_manager.ContextManager
+   hed.tools.analysis.tag_summary.TagSummary
+   hed.tools.analysis.hed_type_factors.HedTypeFactors
+   hed.tools.analysis.hed_type_variable.HedTypeVariable
+   hed.tools.analysis.hed_variable_manager.HedVariableManager
+   hed.tools.analysis.hed_variable_summary.HedVariableCounts
+   hed.tools.analysis.hed_variable_summary.HedVariableSummary
    hed.tools.analysis.analysis_util
    hed.tools.analysis.annotation_util
    hed.tools.analysis.summary_util
-
-   hed.tools.HedLogger
+   hed.tools.hed_logger.HedLogger
 
 .. currentmodule:: hed
 
diff --git a/docs/source/generated/hed.models.BaseInput.rst b/docs/source/generated/hed.models.BaseInput.rst
index 41ba344d2..c96fb3894 100644
--- a/docs/source/generated/hed.models.BaseInput.rst
+++ b/docs/source/generated/hed.models.BaseInput.rst
@@ -17,6 +17,7 @@
       ~BaseInput.convert_to_short
       ~BaseInput.extract_definitions
       ~BaseInput.get_def_and_mapper_issues
+      ~BaseInput.get_definitions
       ~BaseInput.get_worksheet
       ~BaseInput.iter_dataframe
       ~BaseInput.reset_mapper
diff --git a/docs/source/generated/hed.models.ColumnMapper.rst b/docs/source/generated/hed.models.ColumnMapper.rst
index 7df5efdbd..c1514dd32 100644
--- a/docs/source/generated/hed.models.ColumnMapper.rst
+++ b/docs/source/generated/hed.models.ColumnMapper.rst
@@ -23,6 +23,7 @@
       ~ColumnMapper.set_column_prefix_dict
       ~ColumnMapper.set_requested_columns
       ~ColumnMapper.set_tag_columns
+      ~ColumnMapper.validate_column_map
    
    
 
diff --git a/docs/source/generated/hed.models.SpreadsheetInput.rst b/docs/source/generated/hed.models.SpreadsheetInput.rst
index f7fe2c5e5..0af244f26 100644
--- a/docs/source/generated/hed.models.SpreadsheetInput.rst
+++ b/docs/source/generated/hed.models.SpreadsheetInput.rst
@@ -17,6 +17,7 @@
       ~SpreadsheetInput.convert_to_short
       ~SpreadsheetInput.extract_definitions
       ~SpreadsheetInput.get_def_and_mapper_issues
+      ~SpreadsheetInput.get_definitions
       ~SpreadsheetInput.get_worksheet
       ~SpreadsheetInput.iter_dataframe
       ~SpreadsheetInput.reset_mapper
diff --git a/docs/source/generated/hed.models.TabularInput.rst b/docs/source/generated/hed.models.TabularInput.rst
index 85a00da97..cf10d6fe0 100644
--- a/docs/source/generated/hed.models.TabularInput.rst
+++ b/docs/source/generated/hed.models.TabularInput.rst
@@ -18,6 +18,7 @@
       ~TabularInput.create_def_mapper
       ~TabularInput.extract_definitions
       ~TabularInput.get_def_and_mapper_issues
+      ~TabularInput.get_definitions
       ~TabularInput.get_worksheet
       ~TabularInput.iter_dataframe
       ~TabularInput.reset_column_mapper
@@ -27,7 +28,7 @@
       ~TabularInput.to_excel
       ~TabularInput.update_definition_mapper
       ~TabularInput.validate_file
-      ~TabularInput.validate_file_sidecars
+      ~TabularInput.validate_sidecar
    
    
 
diff --git a/docs/source/generated/hed.models.hed_ops.rst b/docs/source/generated/hed.models.hed_ops.rst
deleted file mode 100644
index 3990dd90d..000000000
--- a/docs/source/generated/hed.models.hed_ops.rst
+++ /dev/null
@@ -1,38 +0,0 @@
-﻿hed.models.hed\_ops
-===================
-
-.. automodule:: hed.models.hed_ops
-
-   
-   
-   
-
-   
-   
-   .. rubric:: Functions
-
-   .. autosummary::
-   
-      apply_ops
-      hed_string_iter
-      set_hed_string
-      translate_ops
-   
-   
-
-   
-   
-   .. rubric:: Classes
-
-   .. autosummary::
-   
-      HedOps
-   
-   
-
-   
-   
-   
-
-
-
diff --git a/docs/source/generated/hed.models.rst b/docs/source/generated/hed.models.rst
index b30c573f6..28e0ebf6b 100644
--- a/docs/source/generated/hed.models.rst
+++ b/docs/source/generated/hed.models.rst
@@ -116,6 +116,14 @@ hed.models.onset\_mapper module
    :undoc-members:
    :show-inheritance:
 
+hed.models.onset\_mapper\_hedops module
+---------------------------------------
+
+.. automodule:: hed.models.onset_mapper_hedops
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
 hed.models.sidecar module
 -------------------------
 
@@ -148,6 +156,14 @@ hed.models.tabular\_input module
    :undoc-members:
    :show-inheritance:
 
+hed.models.tabular\_input\_temp module
+--------------------------------------
+
+.. automodule:: hed.models.tabular_input_temp
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
 hed.models.timeseries\_input module
 -----------------------------------
 
diff --git a/docs/source/generated/hed.tools.BidsDataset.rst b/docs/source/generated/hed.tools.BidsDataset.rst
deleted file mode 100644
index 73209a5c3..000000000
--- a/docs/source/generated/hed.tools.BidsDataset.rst
+++ /dev/null
@@ -1,31 +0,0 @@
-﻿hed.tools.BidsDataset
-=====================
-
-.. currentmodule:: hed.tools
-
-.. autoclass:: hed.tools.BidsDataset
-   
-   .. automethod:: __init__
-
-   
-   .. rubric:: Methods
-
-   .. autosummary::
-   
-      ~BidsDataset.__init__
-      ~BidsDataset.get_schema_versions
-      ~BidsDataset.get_summary
-      ~BidsDataset.get_tabular_group
-      ~BidsDataset.validate
-   
-   
-
-   
-   
-   
-
-.. autoclass:: hed.tools.BidsDataset
-   :members:
-   :undoc-members:
-   :show-inheritance:
-   :inherited-members:
\ No newline at end of file
diff --git a/docs/source/generated/hed.tools.BidsDatasetSummary.rst b/docs/source/generated/hed.tools.BidsDatasetSummary.rst
deleted file mode 100644
index a8fa7beb5..000000000
--- a/docs/source/generated/hed.tools.BidsDatasetSummary.rst
+++ /dev/null
@@ -1,27 +0,0 @@
-﻿hed.tools.BidsDatasetSummary
-============================
-
-.. currentmodule:: hed.tools
-
-.. autoclass:: hed.tools.BidsDatasetSummary
-   
-   .. automethod:: __init__
-
-   
-   .. rubric:: Methods
-
-   .. autosummary::
-   
-      ~BidsDatasetSummary.__init__
-   
-   
-
-   
-   
-   
-
-.. autoclass:: hed.tools.BidsDatasetSummary
-   :members:
-   :undoc-members:
-   :show-inheritance:
-   :inherited-members:
\ No newline at end of file
diff --git a/docs/source/generated/hed.tools.BidsFile.rst b/docs/source/generated/hed.tools.BidsFile.rst
deleted file mode 100644
index 58df83089..000000000
--- a/docs/source/generated/hed.tools.BidsFile.rst
+++ /dev/null
@@ -1,36 +0,0 @@
-﻿hed.tools.BidsFile
-==================
-
-.. currentmodule:: hed.tools
-
-.. autoclass:: hed.tools.BidsFile
-   
-   .. automethod:: __init__
-
-   
-   .. rubric:: Methods
-
-   .. autosummary::
-   
-      ~BidsFile.__init__
-      ~BidsFile.clear_contents
-      ~BidsFile.get_key
-      ~BidsFile.set_contents
-   
-   
-
-   
-   
-   .. rubric:: Attributes
-
-   .. autosummary::
-   
-      ~BidsFile.get_contents
-   
-   
-
-.. autoclass:: hed.tools.BidsFile
-   :members:
-   :undoc-members:
-   :show-inheritance:
-   :inherited-members:
\ No newline at end of file
diff --git a/docs/source/generated/hed.tools.BidsFileDictionary.rst b/docs/source/generated/hed.tools.BidsFileDictionary.rst
deleted file mode 100644
index d91ecb614..000000000
--- a/docs/source/generated/hed.tools.BidsFileDictionary.rst
+++ /dev/null
@@ -1,48 +0,0 @@
-﻿hed.tools.BidsFileDictionary
-============================
-
-.. currentmodule:: hed.tools
-
-.. autoclass:: hed.tools.BidsFileDictionary
-   
-   .. automethod:: __init__
-
-   
-   .. rubric:: Methods
-
-   .. autosummary::
-   
-      ~BidsFileDictionary.__init__
-      ~BidsFileDictionary.correct_file
-      ~BidsFileDictionary.create_file_dict
-      ~BidsFileDictionary.get_file_path
-      ~BidsFileDictionary.get_new_dict
-      ~BidsFileDictionary.iter_files
-      ~BidsFileDictionary.key_diffs
-      ~BidsFileDictionary.make_dict
-      ~BidsFileDictionary.make_file_dict
-      ~BidsFileDictionary.make_key
-      ~BidsFileDictionary.make_query
-      ~BidsFileDictionary.match_query
-      ~BidsFileDictionary.output_files
-      ~BidsFileDictionary.split_by_entity
-   
-   
-
-   
-   
-   .. rubric:: Attributes
-
-   .. autosummary::
-   
-      ~BidsFileDictionary.file_list
-      ~BidsFileDictionary.key_list
-      ~BidsFileDictionary.name
-   
-   
-
-.. autoclass:: hed.tools.BidsFileDictionary
-   :members:
-   :undoc-members:
-   :show-inheritance:
-   :inherited-members:
\ No newline at end of file
diff --git a/docs/source/generated/hed.tools.BidsFileGroup.rst b/docs/source/generated/hed.tools.BidsFileGroup.rst
deleted file mode 100644
index eef41b1cd..000000000
--- a/docs/source/generated/hed.tools.BidsFileGroup.rst
+++ /dev/null
@@ -1,31 +0,0 @@
-﻿hed.tools.BidsFileGroup
-=======================
-
-.. currentmodule:: hed.tools
-
-.. autoclass:: hed.tools.BidsFileGroup
-   
-   .. automethod:: __init__
-
-   
-   .. rubric:: Methods
-
-   .. autosummary::
-   
-      ~BidsFileGroup.__init__
-      ~BidsFileGroup.get_sidecars_from_path
-      ~BidsFileGroup.summarize
-      ~BidsFileGroup.validate_datafiles
-      ~BidsFileGroup.validate_sidecars
-   
-   
-
-   
-   
-   
-
-.. autoclass:: hed.tools.BidsFileGroup
-   :members:
-   :undoc-members:
-   :show-inheritance:
-   :inherited-members:
\ No newline at end of file
diff --git a/docs/source/generated/hed.tools.BidsSidecarFile.rst b/docs/source/generated/hed.tools.BidsSidecarFile.rst
deleted file mode 100644
index b00c0eaeb..000000000
--- a/docs/source/generated/hed.tools.BidsSidecarFile.rst
+++ /dev/null
@@ -1,38 +0,0 @@
-﻿hed.tools.BidsSidecarFile
-=========================
-
-.. currentmodule:: hed.tools
-
-.. autoclass:: hed.tools.BidsSidecarFile
-   
-   .. automethod:: __init__
-
-   
-   .. rubric:: Methods
-
-   .. autosummary::
-   
-      ~BidsSidecarFile.__init__
-      ~BidsSidecarFile.clear_contents
-      ~BidsSidecarFile.get_key
-      ~BidsSidecarFile.is_hed
-      ~BidsSidecarFile.is_sidecar_for
-      ~BidsSidecarFile.set_contents
-   
-   
-
-   
-   
-   .. rubric:: Attributes
-
-   .. autosummary::
-   
-      ~BidsSidecarFile.get_contents
-   
-   
-
-.. autoclass:: hed.tools.BidsSidecarFile
-   :members:
-   :undoc-members:
-   :show-inheritance:
-   :inherited-members:
\ No newline at end of file
diff --git a/docs/source/generated/hed.tools.BidsTabularDictionary.rst b/docs/source/generated/hed.tools.BidsTabularDictionary.rst
deleted file mode 100644
index 31ff62df5..000000000
--- a/docs/source/generated/hed.tools.BidsTabularDictionary.rst
+++ /dev/null
@@ -1,51 +0,0 @@
-﻿hed.tools.BidsTabularDictionary
-===============================
-
-.. currentmodule:: hed.tools
-
-.. autoclass:: hed.tools.BidsTabularDictionary
-   
-   .. automethod:: __init__
-
-   
-   .. rubric:: Methods
-
-   .. autosummary::
-   
-      ~BidsTabularDictionary.__init__
-      ~BidsTabularDictionary.correct_file
-      ~BidsTabularDictionary.count_diffs
-      ~BidsTabularDictionary.create_file_dict
-      ~BidsTabularDictionary.get_file_path
-      ~BidsTabularDictionary.get_info
-      ~BidsTabularDictionary.get_new_dict
-      ~BidsTabularDictionary.iter_files
-      ~BidsTabularDictionary.key_diffs
-      ~BidsTabularDictionary.make_dict
-      ~BidsTabularDictionary.make_file_dict
-      ~BidsTabularDictionary.make_key
-      ~BidsTabularDictionary.make_new
-      ~BidsTabularDictionary.make_query
-      ~BidsTabularDictionary.match_query
-      ~BidsTabularDictionary.output_files
-      ~BidsTabularDictionary.split_by_entity
-   
-   
-
-   
-   
-   .. rubric:: Attributes
-
-   .. autosummary::
-   
-      ~BidsTabularDictionary.file_list
-      ~BidsTabularDictionary.key_list
-      ~BidsTabularDictionary.name
-   
-   
-
-.. autoclass:: hed.tools.BidsTabularDictionary
-   :members:
-   :undoc-members:
-   :show-inheritance:
-   :inherited-members:
\ No newline at end of file
diff --git a/docs/source/generated/hed.tools.BidsTabularFile.rst b/docs/source/generated/hed.tools.BidsTabularFile.rst
deleted file mode 100644
index d60fb995e..000000000
--- a/docs/source/generated/hed.tools.BidsTabularFile.rst
+++ /dev/null
@@ -1,36 +0,0 @@
-﻿hed.tools.BidsTabularFile
-=========================
-
-.. currentmodule:: hed.tools
-
-.. autoclass:: hed.tools.BidsTabularFile
-   
-   .. automethod:: __init__
-
-   
-   .. rubric:: Methods
-
-   .. autosummary::
-   
-      ~BidsTabularFile.__init__
-      ~BidsTabularFile.clear_contents
-      ~BidsTabularFile.get_key
-      ~BidsTabularFile.set_contents
-   
-   
-
-   
-   
-   .. rubric:: Attributes
-
-   .. autosummary::
-   
-      ~BidsTabularFile.get_contents
-   
-   
-
-.. autoclass:: hed.tools.BidsTabularFile
-   :members:
-   :undoc-members:
-   :show-inheritance:
-   :inherited-members:
\ No newline at end of file
diff --git a/docs/source/generated/hed.tools.BidsTabularSummary.rst b/docs/source/generated/hed.tools.BidsTabularSummary.rst
deleted file mode 100644
index 0df30168c..000000000
--- a/docs/source/generated/hed.tools.BidsTabularSummary.rst
+++ /dev/null
@@ -1,33 +0,0 @@
-﻿hed.tools.BidsTabularSummary
-============================
-
-.. currentmodule:: hed.tools
-
-.. autoclass:: hed.tools.BidsTabularSummary
-   
-   .. automethod:: __init__
-
-   
-   .. rubric:: Methods
-
-   .. autosummary::
-   
-      ~BidsTabularSummary.__init__
-      ~BidsTabularSummary.extract_sidecar_template
-      ~BidsTabularSummary.get_columns_info
-      ~BidsTabularSummary.get_number_unique
-      ~BidsTabularSummary.make_combined_dicts
-      ~BidsTabularSummary.update
-      ~BidsTabularSummary.update_summary
-   
-   
-
-   
-   
-   
-
-.. autoclass:: hed.tools.BidsTabularSummary
-   :members:
-   :undoc-members:
-   :show-inheritance:
-   :inherited-members:
\ No newline at end of file
diff --git a/docs/source/generated/hed.tools.HedLogger.rst b/docs/source/generated/hed.tools.HedLogger.rst
deleted file mode 100644
index 1c4452628..000000000
--- a/docs/source/generated/hed.tools.HedLogger.rst
+++ /dev/null
@@ -1,34 +0,0 @@
-﻿hed.tools.HedLogger
-===================
-
-.. currentmodule:: hed.tools
-
-.. autoclass:: hed.tools.HedLogger
-   
-   .. automethod:: __init__
-
-   
-   .. rubric:: Methods
-
-   .. autosummary::
-   
-      ~HedLogger.__init__
-      ~HedLogger.add
-      ~HedLogger.get_log
-      ~HedLogger.get_log_keys
-      ~HedLogger.get_log_string
-      ~HedLogger.load_log
-      ~HedLogger.print_log
-      ~HedLogger.save_log
-   
-   
-
-   
-   
-   
-
-.. autoclass:: hed.tools.HedLogger
-   :members:
-   :undoc-members:
-   :show-inheritance:
-   :inherited-members:
\ No newline at end of file
diff --git a/docs/source/generated/hed.tools.TagSummary.rst b/docs/source/generated/hed.tools.TagSummary.rst
deleted file mode 100644
index 386351ec2..000000000
--- a/docs/source/generated/hed.tools.TagSummary.rst
+++ /dev/null
@@ -1,29 +0,0 @@
-﻿hed.tools.TagSummary
-====================
-
-.. currentmodule:: hed.tools
-
-.. autoclass:: hed.tools.TagSummary
-   
-   .. automethod:: __init__
-
-   
-   .. rubric:: Methods
-
-   .. autosummary::
-   
-      ~TagSummary.__init__
-      ~TagSummary.extract_summary_info
-      ~TagSummary.get_design_matrices
-   
-   
-
-   
-   
-   
-
-.. autoclass:: hed.tools.TagSummary
-   :members:
-   :undoc-members:
-   :show-inheritance:
-   :inherited-members:
\ No newline at end of file
diff --git a/docs/source/generated/hed.tools.analysis.definition_manager.DefinitionManager.rst b/docs/source/generated/hed.tools.analysis.definition_manager.DefinitionManager.rst
new file mode 100644
index 000000000..55f605880
--- /dev/null
+++ b/docs/source/generated/hed.tools.analysis.definition_manager.DefinitionManager.rst
@@ -0,0 +1,32 @@
+﻿hed.tools.analysis.definition\_manager.DefinitionManager
+========================================================
+
+.. currentmodule:: hed.tools.analysis.definition_manager
+
+.. autoclass:: hed.tools.analysis.definition_manager.DefinitionManager
+   
+   .. automethod:: __init__
+
+   
+   .. rubric:: Methods
+
+   .. autosummary::
+   
+      ~DefinitionManager.__init__
+      ~DefinitionManager.extract_defs
+      ~DefinitionManager.get_def_names
+      ~DefinitionManager.get_vars
+      ~DefinitionManager.remove_defs
+      ~DefinitionManager.split_name
+   
+   
+
+   
+   
+   
+
+.. autoclass:: hed.tools.analysis.definition_manager.DefinitionManager
+   :members:
+   :undoc-members:
+   :show-inheritance:
+   :inherited-members:
\ No newline at end of file
diff --git a/docs/source/generated/hed.tools.FileDictionary.rst b/docs/source/generated/hed.tools.analysis.file_dictionary.FileDictionary.rst
similarity index 64%
rename from docs/source/generated/hed.tools.FileDictionary.rst
rename to docs/source/generated/hed.tools.analysis.file_dictionary.FileDictionary.rst
index 4913e3ded..4f686a92a 100644
--- a/docs/source/generated/hed.tools.FileDictionary.rst
+++ b/docs/source/generated/hed.tools.analysis.file_dictionary.FileDictionary.rst
@@ -1,9 +1,9 @@
-﻿hed.tools.FileDictionary
-========================
+﻿hed.tools.analysis.file\_dictionary.FileDictionary
+==================================================
 
-.. currentmodule:: hed.tools
+.. currentmodule:: hed.tools.analysis.file_dictionary
 
-.. autoclass:: hed.tools.FileDictionary
+.. autoclass:: hed.tools.analysis.file_dictionary.FileDictionary
    
    .. automethod:: __init__
 
@@ -35,7 +35,7 @@
    
    
 
-.. autoclass:: hed.tools.FileDictionary
+.. autoclass:: hed.tools.analysis.file_dictionary.FileDictionary
    :members:
    :undoc-members:
    :show-inheritance:
diff --git a/docs/source/generated/hed.tools.analysis.hed_type_factors.HedTypeFactors.rst b/docs/source/generated/hed.tools.analysis.hed_type_factors.HedTypeFactors.rst
new file mode 100644
index 000000000..f559ff6b0
--- /dev/null
+++ b/docs/source/generated/hed.tools.analysis.hed_type_factors.HedTypeFactors.rst
@@ -0,0 +1,37 @@
+﻿hed.tools.analysis.hed\_type\_factors.HedTypeFactors
+====================================================
+
+.. currentmodule:: hed.tools.analysis.hed_type_factors
+
+.. autoclass:: hed.tools.analysis.hed_type_factors.HedTypeFactors
+   
+   .. automethod:: __init__
+
+   
+   .. rubric:: Methods
+
+   .. autosummary::
+   
+      ~HedTypeFactors.__init__
+      ~HedTypeFactors.count_events
+      ~HedTypeFactors.factors_to_vector
+      ~HedTypeFactors.get_factors
+      ~HedTypeFactors.get_summary
+   
+   
+
+   
+   
+   .. rubric:: Attributes
+
+   .. autosummary::
+   
+      ~HedTypeFactors.ALLOWED_ENCODINGS
+   
+   
+
+.. autoclass:: hed.tools.analysis.hed_type_factors.HedTypeFactors
+   :members:
+   :undoc-members:
+   :show-inheritance:
+   :inherited-members:
\ No newline at end of file
diff --git a/docs/source/generated/hed.tools.analysis.hed_type_variable.HedTypeVariable.rst b/docs/source/generated/hed.tools.analysis.hed_type_variable.HedTypeVariable.rst
new file mode 100644
index 000000000..5f033105e
--- /dev/null
+++ b/docs/source/generated/hed.tools.analysis.hed_type_variable.HedTypeVariable.rst
@@ -0,0 +1,38 @@
+﻿hed.tools.analysis.hed\_type\_variable.HedTypeVariable
+======================================================
+
+.. currentmodule:: hed.tools.analysis.hed_type_variable
+
+.. autoclass:: hed.tools.analysis.hed_type_variable.HedTypeVariable
+   
+   .. automethod:: __init__
+
+   
+   .. rubric:: Methods
+
+   .. autosummary::
+   
+      ~HedTypeVariable.__init__
+      ~HedTypeVariable.get_variable
+      ~HedTypeVariable.get_variable_def_names
+      ~HedTypeVariable.get_variable_factors
+      ~HedTypeVariable.get_variable_names
+      ~HedTypeVariable.summarize
+   
+   
+
+   
+   
+   .. rubric:: Attributes
+
+   .. autosummary::
+   
+      ~HedTypeVariable.type_variables
+   
+   
+
+.. autoclass:: hed.tools.analysis.hed_type_variable.HedTypeVariable
+   :members:
+   :undoc-members:
+   :show-inheritance:
+   :inherited-members:
\ No newline at end of file
diff --git a/docs/source/generated/hed.tools.analysis.hed_variable_manager.HedVariableManager.rst b/docs/source/generated/hed.tools.analysis.hed_variable_manager.HedVariableManager.rst
new file mode 100644
index 000000000..6ccd66e40
--- /dev/null
+++ b/docs/source/generated/hed.tools.analysis.hed_variable_manager.HedVariableManager.rst
@@ -0,0 +1,39 @@
+﻿hed.tools.analysis.hed\_variable\_manager.HedVariableManager
+============================================================
+
+.. currentmodule:: hed.tools.analysis.hed_variable_manager
+
+.. autoclass:: hed.tools.analysis.hed_variable_manager.HedVariableManager
+   
+   .. automethod:: __init__
+
+   
+   .. rubric:: Methods
+
+   .. autosummary::
+   
+      ~HedVariableManager.__init__
+      ~HedVariableManager.add_type_variable
+      ~HedVariableManager.get_factor_vectors
+      ~HedVariableManager.get_type_variable
+      ~HedVariableManager.get_type_variable_def_names
+      ~HedVariableManager.get_type_variable_factor
+      ~HedVariableManager.summarize_all
+   
+   
+
+   
+   
+   .. rubric:: Attributes
+
+   .. autosummary::
+   
+      ~HedVariableManager.type_variables
+   
+   
+
+.. autoclass:: hed.tools.analysis.hed_variable_manager.HedVariableManager
+   :members:
+   :undoc-members:
+   :show-inheritance:
+   :inherited-members:
\ No newline at end of file
diff --git a/docs/source/generated/hed.tools.analysis.hed_variable_summary.HedVariableCounts.rst b/docs/source/generated/hed.tools.analysis.hed_variable_summary.HedVariableCounts.rst
new file mode 100644
index 000000000..741437d1c
--- /dev/null
+++ b/docs/source/generated/hed.tools.analysis.hed_variable_summary.HedVariableCounts.rst
@@ -0,0 +1,29 @@
+﻿hed.tools.analysis.hed\_variable\_summary.HedVariableCounts
+===========================================================
+
+.. currentmodule:: hed.tools.analysis.hed_variable_summary
+
+.. autoclass:: hed.tools.analysis.hed_variable_summary.HedVariableCounts
+   
+   .. automethod:: __init__
+
+   
+   .. rubric:: Methods
+
+   .. autosummary::
+   
+      ~HedVariableCounts.__init__
+      ~HedVariableCounts.get_summary
+      ~HedVariableCounts.update
+   
+   
+
+   
+   
+   
+
+.. autoclass:: hed.tools.analysis.hed_variable_summary.HedVariableCounts
+   :members:
+   :undoc-members:
+   :show-inheritance:
+   :inherited-members:
\ No newline at end of file
diff --git a/docs/source/generated/hed.tools.analysis.hed_variable_summary.HedVariableSummary.rst b/docs/source/generated/hed.tools.analysis.hed_variable_summary.HedVariableSummary.rst
new file mode 100644
index 000000000..1b5090134
--- /dev/null
+++ b/docs/source/generated/hed.tools.analysis.hed_variable_summary.HedVariableSummary.rst
@@ -0,0 +1,29 @@
+﻿hed.tools.analysis.hed\_variable\_summary.HedVariableSummary
+============================================================
+
+.. currentmodule:: hed.tools.analysis.hed_variable_summary
+
+.. autoclass:: hed.tools.analysis.hed_variable_summary.HedVariableSummary
+   
+   .. automethod:: __init__
+
+   
+   .. rubric:: Methods
+
+   .. autosummary::
+   
+      ~HedVariableSummary.__init__
+      ~HedVariableSummary.get_summaries
+      ~HedVariableSummary.update_summary
+   
+   
+
+   
+   
+   
+
+.. autoclass:: hed.tools.analysis.hed_variable_summary.HedVariableSummary
+   :members:
+   :undoc-members:
+   :show-inheritance:
+   :inherited-members:
\ No newline at end of file
diff --git a/docs/source/generated/hed.tools.KeyMap.rst b/docs/source/generated/hed.tools.analysis.key_map.KeyMap.rst
similarity index 59%
rename from docs/source/generated/hed.tools.KeyMap.rst
rename to docs/source/generated/hed.tools.analysis.key_map.KeyMap.rst
index ec726c3ea..43e0d5176 100644
--- a/docs/source/generated/hed.tools.KeyMap.rst
+++ b/docs/source/generated/hed.tools.analysis.key_map.KeyMap.rst
@@ -1,9 +1,9 @@
-﻿hed.tools.KeyMap
-================
+﻿hed.tools.analysis.key\_map.KeyMap
+==================================
 
-.. currentmodule:: hed.tools
+.. currentmodule:: hed.tools.analysis.key_map
 
-.. autoclass:: hed.tools.KeyMap
+.. autoclass:: hed.tools.analysis.key_map.KeyMap
    
    .. automethod:: __init__
 
@@ -30,7 +30,7 @@
    
    
 
-.. autoclass:: hed.tools.KeyMap
+.. autoclass:: hed.tools.analysis.key_map.KeyMap
    :members:
    :undoc-members:
    :show-inheritance:
diff --git a/docs/source/generated/hed.tools.analysis.rst b/docs/source/generated/hed.tools.analysis.rst
deleted file mode 100644
index b30d8b9f2..000000000
--- a/docs/source/generated/hed.tools.analysis.rst
+++ /dev/null
@@ -1,69 +0,0 @@
-hed.tools.analysis package
-==========================
-
-Submodules
-----------
-
-hed.tools.analysis.analysis\_util module
-----------------------------------------
-
-.. automodule:: hed.tools.analysis.analysis_util
-   :members:
-   :undoc-members:
-   :show-inheritance:
-
-hed.tools.analysis.annotation\_util module
-------------------------------------------
-
-.. automodule:: hed.tools.analysis.annotation_util
-   :members:
-   :undoc-members:
-   :show-inheritance:
-
-hed.tools.analysis.file\_dictionary module
-------------------------------------------
-
-.. automodule:: hed.tools.analysis.file_dictionary
-   :members:
-   :undoc-members:
-   :show-inheritance:
-
-hed.tools.analysis.key\_map module
-----------------------------------
-
-.. automodule:: hed.tools.analysis.key_map
-   :members:
-   :undoc-members:
-   :show-inheritance:
-
-hed.tools.analysis.summary\_util module
----------------------------------------
-
-.. automodule:: hed.tools.analysis.summary_util
-   :members:
-   :undoc-members:
-   :show-inheritance:
-
-hed.tools.analysis.tabular\_reports module
-------------------------------------------
-
-.. automodule:: hed.tools.analysis.tabular_reports
-   :members:
-   :undoc-members:
-   :show-inheritance:
-
-hed.tools.analysis.tag\_summary module
---------------------------------------
-
-.. automodule:: hed.tools.analysis.tag_summary
-   :members:
-   :undoc-members:
-   :show-inheritance:
-
-Module contents
----------------
-
-.. automodule:: hed.tools.analysis
-   :members:
-   :undoc-members:
-   :show-inheritance:
diff --git a/docs/source/generated/hed.tools.analysis.variable_manager.VariableFactors.rst b/docs/source/generated/hed.tools.analysis.variable_manager.VariableFactors.rst
new file mode 100644
index 000000000..35dc19166
--- /dev/null
+++ b/docs/source/generated/hed.tools.analysis.variable_manager.VariableFactors.rst
@@ -0,0 +1,37 @@
+﻿hed.tools.analysis.variable\_manager.VariableFactors
+====================================================
+
+.. currentmodule:: hed.tools.analysis.variable_manager
+
+.. autoclass:: hed.tools.analysis.variable_manager.VariableFactors
+   
+   .. automethod:: __init__
+
+   
+   .. rubric:: Methods
+
+   .. autosummary::
+   
+      ~VariableFactors.__init__
+      ~VariableFactors.count_events
+      ~VariableFactors.factors_to_vector
+      ~VariableFactors.get_factors
+      ~VariableFactors.get_summary
+   
+   
+
+   
+   
+   .. rubric:: Attributes
+
+   .. autosummary::
+   
+      ~VariableFactors.ALLOWED_ENCODINGS
+   
+   
+
+.. autoclass:: hed.tools.analysis.variable_manager.VariableFactors
+   :members:
+   :undoc-members:
+   :show-inheritance:
+   :inherited-members:
\ No newline at end of file
diff --git a/docs/source/generated/hed.util.io_util.rst b/docs/source/generated/hed.util.io_util.rst
deleted file mode 100644
index 6b9336293..000000000
--- a/docs/source/generated/hed.util.io_util.rst
+++ /dev/null
@@ -1,37 +0,0 @@
-﻿hed.util.io\_util
-=================
-
-.. automodule:: hed.util.io_util
-
-   
-   
-   
-
-   
-   
-   .. rubric:: Functions
-
-   .. autosummary::
-   
-      check_filename
-      extract_suffix_path
-      generate_filename
-      get_dir_dictionary
-      get_file_list
-      get_filtered_list
-      get_path_components
-      make_path
-      parse_bids_filename
-   
-   
-
-   
-   
-   
-
-   
-   
-   
-
-
-
diff --git a/hed/errors/error_reporter.py b/hed/errors/error_reporter.py
index d40c29b9d..a36195435 100644
--- a/hed/errors/error_reporter.py
+++ b/hed/errors/error_reporter.py
@@ -19,17 +19,13 @@ def _register_error_function(error_type, wrapper_func):
 
 
 def hed_error(error_type, default_severity=ErrorSeverity.ERROR, actual_code=None):
-    """
-    Decorator for errors in error handler or inherited classes.
-
-    Parameters
-    ----------
-    error_type : str
-        This should be a value from error_types, but doesn't strictly have to be.
-    default_severity: ErrorSeverity
-        The default severity for the decorated error
-    actual_code: str
-        The actual error to report to the outside world
+    """ Decorator for errors in error handler or inherited classes.
+
+    Args:
+        error_type (str): A value from error_types or optionally another value.
+        default_severity (ErrorSeverity): The default severity for the decorated error.
+        actual_code (str): The actual error to report to the outside world.
+
     """
     if actual_code is None:
         actual_code = error_type
@@ -37,21 +33,16 @@ def hed_error(error_type, default_severity=ErrorSeverity.ERROR, actual_code=None
     def inner_decorator(func):
         @wraps(func)
         def wrapper(*args, severity=default_severity, **kwargs):
+            """ Wrapper function for error handling non-tag errors.
+
+            Args:
+                args (args): non keyword args.
+                severity (ErrorSeverity): Will override the default error value if passed.
+                kwargs (**kwargs): Any keyword args to be passed down to error message function.
+
+            Returns:
+                list: A list of dict with the errors.=
             """
-            Wrapper function for error handling non-tag errors
-
-           Parameters
-           ----------
-           args:
-               Any other non keyword args
-           severity: ErrorSeverity, Optional
-               Will override the default error value if passed.(If you want to turn a warning into an error)
-           kwargs:
-               Any keyword args to be passed down to error message function
-           Returns
-           -------
-           error_list: [{}]
-           """
             base_message, error_vars = func(*args, **kwargs)
             error_object = ErrorHandler._create_error_object(actual_code, base_message, severity, **error_vars)
             return error_object
@@ -63,19 +54,14 @@ def wrapper(*args, severity=default_severity, **kwargs):
 
 
 def hed_tag_error(error_type, default_severity=ErrorSeverity.ERROR, has_sub_tag=False, actual_code=None):
-    """
-    Decorator for errors in error handler or inherited classes.
-
-    Parameters
-    ----------
-    error_type : str
-        This should be a value from error_types, but doesn't strictly have to be.
-    default_severity: ErrorSeverity
-        The default severity for the decorated error
-    has_sub_tag : bool
-        Determines if this error message also wants a sub_tag passed down.  eg "This" in "This/Is/A/Tag"
-    actual_code: str
-        The actual error to report to the outside world
+    """  Decorator for errors in error handler or inherited classes.
+
+    Args:
+        error_type (str): A value from error_types or optionally another value.
+        default_severity (ErrorSeverity): The default severity for the decorated error.
+        has_sub_tag (bool): If true, this error message also wants a sub_tag passed down.  eg "This" in "This/Is/A/Tag"
+        actual_code (str): The actual error to report to the outside world.
+
     """
     if actual_code is None:
         actual_code = error_type
@@ -83,28 +69,20 @@ def hed_tag_error(error_type, default_severity=ErrorSeverity.ERROR, has_sub_tag=
     def inner_decorator(func):
         if has_sub_tag:
             @wraps(func)
-            def wrapper(tag, index_in_tag, index_in_tag_end, *args, severity=default_severity,
-                        **kwargs):
-                """
-                Wrapper function for error handling tag errors with sub tags.
-
-                Parameters
-                ----------
-                tag: HedTag
-                    The hed tag object with the problem
-                index_in_tag: int,
-                    The index into the tag with a problem(usually 0)
-                index_in_tag_end: int
-                    the last index into the tag with a problem(usually len(tag)
-                args:
-                    Any other non keyword args
-                severity: ErrorSeverity, Optional
-                    Will override the default error value if passed.(If you want to turn a warning into an error)
-                kwargs:
-                    Any keyword args to be passed down to error message function
-                Returns
-                -------
-                error_list: [{}]
+            def wrapper(tag, index_in_tag, index_in_tag_end, *args, severity=default_severity, **kwargs):
+                """ Wrapper function for error handling tag errors with sub tags.
+
+                Args:
+                    tag (HedTag): The hed tag object with the problem,
+                    index_in_tag (int): The index into the tag with a problem(usually 0),
+                    index_in_tag_end (int): The last index into the tag with a problem(usually len(tag),
+                    args (args): Any other non keyword args.
+                    severity (ErrorSeverity): Used to include warnings as well as errors.
+                    kwargs (**kwargs): Any keyword args to be passed down to error message function.
+
+                Returns:
+                    list: A list of dict with the errors.
+
                 """
                 try:
                     tag_as_string = tag.tag
@@ -131,22 +109,17 @@ def wrapper(tag, index_in_tag, index_in_tag_end, *args, severity=default_severit
         else:
             @wraps(func)
             def wrapper(tag, *args, severity=default_severity, **kwargs):
-                """
-                Wrapper function for error handling tag errors
-
-                Parameters
-                ----------
-                tag: HedTag or HedGroup
-                    The hed tag object with the problem
-                args:
-                    Any other non keyword args
-                severity: ErrorSeverity, Optional
-                    Will override the default error value if passed.(If you want to turn a warning into an error)
-                kwargs:
-                    Any keyword args to be passed down to error message function
-                Returns
-                -------
-                error_list: [{}]
+                """ Wrapper function for error handling tag errors.
+
+                Args:
+                    tag (HedTag or HedGroup): The hed tag object with the problem.
+                    args (non keyword args): Any other non keyword args.
+                    severity (ErrorSeverity): For including warnings.
+                    kwargs (keyword args): Any keyword args to be passed down to error message function.
+
+                Returns:
+                    list: A list of dict with the errors.
+
                 """
                 from hed.models.hed_tag import HedTag
                 from hed.models.hed_group import HedGroup
@@ -180,35 +153,36 @@ def __init__(self):
         self.error_context = []
 
     def push_error_context(self, context_type, context, increment_depth_after=True):
-        """
-        Pushes a new error context to the end of the stack to narrow down error scope.
-
-        Parameters
-        ----------
-        context_type : ErrorContext
-            This should be a value from ErrorContext representing the type of scope.
-        context : str or int or HedString
-            The main value for the context_type.  eg for ErrorContext.FILE_NAME this would be the actual filename.
-        increment_depth_after : bool
-            If True, this adds an extra tab to any subsequent errors in the scope.
-        Returns
-        -------
+        """ Push a new error context to narrow down error scope.
+
+        Args:
+            context_type (ErrorContext): A value from ErrorContext representing the type of scope.
+            context (str, int, or HedString): The main value for the context_type.
+            increment_depth_after (bool): If True, add an extra tab to any subsequent errors in the scope.
+
+        Notes:
+            The context depends on the context_type. For ErrorContext.FILE_NAME this would be the actual filename.
+
         """
         self.error_context.append((context_type, context, increment_depth_after))
 
     def pop_error_context(self):
-        """
-        Removes the last scope from the error context.
+        """ Remove the last scope from the error context.
+
+        Notes:
+            Modifies the error context of this reporter.
 
-        Returns
-        -------
         """
+
         self.error_context.pop(-1)
 
     def reset_error_context(self):
-        """Reset all error context information to defaults
+        """ Reset all error context information to defaults.
+
+        Notes:
+            This function is mainly for testing and should not be needed with proper usage.
 
-        This function should not be needed with proper usage."""
+        """
         self.error_context = []
 
     def get_error_context_copy(self):
@@ -224,23 +198,20 @@ def format_error_with_context(self, *args, **kwargs):
 
     @staticmethod
     def format_error(error_type, *args, actual_error=None, **kwargs):
-        """
-            The parameters vary based on what type of error this is.
-
-        Parameters
-        ----------
-        error_type : str
-            The type of error for this.  Registered with @hed_error or @hed_tag_error.
-        args: args
-            Any remaining non keyword args.
-        actual_error: str or None
-            The code to actually add to report out.  Useful for errors that are shared like invalid character.
-        kwargs :
-            The other parameters to pass down to the error handling func.
-        Returns
-        -------
-        error: [{}]
-            A single error
+        """ Format an error based on the parameters, which vary based on what type of error this is.
+
+        Args:
+            error_type (str): The type of error for this.  Registered with @hed_error or @hed_tag_error.
+            args (args): Any remaining non keyword args after those required by the error type.
+            actual_error (str or None): Code to actually add to report out.
+            kwargs (dict): The other keyword args to pass down to the error handling func.
+
+        Returns:
+            list:   A list containing a single dictionary representing a single error.
+
+        Notes:
+            The actual error is useful for errors that are shared like invalid character.
+
         """
         error_func = error_functions.get(error_type)
         if not error_func:
@@ -260,16 +231,14 @@ def add_context_to_issues(self, issues):
             self._update_error_with_char_pos(error_object)
 
     def format_error_list(self, issue_params):
-        """
-            Convert an issue params list to an issues list.  This means adding the error context primarily.
-
-        Parameters
-        ----------
-        issue_params : [{}]
-            The unformatted issues list
-        Returns
-        -------
-        issues_list: [{}]
+        """ Convert an issue params list to an issues list.  This means adding the error context primarily.
+
+        Args:
+            issue_params (list):  A list of dict containing the unformatted issues list.
+
+        Returns:
+            list: A list of dict containing unformatted errors.
+
         """
         formatted_issues = []
         for issue in issue_params:
@@ -278,25 +247,22 @@ def format_error_list(self, issue_params):
 
     @staticmethod
     def format_error_from_context(error_type, error_context, *args, actual_error=None, **kwargs):
-        """
-            The parameters vary based on what type of error this is.
-
-        Parameters
-        ----------
-        error_type : str
-            The type of error for this.  Registered with @hed_error or @hed_tag_error.
-        error_context: []
-            A list containing the error context to use for this error.  Generally returned from _add_context_to_errors
-        args: args
-            Any remaining non keyword args.
-        actual_error: str or None
-            The code to actually add to report out.  Useful for errors that are shared like invalid character.
-        kwargs :
-            The other parameters to pass down to the error handling func.
-        Returns
-        -------
-        error: [{}]
-            A single error
+        """ Format an error based on the error type.
+
+        Args:
+            error_type (str): The type of error.  Registered with @hed_error or @hed_tag_error.
+            error_context (list): Contains the error context to use for this error.
+            args (args): Any remaining non keyword args.
+            actual_error (str or None): Error code to actually add to report out.
+            kwargs (kwargs): Keyword parameters to pass down to the error handling func.
+
+        Returns:
+            list:  A list containing a single dictionary
+
+        Notes:
+            - Generally the error_context is returned from _add_context_to_errors.
+            - The actual_error is useful for errors that are shared like invalid character.
+
         """
         error_func = error_functions.get(error_type)
         if not error_func:
@@ -315,19 +281,15 @@ def format_error_from_context(error_type, error_context, *args, actual_error=Non
 
     @staticmethod
     def _add_context_to_errors(error_object, error_context_to_add):
-        """
-        Takes an error object and adds relevant context around it, such as row number, or column name.
-
-        Parameters
-        ----------
-        error_object : {}
-            Generated error containing at least a code and message entry.
-        error_context_to_add: []
-            Source context to use.  If none, gets it from the error handler directly at this time.
-        Returns
-        -------
-        error_object_list: [{}]
-            The passed in error with any needed context strings added to the start.
+        """ Add relevant context such as row number or column name around an error object.
+
+        Args:
+            error_object (dict): Generated error containing at least a code and message entry.
+            error_context_to_add (list): Source context to use.  If none, the error handler context is used.
+
+        Returns:
+            list: A list of dict with needed context strings added at the beginning of the list.
+
         """
         if error_object is None:
             error_object = {}
@@ -394,53 +356,44 @@ def _update_error_with_char_pos(error_object):
 
     @hed_error("Unknown")
     def val_error_unknown(*args, **kwargs):
-        """
-        Default error handler if no error of this type was registered.
+        """ Default error handler if no error of this type was registered.
+
+        Args:
+            args (args): List of non-keyword parameters (varies).
+            kwargs (kwargs): Keyword parameters (varies)
 
-        Parameters
-        ----------
-        args : varies
-        kwargs : varies
+        Returns:
+            str: The error message.
+            dict: The extra args.
 
-        Returns
-        -------
-        error_message, extra_error_args: str, dict
         """
         return f"Unknown error.  Args: {str(args)}", kwargs
 
     @staticmethod
     def filter_issues_by_severity(issues_list, severity):
-        """
-        Gathers all issues matching or below a given severity.
-
-        Parameters
-        ----------
-        issues_list : [{}]
-            The full issue list
-        severity : int
-            The level of issue you're interested in
-
-        Returns
-        -------
-        filtered_issues_list: [{}]
-            The list with all other severities removed.
+        """ Gather all issues matching or below a given severity.
+
+        Args:
+            issues_list (list): A list of dictionaries containing the full issue list.
+            severity (int): The level of issues to keep.
+
+        Returns:
+            list: A list of dictionaries containing the issue list after filtering by severity.
+
         """
         return [issue for issue in issues_list if issue['severity'] <= severity]
 
 
 def get_exception_issue_string(issues, title=None):
-    """Return a string with issues list flatted into single string, one per line
-
-    Parameters
-    ----------
-    issues: []
-        Issues to print
-    title: str
-        Optional title that will always show up first if present(even if there are no validation issues)
-    Returns
-    -------
-    str
-        A str containing printable version of the issues or ''.
+    """ Return a string with issues list flatted into single string, one issue per line.
+
+    Args:
+        issues (list) A list of strings containing issues to print.
+        title (str or None): An optional title that will always show up first if present.
+
+    Returns:
+        str: A str containing printable version of the issues or ''.
+
     """
 
     issue_str = ''
@@ -458,22 +411,16 @@ def get_exception_issue_string(issues, title=None):
 
 
 def get_printable_issue_string(issues, title=None, severity=None, skip_filename=True):
-    """Return a string with issues list flatted into single string, one per line
-
-    Parameters
-    ----------
-    issues: []
-        Issues to print
-    title: str
-        Optional title that will always show up first if present(even if there are no validation issues)
-    severity: int
-        Return only warnings >= severity
-    skip_filename: bool
-        If true, don't add the filename context to the printable string.
-    Returns
-    -------
-    str
-        A str containing printable version of the issues or ''.
+    """ Return a string with issues list flatted into single string, one per line.
+
+    Args:
+        issues (list)  Issues to print.
+        title (str) Optional title that will always show up first if present(even if there are no validation issues).
+        severity (int) Return only warnings >= severity.
+        skip_filename (bool) If true, don't add the filename context to the printable string.
+
+    Returns:
+        str:   A string containing printable version of the issues or ''.
 
     """
     last_used_error_context = []
@@ -509,18 +456,15 @@ def check_for_any_errors(issues_list):
 
 
 def _get_context_from_issue(val_issue, skip_filename=True):
-    """
-    Extract all the context values from the given issue
-    Parameters
-    ----------
-    val_issue : {}
-        A dictionary a representing a single error
-    skip_filename: bool
-        If true, don't gather the filename context.
-    Returns
-    -------
-    context_list: []
-        A list of tuples containing the context_type and context for the given issue
+    """ Extract all the context values from the given issue.
+
+    Args:
+        val_issue (dict): A dictionary a representing a single error.
+        skip_filename (bool): If true, don't gather the filename context.
+
+    Returns:
+        list: A list of tuples containing the context_type and context for the given issue.
+
     """
     single_issue_context = []
     for key in val_issue:
@@ -533,22 +477,16 @@ def _get_context_from_issue(val_issue, skip_filename=True):
 
 
 def _format_single_context_string(context_type, context, tab_count=0):
-    """
-    Takes a single context tuple and returns the human readable form.
-
-    Parameters
-    ----------
-    context_type : str
-        The context type of this entry
-    context : str or HedString
-        The value of this context
-    tab_count : int
-        Number of tabs to name_prefix each line with.
-
-    Returns
-    -------
-    context_string: str
-        A string containing the context, including tabs.
+    """ Return the human readable form of a single context tuple.
+
+    Args:
+        context_type (str): The context type of this entry.
+        context (str or HedString): The value of this context
+        tab_count (int): Number of tabs to name_prefix each line with.
+
+    Returns:
+        str: A string containing the context, including tabs.
+
     """
     tab_string = tab_count * '\t'
     if context_type == ErrorContext.HED_STRING:
@@ -571,23 +509,20 @@ def _format_single_context_string(context_type, context, tab_count=0):
 
 
 def _get_context_string(single_issue_context, last_used_context):
-    """
-    Converts a single context list into the final human readable output form.
-
-    Parameters
-    ----------
-    single_issue_context : [()]
-        A list of tuples containing the context(context_type, context, increment_tab)
-    last_used_context : [()]
-        A list of tuples containing the last drawn context, so it can only add the parts that have changed.
-        This is always the same format as single_issue_context.
-
-    Returns
-    -------
-    context_string: str
-        The full string of context(potentially multiline) to add before the error
-    tab_string: str
-        The name_prefix to add to any message line with this context.
+    """ Convert a single context list into the final human readable output form.
+
+    Args:
+        single_issue_context (list): A list of tuples containing the context(context_type, context, increment_tab)
+        last_used_context (list): A list of tuples containing the last drawn context.
+
+    Returns:
+        str: The full string of context(potentially multiline) to add before the error.
+        str: The tab string to add to the front of any message line with this context.
+
+    Notes:
+        The last used context is always the same format as single_issue_context and used
+        so that the error handling can only add the parts that have changed.
+
     """
     context_string = ""
     tab_count = 0
diff --git a/hed/models/base_input.py b/hed/models/base_input.py
index 48bbe43b1..66c8d64a5 100644
--- a/hed/models/base_input.py
+++ b/hed/models/base_input.py
@@ -28,20 +28,22 @@ class BaseInput:
     COMMA_DELIMITER = ','
 
     def __init__(self, file, file_type=None, worksheet_name=None, has_column_names=True, mapper=None, def_mapper=None,
-                 definition_columns=None, name=None, allow_blank_names=True):
+                 definition_columns=None, name=None, allow_blank_names=True, hed_schema=None):
         """ Constructor for the BaseInput class.
 
         Args:
-            file (str or file-like): An xlsx/tsv file to open.
+            file (str or file-like or pandas dataframe): An xlsx/tsv file to open.
             file_type (str or None): ".xlsx" (Excel), ".tsv" or ".txt" (tab-separated text).
-                Derived from file if file is a filename.
+                Derived from file if file is a filename.  Ignored if pandas dataframe.
             worksheet_name (str or None): Name of Excel workbook worksheet name to use.
                 (Not applicable to tsv files.)
             has_column_names (bool): True if file has column names.
+                This value is ignored if you pass in a pandas dataframe.
             mapper (ColumnMapper or None):  Indicates which columns have HED tags.
             definition_columns(list or None): A list of columns to check for definitions.  Explicit 'None' means all.
             name (str or None): Optional field for how this file will report errors.
             allow_blank_names(bool): If True, column names can be blank
+            hed_schema(HedSchema or None): The schema to use by default in identifying tags
         Notes:
             - See SpreadsheetInput or TabularInput for examples of how to use built-in a ColumnMapper.
 
@@ -49,6 +51,8 @@ def __init__(self, file, file_type=None, worksheet_name=None, has_column_names=T
         if mapper is None:
             mapper = ColumnMapper()
         self._mapper = mapper
+        if def_mapper is None:
+            def_mapper = DefMapper(mapper.get_def_dicts())
         self._def_mapper = def_mapper
         self._has_column_names = has_column_names
         self._name = name
@@ -56,14 +60,12 @@ def __init__(self, file, file_type=None, worksheet_name=None, has_column_names=T
         self._loaded_workbook = None
         self._worksheet_name = worksheet_name
         self._def_columns = definition_columns
+        self._schema = hed_schema
         self.file_def_dict = None
         pandas_header = 0
         if not self._has_column_names:
             pandas_header = None
 
-        if not file:
-            raise HedFileError(HedExceptions.FILE_NOT_FOUND, "Empty file passed to BaseInput.", file)
-
         input_type = file_type
         if isinstance(file, str):
             if file_type is None:
@@ -73,7 +75,12 @@ def __init__(self, file, file_type=None, worksheet_name=None, has_column_names=T
 
         self._dataframe = None
 
-        if input_type in self.TEXT_EXTENSION:
+        if isinstance(file, pandas.DataFrame):
+            self._dataframe = file
+            self._has_column_names = self._dataframe_has_names(self._dataframe)
+        elif not file:
+            raise HedFileError(HedExceptions.FILE_NOT_FOUND, "Empty file passed to BaseInput.", file)
+        elif input_type in self.TEXT_EXTENSION:
             self._dataframe = pandas.read_csv(file, delimiter='\t', header=pandas_header,
                                               dtype=str, keep_default_na=False, na_values=None)
         elif input_type in self.EXCEL_EXTENSION:
@@ -135,11 +142,18 @@ def worksheet_name(self):
         """ The worksheet name. """
         return self._worksheet_name
 
+    def get_definitions(self, as_strings=False):
+        if as_strings:
+            return DefinitionDict.get_as_strings(self._def_mapper.gathered_defs)
+        else:
+            return self._def_mapper
+
     def _convert_to_form(self, hed_schema, tag_form, error_handler):
         """ Convert all tags to the specified form.
 
         Args:
-            hed_schema (HedSchema): The schema to use to convert tags.
+            hed_schema (HedSchema or None): The schema to use to convert tags.
+                If None, uses the one used to open the file.
             tag_form (str): The form to convert the tags to (short_tag, long_tag, base_tag, etc).
             error_handler (ErrorHandler or None): The error handler to use for context or default if none.
 
@@ -148,6 +162,10 @@ def _convert_to_form(self, hed_schema, tag_form, error_handler):
 
         """
         error_list = []
+        if hed_schema is None:
+            hed_schema = self._schema
+        if hed_schema is None:
+            raise ValueError("Cannot convert between tag forms without a schema.")
         for row_number, row_dict in enumerate(self.iter_dataframe(hed_ops=hed_schema,
                                                                   return_string_only=False,
                                                                   remove_definitions=False,
@@ -162,11 +180,12 @@ def _convert_to_form(self, hed_schema, tag_form, error_handler):
 
         return error_list
 
-    def convert_to_short(self, hed_schema, error_handler=None):
+    def convert_to_short(self, hed_schema=None, error_handler=None):
         """ Convert all tags to short form.
 
         Args:
-            hed_schema (HedSchema): The schema to use to convert tags.
+            hed_schema (HedSchema or None): The schema to use to convert tags.
+                If None, uses the one used to open the file.
             error_handler (ErrorHandler): The error handler to use for context, uses a default if none.
 
         Returns:
@@ -175,11 +194,12 @@ def convert_to_short(self, hed_schema, error_handler=None):
         """
         return self._convert_to_form(hed_schema, "short_tag", error_handler)
 
-    def convert_to_long(self, hed_schema, error_handler=None):
+    def convert_to_long(self, hed_schema=None, error_handler=None):
         """ Convert all tags to long form.
 
         Args:
-            hed_schema (HedSchema): The schema to use to convert tags.
+            hed_schema (HedSchema or None): The schema to use to convert tags.
+                If None, uses the one used to open the file.
             error_handler (ErrorHandler): The error handler to use for context, uses a default if none.
 
         Returns:
@@ -288,7 +308,7 @@ def iter_dataframe(self, hed_ops=None, mapper=None, requested_columns=None, retu
             error_handler (ErrorHandler or None):   The error handler to use for context or a default if None.
             expand_defs (bool):  If True, expand def tags into def-expand groups.
             remove_definitions (bool): If true, remove all definition tags found.
-            kwargs ():  See models.hed_ops.translate_ops or the specific hed_ops for additional options.
+            kwargs (kwargs):  See models.hed_ops.translate_ops or the specific hed_ops for additional options.
 
         Yields:
             dict:  A dict with parsed row, including keys: "HED", "column_to_hed_tags", and possibly "column_issues".
@@ -537,7 +557,7 @@ def extract_definitions(self, error_handler=None):
         if error_handler is None:
             error_handler = ErrorHandler()
         new_def_dict = DefinitionDict()
-        hed_ops = [new_def_dict]
+        hed_ops = [self._schema, new_def_dict]
         for _ in self.iter_dataframe(hed_ops=hed_ops,
                                      return_string_only=False,
                                      requested_columns=self._def_columns,
@@ -568,11 +588,12 @@ def _translate_ops(self, hed_ops, run_string_ops_on_columns, expand_defs, remove
             hed_ops = hed_ops.copy()
             if not run_string_ops_on_columns:
                 self._add_def_onset_mapper(hed_ops)
-                tag_funcs, string_funcs = translate_ops(hed_ops, split_ops=True, expand_defs=expand_defs,
+                tag_funcs, string_funcs = translate_ops(hed_ops, split_ops=True, hed_schema=self._schema,
+                                                        expand_defs=expand_defs,
                                                         remove_definitions=remove_definitions,
                                                         **kwargs)
             else:
-                tag_funcs = translate_ops(hed_ops, expand_defs=expand_defs, **kwargs)
+                tag_funcs = translate_ops(hed_ops, hed_schema=self._schema, expand_defs=expand_defs, **kwargs)
 
         return tag_funcs, string_funcs
 
@@ -582,3 +603,10 @@ def _add_def_onset_mapper(self, hed_ops):
                 hed_ops.append(self._def_mapper)
                 hed_ops.append(OnsetMapper(self._def_mapper))
         return hed_ops
+
+    @staticmethod
+    def _dataframe_has_names(dataframe):
+        for column in dataframe.columns:
+            if isinstance(column, str):
+                return True
+        return False
diff --git a/hed/models/column_mapper.py b/hed/models/column_mapper.py
index d5aaa4efa..63e7427eb 100644
--- a/hed/models/column_mapper.py
+++ b/hed/models/column_mapper.py
@@ -15,7 +15,7 @@ class ColumnMapper:
     """ Mapping of a base input file columns into HED tags.
 
     Notes:
-        - Functions and variables column and row indexing starts at 0.
+        - Functions and type_variables column and row indexing starts at 0.
     """
     def __init__(self, sidecar=None, tag_columns=None, column_prefix_dictionary=None,
                  optional_tag_columns=None, requested_columns=None, warn_on_missing_column=False):
@@ -86,7 +86,7 @@ def validate_column_map(column_map, allow_blank_names):
         issues = []
         used_names = set()
         for column_number, name in enumerate(column_map):
-            if name.startswith(PANDAS_COLUMN_PREFIX_TO_IGNORE):
+            if name is None or name.startswith(PANDAS_COLUMN_PREFIX_TO_IGNORE):
                 issues += ErrorHandler.format_error(ValidationErrors.HED_BLANK_COLUMN, column_number)
                 continue
             if name in used_names:
@@ -352,6 +352,8 @@ def _get_basic_final_map(column_map, column_data):
         unhandled_names = {}
         if column_map:
             for column_number, column_name in column_map.items():
+                if column_name is None:
+                    continue
                 if column_name in column_data:
                     column_entry = copy.deepcopy(column_data[column_name])
                     column_entry.column_name = column_name
@@ -462,10 +464,15 @@ def _finalize_mapping(self):
 
         self._final_column_map = self._filter_by_requested(final_map, self._requested_columns)
 
-        self._no_mapping_info = self._requested_columns is None and not self._final_column_map
+        self._no_mapping_info = not self._check_if_mapping_info()
         self._finalize_mapping_issues = issues
         return issues
 
+    def _check_if_mapping_info(self):
+        # If any of these have any data, don't do default behavior.
+        return bool(self.column_data or self._final_column_map or self._requested_columns is not None or self._tag_columns \
+            or self._optional_tag_columns or self._column_prefix_dictionary)
+
     def _column_name_requested(self, column_name):
         if self._requested_columns is None:
             return True
diff --git a/hed/models/column_metadata.py b/hed/models/column_metadata.py
index 98b149cf8..92a32d51f 100644
--- a/hed/models/column_metadata.py
+++ b/hed/models/column_metadata.py
@@ -92,9 +92,9 @@ def expand(self, input_text):
             input_text (str): Text to expand (generally from a single cell in a spreadsheet).
 
         Returns:
-            str or None:    The expanded column as a hed_string.
-            str or dict:    If this is a string, contains the name of this column
-                            as an attribute. If the first return value is None, this is an error message dictionary.
+            str or None: The expanded column as a hed_string.
+            str or dict: If this is a string, contains the name of this column
+                as an attribute. If the first return value is None, this is an error message dictionary.
 
         Notes:
             - Examples are adding name_prefix, inserting a column hed_string from a category key, etc.
diff --git a/hed/models/hed_group_base.py b/hed/models/hed_group_base.py
index 693fcb8cd..071aaf7b3 100644
--- a/hed/models/hed_group_base.py
+++ b/hed/models/hed_group_base.py
@@ -361,29 +361,12 @@ def find_tags_with_term(self, term, recursive=False, include_groups=2):
             recursive (bool): If true, recursively check subgroups.
             include_groups: 0, 1 or 2
                 If 0: Return only tags
-                If 1: return only groups
-                If 2 or any other value: return both
-
-            recursive (bool): If true, also check subgroups.
-            include_groups (int, 0, 1, 2, 3): options for how to expand or include groups
+                If 1: Return only groups
+                If 2 or any other value: Return both
 
         Returns:
             list:
 
-        def_tag: HedTag
-            The located def tag
-        def_expand_group: HedGroup or None
-            If this is a def-expand rather than def tag, this will be the entire def-expand group.
-        group: HedGroup
-            The group the def tag or def expand group is in.
-
-        Notes:
-            - The include_groups option controls the tag expansion as follows:
-                - If 0: Return only def and def expand tags/.
-                - If 1: Return only def tags and def-expand groups.
-                - If 2: Return only groups containing defs, or def-expand groups.
-                - If 3 or any other value: Return all 3 as a tuple.
-
         """
 
         found_tags = []
diff --git a/hed/models/hed_ops.py b/hed/models/hed_ops.py
index 68f5bbdc7..b670e7fa6 100644
--- a/hed/models/hed_ops.py
+++ b/hed/models/hed_ops.py
@@ -18,13 +18,14 @@
 }
 
 
-def translate_ops(hed_ops, split_ops=False, **kwargs):
+def translate_ops(hed_ops, split_ops=False, hed_schema=None, **kwargs):
     """ Return functions to apply to a hed string object.
 
     Args:
         hed_ops (list): A list of func or HedOps or HedSchema to apply to hed strings.
         split_ops (bool): If true, will split the operations into separate lists of tag and string operations.
-        kwargs (dict):  An optional dictionary of name-value pairs representing parameters passed to each HedOps
+        hed_schema(HedSchema or None): The schema to use by default in identifying tags
+        kwargs (kwargs):  An optional dictionary of name-value pairs representing parameters passed to each HedOps
 
     Returns:
         list or tuple: A list of functions to apply or a tuple containing separate lists of tag and string ops.
@@ -68,7 +69,7 @@ def translate_ops(hed_ops, split_ops=False, **kwargs):
 
     # Make sure the first column operation is a convert to forms, if we don't have one.
     if not _func_in_list(HedString.convert_to_canonical_forms, tag_funcs):
-        tag_funcs.insert(0, partial(HedString.convert_to_canonical_forms, hed_schema=None))
+        tag_funcs.insert(0, partial(HedString.convert_to_canonical_forms, hed_schema=hed_schema))
 
     if split_ops:
         return tag_funcs, string_funcs
@@ -81,7 +82,7 @@ def apply_ops(hed_strings, hed_ops, **kwargs):
     Args:
         hed_strings(str, dict, list): A list/dict/str to update
         hed_ops (list or HedOps or func): A list of func or HedOps or HedSchema to apply to hed strings.
-        kwargs (dict):  An optional dictionary of name-value pairs representing parameters passed to each HedOps
+        kwargs (kwargs):  An optional dictionary of name-value pairs representing parameters passed to each HedOps
 
     Returns:
         tuple:
diff --git a/hed/models/hed_tag.py b/hed/models/hed_tag.py
index b42e3ba88..3a79ed385 100644
--- a/hed/models/hed_tag.py
+++ b/hed/models/hed_tag.py
@@ -134,6 +134,7 @@ def org_base_tag(self):
         Notes:
             - Warning: This could be empty if the original tag had a name_prefix prepended.
             e.g. a column where "Label/" is prepended, thus the column value has zero base portion.
+
             - Only valid after calling convert_to_canonical_forms.
 
         """
diff --git a/hed/models/model_constants.py b/hed/models/model_constants.py
index 0bec13a94..98cc37091 100644
--- a/hed/models/model_constants.py
+++ b/hed/models/model_constants.py
@@ -19,3 +19,5 @@ class DefTagNames:
 
     ONSET_KEY = ONSET_ORG_KEY.lower()
     OFFSET_KEY = OFFSET_ORG_KEY.lower()
+
+    DEF_KEYS = (DEF_KEY, DEF_EXPAND_KEY)
\ No newline at end of file
diff --git a/hed/models/onset_mapper_hedops.py b/hed/models/onset_mapper_hedops.py
new file mode 100644
index 000000000..0e60f79f2
--- /dev/null
+++ b/hed/models/onset_mapper_hedops.py
@@ -0,0 +1,109 @@
+from hed.models.model_constants import DefTagNames
+from hed.models.hed_group import HedGroup
+from hed.errors.error_reporter import ErrorHandler
+from hed.errors.error_types import OnsetErrors
+from hed.models.hed_ops import HedOps
+
+
+class OnsetMapper(HedOps):
+    """ HedOps responsible for matching onset/offset pairs. """
+
+    def __init__(self, def_mapper):
+        super().__init__()
+        self._def_mapper = def_mapper
+        self._onsets = {}
+
+    def check_for_onset_offset(self, hed_string_obj):
+        """ Check for onset or offset and track context.
+
+        Args:
+            hed_string_obj (HedString): The hed string to check.  Finds a maximum of one onset tag.
+
+        Returns:
+            list: A list of issues found in validating onsets (i.e., out of order onsets, unknown def names).
+
+        Notes:
+            - Each issue in the return list is a dictionary.
+
+        """
+        onset_issues = []
+        for found_onset, found_group in self._find_onset_tags(hed_string_obj):
+            if not found_onset:
+                return []
+
+            def_tags = found_group.find_def_tags()
+            if not def_tags:
+                onset_issues += ErrorHandler.format_error(OnsetErrors.ONSET_NO_DEF_TAG_FOUND, found_onset)
+                continue
+
+            if len(def_tags) > 1:
+                onset_issues += ErrorHandler.format_error(OnsetErrors.ONSET_TOO_MANY_DEFS,
+                                                          tag=def_tags[0][0],
+                                                          tag_list=[tag[0] for tag in def_tags[1:]])
+                continue
+
+            # Get all children but def group and onset/offset, then validate #/type of children.
+            def_tag, def_group, _ = def_tags[0]
+            if def_group is None:
+                def_group = def_tag
+            children = [child for child in found_group.children if
+                        def_group is not child and found_onset is not child]
+            max_children = 1
+            if found_onset.short_base_tag.lower() == DefTagNames.OFFSET_KEY:
+                max_children = 0
+            if len(children) > max_children:
+                onset_issues += ErrorHandler.format_error(OnsetErrors.ONSET_WRONG_NUMBER_GROUPS,
+                                                          def_tag,
+                                                          found_group.children)
+                continue
+
+            if children:
+                # Make this a loop if max_children can be > 1
+                child = children[0]
+                if not isinstance(child, HedGroup):
+                    onset_issues += ErrorHandler.format_error(OnsetErrors.ONSET_TAG_OUTSIDE_OF_GROUP,
+                                                              child,
+                                                              def_tag)
+
+            # At this point we have either an onset or offset tag and it's name
+            onset_issues += self._handle_onset_or_offset(def_tag, found_onset)
+
+        return onset_issues
+
+    def _find_onset_tags(self, hed_string_obj):
+        return hed_string_obj.find_top_level_tags(anchor_tags={DefTagNames.ONSET_KEY, DefTagNames.OFFSET_KEY})
+
+    def _handle_onset_or_offset(self, def_tag, onset_offset_tag):
+        is_onset = onset_offset_tag.short_base_tag.lower() == DefTagNames.ONSET_KEY
+        full_def_name = def_name = def_tag.extension_or_value_portion
+        placeholder = None
+        found_slash = def_name.find("/")
+        if found_slash != -1:
+            placeholder = def_name[found_slash + 1:]
+            def_name = def_name[:found_slash]
+
+        def_entry = self._def_mapper.get_def_entry(def_name)
+        if def_entry is None:
+            return ErrorHandler.format_error(OnsetErrors.ONSET_DEF_UNMATCHED, tag=def_tag)
+        if bool(def_entry.takes_value) != bool(placeholder):
+            return ErrorHandler.format_error(OnsetErrors.ONSET_PLACEHOLDER_WRONG, tag=def_tag,
+                                             has_placeholder=bool(def_entry.takes_value))
+
+        if is_onset:
+            # onset can never fail as it implies an offset
+            self._onsets[full_def_name.lower()] = full_def_name
+        else:
+            if full_def_name.lower() not in self._onsets:
+                return ErrorHandler.format_error(OnsetErrors.OFFSET_BEFORE_ONSET, tag=def_tag)
+            else:
+                del self._onsets[full_def_name.lower()]
+
+        return []
+
+    def __get_string_funcs__(self, **kwargs):
+        string_funcs = []
+        string_funcs.append(self.check_for_onset_offset)
+        return string_funcs
+
+    def __get_tag_funcs__(self, **kwargs):
+        return []
diff --git a/hed/models/sidecar.py b/hed/models/sidecar.py
index 0ae90b49f..def2c5cae 100644
--- a/hed/models/sidecar.py
+++ b/hed/models/sidecar.py
@@ -14,17 +14,17 @@ class Sidecar(SidecarBase):
 
     """
 
-    def __init__(self, files, name=None):
+    def __init__(self, files, name=None, hed_schema=None):
         """ Construct a Sidecar object representing a JSON file.
 
         Args:
             files (str or FileLike or list): A string or file-like object representing a JSON file, or a list of such.
             name (str or None): Optional name identifying this sidecar, generally a filename.
-
+            hed_schema(HedSchema or None): The schema to use by default in identifying tags
         """
-        super().__init__(name)
+        super().__init__(name, hed_schema=hed_schema)
         self.loaded_dict = self.load_sidecar_files(files)
-        self.def_dict = self.extract_definitions()
+        self.def_dict = self.extract_definitions(hed_schema)
 
     @property
     def column_data(self):
diff --git a/hed/models/sidecar_base.py b/hed/models/sidecar_base.py
index 4fcade309..a182070fe 100644
--- a/hed/models/sidecar_base.py
+++ b/hed/models/sidecar_base.py
@@ -20,14 +20,15 @@ class SidecarBase:
         column_data property <- This is the only truly mandatory one
 
     """
-    def __init__(self, name=None):
+    def __init__(self, name=None, hed_schema=None):
         """ Initialize a sidecar baseclass
 
         Args:
             name (str or None): Optional name identifying this sidecar, generally a filename.
-
+            hed_schema(HedSchema or None): The schema to use by default in identifying tags
         """
         self.name = name
+        self._schema = hed_schema
         # Expected to be called in subclass after data is loaded
         # self.def_dict = self.extract_definitions()
 
@@ -110,9 +111,9 @@ def hed_string_iter(self, hed_ops=None, error_handler=None, expand_defs=False, r
         hed_ops = self._standardize_ops(hed_ops)
         if expand_defs or remove_definitions:
             self._add_definition_mapper(hed_ops, extra_def_dicts)
-        tag_funcs = translate_ops(hed_ops, error_handler=error_handler, expand_defs=expand_defs,
-                                  allow_placeholders=allow_placeholders, remove_definitions=remove_definitions,
-                                  **kwargs)
+        tag_funcs = translate_ops(hed_ops, hed_schema=self._schema, error_handler=error_handler,
+                                  expand_defs=expand_defs, allow_placeholders=allow_placeholders,
+                                  remove_definitions=remove_definitions, **kwargs)
 
         return self._hed_string_iter(tag_funcs, error_handler)
 
@@ -217,12 +218,12 @@ def validate_entries(self, hed_ops=None, name=None, extra_def_dicts=None,
             error_handler.pop_error_context()
         return all_validation_issues
 
-    def extract_definitions(self, error_handler=None):
+    def extract_definitions(self, hed_schema=None, error_handler=None):
         """ Gather and validate definitions in metadata.
 
         Args:
             error_handler (ErrorHandler): The error handler to use for context, uses a default one if None.
-
+            hed_schema(HedSchema or None): The schema to used to identify tags
         Returns:
             DefinitionDict: Contains all the definitions located in the column.
             issues: List of issues encountered in extracting the definitions. Each issue is a dictionary.
@@ -232,6 +233,7 @@ def extract_definitions(self, error_handler=None):
             error_handler = ErrorHandler()
         new_def_dict = DefinitionDict()
         hed_ops = []
+        hed_ops.append(hed_schema)
         hed_ops.append(new_def_dict)
 
         all_issues = []
diff --git a/hed/models/spreadsheet_input.py b/hed/models/spreadsheet_input.py
index 0f364c462..3e663838c 100644
--- a/hed/models/spreadsheet_input.py
+++ b/hed/models/spreadsheet_input.py
@@ -8,7 +8,7 @@ class SpreadsheetInput(BaseInput):
 
     def __init__(self, file=None, file_type=None, worksheet_name=None, tag_columns=None,
                  has_column_names=True, column_prefix_dictionary=None,
-                 def_dicts=None, name=None):
+                 def_dicts=None, name=None, hed_schema=None):
         """Constructor for the SpreadsheetInput class.
 
         Args:
@@ -23,7 +23,7 @@ def __init__(self, file=None, file_type=None, worksheet_name=None, tag_columns=N
             column_prefix_dictionary (dict): A dictionary with column number keys and prefix values.
             def_dicts (DefinitionDict or list):  A DefinitionDict or list of DefDicts containing definitions for this
                 object other than the ones extracted from the SpreadsheetInput object itself.
-
+            hed_schema(HedSchema or None): The schema to use by default in identifying tags
         Examples:
             A prefix dictionary {3: 'Label/', 5: 'Description/'} indicates that column 3 and 5 have HED tags
             that need to be prefixed by Label/ and Description/ respectively.
@@ -41,4 +41,4 @@ def __init__(self, file=None, file_type=None, worksheet_name=None, tag_columns=N
         def_mapper = DefMapper(def_dicts)
 
         super().__init__(file, file_type, worksheet_name, has_column_names, new_mapper, def_mapper=def_mapper,
-                         name=name)
+                         name=name, hed_schema=hed_schema)
diff --git a/hed/models/tabular_input.py b/hed/models/tabular_input.py
index 6b12693dd..e29245d8e 100644
--- a/hed/models/tabular_input.py
+++ b/hed/models/tabular_input.py
@@ -9,8 +9,9 @@ class TabularInput(BaseInput):
 
     HED_COLUMN_NAME = "HED"
 
-    def __init__(self, file=None, sidecar=None, extra_def_dicts=None,
-                 also_gather_defs=True, name=None):
+    def __init__(self, file=None, sidecar=None, extra_def_dicts=None, also_gather_defs=True, name=None,
+                 hed_schema=None):
+
         """ Constructor for the TabularInput class.
 
         Args:
@@ -20,10 +21,8 @@ def __init__(self, file=None, sidecar=None, extra_def_dicts=None,
                 the definitions this file should use other than the ones coming from the file
                 itself and from the sidecar.  These are added as the last entries, so names will override
                 earlier ones.
-            also_gather_defs (bool): If False, do NOT extract any definitions from column groups,
-                assume they are already in the def_dict list.
             name (str): The name to display for this file for error purposes.
-
+            hed_schema(HedSchema or None): The schema to use by default in identifying tags
         """
         if sidecar and not isinstance(sidecar, Sidecar):
             sidecar = Sidecar(sidecar)
@@ -33,23 +32,25 @@ def __init__(self, file=None, sidecar=None, extra_def_dicts=None,
         definition_columns = [self.HED_COLUMN_NAME]
         self._sidecar = sidecar
         self._also_gather_defs = also_gather_defs
+        if extra_def_dicts and not isinstance(extra_def_dicts, list):
+            extra_def_dicts = [extra_def_dicts]
         self._extra_def_dicts = extra_def_dicts
-        def_mapper = self.create_def_mapper(new_mapper, extra_def_dicts)
+        def_mapper = self.create_def_mapper(new_mapper)
 
         super().__init__(file, file_type=".tsv", worksheet_name=None, has_column_names=True, mapper=new_mapper,
                          def_mapper=def_mapper, name=name, definition_columns=definition_columns,
-                         allow_blank_names=False)
+                         allow_blank_names=False, hed_schema=hed_schema)
 
         if not self._has_column_names:
             raise ValueError("You are attempting to open a bids_old style file with no column headers provided.\n"
                              "This is probably not intended.")
 
-    def create_def_mapper(self, column_mapper, extra_def_dicts=None):
+    def create_def_mapper(self, column_mapper):
         """ Create the definition mapper for this file.
 
         Args:
             column_mapper (ColumnMapper): The column mapper to gather definitions from.
-            extra_def_dicts (DefinitionDict or [DefinitionDict]): Additional definitions to add to mapper.
+
 
         Returns:
             def mapper (DefMapper): A class to validate or expand definitions with the given def dicts.
@@ -58,14 +59,10 @@ def mapper (DefMapper): A class to validate or expand definitions with the given
             - The extra_def_dicts are definitions not included in the column mapper.
 
         """
-        def_dicts = []
-        if self._also_gather_defs:
-            def_dicts = column_mapper.get_def_dicts()
 
-        if extra_def_dicts and not isinstance(extra_def_dicts, list):
-            extra_def_dicts = [extra_def_dicts]
-        if extra_def_dicts:
-            def_dicts += extra_def_dicts
+        def_dicts = column_mapper.get_def_dicts()
+        if self._extra_def_dicts:
+            def_dicts += self._extra_def_dicts
         def_mapper = DefMapper(def_dicts)
 
         return def_mapper
@@ -79,14 +76,14 @@ def reset_column_mapper(self, sidecar=None):
         """
         new_mapper = ColumnMapper(sidecar=sidecar, optional_tag_columns=[self.HED_COLUMN_NAME])
 
-        self._def_mapper = self.create_def_mapper(new_mapper, self._extra_def_dicts)
+        self._def_mapper = self.create_def_mapper(new_mapper)
         self.reset_mapper(new_mapper)
 
-    def validate_file_sidecars(self, hed_ops=None, error_handler=None, **kwargs):
+    def validate_sidecar(self, hed_ops=None, error_handler=None, **kwargs):
         """ Validate column definitions and hed strings.
 
         Args:
-            hed_ops (list): A list of HedOps of funcs to apply to the hed strings in the sidecars.
+            hed_ops (list or HedOps): A list of HedOps of funcs to apply to the hed strings in the sidecars.
             error_handler (ErrorHandler or None): Used to report errors.  Uses a default one if none passed in.
             kwargs: See models.hed_ops.translate_ops or the specific hed_ops for additional options.
 
diff --git a/hed/schema/hed_cache.py b/hed/schema/hed_cache.py
index a956689c4..975fece65 100644
--- a/hed/schema/hed_cache.py
+++ b/hed/schema/hed_cache.py
@@ -1,4 +1,4 @@
-""" Infrastructure for caching HED schema. """
+"""Infrastructure for caching HED schema from remote repositories."""
 
 import os
 import urllib.request
@@ -11,8 +11,7 @@
 import portalocker
 import time
 from hed.schema.schema_io.schema_util import url_to_file
-
-"""Infrastructure for caching HED schema from remote repositories."""
+from pathlib import Path
 
 # From https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string
 HED_VERSION_P1 = r"(?P<major>0|[1-9]\d*)\.(?P<minor>0|[1-9]\d*)\.(?P<patch>0|[1-9]\d*)"
@@ -33,7 +32,7 @@
 
 DEFAULT_SKIP_FOLDERS = ('deprecated', )
 
-HED_CACHE_DIRECTORY = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../validator/hed_cache/')
+HED_CACHE_DIRECTORY = os.path.join(Path.home(), '.hedtools/hed_cache/')
 TIMESTAMP_FILENAME = "last_update.txt"
 CACHE_TIME_THRESHOLD = 300 * 6
 
diff --git a/hed/tools/__init__.py b/hed/tools/__init__.py
index 4fb730f59..c82a9422a 100644
--- a/hed/tools/__init__.py
+++ b/hed/tools/__init__.py
@@ -1,8 +1,14 @@
 """ HED tools for analysis and summarization. """
 
-
+from .analysis.hed_variable_manager import HedVariableManager
+from .analysis.hed_type_variable import HedTypeVariable
+from .analysis.hed_type_factors import HedTypeFactors
+from .analysis.hed_variable_summary import HedVariableCounts, HedVariableSummary
+from .analysis.hed_definition_manager import HedDefinitionManager
 from .analysis.file_dictionary import FileDictionary
 from .analysis.key_map import KeyMap
+from .analysis.hed_context_manager import OnsetGroup, HedContextManager
+from .analysis.tabular_summary import TabularSummary
 from .analysis.tag_summary import TagSummary
 from .analysis.annotation_util import \
     check_df_columns, extract_tags, generate_sidecar_entry, hed_to_df, df_to_hed, merge_hed_dict
@@ -16,8 +22,9 @@
 from .bids.bids_sidecar_file import BidsSidecarFile
 from .bids.bids_tabular_dictionary import BidsTabularDictionary
 from .bids.bids_tabular_file import BidsTabularFile
-from .bids.bids_tabular_summary import BidsTabularSummary
 
-from hed.tools.analysis.tabular_reports import report_diffs
+from .util.hed_logger import HedLogger
+from .util.data_util import get_new_dataframe, get_value_dict, replace_values, reorder_columns
+from .util.io_util import check_filename, generate_filename, extract_suffix_path, get_file_list, make_path
+from .util.io_util import get_dir_dictionary, get_file_list, get_path_components, parse_bids_filename
 
-from .hed_logger import HedLogger
diff --git a/hed/tools/analysis/analysis_util.py b/hed/tools/analysis/analysis_util.py
index 15800c62b..af336182e 100644
--- a/hed/tools/analysis/analysis_util.py
+++ b/hed/tools/analysis/analysis_util.py
@@ -1,7 +1,7 @@
 """ Utilities for downstream analysis such as searching. """
 
 import pandas as pd
-from hed.models import DefinitionDict, TabularInput, TagExpressionParser
+from hed.models import TabularInput, TagExpressionParser
 
 
 def assemble_hed(data_input, columns_included=None, expand_defs=False):
@@ -24,13 +24,14 @@ def assemble_hed(data_input, columns_included=None, expand_defs=False):
     else:
         eligible_columns = None
 
-    hed_obj_list, definitions = get_assembled_strings(data_input, expand_defs=expand_defs)
+    hed_obj_list = get_assembled_strings(data_input, expand_defs=expand_defs)
     hed_string_list = [str(hed) for hed in hed_obj_list]
     if not eligible_columns:
         df = pd.DataFrame({"HED_assembled": hed_string_list})
     else:
         df = data_input.dataframe[eligible_columns].copy(deep=True)
         df['HED_assembled'] = hed_string_list
+    definitions = data_input.get_definitions().gathered_defs
     return df, definitions
 
 
@@ -44,13 +45,11 @@ def get_assembled_strings(table, hed_schema=None, expand_defs=False):
 
     Returns:
         list: A list of HedString or HedStringGroup objects.
-        dict: A dictionary of definitions for this table.
 
     """
     hed_list = list(table.iter_dataframe(hed_ops=[hed_schema], return_string_only=True,
                                          expand_defs=expand_defs, remove_definitions=True))
-    definitions = DefinitionDict.get_as_strings(table._def_mapper.gathered_defs)
-    return hed_list, definitions
+    return hed_list
 
 
 def search_tabular(data_input, hed_schema, query, columns_included=None):
@@ -59,7 +58,7 @@ def search_tabular(data_input, hed_schema, query, columns_included=None):
     Args:
         data_input (TabularInput): The tabular input file (e.g., events) to be searched.
         hed_schema (HedSchema or HedSchemaGroup):  The schema(s) under which to make the query.
-        query (str):     The str query to make.
+        query (str or list):     The str query or list of string queries to make.
         columns_included (list or None):  List of names of columns to include
 
     Returns:
@@ -72,7 +71,7 @@ def search_tabular(data_input, hed_schema, query, columns_included=None):
     else:
         eligible_columns = None
 
-    hed_list, dictionary = get_assembled_strings(data_input, hed_schema=hed_schema, expand_defs=True)
+    hed_list = get_assembled_strings(data_input, hed_schema=hed_schema, expand_defs=True)
     expression = TagExpressionParser(query)
     hed_tags = []
     row_numbers = []
@@ -103,8 +102,8 @@ def search_tabular(data_input, hed_schema, query, columns_included=None):
     sidecar = Sidecar(json_path, name='face_sub1_json')
     input_data = TabularInput(events_path, sidecar=sidecar, name="face_sub1_events")
     hed_schema1 = load_schema_version(xml_version="8.1.0")
-    # query1 = "Sensory-event"
-    # df3 = search_tabular(input_data, hed_schema1, query1, columns_included=['onset', 'event_type'])
-    #
-    # print(f"{len(df3)} events match")
+    query1 = "Sensory-event"
+    df3 = search_tabular(input_data, hed_schema1, query1, columns_included=['onset', 'event_type'])
+
+    print(f"{len(df3)} events match")
     df1, defs = assemble_hed(input_data, columns_included=None, expand_defs=False)
diff --git a/hed/tools/analysis/file_dictionary.py b/hed/tools/analysis/file_dictionary.py
index ef0a0da8e..1df1b714f 100644
--- a/hed/tools/analysis/file_dictionary.py
+++ b/hed/tools/analysis/file_dictionary.py
@@ -32,7 +32,7 @@ def __init__(self, collection_name, file_list, key_indices=(0, 2), separator='_'
 
         """
         self.collection_name = collection_name
-        self.file_dict = {}
+        self._file_dict = {}
         self.create_file_dict(file_list, key_indices, separator)
 
     @property
@@ -43,12 +43,17 @@ def name(self):
     @property
     def key_list(self):
         """ Keys in this dictionary. """
-        return list(self.file_dict.keys())
+        return list(self._file_dict.keys())
+
+    @property
+    def file_dict(self):
+        """ Dictionary of path values in this dictionary. """
+        return self._file_dict
 
     @property
     def file_list(self):
         """ List of path values in this dictionary. """
-        return list(self.file_dict.values())
+        return list(self._file_dict.values())
 
     def create_file_dict(self, file_list, key_indices, separator):
         """ Create new dict based on key indices.
@@ -60,7 +65,7 @@ def create_file_dict(self, file_list, key_indices, separator):
 
         """
         if key_indices:
-            self.file_dict = self.make_file_dict(file_list, key_indices=key_indices, separator=separator)
+            self._file_dict = self.make_file_dict(file_list, key_indices=key_indices, separator=separator)
 
     def get_file_path(self, key):
         """ Return file path corresponding to key.
@@ -72,7 +77,7 @@ def get_file_path(self, key):
             str: File path.
 
         """
-        return self.file_dict.get(key, None)
+        return self._file_dict.get(key, None)
 
     def iter_files(self):
         """ Iterator over the files in this dictionary.
@@ -82,7 +87,7 @@ def iter_files(self):
             - file: File path.
 
         """
-        for key, file in self.file_dict.items():
+        for key, file in self._file_dict.items():
             yield key, file
 
     def key_diffs(self, other_dict):
@@ -95,7 +100,7 @@ def key_diffs(self, other_dict):
             list: The symmetric difference of the keys in this dictionary and the other one.
 
         """
-        diffs = set(self.file_dict.keys()).symmetric_difference(set(other_dict.file_dict.keys()))
+        diffs = set(self._file_dict.keys()).symmetric_difference(set(other_dict._file_dict.keys()))
         return list(diffs)
 
     def output_files(self, title=None, logger=None):
@@ -115,7 +120,7 @@ def output_files(self, title=None, logger=None):
         output_list = []
         if title:
             output_list.append(f"{title} ({len(self.key_list)} files)")
-        for key, value in self.file_dict.items():
+        for key, value in self._file_dict.items():
             basename = os.path.basename(self.get_file_path(key))
             output_list.append(f"{key}: {basename}")
             if logger:
diff --git a/hed/tools/analysis/hed_context_manager.py b/hed/tools/analysis/hed_context_manager.py
new file mode 100644
index 000000000..bf794bec8
--- /dev/null
+++ b/hed/tools/analysis/hed_context_manager.py
@@ -0,0 +1,154 @@
+from hed.errors import HedFileError
+from hed.schema import load_schema_version
+
+
+class OnsetGroup:
+    def __init__(self, name, start_index, end_index=None, contents=None):
+        self.name = name
+        self.start_index = start_index
+        self.end_index = end_index
+        self.contents = contents
+
+    def __str__(self):
+        return f"{self.name}:[{self.start_index}, {self.end_index}] contents {str(self.contents)}"
+
+
+class HedContextManager:
+
+    def __init__(self, hed_strings, hed_schema):
+        """ Create an onset manager for an events file.
+
+        Args:
+            hed_strings (list): A list of hed_strings to be managed.
+            hed_schema (HedSchema or HedSchemaGroup): The HED schema to use.
+
+        Raises:
+            HedFileError: if there are any unmatched offsets.
+
+        """
+
+        self.hed_schema = hed_schema
+        self.hed_strings = hed_strings
+        self.onset_list = []
+        self.contexts = []
+        self._create_onset_list()
+        self._set_event_contexts()
+
+    def _create_onset_list(self):
+        """ Create a list of events of extended duration.
+
+        Raises:
+            HedFileError if the hed_strings contain unmatched offsets.
+
+        """
+
+        self.onset_list = []
+        onset_dict = {}
+        for event_index, hed in enumerate(self.hed_strings):
+            to_remove = []  # tag_tuples = hed.find_tags(['Onset'], recursive=False, include_groups=1)
+            onset_tuples = hed.find_tags(["onset"], recursive=True, include_groups=2)
+            for tup in onset_tuples:
+                group = tup[1]
+                group.remove([tup[0]])
+                self._update_onset_list(group, onset_dict, event_index, is_offset=False)
+            offset_tuples = hed.find_tags(["offset"], recursive=True, include_groups=2)
+            for tup in offset_tuples:
+                group = tup[1]
+                to_remove.append(group)
+                self._update_onset_list(group, onset_dict, event_index, is_offset=True)
+            hed.remove(to_remove)
+
+        # Now handle the events that extend to end of list
+        for key, value in onset_dict.items():
+            value.end_index = len(self.hed_strings)
+            self.onset_list.append(value)
+
+    def _set_event_contexts(self):
+        """ Creates an event context for each hed string.
+
+        Notes:
+            The event context would be placed in a event context group, but is kept in a separate array without the
+            event context group or tag.
+
+        """
+        contexts = [0]*len(self.hed_strings)
+        for i in range(len(self.hed_strings)):
+            contexts[i] = []
+        for onset in self.onset_list:
+            for i in range(onset.start_index+1, onset.end_index):
+                contexts[i].append(onset.contents)
+        self.contexts = contexts
+
+    @staticmethod
+    def hed_list_to_string(hed_list):
+        hed_strs = []
+        for hed in hed_list:
+            hed_str = hed._hed_string[hed._startpos:hed._endpos]
+            if hed_str:
+                hed_strs.append(hed_str)
+        hed_str_final = ",".join(hed_strs)
+        return hed_str_final
+
+    def _update_onset_list(self, group, onset_dict, event_index, is_offset=False):
+        """ Process one onset or offset group to create onset_list.
+
+        Args:
+            group (HedGroup):  The HedGroup containing the onset or offset.
+            onset_dict (dict): A dictionary of OnsetGroup objects that keep track of span of an event.
+            event_index (int): The event number in the list.
+            is_offset (bool):  True if processing an offset.
+
+        Raises:
+            HedFileError if an unmatched offset is encountered.
+
+        Notes:
+            - Modifies onset_dict and onset_list.
+        """
+        def_tags = group.find_def_tags(recursive=False, include_groups=0)
+        name = def_tags[0].extension_or_value_portion
+        onset_element = onset_dict.pop(name, None)
+        if onset_element:
+            onset_element.end_index = event_index
+            self.onset_list.append(onset_element)
+        elif is_offset:
+            raise HedFileError("Unmatched offset", f"Unmatched {name} offset at event {event_index}", " ")
+        if not is_offset:
+            onset_element = OnsetGroup(name, event_index, contents=group)
+            onset_dict[name] = onset_element
+
+
+if __name__ == '__main__':
+    from hed import HedString
+    schema = load_schema_version(xml_version="8.1.0")
+    test_strings1 = [HedString('Sensory-event,(Def/Cond1,(Red, Blue),Onset),(Def/Cond2,Onset),Green,Yellow',
+                               hed_schema=schema),
+                     HedString('Yellow, Green', hed_schema=schema),
+                     HedString('(Def/Cond1, Offset)', hed_schema=schema),
+                     HedString('White, Black, Condition-variable/Wonder, Condition-variable/Fast', hed_schema=schema),
+                     HedString('', hed_schema=schema),
+                     HedString('(Def/Cond2, Onset)', hed_schema=schema),
+                     HedString('(Def/Cond3/4.3, Onset)', hed_schema=schema),
+                     HedString('Arm, Leg, Condition-variable/Fast', hed_schema=schema)]
+
+    manager = HedContextManager(test_strings1, schema)
+    print("to here")
+    # hed_list1 = [HedString('Yellow, Green', hed_schema=schema),
+    #             HedString('(Def/Cond1, Offset)', hed_schema=schema),
+    #             HedString('White, Black, Condition-variable/Wonder, Condition-variable/Fast', hed_schema=schema),
+    #             HedString('', hed_schema=schema),
+    #             HedString('Blue', hed_schema=schema)]
+    #
+    #
+    # str_result1 = HedContextManager.hed_list_to_string(hed_list1)
+    # print(str_result1)
+    #
+    # big = HedString('Sensory-event,(Def/Cond1,(Red, Blue),Onset),(Def/Cond2,Onset),Green,Yellow', hed_schema=schema)
+    #
+    # big_result = Onset
+    #
+    # # big_groups = big.get_all_groups(also_return_depth=True)
+    # # for group, depth in big_groups:
+    # #     print(f"{group}: {depth}")
+    # # these_groups = [group for group, depth in big_groups if depth]
+    # # str_result2 = HedContextManager.hed_list_to_string(these_groups)
+    # # print(str_result2)
diff --git a/hed/tools/analysis/hed_definition_manager.py b/hed/tools/analysis/hed_definition_manager.py
new file mode 100644
index 000000000..6f12f0640
--- /dev/null
+++ b/hed/tools/analysis/hed_definition_manager.py
@@ -0,0 +1,180 @@
+from hed.schema import load_schema_version
+from hed.models import HedString, HedTag, DefinitionEntry, DefMapper
+from hed.tools.analysis.hed_context_manager import HedContextManager
+
+
+class HedDefinitionManager:
+
+    def __init__(self, definitions, hed_schema, variable_type='condition-variable'):
+        """ Create a definition manager for a type of variable.
+
+        Args:
+            definitions (dict or DefMapper): A dictionary of DefinitionEntry objects.
+            hed_schema (Hedschema or HedSchemaGroup): The schema used for parsing.
+            variable_type (str): Lower-case string giving the type of HED variable.
+
+        """
+
+        self.variable_type = variable_type.lower()
+        self.hed_schema = hed_schema
+        if isinstance(definitions, DefMapper):
+            self.definitions = definitions.gathered_defs
+        elif isinstance(definitions, dict):
+            self.definitions = definitions
+        else:
+            self.definitions = {}
+        self.variable_map = {}   # maps def names to conditions.
+        self._extract_variable_map()
+
+    def get_vars(self, item):
+        """ Return a list of type_variables in item.
+
+        Args:
+            item (HedTag, HedGroup, or HedString): An item potentially containing def tags.
+
+        Returns:
+            list:
+
+        """
+        def_names = self.get_def_names(item, no_value=True)
+        var_list = []
+        for def_name in def_names:
+            hed_vars = self.variable_map.get(def_name.lower(), None)
+            if hed_vars:
+                var_list = var_list + hed_vars
+        return var_list
+
+    def _extract_variable_map(self):
+        """ Extract all of the type_variables associated with each definition and add them to the dictionary. """
+        self.variable_map = {}
+        for entry in self.definitions.values():
+            self.variable_map[entry.name.lower()] = self._extract_from_entry(entry)
+
+    def _extract_from_entry(self, entry):
+        """ Extract a list of type_variables associated with a definition.
+
+        Args:
+            entry (DictionaryEntry): A definition entry to be processed.
+
+        Returns:
+            A list of type_variables associated with this definition.
+
+
+        """
+        tag_list = entry.contents.get_all_tags()
+        hed_vars = []
+        for hed_tag in tag_list:
+            hed_tag.convert_to_canonical_forms(self.hed_schema)
+            if hed_tag.short_base_tag.lower() != self.variable_type:
+                continue
+            value = hed_tag.extension_or_value_portion.lower()
+            if value:
+                hed_vars.append(value)
+            else:
+                hed_vars.append(entry.name)
+        return hed_vars
+
+    @staticmethod
+    def get_def_names(item, no_value=True):
+        """ Return a list of Def values in item.
+
+        Args:
+            item (HedTag, HedGroup, or HedString): An item containing a def tag.
+            no_value (bool):  If True, strip off extra values after the definition name.
+
+        Returns:
+            list:  A list of definition names (as strings).
+
+        """
+        if isinstance(item, HedTag) and 'def' in item.tag_terms:
+            names = [item.extension_or_value_portion.lower()]
+        else:
+            names = [tag.extension_or_value_portion.lower() for tag in item.get_all_tags() if 'def' in tag.tag_terms]
+        if no_value:
+            for index, name in enumerate(names):
+                name, name_value = HedDefinitionManager.split_name(name)
+                names[index] = name
+        return names
+
+    @staticmethod
+    def split_name(name, lowercase=True):
+        """ Split a name/# or name/x into name, x.
+
+        Args:
+            name (str):  The extension or value portion of a tag
+            lowercase (bool): If True
+
+        Returns:
+            tuple:  (name, value)
+
+        """
+        if not name:
+            return None, None
+        parts = name.split('/', 1)
+        def_name = parts[0]
+        def_value = ''
+        if len(parts) > 1:
+            def_value = parts[1]
+        if lowercase:
+            return def_name.lower(), def_value.lower()
+        else:
+            return def_name, def_value
+
+    @staticmethod
+    def remove_defs(hed_strings):
+        """ This removes any def or Def-expand from a list of HedStrings.
+
+        Args:
+            hed_strings (list):  A list of HedStrings
+
+        Returns:
+            list: A list of the removed Defs.
+
+        """
+        def_groups = [0] * len(hed_strings)
+        for i in range(len(hed_strings)):
+            def_groups[i] = []
+        for i, hed in enumerate(hed_strings):
+            def_groups[i] = HedDefinitionManager.extract_defs(hed)
+        return def_groups
+
+    @staticmethod
+    def extract_defs(hed):
+        to_remove = []
+        to_append = []
+        tups = hed.find_def_tags(recursive=True, include_groups=3)
+        for tup in tups:
+            if len(tup[2].children) == 1:
+                to_append.append(tup[0])
+            else:
+                to_append.append(tup[2])
+            to_remove.append(tup[2])
+        hed.remove(to_remove)
+        return to_append
+
+
+if __name__ == '__main__':
+    schema = load_schema_version(xml_version="8.1.0")
+    test_strings1 = [HedString(f"Sensory-event,(Def/Cond1,(Red, Blue, Condition-variable/Trouble),Onset),"
+                               f"(Def/Cond2,Onset),Green,Yellow, Def/Cond5, Def/Cond6/4", hed_schema=schema),
+                     HedString('(Def/Cond1, Offset)', hed_schema=schema),
+                     HedString('White, Black, Condition-variable/Wonder, Condition-variable/Fast', hed_schema=schema),
+                     HedString('', hed_schema=schema),
+                     HedString('(Def/Cond2, Onset)', hed_schema=schema),
+                     HedString('(Def/Cond3/4.3, Onset)', hed_schema=schema),
+                     HedString('Arm, Leg, Condition-variable/Fast', hed_schema=schema)]
+
+    onset_man = HedContextManager(test_strings1, schema)
+    def1 = HedString('(Condition-variable/Var1, Circle, Square)', hed_schema=schema)
+    def2 = HedString('(condition-variable/Var2, Condition-variable/Apple, Triangle, Sphere)', hed_schema=schema)
+    def3 = HedString('(Organizational-property/Condition-variable/Var3, Physical-length/#, Ellipse, Cross)',
+                     hed_schema=schema)
+    def4 = HedString('(Condition-variable, Apple, Banana)', hed_schema=schema)
+    definitions = {'cond1': DefinitionEntry('Cond1', def1, False, None),
+                   'cond2': DefinitionEntry('Cond2', def2, False, None),
+                   'cond3': DefinitionEntry('Cond3', def3, True, None),
+                   'cond4': DefinitionEntry('Cond4', def4, False, None)}
+    def_man = HedDefinitionManager(definitions, schema)
+    a = def_man.get_def_names(HedTag('Def/Cond3/4', hed_schema=schema))
+    b = def_man.get_def_names(HedString('(Def/Cond3/5,(Red, Blue))', hed_schema=schema))
+    c = def_man.get_def_names(HedString('(Def/Cond3/6,(Red, Blue, Def/Cond1), Def/Cond2)', hed_schema=schema))
diff --git a/hed/tools/analysis/hed_filters.py b/hed/tools/analysis/hed_filters.py
new file mode 100644
index 000000000..d7ee64fe0
--- /dev/null
+++ b/hed/tools/analysis/hed_filters.py
@@ -0,0 +1,152 @@
+from hed.errors import get_printable_issue_string
+
+
+class StringOp:
+    def __init__(self, filter_name):
+        self.filter_name = filter_name
+
+    def do_op(self):
+        pass
+
+
+class CollapseDefs(StringOp):
+
+    def __init__(self, def_mapper):
+        super().__init__("collapse_defs")
+        self.def_mapper = def_mapper
+
+    def do_op(self, hed_string):
+        issues = self.def_mapper.expand_def_tags(self, hed_string, expand_defs=False, shrink_defs=True)
+        if issues:
+            error_string = get_printable_issue_string(issues)
+            raise ValueError("BadDefExpand", f"Collapse definitions failed {error_string}")
+
+
+class ExpandDefs(StringOp):
+
+    def __init__(self, def_mapper):
+        super().__init__("collapse_defs")
+        self.def_mapper = def_mapper
+
+    def do_op(self, hed_string):
+        issues = self.def_mapper.expand_def_tags(self, hed_string, expand_defs=True, shrink_defs=False)
+        if issues:
+            error_string = get_printable_issue_string(issues)
+            raise ValueError("BadDefExpand", f"Collapse definitions failed {error_string}")
+
+
+class RemoveTagsFilter(StringOp):
+
+    def __init__(self, tag_names, remove_option="both"):
+        super().__init__("remove_tags")
+        self.tag_names = [tag_name.lower() for tag_name in tag_names]
+        self.remove_option = remove_option
+
+    def get_string_funcs(self, **kwargs):
+        string_funcs = [self.remove_tags]
+        return string_funcs
+
+    def remove_tags(self, hed_string):
+        remove_tuples = hed_string.find_tags(self.tag_names, recursive=True, include_groups=2)
+        if self.remove_option=="group" or self.remove_option=="all":
+            remove_list = [tuple[1] for tuple in remove_tuples]
+            hed_string.remove(remove_list)
+        if self.remove_option=="tag" or self.remove_option=="all":
+            remove_list = [tuple[0] for tuple in remove_tuples]
+            hed_string.remove(remove_list)
+        return True
+
+
+class RemoveTypeFilter(StringOp):
+
+    def __init__(self, type_name, type_values, def_values):
+        super().__init__("remove_type")
+        self.type_name = type_name
+        self.type_values = type_values
+        self.def_values = def_values
+
+    def get_string_funcs(self, **kwargs):
+        string_funcs = [self.remove_type_values]
+        return string_funcs
+
+    def remove_type_values(self, hed_string):
+        remove_tags = hed_string.find_tags(self.tag_names, recursive=True, include_groups=0)
+        if remove_tags:
+            hed_string.remove(remove_tags)
+
+
+class HedFilters(StringOp):
+
+    def __init__(self, name, filters, **kwargs):
+        super().__init__(name)
+        self._filters = filters
+        self._tag_funcs = self.get_tag_funcs(**kwargs)
+        self._string_funcs = self.get_string_funcs(**kwargs)
+        self._data_funcs = self.get_data_funcs(**kwargs)
+
+    def get_string_funcs(self, **kwargs):
+        string_funcs = []
+        for filter in self._filters:
+            string_funcs = string_funcs + filter.get_string_funcs(**kwargs)
+        return string_funcs
+
+    def apply_ops(self, hed_thing):
+        if isinstance(hed_thing, HedString):
+            for func in self._string_funcs:
+                ret_val = func(hed_string)
+
+
+if __name__ == '__main__':
+    import os
+    import json
+    from hed.tools.analysis.hed_variable_manager import HedVariableManager
+    from hed.schema import load_schema_version
+    from hed.models import HedString, DefinitionEntry, TabularInput, Sidecar
+    from hed.tools.analysis.analysis_util import get_assembled_strings
+    hed_schema = load_schema_version(xml_version="8.1.0")
+    hed_string = HedString('Def/Cond1, Sensory-event, (Def/Cond2, Onset), Item, (Item, Blue), (Green, (Move, Item))', hed_schema=hed_schema)
+
+    y = hed_string.lower()
+    print(f"Before: {str(hed_string)}")
+    if "def" in y:
+        print("to here")
+    # filter1 =  RemoveFilter(['Item'], remove_option="all")
+    # filters = HedFilters('test_filters', [filter1])
+    # filters.__apply_ops__(hed_string)
+    # print(f"After: {str(hed_string)}")
+    print("to here")
+    test_strings1 = [f"Sensory-event,(Def/Cond1,(Red, Blue, Condition-variable/Trouble),Onset),"
+                     f"(Def/Cond2,Onset),Green,Yellow, Def/Cond5, Def/Cond6/4",
+                     '(Def/Cond1, Offset)',
+                     'White, Black, Condition-variable/Wonder, Condition-variable/Fast',
+                     '',
+                     '(Def/Cond2, Onset)',
+                     '(Def/Cond3/4.3, Onset)',
+                     'Arm, Leg, Condition-variable/Fast']
+    def1 = HedString('(Condition-variable/Var1, Circle, Square)', hed_schema=hed_schema)
+    def2 = HedString('(condition-variable/Var2, Condition-variable/Apple, Triangle, Sphere)', hed_schema=hed_schema)
+    def3 = HedString('(Organizational-property/Condition-variable/Var3, Physical-length/#, Ellipse, Cross)',
+                     hed_schema=hed_schema)
+    def4 = HedString('(Condition-variable, Apple, Banana)', hed_schema=hed_schema)
+    def5 = HedString('(Condition-variable/Lumber, Apple, Banana)', hed_schema=hed_schema)
+    def6 = HedString('(Condition-variable/Lumber, Label/#, Apple, Banana)', hed_schema=hed_schema)
+    defs = {
+        'Cond1': DefinitionEntry('Cond1', def1, False, None),
+        'Cond2': DefinitionEntry('Cond2', def2, False, None),
+        'Cond3': DefinitionEntry('Cond3', def3, True, None),
+        'Cond4': DefinitionEntry('Cond4', def4, False, None),
+        'Cond5': DefinitionEntry('Cond5', def5, False, None),
+        'Cond6': DefinitionEntry('Cond6', def6, True, None)
+    }
+
+    test_objs1 = [HedString(hed, hed_schema=hed_schema) for hed in test_strings1]
+    var_manager = HedVariableManager(test_objs1, hed_schema, defs)
+    remove_strings = var_manager.get_variable_tags()
+    print(f"Remove strings {str(remove_strings)}")
+    filter1 = RemoveTypeFilter(remove_strings, remove_option="all")
+    filters = HedFilters('test_filters', [filter1])
+    for hed_string in var_manager.hed_strings:
+        print(f"Before {str(hed_string)}")
+        filter1.remove_tags(hed_string)
+        filters.apply_ops(hed_string)
+        print(f"After: {str(hed_string)}")
diff --git a/hed/tools/analysis/hed_query_manager.py b/hed/tools/analysis/hed_query_manager.py
new file mode 100644
index 000000000..d8f66faa0
--- /dev/null
+++ b/hed/tools/analysis/hed_query_manager.py
@@ -0,0 +1,52 @@
+from hed.models import HedString, TagExpressionParser
+from hed.schema import load_schema_version
+import pandas as pd
+
+
+class HedQuery:
+    def __init__(self, query):
+        self.name = query['name']
+        self.query_type = query['query_type']
+        self.query_str = query['query_str']
+        self.expression = TagExpressionParser(self.query_str)
+
+    def evaluate(self, hed_string_obj):
+        return self.expression.search_hed_string(hed_string_obj)
+
+
+class HedQueryManager:
+
+    def __init__(self, query_list):
+        self.query_list = query_list
+
+    def get_column_names(self):
+        columns = ['cond']*len(self.query_list)
+        for index, query in enumerate(self.query_list):
+            columns[index] = query.name
+        return columns
+
+    def parse(self, hed_string_obj):
+        matches = [0] * len(self.query_list)
+        for index, query in enumerate(self.query_list):
+            if query.evaluate(hed_string_obj):
+                matches[index] = 1
+        return matches
+
+
+if __name__ == '__main__':
+    qlist = [HedQuery({'name': 'cond_1', 'query_type': 'condition', 'query_str': 'Condition-variable'}),
+             HedQuery({'name': 'tag_1', 'query_type': 'get_tag', 'query_str': 'Sensory-presentation'})]
+
+    schema = load_schema_version(xml_version="8.0.0")
+    test_strings = [HedString('Condition-variable/Test-cond', hed_schema=schema),
+                    HedString('Visual-presentation', hed_schema=schema),
+                    HedString('Agent-action, (Move, Hand)', hed_schema=schema)]
+    q_parser = HedQueryManager(qlist)
+    col_names = q_parser.get_column_names()
+    print(f"Column names:{str(col_names)}")
+
+    result = [None]*len(test_strings)
+    for index, obj in enumerate(test_strings):
+        result[index] = q_parser.parse(obj)
+
+    df = pd.DataFrame(result, columns=col_names)
diff --git a/hed/tools/analysis/hed_type_factors.py b/hed/tools/analysis/hed_type_factors.py
new file mode 100644
index 000000000..eb7680b43
--- /dev/null
+++ b/hed/tools/analysis/hed_type_factors.py
@@ -0,0 +1,103 @@
+import pandas as pd
+from hed import HedFileError
+
+
+class HedTypeFactors:
+    """ Holds index of positions for a variable type for one tabular file. """
+
+    ALLOWED_ENCODINGS = ("categorical", "one-hot")
+
+    def __init__(self, variable_value, number_elements, variable_type="condition-variable"):
+        """ Constructor for HedTypeFactors.
+
+        Args:
+            variable_value (str): The value of the type summarized by this class.
+            number_elements (int): Number of elements in the data column
+            variable_type (str):  Lowercase string corresponding to a HED tag which has a takes value child.
+
+        """
+
+        self.variable_value = variable_value
+        self.number_elements = number_elements
+        self.variable_type = variable_type.lower()
+        self.levels = {}
+        self.direct_indices = {}
+
+    def __str__(self):
+        return f"{self.variable_value}[{self.variable_type}]: {self.number_elements} elements " + \
+               f"{str(self.levels)} levels {len(self.direct_indices)} references"
+
+    def get_factors(self, factor_encoding="one-hot"):
+        df = pd.DataFrame(0, index=range(self.number_elements), columns=[self.variable_value])
+        df.loc[list(self.direct_indices.keys()), [self.variable_value]] = 1
+        if not self.levels:
+            return df
+
+        levels = list(self.levels.keys())
+        levels_list = [f"{self.variable_value}.{level}" for level in levels]
+        df_levels = pd.DataFrame(0, index=range(self.number_elements), columns=levels_list)
+        for index, level in enumerate(levels):
+            index_keys = list(self.levels[level].keys())
+            df_levels.loc[index_keys, [levels_list[index]]] = 1
+        factors = pd.concat([df, df_levels], axis=1)
+        if factor_encoding == "one-hot":
+            return factors
+        sum_factors = factors.sum(axis=1)
+        if sum_factors.max() > 1:
+            raise HedFileError("MultipleFactorSameEvent",
+                               f"{self.variable_value} has multiple occurrences at index{sum_factors.idxmax()}", "")
+        if factor_encoding == "categorical":
+            return self.factors_to_vector(factors, levels)
+        else:
+            raise ValueError("BadFactorEncoding",
+                             f"{factor_encoding} is not in the allowed encodings: {str(self.ALLOWED_ENCODINGS)}")
+
+    def factors_to_vector(self, factors, levels):
+        df = pd.DataFrame('n/a', index=range(len(factors.index)), columns=[self.variable_value])
+        for index, row in factors.iterrows():
+            if row[self.variable_value]:
+                df.at[index, self.variable_value] = self.variable_value
+                continue
+            for level in levels:
+                if row[f"{self.variable_value}.{level}"]:
+                    df.at[index, self.variable_value] = level
+                    break
+        return df
+
+    def get_summary(self, full=True):
+        count_list = [0] * self.number_elements
+        for index in list(self.direct_indices.keys()):
+            count_list[index] = count_list[index] + 1
+        for level, cond in self.levels.items():
+            for index, item in cond.items():
+                count_list[index] = count_list[index] + 1
+        number_events, number_multiple, max_multiple = self.count_events(count_list)
+        summary = {'name': self.variable_value, 'variable_type': self.variable_type, 'levels': len(self.levels.keys()),
+                   'direct_references': len(self.direct_indices.keys()),
+                   'total_events': self.number_elements, 'number_type_events': number_events,
+                   'number_multiple_events': number_multiple, 'multiple_event_maximum': max_multiple}
+        if full:
+            summary['level_counts'] = self._get_level_counts()
+        return summary
+
+    def _get_level_counts(self):
+        count_dict = {}
+        for level, cond in self.levels.items():
+            count_dict[level] = len(cond.values())
+        return count_dict
+
+    @staticmethod
+    def count_events(count_list):
+        if not len(count_list):
+            return 0, 0, None
+        number_events = 0
+        number_multiple = 0
+        max_multiple = count_list[0]
+        for index, count in enumerate(count_list):
+            if count_list[index] > 0:
+                number_events = number_events + 1
+            if count_list[index] > 1:
+                number_multiple = number_multiple + 1
+            if count_list[index] > max_multiple:
+                max_multiple = count_list[index]
+        return number_events, number_multiple, max_multiple
diff --git a/hed/tools/analysis/hed_type_variable.py b/hed/tools/analysis/hed_type_variable.py
new file mode 100644
index 000000000..2d50762e8
--- /dev/null
+++ b/hed/tools/analysis/hed_type_variable.py
@@ -0,0 +1,230 @@
+import json
+import pandas as pd
+
+from hed import HedTag
+from hed.models import HedGroup
+from hed.schema import load_schema_version
+from hed.tools.analysis.hed_definition_manager import HedDefinitionManager
+from hed.tools.analysis.hed_context_manager import HedContextManager
+from hed.tools.analysis.hed_type_factors import HedTypeFactors
+
+
+class HedTypeVariable:
+
+    def __init__(self, context_manager, hed_schema, hed_definitions, variable_type="condition-variable"):
+        """ Create a variable manager for one type-variable for one tabular file.
+
+        Args:
+            context_manager (HedContextManager): A list of HED strings.
+            hed_schema (HedSchema or HedSchemaGroup): The HED schema to use for processing.
+            hed_definitions (dict): A dictionary of DefinitionEntry objects.
+            variable_type (str): Lowercase short form of the variable to be managed.
+
+        Raises:
+            HedFileError:  On errors such as unmatched onsets or missing definitions.
+        """
+
+        self.variable_type = variable_type.lower()
+        self.definitions = HedDefinitionManager(hed_definitions, hed_schema, variable_type=variable_type)
+        hed_strings = context_manager.hed_strings
+        hed_contexts = context_manager.contexts
+        self.number_events = len(hed_strings)
+        self._variable_map = {}
+        self._extract_variables(hed_strings, hed_contexts)
+
+    def get_variable(self, var_name):
+        """ Return the HedTypeFactors associated with var_name or None. """
+        return self._variable_map.get(var_name, None)
+
+    @property
+    def type_variables(self):
+        return set(self._variable_map.keys())
+
+    def get_variable_def_names(self):
+        tag_list = []
+        for variable, factor in self._variable_map.items():
+            tag_list = tag_list + [key for key in factor.levels.keys()]
+        return list(set(tag_list))
+
+    def get_variable_type_map(self, type_name):
+        return self._variable_map.get(type_name.lower(), None)
+
+    def get_variable_names(self):
+        return list(self._variable_map.keys())
+
+    def summarize(self, as_json=False):
+        summary = self._variable_map.copy()
+        for var_name, var_sum in summary.items():
+            summary[var_name] = var_sum.get_summary()
+        if as_json:
+            return json.dumps(summary, indent=4)
+        else:
+            return summary
+
+    def get_variable_factors(self, variables=None, factor_encoding="one-hot"):
+        if variables is None:
+            variables = self.get_variable_names()
+        df_list = [0]*len(variables)
+        for index, variable in enumerate(variables):
+            var_sum = self._variable_map[variable]
+            df_list[index] = var_sum.get_factors(factor_encoding=factor_encoding)
+        return pd.concat(df_list, axis=1)
+
+    def __str__(self):
+        return f"{self.variable_type} type_variables: {str(list(self._variable_map.keys()))}"
+
+    def _extract_definition_variables(self, item, index):
+        """ Extract the definition uses from a HedTag, HedGroup, or HedString.
+
+        Args:
+            item (HedTag, HedGroup, or HedString): The item to extract variable information from.
+            index (int):  Position of this item in the object's hed_strings.
+
+        Notes:
+            This updates the HedTypeFactors information.
+
+        """
+
+        if isinstance(item, HedTag):
+            tags = [item]
+        else:
+            tags = item.get_all_tags()
+        for tag in tags:
+            if tag.short_base_tag.lower() != "def":
+                continue
+            hed_vars = self.definitions.get_vars(tag)
+            if not hed_vars:
+                continue
+            self._update_definition_variables(tag, hed_vars, index)
+
+    def _update_definition_variables(self, tag, hed_vars, index):
+        """Update the HedTypeFactors map with information from Def tag.
+
+        Args:
+            tag (HedTag): A HedTag that is a Def tag.
+            hed_vars (list): A list of names of the hed type_variables
+            index (ind):  The event number associated with this.
+
+        Notes:
+            This modifies the HedTypeFactors map.
+
+        """
+        level = tag.extension_or_value_portion.lower()
+        for var_name in hed_vars:
+            hed_var = self._variable_map.get(var_name, None)
+            if hed_var is None:
+                hed_var = HedTypeFactors(var_name, self.number_events)
+                self._variable_map[var_name] = hed_var
+            var_levels = hed_var.levels.get(level, {index: 0})
+            var_levels[index] = 0
+            hed_var.levels[level] = var_levels
+
+    def _extract_variables(self, hed_strings, hed_contexts):
+        """ Extract all condition type_variables from hed_strings and event_contexts. """
+        for index, hed in enumerate(hed_strings):
+            self._extract_direct_variables(hed, index)
+            self._extract_definition_variables(hed, index)
+            for item in hed_contexts[index]:
+                self._extract_direct_variables(item, index)
+                self._extract_definition_variables(item, index)
+
+    def _extract_direct_variables(self, item, index):
+        """ Extract the condition type_variables from a HedTag, HedGroup, or HedString.
+
+        Args:
+            item (HedTag or HedGroup): The item from which to extract condition type_variables.
+            index (int):  Position in the array.
+
+        """
+        if isinstance(item, HedTag) and item.short_base_tag.lower() == self.variable_type:
+            tag_list = [item]
+        elif isinstance(item, HedGroup) and item.children:
+            tag_list = item.find_tags_with_term(self.variable_type, recursive=True, include_groups=0)
+        else:
+            tag_list = []
+        self._update_variables(tag_list, index)
+
+    def _update_variables(self, tag_list, index):
+        """ Update the HedTypeFactors based on tags in the list.
+
+        Args:
+            tag_list (list): A list of Condition-variable HedTags.
+            index (int):  An integer representing the position in an array
+
+        """
+        for tag in tag_list:
+            name = tag.extension_or_value_portion.lower()
+            if not name:
+                name = self.variable_type
+            hed_var = self._variable_map.get(name, None)
+            if hed_var is None:
+                hed_var = HedTypeFactors(name, self.number_events)
+            self._variable_map[name] = hed_var
+            hed_var.direct_indices[index] = ''
+
+
+if __name__ == '__main__':
+    import os
+    from hed import Sidecar, TabularInput, HedString
+    from hed.models import DefinitionEntry
+    from hed.tools.analysis.analysis_util import get_assembled_strings
+    hed_schema = load_schema_version(xml_version="8.1.0")
+    test_strings1 = [HedString(f"Sensory-event,(Def/Cond1,(Red, Blue, Condition-variable/Trouble),Onset),"
+                               f"(Def/Cond2,Onset),Green,Yellow, Def/Cond5, Def/Cond6/4", hed_schema=hed_schema),
+                     HedString('(Def/Cond1, Offset)', hed_schema=hed_schema),
+                     HedString('White, Black, Condition-variable/Wonder, Condition-variable/Fast',
+                               hed_schema=hed_schema),
+                     HedString('', hed_schema=hed_schema),
+                     HedString('(Def/Cond2, Onset)', hed_schema=hed_schema),
+                     HedString('(Def/Cond3/4.3, Onset)', hed_schema=hed_schema),
+                     HedString('Arm, Leg, Condition-variable/Fast, Def/Cond6/7.2', hed_schema=hed_schema)]
+
+    test_strings2 = [HedString(f"Def/Cond2, Def/Cond6/4, Def/Cond6/7.8, Def/Cond6/Alpha", hed_schema=hed_schema),
+                     HedString("Yellow", hed_schema=hed_schema),
+                     HedString("Def/Cond2", hed_schema=hed_schema),
+                     HedString("Def/Cond2, Def/Cond6/5.2", hed_schema=hed_schema)]
+    test_strings3 = [HedString(f"Def/Cond2, (Def/Cond6/4, Onset), (Def/Cond6/7.8, Onset), Def/Cond6/Alpha",
+                               hed_schema=hed_schema),
+                     HedString("Yellow", hed_schema=hed_schema),
+                     HedString("Def/Cond2, (Def/Cond6/4, Onset)", hed_schema=hed_schema),
+                     HedString("Def/Cond2, Def/Cond6/5.2 (Def/Cond6/7.8, Offset)", hed_schema=hed_schema),
+                     HedString("Def/Cond2, Def/Cond6/4", hed_schema=hed_schema)]
+    def1 = HedString('(Condition-variable/Var1, Circle, Square)', hed_schema=hed_schema)
+    def2 = HedString('(condition-variable/Var2, Condition-variable/Apple, Triangle, Sphere)', hed_schema=hed_schema)
+    def3 = HedString('(Organizational-property/Condition-variable/Var3, Physical-length/#, Ellipse, Cross)',
+                     hed_schema=hed_schema)
+    def4 = HedString('(Condition-variable, Apple, Banana)', hed_schema=hed_schema)
+    def5 = HedString('(Condition-variable/Lumber, Apple, Banana)', hed_schema=hed_schema)
+    def6 = HedString('(Condition-variable/Lumber, Label/#, Apple, Banana)', hed_schema=hed_schema)
+    defs = {'Cond1': DefinitionEntry('Cond1', def1, False, None),
+            'Cond2': DefinitionEntry('Cond2', def2, False, None),
+            'Cond3': DefinitionEntry('Cond3', def3, True, None),
+            'Cond4': DefinitionEntry('Cond4', def4, False, None),
+            'Cond5': DefinitionEntry('Cond5', def5, False, None),
+            'Cond6': DefinitionEntry('Cond6', def6, True, None)
+            }
+
+    conditions1 = HedTypeVariable(HedContextManager(test_strings1, hed_schema), hed_schema, defs)
+    conditions2 = HedTypeVariable(HedContextManager(test_strings2, hed_schema), hed_schema, defs)
+    conditions3 = HedTypeVariable(HedContextManager(test_strings3, hed_schema), hed_schema, defs)
+    bids_root_path = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)),
+                                                   '../../../tests/data/bids/eeg_ds003654s_hed'))
+    events_path = os.path.realpath(os.path.join(bids_root_path,
+                                                'sub-002/eeg/sub-002_task-FacePerception_run-1_events.tsv'))
+    sidecar_path = os.path.realpath(os.path.join(bids_root_path, 'task-FacePerception_events.json'))
+    sidecar1 = Sidecar(sidecar_path, name='face_sub1_json')
+    input_data = TabularInput(events_path, sidecar=sidecar1, name="face_sub1_events")
+    hed_strings = get_assembled_strings(input_data, hed_schema=hed_schema, expand_defs=False)
+    onset_man = HedContextManager(hed_strings, hed_schema=hed_schema)
+    definitions = input_data.get_definitions().gathered_defs
+    var_type = HedTypeVariable(onset_man, hed_schema, definitions)
+    df = var_type.get_variable_factors()
+    summary = var_type.summarize()
+    df.to_csv("D:/wh_conditionslong.csv", sep='\t', index=False)
+    with open('d:/wh_summary.json', 'w') as f:
+        json.dump(summary, f, indent=4)
+
+    df_no_hot = var_type.get_variable_factors(factor_encoding="categorical")
+    df_no_hot.to_csv("D:/wh_conditions_no_hot.csv", sep='\t', index=False)
+    with open('d:/wh_summarylong.json', 'w') as f:
+        json.dump(summary, f, indent=4)
diff --git a/hed/tools/analysis/hed_variable_manager.py b/hed/tools/analysis/hed_variable_manager.py
new file mode 100644
index 000000000..10ff9298a
--- /dev/null
+++ b/hed/tools/analysis/hed_variable_manager.py
@@ -0,0 +1,99 @@
+import pandas as pd
+import json
+from hed.schema import load_schema_version
+from hed.tools.analysis.hed_type_variable import HedTypeVariable
+from hed.tools.analysis.hed_context_manager import HedContextManager
+
+
+class HedVariableManager:
+
+    def __init__(self, hed_strings, hed_schema, definitions):
+        """ Create a variable manager for one tabular file for all type variables.
+
+        Args:
+            hed_strings (list): A list of HED strings.
+            hed_schema (HedSchema or HedSchemaGroup): The HED schema to use for processing.
+            definitions (dict): A dictionary of DefinitionEntry objects.
+
+        Raises:
+            HedFileError:  On errors such as unmatched onsets or missing definitions.
+        """
+
+        self.hed_schema = hed_schema
+        self.definitions = definitions
+        self.context_manager = HedContextManager(hed_strings, hed_schema)
+        self._variable_type_map = {}   # a map of type variable into HedTypeVariable objects
+
+    @property
+    def type_variables(self):
+        return list(self._variable_type_map.keys())
+
+    def add_type_variable(self, type_name):
+        if type_name.lower() in self._variable_type_map:
+            return
+        self._variable_type_map[type_name.lower()] = HedTypeVariable(self.context_manager, self.hed_schema,
+                                                                     self.definitions,
+                                                                     variable_type=type_name)
+
+    def get_factor_vectors(self, type_name, type_variables=None, factor_encoding="one-hot"):
+        this_var = self.get_type_variable(type_name)
+        if this_var is None:
+            return None
+        variables = this_var.get_variable_names()
+        if variables is None:
+            variables = type_variables
+        df_list = [0]*len(variables)
+        for index, variable in enumerate(variables):
+            var_sum = this_var._variable_map[variable]
+            df_list[index] = var_sum.get_factors(factor_encoding=factor_encoding)
+        return pd.concat(df_list, axis=1)
+
+    def get_type_variable(self, type_name):
+        return self._variable_type_map.get(type_name.lower(), None)
+
+    def get_type_variable_factor(self, var_type, var_name):
+        """ Return the HedTypeFactors associated with var_name or None. """
+        this_map = self._variable_type_map.get(var_type, None)
+        if this_map:
+            return this_map._variable_map.get(var_name, None)
+        return None
+
+    def get_type_variable_def_names(self, type_var):
+        this_map = self._variable_type_map.get(type_var, None)
+        if not this_map:
+            return []
+        return this_map.get_variable_def_names()
+
+    def summarize_all(self, as_json=False):
+        summary = {}
+        for type_name, type_var in self._variable_type_map.items():
+            summary[type_name] = type_var.summarize()
+        if as_json:
+            return json.dumps(summary, indent=4)
+        else:
+            return summary
+
+    def __str__(self):
+        return f"Type_variables: {str(list(self._variable_type_map.keys()))}"
+
+
+if __name__ == '__main__':
+    import os
+    from hed import Sidecar, TabularInput
+    from hed.tools.analysis.analysis_util import get_assembled_strings
+    schema = load_schema_version(xml_version="8.1.0")
+
+    bids_root_path = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)),
+                                                   '../../../tests/data/bids/eeg_ds003654s_hed'))
+    events_path = os.path.realpath(os.path.join(bids_root_path,
+                                                'sub-002/eeg/sub-002_task-FacePerception_run-1_events.tsv'))
+    sidecar_path = os.path.realpath(os.path.join(bids_root_path, 'task-FacePerception_events.json'))
+    sidecar1 = Sidecar(sidecar_path, name='face_sub1_json')
+    input_data = TabularInput(events_path, sidecar=sidecar1, name="face_sub1_events")
+    assembled_strings = get_assembled_strings(input_data, hed_schema=schema, expand_defs=False)
+    definitions = input_data.get_definitions()
+    var_manager = HedVariableManager(assembled_strings, schema, definitions)
+    var_manager.add_type_variable("condition-variable")
+    var_cond = var_manager.get_type_variable("condition-variable")
+    var_summary = var_cond.summarize()
+    summary_total = var_manager.summarize_all()
diff --git a/hed/tools/analysis/hed_variable_summary.py b/hed/tools/analysis/hed_variable_summary.py
new file mode 100644
index 000000000..2725a165d
--- /dev/null
+++ b/hed/tools/analysis/hed_variable_summary.py
@@ -0,0 +1,130 @@
+import json
+
+
+class HedVariableCounts:
+    """ Keeps a summary of one value of one type of variable.
+
+    Args:
+        variable_value (str)  The value of the variable to be counted
+        variable_type (str)   The type of variable.
+
+    Examples:
+        HedVariableCounts('SymmetricCond', 'condition-variable') keeps counts of Condition-variable/Symmetric
+
+    """
+
+    def __init__(self, variable_value, variable_type):
+        self.variable_value = variable_value
+        self.variable_type = variable_type.lower()
+        self.direct_references = 0
+        self.total_events = 0
+        self.number_type_events = 0
+        self.number_multiple_events = 0
+        self.multiple_event_maximum = 0
+        self.level_counts = {}
+
+    def update(self, variable_info):
+        """ Update the counts from a HedTypeVariable.
+
+        Args:
+            variable_info (HedTypeFactor) information about the contents for a particular data file.
+
+        """
+        var_sum = variable_info.get_summary(full=True)
+        self.direct_references += var_sum['direct_references']
+        self.total_events += var_sum['total_events']
+        self.number_type_events += var_sum['number_type_events']
+        self.number_multiple_events += var_sum['number_multiple_events']
+        self.multiple_event_maximum = max(self.multiple_event_maximum, var_sum['multiple_event_maximum'])
+        self._update_levels(var_sum['level_counts'])
+
+    def _update_levels(self, level_dict):
+        for key, item in level_dict.items():
+            if key not in self.level_counts:
+                self.level_counts[key] = {'files': 0, 'events': 0}
+            self.level_counts[key]['files'] = self.level_counts[key]['files'] + 1
+            self.level_counts[key]['events'] = self.level_counts[key]['events'] + item
+
+    def get_summary(self, as_json=False):
+        summary = {'variable_value': self.variable_value,
+                   'variable_type': self.variable_type,
+                   'levels': len(self.level_counts.keys()),
+                   'direct_references': self.direct_references,
+                   'total_events': self.total_events,
+                   'number_type_events': self.number_type_events,
+                   'number_multiple_events': self.number_multiple_events,
+                   'multiple_event_maximum': self.multiple_event_maximum,
+                   'level_counts': self.level_counts}
+        if as_json:
+            return json.dumps(summary, indent=4)
+        return summary
+
+
+class HedVariableSummary:
+    """ Holds a consolidated summary for one type variable. """
+
+    def __init__(self, variable_type, name=''):
+        """ Constructor for HedVariableSummary for a particular type of variable.
+
+        Args:
+            variable_type (str)    Tag representing the type in this summary
+
+        """
+
+        self.variable_type = variable_type.lower()
+        self.name = name
+        self.summary = {}
+
+    def __str__(self):
+        return f"Summary {self.name} for HED {self.variable_type} [{len(self.summary)} values]:" + '\n' + \
+            self.get_summary(as_json=True)
+
+    def get_summary(self, as_json=True):
+        sum_dict = {}
+        for var_value, var_counts in self.summary.items():
+            sum_dict[var_value] = var_counts.get_summary(as_json=False)
+        if as_json:
+            return json.dumps(sum_dict, indent=4)
+        else:
+            return sum_dict
+
+    def update_summary(self, variable):
+        """ Update this summary based on the type variable map.
+
+        Args:
+            variable (HedTypeVariable):  Contains the information about
+        """
+
+        for type_var in variable.type_variables:
+            if type_var not in self.summary:
+                self.summary[type_var] = HedVariableCounts(type_var, self.variable_type)
+            var_counts = self.summary[type_var]
+            var_counts.update(variable.get_variable(type_var))
+
+
+if __name__ == '__main__':
+    import os
+    from hed.tools.analysis.hed_variable_manager import HedVariableManager
+    from hed.schema import load_schema_version
+    from hed.models import TabularInput, Sidecar
+    from hed.tools.analysis.analysis_util import get_assembled_strings
+    schema = load_schema_version(xml_version="8.1.0")
+    bids_root_path = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)),
+                                                   '../../../tests/data/bids/eeg_ds003654s_hed'))
+    events_path = os.path.realpath(os.path.join(bids_root_path,
+                                                'sub-002/eeg/sub-002_task-FacePerception_run-1_events.tsv'))
+    sidecar_path = os.path.realpath(os.path.join(bids_root_path, 'task-FacePerception_events.json'))
+    sidecar1 = Sidecar(sidecar_path, name='face_sub1_json')
+    input_data = TabularInput(events_path, sidecar=sidecar1, name="face_sub1_events")
+    hed_strings = get_assembled_strings(input_data, hed_schema=schema, expand_defs=False)
+    def_mapper = input_data.get_definitions()
+    var_manager = HedVariableManager(hed_strings, schema, def_mapper)
+    var_manager.add_type_variable("condition-variable")
+    var_summary = HedVariableSummary("condition-variable")
+    for man_var in var_manager.type_variables:
+        var_map = var_manager.get_type_variable(man_var)
+        var_summary.update_summary(var_map)
+
+    final_summary = var_summary.get_summary(as_json=False)
+    print(f"Variable summary\n{final_summary}")
+    print(f"\n\n{str(var_summary)}")
diff --git a/hed/tools/analysis/key_map.py b/hed/tools/analysis/key_map.py
index 93185572b..262e3d659 100644
--- a/hed/tools/analysis/key_map.py
+++ b/hed/tools/analysis/key_map.py
@@ -1,7 +1,6 @@
 import pandas as pd
 from hed.errors.exceptions import HedFileError
-from hed.util.data_util import get_row_hash
-from hed.util.data_util import get_new_dataframe, remove_quotes, separate_columns
+from hed.tools.util.data_util import get_new_dataframe, get_row_hash, remove_quotes, separate_columns
 
 
 class KeyMap:
diff --git a/hed/tools/analysis/tabular_reports.py b/hed/tools/analysis/tabular_reports.py
deleted file mode 100644
index 0b6bf2992..000000000
--- a/hed/tools/analysis/tabular_reports.py
+++ /dev/null
@@ -1,58 +0,0 @@
-
-
-def report_diffs(tsv_dict1, tsv_dict2, logger):
-    """ Reports and logs the contents and differences of two equivalent BidsTabularDictionary objects
-
-    Args:
-        tsv_dict1 (BidsTabularDictionary):  A dictionary representing BIDS-keyed tsv files.
-        tsv_dict2 (BidsTabularDictionary):  A dictionary representing BIDS-keyed tsv files.
-        logger (HedLogger):                 A HedLogger object for reporting the values by key.
-
-    Returns:
-        str:  A string with the differences.
-
-    """
-    report_list = [f"{tsv_dict1.name} has {len(tsv_dict1.file_list)} event files"]
-    logger.add("overall", f"{report_list[-1]}")
-    report_list.append(f"{tsv_dict2.name} has {len(tsv_dict2.file_list)} event files")
-    logger.add("overall", f"{report_list[-1]}")
-
-    report_list.append(tsv_dict1.output_files(title=f"\n{tsv_dict1.name} event files", logger=logger))
-    report_list.append(tsv_dict2.output_files(title=f"\n{tsv_dict2.name} event files", logger=logger))
-
-    # Make sure there are the same number of files in both collections
-    if len(tsv_dict1.key_list) != len(tsv_dict2.key_list):
-        report_list.append(f"{tsv_dict1.name} has {len(tsv_dict1.file_list)} files and " +
-                           f"{tsv_dict2.name} has {len(tsv_dict2.file_list)} files")
-        logger.add("overall", f"{report_list[-1]}", level="ERROR")
-
-    # Compare keys from the two dictionaries to make sure they have the same keys
-    key_diff = tsv_dict1.key_diffs(tsv_dict2)
-    if key_diff:
-        report_list.append(f"File key differences {str(key_diff)}")
-        logger.add("overall", f"{report_list[-1]}", level="ERROR")
-
-    # Output the column names for each type of event file
-    report_list.append(f"\n{tsv_dict1.name} event file columns:")
-    for key, file, rowcount, columns in tsv_dict1.iter_files():
-        report_list.append(f"{tsv_dict1.name}: [{rowcount} events] {str(columns)}")
-        logger.add(key, f"{report_list[-1]}")
-
-    for key, file, rowcount, columns in tsv_dict2.iter_files():
-        report_list.append(f"{tsv_dict2.name}: [{rowcount} events] {str(columns)}")
-        logger.add(key, f"{report_list[-1]}")
-
-    # Output keys for files in which the BIDS and EEG.events have different numbers of events
-    count_diffs = tsv_dict1.count_diffs(tsv_dict2)
-    if count_diffs:
-        report_list.append(f"\nThe number of {tsv_dict1.name} events and {tsv_dict2.name} events" +
-                           f"differ for the following files:")
-        for item in count_diffs:
-            report_list.append(f"The {tsv_dict1.name} file has {item[1]} rows and " +
-                               f"the {tsv_dict2.name} event file has {item[2]} rows")
-            logger.add(item[0], f"{report_list[-1]}", level="ERROR")
-    else:
-        report_list.append(f"\nThe {tsv_dict1.name} and {tsv_dict2.name} files have the same number of rows")
-        logger.add("overall", f"{report_list[-1]}")
-
-    return "\n".join(report_list)
diff --git a/hed/tools/bids/bids_tabular_summary.py b/hed/tools/analysis/tabular_summary.py
similarity index 84%
rename from hed/tools/bids/bids_tabular_summary.py
rename to hed/tools/analysis/tabular_summary.py
index b82cf22d3..f2a66da17 100644
--- a/hed/tools/bids/bids_tabular_summary.py
+++ b/hed/tools/analysis/tabular_summary.py
@@ -1,10 +1,10 @@
-
+import json
 from hed.errors import HedFileError
-from hed.util import get_new_dataframe
+from hed.tools.util.data_util import get_new_dataframe
 from hed.tools.analysis.annotation_util import generate_sidecar_entry
 
 
-class BidsTabularSummary:
+class TabularSummary:
     """ Summarize the contents of BIDS tabular files. """
 
     def __init__(self, value_cols=None, skip_cols=None, name=''):
@@ -63,6 +63,26 @@ def extract_sidecar_template(self):
             side_dict[column_name] = generate_sidecar_entry(column_name, [])
         return side_dict
 
+    def get_summary(self, as_json=False):
+        sorted_keys = sorted(self.categorical_info.keys())
+        categorical_cols = {}
+        for key in sorted_keys:
+            cat_dict = self.categorical_info[key]
+            sorted_v_keys = sorted(list(cat_dict))
+            val_dict = {}
+            for v_key in sorted_v_keys:
+                val_dict[v_key] = cat_dict[v_key]
+            categorical_cols[f"{key} [categorical column] values"] = val_dict
+        sorted_cols = sorted(map(str, list(self.value_info)))
+        value_cols = {}
+        for key in sorted_cols:
+            value_cols[f"{key} [value_column]"] = f"{self.value_info[key]} values"
+        summary = {"Summary name": self.name, "Categorical columns": categorical_cols, "Value columns": value_cols}
+        if as_json:
+            return json.dumps(summary, indent=4)
+        else:
+            return summary
+
     def get_number_unique(self, column_names=None):
         """ Return the number of unique values in columns.
 
@@ -207,16 +227,16 @@ def make_combined_dicts(file_dictionary, skip_cols=None):
 
         Returns:
             tuple:
-                - BidsTabularSummary: Summary of the file dictionary.
-                - dict: of individual BidsTabularSummary objects.
+                - TabularSummary: Summary of the file dictionary.
+                - dict: of individual TabularSummary objects.
 
         """
 
-        summary_all = BidsTabularSummary(skip_cols=skip_cols)
+        summary_all = TabularSummary(skip_cols=skip_cols)
         summary_dict = {}
-        for key, file in file_dictionary.file_dict.items():
-            orig_dict = BidsTabularSummary(skip_cols=skip_cols)
-            df = get_new_dataframe(file.file_path)
+        for key, file_path in file_dictionary.items():
+            orig_dict = TabularSummary(skip_cols=skip_cols)
+            df = get_new_dataframe(file_path)
             orig_dict.update(df)
             summary_dict[key] = orig_dict
             summary_all.update_summary(orig_dict)
diff --git a/hed/tools/analysis/tag_summary.py b/hed/tools/analysis/tag_summary.py
index 9b7d1453f..ebca7bc2d 100644
--- a/hed/tools/analysis/tag_summary.py
+++ b/hed/tools/analysis/tag_summary.py
@@ -58,12 +58,12 @@ def _set_all_tags(self):
                 add_group_to_dict(hed_string_obj, self.all_tags_dict)
 
     def get_design_matrices(self):
-        """ Return information about the condition variables.
+        """ Return information about the condition type_variables.
 
         Returns:
             tuple:
                 - dict: Dictionary with condition variable levels corresponding to a design matrix.
-                - list: List with the other condition variables that aren't associated with levels.
+                - list: List with the other condition type_variables that aren't associated with levels.
                 - list: List of errors.
 
         """
@@ -123,5 +123,3 @@ def extract_summary_info(entry_dict, tag_name):
     event_group = bids.get_tabular_group(obj_type="events")
     summary = TagSummary(event_group, schema=bids.schema, breakout_list=breakouts)
     designs, others, errors = summary.get_design_matrices()
-
-    print("to here")
diff --git a/hed/tools/bids/bids_dataset.py b/hed/tools/bids/bids_dataset.py
index 72c7dbaa2..0c8900da9 100644
--- a/hed/tools/bids/bids_dataset.py
+++ b/hed/tools/bids/bids_dataset.py
@@ -1,6 +1,6 @@
 import os
 import json
-from hed.errors.error_reporter import get_printable_issue_string
+from hed.errors.error_reporter import ErrorHandler, get_printable_issue_string
 from hed.schema.hed_schema import HedSchema
 from hed.schema.hed_schema_io import load_schema, load_schema_version
 from hed.schema.hed_schema_group import HedSchemaGroup
@@ -21,7 +21,8 @@ class BidsDataset:
 
     """
 
-    def __init__(self, root_path, schema=None, tabular_types=None):
+    def __init__(self, root_path, schema=None, tabular_types=None,
+                 exclude_dirs=['sourcedata', 'derivatives', 'code', 'stimuli']):
         """ Constructor for a BIDS dataset.
 
         Args:
@@ -29,6 +30,7 @@ def __init__(self, root_path, schema=None, tabular_types=None):
             schema (HedSchema or HedSchemaGroup):  A schema that overrides the one specified in dataset.
             tabular_types (list or None):  List of strings specifying types of tabular types to include.
                 If None or empty, then ['events'] is assumed.
+            exclude_dirs=['sourcedata', 'derivatives', 'code']):
 
         """
         self.root_path = os.path.realpath(root_path)
@@ -39,12 +41,15 @@ def __init__(self, root_path, schema=None, tabular_types=None):
         else:
             self.schema = load_schema_version(self.dataset_description.get("HEDVersion", None))
 
+        self.exclude_dirs = exclude_dirs
         self.tabular_files = {"participants": BidsFileGroup(root_path, suffix="participants", obj_type="tabular")}
         if not tabular_types:
-            self.tabular_files["events"] = BidsFileGroup(root_path, suffix="events", obj_type="tabular")
+            self.tabular_files["events"] = BidsFileGroup(root_path, suffix="events", obj_type="tabular",
+                                                         exclude_dirs=exclude_dirs)
         else:
             for suffix in tabular_types:
-                self.tabular_files[suffix] = BidsFileGroup(root_path, suffix=suffix, obj_type="tabular")
+                self.tabular_files[suffix] = BidsFileGroup(root_path, suffix=suffix, obj_type="tabular",
+                                                           exclude_dirs=exclude_dirs)
 
     def get_tabular_group(self, obj_type="events"):
         """ Return the specified tabular file group.
@@ -73,13 +78,17 @@ def validate(self, types=None, check_for_warnings=True):
 
         """
         validator = HedValidator(hed_schema=self.schema)
+        error_handler = ErrorHandler()
         if not types:
             types = list(self.tabular_files.keys())
         issues = []
         for tab_type in types:
             files = self.tabular_files[tab_type]
-            issues += files.validate_sidecars(hed_ops=[validator], check_for_warnings=check_for_warnings)
-            issues += files.validate_datafiles(hed_ops=[validator], check_for_warnings=check_for_warnings)
+            issues += files.validate_sidecars(hed_ops=[validator],
+                                              check_for_warnings=check_for_warnings, error_handler=error_handler)
+            issues += files.validate_datafiles(hed_ops=[validator],
+                                               check_for_warnings=check_for_warnings,
+                                               error_handler=error_handler)
         return issues
 
     def get_summary(self):
@@ -109,37 +118,39 @@ def get_schema_versions(self):
 
 
 if __name__ == '__main__':
-    path = os.path.join(os.path.dirname(os.path.realpath(__file__)),
-                        '../../../tests/data/bids/eeg_ds003654s_hed_library')
+    # path = os.path.join(os.path.dirname(os.path.realpath(__file__)),
+    #                     '../../../tests/data/bids/eeg_ds003654s_hed_library')
     # path = os.path.join(os.path.dirname(os.path.realpath(__file__)),
     #                     '../../../tests/data/bids/eeg_ds003654s_hed_inheritance')
     # path = os.path.join(os.path.dirname(os.path.realpath(__file__)),
     #                     '../../../tests/data/bids/eeg_ds003654s_hed')
     #
+    # path = 'Q:\WakemanHensonON'
+    path = 'G:\WakemanHenson\WH_Released'
     bids = BidsDataset(path)
     issue_list = bids.validate(check_for_warnings=False)
     if issue_list:
-        issue_str = get_printable_issue_string(issue_list, "HED validation errors:")
+        issue_str = get_printable_issue_string(issue_list, "HED validation errors:", skip_filename=False)
     else:
         issue_str = "No issues"
     print(issue_str)
     warnings = False
-    path = '/XXX/bids-examples/xeeg_hed_score/'
-    bids = BidsDataset(path)
-    # summary1 = bids.get_summary()
-    # print(json.dumps(summary1, indent=4))
-    print("\nNow validating with the prerelease schema.")
-    base_version = '8.1.0'
-    score_url = f"https://raw.githubusercontent.com/hed-standard/hed-schema-library/main/library_schemas/" \
-                f"score/prerelease/HED_score_1.0.0.xml"
-
-    schema_base = load_schema_version(xml_version="8.1.0")
-    schema_score = load_schema(score_url, schema_prefix="sc")
-    bids.schema = HedSchemaGroup([schema_base, schema_score])
-
-    issue_list2 = bids.validate(check_for_warnings=warnings)
-    if issue_list2:
-        issue_str2 = get_printable_issue_string(issue_list2, "HED validation errors: ", skip_filename=False)
-    else:
-        issue_str2 = "No HED validation errors"
-    print(issue_str2)
+    # path = '/XXX/bids-examples/xeeg_hed_score/'
+    # bids = BidsDataset(path)
+    # # summary1 = bids.get_summary()
+    # # print(json.dumps(summary1, indent=4))
+    # print("\nNow validating with the prerelease schema.")
+    # base_version = '8.1.0'
+    # score_url = f"https://raw.githubusercontent.com/hed-standard/hed-schema-library/main/library_schemas/" \
+    #             f"score/prerelease/HED_score_1.0.0.xml"
+    #
+    # schema_base = load_schema_version(xml_version="8.1.0")
+    # schema_score = load_schema(score_url, schema_prefix="sc")
+    # bids.schema = HedSchemaGroup([schema_base, schema_score])
+    #
+    # issue_list2 = bids.validate(check_for_warnings=warnings)
+    # if issue_list2:
+    #     issue_str2 = get_printable_issue_string(issue_list2, "HED validation errors: ", skip_filename=False)
+    # else:
+    #     issue_str2 = "No HED validation errors"
+    # print(issue_str2)
diff --git a/hed/tools/bids/bids_file.py b/hed/tools/bids/bids_file.py
index 3e9b0111e..a45f2dffc 100644
--- a/hed/tools/bids/bids_file.py
+++ b/hed/tools/bids/bids_file.py
@@ -1,5 +1,5 @@
 import os
-from hed.util.io_util import parse_bids_filename
+from hed.tools.util.io_util import parse_bids_filename
 
 
 class BidsFile:
@@ -43,7 +43,10 @@ def clear_contents(self):
         """ Set the contents attribute of this object to None. """
         self.contents = None
 
-    def get_key(self, entities):
+    def get_entity(self, entity_name):
+        return self.entity_dict.get(entity_name, None)
+
+    def get_key(self, entities=None):
         """ Return a key for this BIDS file given a list of entities.
 
         Args:
@@ -52,7 +55,13 @@ def get_key(self, entities):
         Returns:
             str:  A key based on this object.
 
+        Notes:
+            If entities is None, then the file path is used as the key
+
         """
+
+        if not entities:
+            return self.file_path
         key_list = []
         for entity in entities:
             if entity in self.entity_dict:
diff --git a/hed/tools/bids/bids_file_dictionary.py b/hed/tools/bids/bids_file_dictionary.py
index 417702945..da77fdf27 100644
--- a/hed/tools/bids/bids_file_dictionary.py
+++ b/hed/tools/bids/bids_file_dictionary.py
@@ -30,17 +30,22 @@ def __init__(self, collection_name, files, entities=('sub', 'ses', 'task', 'run'
         """
         super().__init__(collection_name, None, None, separator='_')
         self.entities = entities
-        self.file_dict = self.make_dict(files, entities)
+        self._file_dict = self.make_dict(files, entities)
 
     @property
     def key_list(self):
         """ The dictionary keys. """
-        return list(self.file_dict.keys())
+        return list(self._file_dict.keys())
+
+    @property
+    def file_dict(self):
+        """ Dictionary of keys and paths. """
+        return {key:file.file_path for key, file in self._file_dict.items()}
 
     @property
     def file_list(self):
-        """ Files contained in this dictionary. """
-        return list(self.file_dict.values())
+        """ Paths of the files in the list. """
+        return [file.file_path for file in self._file_dict.values()]
 
     def correct_file(self, the_file):
         """ Transform to BidsFile if needed.
@@ -74,8 +79,8 @@ def get_file_path(self, key):
             - None is returned if the key is not present.
 
         """
-        if key in self.file_dict.keys():
-            return self.file_dict[key].file_path
+        if key in self._file_dict.keys():
+            return self._file_dict[key].file_path
         return None
 
     def iter_files(self):
@@ -87,7 +92,7 @@ def iter_files(self):
                 - BidsFile:  The next BidsFile.
 
         """
-        for key, file in self.file_dict.items():
+        for key, file in self._file_dict.items():
             yield key, file
 
     def key_diffs(self, other_dict):
@@ -100,7 +105,7 @@ def key_diffs(self, other_dict):
             list: The symmetric difference of the keys in this dictionary and the other one.
 
         """
-        diffs = set(self.file_dict.keys()).symmetric_difference(set(other_dict.file_dict.keys()))
+        diffs = set(self._file_dict.keys()).symmetric_difference(set(other_dict._file_dict.keys()))
         return list(diffs)
 
     def get_new_dict(self, name, files):
@@ -165,7 +170,7 @@ def make_query(self, query_dict={'sub': '*'}):
 
         """
         response_dict = {}
-        for key, file in self.file_dict.items():
+        for key, file in self._file_dict.items():
             if self.match_query(query_dict, file.entity_dict):
                 response_dict[key] = file
         return response_dict
@@ -185,7 +190,7 @@ def split_by_entity(self, entity):
             - This function is used for analysis where a single subject or single type of task is being analyzed.
 
         """
-        split_dict, leftovers = self._split_dict_by_entity(self.file_dict, entity)
+        split_dict, leftovers = self._split_dict_by_entity(self._file_dict, entity)
         for entity_value, entity_dict in split_dict.items():
             split_dict[entity_value] = self.get_new_dict(f"{self.name}_{entity_value}", entity_dict)
         if leftovers:
diff --git a/hed/tools/bids/bids_file_group.py b/hed/tools/bids/bids_file_group.py
index 5dd3f87fa..c0534b1af 100644
--- a/hed/tools/bids/bids_file_group.py
+++ b/hed/tools/bids/bids_file_group.py
@@ -1,11 +1,11 @@
 import os
-from hed.errors.error_reporter import get_printable_issue_string
+from hed.errors.error_reporter import ErrorContext, ErrorHandler, get_printable_issue_string
 from hed.schema.hed_schema_io import load_schema_version
+from hed.tools.analysis.tabular_summary import TabularSummary
 from hed.tools.bids.bids_timeseries_file import BidsTimeseriesFile
 from hed.tools.bids.bids_tabular_file import BidsTabularFile
 from hed.tools.bids.bids_sidecar_file import BidsSidecarFile
-from hed.tools.bids.bids_tabular_summary import BidsTabularSummary
-from hed.util.io_util import get_dir_dictionary, get_file_list, get_path_components
+from hed.tools.util.io_util import get_dir_dictionary, get_file_list, get_path_components
 from hed.validator.hed_validator import HedValidator
 
 
@@ -23,18 +23,22 @@ class BidsFileGroup:
 
     """
 
-    def __init__(self, root_path, suffix="_events", obj_type="tabular"):
+    def __init__(self, root_path, suffix="_events", obj_type="tabular",
+                 exclude_dirs=['sourcedata', 'derivatives', 'code', 'stimuli']):
         """ Constructor for a BidsFileGroup.
 
         Args:
             root_path (str):  Path of the root of the BIDS dataset.
             suffix (str):     Suffix indicating the type this group represents (e.g. events, or channels, etc.).
             obj_type (str):   Indicates the type of underlying file represents the contents.
+            exclude_dirs (list):  Directories to exclude.
+
 
         """
         self.root_path = os.path.realpath(root_path)
         self.suffix = suffix
         self.obj_type = obj_type
+        self.exclude_dirs = exclude_dirs
         self.sidecar_dict = self._make_sidecar_dict()
         self.sidecar_dir_dict = self._make_sidecar_dir_dict()
 
@@ -94,7 +98,7 @@ def summarize(self, value_cols=None, skip_cols=None):
             skip_cols (list):   Column names designated as columns to skip.
 
         Returns:
-            BidsTabularSummary or None:  A summary of the number of values in different columns if tabular group.
+            TabularSummary or None:  A summary of the number of values in different columns if tabular group.
 
         Notes:
             - The columns that are not value_cols or skip_col are summarized by counting
@@ -103,42 +107,54 @@ def summarize(self, value_cols=None, skip_cols=None):
         """
         if self.obj_type != 'tabular':
             return None
-        info = BidsTabularSummary(value_cols=value_cols, skip_cols=skip_cols)
-        for obj in self.datafile_dict.values():
-            info.update(obj.file_path)
+        info = TabularSummary(value_cols=value_cols, skip_cols=skip_cols)
+        info.update(list(self.datafile_dict.keys()))
         return info
 
-    def validate_sidecars(self, hed_ops, check_for_warnings=True):
+    def validate_sidecars(self, hed_ops, check_for_warnings=True, error_handler=None):
         """ Validate merged sidecars.
 
         Args:
             hed_ops ([func or HedOps], func, HedOps):  Validation functions to apply.
             check_for_warnings (bool):  If True, include warnings in the check.
+            error_handler (ErrorHandler): The common error handler for the dataset.
 
         Returns:
             list:   A list of validation issues found. Each issue is a dictionary.
 
         """
+
+        if not error_handler:
+            error_handler = ErrorHandler()
         issues = []
         for sidecar in self.sidecar_dict.values():
+            error_handler.push_error_context(ErrorContext.FILE_NAME, sidecar.file_path)
             if sidecar.has_hed:
-                issues += sidecar.contents.validate_entries(hed_ops=hed_ops, check_for_warnings=check_for_warnings)
+                issues += sidecar.contents.validate_entries(hed_ops=hed_ops,
+                                                            name=sidecar.file_path,
+                                                            check_for_warnings=check_for_warnings)
+                error_handler.pop_error_context()
         return issues
 
-    def validate_datafiles(self, hed_ops, check_for_warnings=True, keep_contents=False):
+    def validate_datafiles(self, hed_ops, check_for_warnings=True, keep_contents=False, error_handler=None):
         """ Validate the datafiles and return an error list.
 
         Args:
             hed_ops ([func or HedOps], func, HedOps):  Validation functions to apply.
             check_for_warnings (bool):  If True, include warnings in the check.
             keep_contents (bool):       If True, the underlying data files are read and their contents retained.
+            error_handler (ErrorHandler): The common error handler to use for the dataset.
 
         Returns:
             list:    A list of validation issues found. Each issue is a dictionary.
 
         """
+
+        if not error_handler:
+            error_handler = ErrorHandler()
         issues = []
         for data_obj in self.datafile_dict.values():
+            error_handler.push_error_context(ErrorContext.FILE_NAME, data_obj.file_path)
             data_obj.set_contents(overwrite=False)
             if not data_obj.has_hed:
                 continue
@@ -146,6 +162,7 @@ def validate_datafiles(self, hed_ops, check_for_warnings=True, keep_contents=Fal
             issues += data.validate_file(hed_ops=hed_ops, check_for_warnings=check_for_warnings)
             if not keep_contents:
                 data_obj.clear_contents()
+            error_handler.pop_error_context()
         return issues
 
     def _make_datafile_dict(self):
@@ -155,7 +172,8 @@ def _make_datafile_dict(self):
             dict:   A dictionary of BidsTabularFile or BidsTimeseriesFile objects keyed by real path.
 
         """
-        files = get_file_list(self.root_path, name_suffix=self.suffix, extensions=['.tsv'])
+        files = get_file_list(self.root_path, name_suffix=self.suffix, extensions=['.tsv'],
+                              exclude_dirs=self.exclude_dirs)
         file_dict = {}
         if self.obj_type == "tabular":
             for file in files:
@@ -175,7 +193,8 @@ def _make_sidecar_dict(self):
             - This function creates the sidecars and but does not set their contents.
 
         """
-        files = get_file_list(self.root_path, name_suffix=self.suffix, extensions=['.json'])
+        files = get_file_list(self.root_path, name_suffix=self.suffix,
+                              extensions=['.json'], exclude_dirs=self.exclude_dirs)
         file_dict = {}
         for file in files:
             file_dict[os.path.realpath(file)] = BidsSidecarFile(os.path.realpath(file))
@@ -199,23 +218,26 @@ def _make_sidecar_dir_dict(self):
 
 
 if __name__ == '__main__':
-    path = os.path.join(os.path.dirname(os.path.realpath(__file__)),
-                        '../../../tests/data/bids/eeg_ds003654s_hed_inheritance')
+    # path = os.path.join(os.path.dirname(os.path.realpath(__file__)),
+    #                     '../../../tests/data/bids/eeg_ds003654s_hed_inheritance')
+    path = 'G:\WakemanHenson\WH_Released'
     bids = BidsFileGroup(path)
 
-    for file_obj in bids.sidecar_dict.values():
-        print(file_obj)
-
-    for file_obj in bids.datafile_dict.values():
-        print(file_obj)
+    # for file_obj in bids.sidecar_dict.values():
+    #     print(file_obj.file_path)
+    #
+    # for file_obj in bids.datafile_dict.values():
+    #     print(file_obj.file_path)
 
     schema = load_schema_version(xml_version="8.0.0")
     validator = HedValidator(hed_schema=schema)
 
     issues_side = bids.validate_sidecars(hed_ops=[validator], check_for_warnings=False)
+    print(f"Side issues {str(issues_side)}\n")
     issues_data = bids.validate_datafiles(hed_ops=[validator], check_for_warnings=False)
+    print(f"Data issues {str(issues_data)}\n")
     if issues_side:
-        print(get_printable_issue_string(issues_side, "Sidecar errors"))
+        print(get_printable_issue_string(issues_side, "Sidecar errors", skip_filename=False))
     else:
         print("No validation errors in the sidecars")
 
diff --git a/hed/tools/bids/bids_tabular_dictionary.py b/hed/tools/bids/bids_tabular_dictionary.py
index 724dad68c..6cf506524 100644
--- a/hed/tools/bids/bids_tabular_dictionary.py
+++ b/hed/tools/bids/bids_tabular_dictionary.py
@@ -1,4 +1,4 @@
-from hed.util.data_util import get_new_dataframe
+from hed.tools.util.data_util import get_new_dataframe
 from hed.tools.bids.bids_file_dictionary import BidsFileDictionary
 from hed.errors.exceptions import HedFileError
 from hed.tools.bids.bids_file import BidsFile
@@ -71,7 +71,7 @@ def count_diffs(self, other_dict):
         """
         self._set_tsv_info()
         diff_list = []
-        for key in self.file_dict.keys():
+        for key in self._file_dict.keys():
             if self.rowcount_dict[key] != other_dict.rowcount_dict[key]:
                 diff_list.append((key, self.rowcount_dict[key], other_dict.rowcount_dict[key]))
         return diff_list
@@ -121,7 +121,7 @@ def iter_files(self):
 
         """
         self._set_tsv_info()
-        for key, file in self.file_dict.items():
+        for key, file in self._file_dict.items():
             yield key, file, self.rowcount_dict[key], self.column_dict[key]
 
     def make_new(self, name, files):
@@ -141,8 +141,65 @@ def _set_tsv_info(self):
         if self._info_set:
             return
 
-        for key, file in self.file_dict.items():
+        for key, file in self._file_dict.items():
             df = get_new_dataframe(file.file_path)
             self.rowcount_dict[key] = len(df.index)
             self.column_dict[key] = list(df.columns.values)
         self.info_set = True
+
+    def report_diffs(self, tsv_dict, logger=None):
+        """ Reports and logs the contents and differences between this tabular dictionary and another
+
+        Args:
+            tsv_dict (BidsTabularDictionary):  A dictionary representing BIDS-keyed tsv files.
+            logger (HedLogger):                 A HedLogger object for reporting the values by key.
+
+        Returns:
+            str:  A string with the differences.
+
+        """
+        report_list = [f"{self.name} has {len(self.file_list)} event files"]
+        logger.add("overall", f"{report_list[-1]}")
+        report_list.append(f"{self.name} has {len(tsv_dict.file_list)} event files")
+        logger.add("overall", f"{report_list[-1]}")
+
+        report_list.append(self.output_files(title=f"\n{self.name} event files", logger=logger))
+        report_list.append(tsv_dict.output_files(title=f"\n{tsv_dict.name} event files", logger=logger))
+
+        # Make sure there are the same number of files in both collections
+        if len(self.key_list) != len(tsv_dict.key_list):
+            report_list.append(f"{self.name} has {len(self.file_list)} files and " +
+                               f"{tsv_dict.name} has {len(tsv_dict.file_list)} files")
+            if logger:
+                logger.add("overall", f"{report_list[-1]}", level="ERROR")
+
+        # Compare keys from the two dictionaries to make sure they have the same keys
+        key_diff = self.key_diffs(tsv_dict)
+        if key_diff:
+            report_list.append(f"File key differences {str(key_diff)}")
+            logger.add("overall", f"{report_list[-1]}", level="ERROR")
+
+        # Output the column names for each type of event file
+        report_list.append(f"\n{self.name} event file columns:")
+        for key, file, rowcount, columns in self.iter_files():
+            report_list.append(f"{self.name}: [{rowcount} events] {str(columns)}")
+            logger.add(key, f"{report_list[-1]}")
+
+        for key, file, rowcount, columns in tsv_dict.iter_files():
+            report_list.append(f"{tsv_dict.name}: [{rowcount} events] {str(columns)}")
+            logger.add(key, f"{report_list[-1]}")
+
+        # Output keys for files in which the BIDS and EEG.events have different numbers of events
+        count_diffs = self.count_diffs(tsv_dict)
+        if count_diffs:
+            report_list.append(f"\nThe number of {self.name} events and {tsv_dict.name} events" +
+                               f"differ for the following files:")
+            for item in count_diffs:
+                report_list.append(f"The {self.name} file has {item[1]} rows and " +
+                                   f"the {tsv_dict.name} event file has {item[2]} rows")
+                logger.add(item[0], f"{report_list[-1]}", level="ERROR")
+        else:
+            report_list.append(f"\nThe {self.name} and {tsv_dict.name} files have the same number of rows")
+            logger.add("overall", f"{report_list[-1]}")
+
+        return "\n".join(report_list)
diff --git a/hed/tools/bids/bids_tabular_file.py b/hed/tools/bids/bids_tabular_file.py
index f99cdd314..ca059e1a0 100644
--- a/hed/tools/bids/bids_tabular_file.py
+++ b/hed/tools/bids/bids_tabular_file.py
@@ -1,6 +1,6 @@
 import os
 from hed.tools.bids.bids_file import BidsFile
-from hed.models import Sidecar, TabularInput
+from hed.models.tabular_input import TabularInput
 
 
 class BidsTabularFile(BidsFile):
diff --git a/hed/tools/bids/bids_timeseries_file.py b/hed/tools/bids/bids_timeseries_file.py
index 07043f1c0..afd224d79 100644
--- a/hed/tools/bids/bids_timeseries_file.py
+++ b/hed/tools/bids/bids_timeseries_file.py
@@ -1,5 +1,3 @@
-import os
-from hed.models.timeseries_input import TimeseriesInput
 from hed.tools.bids.bids_file import BidsFile
 
 
@@ -30,4 +28,4 @@ def set_contents(self, content_info=None, overwrite=False):
         #     self.contents = TimeseriesInput(file=self.file_path, name=os.path.realpath(self.file_path))
         # columns = self.contents._mapper._column_map.values()
         # if 'HED' in columns or 'HED_assembled' in columns:
-        #     self.has_hed = True
\ No newline at end of file
+        #     self.has_hed = True
diff --git a/hed/tools/util/__init__.py b/hed/tools/util/__init__.py
new file mode 100644
index 000000000..78728342e
--- /dev/null
+++ b/hed/tools/util/__init__.py
@@ -0,0 +1,2 @@
+""" Data and file handling utilities."""
+
diff --git a/hed/util/data_util.py b/hed/tools/util/data_util.py
similarity index 100%
rename from hed/util/data_util.py
rename to hed/tools/util/data_util.py
diff --git a/hed/tools/hed_logger.py b/hed/tools/util/hed_logger.py
similarity index 100%
rename from hed/tools/hed_logger.py
rename to hed/tools/util/hed_logger.py
diff --git a/hed/util/io_util.py b/hed/tools/util/io_util.py
similarity index 94%
rename from hed/util/io_util.py
rename to hed/tools/util/io_util.py
index 558bef326..39241f626 100644
--- a/hed/util/io_util.py
+++ b/hed/tools/util/io_util.py
@@ -91,7 +91,9 @@ def generate_filename(base_name, name_prefix=None, name_suffix=None, extension=N
     return secure_filename(filename)
 
 
-def get_dir_dictionary(dir_path, name_prefix=None, name_suffix=None, extensions=None, skip_empty=True):
+def get_dir_dictionary(dir_path, name_prefix=None, name_suffix=None, extensions=None, skip_empty=True,
+                       exclude_dirs=None):
+
     """ Create dictionary directory paths keys.
 
     Args:
@@ -100,13 +102,18 @@ def get_dir_dictionary(dir_path, name_prefix=None, name_suffix=None, extensions=
         name_suffix (str, None):      An optional name_suffix for the base file name.
         extensions (list, None):      An optional list of file extensions.
         skip_empty (bool):            Do not put entry for directories that have no files.
+        exclude_dirs (list):          List of directories to skip
 
     Returns:
         dict:  Dictionary with directories as keys and file lists values.
 
     """
+
+    if not exclude_dirs:
+        exclude_dirs = []
     dir_dict = {}
     for root, dirs, files in os.walk(dir_path, topdown=True):
+        dirs[:] = [d for d in dirs if d not in exclude_dirs]
         file_list = []
         for r_file in files:
             if check_filename(r_file, name_prefix, name_suffix, extensions):
diff --git a/hed/util/__init__.py b/hed/util/__init__.py
deleted file mode 100644
index 95076bf0a..000000000
--- a/hed/util/__init__.py
+++ /dev/null
@@ -1,4 +0,0 @@
-""" Data and file handling utilities."""
-
-from .data_util import get_new_dataframe, get_value_dict, replace_values, reorder_columns
-from .io_util import check_filename, generate_filename, extract_suffix_path, get_file_list, make_path
diff --git a/readthedocs.yml b/readthedocs.yml
index 273b977cc..e491fe7bc 100644
--- a/readthedocs.yml
+++ b/readthedocs.yml
@@ -15,7 +15,7 @@ sphinx:
 
 
 python:
-  version: 3.7
+  version: 3.9
   install:
    - requirements: docs/requirements.txt
   system_packages: true
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
index be3b25668..3deb4845d 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,13 +1,13 @@
-defusedxml==0.7.1
-et-xmlfile==1.1.0
-inflect==5.5.1
-jdcal==1.4.1
-numpy==1.21.6
-openpyxl==3.0.9
-pandas==1.3.5
-portalocker==2.4.0
-python-dateutil==2.8.2
-pytz==2022.1
-semantic-version==2.9.0
-six==1.16.0
-Werkzeug==2.1.2
+defusedxml>=0.7.1
+et-xmlfile>=1.1.0
+inflect>=5.5.1
+jdcal>=1.4.1
+numpy>=1.21.6
+openpyxl>=3.0.9
+pandas>=1.3.5
+portalocker>=2.4.0
+python-dateutil>=2.8.2
+pytz>=2022.1
+semantic-version>=2.9.0
+six>=1.16.0
+Werkzeug>=2.1.2


Test patch:
diff --git a/tests/data/curation/task-FacePerception_events.json b/tests/data/curation/task-FacePerception_events.json
new file mode 100644
index 000000000..fa018c473
--- /dev/null
+++ b/tests/data/curation/task-FacePerception_events.json
@@ -0,0 +1,138 @@
+{
+  "onset": {
+    "Description": "Position of event marker in seconds relative to the start.",
+    "Units": "s"
+  },
+  "duration": {
+    "Description": "Duration of the event in seconds.",
+    "Units": "s"
+  },
+  "event_type": {
+    "LongName": "Event category",
+    "Description": "The main category of the event.",
+    "Levels": {
+      "show_face": "Display a face to mark end of pre-stimulus and start of blink-inhibition.",
+      "show_face_initial": "Display a face at the beginning of the recording.",
+      "show_circle": "Display a white circle to mark end of the stimulus and blink inhibition.",
+      "show_cross": "Display only a white cross to mark start of trial and fixation.",
+      "left_press": "Experiment participant presses a key with left index finger.",
+      "right_press": "Experiment participant presses a key with right index finger.",
+      "setup_left_sym": "Setup for experiment with pressing key with left index finger means a face with above average symmetry.",
+      "setup_right_sym": "Setup for experiment with pressing key with right index finger means a face with above average symmetry.",
+      "double_press": "Experiment participant presses both keys ."
+    },
+    "HED": {
+      "show_face": "Sensory-event, Experimental-stimulus, (Def/Face-image, Onset), (Def/Blink-inhibition-task,Onset),(Def/Cross-only, Offset)",
+      "show_face_initial": "Sensory-event, Experimental-stimulus, (Def/Face-image, Onset), (Def/Blink-inhibition-task,Onset), (Def/Fixation-task, Onset)",
+      "show_circle": "Sensory-event, (Intended-effect, Cue), (Def/Circle-only, Onset), (Def/Face-image, Offset), (Def/Blink-inhibition-task, Offset), (Def/Fixation-task, Offset)",
+      "show_cross": "Sensory-event, (Intended-effect, Cue), (Def/Cross-only, Onset), (Def/Fixation-task, Onset),  (Def/Circle-only, Offset)",
+      "left_press": "Agent-action, Participant-response, Def/Press-left-finger",
+      "right_press": "Agent-action, Participant-response, Def/Press-right-finger",
+      "setup_left_sym": "Experiment-structure, (Def/Left-sym-cond, Onset), (Def/Initialize-recording, Onset)",
+      "setup_right_sym": "Experiment-structure, (Def/Right-sym-cond, Onset), (Def/Initialize-recording, Onset)",
+      "double_press": "Agent-action, Indeterminate-action, (Press, Keyboard-key)"
+    }
+  },
+  "face_type": {
+    "Description": "Factor indicating type of face image being displayed.",
+    "Levels": {
+      "famous_face": "A face that should be recognized by the participants.",
+      "unfamiliar_face": "A face that should not be recognized by the participants.",
+      "scrambled_face": "A scrambled face image generated by taking face 2D FFT."
+    },
+    "HED": {
+      "famous_face": "Def/Famous-face-cond",
+      "unfamiliar_face": "Def/Unfamiliar-face-cond",
+      "scrambled_face": "Def/Scrambled-face-cond"
+    }
+  },
+  "rep_status": {
+    "Description": "Factor indicating whether this image has been already seen.",
+    "Levels": {
+      "first_show": "Factor level indicating the first display of this face.",
+      "immediate_repeat": "Factor level indicating this face was the same as previous one.",
+      "delayed_repeat": "Factor level indicating face was seen 5 to 15 trials ago."
+    },
+    "HED": {
+      "first_show": "Def/First-show-cond",
+      "immediate_repeat": "Def/Immediate-repeat-cond",
+      "delayed_repeat": "Def/Delayed-repeat-cond"
+    }
+  },
+  "trial": {
+    "Description": "Indicates which trial this event belongs to.",
+    "HED": "Experimental-trial/#"
+  },
+  "rep_lag": {
+    "Description": "How face images before this one was the image was previously presented.",
+    "HED": "(Face, Item-interval/#)"
+  },
+  "stim_file": {
+    "Description": "Path of the stimulus file in the stimuli directory.",
+    "HED": "(Image, Pathname/#)"
+  },
+  "hed_def_sensory": {
+    "Description": "Metadata dictionary for gathering sensory definitions",
+    "HED": {
+      "cross_only_def": "(Definition/Cross-only, (Visual-presentation, (Foreground-view, (White, Cross), (Center-of, Computer-screen)), (Background-view, Black), Description/A white fixation cross on a black background in the center of the screen.))",
+      "face_image_def": "(Definition/Face-image, (Visual-presentation, (Foreground-view, ((Image, Face, Hair), Color/Grayscale), ((White, Cross), (Center-of, Computer-screen))), (Background-view, Black), Description/A happy or neutral face in frontal or three-quarters frontal pose with long hair cropped presented as an achromatic foreground image on a black background with a white fixation cross superposed.))",
+      "circle_only_def": "(Definition/Circle-only, (Visual-presentation, (Foreground-view, ((White, Circle), (Center-of, Computer-screen))), (Background-view, Black), Description/A white circle on a black background in the center of the screen.))"
+    }
+  },
+  "hed_def_actions": {
+    "Description": "Metadata dictionary for gathering participant action definitions",
+    "HED": {
+      "press_left_finger_def": "(Definition/Press-left-finger, ((Index-finger, (Left-side-of, Experiment-participant)), (Press, Keyboard-key), Description/The participant presses a key with the left index finger to indicate a face symmetry judgment.))",
+      "press_right_finger_def": "(Definition/Press-right-finger, ((Index-finger, (Right-side-of, Experiment-participant)), (Press, Keyboard-key), Description/The participant presses a key with the right index finger to indicate a face symmetry evaluation.))"
+    }
+  },
+  "hed_def_conds": {
+    "Description": "Metadata dictionary for gathering experimental condition definitions",
+    "HED": {
+      "famous_face_cond_def": "(Definition/Famous-face-cond, (Condition-variable/Face-type, (Image, (Face, Famous)), Description/A face that should be recognized by the participants))",
+      "unfamiliar_face_cond_def": "(Definition/Unfamiliar-face-cond, (Condition-variable/Face-type, (Image, (Face, Unfamiliar)), Description/A face that should not be recognized by the participants.))",
+      "scrambled_face_cond_def": "(Definition/Scrambled-face-cond, (Condition-variable/Face-type, (Image, (Face, Disordered)), Description/A scrambled face image generated by taking face 2D FFT.))",
+      "first_show_cond_def": "(Definition/First-show-cond, ((Condition-variable/Repetition-type, (Item-count/1, Face), Item-interval/0), Description/Factor level indicating the first display of this face.))",
+      "immediate_repeat_cond_def": "(Definition/Immediate-repeat-cond, ((Condition-variable/Repetition-type, (Item-count/2, Face), Item-interval/1), Description/Factor level indicating this face was the same as previous one.))",
+      "delayed_repeat_cond_def": "(Definition/Delayed-repeat-cond, (Condition-variable/Repetition-type, (Item-count/2, Face), (Item-interval, (Greater-than-or-equal-to, Item-interval/5)), Description/Factor level indicating face was seen 5 to 15 trials ago.))",
+      "left_sym_cond_def": "(Definition/Left-sym-cond, (Condition-variable/Key-assignment, ((Index-finger, (Left-side-of, Experiment-participant)), (Behavioral-evidence, Symmetrical)), ((Index-finger, (Right-side-of, Experiment-participant)), (Behavioral-evidence, Asymmetrical)), Description/Left index finger key press indicates a face with above average symmetry.))",
+      "right_sym_cond_def": "(Definition/Right-sym-cond, (Condition-variable/Key-assignment, ((Index-finger, (Right-side-of, Experiment-participant)), (Behavioral-evidence, Symmetrical)), ((Index-finger, (Left-side-of, Experiment-participant)), (Behavioral-evidence, Asymmetrical)), Description/Right index finger key press indicates a face with above average symmetry.))"
+    }
+  },
+  "hed_def_tasks": {
+    "Description": "Metadata dictionary for gathering task definitions",
+    "HED": {
+      "face_symmetry_evaluation_task_def": "(Definition/Face-symmetry-evaluation-task, (Task, Experiment-participant, (See, Face), (Discriminate, (Face, Symmetrical)), (Press, Keyboard-key), Description/Evaluate degree of image symmetry and respond with key press evaluation.))",
+      "blink_inhibition_task_def": "(Definition/Blink-inhibition-task, (Task, Experiment-participant, Inhibit-blinks, Description/Do not blink while the face image is displayed.))",
+      "fixation_task_def": "(Definition/Fixation-task, (Task, Experiment-participant, (Fixate, Cross), Description/Fixate on the cross at the screen center.))"
+    }
+  },
+  "hed_def_setup": {
+     "Description": "Metadata dictionary for gathering setup definitions",
+     "HED": {
+        "setup_def": "(Definition/Initialize-recording, (Recording))"
+      }
+
+  },
+  "value": {
+    "Description": "Numerical event marker",
+    "Levels": {
+      "x0": "Disappearance of face image and display of the inter-stimulus circle simultaneously",
+      "x1": "Disappearance of face image and display of the inter-stimulus circle simultaneously",
+      "x2": "Initial setup with left finger key press indicating above average symmetry",
+      "x3": "Initial setup with right finger key press indicating above average symmetry",
+      "x5": "Initial presentation of famous face",
+      "x6": "Immediate repeated  presentation of famous face",
+      "x7": "Delayed repeated  presentation of famous face",
+      "x13": "Initial presentation of unfamiliar face",
+      "x14": "Immediate repeated  presentation of unfamiliar face",
+      "x15": "Delayed repeated  presentation of unfamiliar face",
+      "x17": "Initial presentation of scrambled face",
+      "x18": "Immediate repeated  presentation of scrambled face",
+      "x19": "Delayed repeated  presentation of scrambled face",
+      "x256": "Left finger key press",
+      "x4096": "Right finger key press",
+	  "x4352": "Left and right finger key presses"
+    }
+  }
+}
diff --git a/tests/data/invalid_wiki_schemas/HED_default.mediawiki b/tests/data/invalid_wiki_schemas/HED_default.mediawiki
index fb8021e37..049260f12 100644
--- a/tests/data/invalid_wiki_schemas/HED_default.mediawiki
+++ b/tests/data/invalid_wiki_schemas/HED_default.mediawiki
@@ -483,13 +483,13 @@ This is a second prologue line.
 ** Block <nowiki>[An event used to indicate a particular organizational part in the experimental design or plan. Usually the Block tag is used with scoping tags as well as tags describing what the block represents to assist with downstream analysis.]</nowiki>
 ** Collection <nowiki>[A tag designating a grouping of items such as in a set or list.]</nowiki>
 ** Context <nowiki>[A tag indicating the overall environment and setup of the experiment or a portion of the experiment. This event is often inserted into a recording at the beginning of an experimental record to describe information such as whether the experiment is conducted indoors or outdoors or whether the experiment is conducted in the real-world or in a controlled laboratory setting. Tags specifying subject metadata might also be included.]</nowiki>
-** Condition-variable <nowiki>[An aspect of the experiment or task that is to be varied during the experiment. Condition-variables are sometimes called independent variables.]</nowiki>
+** Condition-variable <nowiki>[An aspect of the experiment or task that is to be varied during the experiment. Condition-type_variables are sometimes called independent type_variables.]</nowiki>
 ** Control-variable <nowiki>[An aspect of the experiment that is fixed throughout the study and usually is explicitly controlled.]</nowiki>
 ** Data-acquisition <nowiki>[An activity related to data acquisition.]</nowiki>
 ** Event-stream <nowiki>[An ordered list of events]</nowiki>
 ** Namespace <nowiki>[Tag used to indicate a namespace type of definition.]</nowiki>
 ** Permutation <nowiki>[A tag used within a tag group also containing a Label tag to indicate that the Label represents events that are permutations of each other.]</nowiki>
-** Response-variable <nowiki>[An aspect of the experiment or task that is measured as control-variables are varied during the experiment. Response-variables are sometimes called dependent variables.]</nowiki>
+** Response-variable <nowiki>[An aspect of the experiment or task that is measured as control-type_variables are varied during the experiment. Response-type_variables are sometimes called dependent type_variables.]</nowiki>
 ** Sequence <nowiki>[A tag used within a tag group also containing a Label tag to indicate that the Label represents events related in a sequential order.]</nowiki>
 ** Session
 ** Task <nowiki>[A tag used to indicate a linkage to the task.]</nowiki>
diff --git a/tests/data/invalid_wiki_schemas/HED_separator_invalid.mediawiki b/tests/data/invalid_wiki_schemas/HED_separator_invalid.mediawiki
index 90ede84de..ecdfacc21 100644
--- a/tests/data/invalid_wiki_schemas/HED_separator_invalid.mediawiki
+++ b/tests/data/invalid_wiki_schemas/HED_separator_invalid.mediawiki
@@ -483,13 +483,13 @@ This is a second prologue line.
 ** Block <nowiki>[An event used to indicate a particular organizational part in the experimental design or plan. Usually the Block tag is used with scoping tags as well as tags describing what the block represents to assist with downstream analysis.]</nowiki>
 ** Collection <nowiki>[A tag designating a grouping of items such as in a set or list.]</nowiki>
 ** Context <nowiki>[A tag indicating the overall environment and setup of the experiment or a portion of the experiment. This event is often inserted into a recording at the beginning of an experimental record to describe information such as whether the experiment is conducted indoors or outdoors or whether the experiment is conducted in the real-world or in a controlled laboratory setting. Tags specifying subject metadata might also be included.]</nowiki>
-** Condition-variable <nowiki>[An aspect of the experiment or task that is to be varied during the experiment. Condition-variables are sometimes called independent variables.]</nowiki>
+** Condition-variable <nowiki>[An aspect of the experiment or task that is to be varied during the experiment. Condition-type_variables are sometimes called independent type_variables.]</nowiki>
 ** Control-variable <nowiki>[An aspect of the experiment that is fixed throughout the study and usually is explicitly controlled.]</nowiki>
 ** Data-acquisition <nowiki>[An activity related to data acquisition.]</nowiki>
 ** Event-stream <nowiki>[An ordered list of events]</nowiki>
 ** Namespace <nowiki>[Tag used to indicate a namespace type of definition.]</nowiki>
 ** Permutation <nowiki>[A tag used within a tag group also containing a Label tag to indicate that the Label represents events that are permutations of each other.]</nowiki>
-** Response-variable <nowiki>[An aspect of the experiment or task that is measured as control-variables are varied during the experiment. Response-variables are sometimes called dependent variables.]</nowiki>
+** Response-variable <nowiki>[An aspect of the experiment or task that is measured as control-type_variables are varied during the experiment. Response-type_variables are sometimes called dependent type_variables.]</nowiki>
 ** Sequence <nowiki>[A tag used within a tag group also containing a Label tag to indicate that the Label represents events related in a sequential order.]</nowiki>
 ** Session
 ** Task <nowiki>[A tag used to indicate a linkage to the task.]</nowiki>
diff --git a/tests/data/model_tests/no_column_header_definition.tsv b/tests/data/model_tests/no_column_header_definition.tsv
index d6fc19cb0..27c89d11c 100644
--- a/tests/data/model_tests/no_column_header_definition.tsv
+++ b/tests/data/model_tests/no_column_header_definition.tsv
@@ -1,2 +1,2 @@
-Geometric-object	Event, (Definition/DefTest1, (InvalidDefTag))
+Geometric-object	Event, (Definition/DefTest1, (Circle))
 Square	Item, Def/DefTest1
diff --git a/tests/data/model_tests/no_column_header_definition_long.tsv b/tests/data/model_tests/no_column_header_definition_long.tsv
index 68aafa49e..c58990c03 100644
--- a/tests/data/model_tests/no_column_header_definition_long.tsv
+++ b/tests/data/model_tests/no_column_header_definition_long.tsv
@@ -1,2 +1,2 @@
 Item/Object/Geometric-object	Event,(Property/Organizational-property/Definition/DefTest1,(InvalidDefTag))
-Item/Object/Geometric-object/2D-shape/Rectangle/Square	Item,Property/Organizational-property/Def/DefTest1
+Item/Object/Geometric-object/2D-shape/Circle	Item,Property/Organizational-property/Def/DefTest1
diff --git a/tests/data/schema_test_data/HED8.0.0.mediawiki b/tests/data/schema_test_data/HED8.0.0.mediawiki
index 3a68cfe85..60149ac4e 100644
--- a/tests/data/schema_test_data/HED8.0.0.mediawiki
+++ b/tests/data/schema_test_data/HED8.0.0.mediawiki
@@ -733,7 +733,7 @@ This schema is the first official release that includes an xsd and requires unit
 * Organizational-property <nowiki>[Relating to an organization or the action of organizing something.]</nowiki>
 ** Collection <nowiki>[A tag designating a grouping of items such as in a set or list.]</nowiki>
 *** <nowiki># {takesValue, valueClass=nameClass}[Name of the collection.]</nowiki>
-** Condition-variable <nowiki>[An aspect of the experiment or task that is to be varied during the experiment. Task-conditions are sometimes called independent variables or contrasts.]</nowiki>
+** Condition-variable <nowiki>[An aspect of the experiment or task that is to be varied during the experiment. Task-conditions are sometimes called independent type_variables or contrasts.]</nowiki>
 *** <nowiki># {takesValue, valueClass=nameClass}[Name of the condition variable.]</nowiki>
 ** Control-variable <nowiki>[An aspect of the experiment that is fixed throughout the study and usually is explicitly controlled.]</nowiki>
 *** <nowiki># {takesValue, valueClass=nameClass}[Name of the control variable.]</nowiki>
@@ -750,7 +750,7 @@ This schema is the first official release that includes an xsd and requires unit
 *** <nowiki># {takesValue, valueClass=nameClass}[Optional label for the intertrial block.]</nowiki>
 ** Experimental-trial <nowiki>[Designates a run or execution of an activity, for example, one execution of a script. A tag used to indicate a particular organizational part in the experimental design often containing a stimulus-response pair or stimulus-response-feedback triad.]</nowiki>
 *** <nowiki># {takesValue, valueClass=nameClass}[Optional label for the trial (often a numerical string).]</nowiki>
-** Indicator-variable <nowiki>[An aspect of the experiment or task that is measured as task conditions are varied during the experiment. Experiment indicators are sometimes called dependent variables.]</nowiki>
+** Indicator-variable <nowiki>[An aspect of the experiment or task that is measured as task conditions are varied during the experiment. Experiment indicators are sometimes called dependent type_variables.]</nowiki>
 *** <nowiki># {takesValue, valueClass=nameClass}[Name of the indicator variable.]</nowiki>
 ** Recording <nowiki>[A tag designating the data recording. Recording tags are usually have temporal scope which is the entire recording.]</nowiki>
 *** <nowiki># {takesValue, valueClass=nameClass}[Optional label for the recording.]</nowiki>
diff --git a/tests/data/schema_test_data/HED8.0.0.xml b/tests/data/schema_test_data/HED8.0.0.xml
index 24a5241a2..f8e99ff91 100644
--- a/tests/data/schema_test_data/HED8.0.0.xml
+++ b/tests/data/schema_test_data/HED8.0.0.xml
@@ -3790,7 +3790,7 @@
             </node>
             <node>
                <name>Condition-variable</name>
-               <description>An aspect of the experiment or task that is to be varied during the experiment. Task-conditions are sometimes called independent variables or contrasts.</description>
+               <description>An aspect of the experiment or task that is to be varied during the experiment. Task-conditions are sometimes called independent type_variables or contrasts.</description>
                <node>
                   <name>#</name>
                   <description>Name of the condition variable.</description>
@@ -3934,7 +3934,7 @@
             </node>
             <node>
                <name>Indicator-variable</name>
-               <description>An aspect of the experiment or task that is measured as task conditions are varied during the experiment. Experiment indicators are sometimes called dependent variables.</description>
+               <description>An aspect of the experiment or task that is measured as task conditions are varied during the experiment. Experiment indicators are sometimes called dependent type_variables.</description>
                <node>
                   <name>#</name>
                   <description>Name of the indicator variable.</description>
diff --git a/tests/data/schema_test_data/HED8.0.0_2_value_classes.mediawiki b/tests/data/schema_test_data/HED8.0.0_2_value_classes.mediawiki
index c66d805b9..9e5410ca7 100644
--- a/tests/data/schema_test_data/HED8.0.0_2_value_classes.mediawiki
+++ b/tests/data/schema_test_data/HED8.0.0_2_value_classes.mediawiki
@@ -734,7 +734,7 @@ This schema is the first official release that includes an xsd and requires unit
 * Organizational-property <nowiki>[Relating to an organization or the action of organizing something.]</nowiki>
 ** Collection <nowiki>[A tag designating a grouping of items such as in a set or list.]</nowiki>
 *** <nowiki># {takesValue, valueClass=nameClass}[Name of the collection.]</nowiki>
-** Condition-variable <nowiki>[An aspect of the experiment or task that is to be varied during the experiment. Task-conditions are sometimes called independent variables or contrasts.]</nowiki>
+** Condition-variable <nowiki>[An aspect of the experiment or task that is to be varied during the experiment. Task-conditions are sometimes called independent type_variables or contrasts.]</nowiki>
 *** <nowiki># {takesValue, valueClass=nameClass}[Name of the condition variable.]</nowiki>
 ** Control-variable <nowiki>[An aspect of the experiment that is fixed throughout the study and usually is explicitly controlled.]</nowiki>
 *** <nowiki># {takesValue, valueClass=nameClass}[Name of the control variable.]</nowiki>
@@ -751,7 +751,7 @@ This schema is the first official release that includes an xsd and requires unit
 *** <nowiki># {takesValue, valueClass=nameClass}[Optional label for the intertrial block.]</nowiki>
 ** Experimental-trial <nowiki>[Designates a run or execution of an activity, for example, one execution of a script. A tag used to indicate a particular organizational part in the experimental design often containing a stimulus-response pair or stimulus-response-feedback triad.]</nowiki>
 *** <nowiki># {takesValue, valueClass=nameClass}[Optional label for the trial (often a numerical string).]</nowiki>
-** Indicator-variable <nowiki>[An aspect of the experiment or task that is measured as task conditions are varied during the experiment. Experiment indicators are sometimes called dependent variables.]</nowiki>
+** Indicator-variable <nowiki>[An aspect of the experiment or task that is measured as task conditions are varied during the experiment. Experiment indicators are sometimes called dependent type_variables.]</nowiki>
 *** <nowiki># {takesValue, valueClass=nameClass}[Name of the indicator variable.]</nowiki>
 ** Recording <nowiki>[A tag designating the data recording. Recording tags are usually have temporal scope which is the entire recording.]</nowiki>
 *** <nowiki># {takesValue, valueClass=nameClass}[Optional label for the recording.]</nowiki>
diff --git a/tests/data/schema_test_data/HED8.0.0_2_value_classes.xml b/tests/data/schema_test_data/HED8.0.0_2_value_classes.xml
index 1c63a2514..f332c2c07 100644
--- a/tests/data/schema_test_data/HED8.0.0_2_value_classes.xml
+++ b/tests/data/schema_test_data/HED8.0.0_2_value_classes.xml
@@ -3812,7 +3812,7 @@
             </node>
             <node>
                <name>Condition-variable</name>
-               <description>An aspect of the experiment or task that is to be varied during the experiment. Task-conditions are sometimes called independent variables or contrasts.</description>
+               <description>An aspect of the experiment or task that is to be varied during the experiment. Task-conditions are sometimes called independent type_variables or contrasts.</description>
                <node>
                   <name>#</name>
                   <description>Name of the condition variable.</description>
@@ -3956,7 +3956,7 @@
             </node>
             <node>
                <name>Indicator-variable</name>
-               <description>An aspect of the experiment or task that is measured as task conditions are varied during the experiment. Experiment indicators are sometimes called dependent variables.</description>
+               <description>An aspect of the experiment or task that is measured as task conditions are varied during the experiment. Experiment indicators are sometimes called dependent type_variables.</description>
                <node>
                   <name>#</name>
                   <description>Name of the indicator variable.</description>
diff --git a/tests/data/schema_test_data/HED8.0.0t.xml b/tests/data/schema_test_data/HED8.0.0t.xml
index c17f9a316..4c9a0ecec 100644
--- a/tests/data/schema_test_data/HED8.0.0t.xml
+++ b/tests/data/schema_test_data/HED8.0.0t.xml
@@ -3797,7 +3797,7 @@
             </node>
             <node>
                <name>Condition-variable</name>
-               <description>An aspect of the experiment or task that is to be varied during the experiment. Task-conditions are sometimes called independent variables or contrasts.</description>
+               <description>An aspect of the experiment or task that is to be varied during the experiment. Task-conditions are sometimes called independent type_variables or contrasts.</description>
                <node>
                   <name>#</name>
                   <description>Name of the condition variable.</description>
@@ -3941,7 +3941,7 @@
             </node>
             <node>
                <name>Indicator-variable</name>
-               <description>An aspect of the experiment or task that is measured as task conditions are varied during the experiment. Experiment indicators are sometimes called dependent variables.</description>
+               <description>An aspect of the experiment or task that is measured as task conditions are varied during the experiment. Experiment indicators are sometimes called dependent type_variables.</description>
                <node>
                   <name>#</name>
                   <description>Name of the indicator variable.</description>
diff --git a/tests/data/schema_test_data/HED8.1.0.xml b/tests/data/schema_test_data/HED8.1.0.xml
new file mode 100644
index 000000000..5d1ae122b
--- /dev/null
+++ b/tests/data/schema_test_data/HED8.1.0.xml
@@ -0,0 +1,7072 @@
+<?xml version="1.0" ?>
+<HED xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="8.1.0" xsi:noNamespaceSchemaLocation="https://github.com/hed-standard/hed-specification/raw/master/hedxml/HED8.0.0.xsd">
+   <prologue>This schema includes an xsd and requires unit class, unit modifier, value class, schema attribute and property sections.
+
+</prologue>
+   <schema>
+      <node>
+         <name>Event</name>
+         <description>Something that happens at a given time and (typically) place. Elements of this tag subtree designate the general category in which an event falls.</description>
+         <attribute>
+            <name>suggestedTag</name>
+            <value>Task-property</value>
+         </attribute>
+         <node>
+            <name>Sensory-event</name>
+            <description>Something perceivable by the participant. An event meant to be an experimental stimulus should include the tag Task-property/Task-event-role/Experimental-stimulus.</description>
+            <attribute>
+               <name>suggestedTag</name>
+               <value>Task-event-role</value>
+               <value>Sensory-presentation</value>
+            </attribute>
+         </node>
+         <node>
+            <name>Agent-action</name>
+            <description>Any action engaged in by an agent (see the Agent subtree for agent categories). A participant response to an experiment stimulus should include the tag Agent-property/Agent-task-role/Experiment-participant.</description>
+            <attribute>
+               <name>suggestedTag</name>
+               <value>Task-event-role</value>
+               <value>Agent</value>
+            </attribute>
+         </node>
+         <node>
+            <name>Data-feature</name>
+            <description>An event marking the occurrence of a data feature such as an interictal spike or alpha burst that is often added post hoc to the data record.</description>
+            <attribute>
+               <name>suggestedTag</name>
+               <value>Data-property</value>
+            </attribute>
+         </node>
+         <node>
+            <name>Experiment-control</name>
+            <description>An event pertaining to the physical control of the experiment during its operation.</description>
+         </node>
+         <node>
+            <name>Experiment-procedure</name>
+            <description>An event indicating an experimental procedure, as in performing a saliva swab during the experiment or administering a survey.</description>
+         </node>
+         <node>
+            <name>Experiment-structure</name>
+            <description>An event specifying a change-point of the structure of experiment. This event is typically used to indicate a change in experimental conditions or tasks.</description>
+         </node>
+         <node>
+            <name>Measurement-event</name>
+            <description>A discrete measure returned by an instrument.</description>
+            <attribute>
+               <name>suggestedTag</name>
+               <value>Data-property</value>
+            </attribute>
+         </node>
+      </node>
+      <node>
+         <name>Agent</name>
+         <description>Someone or something that takes an active role or produces a specified effect.The role or effect may be implicit. Being alive or performing an activity such as a computation may qualify something to be an agent. An agent may also be something that simulates something else.</description>
+         <attribute>
+            <name>suggestedTag</name>
+            <value>Agent-property</value>
+         </attribute>
+         <node>
+            <name>Animal-agent</name>
+            <description>An agent that is an animal.</description>
+         </node>
+         <node>
+            <name>Avatar-agent</name>
+            <description>An agent associated with an icon or avatar representing another agent.</description>
+         </node>
+         <node>
+            <name>Controller-agent</name>
+            <description>An agent experiment control software or hardware.</description>
+         </node>
+         <node>
+            <name>Human-agent</name>
+            <description>A person who takes an active role or produces a specified effect.</description>
+         </node>
+         <node>
+            <name>Robotic-agent</name>
+            <description>An agent mechanical device capable of performing a variety of often complex tasks on command or by being programmed in advance.</description>
+         </node>
+         <node>
+            <name>Software-agent</name>
+            <description>An agent computer program.</description>
+         </node>
+      </node>
+      <node>
+         <name>Action</name>
+         <description>Do something.</description>
+         <attribute>
+            <name>extensionAllowed</name>
+         </attribute>
+         <node>
+            <name>Communicate</name>
+            <description>Convey knowledge of or information about something.</description>
+            <node>
+               <name>Communicate-gesturally</name>
+               <description>Communicate nonverbally using visible bodily actions, either in place of speech or together and in parallel with spoken words. Gestures include movement of the hands, face, or other parts of the body.</description>
+               <attribute>
+                  <name>relatedTag</name>
+                  <value>Move-face</value>
+                  <value>Move-upper-extremity</value>
+               </attribute>
+               <node>
+                  <name>Clap-hands</name>
+                  <description>Strike the palms of against one another resoundingly, and usually repeatedly, especially to express approval.</description>
+               </node>
+               <node>
+                  <name>Clear-throat</name>
+                  <description>Cough slightly so as to speak more clearly, attract attention, or to express hesitancy before saying something awkward.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Move-face</value>
+                     <value>Move-head</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Frown</name>
+                  <description>Express disapproval, displeasure, or concentration, typically by turning down the corners of the mouth.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Move-face</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Grimace</name>
+                  <description>Make a twisted expression, typically expressing disgust, pain, or wry amusement.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Move-face</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Nod-head</name>
+                  <description>Tilt head in alternating up and down arcs along the sagittal plane. It is most commonly, but not universally, used to indicate agreement, acceptance, or acknowledgement.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Move-head</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Pump-fist</name>
+                  <description>Raise with fist clenched in triumph or affirmation.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Move-upper-extremity</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Raise-eyebrows</name>
+                  <description>Move eyebrows upward.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Move-face</value>
+                     <value>Move-eyes</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Shake-fist</name>
+                  <description>Clench hand into a fist and shake to demonstrate anger.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Move-upper-extremity</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Shake-head</name>
+                  <description>Turn head from side to side as a way of showing disagreement or refusal.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Move-head</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Shhh</name>
+                  <description>Place finger over lips and possibly uttering the syllable shhh to indicate the need to be quiet.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Move-upper-extremity</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Shrug</name>
+                  <description>Lift shoulders up towards head to indicate a lack of knowledge about a particular topic.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Move-upper-extremity</value>
+                     <value>Move-torso</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Smile</name>
+                  <description>Form facial features into a pleased, kind, or amused expression, typically with the corners of the mouth turned up and the front teeth exposed.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Move-face</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Spread-hands</name>
+                  <description>Spread hands apart to indicate ignorance.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Move-upper-extremity</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Thumbs-down</name>
+                  <description>Extend the thumb downward to indicate disapproval.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Move-upper-extremity</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Thumb-up</name>
+                  <description>Extend the thumb upward to indicate approval.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Move-upper-extremity</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Wave</name>
+                  <description>Raise hand and move left and right, as a greeting or sign of departure.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Move-upper-extremity</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Widen-eyes</name>
+                  <description>Open eyes and possibly with eyebrows lifted especially to express surprise or fear.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Move-face</value>
+                     <value>Move-eyes</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Wink</name>
+                  <description>Close and open one eye quickly, typically to indicate that something is a joke or a secret or as a signal of affection or greeting.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Move-face</value>
+                     <value>Move-eyes</value>
+                  </attribute>
+               </node>
+            </node>
+            <node>
+               <name>Communicate-musically</name>
+               <description>Communicate using music.</description>
+               <node>
+                  <name>Hum</name>
+                  <description>Make a low, steady continuous sound like that of a bee. Sing with the lips closed and without uttering speech.</description>
+               </node>
+               <node>
+                  <name>Play-instrument</name>
+                  <description>Make musical sounds using an instrument.</description>
+               </node>
+               <node>
+                  <name>Sing</name>
+                  <description>Produce musical tones by means of the voice.</description>
+               </node>
+               <node>
+                  <name>Vocalize</name>
+                  <description>Utter vocal sounds.</description>
+               </node>
+               <node>
+                  <name>Whistle</name>
+                  <description>Produce a shrill clear sound by forcing breath out or air in through the puckered lips.</description>
+               </node>
+            </node>
+            <node>
+               <name>Communicate-vocally</name>
+               <description>Communicate using mouth or vocal cords.</description>
+               <node>
+                  <name>Cry</name>
+                  <description>Shed tears associated with emotions, usually sadness but also joy or frustration.</description>
+               </node>
+               <node>
+                  <name>Groan</name>
+                  <description>Make a deep inarticulate sound in response to pain or despair.</description>
+               </node>
+               <node>
+                  <name>Laugh</name>
+                  <description>Make the spontaneous sounds and movements of the face and body that are the instinctive expressions of lively amusement and sometimes also of contempt or derision.</description>
+               </node>
+               <node>
+                  <name>Scream</name>
+                  <description>Make loud, vociferous cries or yells to express pain, excitement, or fear.</description>
+               </node>
+               <node>
+                  <name>Shout</name>
+                  <description>Say something very loudly.</description>
+               </node>
+               <node>
+                  <name>Sigh</name>
+                  <description>Emit a long, deep, audible breath expressing sadness, relief, tiredness, or a similar feeling.</description>
+               </node>
+               <node>
+                  <name>Speak</name>
+                  <description>Communicate using spoken language.</description>
+               </node>
+               <node>
+                  <name>Whisper</name>
+                  <description>Speak very softly using breath without vocal cords.</description>
+               </node>
+            </node>
+         </node>
+         <node>
+            <name>Move</name>
+            <description>Move in a specified direction or manner. Change position or posture.</description>
+            <node>
+               <name>Breathe</name>
+               <description>Inhale or exhale during respiration.</description>
+               <node>
+                  <name>Blow</name>
+                  <description>Expel air through pursed lips.</description>
+               </node>
+               <node>
+                  <name>Cough</name>
+                  <description>Suddenly and audibly expel air from the lungs through a partially closed glottis, preceded by inhalation.</description>
+               </node>
+               <node>
+                  <name>Exhale</name>
+                  <description>Blow out or expel breath.</description>
+               </node>
+               <node>
+                  <name>Hiccup</name>
+                  <description>Involuntarily spasm  the diaphragm and respiratory organs, with a sudden closure of the glottis and a characteristic sound like that of a cough.</description>
+               </node>
+               <node>
+                  <name>Hold-breath</name>
+                  <description>Interrupt normal breathing by ceasing to inhale or exhale.</description>
+               </node>
+               <node>
+                  <name>Inhale</name>
+                  <description>Draw in with the breath through the nose or mouth.</description>
+               </node>
+               <node>
+                  <name>Sneeze</name>
+                  <description>Suddenly and violently expel breath through the nose and mouth.</description>
+               </node>
+               <node>
+                  <name>Sniff</name>
+                  <description>Draw in air audibly through the nose to detect a smell, to stop it from running, or to express contempt.</description>
+               </node>
+            </node>
+            <node>
+               <name>Move-body</name>
+               <description>Move entire body.</description>
+               <node>
+                  <name>Bend</name>
+                  <description>Move body in a bowed or curved manner.</description>
+               </node>
+               <node>
+                  <name>Dance</name>
+                  <description>Perform a purposefully selected sequences of human movement often with aesthetic or symbolic value. Move rhythmically to music, typically following a set sequence of steps.</description>
+               </node>
+               <node>
+                  <name>Fall-down</name>
+                  <description>Lose balance and collapse.</description>
+               </node>
+               <node>
+                  <name>Flex</name>
+                  <description>Cause a muscle to stand out by contracting or tensing it. Bend a limb or joint.</description>
+               </node>
+               <node>
+                  <name>Jerk</name>
+                  <description>Make a quick, sharp, sudden movement.</description>
+               </node>
+               <node>
+                  <name>Lie-down</name>
+                  <description>Move to a horizontal or resting position.</description>
+               </node>
+               <node>
+                  <name>Recover-balance</name>
+                  <description>Return to a stable, upright body position.</description>
+               </node>
+               <node>
+                  <name>Sit-down</name>
+                  <description>Move from a standing to a sitting position.</description>
+               </node>
+               <node>
+                  <name>Sit-up</name>
+                  <description>Move from lying down to a sitting position.</description>
+               </node>
+               <node>
+                  <name>Stand-up</name>
+                  <description>Move from a sitting to a standing position.</description>
+               </node>
+               <node>
+                  <name>Stretch</name>
+                  <description>Straighten or extend body or a part of body to its full length, typically so as to tighten muscles or in order to reach something.</description>
+               </node>
+               <node>
+                  <name>Shudder</name>
+                  <description>Tremble convulsively, sometimes as a result of fear or revulsion.</description>
+               </node>
+               <node>
+                  <name>Stumble</name>
+                  <description>Trip or momentarily lose balance and almost fall.</description>
+               </node>
+               <node>
+                  <name>Turn</name>
+                  <description>Change or cause to change direction.</description>
+               </node>
+            </node>
+            <node>
+               <name>Move-body-part</name>
+               <description>Move one part of a body.</description>
+               <node>
+                  <name>Move-eyes</name>
+                  <description>Move eyes.</description>
+                  <node>
+                     <name>Blink</name>
+                     <description>Shut and open the eyes quickly.</description>
+                  </node>
+                  <node>
+                     <name>Close-eyes</name>
+                     <description>Lower and keep eyelids in a closed position.</description>
+                  </node>
+                  <node>
+                     <name>Fixate</name>
+                     <description>Direct eyes to a specific point or target.</description>
+                  </node>
+                  <node>
+                     <name>Inhibit-blinks</name>
+                     <description>Purposely prevent blinking.</description>
+                  </node>
+                  <node>
+                     <name>Open-eyes</name>
+                     <description>Raise eyelids to expose pupil.</description>
+                  </node>
+                  <node>
+                     <name>Saccade</name>
+                     <description>Move eyes rapidly between fixation points.</description>
+                  </node>
+                  <node>
+                     <name>Squint</name>
+                     <description>Squeeze one or both eyes partly closed in an attempt to see more clearly or as a reaction to strong light.</description>
+                  </node>
+                  <node>
+                     <name>Stare</name>
+                     <description>Look fixedly or vacantly at someone or something with eyes wide open.</description>
+                  </node>
+               </node>
+               <node>
+                  <name>Move-face</name>
+                  <description>Move the face or jaw.</description>
+                  <node>
+                     <name>Bite</name>
+                     <description>Seize with teeth or jaws an object or organism so as to grip or break the surface covering.</description>
+                  </node>
+                  <node>
+                     <name>Burp</name>
+                     <description>Noisily release air from the stomach through the mouth. Belch.</description>
+                  </node>
+                  <node>
+                     <name>Chew</name>
+                     <description>Repeatedly grinding, tearing, and or crushing with teeth or jaws.</description>
+                  </node>
+                  <node>
+                     <name>Gurgle</name>
+                     <description>Make a hollow bubbling sound like that made by water running out of a bottle.</description>
+                  </node>
+                  <node>
+                     <name>Swallow</name>
+                     <description>Cause or allow something, especially food or drink to pass down the throat.</description>
+                     <node>
+                        <name>Gulp</name>
+                        <description>Swallow quickly or in large mouthfuls, often audibly, sometimes to indicate apprehension.</description>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Yawn</name>
+                     <description>Take a deep involuntary  inhalation with the mouth open often as a sign of drowsiness or boredom.</description>
+                  </node>
+               </node>
+               <node>
+                  <name>Move-head</name>
+                  <description>Move head.</description>
+                  <node>
+                     <name>Lift-head</name>
+                     <description>Tilt head back lifting chin.</description>
+                  </node>
+                  <node>
+                     <name>Lower-head</name>
+                     <description>Move head downward so that eyes are in a lower position.</description>
+                  </node>
+                  <node>
+                     <name>Turn-head</name>
+                     <description>Rotate head horizontally to look in a different direction.</description>
+                  </node>
+               </node>
+               <node>
+                  <name>Move-lower-extremity</name>
+                  <description>Move leg and/or foot.</description>
+                  <node>
+                     <name>Curl-toes</name>
+                     <description>Bend toes sometimes to grip.</description>
+                  </node>
+                  <node>
+                     <name>Hop</name>
+                     <description>Jump on one foot.</description>
+                  </node>
+                  <node>
+                     <name>Jog</name>
+                     <description>Run at a trot to exercise.</description>
+                  </node>
+                  <node>
+                     <name>Jump</name>
+                     <description>Move off the ground or other surface through sudden muscular effort in the legs.</description>
+                  </node>
+                  <node>
+                     <name>Kick</name>
+                     <description>Strike out or flail with the foot or feet.  Strike using the leg, in unison usually with an area of the knee or lower using the foot.</description>
+                  </node>
+                  <node>
+                     <name>Pedal</name>
+                     <description>Move by working the pedals of a bicycle or other machine.</description>
+                  </node>
+                  <node>
+                     <name>Press-foot</name>
+                     <description>Move by pressing foot.</description>
+                  </node>
+                  <node>
+                     <name>Run</name>
+                     <description>Travel on foot at a fast pace.</description>
+                  </node>
+                  <node>
+                     <name>Step</name>
+                     <description>Put one leg in front of the other and shift weight onto it.</description>
+                     <node>
+                        <name>Heel-strike</name>
+                        <description>Strike the ground with the heel during a step.</description>
+                     </node>
+                     <node>
+                        <name>Toe-off</name>
+                        <description>Push with toe as part of a stride.</description>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Trot</name>
+                     <description>Run at a moderate pace, typically with short steps.</description>
+                  </node>
+                  <node>
+                     <name>Walk</name>
+                     <description>Move at a regular pace by lifting and setting down each foot in turn never having both feet off the ground at once.</description>
+                  </node>
+               </node>
+               <node>
+                  <name>Move-torso</name>
+                  <description>Move body trunk.</description>
+               </node>
+               <node>
+                  <name>Move-upper-extremity</name>
+                  <description>Move arm, shoulder, and/or hand.</description>
+                  <node>
+                     <name>Drop</name>
+                     <description>Let or cause to fall vertically.</description>
+                  </node>
+                  <node>
+                     <name>Grab</name>
+                     <description>Seize suddenly or quickly. Snatch or clutch.</description>
+                  </node>
+                  <node>
+                     <name>Grasp</name>
+                     <description>Seize and hold firmly.</description>
+                  </node>
+                  <node>
+                     <name>Hold-down</name>
+                     <description>Prevent someone or something from moving by holding them firmly.</description>
+                  </node>
+                  <node>
+                     <name>Lift</name>
+                     <description>Raising something to higher position.</description>
+                  </node>
+                  <node>
+                     <name>Make-fist</name>
+                     <description>Close hand tightly with the fingers bent against the palm.</description>
+                  </node>
+                  <node>
+                     <name>Point</name>
+                     <description>Draw attention to something by extending a finger or arm.</description>
+                  </node>
+                  <node>
+                     <name>Press</name>
+                     <description>Apply pressure to something to flatten, shape, smooth or depress it. This action tag should be used to indicate key presses and mouse clicks.</description>
+                     <attribute>
+                        <name>relatedTag</name>
+                        <value>Push</value>
+                     </attribute>
+                  </node>
+                  <node>
+                     <name>Push</name>
+                     <description>Apply force in order to move something away. Use Press to indicate a key press or mouse click.</description>
+                     <attribute>
+                        <name>relatedTag</name>
+                        <value>Press</value>
+                     </attribute>
+                  </node>
+                  <node>
+                     <name>Reach</name>
+                     <description>Stretch out your arm in order to get or touch something.</description>
+                  </node>
+                  <node>
+                     <name>Release</name>
+                     <description>Make available or set free.</description>
+                  </node>
+                  <node>
+                     <name>Retract</name>
+                     <description>Draw or pull back.</description>
+                  </node>
+                  <node>
+                     <name>Scratch</name>
+                     <description>Drag claws or nails over a surface or on skin.</description>
+                  </node>
+                  <node>
+                     <name>Snap-fingers</name>
+                     <description>Make a noise by pushing second finger hard against thumb and then releasing it suddenly so that it hits the base of the thumb.</description>
+                  </node>
+                  <node>
+                     <name>Touch</name>
+                     <description>Come into or be in contact with.</description>
+                  </node>
+               </node>
+            </node>
+         </node>
+         <node>
+            <name>Perceive</name>
+            <description>Produce an internal, conscious image through stimulating a sensory system.</description>
+            <node>
+               <name>Hear</name>
+               <description>Give attention to a sound.</description>
+            </node>
+            <node>
+               <name>See</name>
+               <description>Direct gaze toward someone or something or in a specified direction.</description>
+            </node>
+            <node>
+               <name>Smell</name>
+               <description>Inhale in order to ascertain an odor or scent.</description>
+            </node>
+            <node>
+               <name>Taste</name>
+               <description>Sense a flavor in the mouth and throat on contact with a substance.</description>
+            </node>
+            <node>
+               <name>Sense-by-touch</name>
+               <description>Sense something through receptors in the skin.</description>
+            </node>
+         </node>
+         <node>
+            <name>Perform</name>
+            <description>Carry out or accomplish an action, task, or function.</description>
+            <node>
+               <name>Close</name>
+               <description>Act as to blocked against entry or passage.</description>
+            </node>
+            <node>
+               <name>Collide-with</name>
+               <description>Hit with force when moving.</description>
+            </node>
+            <node>
+               <name>Halt</name>
+               <description>Bring or come to an abrupt stop.</description>
+            </node>
+            <node>
+               <name>Modify</name>
+               <description>Change something.</description>
+            </node>
+            <node>
+               <name>Open</name>
+               <description>Widen an aperture, door, or gap, especially one allowing access to something.</description>
+            </node>
+            <node>
+               <name>Operate</name>
+               <description>Control the functioning of a machine, process, or system.</description>
+            </node>
+            <node>
+               <name>Play</name>
+               <description>Engage in activity for enjoyment and recreation rather than a serious or practical purpose.</description>
+            </node>
+            <node>
+               <name>Read</name>
+               <description>Interpret something that is written or printed.</description>
+            </node>
+            <node>
+               <name>Repeat</name>
+               <description>Make do or perform again.</description>
+            </node>
+            <node>
+               <name>Rest</name>
+               <description>Be inactive in order to regain strength, health, or energy.</description>
+            </node>
+            <node>
+               <name>Write</name>
+               <description>Communicate or express by means of letters or symbols written or imprinted on a surface.</description>
+            </node>
+         </node>
+         <node>
+            <name>Think</name>
+            <description>Direct the mind toward someone or something or use the mind actively to form connected ideas.</description>
+            <node>
+               <name>Allow</name>
+               <description>Allow access to something such as allowing a car to pass.</description>
+            </node>
+            <node>
+               <name>Attend-to</name>
+               <description>Focus mental experience on specific targets.</description>
+            </node>
+            <node>
+               <name>Count</name>
+               <description>Tally items either silently or aloud.</description>
+            </node>
+            <node>
+               <name>Deny</name>
+               <description>Refuse to give or grant something requested or desired by someone.</description>
+            </node>
+            <node>
+               <name>Detect</name>
+               <description>Discover or identify the presence or existence of something.</description>
+            </node>
+            <node>
+               <name>Discriminate</name>
+               <description>Recognize a distinction.</description>
+            </node>
+            <node>
+               <name>Encode</name>
+               <description>Convert information or an instruction into a particular form.</description>
+            </node>
+            <node>
+               <name>Evade</name>
+               <description>Escape or avoid, especially by cleverness or trickery.</description>
+            </node>
+            <node>
+               <name>Generate</name>
+               <description>Cause something, especially an emotion or situation to arise or come about.</description>
+            </node>
+            <node>
+               <name>Identify</name>
+               <description>Establish or indicate who or what someone or something is.</description>
+            </node>
+            <node>
+               <name>Imagine</name>
+               <description>Form a mental image or concept of something.</description>
+            </node>
+            <node>
+               <name>Judge</name>
+               <description>Evaluate evidence to make a decision or form a belief.</description>
+            </node>
+            <node>
+               <name>Learn</name>
+               <description>Adaptively change behavior as the result of experience.</description>
+            </node>
+            <node>
+               <name>Memorize</name>
+               <description>Adaptively change behavior as the result of experience.</description>
+            </node>
+            <node>
+               <name>Plan</name>
+               <description>Think about the activities required to achieve a desired goal.</description>
+            </node>
+            <node>
+               <name>Predict</name>
+               <description>Say or estimate that something will happen or will be a consequence of something without having exact informaton.</description>
+            </node>
+            <node>
+               <name>Recognize</name>
+               <description>Identify someone or something from having encountered them before.</description>
+            </node>
+            <node>
+               <name>Respond</name>
+               <description>React to something such as a treatment or a stimulus.</description>
+            </node>
+            <node>
+               <name>Recall</name>
+               <description>Remember information by mental effort.</description>
+            </node>
+            <node>
+               <name>Switch-attention</name>
+               <description>Transfer attention from one focus to another.</description>
+            </node>
+            <node>
+               <name>Track</name>
+               <description>Follow a person, animal, or object through space or time.</description>
+            </node>
+         </node>
+      </node>
+      <node>
+         <name>Item</name>
+         <description>An independently existing thing (living or nonliving).</description>
+         <attribute>
+            <name>extensionAllowed</name>
+         </attribute>
+         <node>
+            <name>Biological-item</name>
+            <description>An entity that is biological, that is related to living organisms.</description>
+            <node>
+               <name>Anatomical-item</name>
+               <description>A biological structure, system, fluid or other substance excluding single molecular entities.</description>
+               <node>
+                  <name>Body</name>
+                  <description>The biological structure representing an organism.</description>
+               </node>
+               <node>
+                  <name>Body-part</name>
+                  <description>Any part of an organism.</description>
+                  <node>
+                     <name>Head</name>
+                     <description>The upper part of the human body, or the front or upper part of the body of an animal, typically separated from the rest of the body by a neck, and containing the brain, mouth, and sense organs.</description>
+                     <node>
+                        <name>Hair</name>
+                        <description>The filamentous outgrowth of the epidermis.</description>
+                     </node>
+                     <node>
+                        <name>Ear</name>
+                        <description>A sense organ needed for the detection of sound and for establishing balance.</description>
+                     </node>
+                     <node>
+                        <name>Face</name>
+                        <description>The anterior portion of the head extending from the forehead to the chin and ear to ear. The facial structures contain the eyes, nose and mouth, cheeks and jaws.</description>
+                        <node>
+                           <name>Cheek</name>
+                           <description>The fleshy part of the face bounded by the eyes, nose, ear, and jaw line.</description>
+                        </node>
+                        <node>
+                           <name>Chin</name>
+                           <description>The part of the face below the lower lip and including the protruding part of the lower jaw.</description>
+                        </node>
+                        <node>
+                           <name>Eye</name>
+                           <description>The organ of sight or vision.</description>
+                        </node>
+                        <node>
+                           <name>Eyebrow</name>
+                           <description>The arched strip of hair on the bony ridge above each eye socket.</description>
+                        </node>
+                        <node>
+                           <name>Forehead</name>
+                           <description>The part of the face between the eyebrows and the normal hairline.</description>
+                        </node>
+                        <node>
+                           <name>Lip</name>
+                           <description>Fleshy fold which surrounds the opening of the mouth.</description>
+                        </node>
+                        <node>
+                           <name>Nose</name>
+                           <description>A structure of special sense serving as an organ of the sense of smell and as an entrance to the respiratory tract.</description>
+                        </node>
+                        <node>
+                           <name>Mouth</name>
+                           <description>The proximal portion of the digestive tract, containing the oral cavity and bounded by the oral opening.</description>
+                        </node>
+                        <node>
+                           <name>Teeth</name>
+                           <description>The hard bonelike structures in the jaws. A collection of teeth arranged in some pattern in the mouth or other part of the body.</description>
+                        </node>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Lower-extremity</name>
+                     <description>Refers to the whole inferior limb (leg and/or foot).</description>
+                     <node>
+                        <name>Ankle</name>
+                        <description>A gliding joint between the distal ends of the tibia and fibula and the proximal end of the talus.</description>
+                     </node>
+                     <node>
+                        <name>Calf</name>
+                        <description>The fleshy part at the back of the leg below the knee.</description>
+                     </node>
+                     <node>
+                        <name>Foot</name>
+                        <description>The structure found below the ankle joint required for locomotion.</description>
+                        <node>
+                           <name>Big-toe</name>
+                           <description>The largest toe on the inner side of the foot.</description>
+                        </node>
+                        <node>
+                           <name>Heel</name>
+                           <description>The back of the foot below the ankle.</description>
+                        </node>
+                        <node>
+                           <name>Instep</name>
+                           <description>The part of the foot between the ball and the heel on the inner side.</description>
+                        </node>
+                        <node>
+                           <name>Little-toe</name>
+                           <description>The smallest toe located on the outer side of the foot.</description>
+                        </node>
+                        <node>
+                           <name>Toes</name>
+                           <description>The terminal digits of the foot.</description>
+                        </node>
+                     </node>
+                     <node>
+                        <name>Knee</name>
+                        <description>A joint connecting the lower part of the femur with the upper part of the tibia.</description>
+                     </node>
+                     <node>
+                        <name>Shin</name>
+                        <description>Front part of the leg below the knee.</description>
+                     </node>
+                     <node>
+                        <name>Thigh</name>
+                        <description>Upper part of the leg between hip and knee.</description>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Torso</name>
+                     <description>The body excluding the head and neck and limbs.</description>
+                     <node>
+                        <name>Torso-back</name>
+                        <description>The rear surface of the human body from the shoulders to the hips.</description>
+                     </node>
+                     <node>
+                        <name>Buttocks</name>
+                        <description>The round fleshy parts that form the lower rear area of a human trunk.</description>
+                     </node>
+                     <node>
+                        <name>Torso-chest</name>
+                        <description>The anterior side of the thorax from the neck to the abdomen.</description>
+                     </node>
+                     <node>
+                        <name>Gentalia</name>
+                        <description>The external organs of reproduction.</description>
+                     </node>
+                     <node>
+                        <name>Hip</name>
+                        <description>The lateral prominence of the pelvis from the waist to the thigh.</description>
+                     </node>
+                     <node>
+                        <name>Waist</name>
+                        <description>The abdominal circumference at the navel.</description>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Upper-extremity</name>
+                     <description>Refers to the whole superior limb (shoulder, arm, elbow, wrist, hand).</description>
+                     <node>
+                        <name>Elbow</name>
+                        <description>A type of hinge joint located between the forearm and upper arm.</description>
+                     </node>
+                     <node>
+                        <name>Forearm</name>
+                        <description>Lower part of the arm between the elbow and wrist.</description>
+                     </node>
+                     <node>
+                        <name>Hand</name>
+                        <description>The distal portion of the upper extremity. It consists of the carpus, metacarpus, and digits.</description>
+                        <node>
+                           <name>Finger</name>
+                           <description>Any of the digits of the hand.</description>
+                           <node>
+                              <name>Index-finger</name>
+                              <description>The second finger from the radial side of the hand, next to the thumb.</description>
+                           </node>
+                           <node>
+                              <name>Little-finger</name>
+                              <description>The fifth and smallest finger from the radial side of the hand.</description>
+                           </node>
+                           <node>
+                              <name>Middle-finger</name>
+                              <description>The middle or third finger from the radial side of the hand.</description>
+                           </node>
+                           <node>
+                              <name>Ring-finger</name>
+                              <description>The fourth finger from the radial side of the hand.</description>
+                           </node>
+                           <node>
+                              <name>Thumb</name>
+                              <description>The thick and short hand digit which is next to the index finger in humans.</description>
+                           </node>
+                        </node>
+                        <node>
+                           <name>Palm</name>
+                           <description>The part of the inner surface of the hand that extends from the wrist to the bases of the fingers.</description>
+                        </node>
+                        <node>
+                           <name>Knuckles</name>
+                           <description>A part of a finger at a joint where the bone is near the surface, especially where the finger joins the hand.</description>
+                        </node>
+                     </node>
+                     <node>
+                        <name>Shoulder</name>
+                        <description>Joint attaching upper arm to trunk.</description>
+                     </node>
+                     <node>
+                        <name>Upper-arm</name>
+                        <description>Portion of arm between shoulder and elbow.</description>
+                     </node>
+                     <node>
+                        <name>Wrist</name>
+                        <description>A joint between the distal end of the radius and the proximal row of carpal bones.</description>
+                     </node>
+                  </node>
+               </node>
+            </node>
+            <node>
+               <name>Organism</name>
+               <description>A living entity, more specifically a biological entity that consists of one or more cells and is capable of genomic replication (independently or not).</description>
+               <node>
+                  <name>Animal</name>
+                  <description>A living organism that has membranous cell walls, requires oxygen and organic foods, and is capable of voluntary movement.</description>
+               </node>
+               <node>
+                  <name>Human</name>
+                  <description>The bipedal primate mammal Homo sapiens.</description>
+               </node>
+               <node>
+                  <name>Plant</name>
+                  <description>Any living organism that typically synthesizes its food from inorganic substances and possesses cellulose cell walls.</description>
+               </node>
+            </node>
+         </node>
+         <node>
+            <name>Language-item</name>
+            <description>An entity related to a systematic means of communicating by the use of sounds, symbols, or gestures.</description>
+            <attribute>
+               <name>suggestedTag</name>
+               <value>Sensory-presentation</value>
+            </attribute>
+            <node>
+               <name>Character</name>
+               <description>A mark or symbol used in writing.</description>
+            </node>
+            <node>
+               <name>Clause</name>
+               <description>A  unit of grammatical organization next below the sentence in rank, usually consisting of a subject and predicate.</description>
+            </node>
+            <node>
+               <name>Glyph</name>
+               <description>A hieroglyphic character, symbol, or pictograph.</description>
+            </node>
+            <node>
+               <name>Nonword</name>
+               <description>A group of letters or speech sounds that looks or sounds like a word but that is not accepted as such by native speakers.</description>
+            </node>
+            <node>
+               <name>Paragraph</name>
+               <description>A distinct section of a piece of writing, usually dealing with a single theme.</description>
+            </node>
+            <node>
+               <name>Phoneme</name>
+               <description>A speech sound that is distinguished by the speakers of a particular language.</description>
+            </node>
+            <node>
+               <name>Phrase</name>
+               <description>A phrase is a group of words functioning as a single unit in the syntax of a sentence.</description>
+            </node>
+            <node>
+               <name>Sentence</name>
+               <description>A set of words that is complete in itself, conveying a statement, question, exclamation, or command and typically containing an explicit or implied subject and a predicate containing a finite verb.</description>
+            </node>
+            <node>
+               <name>Syllable</name>
+               <description>A unit of spoken language larger than a phoneme.</description>
+            </node>
+            <node>
+               <name>Textblock</name>
+               <description>A block of text.</description>
+            </node>
+            <node>
+               <name>Word</name>
+               <description>A word is the smallest free form (an item that may be expressed in isolation with semantic or pragmatic content) in a language.</description>
+            </node>
+         </node>
+         <node>
+            <name>Object</name>
+            <description>Something perceptible by one or more of the senses, especially by vision or touch. A material thing.</description>
+            <attribute>
+               <name>suggestedTag</name>
+               <value>Sensory-presentation</value>
+            </attribute>
+            <node>
+               <name>Geometric-object</name>
+               <description>An object or a representation that has structure and topology in space.</description>
+               <node>
+                  <name>Pattern</name>
+                  <description>An arrangement of objects, facts, behaviors, or other things which have scientific, mathematical, geometric, statistical, or other meaning.</description>
+                  <node>
+                     <name>Dots</name>
+                     <description>A small round mark or spot.</description>
+                  </node>
+                  <node>
+                     <name>LED-pattern</name>
+                     <description>A pattern created by lighting selected members of a fixed light emitting diode array.</description>
+                  </node>
+               </node>
+               <node>
+                  <name>2D-shape</name>
+                  <description>A planar, two-dimensional shape.</description>
+                  <node>
+                     <name>Arrow</name>
+                     <description>A shape with a pointed end indicating direction.</description>
+                  </node>
+                  <node>
+                     <name>Clockface</name>
+                     <description>The dial face of a clock. A location identifier based on clockface numbering or anatomic subregion.</description>
+                  </node>
+                  <node>
+                     <name>Cross</name>
+                     <description>A figure or mark formed by two intersecting lines crossing at their midpoints.</description>
+                  </node>
+                  <node>
+                     <name>Dash</name>
+                     <description>A horizontal stroke in writing or printing to mark a pause or break in sense or to represent omitted letters or words.</description>
+                  </node>
+                  <node>
+                     <name>Ellipse</name>
+                     <description>A closed plane curve resulting from the intersection of a circular cone and a plane cutting completely through it, especially a plane not parallel to the base.</description>
+                     <node>
+                        <name>Circle</name>
+                        <description>A ring-shaped structure with every point equidistant from the center.</description>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Rectangle</name>
+                     <description>A parallelogram with four right angles.</description>
+                     <node>
+                        <name>Square</name>
+                        <description>A square is a special rectangle with four equal sides.</description>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Single-point</name>
+                     <description>A point is a geometric entity that is located in a zero-dimensional spatial region and whose position is defined by its coordinates in some coordinate system.</description>
+                  </node>
+                  <node>
+                     <name>Star</name>
+                     <description>A conventional or stylized representation of a star, typically one having five or more points.</description>
+                  </node>
+                  <node>
+                     <name>Triangle</name>
+                     <description>A three-sided polygon.</description>
+                  </node>
+               </node>
+               <node>
+                  <name>3D-shape</name>
+                  <description>A geometric three-dimensional shape.</description>
+                  <node>
+                     <name>Box</name>
+                     <description>A square or rectangular vessel, usually made of cardboard or plastic.</description>
+                     <node>
+                        <name>Cube</name>
+                        <description>A solid or semi-solid in the shape of a three dimensional square.</description>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Cone</name>
+                     <description>A shape whose base is a circle and whose sides taper up to a point.</description>
+                  </node>
+                  <node>
+                     <name>Cylinder</name>
+                     <description>A surface formed by circles of a given radius that are contained in a plane perpendicular to a given axis, whose centers align on the axis.</description>
+                  </node>
+                  <node>
+                     <name>Ellipsoid</name>
+                     <description>A closed plane curve resulting from the intersection of a circular cone and a plane cutting completely through it, especially a plane not parallel to the base.</description>
+                     <node>
+                        <name>Sphere</name>
+                        <description>A solid or hollow three-dimensional object bounded by a closed surface such that every point on the surface is equidistant from the center.</description>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Pyramid</name>
+                     <description>A polyhedron of which one face is a polygon of any number of sides, and the other faces are triangles with a common vertex.</description>
+                  </node>
+               </node>
+            </node>
+            <node>
+               <name>Ingestible-object</name>
+               <description>Something that can be taken into the body by the mouth for digestion or absorption.</description>
+            </node>
+            <node>
+               <name>Man-made-object</name>
+               <description>Something constructed by human means.</description>
+               <node>
+                  <name>Building</name>
+                  <description>A structure that has a roof and walls and stands more or less permanently in one place.</description>
+                  <node>
+                     <name>Room</name>
+                     <description>An area within a building enclosed by walls and floor and ceiling.</description>
+                  </node>
+                  <node>
+                     <name>Roof</name>
+                     <description>A roof is the covering on the uppermost part of a building which provides protection from animals and weather, notably rain, but also heat, wind and sunlight.</description>
+                  </node>
+                  <node>
+                     <name>Entrance</name>
+                     <description>The means or place of entry.</description>
+                  </node>
+                  <node>
+                     <name>Attic</name>
+                     <description>A room or a space immediately below the roof of a building.</description>
+                  </node>
+                  <node>
+                     <name>Basement</name>
+                     <description>The part of a building that is wholly or partly below ground level.</description>
+                  </node>
+               </node>
+               <node>
+                  <name>Clothing</name>
+                  <description>A covering designed to be worn on the body.</description>
+               </node>
+               <node>
+                  <name>Device</name>
+                  <description>An object contrived for a specific purpose.</description>
+                  <node>
+                     <name>Assistive-device</name>
+                     <description>A device that help an individual accomplish a task.</description>
+                     <node>
+                        <name>Glasses</name>
+                        <description>Frames with lenses worn in front of the eye for vision correction, eye protection, or protection from UV rays.</description>
+                     </node>
+                     <node>
+                        <name>Writing-device</name>
+                        <description>A device used for writing.</description>
+                        <node>
+                           <name>Pen</name>
+                           <description>A common writing instrument used to apply ink to a surface for writing or drawing.</description>
+                        </node>
+                        <node>
+                           <name>Pencil</name>
+                           <description>An implement for writing or drawing that is constructed of a narrow solid pigment core in a protective casing that prevents the core from being broken or marking the hand.</description>
+                        </node>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Computing-device</name>
+                     <description>An electronic device which take inputs and processes results from the inputs.</description>
+                     <node>
+                        <name>Cellphone</name>
+                        <description>A telephone with access to a cellular radio system so it can be used over a wide area, without a physical connection to a network.</description>
+                     </node>
+                     <node>
+                        <name>Desktop-computer</name>
+                        <description>A computer suitable for use at an ordinary desk.</description>
+                     </node>
+                     <node>
+                        <name>Laptop-computer</name>
+                        <description>A computer that is portable and suitable for use while traveling.</description>
+                     </node>
+                     <node>
+                        <name>Tablet-computer</name>
+                        <description>A small portable computer that accepts input directly on to its screen rather than via a keyboard or mouse.</description>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Engine</name>
+                     <description>A motor is a machine designed to convert one or more forms of energy into mechanical energy.</description>
+                  </node>
+                  <node>
+                     <name>IO-device</name>
+                     <description>Hardware used by a human (or other system) to communicate with a computer.</description>
+                     <node>
+                        <name>Input-device</name>
+                        <description>A piece of equipment used to provide data and control signals to an information processing system such as a computer or information appliance.</description>
+                        <node>
+                           <name>Computer-mouse</name>
+                           <description>A hand-held pointing device that detects two-dimensional motion relative to a surface.</description>
+                           <node>
+                              <name>Mouse-button</name>
+                              <description>An electric switch on a computer mouse which can be pressed or clicked to select or interact with an element of a graphical user interface.</description>
+                           </node>
+                           <node>
+                              <name>Scroll-wheel</name>
+                              <description>A scroll wheel or mouse wheel is a wheel used for scrolling made of hard plastic with a rubbery surface usually located between the left and right mouse buttons and is positioned perpendicular to the mouse surface.</description>
+                           </node>
+                        </node>
+                        <node>
+                           <name>Joystick</name>
+                           <description>A control device that uses a movable handle to create two-axis input for a computer device.</description>
+                        </node>
+                        <node>
+                           <name>Keyboard</name>
+                           <description>A device consisting of mechanical keys that are pressed to create input to a computer.</description>
+                           <node>
+                              <name>Keyboard-key</name>
+                              <description>A button on a keyboard usually representing letters, numbers, functions, or symbols.</description>
+                              <node>
+                                 <name>#</name>
+                                 <description>Value of a keyboard key.</description>
+                                 <attribute>
+                                    <name>takesValue</name>
+                                 </attribute>
+                              </node>
+                           </node>
+                        </node>
+                        <node>
+                           <name>Keypad</name>
+                           <description>A device consisting of keys, usually in a block arrangement, that provides limited input to a system.</description>
+                           <node>
+                              <name>Keypad-key</name>
+                              <description>A key on a separate section of a computer keyboard that groups together numeric keys and those for mathematical or other special functions in an arrangement like that of a calculator.</description>
+                              <node>
+                                 <name>#</name>
+                                 <description>Value of keypad key.</description>
+                                 <attribute>
+                                    <name>takesValue</name>
+                                 </attribute>
+                              </node>
+                           </node>
+                        </node>
+                        <node>
+                           <name>Microphone</name>
+                           <description>A device designed to convert sound to an electrical signal.</description>
+                        </node>
+                        <node>
+                           <name>Push-button</name>
+                           <description>A switch designed to be operated by pressing a button.</description>
+                        </node>
+                     </node>
+                     <node>
+                        <name>Output-device</name>
+                        <description>Any piece of computer hardware equipment which converts information into human understandable form.</description>
+                        <node>
+                           <name>Display-device</name>
+                           <description>An output device for presentation of information in visual or tactile form the latter used for example in tactile electronic displays for blind people.</description>
+                           <node>
+                              <name>Head-mounted-display</name>
+                              <description>An instrument that functions as a display device, worn on the head or as part of a helmet, that has a small display optic in front of one (monocular HMD) or each eye (binocular HMD).</description>
+                           </node>
+                           <node>
+                              <name>LED-display</name>
+                              <description>A LED display is a flat panel display that uses an array of light-emitting diodes as pixels for a video display.</description>
+                           </node>
+                           <node>
+                              <name>Computer-screen</name>
+                              <description>An electronic device designed as a display or a physical device designed to be a protective meshwork.</description>
+                              <node>
+                                 <name>Screen-window</name>
+                                 <description>A part of a computer screen that contains a display different from the rest of the screen. A window is a graphical control element consisting of a visual area containing some of the graphical user interface of the program it belongs to and is framed by a window decoration.</description>
+                              </node>
+                           </node>
+                        </node>
+                        <node>
+                           <name>Auditory-device</name>
+                           <description>A device designed to produce sound.</description>
+                           <node>
+                              <name>Headphones</name>
+                              <description>An instrument that consists of a pair of small loudspeakers, or less commonly a single speaker, held close to ears and connected to a signal source such as an audio amplifier, radio, CD player or portable media player.</description>
+                           </node>
+                           <node>
+                              <name>Loudspeaker</name>
+                              <description>A device designed to convert electrical signals to sounds that can be heard.</description>
+                           </node>
+                        </node>
+                     </node>
+                     <node>
+                        <name>Recording-device</name>
+                        <description>A device that copies information in a signal into a persistent information bearer.</description>
+                        <node>
+                           <name>EEG-recorder</name>
+                           <description>A device for recording electric currents in the brain using electrodes applied to the scalp, to the surface of the brain, or placed within the substance of the brain.</description>
+                        </node>
+                        <node>
+                           <name>File-storage</name>
+                           <description>A device for recording digital information to a permanent media.</description>
+                        </node>
+                        <node>
+                           <name>MEG-recorder</name>
+                           <description>A device for measuring the magnetic fields produced by electrical activity in the brain, usually conducted externally.</description>
+                        </node>
+                        <node>
+                           <name>Motion-capture</name>
+                           <description>A device for recording the movement of objects or people.</description>
+                        </node>
+                        <node>
+                           <name>Tape-recorder</name>
+                           <description>A device for recording and reproduction usually using magnetic tape for storage that can be saved and played back.</description>
+                        </node>
+                     </node>
+                     <node>
+                        <name>Touchscreen</name>
+                        <description>A control component that operates an electronic device by pressing the display on the screen.</description>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Machine</name>
+                     <description>A human-made device that uses power to apply forces and control movement to perform an action.</description>
+                  </node>
+                  <node>
+                     <name>Measurement-device</name>
+                     <description>A device in which a measure function inheres.</description>
+                     <node>
+                        <name>Clock</name>
+                        <description>A device designed to indicate the time of day or to measure the time duration of an event or action.</description>
+                        <node>
+                           <name>Clock-face</name>
+                           <description>A location identifier based on clockface numbering or anatomic subregion.</description>
+                        </node>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Robot</name>
+                     <description>A mechanical device that sometimes resembles a living animal and is capable of performing a variety of often complex human tasks on command or by being programmed in advance.</description>
+                  </node>
+                  <node>
+                     <name>Tool</name>
+                     <description>A component that is not part of a device but is designed to support its assemby or operation.</description>
+                  </node>
+               </node>
+               <node>
+                  <name>Document</name>
+                  <description>A physical object, or electronic counterpart, that is characterized by containing writing which is meant to be human-readable.</description>
+                  <node>
+                     <name>Letter</name>
+                     <description>A written message addressed to a person or organization.</description>
+                  </node>
+                  <node>
+                     <name>Note</name>
+                     <description>A brief written record.</description>
+                  </node>
+                  <node>
+                     <name>Book</name>
+                     <description>A volume made up of pages fastened along one edge and enclosed between protective covers.</description>
+                  </node>
+                  <node>
+                     <name>Notebook</name>
+                     <description>A book for notes or memoranda.</description>
+                  </node>
+                  <node>
+                     <name>Questionnaire</name>
+                     <description>A document consisting of questions and possibly responses, depending on whether it has been filled out.</description>
+                  </node>
+               </node>
+               <node>
+                  <name>Furnishing</name>
+                  <description>Furniture, fittings, and other decorative accessories, such as curtains and carpets, for a house or room.</description>
+               </node>
+               <node>
+                  <name>Manufactured-material</name>
+                  <description>Substances created or extracted from raw materials.</description>
+                  <node>
+                     <name>Ceramic</name>
+                     <description>A hard, brittle, heat-resistant and corrosion-resistant material made by shaping and then firing a nonmetallic mineral, such as clay, at a high temperature.</description>
+                  </node>
+                  <node>
+                     <name>Glass</name>
+                     <description>A brittle transparent solid with irregular atomic structure.</description>
+                  </node>
+                  <node>
+                     <name>Paper</name>
+                     <description>A thin sheet material produced by mechanically or chemically processing cellulose fibres derived from wood, rags, grasses or other vegetable sources in water.</description>
+                  </node>
+                  <node>
+                     <name>Plastic</name>
+                     <description>Various high-molecular-weight thermoplastic or thermosetting polymers that are capable of being molded, extruded, drawn, or otherwise shaped and then hardened into a form.</description>
+                  </node>
+                  <node>
+                     <name>Steel</name>
+                     <description>An alloy made up of iron with typically a few tenths of a percent of carbon to improve its strength and fracture resistance compared to iron.</description>
+                  </node>
+               </node>
+               <node>
+                  <name>Media</name>
+                  <description>Media are audo/visual/audiovisual modes of communicating information for mass consumption.</description>
+                  <node>
+                     <name>Media-clip</name>
+                     <description>A short segment of media.</description>
+                     <node>
+                        <name>Audio-clip</name>
+                        <description>A short segment of audio.</description>
+                     </node>
+                     <node>
+                        <name>Audiovisual-clip</name>
+                        <description>A short media segment containing both audio and video.</description>
+                     </node>
+                     <node>
+                        <name>Video-clip</name>
+                        <description>A short segment of video.</description>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Visualization</name>
+                     <description>An planned process that creates images, diagrams or animations from the input data.</description>
+                     <node>
+                        <name>Animation</name>
+                        <description>A form of graphical illustration that changes with time to give a sense of motion or represent dynamic changes in the portrayal.</description>
+                     </node>
+                     <node>
+                        <name>Art-installation</name>
+                        <description>A large-scale, mixed-media constructions, often designed for a specific place or for a temporary period of time.</description>
+                     </node>
+                     <node>
+                        <name>Braille</name>
+                        <description>A display using a system of raised dots that can be read with the fingers by people who are blind.</description>
+                     </node>
+                     <node>
+                        <name>Image</name>
+                        <description>Any record of an imaging event whether physical or electronic.</description>
+                        <node>
+                           <name>Cartoon</name>
+                           <description>A type of illustration, sometimes animated, typically in a non-realistic or semi-realistic style. The specific meaning has evolved over time, but the modern usage usually refers to either an image or series of images intended for satire, caricature, or humor. A motion picture that relies on a sequence of illustrations for its animation.</description>
+                        </node>
+                        <node>
+                           <name>Drawing</name>
+                           <description>A representation of an object or outlining a figure, plan, or sketch by means of lines.</description>
+                        </node>
+                        <node>
+                           <name>Icon</name>
+                           <description>A sign (such as a word or graphic symbol) whose form suggests its meaning.</description>
+                        </node>
+                        <node>
+                           <name>Painting</name>
+                           <description>A work produced through the art of painting.</description>
+                        </node>
+                        <node>
+                           <name>Photograph</name>
+                           <description>An image recorded by a camera.</description>
+                        </node>
+                     </node>
+                     <node>
+                        <name>Movie</name>
+                        <description>A sequence of images displayed in succession giving the illusion of continuous movement.</description>
+                     </node>
+                     <node>
+                        <name>Outline-visualization</name>
+                        <description>A visualization consisting of a line or set of lines enclosing or indicating the shape of an object in a sketch or diagram.</description>
+                     </node>
+                     <node>
+                        <name>Point-light-visualization</name>
+                        <description>A display in which action is depicted using a few points of light, often generated from discrete sensors in motion capture.</description>
+                     </node>
+                     <node>
+                        <name>Sculpture</name>
+                        <description>A two- or three-dimensional representative or abstract forms, especially by carving stone or wood or by casting metal or plaster.</description>
+                     </node>
+                     <node>
+                        <name>Stick-figure-visualization</name>
+                        <description>A drawing showing the head of a human being or animal as a circle and all other parts as straight lines.</description>
+                     </node>
+                  </node>
+               </node>
+               <node>
+                  <name>Navigational-object</name>
+                  <description>An object whose purpose is to assist directed movement from one location to another.</description>
+                  <node>
+                     <name>Path</name>
+                     <description>A trodden way. A way or track laid down for walking or made by continual treading.</description>
+                  </node>
+                  <node>
+                     <name>Road</name>
+                     <description>An open way for the passage of vehicles, persons, or animals on land.</description>
+                     <node>
+                        <name>Lane</name>
+                        <description>A defined path with physical dimensions through which an object or substance may traverse.</description>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Runway</name>
+                     <description>A paved strip of ground on a landing field for the landing and takeoff of aircraft.</description>
+                  </node>
+               </node>
+               <node>
+                  <name>Vehicle</name>
+                  <description>A mobile machine which transports people or cargo.</description>
+                  <node>
+                     <name>Aircraft</name>
+                     <description>A vehicle which is able to travel through air in an atmosphere.</description>
+                  </node>
+                  <node>
+                     <name>Bicycle</name>
+                     <description>A human-powered, pedal-driven, single-track vehicle, having two wheels attached to a frame, one behind the other.</description>
+                  </node>
+                  <node>
+                     <name>Boat</name>
+                     <description>A watercraft of any size which is able to float or plane on water.</description>
+                  </node>
+                  <node>
+                     <name>Car</name>
+                     <description>A wheeled motor vehicle used primarily for the transportation of human passengers.</description>
+                  </node>
+                  <node>
+                     <name>Cart</name>
+                     <description>A cart is a vehicle which has two wheels and is designed to transport human passengers or cargo.</description>
+                  </node>
+                  <node>
+                     <name>Tractor</name>
+                     <description>A mobile machine specifically designed to deliver a high tractive effort at slow speeds, and mainly used for the purposes of hauling a trailer or machinery used in agriculture or construction.</description>
+                  </node>
+                  <node>
+                     <name>Train</name>
+                     <description>A connected line of railroad cars with or without a locomotive.</description>
+                  </node>
+                  <node>
+                     <name>Truck</name>
+                     <description>A motor vehicle which, as its primary funcion, transports cargo rather than human passangers.</description>
+                  </node>
+               </node>
+            </node>
+            <node>
+               <name>Natural-object</name>
+               <description>Something that exists in or is produced by nature, and is not artificial or man-made.</description>
+               <node>
+                  <name>Mineral</name>
+                  <description>A solid, homogeneous, inorganic substance occurring in nature and having a definite chemical composition.</description>
+               </node>
+               <node>
+                  <name>Natural-feature</name>
+                  <description>A feature that occurs in nature. A prominent or identifiable aspect, region, or site of interest.</description>
+                  <node>
+                     <name>Field</name>
+                     <description>An unbroken expanse as of ice or grassland.</description>
+                  </node>
+                  <node>
+                     <name>Hill</name>
+                     <description>A rounded elevation of limited extent rising above the surrounding land with local relief of less than 300m.</description>
+                  </node>
+                  <node>
+                     <name>Mountain</name>
+                     <description>A landform that extends above the surrounding terrain in a limited area.</description>
+                  </node>
+                  <node>
+                     <name>River</name>
+                     <description>A natural freshwater surface stream of considerable volume and a permanent or seasonal flow, moving in a definite channel toward a sea, lake, or another river.</description>
+                  </node>
+                  <node>
+                     <name>Waterfall</name>
+                     <description>A sudden descent of water over a step or ledge in the bed of a river.</description>
+                  </node>
+               </node>
+            </node>
+         </node>
+         <node>
+            <name>Sound</name>
+            <description>Mechanical vibrations transmitted by an elastic medium. Something that can be heard.</description>
+            <node>
+               <name>Environmental-sound</name>
+               <description>Sounds occuring in the environment. An accumulation of noise pollution that occurs outside. This noise can be caused by transport, industrial, and recreational activities.</description>
+               <node>
+                  <name>Crowd-sound</name>
+                  <description>Noise produced by a mixture of sounds from a large group of people.</description>
+               </node>
+               <node>
+                  <name>Signal-noise</name>
+                  <description>Any part of a signal that is not the true or original signal but is introduced by the communication mechanism.</description>
+               </node>
+            </node>
+            <node>
+               <name>Musical-sound</name>
+               <description>Sound produced by continuous and regular vibrations, as opposed to noise.</description>
+               <node>
+                  <name>Tone</name>
+                  <description>A musical note, warble, or other sound used as a particular signal on a telephone or answering machine.</description>
+               </node>
+               <node>
+                  <name>Instrument-sound</name>
+                  <description>Sound produced by a musical instrument.</description>
+               </node>
+               <node>
+                  <name>Vocalized-sound</name>
+                  <description>Musical sound produced by vocal cords in a biological agent.</description>
+               </node>
+            </node>
+            <node>
+               <name>Named-animal-sound</name>
+               <description>A sound recognizable as being associated with particular animals.</description>
+               <node>
+                  <name>Barking</name>
+                  <description>Sharp explosive cries like sounds made by certain animals, especially a dog, fox, or seal.</description>
+               </node>
+               <node>
+                  <name>Bleating</name>
+                  <description>Wavering cries like sounds made by a sheep, goat, or calf.</description>
+               </node>
+               <node>
+                  <name>Crowing</name>
+                  <description>Loud shrill sounds characteristic of roosters.</description>
+               </node>
+               <node>
+                  <name>Chirping</name>
+                  <description>Short, sharp, high-pitched noises like sounds made by small birds or an insects.</description>
+               </node>
+               <node>
+                  <name>Growling</name>
+                  <description>Low guttural sounds like those that made in the throat by a hostile dog or other animal.</description>
+               </node>
+               <node>
+                  <name>Meowing</name>
+                  <description>Vocalizations like those made by as those cats. These sounds have diverse tones and are sometimes chattered, murmured or whispered. The purpose can be assertive.</description>
+               </node>
+               <node>
+                  <name>Mooing</name>
+                  <description>Deep vocal sounds like those made by a cow.</description>
+               </node>
+               <node>
+                  <name>Purring</name>
+                  <description>Low continuous vibratory sound such as those made by cats. The sound expresses contentment.</description>
+               </node>
+               <node>
+                  <name>Roaring</name>
+                  <description>Loud, deep, or harsh prolonged sounds such as those made by big cats and bears for long-distance communication and intimidation.</description>
+               </node>
+               <node>
+                  <name>Squawking</name>
+                  <description>Loud, harsh noises such as those made by geese.</description>
+               </node>
+            </node>
+            <node>
+               <name>Named-object-sound</name>
+               <description>A sound identifiable as coming from a particular type of object.</description>
+               <node>
+                  <name>Alarm-sound</name>
+                  <description>A loud signal often loud continuous ringing to alert people to a problem or condition that requires urgent attention.</description>
+               </node>
+               <node>
+                  <name>Beep</name>
+                  <description>A short, single tone, that is typically high-pitched and generally made by a computer or other machine.</description>
+               </node>
+               <node>
+                  <name>Buzz</name>
+                  <description>A persistent vibratory sound often made by a buzzer device and used to indicate something incorrect.</description>
+               </node>
+               <node>
+                  <name>Ka-ching</name>
+                  <description>The sound made by a mechanical cash register, often to designate a reward.</description>
+               </node>
+               <node>
+                  <name>Click</name>
+                  <description>The sound made by a mechanical cash register, often to designate a reward.</description>
+               </node>
+               <node>
+                  <name>Ding</name>
+                  <description>A short ringing sound such as that made by a bell, often to indicate a correct response or the expiration of time.</description>
+               </node>
+               <node>
+                  <name>Horn-blow</name>
+                  <description>A loud sound made by forcing air through a sound device that funnels air to create the sound, often used to sound an alert.</description>
+               </node>
+               <node>
+                  <name>Siren</name>
+                  <description>A loud, continuous sound often varying in frequency designed to indicate an emergency.</description>
+               </node>
+            </node>
+         </node>
+      </node>
+      <node>
+         <name>Property</name>
+         <description>Something that pertains to a thing. A characteristic of some entity. A quality or feature regarded as a characteristic or inherent part of someone or something. HED attributes are adjectives or adverbs.</description>
+         <attribute>
+            <name>extensionAllowed</name>
+         </attribute>
+         <node>
+            <name>Agent-property</name>
+            <description>Something that pertains to an agent.</description>
+            <attribute>
+               <name>extensionAllowed</name>
+            </attribute>
+            <node>
+               <name>Agent-state</name>
+               <description>The state of the agent.</description>
+               <node>
+                  <name>Agent-cognitive-state</name>
+                  <description>The state of the cognitive processes or state of mind of the agent.</description>
+                  <node>
+                     <name>Alert</name>
+                     <description>Condition of heightened watchfulness or preparation for action.</description>
+                  </node>
+                  <node>
+                     <name>Anesthetized</name>
+                     <description>Having lost sensation to pain or having senses dulled due to the effects of an anesthetic.</description>
+                  </node>
+                  <node>
+                     <name>Asleep</name>
+                     <description>Having entered a periodic, readily reversible state of reduced awareness and metabolic activity, usually accompanied by physical relaxation and brain activity.</description>
+                  </node>
+                  <node>
+                     <name>Attentive</name>
+                     <description>Concentrating and focusing mental energy on the task or surroundings.</description>
+                  </node>
+                  <node>
+                     <name>Distracted</name>
+                     <description>Lacking in concentration because of being preoccupied.</description>
+                  </node>
+                  <node>
+                     <name>Awake</name>
+                     <description>In a non sleeping state.</description>
+                  </node>
+                  <node>
+                     <name>Brain-dead</name>
+                     <description>Characterized by the irreversible absence of cortical and brain stem functioning.</description>
+                  </node>
+                  <node>
+                     <name>Comatose</name>
+                     <description>In a state of profound unconsciousness associated with markedly depressed cerebral activity.</description>
+                  </node>
+                  <node>
+                     <name>Drowsy</name>
+                     <description>In a state of near-sleep, a strong desire for sleep, or sleeping for unusually long periods.</description>
+                  </node>
+                  <node>
+                     <name>Intoxicated</name>
+                     <description>In a state with disturbed psychophysiological functions and responses as a result of administration or ingestion of a psychoactive substance.</description>
+                  </node>
+                  <node>
+                     <name>Locked-in</name>
+                     <description>In a state of complete paralysis of all voluntary muscles except for the ones that control the movements of the eyes.</description>
+                  </node>
+                  <node>
+                     <name>Passive</name>
+                     <description>Not responding or initiating an action in response to a stimulus.</description>
+                  </node>
+                  <node>
+                     <name>Resting</name>
+                     <description>A state in which the agent is not exhibiting any physical exertion.</description>
+                  </node>
+                  <node>
+                     <name>Vegetative</name>
+                     <description>A state of wakefulness and conscience, but (in contrast to coma) with involuntary opening of the eyes and movements (such as teeth grinding, yawning, or thrashing of the extremities).</description>
+                  </node>
+               </node>
+               <node>
+                  <name>Agent-emotional-state</name>
+                  <description>The status of the general temperament and outlook of an agent.</description>
+                  <node>
+                     <name>Angry</name>
+                     <description>Experiencing emotions characterized by marked annoyance or hostility.</description>
+                  </node>
+                  <node>
+                     <name>Aroused</name>
+                     <description>In a state reactive to stimuli leading to increased heart rate and blood pressure, sensory alertness, mobility and readiness to respond.</description>
+                  </node>
+                  <node>
+                     <name>Awed</name>
+                     <description>Filled with wonder. Feeling grand, sublime or powerful emotions characterized by a combination of joy, fear, admiration, reverence, and/or respect.</description>
+                  </node>
+                  <node>
+                     <name>Compassionate</name>
+                     <description>Feeling or showing sympathy and concern for others often evoked for a person who is in distress and associated with altruistic motivation.</description>
+                  </node>
+                  <node>
+                     <name>Content</name>
+                     <description>Feeling  satisfaction with things as they are.</description>
+                  </node>
+                  <node>
+                     <name>Disgusted</name>
+                     <description>Feeling revulsion or profound disapproval aroused by something unpleasant or offensive.</description>
+                  </node>
+                  <node>
+                     <name>Emotionally-neutral</name>
+                     <description>Feeling neither satisfied nor dissatisfied.</description>
+                  </node>
+                  <node>
+                     <name>Empathetic</name>
+                     <description>Understanding and sharing the feelings of another. Being aware of, being sensitive to, and vicariously experiencing the feelings, thoughts, and experience of another.</description>
+                  </node>
+                  <node>
+                     <name>Excited</name>
+                     <description>Feeling great enthusiasm and eagerness.</description>
+                  </node>
+                  <node>
+                     <name>Fearful</name>
+                     <description>Feeling apprehension that one may be in danger.</description>
+                  </node>
+                  <node>
+                     <name>Frustrated</name>
+                     <description>Feeling annoyed as a result of being blocked, thwarted, disappointed or defeated.</description>
+                  </node>
+                  <node>
+                     <name>Grieving</name>
+                     <description>Feeling sorrow in response to loss, whether physical or abstract.</description>
+                  </node>
+                  <node>
+                     <name>Happy</name>
+                     <description>Feeling pleased and content.</description>
+                  </node>
+                  <node>
+                     <name>Jealous</name>
+                     <description>Feeling threatened by a rival in a relationship with another individual, in particular an intimate partner, usually involves feelings of threat, fear, suspicion, distrust, anxiety, anger, betrayal, and rejection.</description>
+                  </node>
+                  <node>
+                     <name>Joyful</name>
+                     <description>Feeling delight or intense happiness.</description>
+                  </node>
+                  <node>
+                     <name>Loving</name>
+                     <description>Feeling a strong positive emotion of affection and attraction.</description>
+                  </node>
+                  <node>
+                     <name>Relieved</name>
+                     <description>No longer feeling pain, distress,  anxiety, or reassured.</description>
+                  </node>
+                  <node>
+                     <name>Sad</name>
+                     <description>Feeling grief or unhappiness.</description>
+                  </node>
+                  <node>
+                     <name>Stressed</name>
+                     <description>Experiencing mental or emotional strain or tension.</description>
+                  </node>
+               </node>
+               <node>
+                  <name>Agent-physiological-state</name>
+                  <description>Having to do with the mechanical, physical, or biochemical function of an agent.</description>
+                  <node>
+                     <name>Healthy</name>
+                     <description>Having no significant health-related issues.</description>
+                     <attribute>
+                        <name>relatedTag</name>
+                        <value>Sick</value>
+                     </attribute>
+                  </node>
+                  <node>
+                     <name>Hungry</name>
+                     <description>Being in a state of craving or desiring food.</description>
+                     <attribute>
+                        <name>relatedTag</name>
+                        <value>Sated</value>
+                        <value>Thirsty</value>
+                     </attribute>
+                  </node>
+                  <node>
+                     <name>Rested</name>
+                     <description>Feeling refreshed and relaxed.</description>
+                     <attribute>
+                        <name>relatedTag</name>
+                        <value>Tired</value>
+                     </attribute>
+                  </node>
+                  <node>
+                     <name>Sated</name>
+                     <description>Feeling full.</description>
+                     <attribute>
+                        <name>relatedTag</name>
+                        <value>Hungry</value>
+                     </attribute>
+                  </node>
+                  <node>
+                     <name>Sick</name>
+                     <description>Being in a state of ill health, bodily malfunction, or discomfort.</description>
+                     <attribute>
+                        <name>relatedTag</name>
+                        <value>Healthy</value>
+                     </attribute>
+                  </node>
+                  <node>
+                     <name>Thirsty</name>
+                     <description>Feeling a need to drink.</description>
+                     <attribute>
+                        <name>relatedTag</name>
+                        <value>Hungry</value>
+                     </attribute>
+                  </node>
+                  <node>
+                     <name>Tired</name>
+                     <description>Feeling in need of sleep or rest.</description>
+                     <attribute>
+                        <name>relatedTag</name>
+                        <value>Rested</value>
+                     </attribute>
+                  </node>
+               </node>
+               <node>
+                  <name>Agent-postural-state</name>
+                  <description>Pertaining to the position in which agent holds their body.</description>
+                  <node>
+                     <name>Crouching</name>
+                     <description>Adopting a position where the knees are bent and the upper body is brought forward and down, sometimes to avoid detection or to defend oneself.</description>
+                  </node>
+                  <node>
+                     <name>Eyes-closed</name>
+                     <description>Keeping eyes closed with no blinking.</description>
+                  </node>
+                  <node>
+                     <name>Eyes-open</name>
+                     <description>Keeping eyes open with occasional blinking.</description>
+                  </node>
+                  <node>
+                     <name>Kneeling</name>
+                     <description>Positioned where one or both knees are on the ground.</description>
+                  </node>
+                  <node>
+                     <name>On-treadmill</name>
+                     <description>Ambulation on an exercise apparatus with an endless moving belt to support moving in place.</description>
+                  </node>
+                  <node>
+                     <name>Prone</name>
+                     <description>Positioned in a recumbent body position whereby the person lies on its stomach and faces downward.</description>
+                  </node>
+                  <node>
+                     <name>Sitting</name>
+                     <description>In a seated position.</description>
+                  </node>
+                  <node>
+                     <name>Standing</name>
+                     <description>Assuming or maintaining an erect upright position.</description>
+                  </node>
+                  <node>
+                     <name>Seated-with-chin-rest</name>
+                     <description>Using a device that supports the chin and head.</description>
+                  </node>
+               </node>
+            </node>
+            <node>
+               <name>Agent-task-role</name>
+               <description>The function or part that is ascribed to an agent in performing the task.</description>
+               <node>
+                  <name>Experiment-actor</name>
+                  <description>An agent who plays a predetermined role to create the experiment scenario.</description>
+               </node>
+               <node>
+                  <name>Experiment-controller</name>
+                  <description>An agent exerting control over some aspect of the experiment.</description>
+               </node>
+               <node>
+                  <name>Experiment-participant</name>
+                  <description>Someone who takes part in an activity related to an experiment.</description>
+               </node>
+               <node>
+                  <name>Experimenter</name>
+                  <description>Person who is the owner of the experiment and has its responsibility.</description>
+               </node>
+            </node>
+            <node>
+               <name>Agent-trait</name>
+               <description>A genetically, environmentally, or socially determined characteristic of an agent.</description>
+               <node>
+                  <name>Age</name>
+                  <description>Length of time elapsed time since birth of the agent.</description>
+                  <node>
+                     <name>#</name>
+                     <attribute>
+                        <name>takesValue</name>
+                     </attribute>
+                     <attribute>
+                        <name>valueClass</name>
+                        <value>numericClass</value>
+                     </attribute>
+                  </node>
+               </node>
+               <node>
+                  <name>Agent-experience-level</name>
+                  <description>Amount of skill or knowledge that the agent has as pertains to the task.</description>
+                  <node>
+                     <name>Expert-level</name>
+                     <description>Having comprehensive and authoritative knowledge of or skill in a particular area related to the task.</description>
+                     <attribute>
+                        <name>relatedTag</name>
+                        <value>Intermediate-experience-level</value>
+                        <value>Novice-level</value>
+                     </attribute>
+                  </node>
+                  <node>
+                     <name>Intermediate-experience-level</name>
+                     <description>Having a moderate amount of knowledge or skill related to the task.</description>
+                     <attribute>
+                        <name>relatedTag</name>
+                        <value>Expert-level</value>
+                        <value>Novice-level</value>
+                     </attribute>
+                  </node>
+                  <node>
+                     <name>Novice-level</name>
+                     <description>Being inexperienced in a field or situation related to the task.</description>
+                     <attribute>
+                        <name>relatedTag</name>
+                        <value>Expert-level</value>
+                        <value>Intermediate-experience-level</value>
+                     </attribute>
+                  </node>
+               </node>
+               <node>
+                  <name>Gender</name>
+                  <description>Characteristics that are socially constructed, including norms, behaviors, and roles based on sex.</description>
+               </node>
+               <node>
+                  <name>Sex</name>
+                  <description>Physical properties or qualities by which male is distinguished from female.</description>
+                  <node>
+                     <name>Female</name>
+                     <description>Biological sex of an individual with female sexual organs such ova.</description>
+                  </node>
+                  <node>
+                     <name>Male</name>
+                     <description>Biological sex of an individual with male sexual organs producing sperm.</description>
+                  </node>
+                  <node>
+                     <name>Intersex</name>
+                     <description>Having genitalia and/or secondary sexual characteristics of indeterminate sex.</description>
+                  </node>
+               </node>
+               <node>
+                  <name>Handedness</name>
+                  <description>Individual preference for use of a hand, known as the dominant hand.</description>
+                  <node>
+                     <name>Left-handed</name>
+                     <description>Preference for using the left hand or foot for tasks requiring the use of a single hand or foot.</description>
+                  </node>
+                  <node>
+                     <name>Right-handed</name>
+                     <description>Preference for using the right hand or foot for tasks requiring the use of a single hand or foot.</description>
+                  </node>
+                  <node>
+                     <name>Ambidextrous</name>
+                     <description>Having no overall dominance in the use of right or left hand or foot in the performance of tasks that require one hand or foot.</description>
+                  </node>
+               </node>
+            </node>
+         </node>
+         <node>
+            <name>Data-property</name>
+            <description>Something that pertains to data or information.</description>
+            <attribute>
+               <name>extensionAllowed</name>
+            </attribute>
+            <node>
+               <name>Data-marker</name>
+               <description>An indicator placed to mark something.</description>
+               <node>
+                  <name>Data-break-marker</name>
+                  <description>An indicator place to indicate a gap in the data.</description>
+               </node>
+               <node>
+                  <name>Temporal-marker</name>
+                  <description>An indicator placed at a particular time in the data.</description>
+                  <node>
+                     <name>Onset</name>
+                     <description>Labels the start or beginning of something, usually an event.</description>
+                     <attribute>
+                        <name>topLevelTagGroup</name>
+                     </attribute>
+                  </node>
+                  <node>
+                     <name>Offset</name>
+                     <description>Labels the time at which something stops.</description>
+                     <attribute>
+                        <name>topLevelTagGroup</name>
+                     </attribute>
+                  </node>
+                  <node>
+                     <name>Pause</name>
+                     <description>Indicates the temporary interruption of  the operation a process and subsequently wait for a signal to continue.</description>
+                  </node>
+                  <node>
+                     <name>Time-out</name>
+                     <description>A cancellation or cessation that automatically occurs when a predefined interval of time has passed without a certain event occurring.</description>
+                  </node>
+                  <node>
+                     <name>Time-sync</name>
+                     <description>A synchronization signal whose purpose to help synchronize different signals or processes. Often used to indicate a marker inserted into the recorded data to allow post hoc synchronization of concurrently recorded data streams.</description>
+                  </node>
+               </node>
+            </node>
+            <node>
+               <name>Data-resolution</name>
+               <description>Smallest change in a quality being measured by an sensor that causes a perceptible change.</description>
+               <node>
+                  <name>Printer-resolution</name>
+                  <description>Resolution of a printer, usually expressed as the number of dots-per-inch for a printer.</description>
+                  <node>
+                     <name>#</name>
+                     <attribute>
+                        <name>takesValue</name>
+                     </attribute>
+                     <attribute>
+                        <name>valueClass</name>
+                        <value>numericClass</value>
+                     </attribute>
+                  </node>
+               </node>
+               <node>
+                  <name>Screen-resolution</name>
+                  <description>Resolution of a screen, usually expressed as the of pixels in a dimension for a digital display device.</description>
+                  <node>
+                     <name>#</name>
+                     <attribute>
+                        <name>takesValue</name>
+                     </attribute>
+                     <attribute>
+                        <name>valueClass</name>
+                        <value>numericClass</value>
+                     </attribute>
+                  </node>
+               </node>
+               <node>
+                  <name>Sensory-resolution</name>
+                  <description>Resolution of measurements by a sensing device.</description>
+                  <node>
+                     <name>#</name>
+                     <attribute>
+                        <name>takesValue</name>
+                     </attribute>
+                     <attribute>
+                        <name>valueClass</name>
+                        <value>numericClass</value>
+                     </attribute>
+                  </node>
+               </node>
+               <node>
+                  <name>Spatial-resolution</name>
+                  <description>Linear spacing of a spatial measurement.</description>
+                  <node>
+                     <name>#</name>
+                     <attribute>
+                        <name>takesValue</name>
+                     </attribute>
+                     <attribute>
+                        <name>valueClass</name>
+                        <value>numericClass</value>
+                     </attribute>
+                  </node>
+               </node>
+               <node>
+                  <name>Spectral-resolution</name>
+                  <description>Measures the ability of a sensor to  resolve features in the electromagnetic spectrum.</description>
+                  <node>
+                     <name>#</name>
+                     <attribute>
+                        <name>takesValue</name>
+                     </attribute>
+                     <attribute>
+                        <name>valueClass</name>
+                        <value>numericClass</value>
+                     </attribute>
+                  </node>
+               </node>
+               <node>
+                  <name>Temporal-resolution</name>
+                  <description>Measures the ability of a sensor to  resolve features in time.</description>
+                  <node>
+                     <name>#</name>
+                     <attribute>
+                        <name>takesValue</name>
+                     </attribute>
+                     <attribute>
+                        <name>valueClass</name>
+                        <value>numericClass</value>
+                     </attribute>
+                  </node>
+               </node>
+            </node>
+            <node>
+               <name>Data-source-type</name>
+               <description>The type of place, person, or thing from which the data comes or can be obtained.</description>
+               <node>
+                  <name>Computed-feature</name>
+                  <description>A feature computed from the data by a tool. This tag should be grouped with a label of the form Toolname_propertyName.</description>
+               </node>
+               <node>
+                  <name>Computed-prediction</name>
+                  <description>A computed extrapolation of known data.</description>
+               </node>
+               <node>
+                  <name>Expert-annotation</name>
+                  <description>An explanatory or critical comment or other in-context information provided by an authority.</description>
+               </node>
+               <node>
+                  <name>Instrument-measurement</name>
+                  <description>Information obtained from a device that is used to measure material properties or make other observations.</description>
+               </node>
+               <node>
+                  <name>Observation</name>
+                  <description>Active acquisition of information from a primary source. Should be grouped with a label of the form AgentID_featureName.</description>
+               </node>
+            </node>
+            <node>
+               <name>Data-value</name>
+               <description>Designation of the type of a data item.</description>
+               <node>
+                  <name>Categorical-value</name>
+                  <description>Indicates that something can take on a limited and usually fixed number of possible values.</description>
+                  <node>
+                     <name>Categorical-class-value</name>
+                     <description>Categorical values that fall into discrete classes such as true or false. The grouping is absolute in the sense that it is the same for all participants.</description>
+                     <node>
+                        <name>All</name>
+                        <description>To a complete degree or to the full or entire extent.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Some</value>
+                           <value>None</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Correct</name>
+                        <description>Free from error. Especially conforming to fact or truth.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Wrong</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Explicit</name>
+                        <description>Stated clearly and in detail, leaving no room for confusion or doubt.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Implicit</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>False</name>
+                        <description>Not in accordance with facts, reality or definitive criteria.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>True</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Implicit</name>
+                        <description>Implied though not plainly expressed.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Explicit</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Invalid</name>
+                        <description>Not allowed or not conforming to the correct format or specifications.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Valid</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>None</name>
+                        <description>No person or thing, nobody, not any.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>All</value>
+                           <value>Some</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Some</name>
+                        <description>At least a small amount or number of, but not a large amount of, or often.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>All</value>
+                           <value>None</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>True</name>
+                        <description>Conforming to facts, reality or definitive criteria.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>False</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Valid</name>
+                        <description>Allowable, usable, or acceptable.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Invalid</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Wrong</name>
+                        <description>Inaccurate or not correct.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Correct</value>
+                        </attribute>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Categorical-judgment-value</name>
+                     <description>Categorical values that are based on the judgment or perception of the participant such familiar and famous.</description>
+                     <node>
+                        <name>Abnormal</name>
+                        <description>Deviating in any way from the state, position, structure, condition, behavior, or rule which is considered a norm.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Normal</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Asymmetrical</name>
+                        <description>Lacking symmetry or having parts that fail to correspond to one another in shape, size, or arrangement.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Symmetrical</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Audible</name>
+                        <description>A sound that can be perceived by the participant.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Inaudible</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Congruent</name>
+                        <description>Concordance of multiple evidence lines. In agreement or harmony.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Incongruent</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Complex</name>
+                        <description>Hard, involved or complicated, elaborate, having many parts.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Simple</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Constrained</name>
+                        <description>Keeping something within particular limits or bounds.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Unconstrained</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Disordered</name>
+                        <description>Not neatly arranged. Confused and untidy. A structural quality in which the parts of an object are non-rigid.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Ordered</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Familiar</name>
+                        <description>Recognized, familiar, or within the scope of knowledge.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Unfamiliar</value>
+                           <value>Famous</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Famous</name>
+                        <description>A person who has a high degree of recognition by the general population for his or her success or accomplishments. A famous person.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Familiar</value>
+                           <value>Unfamiliar</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Inaudible</name>
+                        <description>A sound below the threshold of perception of the participant.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Audible</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Incongruent</name>
+                        <description>Not in agreement or harmony.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Congruent</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Involuntary</name>
+                        <description>An action that is not made by choice. In the body, involuntary actions (such as blushing) occur automatically, and cannot be controlled by choice.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Voluntary</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Masked</name>
+                        <description>Information exists but is not provided or is partially obscured due to security,  privacy, or other concerns.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Unmasked</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Normal</name>
+                        <description>Being approximately average or within certain limits. Conforming with or constituting a norm or standard or level or type or social norm.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Abnormal</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Ordered</name>
+                        <description>Conforming to a logical or comprehensible arrangement of separate elements.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Disordered</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Simple</name>
+                        <description>Easily understood or presenting no difficulties.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Complex</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Symmetrical</name>
+                        <description>Made up of exactly similar parts facing each other or around an axis. Showing aspects of symmetry.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Asymmetrical</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Unconstrained</name>
+                        <description>Moving without restriction.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Constrained</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Unfamiliar</name>
+                        <description>Not having knowledge or experience of.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Familiar</value>
+                           <value>Famous</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Unmasked</name>
+                        <description>Information is revealed.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Masked</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Voluntary</name>
+                        <description>Using free will or design; not forced or compelled; controlled by individual volition.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Involuntary</value>
+                        </attribute>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Categorical-level-value</name>
+                     <description>Categorical values based on dividing a continuous variable into levels such as high and low.</description>
+                     <node>
+                        <name>Cold</name>
+                        <description>Having an absence of heat.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Hot</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Deep</name>
+                        <description>Extending relatively far inward or downward.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Shallow</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>High</name>
+                        <description>Having a greater than normal degree, intensity, or amount.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Low</value>
+                           <value>Medium</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Hot</name>
+                        <description>Having an excess of heat.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Cold</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Large</name>
+                        <description>Having a great extent such as in physical dimensions, period of time, amplitude or frequency.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Small</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Liminal</name>
+                        <description>Situated at a sensory threshold that is barely perceptible or capable of eliciting a response.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Subliminal</value>
+                           <value>Supraliminal</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Loud</name>
+                        <description>Having a perceived high intensity of sound.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Quiet</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Low</name>
+                        <description>Less than normal in degree, intensity or amount.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>High</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Medium</name>
+                        <description>Mid-way between small and large in number, quantity, magnitude or extent.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Low</value>
+                           <value>High</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Negative</name>
+                        <description>Involving disadvantage or harm.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Positive</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Positive</name>
+                        <description>Involving advantage or good.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Negative</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Quiet</name>
+                        <description>Characterizing a perceived low intensity of sound.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Loud</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Rough</name>
+                        <description>Having a surface with perceptible bumps, ridges, or irregularities.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Smooth</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Shallow</name>
+                        <description>Having a depth which is relatively low.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Deep</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Small</name>
+                        <description>Having a small extent such as in physical dimensions, period of time, amplitude or frequency.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Large</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Smooth</name>
+                        <description>Having a surface free from bumps, ridges, or irregularities.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Rough</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Subliminal</name>
+                        <description>Situated below a sensory threshold that is imperceptible or not capable of eliciting a response.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Liminal</value>
+                           <value>Supraliminal</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Supraliminal</name>
+                        <description>Situated above a sensory threshold that is perceptible or capable of eliciting a response.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Liminal</value>
+                           <value>Subliminal</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Thick</name>
+                        <description>Wide in width, extent or cross-section.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Thin</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Thin</name>
+                        <description>Narrow in width, extent or cross-section.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Thick</value>
+                        </attribute>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Categorical-orientation-value</name>
+                     <description>Value indicating the orientation or direction of something.</description>
+                     <node>
+                        <name>Backward</name>
+                        <description>Directed behind or to the rear.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Forward</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Downward</name>
+                        <description>Moving or leading toward a lower place or level.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Leftward</value>
+                           <value>Rightward</value>
+                           <value>Upward</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Forward</name>
+                        <description>At or near or directed toward the front.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Backward</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Horizontally-oriented</name>
+                        <description>Oriented parallel to or in the plane of the horizon.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Vertically-oriented</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Leftward</name>
+                        <description>Going toward or facing the left.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Downward</value>
+                           <value>Rightward</value>
+                           <value>Upward</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Oblique</name>
+                        <description>Slanting or inclined in direction, course, or position that is neither parallel nor perpendicular nor right-angular.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Rotated</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Rightward</name>
+                        <description>Going toward or situated on the right.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Downward</value>
+                           <value>Leftward</value>
+                           <value>Upward</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Rotated</name>
+                        <description>Positioned offset around an axis or center.</description>
+                     </node>
+                     <node>
+                        <name>Upward</name>
+                        <description>Moving, pointing, or leading to a higher place, point, or level.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Downward</value>
+                           <value>Leftward</value>
+                           <value>Rightward</value>
+                        </attribute>
+                     </node>
+                     <node>
+                        <name>Vertically-oriented</name>
+                        <description>Oriented perpendicular to the plane of the horizon.</description>
+                        <attribute>
+                           <name>relatedTag</name>
+                           <value>Horizontally-oriented</value>
+                        </attribute>
+                     </node>
+                  </node>
+               </node>
+               <node>
+                  <name>Physical-value</name>
+                  <description>The value of some physical property of something.</description>
+                  <node>
+                     <name>Weight</name>
+                     <description>The relative mass or the quantity of matter contained by something.</description>
+                     <node>
+                        <name>#</name>
+                        <attribute>
+                           <name>takesValue</name>
+                        </attribute>
+                        <attribute>
+                           <name>valueClass</name>
+                           <value>numericClass</value>
+                        </attribute>
+                        <attribute>
+                           <name>unitClass</name>
+                           <value>weightUnits</value>
+                        </attribute>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Temperature</name>
+                     <description>A measure of hot or cold based on the average kinetic energy of the atoms or molecules in the system.</description>
+                     <node>
+                        <name>#</name>
+                        <attribute>
+                           <name>takesValue</name>
+                        </attribute>
+                        <attribute>
+                           <name>valueClass</name>
+                           <value>numericClass</value>
+                        </attribute>
+                        <attribute>
+                           <name>unitClass</name>
+                           <value>temperatureUnits</value>
+                        </attribute>
+                     </node>
+                  </node>
+               </node>
+               <node>
+                  <name>Quantitative-value</name>
+                  <description>Something capable of being estimated or expressed with numeric values.</description>
+                  <node>
+                     <name>Fraction</name>
+                     <description>A numerical value between 0 and 1.</description>
+                     <node>
+                        <name>#</name>
+                        <attribute>
+                           <name>takesValue</name>
+                        </attribute>
+                        <attribute>
+                           <name>valueClass</name>
+                           <value>numericClass</value>
+                        </attribute>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Item-count</name>
+                     <description>The integer count of something which is usually grouped with the entity it is counting. (Item-count/3, A) indicates that 3 of A have occurred up to this point.</description>
+                     <node>
+                        <name>#</name>
+                        <attribute>
+                           <name>takesValue</name>
+                        </attribute>
+                        <attribute>
+                           <name>valueClass</name>
+                           <value>numericClass</value>
+                        </attribute>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Item-index</name>
+                     <description>The index of an item in a collection, sequence or other structure. (A (Item-index/3, B)) means that A is item number 3 in B.</description>
+                     <node>
+                        <name>#</name>
+                        <attribute>
+                           <name>takesValue</name>
+                        </attribute>
+                        <attribute>
+                           <name>valueClass</name>
+                           <value>numericClass</value>
+                        </attribute>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Item-interval</name>
+                     <description>An integer indicating how many items or entities have passed since the last one of these. An item interval of 0 indicates the current item.</description>
+                     <node>
+                        <name>#</name>
+                        <attribute>
+                           <name>takesValue</name>
+                        </attribute>
+                        <attribute>
+                           <name>valueClass</name>
+                           <value>numericClass</value>
+                        </attribute>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Percentage</name>
+                     <description>A fraction or ratio with 100 understood as the denominator.</description>
+                     <node>
+                        <name>#</name>
+                        <attribute>
+                           <name>takesValue</name>
+                        </attribute>
+                        <attribute>
+                           <name>valueClass</name>
+                           <value>numericClass</value>
+                        </attribute>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Ratio</name>
+                     <description>A quotient of quantities of the same kind for different components within the same system.</description>
+                     <node>
+                        <name>#</name>
+                        <attribute>
+                           <name>takesValue</name>
+                        </attribute>
+                        <attribute>
+                           <name>valueClass</name>
+                           <value>numericClass</value>
+                        </attribute>
+                     </node>
+                  </node>
+               </node>
+               <node>
+                  <name>Statistical-value</name>
+                  <description>A value based on or employing the principles of statistics.</description>
+                  <attribute>
+                     <name>extensionAllowed</name>
+                  </attribute>
+                  <node>
+                     <name>Data-maximum</name>
+                     <description>The largest possible quantity or degree.</description>
+                     <node>
+                        <name>#</name>
+                        <attribute>
+                           <name>takesValue</name>
+                        </attribute>
+                        <attribute>
+                           <name>valueClass</name>
+                           <value>numericClass</value>
+                        </attribute>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Data-mean</name>
+                     <description>The sum of a set of values divided by the number of values in the set.</description>
+                     <node>
+                        <name>#</name>
+                        <attribute>
+                           <name>takesValue</name>
+                        </attribute>
+                        <attribute>
+                           <name>valueClass</name>
+                           <value>numericClass</value>
+                        </attribute>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Data-median</name>
+                     <description>The value which has an equal number of values greater and less than it.</description>
+                     <node>
+                        <name>#</name>
+                        <attribute>
+                           <name>takesValue</name>
+                        </attribute>
+                        <attribute>
+                           <name>valueClass</name>
+                           <value>numericClass</value>
+                        </attribute>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Data-minimum</name>
+                     <description>The smallest possible quantity.</description>
+                     <node>
+                        <name>#</name>
+                        <attribute>
+                           <name>takesValue</name>
+                        </attribute>
+                        <attribute>
+                           <name>valueClass</name>
+                           <value>numericClass</value>
+                        </attribute>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Probability</name>
+                     <description>A measure of the expectation of the occurrence of a particular event.</description>
+                     <node>
+                        <name>#</name>
+                        <attribute>
+                           <name>takesValue</name>
+                        </attribute>
+                        <attribute>
+                           <name>valueClass</name>
+                           <value>numericClass</value>
+                        </attribute>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Standard-deviation</name>
+                     <description>A measure of the range of values in a set of numbers. Standard deviation is a statistic used as a measure of the dispersion or variation in a distribution, equal to the square root of the arithmetic mean of the squares of the deviations from the arithmetic mean.</description>
+                     <node>
+                        <name>#</name>
+                        <attribute>
+                           <name>takesValue</name>
+                        </attribute>
+                        <attribute>
+                           <name>valueClass</name>
+                           <value>numericClass</value>
+                        </attribute>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Statistical-accuracy</name>
+                     <description>A measure of closeness to true value expressed as a number between 0 and 1.</description>
+                     <node>
+                        <name>#</name>
+                        <attribute>
+                           <name>takesValue</name>
+                        </attribute>
+                        <attribute>
+                           <name>valueClass</name>
+                           <value>numericClass</value>
+                        </attribute>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Statistical-precision</name>
+                     <description>A quantitative representation of the degree of accuracy necessary for or associated with a particular action.</description>
+                     <node>
+                        <name>#</name>
+                        <attribute>
+                           <name>takesValue</name>
+                        </attribute>
+                        <attribute>
+                           <name>valueClass</name>
+                           <value>numericClass</value>
+                        </attribute>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Statistical-recall</name>
+                     <description>Sensitivity is a measurement datum qualifying a binary classification test and is computed by substracting the false negative rate to the integral numeral 1.</description>
+                     <node>
+                        <name>#</name>
+                        <attribute>
+                           <name>takesValue</name>
+                        </attribute>
+                        <attribute>
+                           <name>valueClass</name>
+                           <value>numericClass</value>
+                        </attribute>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Statistical-uncertainty</name>
+                     <description>A measure of the inherent variability of repeated observation measurements of a quantity including quantities evaluated by statistical methods and by other means.</description>
+                     <node>
+                        <name>#</name>
+                        <attribute>
+                           <name>takesValue</name>
+                        </attribute>
+                        <attribute>
+                           <name>valueClass</name>
+                           <value>numericClass</value>
+                        </attribute>
+                     </node>
+                  </node>
+               </node>
+               <node>
+                  <name>Spatiotemporal-value</name>
+                  <description>A property relating to space and/or time.</description>
+                  <node>
+                     <name>Rate-of-change</name>
+                     <description>The amount of change accumulated per unit time.</description>
+                     <node>
+                        <name>Acceleration</name>
+                        <description>Magnitude of the rate of change in either speed or direction. The direction of change should be given separately.</description>
+                        <node>
+                           <name>#</name>
+                           <attribute>
+                              <name>takesValue</name>
+                           </attribute>
+                           <attribute>
+                              <name>valueClass</name>
+                              <value>numericClass</value>
+                           </attribute>
+                           <attribute>
+                              <name>unitClass</name>
+                              <value>accelerationUnits</value>
+                           </attribute>
+                        </node>
+                     </node>
+                     <node>
+                        <name>Frequency</name>
+                        <description>Frequency is the number of occurrences of a repeating event per unit time.</description>
+                        <node>
+                           <name>#</name>
+                           <attribute>
+                              <name>takesValue</name>
+                           </attribute>
+                           <attribute>
+                              <name>valueClass</name>
+                              <value>numericClass</value>
+                           </attribute>
+                           <attribute>
+                              <name>unitClass</name>
+                              <value>frequencyUnits</value>
+                           </attribute>
+                        </node>
+                     </node>
+                     <node>
+                        <name>Jerk-rate</name>
+                        <description>Magnitude of the rate at which the acceleration of an object changes with respect to time. The direction of change should be given separately.</description>
+                        <node>
+                           <name>#</name>
+                           <attribute>
+                              <name>takesValue</name>
+                           </attribute>
+                           <attribute>
+                              <name>valueClass</name>
+                              <value>numericClass</value>
+                           </attribute>
+                           <attribute>
+                              <name>unitClass</name>
+                              <value>jerkUnits</value>
+                           </attribute>
+                        </node>
+                     </node>
+                     <node>
+                        <name>Sampling-rate</name>
+                        <description>The number of digital samples taken or recorded per unit of time.</description>
+                        <node>
+                           <name>#</name>
+                           <attribute>
+                              <name>takesValue</name>
+                           </attribute>
+                           <attribute>
+                              <name>unitClass</name>
+                              <value>frequencyUnits</value>
+                           </attribute>
+                        </node>
+                     </node>
+                     <node>
+                        <name>Refresh-rate</name>
+                        <description>The frequency with which the image on a computer monitor or similar electronic display screen is refreshed, usually expressed in hertz.</description>
+                        <node>
+                           <name>#</name>
+                           <attribute>
+                              <name>takesValue</name>
+                           </attribute>
+                           <attribute>
+                              <name>valueClass</name>
+                              <value>numericClass</value>
+                           </attribute>
+                        </node>
+                     </node>
+                     <node>
+                        <name>Speed</name>
+                        <description>A scalar measure of the rate of movement of the object expressed either as the distance travelled divided by the time taken (average speed) or the rate of change of position with respect to time at a particular point (instantaneous speed). The direction of change should be given separately.</description>
+                        <node>
+                           <name>#</name>
+                           <attribute>
+                              <name>takesValue</name>
+                           </attribute>
+                           <attribute>
+                              <name>valueClass</name>
+                              <value>numericClass</value>
+                           </attribute>
+                           <attribute>
+                              <name>unitClass</name>
+                              <value>speedUnits</value>
+                           </attribute>
+                        </node>
+                     </node>
+                     <node>
+                        <name>Temporal-rate</name>
+                        <description>The number of items per unit of time.</description>
+                        <node>
+                           <name>#</name>
+                           <attribute>
+                              <name>takesValue</name>
+                           </attribute>
+                           <attribute>
+                              <name>valueClass</name>
+                              <value>numericClass</value>
+                           </attribute>
+                           <attribute>
+                              <name>unitClass</name>
+                              <value>frequencyUnits</value>
+                           </attribute>
+                        </node>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Spatial-value</name>
+                     <description>Value of an item involving space.</description>
+                     <node>
+                        <name>Angle</name>
+                        <description>The amount of inclination of one line to another or the plane of one object to another.</description>
+                        <node>
+                           <name>#</name>
+                           <attribute>
+                              <name>takesValue</name>
+                           </attribute>
+                           <attribute>
+                              <name>unitClass</name>
+                              <value>angleUnits</value>
+                           </attribute>
+                           <attribute>
+                              <name>valueClass</name>
+                              <value>numericClass</value>
+                           </attribute>
+                        </node>
+                     </node>
+                     <node>
+                        <name>Distance</name>
+                        <description>A measure of the space separating two objects or points.</description>
+                        <node>
+                           <name>#</name>
+                           <attribute>
+                              <name>takesValue</name>
+                           </attribute>
+                           <attribute>
+                              <name>valueClass</name>
+                              <value>numericClass</value>
+                           </attribute>
+                           <attribute>
+                              <name>unitClass</name>
+                              <value>physicalLengthUnits</value>
+                           </attribute>
+                        </node>
+                     </node>
+                     <node>
+                        <name>Position</name>
+                        <description>A reference to the alignment of an object, a particular situation or view of a situation, or the location of an object. Coordinates with respect a specified frame of reference or the default Screen-frame if no frame is given.</description>
+                        <node>
+                           <name>X-position</name>
+                           <description>The position along the x-axis of the frame of reference.</description>
+                           <node>
+                              <name>#</name>
+                              <attribute>
+                                 <name>takesValue</name>
+                              </attribute>
+                              <attribute>
+                                 <name>valueClass</name>
+                                 <value>numericClass</value>
+                              </attribute>
+                              <attribute>
+                                 <name>unitClass</name>
+                                 <value>physicalLengthUnits</value>
+                              </attribute>
+                           </node>
+                        </node>
+                        <node>
+                           <name>Y-position</name>
+                           <description>The position along the y-axis of the frame of reference.</description>
+                           <node>
+                              <name>#</name>
+                              <attribute>
+                                 <name>takesValue</name>
+                              </attribute>
+                              <attribute>
+                                 <name>valueClass</name>
+                                 <value>numericClass</value>
+                              </attribute>
+                              <attribute>
+                                 <name>unitClass</name>
+                                 <value>physicalLengthUnits</value>
+                              </attribute>
+                           </node>
+                        </node>
+                        <node>
+                           <name>Z-position</name>
+                           <description>The position along the z-axis of the frame of reference.</description>
+                           <node>
+                              <name>#</name>
+                              <attribute>
+                                 <name>takesValue</name>
+                              </attribute>
+                              <attribute>
+                                 <name>valueClass</name>
+                                 <value>numericClass</value>
+                              </attribute>
+                              <attribute>
+                                 <name>unitClass</name>
+                                 <value>physicalLengthUnits</value>
+                              </attribute>
+                           </node>
+                        </node>
+                     </node>
+                     <node>
+                        <name>Size</name>
+                        <description>The physical magnitude of something.</description>
+                        <node>
+                           <name>Area</name>
+                           <description>The extent of a 2-dimensional surface enclosed within a boundary.</description>
+                           <node>
+                              <name>#</name>
+                              <attribute>
+                                 <name>takesValue</name>
+                              </attribute>
+                              <attribute>
+                                 <name>valueClass</name>
+                                 <value>numericClass</value>
+                              </attribute>
+                              <attribute>
+                                 <name>unitClass</name>
+                                 <value>areaUnits</value>
+                              </attribute>
+                           </node>
+                        </node>
+                        <node>
+                           <name>Depth</name>
+                           <description>The distance from the surface of something especially from the perspective of looking from the front.</description>
+                           <node>
+                              <name>#</name>
+                              <attribute>
+                                 <name>takesValue</name>
+                              </attribute>
+                              <attribute>
+                                 <name>valueClass</name>
+                                 <value>numericClass</value>
+                              </attribute>
+                              <attribute>
+                                 <name>unitClass</name>
+                                 <value>physicalLengthUnits</value>
+                              </attribute>
+                           </node>
+                        </node>
+                        <node>
+                           <name>Length</name>
+                           <description>The linear extent in space from one end of something to the other end, or the extent of something from beginning to end.</description>
+                           <node>
+                              <name>#</name>
+                              <attribute>
+                                 <name>takesValue</name>
+                              </attribute>
+                              <attribute>
+                                 <name>valueClass</name>
+                                 <value>numericClass</value>
+                              </attribute>
+                              <attribute>
+                                 <name>unitClass</name>
+                                 <value>physicalLengthUnits</value>
+                              </attribute>
+                           </node>
+                        </node>
+                        <node>
+                           <name>Width</name>
+                           <description>The extent or measurement of something from side to side.</description>
+                           <node>
+                              <name>#</name>
+                              <attribute>
+                                 <name>takesValue</name>
+                              </attribute>
+                              <attribute>
+                                 <name>valueClass</name>
+                                 <value>numericClass</value>
+                              </attribute>
+                              <attribute>
+                                 <name>unitClass</name>
+                                 <value>physicalLengthUnits</value>
+                              </attribute>
+                           </node>
+                        </node>
+                        <node>
+                           <name>Height</name>
+                           <description>The vertical measurement or distance from the base to the top of an object.</description>
+                           <node>
+                              <name>#</name>
+                              <attribute>
+                                 <name>takesValue</name>
+                              </attribute>
+                              <attribute>
+                                 <name>valueClass</name>
+                                 <value>numericClass</value>
+                              </attribute>
+                              <attribute>
+                                 <name>unitClass</name>
+                                 <value>physicalLengthUnits</value>
+                              </attribute>
+                           </node>
+                        </node>
+                        <node>
+                           <name>Volume</name>
+                           <description>The amount of three dimensional space occupied by an object or the capacity of a space or container.</description>
+                           <node>
+                              <name>#</name>
+                              <attribute>
+                                 <name>takesValue</name>
+                              </attribute>
+                              <attribute>
+                                 <name>valueClass</name>
+                                 <value>numericClass</value>
+                              </attribute>
+                              <attribute>
+                                 <name>unitClass</name>
+                                 <value>volumeUnits</value>
+                              </attribute>
+                           </node>
+                        </node>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Temporal-value</name>
+                     <description>A characteristic of or relating to time or limited by time.</description>
+                     <node>
+                        <name>Delay</name>
+                        <description>Time during which some action is awaited.</description>
+                        <node>
+                           <name>#</name>
+                           <attribute>
+                              <name>takesValue</name>
+                           </attribute>
+                           <attribute>
+                              <name>valueClass</name>
+                              <value>numericClass</value>
+                           </attribute>
+                           <attribute>
+                              <name>unitClass</name>
+                              <value>timeUnits</value>
+                           </attribute>
+                        </node>
+                     </node>
+                     <node>
+                        <name>Duration</name>
+                        <description>The period of time during which something occurs or continues.</description>
+                        <node>
+                           <name>#</name>
+                           <attribute>
+                              <name>takesValue</name>
+                           </attribute>
+                           <attribute>
+                              <name>valueClass</name>
+                              <value>numericClass</value>
+                           </attribute>
+                           <attribute>
+                              <name>unitClass</name>
+                              <value>timeUnits</value>
+                           </attribute>
+                        </node>
+                     </node>
+                     <node>
+                        <name>Time-interval</name>
+                        <description>The period of time separating two instances, events, or occurrences.</description>
+                        <node>
+                           <name>#</name>
+                           <attribute>
+                              <name>takesValue</name>
+                           </attribute>
+                           <attribute>
+                              <name>valueClass</name>
+                              <value>numericClass</value>
+                           </attribute>
+                           <attribute>
+                              <name>unitClass</name>
+                              <value>timeUnits</value>
+                           </attribute>
+                        </node>
+                     </node>
+                     <node>
+                        <name>Time-value</name>
+                        <description>A value with units of time. Usually grouped with tags identifying what the value represents.</description>
+                        <node>
+                           <name>#</name>
+                           <attribute>
+                              <name>takesValue</name>
+                           </attribute>
+                           <attribute>
+                              <name>valueClass</name>
+                              <value>numericClass</value>
+                           </attribute>
+                           <attribute>
+                              <name>unitClass</name>
+                              <value>timeUnits</value>
+                           </attribute>
+                        </node>
+                     </node>
+                  </node>
+               </node>
+            </node>
+            <node>
+               <name>Data-variability-attribute</name>
+               <description>An attribute describing how something changes or varies.</description>
+               <node>
+                  <name>Abrupt</name>
+                  <description>Marked by sudden change.</description>
+               </node>
+               <node>
+                  <name>Constant</name>
+                  <description>Continually recurring or continuing without interruption. Not changing in time or space.</description>
+               </node>
+               <node>
+                  <name>Continuous</name>
+                  <description>Uninterrupted in time, sequence, substance, or extent.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Discrete</value>
+                     <value>Discontinuous</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Decreasing</name>
+                  <description>Becoming smaller or fewer in size, amount, intensity, or degree.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Increasing</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Deterministic</name>
+                  <description>No randomness is involved in the development of the future states of the element.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Random</value>
+                     <value>Stochastic</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Discontinuous</name>
+                  <description>Having a gap in time, sequence, substance, or extent.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Continuous</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Discrete</name>
+                  <description>Constituting a separate entities or parts.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Continuous</value>
+                     <value>Discontinuous</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Flickering</name>
+                  <description>Moving irregularly or unsteadily or burning or shining fitfully or with a fluctuating light.</description>
+               </node>
+               <node>
+                  <name>Estimated-value</name>
+                  <description>Something that has been calculated or measured approximately.</description>
+               </node>
+               <node>
+                  <name>Exact-value</name>
+                  <description>A value that is viewed to the true value according to some standard.</description>
+               </node>
+               <node>
+                  <name>Fractal</name>
+                  <description>Having extremely irregular curves or shapes for which any suitably chosen part is similar in shape to a given larger or smaller part when magnified or reduced to the same size.</description>
+               </node>
+               <node>
+                  <name>Increasing</name>
+                  <description>Becoming greater in size, amount, or degree.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Decreasing</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Random</name>
+                  <description>Governed by or depending on chance. Lacking any definite plan or order or purpose.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Deterministic</value>
+                     <value>Stochastic</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Repetitive</name>
+                  <description>A recurring action that is often non-purposeful.</description>
+               </node>
+               <node>
+                  <name>Stochastic</name>
+                  <description>Uses  a random probability distribution or pattern that may be analysed statistically but may not be predicted precisely to determine future states.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Deterministic</value>
+                     <value>Random</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Varying</name>
+                  <description>Differing in size, amount, degree, or nature.</description>
+               </node>
+            </node>
+         </node>
+         <node>
+            <name>Environmental-property</name>
+            <description>Relating to or arising from the surroundings of an agent.</description>
+            <node>
+               <name>Indoors</name>
+               <description>Located inside a building or enclosure.</description>
+            </node>
+            <node>
+               <name>Outdoors</name>
+               <description>Any area outside a building or shelter.</description>
+            </node>
+            <node>
+               <name>Real-world</name>
+               <description>Located in a place that exists in real space and time under realistic conditions.</description>
+            </node>
+            <node>
+               <name>Virtual-world</name>
+               <description>Using technology that creates immersive, computer-generated experiences that a person can interact with and navigate through. The digital content is generally delivered to the user through some type of headset and responds to changes in head position or through interaction with other types of sensors. Existing in a virtual setting such as a simulation or game environment.</description>
+            </node>
+            <node>
+               <name>Augmented-reality</name>
+               <description>Using technology that enhances real-world experiences with computer-derived digital overlays to change some aspects of perception of the natural environment. The digital content is shown to the user through a smart device or glasses and responds to changes in the environment.</description>
+            </node>
+            <node>
+               <name>Motion-platform</name>
+               <description>A mechanism that creates the feelings of being in a real motion environment.</description>
+            </node>
+            <node>
+               <name>Urban</name>
+               <description>Relating to, located in, or characteristic of a city or densely populated area.</description>
+            </node>
+            <node>
+               <name>Rural</name>
+               <description>Of or pertaining to the country as opposed to the city.</description>
+            </node>
+            <node>
+               <name>Terrain</name>
+               <description>Characterization of the physical features of a tract of land.</description>
+               <node>
+                  <name>Composite-terrain</name>
+                  <description>Tracts of land characterized by a mixure of physical features.</description>
+               </node>
+               <node>
+                  <name>Dirt-terrain</name>
+                  <description>Tracts of land characterized by a soil surface and lack of vegetation.</description>
+               </node>
+               <node>
+                  <name>Grassy-terrain</name>
+                  <description>Tracts of land covered by grass.</description>
+               </node>
+               <node>
+                  <name>Gravel-terrain</name>
+                  <description>Tracts of land covered by a surface consisting a loose aggregation of small water-worn or pounded stones.</description>
+               </node>
+               <node>
+                  <name>Leaf-covered-terrain</name>
+                  <description>Tracts of land covered by leaves and composited organic material.</description>
+               </node>
+               <node>
+                  <name>Muddy-terrain</name>
+                  <description>Tracts of land covered by a liquid or semi-liquid mixture of water and some combination of soil, silt, and clay.</description>
+               </node>
+               <node>
+                  <name>Paved-terrain</name>
+                  <description>Tracts of land covered  with concrete, asphalt, stones, or bricks.</description>
+               </node>
+               <node>
+                  <name>Rocky-terrain</name>
+                  <description>Tracts of land consisting or full of rock or rocks.</description>
+               </node>
+               <node>
+                  <name>Sloped-terrain</name>
+                  <description>Tracts of land arranged in a sloping  or inclined position.</description>
+               </node>
+               <node>
+                  <name>Uneven-terrain</name>
+                  <description>Tracts of land that are not level, smooth, or regular.</description>
+               </node>
+            </node>
+         </node>
+         <node>
+            <name>Informational-property</name>
+            <description>Something that pertains to a task.</description>
+            <attribute>
+               <name>extensionAllowed</name>
+            </attribute>
+            <node>
+               <name>Description</name>
+               <description>An explanation of what the tag group it is in means. If the description is at the top-level of an event string, the description applies to the event.</description>
+               <attribute>
+                  <name>requireChild</name>
+               </attribute>
+               <node>
+                  <name>#</name>
+                  <attribute>
+                     <name>takesValue</name>
+                  </attribute>
+                  <attribute>
+                     <name>valueClass</name>
+                     <value>textClass</value>
+                  </attribute>
+               </node>
+            </node>
+            <node>
+               <name>ID</name>
+               <description>An alphanumeric name that identifies either a unique object or a unique class of objects. Here the object or class may be an idea, physical countable object (or class), or physical uncountable substance (or class).</description>
+               <attribute>
+                  <name>requireChild</name>
+               </attribute>
+               <node>
+                  <name>#</name>
+                  <attribute>
+                     <name>takesValue</name>
+                  </attribute>
+                  <attribute>
+                     <name>valueClass</name>
+                     <value>textClass</value>
+                  </attribute>
+               </node>
+            </node>
+            <node>
+               <name>Label</name>
+               <description>A string of 20 or fewer characters identifying something. Labels usually refer to general classes of things while IDs refer to specific instances. A term that is associated with some entity. A brief description given for purposes of identification. An identifying or descriptive marker that is attached to an object.</description>
+               <attribute>
+                  <name>requireChild</name>
+               </attribute>
+               <node>
+                  <name>#</name>
+                  <attribute>
+                     <name>takesValue</name>
+                  </attribute>
+                  <attribute>
+                     <name>valueClass</name>
+                     <value>nameClass</value>
+                  </attribute>
+               </node>
+            </node>
+            <node>
+               <name>Metadata</name>
+               <description>Data about data. Information that describes another set of data.</description>
+               <node>
+                  <name>CogAtlas</name>
+                  <description>The Cognitive Atlas ID number of something.</description>
+                  <node>
+                     <name>#</name>
+                     <attribute>
+                        <name>takesValue</name>
+                     </attribute>
+                  </node>
+               </node>
+               <node>
+                  <name>CogPo</name>
+                  <description>The CogPO ID number of something.</description>
+                  <node>
+                     <name>#</name>
+                     <attribute>
+                        <name>takesValue</name>
+                     </attribute>
+                  </node>
+               </node>
+               <node>
+                  <name>Creation-date</name>
+                  <description>The date on which data creation of this element began.</description>
+                  <attribute>
+                     <name>requireChild</name>
+                  </attribute>
+                  <node>
+                     <name>#</name>
+                     <attribute>
+                        <name>takesValue</name>
+                     </attribute>
+                     <attribute>
+                        <name>valueClass</name>
+                        <value>dateTimeClass</value>
+                     </attribute>
+                  </node>
+               </node>
+               <node>
+                  <name>Experimental-note</name>
+                  <description>A brief written record about the experiment.</description>
+                  <node>
+                     <name>#</name>
+                     <attribute>
+                        <name>takesValue</name>
+                     </attribute>
+                     <attribute>
+                        <name>valueClass</name>
+                        <value>textClass</value>
+                     </attribute>
+                  </node>
+               </node>
+               <node>
+                  <name>Library-name</name>
+                  <description>Official name of a HED library.</description>
+                  <node>
+                     <name>#</name>
+                     <attribute>
+                        <name>takesValue</name>
+                     </attribute>
+                     <attribute>
+                        <name>valueClass</name>
+                        <value>nameClass</value>
+                     </attribute>
+                  </node>
+               </node>
+               <node>
+                  <name>OBO-identifier</name>
+                  <description>The identifier of a term in some Open Biology Ontology (OBO) ontology.</description>
+                  <node>
+                     <name>#</name>
+                     <attribute>
+                        <name>takesValue</name>
+                     </attribute>
+                     <attribute>
+                        <name>valueClass</name>
+                        <value>nameClass</value>
+                     </attribute>
+                  </node>
+               </node>
+               <node>
+                  <name>Pathname</name>
+                  <description>The specification of a node (file or directory) in a hierarchical file system, usually specified by listing the nodes top-down.</description>
+                  <node>
+                     <name>#</name>
+                     <attribute>
+                        <name>takesValue</name>
+                     </attribute>
+                  </node>
+               </node>
+               <node>
+                  <name>Subject-identifier</name>
+                  <description>A sequence of characters used to identify, name, or characterize a trial or study subject.</description>
+                  <node>
+                     <name>#</name>
+                     <attribute>
+                        <name>takesValue</name>
+                     </attribute>
+                  </node>
+               </node>
+               <node>
+                  <name>Version-identifier</name>
+                  <description>An alphanumeric character string that identifies a form or variant of a type or original.</description>
+                  <node>
+                     <name>#</name>
+                     <description>Usually is a semantic version.</description>
+                     <attribute>
+                        <name>takesValue</name>
+                     </attribute>
+                  </node>
+               </node>
+            </node>
+            <node>
+               <name>Parameter</name>
+               <description>Something user-defined for this experiment.</description>
+               <node>
+                  <name>Parameter-label</name>
+                  <description>The name of the parameter.</description>
+                  <node>
+                     <name>#</name>
+                     <attribute>
+                        <name>takesValue</name>
+                     </attribute>
+                     <attribute>
+                        <name>valueClass</name>
+                        <value>nameClass</value>
+                     </attribute>
+                  </node>
+               </node>
+               <node>
+                  <name>Parameter-value</name>
+                  <description>The value of the parameter.</description>
+                  <node>
+                     <name>#</name>
+                     <attribute>
+                        <name>takesValue</name>
+                     </attribute>
+                     <attribute>
+                        <name>valueClass</name>
+                        <value>textClass</value>
+                     </attribute>
+                  </node>
+               </node>
+            </node>
+         </node>
+         <node>
+            <name>Organizational-property</name>
+            <description>Relating to an organization or the action of organizing something.</description>
+            <node>
+               <name>Collection</name>
+               <description>A tag designating a grouping of items such as in a set or list.</description>
+               <node>
+                  <name>#</name>
+                  <description>Name of the collection.</description>
+                  <attribute>
+                     <name>takesValue</name>
+                  </attribute>
+                  <attribute>
+                     <name>valueClass</name>
+                     <value>nameClass</value>
+                  </attribute>
+               </node>
+            </node>
+            <node>
+               <name>Condition-variable</name>
+               <description>An aspect of the experiment or task that is to be varied during the experiment. Task-conditions are sometimes called independent type_variables or contrasts.</description>
+               <node>
+                  <name>#</name>
+                  <description>Name of the condition variable.</description>
+                  <attribute>
+                     <name>takesValue</name>
+                  </attribute>
+                  <attribute>
+                     <name>valueClass</name>
+                     <value>nameClass</value>
+                  </attribute>
+               </node>
+            </node>
+            <node>
+               <name>Control-variable</name>
+               <description>An aspect of the experiment that is fixed throughout the study and usually is explicitly controlled.</description>
+               <node>
+                  <name>#</name>
+                  <description>Name of the control variable.</description>
+                  <attribute>
+                     <name>takesValue</name>
+                  </attribute>
+                  <attribute>
+                     <name>valueClass</name>
+                     <value>nameClass</value>
+                  </attribute>
+               </node>
+            </node>
+            <node>
+               <name>Def</name>
+               <description>A HED-specific utility tag used with a defined name to represent the tags associated with that definition.</description>
+               <attribute>
+                  <name>requireChild</name>
+               </attribute>
+               <node>
+                  <name>#</name>
+                  <description>Name of the definition.</description>
+                  <attribute>
+                     <name>takesValue</name>
+                  </attribute>
+                  <attribute>
+                     <name>valueClass</name>
+                     <value>nameClass</value>
+                  </attribute>
+               </node>
+            </node>
+            <node>
+               <name>Def-expand</name>
+               <description>A HED specific utility tag that is grouped with an expanded definition. The child value of the Def-expand is the name of the expanded definition.</description>
+               <attribute>
+                  <name>requireChild</name>
+               </attribute>
+               <attribute>
+                  <name>tagGroup</name>
+               </attribute>
+               <node>
+                  <name>#</name>
+                  <attribute>
+                     <name>takesValue</name>
+                  </attribute>
+                  <attribute>
+                     <name>valueClass</name>
+                     <value>nameClass</value>
+                  </attribute>
+               </node>
+            </node>
+            <node>
+               <name>Definition</name>
+               <description>A HED-specific utility tag whose child value is the name of the concept and the tag group associated with the tag is an English language explanation of a concept.</description>
+               <attribute>
+                  <name>requireChild</name>
+               </attribute>
+               <attribute>
+                  <name>topLevelTagGroup</name>
+               </attribute>
+               <node>
+                  <name>#</name>
+                  <description>Name of the definition.</description>
+                  <attribute>
+                     <name>takesValue</name>
+                  </attribute>
+                  <attribute>
+                     <name>valueClass</name>
+                     <value>nameClass</value>
+                  </attribute>
+               </node>
+            </node>
+            <node>
+               <name>Event-context</name>
+               <description>A special HED tag inserted as part of a top-level tag group to contain information about the interrelated conditions under which the event occurs. The event context includes information about other events that are ongoing when this event happens.</description>
+               <attribute>
+                  <name>topLevelTagGroup</name>
+               </attribute>
+               <attribute>
+                  <name>unique</name>
+               </attribute>
+            </node>
+            <node>
+               <name>Event-stream</name>
+               <description>A special HED tag indicating that this event is a member of an ordered succession of events.</description>
+               <node>
+                  <name>#</name>
+                  <description>Name of the event stream.</description>
+                  <attribute>
+                     <name>takesValue</name>
+                  </attribute>
+                  <attribute>
+                     <name>valueClass</name>
+                     <value>nameClass</value>
+                  </attribute>
+               </node>
+            </node>
+            <node>
+               <name>Experimental-intertrial</name>
+               <description>A tag used to indicate a part of the experiment between trials usually where nothing is happening.</description>
+               <node>
+                  <name>#</name>
+                  <description>Optional label for the intertrial block.</description>
+                  <attribute>
+                     <name>takesValue</name>
+                  </attribute>
+                  <attribute>
+                     <name>valueClass</name>
+                     <value>nameClass</value>
+                  </attribute>
+               </node>
+            </node>
+            <node>
+               <name>Experimental-trial</name>
+               <description>Designates a run or execution of an activity, for example, one execution of a script. A tag used to indicate a particular organizational part in the experimental design often containing a stimulus-response pair or stimulus-response-feedback triad.</description>
+               <node>
+                  <name>#</name>
+                  <description>Optional label for the trial (often a numerical string).</description>
+                  <attribute>
+                     <name>takesValue</name>
+                  </attribute>
+                  <attribute>
+                     <name>valueClass</name>
+                     <value>nameClass</value>
+                  </attribute>
+               </node>
+            </node>
+            <node>
+               <name>Indicator-variable</name>
+               <description>An aspect of the experiment or task that is measured as task conditions are varied during the experiment. Experiment indicators are sometimes called dependent type_variables.</description>
+               <node>
+                  <name>#</name>
+                  <description>Name of the indicator variable.</description>
+                  <attribute>
+                     <name>takesValue</name>
+                  </attribute>
+                  <attribute>
+                     <name>valueClass</name>
+                     <value>nameClass</value>
+                  </attribute>
+               </node>
+            </node>
+            <node>
+               <name>Recording</name>
+               <description>A tag designating the data recording. Recording tags are usually have temporal scope which is the entire recording.</description>
+               <node>
+                  <name>#</name>
+                  <description>Optional label for the recording.</description>
+                  <attribute>
+                     <name>takesValue</name>
+                  </attribute>
+                  <attribute>
+                     <name>valueClass</name>
+                     <value>nameClass</value>
+                  </attribute>
+               </node>
+            </node>
+            <node>
+               <name>Task</name>
+               <description>An assigned piece of work, usually with a time allotment. A tag used to indicate a linkage the structured activities performed as part of the experiment.</description>
+               <node>
+                  <name>#</name>
+                  <description>Optional label for the task block.</description>
+                  <attribute>
+                     <name>takesValue</name>
+                  </attribute>
+                  <attribute>
+                     <name>valueClass</name>
+                     <value>nameClass</value>
+                  </attribute>
+               </node>
+            </node>
+            <node>
+               <name>Time-block</name>
+               <description>A tag used to indicate a contiguous time block in the experiment during which something is fixed or noted.</description>
+               <node>
+                  <name>#</name>
+                  <description>Optional label for the task block.</description>
+                  <attribute>
+                     <name>takesValue</name>
+                  </attribute>
+                  <attribute>
+                     <name>valueClass</name>
+                     <value>nameClass</value>
+                  </attribute>
+               </node>
+            </node>
+         </node>
+         <node>
+            <name>Sensory-property</name>
+            <description>Relating to sensation or the physical senses.</description>
+            <node>
+               <name>Sensory-attribute</name>
+               <description>A sensory characteristic associated with another entity.</description>
+               <node>
+                  <name>Auditory-attribute</name>
+                  <description>Pertaining to the sense of hearing.</description>
+                  <node>
+                     <name>Loudness</name>
+                     <description>Perceived intensity of a sound.</description>
+                     <node>
+                        <name>#</name>
+                        <attribute>
+                           <name>takesValue</name>
+                        </attribute>
+                        <attribute>
+                           <name>valueClass</name>
+                           <value>numericClass</value>
+                           <value>nameClass</value>
+                        </attribute>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Pitch</name>
+                     <description>A perceptual property that allows the user to order sounds on a frequency scale.</description>
+                     <node>
+                        <name>#</name>
+                        <attribute>
+                           <name>takesValue</name>
+                        </attribute>
+                        <attribute>
+                           <name>valueClass</name>
+                           <value>numericClass</value>
+                        </attribute>
+                        <attribute>
+                           <name>unitClass</name>
+                           <value>frequencyUnits</value>
+                        </attribute>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Sound-envelope</name>
+                     <description>Description of how a sound changes over time.</description>
+                     <node>
+                        <name>Sound-envelope-attack</name>
+                        <description>The time taken for initial run-up of level from nil to peak usually beginning when the key on a musical instrument is pressed.</description>
+                        <node>
+                           <name>#</name>
+                           <attribute>
+                              <name>takesValue</name>
+                           </attribute>
+                           <attribute>
+                              <name>valueClass</name>
+                              <value>numericClass</value>
+                           </attribute>
+                           <attribute>
+                              <name>unitClass</name>
+                              <value>timeUnits</value>
+                           </attribute>
+                        </node>
+                     </node>
+                     <node>
+                        <name>Sound-envelope-decay</name>
+                        <description>The time taken for the subsequent run down from the attack level to the designated sustain level.</description>
+                        <node>
+                           <name>#</name>
+                           <attribute>
+                              <name>takesValue</name>
+                           </attribute>
+                           <attribute>
+                              <name>valueClass</name>
+                              <value>numericClass</value>
+                           </attribute>
+                           <attribute>
+                              <name>unitClass</name>
+                              <value>timeUnits</value>
+                           </attribute>
+                        </node>
+                     </node>
+                     <node>
+                        <name>Sound-envelope-release</name>
+                        <description>The time taken for the level to decay from the sustain level to zero after the key is released.</description>
+                        <node>
+                           <name>#</name>
+                           <attribute>
+                              <name>takesValue</name>
+                           </attribute>
+                           <attribute>
+                              <name>valueClass</name>
+                              <value>numericClass</value>
+                           </attribute>
+                           <attribute>
+                              <name>unitClass</name>
+                              <value>timeUnits</value>
+                           </attribute>
+                        </node>
+                     </node>
+                     <node>
+                        <name>Sound-envelope-sustain</name>
+                        <description>The time taken for the main sequence of the sound duration, until the key is released.</description>
+                        <node>
+                           <name>#</name>
+                           <attribute>
+                              <name>takesValue</name>
+                           </attribute>
+                           <attribute>
+                              <name>valueClass</name>
+                              <value>numericClass</value>
+                           </attribute>
+                           <attribute>
+                              <name>unitClass</name>
+                              <value>timeUnits</value>
+                           </attribute>
+                        </node>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Timbre</name>
+                     <description>The perceived sound quality of a singing voice or musical instrument.</description>
+                     <node>
+                        <name>#</name>
+                        <attribute>
+                           <name>takesValue</name>
+                        </attribute>
+                        <attribute>
+                           <name>valueClass</name>
+                           <value>nameClass</value>
+                        </attribute>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Sound-volume</name>
+                     <description>The sound pressure level (SPL) usually the ratio to a reference signal estimated as the lower bound of hearing.</description>
+                     <node>
+                        <name>#</name>
+                        <attribute>
+                           <name>takesValue</name>
+                        </attribute>
+                        <attribute>
+                           <name>valueClass</name>
+                           <value>numericClass</value>
+                        </attribute>
+                        <attribute>
+                           <name>unitClass</name>
+                           <value>intensityUnits</value>
+                        </attribute>
+                     </node>
+                  </node>
+               </node>
+               <node>
+                  <name>Gustatory-attribute</name>
+                  <description>Pertaining to the sense of taste.</description>
+                  <node>
+                     <name>Bitter</name>
+                     <description>Having a sharp, pungent taste.</description>
+                  </node>
+                  <node>
+                     <name>Salty</name>
+                     <description>Tasting of or like salt.</description>
+                  </node>
+                  <node>
+                     <name>Savory</name>
+                     <description>Belonging to a taste that is salty or spicy rather than sweet.</description>
+                  </node>
+                  <node>
+                     <name>Sour</name>
+                     <description>Having a sharp, acidic taste.</description>
+                  </node>
+                  <node>
+                     <name>Sweet</name>
+                     <description>Having or resembling the taste of sugar.</description>
+                  </node>
+               </node>
+               <node>
+                  <name>Olfactory-attribute</name>
+                  <description>Having a smell.</description>
+               </node>
+               <node>
+                  <name>Somatic-attribute</name>
+                  <description>Pertaining to the feelings in the body or of the nervous system.</description>
+                  <node>
+                     <name>Pain</name>
+                     <description>The sensation of discomfort, distress, or agony, resulting from the stimulation of specialized nerve endings.</description>
+                  </node>
+                  <node>
+                     <name>Stress</name>
+                     <description>The negative mental, emotional, and physical reactions that occur when environmental stressors are perceived as exceeding the adaptive capacities of the individual.</description>
+                  </node>
+               </node>
+               <node>
+                  <name>Tactile-attribute</name>
+                  <description>Pertaining to the sense of touch.</description>
+                  <node>
+                     <name>Tactile-pressure</name>
+                     <description>Having a feeling of heaviness.</description>
+                  </node>
+                  <node>
+                     <name>Tactile-temperature</name>
+                     <description>Having a feeling of hotness or coldness.</description>
+                  </node>
+                  <node>
+                     <name>Tactile-texture</name>
+                     <description>Having a feeling of roughness.</description>
+                  </node>
+                  <node>
+                     <name>Tactile-vibration</name>
+                     <description>Having a feeling of mechanical oscillation.</description>
+                  </node>
+               </node>
+               <node>
+                  <name>Vestibular-attribute</name>
+                  <description>Pertaining to the sense of balance or body position.</description>
+               </node>
+               <node>
+                  <name>Visual-attribute</name>
+                  <description>Pertaining to the sense of sight.</description>
+                  <node>
+                     <name>Color</name>
+                     <description>The appearance of objects (or light sources) described in terms of perception of their hue and lightness (or brightness) and saturation.</description>
+                     <node>
+                        <name>CSS-color</name>
+                        <description>One of 140 colors supported by all browsers. For more details such as the color RGB or HEX values,  check:  https://www.w3schools.com/colors/colors_groups.asp.</description>
+                        <node>
+                           <name>Blue-color</name>
+                           <description>CSS color group.</description>
+                           <node>
+                              <name>CadetBlue</name>
+                              <description>CSS-color 0x5F9EA0.</description>
+                           </node>
+                           <node>
+                              <name>SteelBlue</name>
+                              <description>CSS-color 0x4682B4.</description>
+                           </node>
+                           <node>
+                              <name>LightSteelBlue</name>
+                              <description>CSS-color 0xB0C4DE.</description>
+                           </node>
+                           <node>
+                              <name>LightBlue</name>
+                              <description>CSS-color 0xADD8E6.</description>
+                           </node>
+                           <node>
+                              <name>PowderBlue</name>
+                              <description>CSS-color 0xB0E0E6.</description>
+                           </node>
+                           <node>
+                              <name>LightSkyBlue</name>
+                              <description>CSS-color 0x87CEFA.</description>
+                           </node>
+                           <node>
+                              <name>SkyBlue</name>
+                              <description>CSS-color 0x87CEEB.</description>
+                           </node>
+                           <node>
+                              <name>CornflowerBlue</name>
+                              <description>CSS-color 0x6495ED.</description>
+                           </node>
+                           <node>
+                              <name>DeepSkyBlue</name>
+                              <description>CSS-color 0x00BFFF.</description>
+                           </node>
+                           <node>
+                              <name>DodgerBlue</name>
+                              <description>CSS-color 0x1E90FF.</description>
+                           </node>
+                           <node>
+                              <name>RoyalBlue</name>
+                              <description>CSS-color 0x4169E1.</description>
+                           </node>
+                           <node>
+                              <name>Blue</name>
+                              <description>CSS-color 0x0000FF.</description>
+                           </node>
+                           <node>
+                              <name>MediumBlue</name>
+                              <description>CSS-color 0x0000CD.</description>
+                           </node>
+                           <node>
+                              <name>DarkBlue</name>
+                              <description>CSS-color 0x00008B.</description>
+                           </node>
+                           <node>
+                              <name>Navy</name>
+                              <description>CSS-color 0x000080.</description>
+                           </node>
+                           <node>
+                              <name>MidnightBlue</name>
+                              <description>CSS-color 0x191970.</description>
+                           </node>
+                        </node>
+                        <node>
+                           <name>Brown-color</name>
+                           <description>CSS color group.</description>
+                           <node>
+                              <name>Cornsilk</name>
+                              <description>CSS-color 0xFFF8DC.</description>
+                           </node>
+                           <node>
+                              <name>BlanchedAlmond</name>
+                              <description>CSS-color 0xFFEBCD.</description>
+                           </node>
+                           <node>
+                              <name>Bisque</name>
+                              <description>CSS-color 0xFFE4C4.</description>
+                           </node>
+                           <node>
+                              <name>NavajoWhite</name>
+                              <description>CSS-color 0xFFDEAD.</description>
+                           </node>
+                           <node>
+                              <name>Wheat</name>
+                              <description>CSS-color 0xF5DEB3.</description>
+                           </node>
+                           <node>
+                              <name>BurlyWood</name>
+                              <description>CSS-color 0xDEB887.</description>
+                           </node>
+                           <node>
+                              <name>Tan</name>
+                              <description>CSS-color 0xD2B48C.</description>
+                           </node>
+                           <node>
+                              <name>RosyBrown</name>
+                              <description>CSS-color 0xBC8F8F.</description>
+                           </node>
+                           <node>
+                              <name>SandyBrown</name>
+                              <description>CSS-color 0xF4A460.</description>
+                           </node>
+                           <node>
+                              <name>GoldenRod</name>
+                              <description>CSS-color 0xDAA520.</description>
+                           </node>
+                           <node>
+                              <name>DarkGoldenRod</name>
+                              <description>CSS-color 0xB8860B.</description>
+                           </node>
+                           <node>
+                              <name>Peru</name>
+                              <description>CSS-color 0xCD853F.</description>
+                           </node>
+                           <node>
+                              <name>Chocolate</name>
+                              <description>CSS-color 0xD2691E.</description>
+                           </node>
+                           <node>
+                              <name>Olive</name>
+                              <description>CSS-color 0x808000.</description>
+                           </node>
+                           <node>
+                              <name>SaddleBrown</name>
+                              <description>CSS-color 0x8B4513.</description>
+                           </node>
+                           <node>
+                              <name>Sienna</name>
+                              <description>CSS-color 0xA0522D.</description>
+                           </node>
+                           <node>
+                              <name>Brown</name>
+                              <description>CSS-color 0xA52A2A.</description>
+                           </node>
+                           <node>
+                              <name>Maroon</name>
+                              <description>CSS-color 0x800000.</description>
+                           </node>
+                        </node>
+                        <node>
+                           <name>Cyan-color</name>
+                           <description>CSS color group.</description>
+                           <node>
+                              <name>Aqua</name>
+                              <description>CSS-color 0x00FFFF.</description>
+                           </node>
+                           <node>
+                              <name>Cyan</name>
+                              <description>CSS-color 0x00FFFF.</description>
+                           </node>
+                           <node>
+                              <name>LightCyan</name>
+                              <description>CSS-color 0xE0FFFF.</description>
+                           </node>
+                           <node>
+                              <name>PaleTurquoise</name>
+                              <description>CSS-color 0xAFEEEE.</description>
+                           </node>
+                           <node>
+                              <name>Aquamarine</name>
+                              <description>CSS-color 0x7FFFD4.</description>
+                           </node>
+                           <node>
+                              <name>Turquoise</name>
+                              <description>CSS-color 0x40E0D0.</description>
+                           </node>
+                           <node>
+                              <name>MediumTurquoise</name>
+                              <description>CSS-color 0x48D1CC.</description>
+                           </node>
+                           <node>
+                              <name>DarkTurquoise</name>
+                              <description>CSS-color 0x00CED1.</description>
+                           </node>
+                        </node>
+                        <node>
+                           <name>Green-color</name>
+                           <description>CSS color group.</description>
+                           <node>
+                              <name>GreenYellow</name>
+                              <description>CSS-color 0xADFF2F.</description>
+                           </node>
+                           <node>
+                              <name>Chartreuse</name>
+                              <description>CSS-color 0x7FFF00.</description>
+                           </node>
+                           <node>
+                              <name>LawnGreen</name>
+                              <description>CSS-color 0x7CFC00.</description>
+                           </node>
+                           <node>
+                              <name>Lime</name>
+                              <description>CSS-color 0x00FF00.</description>
+                           </node>
+                           <node>
+                              <name>LimeGreen</name>
+                              <description>CSS-color 0x32CD32.</description>
+                           </node>
+                           <node>
+                              <name>PaleGreen</name>
+                              <description>CSS-color 0x98FB98.</description>
+                           </node>
+                           <node>
+                              <name>LightGreen</name>
+                              <description>CSS-color 0x90EE90.</description>
+                           </node>
+                           <node>
+                              <name>MediumSpringGreen</name>
+                              <description>CSS-color 0x00FA9A.</description>
+                           </node>
+                           <node>
+                              <name>SpringGreen</name>
+                              <description>CSS-color 0x00FF7F.</description>
+                           </node>
+                           <node>
+                              <name>MediumSeaGreen</name>
+                              <description>CSS-color 0x3CB371.</description>
+                           </node>
+                           <node>
+                              <name>SeaGreen</name>
+                              <description>CSS-color 0x2E8B57.</description>
+                           </node>
+                           <node>
+                              <name>ForestGreen</name>
+                              <description>CSS-color 0x228B22.</description>
+                           </node>
+                           <node>
+                              <name>Green</name>
+                              <description>CSS-color 0x008000.</description>
+                           </node>
+                           <node>
+                              <name>DarkGreen</name>
+                              <description>CSS-color 0x006400.</description>
+                           </node>
+                           <node>
+                              <name>YellowGreen</name>
+                              <description>CSS-color 0x9ACD32.</description>
+                           </node>
+                           <node>
+                              <name>OliveDrab</name>
+                              <description>CSS-color 0x6B8E23.</description>
+                           </node>
+                           <node>
+                              <name>DarkOliveGreen</name>
+                              <description>CSS-color 0x556B2F.</description>
+                           </node>
+                           <node>
+                              <name>MediumAquaMarine</name>
+                              <description>CSS-color 0x66CDAA.</description>
+                           </node>
+                           <node>
+                              <name>DarkSeaGreen</name>
+                              <description>CSS-color 0x8FBC8F.</description>
+                           </node>
+                           <node>
+                              <name>LightSeaGreen</name>
+                              <description>CSS-color 0x20B2AA.</description>
+                           </node>
+                           <node>
+                              <name>DarkCyan</name>
+                              <description>CSS-color 0x008B8B.</description>
+                           </node>
+                           <node>
+                              <name>Teal</name>
+                              <description>CSS-color 0x008080.</description>
+                           </node>
+                        </node>
+                        <node>
+                           <name>Gray-color</name>
+                           <description>CSS color group.</description>
+                           <node>
+                              <name>Gainsboro</name>
+                              <description>CSS-color 0xDCDCDC.</description>
+                           </node>
+                           <node>
+                              <name>LightGray</name>
+                              <description>CSS-color 0xD3D3D3.</description>
+                           </node>
+                           <node>
+                              <name>Silver</name>
+                              <description>CSS-color 0xC0C0C0.</description>
+                           </node>
+                           <node>
+                              <name>DarkGray</name>
+                              <description>CSS-color 0xA9A9A9.</description>
+                           </node>
+                           <node>
+                              <name>DimGray</name>
+                              <description>CSS-color 0x696969.</description>
+                           </node>
+                           <node>
+                              <name>Gray</name>
+                              <description>CSS-color 0x808080.</description>
+                           </node>
+                           <node>
+                              <name>LightSlateGray</name>
+                              <description>CSS-color 0x778899.</description>
+                           </node>
+                           <node>
+                              <name>SlateGray</name>
+                              <description>CSS-color 0x708090.</description>
+                           </node>
+                           <node>
+                              <name>DarkSlateGray</name>
+                              <description>CSS-color 0x2F4F4F.</description>
+                           </node>
+                           <node>
+                              <name>Black</name>
+                              <description>CSS-color 0x000000.</description>
+                           </node>
+                        </node>
+                        <node>
+                           <name>Orange-color</name>
+                           <description>CSS color group.</description>
+                           <node>
+                              <name>Orange</name>
+                              <description>CSS-color 0xFFA500.</description>
+                           </node>
+                           <node>
+                              <name>DarkOrange</name>
+                              <description>CSS-color 0xFF8C00.</description>
+                           </node>
+                           <node>
+                              <name>Coral</name>
+                              <description>CSS-color 0xFF7F50.</description>
+                           </node>
+                           <node>
+                              <name>Tomato</name>
+                              <description>CSS-color 0xFF6347.</description>
+                           </node>
+                           <node>
+                              <name>OrangeRed</name>
+                              <description>CSS-color 0xFF4500.</description>
+                           </node>
+                        </node>
+                        <node>
+                           <name>Pink-color</name>
+                           <description>CSS color group.</description>
+                           <node>
+                              <name>Pink</name>
+                              <description>CSS-color 0xFFC0CB.</description>
+                           </node>
+                           <node>
+                              <name>LightPink</name>
+                              <description>CSS-color 0xFFB6C1.</description>
+                           </node>
+                           <node>
+                              <name>HotPink</name>
+                              <description>CSS-color 0xFF69B4.</description>
+                           </node>
+                           <node>
+                              <name>DeepPink</name>
+                              <description>CSS-color 0xFF1493.</description>
+                           </node>
+                           <node>
+                              <name>PaleVioletRed</name>
+                              <description>CSS-color 0xDB7093.</description>
+                           </node>
+                           <node>
+                              <name>MediumVioletRed</name>
+                              <description>CSS-color 0xC71585.</description>
+                           </node>
+                        </node>
+                        <node>
+                           <name>Purple-color</name>
+                           <description>CSS color group.</description>
+                           <node>
+                              <name>Lavender</name>
+                              <description>CSS-color 0xE6E6FA.</description>
+                           </node>
+                           <node>
+                              <name>Thistle</name>
+                              <description>CSS-color 0xD8BFD8.</description>
+                           </node>
+                           <node>
+                              <name>Plum</name>
+                              <description>CSS-color 0xDDA0DD.</description>
+                           </node>
+                           <node>
+                              <name>Orchid</name>
+                              <description>CSS-color 0xDA70D6.</description>
+                           </node>
+                           <node>
+                              <name>Violet</name>
+                              <description>CSS-color 0xEE82EE.</description>
+                           </node>
+                           <node>
+                              <name>Fuchsia</name>
+                              <description>CSS-color 0xFF00FF.</description>
+                           </node>
+                           <node>
+                              <name>Magenta</name>
+                              <description>CSS-color 0xFF00FF.</description>
+                           </node>
+                           <node>
+                              <name>MediumOrchid</name>
+                              <description>CSS-color 0xBA55D3.</description>
+                           </node>
+                           <node>
+                              <name>DarkOrchid</name>
+                              <description>CSS-color 0x9932CC.</description>
+                           </node>
+                           <node>
+                              <name>DarkViolet</name>
+                              <description>CSS-color 0x9400D3.</description>
+                           </node>
+                           <node>
+                              <name>BlueViolet</name>
+                              <description>CSS-color 0x8A2BE2.</description>
+                           </node>
+                           <node>
+                              <name>DarkMagenta</name>
+                              <description>CSS-color 0x8B008B.</description>
+                           </node>
+                           <node>
+                              <name>Purple</name>
+                              <description>CSS-color 0x800080.</description>
+                           </node>
+                           <node>
+                              <name>MediumPurple</name>
+                              <description>CSS-color 0x9370DB.</description>
+                           </node>
+                           <node>
+                              <name>MediumSlateBlue</name>
+                              <description>CSS-color 0x7B68EE.</description>
+                           </node>
+                           <node>
+                              <name>SlateBlue</name>
+                              <description>CSS-color 0x6A5ACD.</description>
+                           </node>
+                           <node>
+                              <name>DarkSlateBlue</name>
+                              <description>CSS-color 0x483D8B.</description>
+                           </node>
+                           <node>
+                              <name>RebeccaPurple</name>
+                              <description>CSS-color 0x663399.</description>
+                           </node>
+                           <node>
+                              <name>Indigo</name>
+                              <description>CSS-color 0x4B0082.</description>
+                           </node>
+                        </node>
+                        <node>
+                           <name>Red-color</name>
+                           <description>CSS color group.</description>
+                           <node>
+                              <name>LightSalmon</name>
+                              <description>CSS-color 0xFFA07A.</description>
+                           </node>
+                           <node>
+                              <name>Salmon</name>
+                              <description>CSS-color 0xFA8072.</description>
+                           </node>
+                           <node>
+                              <name>DarkSalmon</name>
+                              <description>CSS-color 0xE9967A.</description>
+                           </node>
+                           <node>
+                              <name>LightCoral</name>
+                              <description>CSS-color 0xF08080.</description>
+                           </node>
+                           <node>
+                              <name>IndianRed</name>
+                              <description>CSS-color 0xCD5C5C.</description>
+                           </node>
+                           <node>
+                              <name>Crimson</name>
+                              <description>CSS-color 0xDC143C.</description>
+                           </node>
+                           <node>
+                              <name>Red</name>
+                              <description>CSS-color 0xFF0000.</description>
+                           </node>
+                           <node>
+                              <name>FireBrick</name>
+                              <description>CSS-color 0xB22222.</description>
+                           </node>
+                           <node>
+                              <name>DarkRed</name>
+                              <description>CSS-color 0x8B0000.</description>
+                           </node>
+                        </node>
+                        <node>
+                           <name>Yellow-color</name>
+                           <description>CSS color group.</description>
+                           <node>
+                              <name>Gold</name>
+                              <description>CSS-color 0xFFD700.</description>
+                           </node>
+                           <node>
+                              <name>Yellow</name>
+                              <description>CSS-color 0xFFFF00.</description>
+                           </node>
+                           <node>
+                              <name>LightYellow</name>
+                              <description>CSS-color 0xFFFFE0.</description>
+                           </node>
+                           <node>
+                              <name>LemonChiffon</name>
+                              <description>CSS-color 0xFFFACD.</description>
+                           </node>
+                           <node>
+                              <name>LightGoldenRodYellow</name>
+                              <description>CSS-color 0xFAFAD2.</description>
+                           </node>
+                           <node>
+                              <name>PapayaWhip</name>
+                              <description>CSS-color 0xFFEFD5.</description>
+                           </node>
+                           <node>
+                              <name>Moccasin</name>
+                              <description>CSS-color 0xFFE4B5.</description>
+                           </node>
+                           <node>
+                              <name>PeachPuff</name>
+                              <description>CSS-color 0xFFDAB9.</description>
+                           </node>
+                           <node>
+                              <name>PaleGoldenRod</name>
+                              <description>CSS-color 0xEEE8AA.</description>
+                           </node>
+                           <node>
+                              <name>Khaki</name>
+                              <description>CSS-color 0xF0E68C.</description>
+                           </node>
+                           <node>
+                              <name>DarkKhaki</name>
+                              <description>CSS-color 0xBDB76B.</description>
+                           </node>
+                        </node>
+                        <node>
+                           <name>White-color</name>
+                           <description>CSS color group.</description>
+                           <node>
+                              <name>White</name>
+                              <description>CSS-color 0xFFFFFF.</description>
+                           </node>
+                           <node>
+                              <name>Snow</name>
+                              <description>CSS-color 0xFFFAFA.</description>
+                           </node>
+                           <node>
+                              <name>HoneyDew</name>
+                              <description>CSS-color 0xF0FFF0.</description>
+                           </node>
+                           <node>
+                              <name>MintCream</name>
+                              <description>CSS-color 0xF5FFFA.</description>
+                           </node>
+                           <node>
+                              <name>Azure</name>
+                              <description>CSS-color 0xF0FFFF.</description>
+                           </node>
+                           <node>
+                              <name>AliceBlue</name>
+                              <description>CSS-color 0xF0F8FF.</description>
+                           </node>
+                           <node>
+                              <name>GhostWhite</name>
+                              <description>CSS-color 0xF8F8FF.</description>
+                           </node>
+                           <node>
+                              <name>WhiteSmoke</name>
+                              <description>CSS-color 0xF5F5F5.</description>
+                           </node>
+                           <node>
+                              <name>SeaShell</name>
+                              <description>CSS-color 0xFFF5EE.</description>
+                           </node>
+                           <node>
+                              <name>Beige</name>
+                              <description>CSS-color 0xF5F5DC.</description>
+                           </node>
+                           <node>
+                              <name>OldLace</name>
+                              <description>CSS-color 0xFDF5E6.</description>
+                           </node>
+                           <node>
+                              <name>FloralWhite</name>
+                              <description>CSS-color 0xFFFAF0.</description>
+                           </node>
+                           <node>
+                              <name>Ivory</name>
+                              <description>CSS-color 0xFFFFF0.</description>
+                           </node>
+                           <node>
+                              <name>AntiqueWhite</name>
+                              <description>CSS-color 0xFAEBD7.</description>
+                           </node>
+                           <node>
+                              <name>Linen</name>
+                              <description>CSS-color 0xFAF0E6.</description>
+                           </node>
+                           <node>
+                              <name>LavenderBlush</name>
+                              <description>CSS-color 0xFFF0F5.</description>
+                           </node>
+                           <node>
+                              <name>MistyRose</name>
+                              <description>CSS-color 0xFFE4E1.</description>
+                           </node>
+                        </node>
+                     </node>
+                     <node>
+                        <name>Color-shade</name>
+                        <description>A slight degree of difference between colors, especially with regard to how light or dark it is or as distinguished from one nearly like it.</description>
+                        <node>
+                           <name>Dark-shade</name>
+                           <description>A color tone not reflecting much light.</description>
+                        </node>
+                        <node>
+                           <name>Light-shade</name>
+                           <description>A color tone reflecting more light.</description>
+                        </node>
+                     </node>
+                     <node>
+                        <name>Grayscale</name>
+                        <description>Using a color map composed of shades of gray, varying from black at the weakest intensity to white at the strongest.</description>
+                        <node>
+                           <name>#</name>
+                           <description>White intensity between 0 and 1.</description>
+                           <attribute>
+                              <name>takesValue</name>
+                           </attribute>
+                           <attribute>
+                              <name>valueClass</name>
+                              <value>numericClass</value>
+                           </attribute>
+                        </node>
+                     </node>
+                     <node>
+                        <name>HSV-color</name>
+                        <description>A color representation that models how colors appear under light.</description>
+                        <node>
+                           <name>Hue</name>
+                           <description>Attribute of a visual sensation according to which an area appears to be similar to one of the perceived colors.</description>
+                           <node>
+                              <name>#</name>
+                              <description>Angular value between 0 and 360.</description>
+                              <attribute>
+                                 <name>takesValue</name>
+                              </attribute>
+                              <attribute>
+                                 <name>valueClass</name>
+                                 <value>numericClass</value>
+                              </attribute>
+                           </node>
+                        </node>
+                        <node>
+                           <name>Saturation</name>
+                           <description>Colorfulness of a stimulus relative to its own brightness.</description>
+                           <node>
+                              <name>#</name>
+                              <description>B value of RGB between 0 and 1.</description>
+                              <attribute>
+                                 <name>takesValue</name>
+                              </attribute>
+                              <attribute>
+                                 <name>valueClass</name>
+                                 <value>numericClass</value>
+                              </attribute>
+                           </node>
+                        </node>
+                        <node>
+                           <name>HSV-value</name>
+                           <description>An attribute of a visual sensation according to which an area appears to emit more or less light.</description>
+                           <node>
+                              <name>#</name>
+                              <attribute>
+                                 <name>takesValue</name>
+                              </attribute>
+                              <attribute>
+                                 <name>valueClass</name>
+                                 <value>numericClass</value>
+                              </attribute>
+                           </node>
+                        </node>
+                     </node>
+                     <node>
+                        <name>RGB-color</name>
+                        <description>A color from the RGB schema.</description>
+                        <node>
+                           <name>RGB-red</name>
+                           <description>The red component.</description>
+                           <node>
+                              <name>#</name>
+                              <description>R value of RGB between 0 and 1.</description>
+                              <attribute>
+                                 <name>takesValue</name>
+                              </attribute>
+                              <attribute>
+                                 <name>valueClass</name>
+                                 <value>numericClass</value>
+                              </attribute>
+                           </node>
+                        </node>
+                        <node>
+                           <name>RGB-blue</name>
+                           <description>The blue component.</description>
+                           <node>
+                              <name>#</name>
+                              <description>B value of RGB between 0 and 1.</description>
+                              <attribute>
+                                 <name>takesValue</name>
+                              </attribute>
+                              <attribute>
+                                 <name>valueClass</name>
+                                 <value>numericClass</value>
+                              </attribute>
+                           </node>
+                        </node>
+                        <node>
+                           <name>RGB-green</name>
+                           <description>The green component.</description>
+                           <node>
+                              <name>#</name>
+                              <description>G value of RGB between 0 and 1.</description>
+                              <attribute>
+                                 <name>takesValue</name>
+                              </attribute>
+                              <attribute>
+                                 <name>valueClass</name>
+                                 <value>numericClass</value>
+                              </attribute>
+                           </node>
+                        </node>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Luminance</name>
+                     <description>A quality that exists by virtue of the luminous intensity per unit area projected in a given direction.</description>
+                  </node>
+                  <node>
+                     <name>Opacity</name>
+                     <description>A measure of impenetrability to light.</description>
+                  </node>
+               </node>
+            </node>
+            <node>
+               <name>Sensory-presentation</name>
+               <description>The entity has a sensory manifestation.</description>
+               <node>
+                  <name>Auditory-presentation</name>
+                  <description>The sense of hearing is used in the presentation to the user.</description>
+                  <node>
+                     <name>Loudspeaker-separation</name>
+                     <description>The distance between two loudspeakers. Grouped with the Distance tag.</description>
+                     <attribute>
+                        <name>suggestedTag</name>
+                        <value>Distance</value>
+                     </attribute>
+                  </node>
+                  <node>
+                     <name>Monophonic</name>
+                     <description>Relating to sound transmission, recording, or reproduction involving a single transmission path.</description>
+                  </node>
+                  <node>
+                     <name>Silent</name>
+                     <description>The absence of ambient audible sound or the state of having ceased to produce sounds.</description>
+                  </node>
+                  <node>
+                     <name>Stereophonic</name>
+                     <description>Relating to, or constituting sound reproduction involving the use of separated microphones and two transmission channels to achieve the sound separation of a live hearing.</description>
+                  </node>
+               </node>
+               <node>
+                  <name>Gustatory-presentation</name>
+                  <description>The sense of taste used in the presentation to the user.</description>
+               </node>
+               <node>
+                  <name>Olfactory-presentation</name>
+                  <description>The sense of smell used in the presentation to the user.</description>
+               </node>
+               <node>
+                  <name>Somatic-presentation</name>
+                  <description>The nervous system is used in the presentation to the user.</description>
+               </node>
+               <node>
+                  <name>Tactile-presentation</name>
+                  <description>The sense of touch used in the presentation to the user.</description>
+               </node>
+               <node>
+                  <name>Vestibular-presentation</name>
+                  <description>The sense balance used in the presentation to the user.</description>
+               </node>
+               <node>
+                  <name>Visual-presentation</name>
+                  <description>The sense of sight used in the presentation to the user.</description>
+                  <node>
+                     <name>2D-view</name>
+                     <description>A view showing only two dimensions.</description>
+                  </node>
+                  <node>
+                     <name>3D-view</name>
+                     <description>A view showing three dimensions.</description>
+                  </node>
+                  <node>
+                     <name>Background-view</name>
+                     <description>Parts of the view that are farthest from the viewer and usually the not part of the visual focus.</description>
+                  </node>
+                  <node>
+                     <name>Bistable-view</name>
+                     <description>Something having two stable visual forms that have two distinguishable stable forms as in optical illusions.</description>
+                  </node>
+                  <node>
+                     <name>Foreground-view</name>
+                     <description>Parts of the view that are closest to the viewer and usually the most important part of the visual focus.</description>
+                  </node>
+                  <node>
+                     <name>Foveal-view</name>
+                     <description>Visual presentation directly on the fovea. A view projected on the small depression in the retina containing only cones and where vision is most acute.</description>
+                  </node>
+                  <node>
+                     <name>Map-view</name>
+                     <description>A diagrammatic representation of an area of land or sea showing physical features, cities, roads.</description>
+                     <node>
+                        <name>Aerial-view</name>
+                        <description>Elevated view of an object from above, with a perspective as though the observer were a bird.</description>
+                     </node>
+                     <node>
+                        <name>Satellite-view</name>
+                        <description>A representation as captured by technology such as a satellite.</description>
+                     </node>
+                     <node>
+                        <name>Street-view</name>
+                        <description>A 360-degrees panoramic view from a position on the ground.</description>
+                     </node>
+                  </node>
+                  <node>
+                     <name>Peripheral-view</name>
+                     <description>Indirect vision as it occurs outside the point of fixation.</description>
+                  </node>
+               </node>
+            </node>
+         </node>
+         <node>
+            <name>Task-property</name>
+            <description>Something that pertains to a task.</description>
+            <attribute>
+               <name>extensionAllowed</name>
+            </attribute>
+            <node>
+               <name>Task-attentional-demand</name>
+               <description>Strategy for allocating attention toward goal-relevant information.</description>
+               <node>
+                  <name>Bottom-up-attention</name>
+                  <description>Attentional guidance purely by externally driven factors to stimuli that are salient because of their inherent properties relative to the background. Sometimes this is referred to as stimulus driven.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Top-down-attention</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Covert-attention</name>
+                  <description>Paying attention without moving the eyes.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Overt-attention</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Divided-attention</name>
+                  <description>Integrating parallel multiple stimuli. Behavior involving responding simultaneously to multiple tasks or multiple task demands.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Focused-attention</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Focused-attention</name>
+                  <description>Responding discretely to specific visual, auditory, or tactile stimuli.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Divided-attention</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Orienting-attention</name>
+                  <description>Directing attention to a target stimulus.</description>
+               </node>
+               <node>
+                  <name>Overt-attention</name>
+                  <description>Selectively processing one location over others by moving the eyes to point at that location.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Covert-attention</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Selective-attention</name>
+                  <description>Maintaining a behavioral or cognitive set in the face of distracting or competing stimuli. Ability to pay attention to a limited array of all available sensory information.</description>
+               </node>
+               <node>
+                  <name>Sustained-attention</name>
+                  <description>Maintaining a consistent behavioral response during continuous and repetitive activity.</description>
+               </node>
+               <node>
+                  <name>Switched-attention</name>
+                  <description>Having to switch attention between two or more modalities of presentation.</description>
+               </node>
+               <node>
+                  <name>Top-down-attention</name>
+                  <description>Voluntary allocation of attention to certain features. Sometimes this is referred to goal-oriented attention.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Bottom-up-attention</value>
+                  </attribute>
+               </node>
+            </node>
+            <node>
+               <name>Task-effect-evidence</name>
+               <description>The evidence supporting the conclusion that the event had the specified effect.</description>
+               <node>
+                  <name>Computational-evidence</name>
+                  <description>A type of evidence in which data are produced, and/or generated, and/or analyzed on a computer.</description>
+               </node>
+               <node>
+                  <name>External-evidence</name>
+                  <description>A phenomenon that follows and is caused by some previous phenomenon.</description>
+               </node>
+               <node>
+                  <name>Intended-effect</name>
+                  <description>A phenomenon that is intended to follow and be caused by some previous phenomenon.</description>
+               </node>
+               <node>
+                  <name>Behavioral-evidence</name>
+                  <description>An indication or conclusion based on the behavior of an agent.</description>
+               </node>
+            </node>
+            <node>
+               <name>Task-event-role</name>
+               <description>The purpose of an event with respect to the task.</description>
+               <node>
+                  <name>Experimental-stimulus</name>
+                  <description>Part of something designed to elicit a response in the experiment.</description>
+               </node>
+               <node>
+                  <name>Incidental</name>
+                  <description>A sensory or other type of event that is unrelated to the task or experiment.</description>
+               </node>
+               <node>
+                  <name>Instructional</name>
+                  <description>Usually associated with a sensory event intended to give instructions to the participant about the task or behavior.</description>
+               </node>
+               <node>
+                  <name>Mishap</name>
+                  <description>Unplanned disruption such as an equipment or experiment control abnormality or experimenter error.</description>
+               </node>
+               <node>
+                  <name>Participant-response</name>
+                  <description>Something related to a participant actions in performing the task.</description>
+               </node>
+               <node>
+                  <name>Task-activity</name>
+                  <description>Something that is part of the overall task or is necessary to the overall experiment but is not directly part of a stimulus-response cycle. Examples would be taking a survey or provided providing a silva sample.</description>
+               </node>
+               <node>
+                  <name>Warning</name>
+                  <description>Something that should warn the participant that the parameters of the task have been or are about to be exceeded such as a warning message about getting too close to the shoulder of the road in a driving task.</description>
+               </node>
+            </node>
+            <node>
+               <name>Task-action-type</name>
+               <description>How an agent action should be interpreted in terms of the task specification.</description>
+               <node>
+                  <name>Appropriate-action</name>
+                  <description>An action suitable or proper in the circumstances.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Inappropriate-action</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Correct-action</name>
+                  <description>An action that was a correct response in the context of the task.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Incorrect-action</value>
+                     <value>Indeterminate-action</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Correction</name>
+                  <description>An action offering an improvement to replace a mistake or error.</description>
+               </node>
+               <node>
+                  <name>Done-indication</name>
+                  <description>An action that indicates that the participant has completed this step in the task.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Ready-indication</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Incorrect-action</name>
+                  <description>An action considered wrong or incorrect in the context of the task.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Correct-action</value>
+                     <value>Indeterminate-action</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Imagined-action</name>
+                  <description>Form a mental image or concept of something. This is used to identity something that only happened in the imagination of the participant as in imagined movements in motor imagery paradigms.</description>
+               </node>
+               <node>
+                  <name>Inappropriate-action</name>
+                  <description>An action not in keeping with what is correct or proper for the task.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Appropriate-action</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Indeterminate-action</name>
+                  <description>An action that cannot be distinguished between two or more possibibities in the current context. This tag might be applied when an outside evaluator or a classification algorithm cannot determine a definitive result.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Correct-action</value>
+                     <value>Incorrect-action</value>
+                     <value>Miss</value>
+                     <value>Near-miss</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Omitted-action</name>
+                  <description>An expected response was skipped.</description>
+               </node>
+               <node>
+                  <name>Miss</name>
+                  <description>An action considered to be a failure in the context of the task. For example, if the agent is supposed to try to hit a target and misses.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Near-miss</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Near-miss</name>
+                  <description>An action barely satisfied the requirements of the task. In a driving experiment for example this could pertain to a narrowly avoided collision or other accident.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Miss</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Ready-indication</name>
+                  <description>An action that indicates that the participant is ready to perform the next step in the task.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Done-indication</value>
+                  </attribute>
+               </node>
+            </node>
+            <node>
+               <name>Task-relationship</name>
+               <description>Specifying organizational importance of sub-tasks.</description>
+               <node>
+                  <name>Background-subtask</name>
+                  <description>A part of the task which should be performed in the background as for example inhibiting blinks due to instruction while performing the primary task.</description>
+               </node>
+               <node>
+                  <name>Primary-subtask</name>
+                  <description>A part of the task which should be the primary focus of the participant.</description>
+               </node>
+            </node>
+            <node>
+               <name>Task-stimulus-role</name>
+               <description>The role the stimulus plays in the task.</description>
+               <node>
+                  <name>Cue</name>
+                  <description>A signal for an action, a pattern of stimuli indicating a particular response.</description>
+               </node>
+               <node>
+                  <name>Distractor</name>
+                  <description>A person or thing that distracts or a plausible but incorrect option in a multiple-choice question. In pyschological studies this is sometimes referred to as a foil.</description>
+               </node>
+               <node>
+                  <name>Expected</name>
+                  <description>Considered likely, probable or anticipated. Something of low information value as in frequent non-targets in an RSVP paradigm.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Unexpected</value>
+                  </attribute>
+                  <attribute>
+                     <name>suggestedTag</name>
+                     <value>Target</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Extraneous</name>
+                  <description>Irrelevant or unrelated to the subject being dealt with.</description>
+               </node>
+               <node>
+                  <name>Feedback</name>
+                  <description>An evaluative response to an inquiry, process, event, or activity.</description>
+               </node>
+               <node>
+                  <name>Go-signal</name>
+                  <description>An indicator to proceed with a planned action.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Stop-signal</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Meaningful</name>
+                  <description>Conveying significant or relevant information.</description>
+               </node>
+               <node>
+                  <name>Newly-learned</name>
+                  <description>Representing recently acquired information or understanding.</description>
+               </node>
+               <node>
+                  <name>Non-informative</name>
+                  <description>Something that is not useful in forming an opinion or judging an outcome.</description>
+               </node>
+               <node>
+                  <name>Non-target</name>
+                  <description>Something other than that done or looked for. Also tag Expected if the Non-target is frequent.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Target</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Not-meaningful</name>
+                  <description>Not having a serious, important, or useful quality or purpose.</description>
+               </node>
+               <node>
+                  <name>Novel</name>
+                  <description>Having no previous example or precedent or parallel.</description>
+               </node>
+               <node>
+                  <name>Oddball</name>
+                  <description>Something unusual, or infrequent.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Unexpected</value>
+                  </attribute>
+                  <attribute>
+                     <name>suggestedTag</name>
+                     <value>Target</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Planned</name>
+                  <description>Something that was decided on or arranged in advance.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Unplanned</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Penalty</name>
+                  <description>A disadvantage, loss, or hardship due to some action.</description>
+               </node>
+               <node>
+                  <name>Priming</name>
+                  <description>An implicit memory effect in which exposure to a stimulus influences response to a later stimulus.</description>
+               </node>
+               <node>
+                  <name>Query</name>
+                  <description>A sentence of inquiry that asks for a reply.</description>
+               </node>
+               <node>
+                  <name>Reward</name>
+                  <description>A positive reinforcement for a desired action, behavior or response.</description>
+               </node>
+               <node>
+                  <name>Stop-signal</name>
+                  <description>An indicator that the agent should stop the current activity.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Go-signal</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Target</name>
+                  <description>Something fixed as a goal, destination, or point of examination.</description>
+               </node>
+               <node>
+                  <name>Threat</name>
+                  <description>An indicator that signifies hostility and predicts an increased probability of attack.</description>
+               </node>
+               <node>
+                  <name>Timed</name>
+                  <description>Something planned or scheduled to be done at a particular time or lasting for a specified amount of time.</description>
+               </node>
+               <node>
+                  <name>Unexpected</name>
+                  <description>Something that is not anticipated.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Expected</value>
+                  </attribute>
+               </node>
+               <node>
+                  <name>Unplanned</name>
+                  <description>Something that has not been planned as part of the task.</description>
+                  <attribute>
+                     <name>relatedTag</name>
+                     <value>Planned</value>
+                  </attribute>
+               </node>
+            </node>
+         </node>
+      </node>
+      <node>
+         <name>Relation</name>
+         <description>Concerns the way in which two or more people or things are connected.</description>
+         <attribute>
+            <name>extensionAllowed</name>
+         </attribute>
+         <node>
+            <name>Comparative-relation</name>
+            <description>Something considered in comparison to something else. The first argument is the focus.</description>
+            <node>
+               <name>Approximately-equal-to</name>
+               <description>(A, (Approximately-equal-to, B)) indicates that A and B have almost the same value. Here A and B could refer to sizes, orders, positions or other quantities.</description>
+            </node>
+            <node>
+               <name>Less-than</name>
+               <description>(A, (Less-than, B)) indicates that A is smaller than B. Here A and B could refer to sizes, orders, positions or other quantities.</description>
+            </node>
+            <node>
+               <name>Less-than-or-equal-to</name>
+               <description>(A, (Less-than-or-equal-to, B)) indicates that the relative size or order of A is smaller than or equal to B.</description>
+            </node>
+            <node>
+               <name>Greater-than</name>
+               <description>(A, (Greater-than, B)) indicates that the relative size or order of A is bigger than that of B.</description>
+            </node>
+            <node>
+               <name>Greater-than-or-equal-to</name>
+               <description>(A, (Greater-than-or-equal-to, B)) indicates that the relative size or order of A is bigger than or the same as that of B.</description>
+            </node>
+            <node>
+               <name>Equal-to</name>
+               <description>(A, (Equal-to, B)) indicates that the size or order of A is the same as that of B.</description>
+            </node>
+            <node>
+               <name>Not-equal-to</name>
+               <description>(A, (Not-equal-to, B)) indicates that the size or order of A is not the same as that of B.</description>
+            </node>
+         </node>
+         <node>
+            <name>Connective-relation</name>
+            <description>Indicates two items are related in some way.</description>
+            <node>
+               <name>Belongs-to</name>
+               <description>(A, (Belongs-to, B)) indicates that A is a member of B.</description>
+            </node>
+            <node>
+               <name>Connected-to</name>
+               <description>(A, (Connected-to, B)) indicates that A is related to B in some respect, usually through a direct link.</description>
+            </node>
+            <node>
+               <name>Contained-in</name>
+               <description>(A, (Contained-in, B)) indicates that A is completely inside of B.</description>
+            </node>
+            <node>
+               <name>Described-by</name>
+               <description>(A, (Described-by, B)) indicates that B provides information about A.</description>
+            </node>
+            <node>
+               <name>From-to</name>
+               <description>(A, (From-to, B)) indicates a directional relation from A to B. A is considered the source.</description>
+            </node>
+            <node>
+               <name>Group-of</name>
+               <description>(A, (Group-of, B)) indicates A is a group of items of type B.</description>
+            </node>
+            <node>
+               <name>Implied-by</name>
+               <description>(A, (Implied-by, B)) indicates B is suggested by A.</description>
+            </node>
+            <node>
+               <name>Includes</name>
+               <description>(A, (Includes, B)) indicates that A has B as a member or part.</description>
+            </node>
+            <node>
+               <name>Interacts-with</name>
+               <description>(A, (Interacts-with, B)) indicates A and B interact, possibly reciprocally.</description>
+            </node>
+            <node>
+               <name>Member-of</name>
+               <description>(A, (Member-of, B)) indicates A is a member of group B.</description>
+            </node>
+            <node>
+               <name>Part-of</name>
+               <description>(A, (Part-of, B)) indicates A is a part of the whole B.</description>
+            </node>
+            <node>
+               <name>Performed-by</name>
+               <description>(A, (Performed-by, B)) indicates that the action or procedure A was carried out by agent B.</description>
+            </node>
+            <node>
+               <name>Performed-using</name>
+               <description>A, (Performed-using, B)) indicates that the action or procedure A was accomplished using B.</description>
+            </node>
+            <node>
+               <name>Related-to</name>
+               <description>(A, (Related-to, B)) indicates A has some relationship to B.</description>
+            </node>
+            <node>
+               <name>Unrelated-to</name>
+               <description>(A, (Unrelated-to, B)) indicates that A is not related to B.  For example, A is not related to Task.</description>
+            </node>
+         </node>
+         <node>
+            <name>Directional-relation</name>
+            <description>A relationship indicating direction of change.</description>
+            <node>
+               <name>Away-from</name>
+               <description>(A, (Away-from, B)) indicates that A is going or has moved away from B. The meaning depends on A and B.</description>
+            </node>
+            <node>
+               <name>Towards</name>
+               <description>(A, (Towards, B)) indicates that A is going to or has moved to B. The meaning depends on A and B.</description>
+            </node>
+         </node>
+         <node>
+            <name>Spatial-relation</name>
+            <description>Indicating information about position.</description>
+            <node>
+               <name>Above</name>
+               <description>(A, (Above, B)) means A is in a place or position that is higher than B.</description>
+            </node>
+            <node>
+               <name>Across-from</name>
+               <description>(A, (Across-from, B)) means A is on the opposite side of something from B.</description>
+            </node>
+            <node>
+               <name>Adjacent-to</name>
+               <description>(A, (Adjacent-to, B)) indicates that A is next to B in time or space.</description>
+            </node>
+            <node>
+               <name>Ahead-of</name>
+               <description>(A, (Ahead-of, B)) indicates that A is further forward in time or space in B.</description>
+            </node>
+            <node>
+               <name>Around</name>
+               <description>(A, (Around, B)) means A is in or near the present place or situation of B.</description>
+            </node>
+            <node>
+               <name>Behind</name>
+               <description>(A, (Behind, B)) means A is at or to the far side of B, typically so as to be hidden by it.</description>
+            </node>
+            <node>
+               <name>Below</name>
+               <description>(A, (Below, B)) means A is in a place or position that is lower than the position of B.</description>
+            </node>
+            <node>
+               <name>Between</name>
+               <description>(A, (Between, (B, C))) means A is in the space or interval separating B and C.</description>
+            </node>
+            <node>
+               <name>Bilateral-to</name>
+               <description>(A, (Bilateral, B)) means A is on both sides of B or affects both sides of B.</description>
+            </node>
+            <node>
+               <name>Bottom-edge-of</name>
+               <description>(A, (Bottom-edge-of, B)) means A is on the bottom most part or or near the boundary of B.</description>
+               <attribute>
+                  <name>relatedTag</name>
+                  <value>Left-edge-of</value>
+                  <value>Right-edge-of</value>
+                  <value>Top-edge-of</value>
+               </attribute>
+            </node>
+            <node>
+               <name>Boundary-of</name>
+               <description>(A, (Boundary-of, B)) means A is on or part of the edge or boundary of B.</description>
+            </node>
+            <node>
+               <name>Center-of</name>
+               <description>(A, (Center-of, B)) means A is at a point or or in an area that is approximately central within B.</description>
+            </node>
+            <node>
+               <name>Close-to</name>
+               <description>(A, (Close-to, B)) means A is at a small distance from or is located near in space to B.</description>
+            </node>
+            <node>
+               <name>Far-from</name>
+               <description>(A, (Far-from, B)) means A is at a large distance from or is not located near in space to B.</description>
+            </node>
+            <node>
+               <name>In-front-of</name>
+               <description>(A, (In-front-of, B)) means A is in a position just ahead or at the front part of B, potentially partially blocking B from view.</description>
+            </node>
+            <node>
+               <name>Left-edge-of</name>
+               <description>(A, (Left-edge-of, B)) means A is located on the left side of B on or near the boundary of B.</description>
+               <attribute>
+                  <name>relatedTag</name>
+                  <value>Bottom-edge-of</value>
+                  <value>Right-edge-of</value>
+                  <value>Top-edge-of</value>
+               </attribute>
+            </node>
+            <node>
+               <name>Left-side-of</name>
+               <description>(A, (Left-side-of, B)) means A is located on the left side of B usually as part of B.</description>
+               <attribute>
+                  <name>relatedTag</name>
+                  <value>Right-side-of</value>
+               </attribute>
+            </node>
+            <node>
+               <name>Lower-left-of</name>
+               <description>(A, (Lower-left-of, B)) means A is situated on the lower left part of B. This relation is often used to specify qualitative information about screen position.</description>
+               <attribute>
+                  <name>relatedTag</name>
+                  <value>Lower-right-of</value>
+                  <value>Upper-left-of</value>
+                  <value>Upper-right-of</value>
+               </attribute>
+            </node>
+            <node>
+               <name>Lower-right-of</name>
+               <description>(A, (Lower-right-of, B)) means A is situated on the lower right part of B. This relation is often used to specify qualitative information about screen position.</description>
+               <attribute>
+                  <name>relatedTag</name>
+                  <value>Upper-left-of</value>
+                  <value>Upper-left-of</value>
+                  <value>Lower-right-of</value>
+               </attribute>
+            </node>
+            <node>
+               <name>Outside-of</name>
+               <description>(A, (Outside-of, B)) means A is located in the space around but not including B.</description>
+            </node>
+            <node>
+               <name>Over</name>
+               <description>(A, (Over, B)) means A above is above B so as to cover or protect or A extends over the a general area as from a from a vantage point.</description>
+            </node>
+            <node>
+               <name>Right-edge-of</name>
+               <description>(A, (Right-edge-of, B)) means A is located on the right side of B on or near the boundary of B.</description>
+               <attribute>
+                  <name>relatedTag</name>
+                  <value>Bottom-edge-of</value>
+                  <value>Left-edge-of</value>
+                  <value>Top-edge-of</value>
+               </attribute>
+            </node>
+            <node>
+               <name>Right-side-of</name>
+               <description>(A, (Right-side-of, B)) means A is located on the right side of B usually as part of B.</description>
+               <attribute>
+                  <name>relatedTag</name>
+                  <value>Left-side-of</value>
+               </attribute>
+            </node>
+            <node>
+               <name>To-left-of</name>
+               <description>(A, (To-left-of, B)) means A is located on or directed toward the side to the west of B when B is facing north. This term is used when A is not part of B.</description>
+            </node>
+            <node>
+               <name>To-right-of</name>
+               <description>(A, (To-right-of, B)) means A is located on or directed toward the side to the east of B when B is facing north. This term is used when A is not part of B.</description>
+            </node>
+            <node>
+               <name>Top-edge-of</name>
+               <description>(A, (Top-edge-of, B)) means A is on the uppermost part or or near the boundary of B.</description>
+               <attribute>
+                  <name>relatedTag</name>
+                  <value>Left-edge-of</value>
+                  <value>Right-edge-of</value>
+                  <value>Bottom-edge-of</value>
+               </attribute>
+            </node>
+            <node>
+               <name>Top-of</name>
+               <description>(A, (Top-of, B)) means A is on the uppermost part, side, or surface of B.</description>
+            </node>
+            <node>
+               <name>Upper-left-of</name>
+               <description>(A, (Upper-left-of, B)) means A is situated on the upper left part of B. This relation is often used to specify qualitative information about screen position.</description>
+               <attribute>
+                  <name>relatedTag</name>
+                  <value>Lower-left-of</value>
+                  <value>Lower-right-of</value>
+                  <value>Upper-right-of</value>
+               </attribute>
+            </node>
+            <node>
+               <name>Upper-right-of</name>
+               <description>(A, (Upper-right-of, B)) means A is situated on the upper right part of B. This relation is often used to specify qualitative information about screen position.</description>
+               <attribute>
+                  <name>relatedTag</name>
+                  <value>Lower-left-of</value>
+                  <value>Upper-left-of</value>
+                  <value>Lower-right-of</value>
+               </attribute>
+            </node>
+            <node>
+               <name>Underneath</name>
+               <description>(A, (Underneath, B)) means A is situated directly below and may be concealed by B.</description>
+            </node>
+            <node>
+               <name>Within</name>
+               <description>(A, (Within, B)) means A is on the inside of or contained in B.</description>
+            </node>
+         </node>
+         <node>
+            <name>Temporal-relation</name>
+            <description>Any relationship which includes a temporal or time-based component.</description>
+            <node>
+               <name>After</name>
+               <description>(A, (After B)) means A happens at a time subsequent to a reference time related to B.</description>
+            </node>
+            <node>
+               <name>Asynchronous-with</name>
+               <description>(A, (Asynchronous-with, B)) means A happens at times not occurring at the same time or having the same period or phase as B.</description>
+            </node>
+            <node>
+               <name>Before</name>
+               <description>(A, (Before B)) means A happens at a time earlier in time or order than B.</description>
+            </node>
+            <node>
+               <name>During</name>
+               <description>(A, (During, B)) means A happens at some point in a given period of time in which B is ongoing.</description>
+            </node>
+            <node>
+               <name>Synchronous-with</name>
+               <description>(A, (Synchronous-with, B)) means A happens at occurs at the same time or rate as B.</description>
+            </node>
+            <node>
+               <name>Waiting-for</name>
+               <description>(A, (Waiting-for, B)) means A pauses for something to happen in B.</description>
+            </node>
+         </node>
+      </node>
+   </schema>
+   <unitClassDefinitions>
+      <unitClassDefinition>
+         <name>accelerationUnits</name>
+         <attribute>
+            <name>defaultUnits</name>
+            <value>m-per-s^2</value>
+         </attribute>
+         <unit>
+            <name>m-per-s^2</name>
+            <attribute>
+               <name>SIUnit</name>
+            </attribute>
+            <attribute>
+               <name>unitSymbol</name>
+            </attribute>
+            <attribute>
+               <name>conversionFactor</name>
+               <value>1.0</value>
+            </attribute>
+         </unit>
+      </unitClassDefinition>
+      <unitClassDefinition>
+         <name>angleUnits</name>
+         <attribute>
+            <name>defaultUnits</name>
+            <value>radian</value>
+         </attribute>
+         <unit>
+            <name>radian</name>
+            <attribute>
+               <name>SIUnit</name>
+            </attribute>
+            <attribute>
+               <name>conversionFactor</name>
+               <value>1.0</value>
+            </attribute>
+         </unit>
+         <unit>
+            <name>rad</name>
+            <attribute>
+               <name>SIUnit</name>
+            </attribute>
+            <attribute>
+               <name>unitSymbol</name>
+            </attribute>
+            <attribute>
+               <name>conversionFactor</name>
+               <value>1.0</value>
+            </attribute>
+         </unit>
+         <unit>
+            <name>degree</name>
+            <attribute>
+               <name>conversionFactor</name>
+               <value>0.0174533</value>
+            </attribute>
+         </unit>
+      </unitClassDefinition>
+      <unitClassDefinition>
+         <name>areaUnits</name>
+         <attribute>
+            <name>defaultUnits</name>
+            <value>m^2</value>
+         </attribute>
+         <unit>
+            <name>m^2</name>
+            <attribute>
+               <name>SIUnit</name>
+            </attribute>
+            <attribute>
+               <name>unitSymbol</name>
+            </attribute>
+            <attribute>
+               <name>conversionFactor</name>
+               <value>1.0</value>
+            </attribute>
+         </unit>
+      </unitClassDefinition>
+      <unitClassDefinition>
+         <name>currencyUnits</name>
+         <description>Units indicating the worth of something.</description>
+         <attribute>
+            <name>defaultUnits</name>
+            <value>$</value>
+         </attribute>
+         <unit>
+            <name>dollar</name>
+            <attribute>
+               <name>conversionFactor</name>
+               <value>1.0</value>
+            </attribute>
+         </unit>
+         <unit>
+            <name>$</name>
+            <attribute>
+               <name>unitPrefix</name>
+            </attribute>
+            <attribute>
+               <name>unitSymbol</name>
+            </attribute>
+            <attribute>
+               <name>conversionFactor</name>
+               <value>1.0</value>
+            </attribute>
+         </unit>
+         <unit>
+            <name>euro</name>
+         </unit>
+         <unit>
+            <name>point</name>
+         </unit>
+      </unitClassDefinition>
+      <unitClassDefinition>
+         <name>electricPotentialUnits</name>
+         <attribute>
+            <name>defaultUnits</name>
+            <value>uv</value>
+         </attribute>
+         <unit>
+            <name>v</name>
+            <attribute>
+               <name>SIUnit</name>
+            </attribute>
+            <attribute>
+               <name>unitSymbol</name>
+            </attribute>
+            <attribute>
+               <name>conversionFactor</name>
+               <value>0.000001</value>
+            </attribute>
+         </unit>
+         <unit>
+            <name>Volt</name>
+            <attribute>
+               <name>SIUnit</name>
+            </attribute>
+            <attribute>
+               <name>conversionFactor</name>
+               <value>0.000001</value>
+            </attribute>
+         </unit>
+      </unitClassDefinition>
+      <unitClassDefinition>
+         <name>frequencyUnits</name>
+         <attribute>
+            <name>defaultUnits</name>
+            <value>Hz</value>
+         </attribute>
+         <unit>
+            <name>hertz</name>
+            <attribute>
+               <name>SIUnit</name>
+            </attribute>
+            <attribute>
+               <name>conversionFactor</name>
+               <value>1.0</value>
+            </attribute>
+         </unit>
+         <unit>
+            <name>Hz</name>
+            <attribute>
+               <name>SIUnit</name>
+            </attribute>
+            <attribute>
+               <name>unitSymbol</name>
+            </attribute>
+            <attribute>
+               <name>conversionFactor</name>
+               <value>1.0</value>
+            </attribute>
+         </unit>
+      </unitClassDefinition>
+      <unitClassDefinition>
+         <name>intensityUnits</name>
+         <attribute>
+            <name>defaultUnits</name>
+            <value>dB</value>
+         </attribute>
+         <unit>
+            <name>dB</name>
+            <description>Intensity expressed as ratio to a threshold. May be used for sound intensity.</description>
+            <attribute>
+               <name>unitSymbol</name>
+            </attribute>
+            <attribute>
+               <name>conversionFactor</name>
+               <value>1.0</value>
+            </attribute>
+         </unit>
+         <unit>
+            <name>candela</name>
+            <description>Units used to express light intensity.</description>
+            <attribute>
+               <name>SIUnit</name>
+            </attribute>
+         </unit>
+         <unit>
+            <name>cd</name>
+            <description>Units used to express light intensity.</description>
+            <attribute>
+               <name>SIUnit</name>
+            </attribute>
+            <attribute>
+               <name>unitSymbol</name>
+            </attribute>
+         </unit>
+      </unitClassDefinition>
+      <unitClassDefinition>
+         <name>jerkUnits</name>
+         <attribute>
+            <name>defaultUnits</name>
+            <value>m-per-s^3</value>
+         </attribute>
+         <unit>
+            <name>m-per-s^3</name>
+            <attribute>
+               <name>unitSymbol</name>
+            </attribute>
+            <attribute>
+               <name>conversionFactor</name>
+               <value>1.0</value>
+            </attribute>
+         </unit>
+      </unitClassDefinition>
+      <unitClassDefinition>
+         <name>magneticFieldUnits</name>
+         <description>Units used to magnetic field intensity.</description>
+         <attribute>
+            <name>defaultUnits</name>
+            <value>fT</value>
+         </attribute>
+         <unit>
+            <name>tesla</name>
+            <attribute>
+               <name>SIUnit</name>
+            </attribute>
+            <attribute>
+               <name>conversionFactor</name>
+               <value>10^-15</value>
+            </attribute>
+         </unit>
+         <unit>
+            <name>T</name>
+            <attribute>
+               <name>SIUnit</name>
+            </attribute>
+            <attribute>
+               <name>unitSymbol</name>
+            </attribute>
+            <attribute>
+               <name>conversionFactor</name>
+               <value>10^-15</value>
+            </attribute>
+         </unit>
+      </unitClassDefinition>
+      <unitClassDefinition>
+         <name>memorySizeUnits</name>
+         <attribute>
+            <name>defaultUnits</name>
+            <value>B</value>
+         </attribute>
+         <unit>
+            <name>byte</name>
+            <attribute>
+               <name>SIUnit</name>
+            </attribute>
+            <attribute>
+               <name>conversionFactor</name>
+               <value>1.0</value>
+            </attribute>
+         </unit>
+         <unit>
+            <name>B</name>
+            <attribute>
+               <name>SIUnit</name>
+            </attribute>
+            <attribute>
+               <name>unitSymbol</name>
+            </attribute>
+            <attribute>
+               <name>conversionFactor</name>
+               <value>1.0</value>
+            </attribute>
+         </unit>
+      </unitClassDefinition>
+      <unitClassDefinition>
+         <name>physicalLengthUnits</name>
+         <attribute>
+            <name>defaultUnits</name>
+            <value>m</value>
+         </attribute>
+         <unit>
+            <name>foot</name>
+            <attribute>
+               <name>conversionFactor</name>
+               <value>0.3048</value>
+            </attribute>
+         </unit>
+         <unit>
+            <name>inch</name>
+            <attribute>
+               <name>conversionFactor</name>
+               <value>0.0254</value>
+            </attribute>
+         </unit>
+         <unit>
+            <name>metre</name>
+            <attribute>
+               <name>SIUnit</name>
+            </attribute>
+            <attribute>
+               <name>conversionFactor</name>
+               <value>1.0</value>
+            </attribute>
+         </unit>
+         <unit>
+            <name>m</name>
+            <attribute>
+               <name>SIUnit</name>
+            </attribute>
+            <attribute>
+               <name>unitSymbol</name>
+            </attribute>
+            <attribute>
+               <name>conversionFactor</name>
+               <value>1.0</value>
+            </attribute>
+         </unit>
+         <unit>
+            <name>mile</name>
+            <attribute>
+               <name>conversionFactor</name>
+               <value>1609.34</value>
+            </attribute>
+         </unit>
+      </unitClassDefinition>
+      <unitClassDefinition>
+         <name>speedUnits</name>
+         <attribute>
+            <name>defaultUnits</name>
+            <value>m-per-s</value>
+         </attribute>
+         <unit>
+            <name>m-per-s</name>
+            <attribute>
+               <name>SIUnit</name>
+            </attribute>
+            <attribute>
+               <name>unitSymbol</name>
+            </attribute>
+            <attribute>
+               <name>conversionFactor</name>
+               <value>1.0</value>
+            </attribute>
+         </unit>
+         <unit>
+            <name>mph</name>
+            <attribute>
+               <name>unitSymbol</name>
+            </attribute>
+            <attribute>
+               <name>conversionFactor</name>
+               <value>0.44704</value>
+            </attribute>
+         </unit>
+         <unit>
+            <name>kph</name>
+            <attribute>
+               <name>unitSymbol</name>
+            </attribute>
+            <attribute>
+               <name>conversionFactor</name>
+               <value>0.277778</value>
+            </attribute>
+         </unit>
+      </unitClassDefinition>
+      <unitClassDefinition>
+         <name>temperatureUnits</name>
+         <unit>
+            <name>degree Celsius</name>
+            <attribute>
+               <name>SIUnit</name>
+            </attribute>
+            <attribute>
+               <name>conversionFactor</name>
+               <value>1.0</value>
+            </attribute>
+         </unit>
+         <unit>
+            <name>oC</name>
+            <attribute>
+               <name>SIUnit</name>
+            </attribute>
+            <attribute>
+               <name>unitSymbol</name>
+            </attribute>
+            <attribute>
+               <name>conversionFactor</name>
+               <value>1.0</value>
+            </attribute>
+         </unit>
+      </unitClassDefinition>
+      <unitClassDefinition>
+         <name>timeUnits</name>
+         <attribute>
+            <name>defaultUnits</name>
+            <value>s</value>
+         </attribute>
+         <unit>
+            <name>second</name>
+            <attribute>
+               <name>SIUnit</name>
+            </attribute>
+            <attribute>
+               <name>conversionFactor</name>
+               <value>1.0</value>
+            </attribute>
+         </unit>
+         <unit>
+            <name>s</name>
+            <attribute>
+               <name>SIUnit</name>
+            </attribute>
+            <attribute>
+               <name>unitSymbol</name>
+            </attribute>
+            <attribute>
+               <name>conversionFactor</name>
+               <value>1.0</value>
+            </attribute>
+         </unit>
+         <unit>
+            <name>day</name>
+            <attribute>
+               <name>conversionFactor</name>
+               <value>86400</value>
+            </attribute>
+         </unit>
+         <unit>
+            <name>minute</name>
+            <attribute>
+               <name>conversionFactor</name>
+               <value>60</value>
+            </attribute>
+         </unit>
+         <unit>
+            <name>hour</name>
+            <description>Should be in 24-hour format.</description>
+            <attribute>
+               <name>conversionFactor</name>
+               <value>3600</value>
+            </attribute>
+         </unit>
+      </unitClassDefinition>
+      <unitClassDefinition>
+         <name>volumeUnits</name>
+         <attribute>
+            <name>defaultUnits</name>
+            <value>m^3</value>
+         </attribute>
+         <unit>
+            <name>m^3</name>
+            <attribute>
+               <name>SIUnit</name>
+            </attribute>
+            <attribute>
+               <name>unitSymbol</name>
+            </attribute>
+            <attribute>
+               <name>conversionFactor</name>
+               <value>1.0</value>
+            </attribute>
+         </unit>
+      </unitClassDefinition>
+      <unitClassDefinition>
+         <name>weightUnits</name>
+         <attribute>
+            <name>defaultUnits</name>
+            <value>g</value>
+         </attribute>
+         <unit>
+            <name>g</name>
+            <attribute>
+               <name>SIUnit</name>
+            </attribute>
+            <attribute>
+               <name>unitSymbol</name>
+            </attribute>
+            <attribute>
+               <name>conversionFactor</name>
+               <value>1.0</value>
+            </attribute>
+         </unit>
+         <unit>
+            <name>gram</name>
+            <attribute>
+               <name>SIUnit</name>
+            </attribute>
+            <attribute>
+               <name>conversionFactor</name>
+               <value>1.0</value>
+            </attribute>
+         </unit>
+         <unit>
+            <name>pound</name>
+            <attribute>
+               <name>conversionFactor</name>
+               <value>453.592</value>
+            </attribute>
+         </unit>
+         <unit>
+            <name>lb</name>
+            <attribute>
+               <name>conversionFactor</name>
+               <value>453.592</value>
+            </attribute>
+         </unit>
+      </unitClassDefinition>
+   </unitClassDefinitions>
+   <unitModifierDefinitions>
+      <unitModifierDefinition>
+         <name>deca</name>
+         <description>SI unit multiple representing 10^1.</description>
+         <attribute>
+            <name>SIUnitModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>10.0</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>da</name>
+         <description>SI unit multiple representing 10^1.</description>
+         <attribute>
+            <name>SIUnitSymbolModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>10.0</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>hecto</name>
+         <description>SI unit multiple representing 10^2.</description>
+         <attribute>
+            <name>SIUnitModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>100.0</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>h</name>
+         <description>SI unit multiple representing 10^2.</description>
+         <attribute>
+            <name>SIUnitSymbolModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>100.0</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>kilo</name>
+         <description>SI unit multiple representing 10^3.</description>
+         <attribute>
+            <name>SIUnitModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>1000.0</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>k</name>
+         <description>SI unit multiple representing 10^3.</description>
+         <attribute>
+            <name>SIUnitSymbolModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>1000.0</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>mega</name>
+         <description>SI unit multiple representing 10^6.</description>
+         <attribute>
+            <name>SIUnitModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>10^6</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>M</name>
+         <description>SI unit multiple representing 10^6.</description>
+         <attribute>
+            <name>SIUnitSymbolModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>10^6</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>giga</name>
+         <description>SI unit multiple representing 10^9.</description>
+         <attribute>
+            <name>SIUnitModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>10^9</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>G</name>
+         <description>SI unit multiple representing 10^9.</description>
+         <attribute>
+            <name>SIUnitSymbolModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>10^9</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>tera</name>
+         <description>SI unit multiple representing 10^12.</description>
+         <attribute>
+            <name>SIUnitModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>10^12</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>T</name>
+         <description>SI unit multiple representing 10^12.</description>
+         <attribute>
+            <name>SIUnitSymbolModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>10^12</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>peta</name>
+         <description>SI unit multiple representing 10^15.</description>
+         <attribute>
+            <name>SIUnitModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>10^15</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>P</name>
+         <description>SI unit multiple representing 10^15.</description>
+         <attribute>
+            <name>SIUnitSymbolModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>10^15</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>exa</name>
+         <description>SI unit multiple representing 10^18.</description>
+         <attribute>
+            <name>SIUnitModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>10^18</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>E</name>
+         <description>SI unit multiple representing 10^18.</description>
+         <attribute>
+            <name>SIUnitSymbolModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>10^18</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>zetta</name>
+         <description>SI unit multiple representing 10^21.</description>
+         <attribute>
+            <name>SIUnitModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>10^21</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>Z</name>
+         <description>SI unit multiple representing 10^21.</description>
+         <attribute>
+            <name>SIUnitSymbolModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>10^21</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>yotta</name>
+         <description>SI unit multiple representing 10^24.</description>
+         <attribute>
+            <name>SIUnitModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>10^24</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>Y</name>
+         <description>SI unit multiple representing 10^24.</description>
+         <attribute>
+            <name>SIUnitSymbolModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>10^24</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>deci</name>
+         <description>SI unit submultiple representing 10^-1.</description>
+         <attribute>
+            <name>SIUnitModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>0.1</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>d</name>
+         <description>SI unit submultiple representing 10^-1.</description>
+         <attribute>
+            <name>SIUnitSymbolModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>0.1</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>centi</name>
+         <description>SI unit submultiple representing 10^-2.</description>
+         <attribute>
+            <name>SIUnitModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>0.01</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>c</name>
+         <description>SI unit submultiple representing 10^-2.</description>
+         <attribute>
+            <name>SIUnitSymbolModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>0.01</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>milli</name>
+         <description>SI unit submultiple representing 10^-3.</description>
+         <attribute>
+            <name>SIUnitModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>0.001</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>m</name>
+         <description>SI unit submultiple representing 10^-3.</description>
+         <attribute>
+            <name>SIUnitSymbolModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>0.001</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>micro</name>
+         <description>SI unit submultiple representing 10^-6.</description>
+         <attribute>
+            <name>SIUnitModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>10^-6</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>u</name>
+         <description>SI unit submultiple representing 10^-6.</description>
+         <attribute>
+            <name>SIUnitSymbolModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>10^-6</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>nano</name>
+         <description>SI unit submultiple representing 10^-9.</description>
+         <attribute>
+            <name>SIUnitModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>10^-9</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>n</name>
+         <description>SI unit submultiple representing 10^-9.</description>
+         <attribute>
+            <name>SIUnitSymbolModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>10^-9</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>pico</name>
+         <description>SI unit submultiple representing 10^-12.</description>
+         <attribute>
+            <name>SIUnitModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>10^-12</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>p</name>
+         <description>SI unit submultiple representing 10^-12.</description>
+         <attribute>
+            <name>SIUnitSymbolModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>10^-12</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>femto</name>
+         <description>SI unit submultiple representing 10^-15.</description>
+         <attribute>
+            <name>SIUnitModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>10^-15</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>f</name>
+         <description>SI unit submultiple representing 10^-15.</description>
+         <attribute>
+            <name>SIUnitSymbolModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>10^-15</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>atto</name>
+         <description>SI unit submultiple representing 10^-18.</description>
+         <attribute>
+            <name>SIUnitModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>10^-18</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>a</name>
+         <description>SI unit submultiple representing 10^-18.</description>
+         <attribute>
+            <name>SIUnitSymbolModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>10^-18</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>zepto</name>
+         <description>SI unit submultiple representing 10^-21.</description>
+         <attribute>
+            <name>SIUnitModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>10^-21</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>z</name>
+         <description>SI unit submultiple representing 10^-21.</description>
+         <attribute>
+            <name>SIUnitSymbolModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>10^-21</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>yocto</name>
+         <description>SI unit submultiple representing 10^-24.</description>
+         <attribute>
+            <name>SIUnitModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>10^-24</value>
+         </attribute>
+      </unitModifierDefinition>
+      <unitModifierDefinition>
+         <name>y</name>
+         <description>SI unit submultiple representing 10^-24.</description>
+         <attribute>
+            <name>SIUnitSymbolModifier</name>
+         </attribute>
+         <attribute>
+            <name>conversionFactor</name>
+            <value>10^-24</value>
+         </attribute>
+      </unitModifierDefinition>
+   </unitModifierDefinitions>
+   <valueClassDefinitions>
+      <valueClassDefinition>
+         <name>dateTimeClass</name>
+         <description>Date-times should conform to ISO8601 date-time format YYYY-MM-DDThh:mm:ss. Any variation on the full form is allowed.</description>
+         <attribute>
+            <name>allowedCharacter</name>
+            <value>digits</value>
+            <value>T</value>
+            <value>-</value>
+            <value>:</value>
+         </attribute>
+      </valueClassDefinition>
+      <valueClassDefinition>
+         <name>nameClass</name>
+         <description>Value class designating values that have the characteristics of node names. The allowed characters are alphanumeric, hyphen, and underbar.</description>
+         <attribute>
+            <name>allowedCharacter</name>
+            <value>letters</value>
+            <value>digits</value>
+            <value>_</value>
+            <value>-</value>
+         </attribute>
+      </valueClassDefinition>
+      <valueClassDefinition>
+         <name>numericClass</name>
+         <description>Value must be a valid numerical value.</description>
+         <attribute>
+            <name>allowedCharacter</name>
+            <value>digits</value>
+            <value>E</value>
+            <value>e</value>
+            <value>+</value>
+            <value>-</value>
+            <value>.</value>
+         </attribute>
+      </valueClassDefinition>
+      <valueClassDefinition>
+         <name>posixPath</name>
+         <description>Posix path specification.</description>
+         <attribute>
+            <name>allowedCharacter</name>
+            <value>digits</value>
+            <value>letters</value>
+            <value>/</value>
+            <value>:</value>
+         </attribute>
+      </valueClassDefinition>
+      <valueClassDefinition>
+         <name>textClass</name>
+         <description>Value class designating values that have the characteristics of text such as in descriptions.</description>
+         <attribute>
+            <name>allowedCharacter</name>
+            <value>letters</value>
+            <value>digits</value>
+            <value>blank</value>
+            <value>+</value>
+            <value>-</value>
+            <value>:</value>
+            <value>;</value>
+            <value>.</value>
+            <value>/</value>
+            <value>(</value>
+            <value>)</value>
+            <value>?</value>
+            <value>*</value>
+            <value>%</value>
+            <value>$</value>
+            <value>@</value>
+         </attribute>
+      </valueClassDefinition>
+   </valueClassDefinitions>
+   <schemaAttributeDefinitions>
+      <schemaAttributeDefinition>
+         <name>allowedCharacter</name>
+         <description>A schema attribute of value classes specifying a special character that is allowed in expressing the value of a placeholder. Normally the allowed characters are listed individually. However, the word letters designates the upper and lower case alphabetic characters and the word digits designates the digits 0-9. The word blank designates the blank character.</description>
+         <property>
+            <name>valueClassProperty</name>
+         </property>
+      </schemaAttributeDefinition>
+      <schemaAttributeDefinition>
+         <name>conversionFactor</name>
+         <description>The multiplicative factor to multiply these units to convert to default units.</description>
+         <property>
+            <name>unitProperty</name>
+         </property>
+         <property>
+            <name>unitModifierProperty</name>
+         </property>
+      </schemaAttributeDefinition>
+      <schemaAttributeDefinition>
+         <name>defaultUnits</name>
+         <description>A schema attribute of unit classes specifying the default units to use if the placeholder has a unit class but the substituted value has no units.</description>
+         <property>
+            <name>unitClassProperty</name>
+         </property>
+      </schemaAttributeDefinition>
+      <schemaAttributeDefinition>
+         <name>extensionAllowed</name>
+         <description>A schema attribute indicating that users can add unlimited levels of child nodes under this tag. This tag is propagated to child nodes with the exception of the hashtag placeholders.</description>
+         <property>
+            <name>boolProperty</name>
+         </property>
+      </schemaAttributeDefinition>
+      <schemaAttributeDefinition>
+         <name>recommended</name>
+         <description>A schema attribute indicating that the event-level HED string should include this tag.</description>
+         <property>
+            <name>boolProperty</name>
+         </property>
+      </schemaAttributeDefinition>
+      <schemaAttributeDefinition>
+         <name>relatedTag</name>
+         <description>A schema attribute suggesting HED tags that are closely related to this tag. This attribute is used by tagging tools.</description>
+      </schemaAttributeDefinition>
+      <schemaAttributeDefinition>
+         <name>requireChild</name>
+         <description>A schema attribute indicating that one of the node elements descendants must be included when using this tag.</description>
+         <property>
+            <name>boolProperty</name>
+         </property>
+      </schemaAttributeDefinition>
+      <schemaAttributeDefinition>
+         <name>required</name>
+         <description>A schema attribute indicating that every event-level HED string should include this tag.</description>
+         <property>
+            <name>boolProperty</name>
+         </property>
+      </schemaAttributeDefinition>
+      <schemaAttributeDefinition>
+         <name>SIUnit</name>
+         <description>A schema attribute indicating that this unit element is an SI unit and can be modified by multiple and submultiple names. Note that some units such as byte are designated as SI units although they are not part of the standard.</description>
+         <property>
+            <name>boolProperty</name>
+         </property>
+         <property>
+            <name>unitProperty</name>
+         </property>
+      </schemaAttributeDefinition>
+      <schemaAttributeDefinition>
+         <name>SIUnitModifier</name>
+         <description>A schema attribute indicating that this SI unit modifier represents a multiple or submultiple of a base unit rather than a unit symbol.</description>
+         <property>
+            <name>boolProperty</name>
+         </property>
+         <property>
+            <name>unitModifierProperty</name>
+         </property>
+      </schemaAttributeDefinition>
+      <schemaAttributeDefinition>
+         <name>SIUnitSymbolModifier</name>
+         <description>A schema attribute indicating that this SI unit modifier represents a multiple or submultiple of a unit symbol rather than a base symbol.</description>
+         <property>
+            <name>boolProperty</name>
+         </property>
+         <property>
+            <name>unitModifierProperty</name>
+         </property>
+      </schemaAttributeDefinition>
+      <schemaAttributeDefinition>
+         <name>suggestedTag</name>
+         <description>A schema attribute that indicates another tag  that is often associated with this tag. This attribute is used by tagging tools to provide tagging suggestions.</description>
+      </schemaAttributeDefinition>
+      <schemaAttributeDefinition>
+         <name>tagGroup</name>
+         <description>A schema attribute indicating the tag can only appear inside a tag group.</description>
+         <property>
+            <name>boolProperty</name>
+         </property>
+      </schemaAttributeDefinition>
+      <schemaAttributeDefinition>
+         <name>takesValue</name>
+         <description>A schema attribute indicating the tag is a hashtag placeholder that is expected to be replaced with a user-defined value.</description>
+         <property>
+            <name>boolProperty</name>
+         </property>
+      </schemaAttributeDefinition>
+      <schemaAttributeDefinition>
+         <name>topLevelTagGroup</name>
+         <description>A schema attribute indicating that this tag (or its descendants) can only appear in a top-level tag group. A tag group can have at most one tag with this attribute.</description>
+         <property>
+            <name>boolProperty</name>
+         </property>
+      </schemaAttributeDefinition>
+      <schemaAttributeDefinition>
+         <name>unique</name>
+         <description>A schema attribute indicating that only one of this tag or its descendants can be used  in the event-level HED string.</description>
+         <property>
+            <name>boolProperty</name>
+         </property>
+      </schemaAttributeDefinition>
+      <schemaAttributeDefinition>
+         <name>unitClass</name>
+         <description>A schema attribute specifying which unit class this value tag belongs to.</description>
+      </schemaAttributeDefinition>
+      <schemaAttributeDefinition>
+         <name>unitPrefix</name>
+         <description>A schema attribute applied specifically to unit elements to designate that the unit indicator is a prefix (e.g., dollar sign in the currency units).</description>
+         <property>
+            <name>boolProperty</name>
+         </property>
+         <property>
+            <name>unitProperty</name>
+         </property>
+      </schemaAttributeDefinition>
+      <schemaAttributeDefinition>
+         <name>unitSymbol</name>
+         <description>A schema attribute indicating this tag is an abbreviation or symbol representing a type of unit. Unit symbols represent both the singular and the plural and thus cannot be pluralized.</description>
+         <property>
+            <name>boolProperty</name>
+         </property>
+         <property>
+            <name>unitProperty</name>
+         </property>
+      </schemaAttributeDefinition>
+      <schemaAttributeDefinition>
+         <name>valueClass</name>
+         <description>A schema attribute specifying which value class this value tag belongs to.</description>
+      </schemaAttributeDefinition>
+   </schemaAttributeDefinitions>
+   <propertyDefinitions>
+      <propertyDefinition>
+         <name>boolProperty</name>
+         <description>Indicates that the schema attribute represents something that is either true or false and does not have a value. Attributes without this value are assumed to have string values.</description>
+      </propertyDefinition>
+      <propertyDefinition>
+         <name>unitClassProperty</name>
+         <description>Indicates that the schema attribute is meant to be applied to unit classes.</description>
+      </propertyDefinition>
+      <propertyDefinition>
+         <name>unitModifierProperty</name>
+         <description>Indicates that the schema attribute is meant to be applied to unit modifier classes.</description>
+      </propertyDefinition>
+      <propertyDefinition>
+         <name>unitProperty</name>
+         <description>Indicates that the schema attribute is meant to be applied to units within a unit class.</description>
+      </propertyDefinition>
+      <propertyDefinition>
+         <name>valueClassProperty</name>
+         <description>Indicates that the schema attribute is meant to be applied to value classes.</description>
+      </propertyDefinition>
+   </propertyDefinitions>
+   <epilogue>This is an updated version of the schema format. The properties are now part of the schema. The schema attributes are designed to be checked in software rather than hard-coded. The schema attributes, themselves have properties.
+
+</epilogue>
+</HED>
diff --git a/tests/data/schema_test_data/unknown_attribute.mediawiki b/tests/data/schema_test_data/unknown_attribute.mediawiki
index 91285b36e..664cc6c6b 100644
--- a/tests/data/schema_test_data/unknown_attribute.mediawiki
+++ b/tests/data/schema_test_data/unknown_attribute.mediawiki
@@ -733,7 +733,7 @@ This schema is the first official release that includes an xsd and requires unit
 * Organizational-property <nowiki>[Relating to an organization or the action of organizing something.]</nowiki>
 ** Collection <nowiki>[A tag designating a grouping of items such as in a set or list.]</nowiki>
 *** <nowiki># {takesValue, valueClass=nameClass}[Name of the collection.]</nowiki>
-** Condition-variable <nowiki>[An aspect of the experiment or task that is to be varied during the experiment. Task-conditions are sometimes called independent variables or contrasts.]</nowiki>
+** Condition-variable <nowiki>[An aspect of the experiment or task that is to be varied during the experiment. Task-conditions are sometimes called independent type_variables or contrasts.]</nowiki>
 *** <nowiki># {takesValue, valueClass=nameClass}[Name of the condition variable.]</nowiki>
 ** Control-variable <nowiki>[An aspect of the experiment that is fixed throughout the study and usually is explicitly controlled.]</nowiki>
 *** <nowiki># {takesValue, valueClass=nameClass}[Name of the control variable.]</nowiki>
@@ -750,7 +750,7 @@ This schema is the first official release that includes an xsd and requires unit
 *** <nowiki># {takesValue, valueClass=nameClass}[Optional label for the intertrial block.]</nowiki>
 ** Experimental-trial <nowiki>[Designates a run or execution of an activity, for example, one execution of a script. A tag used to indicate a particular organizational part in the experimental design often containing a stimulus-response pair or stimulus-response-feedback triad.]</nowiki>
 *** <nowiki># {takesValue, valueClass=nameClass}[Optional label for the trial (often a numerical string).]</nowiki>
-** Indicator-variable <nowiki>[An aspect of the experiment or task that is measured as task conditions are varied during the experiment. Experiment indicators are sometimes called dependent variables.]</nowiki>
+** Indicator-variable <nowiki>[An aspect of the experiment or task that is measured as task conditions are varied during the experiment. Experiment indicators are sometimes called dependent type_variables.]</nowiki>
 *** <nowiki># {takesValue, valueClass=nameClass}[Name of the indicator variable.]</nowiki>
 ** Recording <nowiki>[A tag designating the data recording. Recording tags are usually have temporal scope which is the entire recording.]</nowiki>
 *** <nowiki># {takesValue, valueClass=nameClass}[Optional label for the recording.]</nowiki>
diff --git a/tests/data/schema_test_data/unknown_attribute.xml b/tests/data/schema_test_data/unknown_attribute.xml
index c4f89b1f1..50f03bf8a 100644
--- a/tests/data/schema_test_data/unknown_attribute.xml
+++ b/tests/data/schema_test_data/unknown_attribute.xml
@@ -3800,7 +3800,7 @@
             </node>
             <node>
                <name>Condition-variable</name>
-               <description>An aspect of the experiment or task that is to be varied during the experiment. Task-conditions are sometimes called independent variables or contrasts.</description>
+               <description>An aspect of the experiment or task that is to be varied during the experiment. Task-conditions are sometimes called independent type_variables or contrasts.</description>
                <node>
                   <name>#</name>
                   <description>Name of the condition variable.</description>
@@ -3944,7 +3944,7 @@
             </node>
             <node>
                <name>Indicator-variable</name>
-               <description>An aspect of the experiment or task that is measured as task conditions are varied during the experiment. Experiment indicators are sometimes called dependent variables.</description>
+               <description>An aspect of the experiment or task that is measured as task conditions are varied during the experiment. Experiment indicators are sometimes called dependent type_variables.</description>
                <node>
                   <name>#</name>
                   <description>Name of the indicator variable.</description>
diff --git a/tests/data/validator_tests/HED8.0.0_added_tests.mediawiki b/tests/data/validator_tests/HED8.0.0_added_tests.mediawiki
index ace795b6c..a71f0afb4 100644
--- a/tests/data/validator_tests/HED8.0.0_added_tests.mediawiki
+++ b/tests/data/validator_tests/HED8.0.0_added_tests.mediawiki
@@ -735,7 +735,7 @@ This schema is the first official release that includes an xsd and requires unit
 * Organizational-property <nowiki>[Relating to an organization or the action of organizing something.]</nowiki>
 ** Collection <nowiki>[A tag designating a grouping of items such as in a set or list.]</nowiki>
 *** <nowiki># {takesValue, valueClass=nameClass}[Name of the collection.]</nowiki>
-** Condition-variable <nowiki>[An aspect of the experiment or task that is to be varied during the experiment. Task-conditions are sometimes called independent variables or contrasts.]</nowiki>
+** Condition-variable <nowiki>[An aspect of the experiment or task that is to be varied during the experiment. Task-conditions are sometimes called independent type_variables or contrasts.]</nowiki>
 *** <nowiki># {takesValue, valueClass=nameClass}[Name of the condition variable.]</nowiki>
 ** Control-variable <nowiki>[An aspect of the experiment that is fixed throughout the study and usually is explicitly controlled.]</nowiki>
 *** <nowiki># {takesValue, valueClass=nameClass}[Name of the control variable.]</nowiki>
@@ -752,7 +752,7 @@ This schema is the first official release that includes an xsd and requires unit
 *** <nowiki># {takesValue, valueClass=nameClass}[Optional label for the intertrial block.]</nowiki>
 ** Experimental-trial <nowiki>[Designates a run or execution of an activity, for example, one execution of a script. A tag used to indicate a particular organizational part in the experimental design often containing a stimulus-response pair or stimulus-response-feedback triad.]</nowiki>
 *** <nowiki># {takesValue, valueClass=nameClass}[Optional label for the trial (often a numerical string).]</nowiki>
-** Indicator-variable <nowiki>[An aspect of the experiment or task that is measured as task conditions are varied during the experiment. Experiment indicators are sometimes called dependent variables.]</nowiki>
+** Indicator-variable <nowiki>[An aspect of the experiment or task that is measured as task conditions are varied during the experiment. Experiment indicators are sometimes called dependent type_variables.]</nowiki>
 *** <nowiki># {takesValue, valueClass=nameClass}[Name of the indicator variable.]</nowiki>
 ** Recording <nowiki>[A tag designating the data recording. Recording tags are usually have temporal scope which is the entire recording.]</nowiki>
 *** <nowiki># {takesValue, valueClass=nameClass}[Optional label for the recording.]</nowiki>
diff --git a/tests/data/validator_tests/bids_schema.mediawiki b/tests/data/validator_tests/bids_schema.mediawiki
index 859805a50..971a9723b 100644
--- a/tests/data/validator_tests/bids_schema.mediawiki
+++ b/tests/data/validator_tests/bids_schema.mediawiki
@@ -653,8 +653,8 @@ HED version: 8.0.0-alpha.2
 ** Control-variable <nowiki>[An aspect of the experiment that is fixed throughout the study and usually is explicitly controlled.]</nowiki>
 ** Event-context <nowiki>[A tag indicating the overall environment and setup of the experiment or a portion of the experiment. This event is often inserted into a recording at the beginning of an experimental record to describe information such as whether the experiment is conducted indoors or outdoors or whether the experiment is conducted in the real-world or in a controlled laboratory setting. Tags specifying subject metadata might also be included. ]</nowiki>
 ** Event-stream <nowiki>[An ordered list of events  ]</nowiki>
-** Experimental-condition <nowiki>[An aspect of the experiment or task that is to be varied during the experiment. Task-conditions are sometimes called independent variables or contrasts.]</nowiki>
-** Experimental-indicator <nowiki>[An aspect of the experiment or task that is measured as task conditions are varied during the experiment. Experiment indicators are sometimes called dependent variables.]</nowiki>
+** Experimental-condition <nowiki>[An aspect of the experiment or task that is to be varied during the experiment. Task-conditions are sometimes called independent type_variables or contrasts.]</nowiki>
+** Experimental-indicator <nowiki>[An aspect of the experiment or task that is measured as task conditions are varied during the experiment. Experiment indicators are sometimes called dependent type_variables.]</nowiki>
 ** Experimental-intertrial <nowiki>[A tag used to indicate a part of the experiment between trials usually where nothing is happening.]</nowiki>
 ** Experimental-trial <nowiki>[A tag used to indicate a particular organizational part in the experimental design often containing a stimulus-response pair or stimulus-response-feedback triad.]</nowiki>
 ** Permutation <nowiki>[A tag used within a tag group also containing a Label tag to indicate that the Label represents events that are permutations of each other.]</nowiki>
diff --git a/tests/errors/test_error_reporter.py b/tests/errors/test_error_reporter.py
index e90dff80e..28c7fbffe 100644
--- a/tests/errors/test_error_reporter.py
+++ b/tests/errors/test_error_reporter.py
@@ -91,3 +91,25 @@ def test_printable_issue_string(self):
         self.assertTrue(len(printable_issues3) > len(printable_issues2))
 
         self.error_handler.reset_error_context()
+
+    def test_printable_issue_string_with_filenames(self):
+        myfile = 'my_file.txt'
+        self.error_handler.push_error_context(ErrorContext.CUSTOM_TITLE, "Default Custom Title")
+        self.error_handler.push_error_context(ErrorContext.FILE_NAME, myfile)
+        error_list = self.error_handler.format_error_with_context(ValidationErrors.HED_TAG_NOT_UNIQUE, "")
+        error_list += self.error_handler.format_error_with_context(SchemaWarnings.INVALID_CAPITALIZATION,
+                                                                   "dummy", problem_char="#", char_index=0)
+
+        printable_issues = get_printable_issue_string(error_list, skip_filename=False)
+        self.assertTrue(len(printable_issues) > 10)
+        self.assertEqual(printable_issues.count(myfile), 1)
+
+        printable_issues2 = get_printable_issue_string(error_list, severity=ErrorSeverity.ERROR, skip_filename=False)
+        self.assertTrue(len(printable_issues) > len(printable_issues2))
+        self.assertEqual(printable_issues2.count(myfile), 1)
+        printable_issues3 = get_printable_issue_string(error_list, severity=ErrorSeverity.ERROR, skip_filename=False,
+                                                       title="Later added custom title that is longer")
+        self.assertTrue(len(printable_issues3) > len(printable_issues2))
+        self.assertEqual(printable_issues3.count(myfile), 1)
+
+        self.error_handler.reset_error_context()
diff --git a/tests/models/test_base_file_input.py b/tests/models/test_base_file_input.py
index 2fb5ae4cd..1eecf0137 100644
--- a/tests/models/test_base_file_input.py
+++ b/tests/models/test_base_file_input.py
@@ -2,8 +2,11 @@
 import os
 import shutil
 from hed import Sidecar
-from hed import TabularInput
+from hed import BaseInput, TabularInput
+from hed.models.def_mapper import DefMapper
+from hed.models.column_mapper import ColumnMapper
 from hed.models import DefinitionDict
+from hed import schema
 # TODO: Add tests for base_file_input and include correct handling of 'n/a'
 
 
@@ -22,10 +25,38 @@ def setUpClass(cls):
         cls.base_output_folder = base_output
         os.makedirs(base_output, exist_ok=True)
 
+        bids_root_path = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)),
+                                                       '../data/bids/eeg_ds003654s_hed'))
+        schema_path = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)),
+                                                    '../data/schema_test_data/HED8.0.0.xml'))
+        cls.bids_root_path = bids_root_path
+        json_path = os.path.realpath(os.path.join(bids_root_path, 'task-FacePerception_events.json'))
+        events_path = os.path.realpath(os.path.join(bids_root_path,
+                                                    'sub-002/eeg/sub-002_task-FacePerception_run-1_events.tsv'))
+
+        cls.hed_schema = schema.load_schema(schema_path)
+        sidecar1 = Sidecar(json_path, name='face_sub1_json')
+        mapper1 = ColumnMapper(sidecar=sidecar1, optional_tag_columns=['HED'], warn_on_missing_column=False)
+        cls.input_data1 = BaseInput(events_path, file_type='.tsv', has_column_names=True,
+                                   name="face_sub1_events", mapper=mapper1,
+                                   definition_columns=['HED'], allow_blank_names=False)
+        cls.input_data2 = BaseInput(events_path, file_type='.tsv', has_column_names=True, name="face_sub2_events")
+
     @classmethod
     def tearDownClass(cls):
         shutil.rmtree(cls.base_output_folder)
 
+    def test_get_definitions(self):
+        defs1 = self.input_data1.get_definitions(as_strings=True)
+        self.assertIsInstance(defs1, dict, "get_definitions returns dictionary when as strings")
+        self.assertEqual(len(defs1), 17, "get_definitions should have the right number of definitions")
+
+        defs2 = self.input_data1.get_definitions()
+        self.assertIsInstance(defs2, DefMapper, "get_definitions returns a DefMapper by default")
+
+        defs3 = self.input_data2.get_definitions(as_strings=False)
+        self.assertIsInstance(defs3, DefMapper, "get_definitions returns a DefMapper when not as strings")
+
     def test_gathered_defs(self):
         # todo: add unit tests for definitions in tsv file
         defs = DefinitionDict.get_as_strings(self.tabular_file.def_dict)
@@ -52,7 +83,7 @@ def test_gathered_defs(self):
     #     self.assertEqual(len(issues), 0)
     #     input_file = TabularInput(events_path, sidecars=sidecar)
     #
-    #     validation_issues = input_file.validate_file_sidecars(validator)
+    #     validation_issues = input_file.validate_sidecar(validator)
     #     self.assertEqual(len(validation_issues), 0)
     #     validation_issues = input_file.validate_file(validator, check_for_warnings=True)
     #     self.assertEqual(len(validation_issues), 1)
@@ -72,7 +103,7 @@ def test_gathered_defs(self):
     #     self.assertEqual(len(issues), 0)
     #     input_file = TabularInput(events_path, sidecars=sidecar)
     #
-    #     validation_issues = input_file.validate_file_sidecars(validator)
+    #     validation_issues = input_file.validate_sidecar(validator)
     #     self.assertEqual(len(validation_issues), 0)
     #     validation_issues = input_file.validate_file(validator, check_for_warnings=True)
     #     self.assertEqual(len(validation_issues), 1)
diff --git a/tests/models/test_expression_parser.py b/tests/models/test_expression_parser.py
index bee67c3bc..05908a72c 100644
--- a/tests/models/test_expression_parser.py
+++ b/tests/models/test_expression_parser.py
@@ -97,6 +97,8 @@ def test_exact_group(self):
             "(A, (B, C))": False,
             "(A), (A, B)": True,
             "(A, B), (A)": True,
+            "(A, B, (C, D))": True,
+            "(A, B, C)": True
         }
         self.base_test("[[a, b]]", test_strings)
 
@@ -128,6 +130,7 @@ def test_exact_group_complex_split(self):
         test_strings = {
             "A, B, C, D": False,
             "(A, B, C, D)": False,
+            "((A, B, C, D))": True,  # todo: should this be true?  Probably not.
             "(A, B, (C, D))": False,
             "(A, B, ((C, D)))": False,
             "(E, F, (A, B, (C, D)))": False,
@@ -190,10 +193,11 @@ def test_exact_group_split_or_negation_dual2(self):
             "(A, B)": False,
             "((A), (B))": False,
             "((A))": False,
-            "((A), ((B)))": True,
+            "((A), ((B)))": True, # TODO: must all result groups have tags?  True because of ((B)) group with no tags.
             "((A, B))": False,
             "((A), (C))": True,
             "((A), (B, C))": False,
+            "((A), ((B), C))": True,
         }
         self.base_test("[[ [[~(a or b)]] ]]", test_strings)
 
@@ -230,6 +234,8 @@ def test_exact_group_negation2(self):
             "((A))": False,
             "((A), ((D, B)))": True,
             "((A, D))": False,
+            "(B, (D))": True,
+            "(B)": True
         }
         self.base_test("[[ ~[[a]], b]]", test_strings)
 
@@ -253,7 +259,8 @@ def test_exact_group_complex2(self):
             "(A, B, (C)), (A, B)": True,
             "(A, B), (A, B, (C))": True,
             "(A, B), (B, (C))": False,
-            "(B, (C)), (A, B, (C))": True
+            "(B, (C)), (A, B, (C))": True,
+            "(A, B, (A, (C)))": False
         }
         self.base_test("[[a, b, [[c]] ]]", test_strings)
 
diff --git a/tests/models/test_spreadsheet_input.py b/tests/models/test_spreadsheet_input.py
index 1a69b5b44..e768f2d55 100644
--- a/tests/models/test_spreadsheet_input.py
+++ b/tests/models/test_spreadsheet_input.py
@@ -6,6 +6,7 @@
 from hed.models import TabularInput, SpreadsheetInput, model_constants, Sidecar
 import shutil
 from hed import schema
+import pandas as pd
 
 
 # TODO: Add tests about correct handling of 'n/a'
@@ -159,7 +160,7 @@ def test_loading_and_reset_mapper(self):
             self.assertTrue(len(column_dict) == 5,
                             f"The column dictionary for row {row_number} should have the right length")
             column_dict2 = row_dict2["column_to_hed_tags"]
-            self.assertTrue(len(column_dict2) == 10,
+            self.assertTrue(len(column_dict2) == 0,
                             f"The reset column dictionary for row {row_number2} should have the right length")
 
     def test_no_column_header_and_convert(self):
@@ -197,6 +198,46 @@ def test_convert_short_long_with_definitions(self):
         for column1, column2 in zip(hed_input, hed_input_long):
             self.assertEqual(column1, column2)
 
+    def test_convert_short_long_with_definitions_new_style(self):
+        # Verify behavior works as expected even if definitions are present
+        events_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),
+                                   '../data/model_tests/no_column_header_definition.tsv')
+        hed_input = SpreadsheetInput(events_path, has_column_names=False, tag_columns=[1, 2],
+                                     hed_schema=self.hed_schema)
+        hed_input.convert_to_long()
+
+        events_path_long = os.path.join(os.path.dirname(os.path.realpath(__file__)),
+                                        '../data/model_tests/no_column_header_definition_long.tsv')
+        hed_input_long = SpreadsheetInput(events_path_long, has_column_names=False, tag_columns=[1, 2])
+        for column1, column2 in zip(hed_input, hed_input_long):
+            self.assertEqual(column1, column2)
+
+    def test_definitions_identified(self):
+        events_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),
+                                   '../data/model_tests/no_column_header_definition.tsv')
+        hed_input = SpreadsheetInput(events_path, has_column_names=False, tag_columns=[1, 2],
+                                     hed_schema=self.hed_schema)
+        def_entry = hed_input.def_dict['deftest1']
+        tag = def_entry.contents.tags()[0]
+        self.assertTrue(tag._schema_entry)
+        events_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),
+                                   '../data/model_tests/no_column_header_definition.tsv')
+        hed_input = SpreadsheetInput(events_path, has_column_names=False, tag_columns=[1, 2])
+        def_entry = hed_input.def_dict['deftest1']
+        tag = def_entry.contents.tags()[0]
+        self.assertFalse(tag._schema_entry)
+
+    def test_loading_dataframe_directly(self):
+        ds_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),
+                               '../data/model_tests/no_column_header_definition.tsv')
+        ds = pd.read_csv(ds_path, delimiter="\t", header=None)
+        hed_input = SpreadsheetInput(ds, has_column_names=False, tag_columns=[1, 2])
+
+        events_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),
+                                   '../data/model_tests/no_column_header_definition.tsv')
+        hed_input2 = SpreadsheetInput(events_path, has_column_names=False, tag_columns=[1, 2])
+        for column1, column2 in zip(hed_input, hed_input2):
+            self.assertEqual(column1, column2)
 
 
 if __name__ == '__main__':
diff --git a/tests/models/test_tabular_input.py b/tests/models/test_tabular_input.py
index 8ecc96a42..0d8d01738 100644
--- a/tests/models/test_tabular_input.py
+++ b/tests/models/test_tabular_input.py
@@ -2,7 +2,7 @@
 import os
 import shutil
 
-from hed.models import Sidecar, TabularInput
+from hed.models import DefinitionEntry, Sidecar, TabularInput
 from hed import schema
 from hed.validator import HedValidator
 from hed.errors import HedFileError
@@ -11,13 +11,43 @@
 class Test(unittest.TestCase):
     @classmethod
     def setUpClass(cls):
-        cls.base_output_folder = os.path.join(os.path.dirname(os.path.realpath(__file__)), "../data/tests_output/")
-        os.makedirs(cls.base_output_folder, exist_ok=True)
+        base_output_folder = os.path.join(os.path.dirname(os.path.realpath(__file__)), "../data/tests_output/")
+        os.makedirs(base_output_folder, exist_ok=True)
+
+        bids_root_path = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)),
+                                                       '../data/bids/eeg_ds003654s_hed'))
+        schema_path = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)),
+                                                    '../data/schema_test_data/HED8.0.0.xml'))
+        json_path = os.path.realpath(os.path.join(bids_root_path, 'task-FacePerception_events.json'))
+        events_path = os.path.realpath(os.path.join(bids_root_path,
+                                                    'sub-002/eeg/sub-002_task-FacePerception_run-1_events.tsv'))
+
+        cls.hed_schema = schema.load_schema(schema_path)
+        sidecar1 = Sidecar(json_path, name='face_sub1_json')
+        cls.input_data = TabularInput(events_path, sidecar=sidecar1, name="face_sub1_events")
+        cls.base_output_folder = base_output_folder
 
     @classmethod
     def tearDownClass(cls):
         shutil.rmtree(cls.base_output_folder)
 
+    def test_get_definitions(self):
+        defs1 = self.input_data.get_definitions().gathered_defs
+        self.assertIsInstance(defs1, dict, "get_definitions returns dictionary by default")
+        self.assertEqual(len(defs1), 17, "get_definitions should have the right number of definitions")
+        for key, value in defs1.items():
+            self.assertIsInstance(key, str, "get_definitions dictionary keys should be strings")
+            self.assertIsInstance(value, DefinitionEntry,
+                                  "get_definitions dict values should be strings when as strings")
+        defs2 = self.input_data.get_definitions(as_strings=False).gathered_defs
+        self.assertIsInstance(defs2, dict, "get_definitions returns dictionary by when not as strings")
+        self.assertEqual(len(defs2), 17, "get_definitions should have the right number of definitions when not strings")
+        for key, value in defs2.items():
+            self.assertIsInstance(key, str, "get_definitions dictionary keys should be strings")
+            self.assertIsInstance(value, DefinitionEntry,
+                                  "get_definitions dictionary values should be strings when as strings")
+        self.assertIsInstance(defs2, dict, "get_definitions returns DefinitionDict when not as strings")
+
     def test_missing_column_name_issue(self):
         schema_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),
                                    '../data/validator_tests/bids_schema.mediawiki')
@@ -33,7 +63,7 @@ def test_missing_column_name_issue(self):
         self.assertEqual(len(issues), 0)
         input_file = TabularInput(events_path, sidecar=sidecar)
 
-        validation_issues = input_file.validate_file_sidecars(validator)
+        validation_issues = input_file.validate_sidecar(validator)
         self.assertEqual(len(validation_issues), 0)
         validation_issues = input_file.validate_file(validator, check_for_warnings=True)
         self.assertEqual(len(validation_issues), 1)
@@ -54,19 +84,21 @@ def test_expand_column_issues(self):
         input_file = TabularInput(events_path, sidecar=sidecar)
 
         # Fix whatever is wrong with onset tag here.  It's thinking Description/Onset continues is an invalid tag???'
-        validation_issues = input_file.validate_file_sidecars(validator)
+        validation_issues = input_file.validate_sidecar(validator)
         self.assertEqual(len(validation_issues), 0)
         validation_issues = input_file.validate_file(validator, check_for_warnings=True)
         self.assertEqual(len(validation_issues), 1)
 
     def test_blank_and_duplicate_columns(self):
-        filepath = os.path.join(os.path.dirname(os.path.realpath(__file__)), "../data/model_tests/blank_column_name.tsv")
+        filepath = os.path.join(os.path.dirname(os.path.realpath(__file__)),
+                                "../data/model_tests/blank_column_name.tsv")
 
         with self.assertRaises(HedFileError):
             _ = TabularInput(filepath)
 
         # todo: add back in when we do this check
-        # filepath = os.path.join(os.path.dirname(os.path.realpath(__file__)), "../data/model_tests/duplicate_column_name.tsv")
+        # filepath = os.path.join(os.path.dirname(os.path.realpath(__file__)),
+        # "../data/model_tests/duplicate_column_name.tsv")
         #
         # with self.assertRaises(HedFileError):
         #     _ = TabularInput(filepath)
diff --git a/tests/schema/test_hed_schema.py b/tests/schema/test_hed_schema.py
index 2f58df42a..919b81645 100644
--- a/tests/schema/test_hed_schema.py
+++ b/tests/schema/test_hed_schema.py
@@ -266,6 +266,16 @@ def test_load_schema_version_libraries(self):
         s = schemas3._schemas[""]
         self.assertEqual(s.version, "8.0.0", "load_schema_version has the right version with prefix")
 
+        ver4 = ["ts:8.0.0", "sc:score_0.0.1"]
+        schemas4 = load_schema_version(ver4)
+        self.assertIsInstance(schemas4, HedSchemaGroup, "load_schema_version returns HedSchema version+prefix")
+        self.assertIsInstance(schemas4._schemas, dict, "load_schema_version group keeps dictionary of hed versions")
+        self.assertEqual(len(schemas4._schemas), 2, "load_schema_version group dictionary is right length")
+        s = schemas4._schemas["ts:"]
+        self.assertEqual(s.version, "8.0.0", "load_schema_version has the right version with prefix")
+        with self.assertRaises(KeyError):
+            s = schemas4._schemas[""]
+
     def test_load_schema_version_empty(self):
         schemas = load_schema_version("")
         self.assertIsInstance(schemas, HedSchema, "load_schema_version for empty string returns latest version")
diff --git a/tests/tools/analysis/test_analysis_util.py b/tests/tools/analysis/test_analysis_util.py
index c7eaade1a..57d7a92ac 100644
--- a/tests/tools/analysis/test_analysis_util.py
+++ b/tests/tools/analysis/test_analysis_util.py
@@ -2,8 +2,8 @@
 import unittest
 from pandas import DataFrame
 from hed import schema as hedschema
-from hed.models import Sidecar, TabularInput, HedString
-from hed.tools import assemble_hed, get_assembled_strings, search_tabular
+from hed.models import Sidecar, TabularInput
+from hed.tools import assemble_hed, search_tabular
 
 
 # noinspection PyBroadException
@@ -22,57 +22,9 @@ def setUpClass(cls):
 
         cls.hed_schema = hedschema.load_schema(schema_path)
         sidecar1 = Sidecar(json_path, name='face_sub1_json')
-        cls.sidecar = sidecar1
+        cls.sidecar_path = sidecar1
         cls.input_data = TabularInput(events_path, sidecar=sidecar1, name="face_sub1_events")
-
-    def test_get_assembled_strings_no_schema(self):
-        hed_list1, dict1 = get_assembled_strings(self.input_data, expand_defs=False)
-        self.assertIsInstance(hed_list1, list, "get_assembled_groups should return a list when expand defs is False")
-        self.assertIsInstance(hed_list1[0], HedString)
-        hed_strings1 = [str(hed) for hed in hed_list1]
-        self.assertIsInstance(hed_strings1[0], str, "get_assembled_strings can be converted.")
-        self.assertIsInstance(hed_strings1, list)
-        hed_strings_joined1 = ",".join(hed_strings1)
-        self.assertEqual(hed_strings_joined1.find("Def-expand/"), -1,
-                         "get_assembled_strings should not have Def-expand when expand_defs is False")
-        self.assertNotEqual(hed_strings_joined1.find("Def/"), -1,
-                            "get_assembled_strings should have Def/ when expand_defs is False")
-        hed_list2, dict2 = get_assembled_strings(self.input_data, expand_defs=True)
-        self.assertIsInstance(hed_list2, list, "get_assembled_groups should return a list")
-        self.assertIsInstance(hed_list2[0], HedString)
-        hed_strings2 = [str(hed) for hed in hed_list2]
-        self.assertIsInstance(hed_strings2[0], str, "get_assembled_strings can be converted.")
-        self.assertIsInstance(hed_strings2, list, "get_assembled")
-        hed_strings_joined2 = ",".join(hed_strings2)
-        self.assertNotEqual(hed_strings_joined2.find("Def-expand/"), -1,
-                            "get_assembled_strings should have Def-expand when expand_defs is True")
-        self.assertEqual(hed_strings_joined2.find("Def/"), -1,
-                         "get_assembled_strings should not have Def/ when expand_defs is True")
-
-    def test_get_assembled_strings_with_schema(self):
-        hed_list1, dict1 = get_assembled_strings(self.input_data, hed_schema=self.hed_schema, expand_defs=False)
-        self.assertIsInstance(hed_list1, list,
-                              "get_assembled_groups should return a list when expand defs is False")
-        self.assertIsInstance(hed_list1[0], HedString)
-        hed_strings1 = [str(hed) for hed in hed_list1]
-        self.assertIsInstance(hed_strings1[0], str, "get_assembled_strings can be converted.")
-        self.assertIsInstance(hed_strings1, list)
-        hed_strings_joined1 = ",".join(hed_strings1)
-        self.assertEqual(hed_strings_joined1.find("Def-expand/"), -1,
-                         "get_assembled_strings should not have Def-expand when expand_defs is False")
-        self.assertNotEqual(hed_strings_joined1.find("Def/"), -1,
-                            "get_assembled_strings should have Def/ when expand_defs is False")
-        hed_list2, dict2 = get_assembled_strings(self.input_data, hed_schema=self.hed_schema, expand_defs=True)
-        self.assertIsInstance(hed_list2, list, "get_assembled_groups should return a list")
-        self.assertIsInstance(hed_list2[0], HedString)
-        hed_strings2 = [str(hed) for hed in hed_list2]
-        self.assertIsInstance(hed_strings2[0], str, "get_assembled_strings can be converted.")
-        self.assertIsInstance(hed_strings2, list, "get_assembled")
-        hed_strings_joined2 = ",".join(hed_strings2)
-        self.assertNotEqual(hed_strings_joined2.find("Def-expand/"), -1,
-                            "get_assembled_strings should have Def-expand when expand_defs is True")
-        self.assertEqual(hed_strings_joined2.find("Def/"), -1,
-                         "get_assembled_strings should not have Def/ when expand_defs is True")
+        cls.input_data_no_sidecar = TabularInput(events_path, name="face_sub1_events_no_sidecar")
 
     def test_assemble_hed(self):
         df1, dict1 = assemble_hed(self.input_data,
diff --git a/tests/tools/analysis/test_analysis_util_get_assembled_strings.py b/tests/tools/analysis/test_analysis_util_get_assembled_strings.py
new file mode 100644
index 000000000..b38ac6f39
--- /dev/null
+++ b/tests/tools/analysis/test_analysis_util_get_assembled_strings.py
@@ -0,0 +1,98 @@
+import os
+import unittest
+from hed import schema as hedschema
+from hed.models import TabularInput, HedString
+from hed.tools import get_assembled_strings
+
+
+# noinspection PyBroadException
+class Test(unittest.TestCase):
+
+    @classmethod
+    def setUpClass(cls):
+        bids_root_path = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)),
+                                          '../../data/bids/eeg_ds003654s_hed'))
+        schema_path = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)),
+                                       '../../data/schema_test_data/HED8.0.0.xml'))
+        cls.bids_root_path = bids_root_path
+        cls.json_path = os.path.realpath(os.path.join(bids_root_path, 'task-FacePerception_events.json'))
+        cls.events_path = os.path.realpath(os.path.join(bids_root_path,
+                                           'sub-002/eeg/sub-002_task-FacePerception_run-1_events.tsv'))
+        cls.hed_schema = hedschema.load_schema(schema_path)
+        # sidecar1 = Sidecar(self.json_path, name='face_sub1_json')
+        # cls.sidecar_path = sidecar1
+        # cls.input_data = TabularInput(events_path, sidecar=sidecar1, name="face_sub1_events")
+        # cls.input_data_no_sidecar = TabularInput(events_path, name="face_sub1_events_no_sidecar")
+
+    def test_get_assembled_strings_no_schema(self):
+        input_data = TabularInput(self.events_path, sidecar=self.json_path, name="face_sub1_events")
+        hed_list1 = get_assembled_strings(input_data, expand_defs=False)
+        self.assertIsInstance(hed_list1, list, "get_assembled_groups should return a list when expand defs is False")
+        self.assertIsInstance(hed_list1[0], HedString)
+        hed_strings1 = [str(hed) for hed in hed_list1]
+        self.assertIsInstance(hed_strings1[0], str, "get_assembled_strings can be converted.")
+        self.assertIsInstance(hed_strings1, list)
+        hed_strings_joined1 = ",".join(hed_strings1)
+        self.assertEqual(hed_strings_joined1.find("Def-expand/"), -1,
+                         "get_assembled_strings should not have Def-expand when expand_defs is False")
+        self.assertNotEqual(hed_strings_joined1.find("Def/"), -1,
+                            "get_assembled_strings should have Def/ when expand_defs is False")
+        hed_list2 = get_assembled_strings(input_data, expand_defs=True)
+        self.assertIsInstance(hed_list2, list, "get_assembled_groups should return a list")
+        self.assertIsInstance(hed_list2[0], HedString)
+        hed_strings2 = [str(hed) for hed in hed_list2]
+        self.assertIsInstance(hed_strings2[0], str, "get_assembled_strings can be converted.")
+        self.assertIsInstance(hed_strings2, list, "get_assembled")
+        hed_strings_joined2 = ",".join(hed_strings2)
+        self.assertNotEqual(hed_strings_joined2.find("Def-expand/"), -1,
+                            "get_assembled_strings should have Def-expand when expand_defs is True")
+        self.assertEqual(hed_strings_joined2.find("Def/"), -1,
+                         "get_assembled_strings should not have Def/ when expand_defs is True")
+
+    def test_get_assembled_strings_with_schema(self):
+        input_data = TabularInput(self.events_path, sidecar=self.json_path, name="face_sub1_events")
+        hed_list1 = get_assembled_strings(input_data, hed_schema=self.hed_schema, expand_defs=False)
+        self.assertIsInstance(hed_list1, list,
+                              "get_assembled_groups should return a list when expand defs is False")
+        self.assertIsInstance(hed_list1[0], HedString)
+        hed_strings1 = [str(hed) for hed in hed_list1]
+        self.assertIsInstance(hed_strings1[0], str, "get_assembled_strings can be converted.")
+        self.assertIsInstance(hed_strings1, list)
+        hed_strings_joined1 = ",".join(hed_strings1)
+        self.assertEqual(hed_strings_joined1.find("Def-expand/"), -1,
+                         "get_assembled_strings should not have Def-expand when expand_defs is False")
+        self.assertNotEqual(hed_strings_joined1.find("Def/"), -1,
+                            "get_assembled_strings should have Def/ when expand_defs is False")
+        hed_list2 = get_assembled_strings(input_data, hed_schema=self.hed_schema, expand_defs=True)
+        self.assertIsInstance(hed_list2, list, "get_assembled_groups should return a list")
+        self.assertIsInstance(hed_list2[0], HedString)
+        hed_strings2 = [str(hed) for hed in hed_list2]
+        self.assertIsInstance(hed_strings2[0], str, "get_assembled_strings can be converted.")
+        self.assertIsInstance(hed_strings2, list, "get_assembled")
+        hed_strings_joined2 = ",".join(hed_strings2)
+        self.assertNotEqual(hed_strings_joined2.find("Def-expand/"), -1,
+                            "get_assembled_strings should have Def-expand when expand_defs is True")
+        self.assertEqual(hed_strings_joined2.find("Def/"), -1,
+                         "get_assembled_strings should not have Def/ when expand_defs is True")
+
+    def test_get_assembled_strings_no_hed(self):
+        input_data_no_sidecar = TabularInput(self.events_path, name="face_sub1_events")
+        hed_list1 = get_assembled_strings(input_data_no_sidecar, expand_defs=False)
+        self.assertEqual(len(hed_list1), 200,
+                         "get_assembled_strings should have right number of entries when no sidecar")
+        self.assertIsInstance(hed_list1[0], HedString,
+                              "get_assembled_string should return an HedString when no sidecar")
+        self.assertFalse(hed_list1[0].children, "get_assembled_string returned HedString is empty when no sidecar")
+
+        input_data_no_sidecar_with_schema = TabularInput(self.events_path, hed_schema=self.hed_schema,
+                                                         name="face_sub1_events")
+        hed_list2 = get_assembled_strings(input_data_no_sidecar_with_schema, expand_defs=False)
+        self.assertEqual(len(hed_list2), 200,
+                         "get_assembled_strings should have right number of entries when no sidecar")
+        self.assertIsInstance(hed_list2[0], HedString,
+                              "get_assembled_string should return an HedString when no sidecar")
+        self.assertFalse(hed_list1[0].children, "get_assembled_string returned HedString is empty when no sidecar")
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/tests/tools/analysis/test_annotation_util.py b/tests/tools/analysis/test_annotation_util.py
index ad77b6e80..a9902feeb 100644
--- a/tests/tools/analysis/test_annotation_util.py
+++ b/tests/tools/analysis/test_annotation_util.py
@@ -5,11 +5,11 @@
 from pandas import DataFrame
 from hed import schema as hedschema
 from hed.models import Sidecar
-from hed.tools import BidsTabularSummary, check_df_columns, df_to_hed, extract_tags, hed_to_df, merge_hed_dict
+from hed.tools import TabularSummary, check_df_columns, df_to_hed, extract_tags, hed_to_df, merge_hed_dict
 from hed.tools.analysis.annotation_util import _find_last_pos, _find_first_pos, \
     _flatten_cat_col, _flatten_val_col, _get_value_entry, trim_back, trim_front, _tag_list_to_str, _update_cat_dict, \
     generate_sidecar_entry
-from hed.util import get_file_list
+from hed.tools import get_file_list
 from hed.validator import HedValidator
 
 
@@ -256,7 +256,7 @@ def test_merge_hed_dict_full(self):
         value_columns = ["rep_lag", "stim_file", "value"]
         event_files = get_file_list(self.bids_root_path, extensions=[".tsv"], name_suffix="_events",
                                     exclude_dirs=exclude_dirs)
-        value_sum = BidsTabularSummary(value_cols=value_columns, skip_cols=skip_columns)
+        value_sum = TabularSummary(value_cols=value_columns, skip_cols=skip_columns)
         value_sum.update(event_files)
         sidecar_template = value_sum.extract_sidecar_template()
         example_spreadsheet = hed_to_df(sidecar_template)
diff --git a/tests/tools/analysis/test_definition_summary.py b/tests/tools/analysis/test_definition_summary.py
deleted file mode 100644
index 5acb0fc5a..000000000
--- a/tests/tools/analysis/test_definition_summary.py
+++ /dev/null
@@ -1,25 +0,0 @@
-import os
-import unittest
-from hed.models.sidecar import Sidecar
-from hed.tools.bids.bids_sidecar_file import BidsSidecarFile
-
-
-class Test(unittest.TestCase):
-
-    @classmethod
-    def setUpClass(cls):
-        cls.test_json = os.path.join(os.path.dirname(os.path.realpath(__file__)),
-                                     '../../data/bids/eeg_ds003654s_hed/task-FacePerception_events.json')
-
-    def test_constructor(self):
-        sidecar1 = BidsSidecarFile(self.test_json)
-        self.assertEqual(sidecar1.suffix, 'events', "BidsSidecarFile should have correct name_suffix")
-        self.assertEqual(sidecar1.ext, '.json', "BidsSidecarFile should have correct ext")
-        self.assertEqual(len(sidecar1.entity_dict), 1, "BidsSidecarFile should have right number of entity_dict")
-        self.assertFalse(sidecar1.contents, "BidsSidecarFile should not have contents on construction.")
-        sidecar1.set_contents()
-        self.assertIsInstance(sidecar1.contents, Sidecar, "BidsSidecarFile should contain a Sidecar after set_contents")
-
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/tests/tools/analysis/test_file_dictionary.py b/tests/tools/analysis/test_file_dictionary.py
index c7821ea9b..325a1e9ca 100644
--- a/tests/tools/analysis/test_file_dictionary.py
+++ b/tests/tools/analysis/test_file_dictionary.py
@@ -2,8 +2,8 @@
 import os
 
 from hed.errors.exceptions import HedFileError
-from hed.tools import FileDictionary
-from hed.util import get_file_list
+from hed.tools import FileDictionary, get_file_list
+
 
 
 class Test(unittest.TestCase):
@@ -21,14 +21,8 @@ def test_constructor_valid(self):
     def test_constructor_invalid(self):
         file_list = get_file_list(self.bids_base_dir, name_suffix="_events",
                                   extensions=['.tsv'], exclude_dirs=['stimuli'])
-        try:
+        with self.assertRaises(HedFileError):
             dict1 = FileDictionary("My name", file_list, key_indices=(0, 1))
-        except HedFileError:
-            pass
-        except Exception:
-            self.fail("FileDictionary threw the wrong exception when duplicate key")
-        else:
-            self.fail("FileDictionary should have thrown a HedFileError when duplicate key")
 
 
 if __name__ == '__main__':
diff --git a/tests/tools/analysis/test_hed_context_manager.py b/tests/tools/analysis/test_hed_context_manager.py
new file mode 100644
index 000000000..0bd25764a
--- /dev/null
+++ b/tests/tools/analysis/test_hed_context_manager.py
@@ -0,0 +1,68 @@
+import os
+import unittest
+from hed import HedString, load_schema_version, Sidecar, TabularInput
+from hed.models import HedGroup
+from hed.errors import HedFileError
+from hed.tools import HedContextManager, get_assembled_strings
+
+
+class Test(unittest.TestCase):
+
+    @classmethod
+    def setUpClass(cls):
+        schema = load_schema_version(xml_version="8.1.0")
+        cls.test_strings1 = [HedString('Sensory-event,(Def/Cond1,(Red, Blue),Onset),(Def/Cond2,Onset),Green,Yellow',
+                                       hed_schema=schema),
+                             HedString('(Def/Cond1, Offset)', hed_schema=schema),
+                             HedString('White, Black', hed_schema=schema),
+                             HedString('', hed_schema=schema),
+                             HedString('(Def/Cond2, Onset)', hed_schema=schema),
+                             HedString('(Def/Cond3/1.3, Onset)', hed_schema=schema),
+                             HedString('Arm, Leg', hed_schema=schema)]
+        cls.test_strings2 = [HedString('(Def/Cond3/2, Offset)', hed_schema=schema)]
+        cls.test_strings3 = [HedString(f"Def/Cond2, (Def/Cond6/4, Onset), (Def/Cond6/7.8, Onset), Def/Cond6/Alpha",
+                                       hed_schema=schema),
+                             HedString("Yellow", hed_schema=schema),
+                             HedString("Def/Cond2, (Def/Cond6/4, Onset)", hed_schema=schema),
+                             HedString("Def/Cond2, Def/Cond6/5.2 (Def/Cond6/7.8, Offset)", hed_schema=schema),
+                             HedString("Def/Cond2, Def/Cond6/4", hed_schema=schema)]
+
+        bids_root_path = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)),
+                                          '../../data/bids/eeg_ds003654s_hed'))
+        events_path = os.path.realpath(os.path.join(bids_root_path,
+                                                    'sub-002/eeg/sub-002_task-FacePerception_run-1_events.tsv'))
+        sidecar_path = os.path.realpath(os.path.join(bids_root_path, 'task-FacePerception_events.json'))
+        sidecar1 = Sidecar(sidecar_path, name='face_sub1_json')
+        cls.input_data = TabularInput(events_path, sidecar=sidecar1, name="face_sub1_events")
+        cls.schema = schema
+
+    def test_constructor(self):
+        manager1 = HedContextManager(self.test_strings1, self.schema)
+        self.assertIsInstance(manager1, HedContextManager, "The constructor should create an HedContextManager")
+        self.assertEqual(len(manager1.hed_strings), 7, "The constructor should have the right number of strings")
+        self.assertEqual(len(manager1.onset_list), 4, "The constructor should have right length onset list")
+        self.assertIsInstance(manager1.hed_strings[1], HedString, "Constructor hed string should be a hedstring")
+        self.assertFalse(manager1.hed_strings[1].children, "When no tags list HedString is empty")
+        context = manager1.contexts
+        self.assertIsInstance(context, list, "The constructor event contexts should be a list")
+        self.assertIsInstance(context[1][0], HedGroup, "The constructor event contexts has a correct element")
+
+    def test_constructor_from_assembled(self):
+        hed_strings = get_assembled_strings(self.input_data, hed_schema=self.schema, expand_defs=False)
+        manager1 = HedContextManager(hed_strings, self.schema)
+        self.assertEqual(len(manager1.hed_strings), 200,
+                         "The constructor for assembled strings has expected # of strings")
+        self.assertEqual(len(manager1.onset_list), 261,
+                         "The constructor for assembled strings has onset_list of correct length")
+
+    def test_constructor_unmatched(self):
+        with self.assertRaises(HedFileError):
+            HedContextManager(self.test_strings2, self.schema)
+
+    def test_constructor_multiple_values(self):
+        manager = HedContextManager(self.test_strings3, self.schema)
+        self.assertEqual(len(manager.onset_list), 3, "Constructor should have right number of onsets")
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/tests/tools/analysis/test_hed_definition_manager.py b/tests/tools/analysis/test_hed_definition_manager.py
new file mode 100644
index 000000000..d861d0346
--- /dev/null
+++ b/tests/tools/analysis/test_hed_definition_manager.py
@@ -0,0 +1,120 @@
+import os
+import unittest
+from hed import HedString, HedTag, load_schema_version, Sidecar, TabularInput
+from hed.models import DefinitionEntry
+from hed.tools import HedDefinitionManager
+
+
+class Test(unittest.TestCase):
+
+    @classmethod
+    def setUpClass(cls):
+        schema = load_schema_version(xml_version="8.1.0")
+        cls.test_strings1 = [HedString('Sensory-event,(Def/Cond1,(Red, Blue),Onset),(Def/Cond2,Onset),Green,Yellow',
+                                       hed_schema=schema),
+                             HedString('(Def/Cond1, Offset)', hed_schema=schema),
+                             HedString('White, Black, Condition-variable/Wonder, Condition-variable/Fast',
+                                       hed_schema=schema),
+                             HedString('', hed_schema=schema),
+                             HedString('(Def/Cond2, Onset)', hed_schema=schema),
+                             HedString('(Def/Cond3/4.3, Onset)', hed_schema=schema),
+                             HedString('Arm, Leg, Condition-variable/Fast', hed_schema=schema)]
+
+        # def1 = HedString('(Condition-variable/Var1, Circle, Square)', hed_schema=schema)
+        # def2 = HedString('(condition-variable/Var2, Condition-variable/Apple, Triangle, Sphere)', hed_schema=schema)
+        # def3 = HedString('(Organizational-property/Condition-variable/Var3, Physical-length/#, Ellipse, Cross)',
+        #                  hed_schema=schema)
+        # def4 = HedString('(Condition-variable, Apple, Banana)', hed_schema=schema)
+        # cls.definitions1 = {'cond1': DefinitionEntry('Cond1', def1, False, None),
+        #                     'cond2': DefinitionEntry('Cond2', def2, False, None),
+        #                     'cond3': DefinitionEntry('Cond3', def3, True, None),
+        #                     'cond4': DefinitionEntry('Cond4', def4, False, None)}
+
+        def1 = HedString('(Condition-variable/Var1, Circle, Square)', hed_schema=schema)
+        def2 = HedString('(condition-variable/Var2, Condition-variable/Apple, Triangle, Sphere)', hed_schema=schema)
+        def3 = HedString('(Organizational-property/Condition-variable/Var3, Physical-length/#, Ellipse, Cross)',
+                         hed_schema=schema)
+        def4 = HedString('(Condition-variable, Apple, Banana)', hed_schema=schema)
+        def5 = HedString('(Condition-variable/Lumber, Apple, Banana)', hed_schema=schema)
+        def6 = HedString('(Condition-variable/Lumber, Label/#, Apple, Banana)', hed_schema=schema)
+        cls.definitions1 = {'Cond1': DefinitionEntry('Cond1', def1, False, None),
+                            'Cond2': DefinitionEntry('Cond2', def2, False, None),
+                            'Cond3': DefinitionEntry('Cond3', def3, True, None),
+                            'Cond4': DefinitionEntry('Cond4', def4, False, None),
+                            'Cond5': DefinitionEntry('Cond5', def5, False, None),
+                            'Cond6': DefinitionEntry('Cond6', def6, True, None)
+                            }
+        bids_root_path = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)),
+                                          '../../data/bids/eeg_ds003654s_hed'))
+        events_path = os.path.realpath(os.path.join(bids_root_path,
+                                                    'sub-002/eeg/sub-002_task-FacePerception_run-1_events.tsv'))
+        sidecar_path = os.path.realpath(os.path.join(bids_root_path, 'task-FacePerception_events.json'))
+        sidecar1 = Sidecar(sidecar_path, name='face_sub1_json')
+        cls.input_data = TabularInput(events_path, sidecar=sidecar1, name="face_sub1_events")
+        cls.schema = schema
+
+    def test_constructor(self):
+        def_man = HedDefinitionManager(self.definitions1, self.schema)
+        self.assertIsInstance(def_man, HedDefinitionManager,
+                              "Constructor should create a HedDefinitionManager directly from a dict")
+        self.assertEqual(len(def_man.variable_map), 6, "Constructor condition_map should have the right length")
+        self.assertEqual(len(def_man.variable_map), len(def_man.definitions),
+                         "Constructor condition_map should be the same length as the definitions dictionary")
+
+    def test_constructor_from_tabular_input(self):
+        definitions = self.input_data.get_definitions(as_strings=False).gathered_defs
+        def_man = HedDefinitionManager(definitions, self.schema)
+        self.assertIsInstance(def_man, HedDefinitionManager,
+                              "Constructor should create a HedDefinitionManager from a tabular input")
+        self.assertEqual(len(def_man.variable_map), 17, "Constructor condition_map should have the right length")
+        self.assertEqual(len(def_man.variable_map), len(def_man.definitions),
+                         "Constructor condition_map should be the same length as the definitions dictionary")
+
+    def test_get_vars(self):
+        def_man = HedDefinitionManager(self.definitions1, self.schema)
+        item1 = HedString(f"Sensory-event,((Red,Blue)),", self.schema)
+        vars1 = def_man.get_vars(item1)
+        self.assertFalse(vars1, "get_vars should return None if no condition type_variables")
+        item2 = HedString(f"Sensory-event,(Def/Cond1,(Red,Blue,Condition-variable/Trouble))", self.schema)
+        vars2 = def_man.get_vars(item2)
+        self.assertEqual(len(vars2), 1, "get_vars should return correct number of condition type_variables")
+        item3 = HedString(f"Sensory-event,(Def/Cond1,(Red,Blue,Condition-variable/Trouble)),"
+                          f"(Def/Cond2),Green,Yellow,Def/Cond5, Def/Cond6/4", self.schema)
+        vars3 = def_man.get_vars(item3)
+        self.assertEqual(len(vars3), 5, "get_vars should return multiple condition type_variables")
+
+    def test_get_def_names(self):
+        def_man = HedDefinitionManager(self.definitions1, self.schema)
+        a = def_man.get_def_names(HedTag('Def/Cond3/4', hed_schema=self.schema))
+        self.assertEqual(len(a), 1, "get_def_names returns 1 item if single tag")
+        self.assertEqual(a[0], 'cond3', "get_def_names returns the correct item if single tag")
+        b = def_man.get_def_names(HedTag('Def/Cond3/4', hed_schema=self.schema), no_value=False)
+        self.assertEqual(len(b), 1, "get_def_names returns 1 item if single tag")
+        self.assertEqual(b[0], 'cond3/4', "get_def_names returns the correct item if single tag")
+        c = def_man.get_def_names(HedString('(Def/Cond3/5,(Red, Blue))', hed_schema=self.schema))
+        self.assertEqual(len(c), 1, "get_def_names returns 1 item if single group def")
+        self.assertEqual(c[0], 'cond3', "get_def_names returns the correct item if single group def")
+        d = def_man.get_def_names(HedString('(Def/Cond3/6,(Red, Blue, Def/Cond1), Def/Cond2)', hed_schema=self.schema),
+                                  no_value=False)
+        self.assertEqual(len(d), 3, "get_def_names returns right number of items if multiple defs")
+        self.assertEqual(d[0], 'cond3/6', "get_def_names returns the correct item if multiple def")
+        e = def_man.get_def_names(HedString('((Red, Blue, (Green), Black))'))
+        self.assertFalse(e, "get_def_names returns no items if no defs")
+
+    def test_split_name(self):
+        name1, val1 = HedDefinitionManager.split_name('')
+        self.assertIsNone(name1, "split_name should return None split name for empty name")
+        self.assertIsNone(val1, "split_name should return None split value for empty name")
+        name2, val2 = HedDefinitionManager.split_name('lumber')
+        self.assertEqual(name2, 'lumber', 'split_name should return name if no split value')
+        self.assertEqual(val2, '', 'split_name should return empty string if no split value')
+        name3, val3 = HedDefinitionManager.split_name('Lumber/5.23', lowercase=False)
+        self.assertEqual(name3, 'Lumber', 'split_name should return name if split value')
+        self.assertEqual(val3, '5.23', 'split_name should return value as string if split value')
+        name4, val4 = HedDefinitionManager.split_name('Lumber/5.23')
+        self.assertEqual(name4, 'lumber', 'split_name should return name if split value')
+        self.assertEqual(val4, '5.23', 'split_name should return value as string if split value')
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/tests/tools/analysis/test_hed_filters.py b/tests/tools/analysis/test_hed_filters.py
new file mode 100644
index 000000000..9d32ba428
--- /dev/null
+++ b/tests/tools/analysis/test_hed_filters.py
@@ -0,0 +1,81 @@
+import os
+import unittest
+from hed import HedString, load_schema_version, Sidecar, TabularInput
+from hed.models import DefinitionEntry
+from hed.tools.analysis.hed_filters import RemoveTagsFilter
+
+
+class Test(unittest.TestCase):
+    @classmethod
+    def setUpClass(cls):
+        curation_base_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../../data/curation')
+        bids_root_path = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)),
+                                          '../../data/bids/eeg_ds003654s_hed'))
+        schema_path = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)),
+                                       '../../data/schema_test_data/HED8.0.0.xml'))
+        schema = load_schema_version(xml_version="8.1.0")
+        cls.test_strings1 = [HedString(f"Sensory-event,(Def/Cond1,(Red, Blue, Condition-variable/Trouble),Onset),"
+                                       f"(Def/Cond2,Onset),Green,Yellow, Def/Cond5, Def/Cond6/4, Def/Other",
+                                       hed_schema=schema),
+                             HedString('(Def/Cond1, Offset)', hed_schema=schema),
+                             HedString('White, Black, Condition-variable/Wonder, Condition-variable/Fast',
+                                       hed_schema=schema),
+                             HedString('', hed_schema=schema),
+                             HedString('(Def/Cond2, Onset), Def/Other, ', hed_schema=schema),
+                             HedString('(Def/Cond3/4.3, Onset)', hed_schema=schema),
+                             HedString('Arm, Leg, Condition-variable/Fast', hed_schema=schema)]
+        cls.test_strings2 = [HedString(f"Def/Cond2, (Def/Cond6/4, Onset), (Def/Cond6/7.8, Onset), Def/Cond6/Alpha",
+                                       hed_schema=schema),
+                             HedString("Yellow", hed_schema=schema),
+                             HedString("Def/Cond2, (Def/Cond6/4, Onset)", hed_schema=schema),
+                             HedString("Def/Cond2, Def/Cond6/5.2 (Def/Cond6/7.8, Offset)", hed_schema=schema),
+                             HedString("Def/Cond2, Def/Cond6/4", hed_schema=schema)]
+
+        def1 = HedString('(Condition-variable/Var1, Circle, Square)', hed_schema=schema)
+        def2 = HedString('(condition-variable/Var2, Condition-variable/Apple, Triangle, Sphere)', hed_schema=schema)
+        def3 = HedString('(Organizational-property/Condition-variable/Var3, Physical-length/#, Ellipse, Cross)',
+                         hed_schema=schema)
+        def4 = HedString('(Condition-variable, Apple, Banana)', hed_schema=schema)
+        def5 = HedString('(Condition-variable/Lumber, Apple, Banana)', hed_schema=schema)
+        def6 = HedString('(Condition-variable/Lumber, Label/#, Apple, Banana)', hed_schema=schema)
+        def7 = HedString('(Label/#, Apple, Banana)', hed_schema=schema)
+        cls.defs = {'Cond1': DefinitionEntry('Cond1', def1, False, None),
+                    'Cond2': DefinitionEntry('Cond2', def2, False, None),
+                    'Cond3': DefinitionEntry('Cond3', def3, True, None),
+                    'Cond4': DefinitionEntry('Cond4', def4, False, None),
+                    'Cond5': DefinitionEntry('Cond5', def5, False, None),
+                    'Cond6': DefinitionEntry('Cond6', def6, True, None),
+                    'Other': DefinitionEntry('Other', def7, False, None)
+                    }
+
+        cls.dlist = \
+            ['(Definition/Cond1, (Condition-variable/Var1, Circle, Square))',
+             '(Definition/Cond2, (condition-variable/Var2, Condition-variable/Apple, Triangle, Sphere))',
+             '(Definition/Cond3, (Organizational-property/Condition-variable/Var3, Physical-length/#, Ellipse, Cross))',
+             '(Definition/Cond4, (Condition-variable, Apple, Banana))',
+             '(Definition/Cond5, (Condition-variable/Lumber, Apple, Banana))',
+             '(Definition/Cond6, (Condition-variable/Lumber, Label/#, Apple, Banana))',
+             '(Definition/Cond6, (Label/#, Apple, Banana))']
+
+        cls.string1 = f"Sensory-event,(Def/Cond1,(Red, Blue, Condition-variable/Trouble),Onset)," + \
+                      f"(Def/Cond2,Onset),Green,Yellow, Def/Cond5, Def/Cond6/4, Def/Other"
+        bids_root_path = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)),
+                                          '../../data/bids/eeg_ds003654s_hed'))
+        events_path = os.path.realpath(os.path.join(bids_root_path,
+                                                    'sub-002/eeg/sub-002_task-FacePerception_run-1_events.tsv'))
+        sidecar_path = os.path.realpath(os.path.join(bids_root_path, 'task-FacePerception_events.json'))
+        sidecar1 = Sidecar(sidecar_path, name='face_sub1_json')
+        cls.input_data = TabularInput(events_path, sidecar=sidecar1, name="face_sub1_events")
+        cls.hed_schema = schema
+
+    def test_remove_tags_filter(self):
+        filter1 = RemoveTagsFilter(["Definition"], remove_option="all")
+        definitions = (',').join(self.dlist)
+        hed1 = HedString(definitions, hed_schema=self.hed_schema)
+        self.assertTrue(hed1.children, "remove_tags_filter test string before is not empty")
+        filter1.remove_tags(hed1)
+        self.assertFalse(hed1.children, "remove_tags_filter test after is empty")
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/tests/tools/analysis/test_hed_type_factors.py b/tests/tools/analysis/test_hed_type_factors.py
new file mode 100644
index 000000000..7e3742529
--- /dev/null
+++ b/tests/tools/analysis/test_hed_type_factors.py
@@ -0,0 +1,144 @@
+import os
+import unittest
+import pandas as pd
+from hed import HedString, load_schema_version, Sidecar, TabularInput
+from hed.errors import HedFileError
+from hed.models import DefinitionEntry
+from hed.tools import HedContextManager, HedTypeVariable, HedTypeFactors, get_assembled_strings
+
+
+class Test(unittest.TestCase):
+    # TODO: Test different encodings
+
+    @classmethod
+    def setUpClass(cls):
+        schema = load_schema_version(xml_version="8.1.0")
+        cls.test_strings1 = [HedString(f"Sensory-event,(Def/Cond1,(Red, Blue, Condition-variable/Trouble),Onset),"
+                                       f"(Def/Cond2,Onset),Green,Yellow, Def/Cond5, Def/Cond6/4", hed_schema=schema),
+                             HedString('(Def/Cond1, Offset)', hed_schema=schema),
+                             HedString('White, Black, Condition-variable/Wonder, Condition-variable/Fast',
+                                       hed_schema=schema),
+                             HedString('', hed_schema=schema),
+                             HedString('(Def/Cond2, Onset)', hed_schema=schema),
+                             HedString('(Def/Cond3/4.3, Onset)', hed_schema=schema),
+                             HedString('Arm, Leg, Condition-variable/Fast', hed_schema=schema)]
+        cls.test_strings2 = [HedString(f"Def/Cond2, (Def/Cond6/4, Onset), (Def/Cond6/7.8, Onset), Def/Cond6/Alpha",
+                                       hed_schema=schema),
+                             HedString("Yellow", hed_schema=schema),
+                             HedString("Def/Cond2, (Def/Cond6/4, Onset)", hed_schema=schema),
+                             HedString("Def/Cond2, Def/Cond6/5.2 (Def/Cond6/7.8, Offset)", hed_schema=schema),
+                             HedString("Def/Cond2, Def/Cond6/4", hed_schema=schema)]
+
+        def1 = HedString('(Condition-variable/Var1, Circle, Square)', hed_schema=schema)
+        def2 = HedString('(condition-variable/Var2, Condition-variable/Apple, Triangle, Sphere)', hed_schema=schema)
+        def3 = HedString('(Organizational-property/Condition-variable/Var3, Physical-length/#, Ellipse, Cross)',
+                         hed_schema=schema)
+        def4 = HedString('(Condition-variable, Apple, Banana)', hed_schema=schema)
+        def5 = HedString('(Condition-variable/Lumber, Apple, Banana)', hed_schema=schema)
+        def6 = HedString('(Condition-variable/Lumber, Label/#, Apple, Banana)', hed_schema=schema)
+        cls.defs = {'Cond1': DefinitionEntry('Cond1', def1, False, None),
+                    'Cond2': DefinitionEntry('Cond2', def2, False, None),
+                    'Cond3': DefinitionEntry('Cond3', def3, True, None),
+                    'Cond4': DefinitionEntry('Cond4', def4, False, None),
+                    'Cond5': DefinitionEntry('Cond5', def5, False, None),
+                    'Cond6': DefinitionEntry('Cond6', def6, True, None)
+                    }
+
+        cls.test_strings3 = [HedString('(Def/Cond3, Offset)', hed_schema=schema)]
+
+        bids_root_path = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)),
+                                          '../../data/bids/eeg_ds003654s_hed'))
+        events_path = os.path.realpath(os.path.join(bids_root_path,
+                                                    'sub-002/eeg/sub-002_task-FacePerception_run-1_events.tsv'))
+        sidecar_path = os.path.realpath(os.path.join(bids_root_path, 'task-FacePerception_events.json'))
+        sidecar1 = Sidecar(sidecar_path, name='face_sub1_json')
+        cls.input_data = TabularInput(events_path, sidecar=sidecar1, name="face_sub1_events")
+        cls.schema = schema
+
+    def test_constructor(self):
+        var_manager = HedTypeVariable(HedContextManager(self.test_strings1, self.schema), self.schema, self.defs)
+        var1_summary = var_manager.get_variable('var1')
+        self.assertIsInstance(var1_summary, HedTypeFactors)
+
+    def test_constructor_from_tabular_input(self):
+        test_strings1 = get_assembled_strings(self.input_data, hed_schema=self.schema, expand_defs=False)
+        definitions = self.input_data.get_definitions(as_strings=False).gathered_defs
+        var_manager = HedTypeVariable(HedContextManager(test_strings1, self.schema), self.schema, definitions)
+        self.assertIsInstance(var_manager, HedTypeVariable,
+                              "Constructor should create a HedVariableManager from a tabular input")
+        var_sum = var_manager.get_variable('face-type')
+        self.assertIsInstance(var_sum, HedTypeFactors)
+
+    def test_constructor_multiple_values(self):
+        var_manager = HedTypeVariable(HedContextManager(self.test_strings2, self.schema), self.schema, self.defs)
+        self.assertIsInstance(var_manager, HedTypeVariable,
+                              "Constructor should create a HedVariableManager from strings")
+        self.assertEqual(len(var_manager._variable_map), 3,
+                         "Constructor should have right number of type_variables if multiple")
+        var_sum = var_manager.get_variable('var2')
+        self.assertIsInstance(var_sum, HedTypeFactors)
+
+    def test_constructor_unmatched(self):
+        with self.assertRaises(HedFileError):
+            HedTypeVariable(HedContextManager(self.test_strings3, self.schema), self.schema, self.defs)
+
+    def test_variable_summary(self):
+        var_manager = HedTypeVariable(HedContextManager(self.test_strings2, self.schema), self.schema, self.defs)
+        self.assertIsInstance(var_manager, HedTypeVariable,
+                              "Constructor should create a HedVariableManager from strings")
+        self.assertEqual(len(var_manager._variable_map), 3,
+                         "Constructor should have right number of type_variables if multiple")
+        for variable in var_manager.get_variable_names():
+            var_sum = var_manager.get_variable(variable)
+            summary = var_sum.get_summary()
+            self.assertIsInstance(summary, dict, "get_summary returns a dictionary summary")
+
+    def test_get_variable_factors(self):
+        var_manager = HedTypeVariable(HedContextManager(self.test_strings2, self.schema), self.schema, self.defs)
+        self.assertIsInstance(var_manager, HedTypeVariable,
+                              "Constructor should create a HedVariableManager from strings")
+        self.assertEqual(len(var_manager._variable_map), 3,
+                         "Constructor should have right number of type_variables if multiple")
+
+        for variable in var_manager.get_variable_names():
+            var_sum = var_manager.get_variable(variable)
+            summary = var_sum.get_summary()
+            factors = var_sum.get_factors()
+            self.assertIsInstance(factors, pd.DataFrame, "get_factors contains dataframe.")
+            self.assertEqual(len(factors), var_sum.number_elements,
+                             "get_factors has factors of same length as number of elements")
+            self.assertEqual(len(factors.columns), summary["levels"] + 1,
+                             'get_factors has factors levels + 1 (direct references)')
+
+    def test_count_events(self):
+        list1 = [0, 2, 6, 1, 2, 0, 0]
+        number_events1, number_multiple1, max_multiple1 = HedTypeFactors.count_events(list1)
+        self.assertEqual(number_events1, 4, "count_events should have right number of events")
+        self.assertEqual(number_multiple1, 3, "count_events should have right number of multiple events")
+        self.assertEqual(max_multiple1, 6, "count_events should have right maximum multiples")
+        list2 = []
+        number_events2, number_multiple2, max_multiple2 = HedTypeFactors.count_events(list2)
+        self.assertEqual(number_events2, 0, "count_events should have 0 events for empty list")
+        self.assertEqual(number_multiple2, 0, "count_events should have 0 multiples for empty list")
+        self.assertIsNone(max_multiple2, "count_events should not have a max multiple for empty list")
+
+    def test_get_summary(self):
+        hed_strings = get_assembled_strings(self.input_data, hed_schema=self.schema, expand_defs=False)
+        definitions = self.input_data.get_definitions(as_strings=False).gathered_defs
+        var_manager = HedTypeVariable(HedContextManager(hed_strings, self.schema), self.schema, definitions)
+        var_key = var_manager.get_variable('key-assignment')
+        sum_key = var_key.get_summary()
+        self.assertEqual(sum_key['number_type_events'], 200, "get_summary has right number of events")
+        self.assertEqual(sum_key['multiple_event_maximum'], 1, "Get_summary has right multiple maximum")
+        self.assertIsInstance(sum_key['level_counts'], dict, "get_summary level counts is a dictionary")
+        self.assertEqual(sum_key['level_counts']['right-sym-cond'], 200, "get_summary level counts value correct.")
+        var_face = var_manager.get_variable('face-type')
+        sum_key = var_face.get_summary()
+        self.assertEqual(sum_key['number_type_events'], 52, "get_summary has right number of events")
+        self.assertEqual(sum_key['multiple_event_maximum'], 1, "Get_summary has right multiple maximum")
+        self.assertIsInstance(sum_key['level_counts'], dict, "get_summary level counts is a dictionary")
+        self.assertEqual(sum_key['level_counts']['unfamiliar-face-cond'], 20, "get_summary level counts value correct.")
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/tests/tools/analysis/test_hed_type_variable.py b/tests/tools/analysis/test_hed_type_variable.py
new file mode 100644
index 000000000..2dd8f9764
--- /dev/null
+++ b/tests/tools/analysis/test_hed_type_variable.py
@@ -0,0 +1,133 @@
+import os
+import unittest
+from hed import HedString, HedTag, load_schema_version, Sidecar, TabularInput
+from hed.errors import HedFileError
+from hed.models import DefinitionEntry
+from hed.tools import HedTypeVariable, get_assembled_strings, HedContextManager
+
+
+class Test(unittest.TestCase):
+
+    @classmethod
+    def setUpClass(cls):
+        schema = load_schema_version(xml_version="8.1.0")
+        cls.test_strings1 = [f"Sensory-event,(Def/Cond1,(Red, Blue, Condition-variable/Trouble),Onset),"
+                             f"(Def/Cond2,Onset),Green,Yellow, Def/Cond5, Def/Cond6/4",
+                             '(Def/Cond1, Offset)',
+                             'White, Black, Condition-variable/Wonder, Condition-variable/Fast',
+                             '',
+                             '(Def/Cond2, Onset)',
+                             '(Def/Cond3/4.3, Onset)',
+                             'Arm, Leg, Condition-variable/Fast']
+        cls.test_strings2 = [f"Def/Cond2, (Def/Cond6/4, Onset), (Def/Cond6/7.8, Onset), Def/Cond6/Alpha",
+                             "Yellow",
+                             "Def/Cond2, (Def/Cond6/4, Onset)",
+                             "Def/Cond2, Def/Cond6/5.2 (Def/Cond6/7.8, Offset)",
+                             "Def/Cond2, Def/Cond6/4"]
+        cls.test_strings3 = ['(Def/Cond3, Offset)']
+
+        def1 = HedString('(Condition-variable/Var1, Circle, Square)', hed_schema=schema)
+        def2 = HedString('(condition-variable/Var2, Condition-variable/Apple, Triangle, Sphere)', hed_schema=schema)
+        def3 = HedString('(Organizational-property/Condition-variable/Var3, Physical-length/#, Ellipse, Cross)',
+                         hed_schema=schema)
+        def4 = HedString('(Condition-variable, Apple, Banana)', hed_schema=schema)
+        def5 = HedString('(Condition-variable/Lumber, Apple, Banana)', hed_schema=schema)
+        def6 = HedString('(Condition-variable/Lumber, Label/#, Apple, Banana)', hed_schema=schema)
+        cls.defs = {'Cond1': DefinitionEntry('Cond1', def1, False, None),
+                    'Cond2': DefinitionEntry('Cond2', def2, False, None),
+                    'Cond3': DefinitionEntry('Cond3', def3, True, None),
+                    'Cond4': DefinitionEntry('Cond4', def4, False, None),
+                    'Cond5': DefinitionEntry('Cond5', def5, False, None),
+                    'Cond6': DefinitionEntry('Cond6', def6, True, None)
+                    }
+
+        bids_root_path = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)),
+                                          '../../data/bids/eeg_ds003654s_hed'))
+        events_path = os.path.realpath(os.path.join(bids_root_path,
+                                                    'sub-002/eeg/sub-002_task-FacePerception_run-1_events.tsv'))
+        sidecar_path = os.path.realpath(os.path.join(bids_root_path, 'task-FacePerception_events.json'))
+        sidecar1 = Sidecar(sidecar_path, name='face_sub1_json')
+        cls.input_data = TabularInput(events_path, sidecar=sidecar1, name="face_sub1_events")
+        cls.hed_schema = schema
+
+    def test_constructor(self):
+        test_strings1 = [HedString(hed, hed_schema=self.hed_schema) for hed in self.test_strings1]
+        type_var = HedTypeVariable(HedContextManager(test_strings1, self.hed_schema), self.hed_schema, self.defs)
+        self.assertIsInstance(type_var, HedTypeVariable,
+                              "Constructor should create a HedTypeManager from strings")
+        self.assertEqual(len(type_var._variable_map), 8,
+                         "Constructor ConditionVariables should have the right length")
+
+    def test_constructor_from_tabular_input(self):
+        test_strings1 = get_assembled_strings(self.input_data, hed_schema=self.hed_schema, expand_defs=False)
+        definitions = self.input_data.get_definitions(as_strings=False).gathered_defs
+        var_manager = HedTypeVariable(HedContextManager(test_strings1, self.hed_schema), self.hed_schema, definitions)
+        self.assertIsInstance(var_manager, HedTypeVariable,
+                              "Constructor should create a HedVariableManager from a tabular input")
+
+    def test_constructor_variable_caps(self):
+        test_strings1 = get_assembled_strings(self.input_data, hed_schema=self.hed_schema, expand_defs=False)
+        definitions = self.input_data.get_definitions(as_strings=False).gathered_defs
+        var_manager = HedTypeVariable(HedContextManager(test_strings1, self.hed_schema), self.hed_schema,
+                                      definitions, variable_type="Condition-variable")
+        self.assertIsInstance(var_manager, HedTypeVariable,
+                              "Constructor should create a HedVariableManager variable caps")
+
+    def test_constructor_variable_task(self):
+        test_strings1 = get_assembled_strings(self.input_data, hed_schema=self.hed_schema, expand_defs=False)
+        definitions = self.input_data.get_definitions(as_strings=False).gathered_defs
+        var_manager = HedTypeVariable(HedContextManager(test_strings1, self.hed_schema), self.hed_schema,
+                                      definitions, variable_type="task")
+        self.assertIsInstance(var_manager, HedTypeVariable,
+                              "Constructor should create a HedVariableManager variable task")
+
+    def test_constructor_multiple_values(self):
+        test_strings1 = [HedString(hed, hed_schema=self.hed_schema) for hed in self.test_strings2]
+        var_manager = HedTypeVariable(HedContextManager(test_strings1, self.hed_schema), self.hed_schema, self.defs)
+        self.assertIsInstance(var_manager, HedTypeVariable,
+                              "Constructor should create a HedVariableManager from strings")
+        self.assertEqual(len(var_manager._variable_map), 3,
+                         "Constructor should have right number of type_variables if multiple")
+
+    def test_constructor_unmatched(self):
+        test_strings1 = [HedString(hed, hed_schema=self.hed_schema) for hed in self.test_strings3]
+        with self.assertRaises(HedFileError):
+            HedTypeVariable(HedContextManager(test_strings1, self.hed_schema), self.hed_schema, self.defs)
+
+    def test_summarize_variables(self):
+        test_strings1 = get_assembled_strings(self.input_data, hed_schema=self.hed_schema, expand_defs=False)
+        definitions = self.input_data.get_definitions(as_strings=False).gathered_defs
+        var_manager = HedTypeVariable(HedContextManager(test_strings1, self.hed_schema), self.hed_schema, definitions)
+        summary = var_manager.summarize()
+        self.assertIsInstance(summary, dict, "summarize produces a dictionary if not json")
+        self.assertEqual(len(summary), 3, "Summarize_variables has right number of condition type_variables")
+        self.assertIn("key-assignment", summary, "summarize has a correct key")
+        summary_json = var_manager.summarize(as_json=True)
+        self.assertIsInstance(summary_json, str, "summarize as json returns a string")
+
+    def test_extract_definition_variables(self):
+        test_strings1 = [HedString(hed, hed_schema=self.hed_schema) for hed in self.test_strings1]
+        var_manager = HedTypeVariable(HedContextManager(test_strings1, self.hed_schema), self.hed_schema, self.defs)
+        var_levels = var_manager._variable_map['var3'].levels
+        self.assertNotIn('cond3/7', var_levels,
+                         "_extract_definition_variables before extraction def/cond3/7 not in levels")
+        tag = HedTag("Def/Cond3/7", hed_schema=self.hed_schema)
+        var_manager._extract_definition_variables(tag, 5)
+        self.assertIn('cond3/7', var_levels,
+                      "_extract_definition_variables after extraction def/cond3/7 not in levels")
+
+    def test_get_variable_names(self):
+        test_strings1 = [HedString(hed, hed_schema=self.hed_schema) for hed in self.test_strings1]
+        conditions1 = HedTypeVariable(HedContextManager(test_strings1, self.hed_schema), self.hed_schema, self.defs)
+        list1 = conditions1.get_variable_names()
+        self.assertEqual(len(list1), 8, "get_variable_tags list should have the right length")
+
+    def test_get_variable_def_names(self):
+        test_strings1 = [HedString(hed, hed_schema=self.hed_schema) for hed in self.test_strings1]
+        conditions1 = HedTypeVariable(HedContextManager(test_strings1, self.hed_schema), self.hed_schema, self.defs)
+        list1 = conditions1.get_variable_def_names()
+        self.assertEqual(len(list1), 5, "get_variable_def_names list should have the right length")
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/tests/tools/analysis/test_hed_variable_counts.py b/tests/tools/analysis/test_hed_variable_counts.py
new file mode 100644
index 000000000..0fc3279c3
--- /dev/null
+++ b/tests/tools/analysis/test_hed_variable_counts.py
@@ -0,0 +1,69 @@
+import os
+import unittest
+from hed import load_schema_version, Sidecar, TabularInput
+from hed.tools import HedContextManager, HedTypeVariable, HedVariableCounts, HedVariableSummary, get_assembled_strings
+
+
+class Test(unittest.TestCase):
+
+    def setUp(self):
+        schema = load_schema_version(xml_version="8.1.0")
+        bids_root_path = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)),
+                                          '../../data/bids/eeg_ds003654s_hed'))
+        events_path = os.path.realpath(os.path.join(bids_root_path,
+                                       'sub-002/eeg/sub-002_task-FacePerception_run-1_events.tsv'))
+        sidecar_path = os.path.realpath(os.path.join(bids_root_path, 'task-FacePerception_events.json'))
+        sidecar1 = Sidecar(sidecar_path, name='face_sub1_json')
+        input_data = TabularInput(events_path, sidecar=sidecar1, name="face_sub1_events")
+        hed_strings1 = get_assembled_strings(input_data, hed_schema=schema, expand_defs=False)
+        definitions1 = input_data.get_definitions(as_strings=False).gathered_defs
+        self.var_type1 = HedTypeVariable(HedContextManager(hed_strings1, schema), schema, definitions1,
+                                         variable_type='condition-variable')
+
+    def test_get_summary_one_level(self):
+        var_summary1 = HedVariableSummary(variable_type="condition-variable")
+        self.assertIsInstance(var_summary1, HedVariableSummary,
+                              "Constructor should create a HedVariableSummary")
+        summary1 = var_summary1.get_summary(as_json=False)
+        self.assertIsInstance(summary1, dict, "get_summary should return a dictionary when empty")
+        self.assertFalse(summary1, "get_summary should create a empty dictionary before updates")
+        count1 = HedVariableCounts('key-assignment', 'condition-variable')
+        var1 = self.var_type1.get_variable('key-assignment')
+        count1.update(var1)
+        self.assertEqual(0, count1.direct_references, "get_summary")
+        self.assertIn('right-sym-cond', count1.level_counts)
+        self.assertEqual(200, count1.total_events)
+        self.assertEqual(1, count1.level_counts['right-sym-cond']['files'])
+        count1.update(var1)
+        self.assertEqual(0, count1.direct_references, "get_summary")
+        self.assertIn('right-sym-cond', count1.level_counts)
+        self.assertEqual(400, count1.total_events)
+        self.assertEqual(2, count1.level_counts['right-sym-cond']['files'])
+
+    def test_get_summary_multiple_levels(self):
+        var_summary1 = HedVariableSummary(variable_type="condition-variable")
+        self.assertIsInstance(var_summary1, HedVariableSummary,
+                              "Constructor should create a HedVariableSummary")
+        summary1 = var_summary1.get_summary(as_json=False)
+        self.assertIsInstance(summary1, dict, "get_summary should return a dictionary when empty")
+        self.assertFalse(summary1, "get_summary should create a empty dictionary before updates")
+        count1 = HedVariableCounts('face-type', 'condition-variable')
+        var1 = self.var_type1.get_variable('face-type')
+        count1.update(var1)
+        self.assertEqual(0, count1.direct_references, "get_summary")
+        self.assertEqual(3, len(count1.level_counts))
+        self.assertIn('unfamiliar-face-cond', count1.level_counts)
+        self.assertEqual(200, count1.total_events)
+        self.assertEqual(52, count1.number_type_events)
+        self.assertEqual(1, count1.level_counts['unfamiliar-face-cond']['files'])
+        count1.update(var1)
+        self.assertEqual(0, count1.direct_references, "get_summary")
+        self.assertEqual(3, len(count1.level_counts))
+        self.assertIn('unfamiliar-face-cond', count1.level_counts)
+        self.assertEqual(400, count1.total_events)
+        self.assertEqual(104, count1.number_type_events)
+        self.assertEqual(2, count1.level_counts['unfamiliar-face-cond']['files'])
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/tests/tools/analysis/test_hed_variable_manager.py b/tests/tools/analysis/test_hed_variable_manager.py
new file mode 100644
index 000000000..17af481da
--- /dev/null
+++ b/tests/tools/analysis/test_hed_variable_manager.py
@@ -0,0 +1,147 @@
+import os
+import unittest
+from hed import load_schema_version, Sidecar, TabularInput
+from hed.tools import HedTypeFactors, HedTypeVariable, HedVariableManager, get_assembled_strings
+
+
+class Test(unittest.TestCase):
+
+    def setUp(self):
+        schema = load_schema_version(xml_version="8.1.0")
+        bids_root_path = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)),
+                                          '../../data/bids/eeg_ds003654s_hed'))
+        events_path = os.path.realpath(os.path.join(bids_root_path,
+                                       'sub-002/eeg/sub-002_task-FacePerception_run-1_events.tsv'))
+        sidecar_path = os.path.realpath(os.path.join(bids_root_path, 'task-FacePerception_events.json'))
+        sidecar1 = Sidecar(sidecar_path, name='face_sub1_json')
+        self.input_data = TabularInput(events_path, sidecar=sidecar1, name="face_sub1_events")
+        self.hed_strings = get_assembled_strings(self.input_data, hed_schema=schema, expand_defs=False)
+        self.hed_schema = schema
+        self.definitions = self.input_data.get_definitions()
+
+    def test_constructor(self):
+        var_manager = HedVariableManager(self.hed_strings, self.hed_schema, self.definitions)
+        self.assertIsInstance(var_manager, HedVariableManager,
+                              "Constructor should create a HedVariableManager from a tabular input")
+        self.assertEqual(len(var_manager.context_manager.hed_strings), len(var_manager.context_manager.contexts),
+                         "Variable managers have context same length as hed_strings")
+        self.assertFalse(var_manager._variable_type_map, "constructor has empty map")
+
+    def test_add_type_variable(self):
+        var_manager = HedVariableManager(self.hed_strings, self.hed_schema, self.definitions)
+        self.assertFalse(var_manager._variable_type_map, "constructor has empty map")
+        var_manager.add_type_variable("Condition-variable")
+        self.assertEqual(len(var_manager._variable_type_map), 1,
+                         "add_type_variable has 1 element map after one type added")
+        self.assertIn("condition-variable", var_manager._variable_type_map,
+                      "add_type_variable converts type elements to lower case")
+        var_manager.add_type_variable("Condition-variable")
+        self.assertEqual(len(var_manager._variable_type_map), 1,
+                         "add_type_variable has 1 element map after same type is added twice")
+        var_manager.add_type_variable("task")
+        self.assertEqual(len(var_manager._variable_type_map), 2,
+                         "add_type_variable has 2 element map after two types are added")
+
+    def test_get_factor_vectors(self):
+        hed_strings = get_assembled_strings(self.input_data, hed_schema=self.hed_schema, expand_defs=False)
+        base_length = len(hed_strings)
+        def_mapper = self.input_data._def_mapper
+        var_manager = HedVariableManager(hed_strings, self.hed_schema, def_mapper)
+        var_manager.add_type_variable("Condition-variable")
+        var_manager.add_type_variable("task")
+        df_cond = var_manager.get_factor_vectors("condition-variable")
+        df_task = var_manager.get_factor_vectors("task")
+        self.assertEqual(len(df_cond), base_length, "get_factor_vectors returns df same length as original")
+        self.assertEqual(len(df_task), base_length, "get_factor_vectors returns df same length as original if 2 types")
+        self.assertEqual(len(df_cond.columns), 10, "get_factor_vectors has right number of factors")
+        self.assertEqual(len(df_task.columns), 4, "get_factor_vectors has right number of factors if 2 types")
+        df_baloney = var_manager.get_factor_vectors("baloney")
+        self.assertIsNone(df_baloney, "get_factor_vectors returns None if no factors")
+
+    def test_get_type_variable(self):
+        hed_strings = get_assembled_strings(self.input_data, hed_schema=self.hed_schema, expand_defs=False)
+        def_mapper = self.input_data._def_mapper
+        var_manager = HedVariableManager(hed_strings, self.hed_schema, def_mapper)
+        var_manager.add_type_variable("Condition-variable")
+        type_var = var_manager.get_type_variable("condition-variable")
+        self.assertIsInstance(type_var, HedTypeVariable,
+                              "get_type_variable returns a HedTypeVariable if the key exists")
+        type_var = var_manager.get_type_variable("baloney")
+        self.assertIsNone(type_var, "get_type_variable returns None if the key does not exist")
+
+    def test_get_type_variable_def_names(self):
+        hed_strings = get_assembled_strings(self.input_data, hed_schema=self.hed_schema, expand_defs=False)
+        def_mapper = self.input_data._def_mapper
+        var_manager = HedVariableManager(hed_strings, self.hed_schema, def_mapper)
+        var_manager.add_type_variable("Condition-variable")
+        def_names = var_manager.get_type_variable_def_names("condition-variable")
+        self.assertEqual(len(def_names), 7,
+                         "get_type_variable_def_names has right length if condition-variable exists")
+        self.assertIn('scrambled-face-cond', def_names,
+                      "get_type_variable_def_names returns a list with a correct value if condition-variable exists")
+        def_names = var_manager.get_type_variable_def_names("baloney")
+        self.assertFalse(def_names, "get_type_variable_def_names returns empty if the type does not exist")
+
+    def test_get_variable_type_map(self):
+        hed_strings = get_assembled_strings(self.input_data, hed_schema=self.hed_schema, expand_defs=False)
+        def_mapper = self.input_data._def_mapper
+        var_manager = HedVariableManager(hed_strings, self.hed_schema, def_mapper)
+        var_manager.add_type_variable("Condition-variable")
+        this_var = var_manager.get_type_variable("condition-variable")
+        self.assertIsInstance(this_var, HedTypeVariable,
+                              "get_type_variable_map returns a non-empty map when key lower case")
+        self.assertEqual(len(this_var.type_variables), 3,
+                         "get_type_variable_map map has right length when key lower case")
+        this_var2 = var_manager.get_type_variable("Condition-variable")
+        self.assertIsInstance(this_var2, HedTypeVariable,
+                              "get_type_variable_map returns a non-empty map when key upper case")
+        self.assertEqual(len(this_var2.type_variables), 3,
+                         "get_type_variable_map map has right length when key upper case")
+
+    def test_get_type_variable_factor(self):
+        hed_strings = get_assembled_strings(self.input_data, hed_schema=self.hed_schema, expand_defs=False)
+        def_mapper = self.input_data._def_mapper
+        var_manager = HedVariableManager(hed_strings, self.hed_schema, def_mapper)
+        var_manager.add_type_variable("Condition-variable")
+        var_factor1 = var_manager.get_type_variable_factor("condition-variable", "key-assignment")
+        self.assertIsInstance(var_factor1, HedTypeFactors,
+                              "get_type_variable_factor returns a HedTypeFactors if type variable factor exists")
+        var_factor2 = var_manager.get_type_variable_factor("condition-variable", "baloney")
+        self.assertIsNone(var_factor2, "get_type_variable_factor returns None if type variable factor does not exist")
+        var_factor3 = var_manager.get_type_variable_factor("baloney1", "key-assignment")
+        self.assertIsNone(var_factor3, "get_type_variable_factor returns None if type variable does not exist")
+
+    def test_type_variables(self):
+        hed_strings = get_assembled_strings(self.input_data, hed_schema=self.hed_schema, expand_defs=False)
+        definitions = self.input_data.get_definitions
+        var_manager = HedVariableManager(hed_strings, self.hed_schema, definitions)
+        vars1 = var_manager.type_variables
+        self.assertFalse(vars1, "type_variables is empty if no types have been added")
+        var_manager.add_type_variable("Condition-variable")
+        var_manager.add_type_variable("task")
+        vars2 = var_manager.type_variables
+        self.assertIsInstance(vars2, list, "type_variables returns a list ")
+        self.assertEqual(len(vars2), 2, "type_variables return list is right length")
+
+    def test_summarize_all(self):
+        hed_strings = get_assembled_strings(self.input_data, hed_schema=self.hed_schema, expand_defs=False)
+        def_mapper = self.input_data._def_mapper
+        var_manager = HedVariableManager(hed_strings, self.hed_schema, def_mapper)
+        summary1 = var_manager.summarize_all()
+        self.assertIsInstance(summary1, dict, "summarize_all returns a dictionary when nothing has been added")
+        self.assertFalse(summary1, "summarize_all return dictionary is empty when nothing has been added")
+        vars1 = var_manager.type_variables
+        self.assertFalse(vars1, "type_variables is empty if no types have been added")
+        var_manager.add_type_variable("Condition-variable")
+        var_manager.add_type_variable("task")
+        summary2 = var_manager.summarize_all()
+        self.assertIsInstance(summary2, dict, "summarize_all returns a dictionary after additions")
+        self.assertEqual(len(summary2), 2,
+                         "summarize_all return dictionary has 2 entries when 2 types have been added")
+        summary3 = var_manager.summarize_all(as_json=True)
+        self.assertIsInstance(summary3, str,
+                              "summarize_all dictionary is returned as a string when as_json is True")
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/tests/tools/analysis/test_hed_variable_summary.py b/tests/tools/analysis/test_hed_variable_summary.py
new file mode 100644
index 000000000..6fdb8c090
--- /dev/null
+++ b/tests/tools/analysis/test_hed_variable_summary.py
@@ -0,0 +1,49 @@
+import os
+import unittest
+from hed import HedString, load_schema_version, Sidecar, TabularInput
+from hed.models import DefinitionEntry
+from hed.tools import HedContextManager, HedTypeVariable, HedVariableSummary, get_assembled_strings
+
+
+class Test(unittest.TestCase):
+
+    def setUp(self):
+        bids_root_path = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)),
+                                          '../../data/bids/eeg_ds003654s_hed'))
+        events_path = os.path.realpath(os.path.join(bids_root_path,
+                                       'sub-002/eeg/sub-002_task-FacePerception_run-1_events.tsv'))
+        sidecar_path = os.path.realpath(os.path.join(bids_root_path, 'task-FacePerception_events.json'))
+        sidecar1 = Sidecar(sidecar_path, name='face_sub1_json')
+        self.input_data = TabularInput(events_path, sidecar=sidecar1, name="face_sub1_events")
+        schema = load_schema_version(xml_version="8.1.0")
+        bids_root_path = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)),
+                                          '../../data/bids/eeg_ds003654s_hed'))
+        events_path = os.path.realpath(os.path.join(bids_root_path,
+                                       'sub-002/eeg/sub-002_task-FacePerception_run-1_events.tsv'))
+        sidecar_path = os.path.realpath(os.path.join(bids_root_path, 'task-FacePerception_events.json'))
+        sidecar1 = Sidecar(sidecar_path, name='face_sub1_json')
+        input_data = TabularInput(events_path, sidecar=sidecar1, name="face_sub1_events")
+        hed_strings1 = get_assembled_strings(input_data, hed_schema=schema, expand_defs=False)
+        definitions = self.input_data.get_definitions(as_strings=False).gathered_defs
+        self.var_type1 = HedTypeVariable(HedContextManager(hed_strings1, schema), schema, definitions,
+                                         variable_type='condition-variable')
+
+    def test_get_summary(self):
+        var_summary1 = HedVariableSummary(variable_type="condition-variable")
+        self.assertIsInstance(var_summary1, HedVariableSummary,
+                              "Constructor should create a HedVariableSummary")
+        summary1 = var_summary1.get_summary(as_json=False)
+        self.assertIsInstance(summary1, dict, "get_summary should return a dictionary when empty")
+        self.assertFalse(summary1, "get_summary should create a empty dictionary before updates")
+        var_summary1.update_summary(self.var_type1)
+        summary2 = var_summary1.get_summary(as_json=False)
+        self.assertEqual(len(summary2), 3)
+        self.assertEqual(summary2['repetition-type']['number_type_events'], 52)
+        var_summary1.update_summary(self.var_type1)
+        summary3 = var_summary1.get_summary(as_json=False)
+        self.assertEqual(len(summary3), 3)
+        self.assertEqual(summary3['repetition-type']['number_type_events'], 104)
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/tests/tools/analysis/test_key_map.py b/tests/tools/analysis/test_key_map.py
index df9574806..bd5afaad7 100644
--- a/tests/tools/analysis/test_key_map.py
+++ b/tests/tools/analysis/test_key_map.py
@@ -2,8 +2,7 @@
 import os
 import pandas as pd
 from hed.errors import HedFileError
-from hed.tools import KeyMap
-from hed.util import get_file_list, get_new_dataframe
+from hed.tools import KeyMap, get_file_list, get_new_dataframe
 
 
 class Test(unittest.TestCase):
diff --git a/tests/tools/analysis/test_sidecar_summary.py b/tests/tools/analysis/test_sidecar_summary.py
deleted file mode 100644
index 74669ecd4..000000000
--- a/tests/tools/analysis/test_sidecar_summary.py
+++ /dev/null
@@ -1,31 +0,0 @@
-import os
-import unittest
-from hed.models.sidecar import Sidecar
-from hed.tools.bids.bids_sidecar_file import BidsSidecarFile
-
-
-class Test(unittest.TestCase):
-
-    @classmethod
-    def setUpClass(cls):
-        cls.sidecar_path1 = os.path.join(os.path.dirname(os.path.realpath(__file__)),
-                                         '../../data/bids/eeg_ds003654s_hed/task-FacePerception_events.json')
-
-    def test_constructor(self):
-        sidecar1 = BidsSidecarFile(self.sidecar_path1)
-        self.assertEqual(sidecar1.suffix, 'events', "BidsSidecarFile should have correct name_suffix")
-        self.assertEqual(sidecar1.ext, '.json', "BidsSidecarFile should have correct ext")
-        self.assertEqual(len(sidecar1.entity_dict), 1, "BidsSidecarFile should have right number of entity_dict")
-        self.assertFalse(sidecar1.contents)
-
-        sidecar2 = BidsSidecarFile(self.sidecar_path1)
-        self.assertEqual(sidecar2.suffix, 'events', "BidsSidecarFile should have correct name_suffix")
-        self.assertEqual(sidecar2.ext, '.json', "BidsSidecarFile should have correct ext")
-        self.assertEqual(len(sidecar2.entity_dict), 1, "BidsSidecarFile should have right number of entity_dict")
-        self.assertFalse(sidecar2.contents, "BidsSidecarFile has no contents unless set")
-        sidecar2.set_contents()
-        self.assertIsInstance(sidecar2.contents, Sidecar, "BidsSidecarFile should contain a Sidecar")
-
-
-if __name__ == '__main__':
-    unittest.main()
diff --git a/tests/tools/bids/test_bids_tabular_summary.py b/tests/tools/analysis/test_tabular_summary.py
similarity index 77%
rename from tests/tools/bids/test_bids_tabular_summary.py
rename to tests/tools/analysis/test_tabular_summary.py
index 67a21acd3..ce006e167 100644
--- a/tests/tools/bids/test_bids_tabular_summary.py
+++ b/tests/tools/analysis/test_tabular_summary.py
@@ -1,8 +1,8 @@
 import unittest
 import os
 from hed.errors.exceptions import HedFileError
-from hed.tools import BidsTabularSummary, BidsFileDictionary
-from hed.util import get_file_list, get_new_dataframe
+from hed.tools import FileDictionary, TabularSummary
+from hed.tools import get_file_list, get_new_dataframe
 
 
 class Test(unittest.TestCase):
@@ -21,17 +21,17 @@ def setUpClass(cls):
                                                            'sub-002/eeg/sub-002_task-FacePerception_run-1_events.tsv'))
 
     def test_constructor(self):
-        dict1 = BidsTabularSummary()
-        self.assertIsInstance(dict1, BidsTabularSummary,
+        dict1 = TabularSummary()
+        self.assertIsInstance(dict1, TabularSummary,
                               "BidsTabularSummary constructor is allowed to have no arguments")
         self.assertFalse(dict1.value_info)
 
-        dict2 = BidsTabularSummary(value_cols=['a', 'b', 'c'], name='baloney')
-        self.assertIsInstance(dict2, BidsTabularSummary, "BidsTabularSummary: multiple values are okay in constructor")
+        dict2 = TabularSummary(value_cols=['a', 'b', 'c'], name='baloney')
+        self.assertIsInstance(dict2, TabularSummary, "BidsTabularSummary: multiple values are okay in constructor")
         self.assertEqual(len(dict2.value_info.keys()), 3, "BidsTabularSummary should have keys for each value column")
 
     def test_get_number_unique_values(self):
-        dict1 = BidsTabularSummary()
+        dict1 = TabularSummary()
         wh_df = get_new_dataframe(self.wh_events_path)
         dict1.update(wh_df)
         self.assertEqual(len(dict1.value_info.keys()), 0,
@@ -42,8 +42,22 @@ def test_get_number_unique_values(self):
         self.assertEqual(len(count_dict), 10, "get_number_unique should have the correct number of entries")
         self.assertEqual(count_dict['onset'], 199, "get_number_unique should have the right number of unique")
 
+    def test_get_summary(self):
+        dict1 = TabularSummary(value_cols=['letter'], skip_cols=['event_type'], name="Sternberg1")
+        stern_df = get_new_dataframe(self.stern_map_path)
+        dict1.update(stern_df)
+        self.assertEqual(len(dict1.value_info.keys()), 1,
+                         "BidsTabularSummary value_info should be empty if no value columns")
+        self.assertEqual(len(dict1.categorical_info.keys()), len(stern_df.columns)-2,
+                         "BidsTabularSummary categorical_info be columns minus skip and value columns")
+        summary1 = dict1.get_summary(as_json=False)
+        self.assertIsInstance(summary1, dict)
+        self.assertEqual(len(summary1), 3)
+        summary2 = dict1.get_summary(as_json=True).replace('"', '')
+        self.assertIsInstance(summary2, str)
+
     def test__str__(self):
-        t_map = BidsTabularSummary(name="My output")
+        t_map = TabularSummary(name="My output")
         t_map.update(self.stern_map_path)
         df = get_new_dataframe(self.stern_map_path)
         t_map.update(self.stern_map_path)
@@ -53,7 +67,7 @@ def test__str__(self):
         self.assertTrue(t_map_str, "__str__ returns a non-empty string when the map has content.")
 
     def test_update(self):
-        dict1 = BidsTabularSummary()
+        dict1 = TabularSummary()
         stern_df = get_new_dataframe(self.stern_map_path)
         dict1.update(stern_df)
         self.assertEqual(len(dict1.value_info.keys()), 0,
@@ -61,7 +75,7 @@ def test_update(self):
         self.assertEqual(len(dict1.categorical_info.keys()), len(stern_df.columns),
                          "BidsTabularSummary categorical_info should have all the columns if no restrictions")
 
-        dict2 = BidsTabularSummary(value_cols=['letter'], skip_cols=['event_type'])
+        dict2 = TabularSummary(value_cols=['letter'], skip_cols=['event_type'])
         dict2.update(stern_df)
         self.assertEqual(len(dict2.value_info.keys()), 1,
                          "BidsTabularSummary value_info should have letter value column")
@@ -77,8 +91,8 @@ def test_update(self):
                          "BidsTabularSummary value counts should update by column length each time update is called")
 
     def test_update_dict(self):
-        dict1 = BidsTabularSummary()
-        dict2 = BidsTabularSummary()
+        dict1 = TabularSummary()
+        dict2 = TabularSummary()
         stern_df_map = get_new_dataframe(self.stern_map_path)
         dict1.update(stern_df_map)
         dict2.update_summary(dict1)
@@ -95,9 +109,9 @@ def test_update_dict(self):
     def test_update_dict_with_value_cols(self):
         stern_df_test1 = get_new_dataframe(self.stern_test1_path)
         stern_df_test3 = get_new_dataframe(self.stern_test3_path)
-        dict1 = BidsTabularSummary(value_cols=['latency'])
+        dict1 = TabularSummary(value_cols=['latency'])
         dict1.update(stern_df_test3)
-        dict2 = BidsTabularSummary(value_cols=['latency'])
+        dict2 = TabularSummary(value_cols=['latency'])
         dict2.update(stern_df_test1)
         dict2.update_summary(dict1)
         dict1.update(stern_df_test1)
@@ -109,9 +123,9 @@ def test_update_dict_with_value_cols(self):
     def test_update_dict_with_bad_value_cols(self):
         stern_df_test1 = get_new_dataframe(self.stern_test1_path)
         stern_df_test3 = get_new_dataframe(self.stern_test3_path)
-        dict1 = BidsTabularSummary(value_cols=['latency'])
+        dict1 = TabularSummary(value_cols=['latency'])
         dict1.update(stern_df_test3)
-        dict3 = BidsTabularSummary()
+        dict3 = TabularSummary()
         dict3.update(stern_df_test1)
         try:
             dict1.update_summary(dict3)
@@ -124,9 +138,9 @@ def test_update_dict_with_bad_value_cols(self):
 
     def test_update_dict_bad_skip_col(self):
         stern_test3 = get_new_dataframe(self.stern_test3_path)
-        dict1 = BidsTabularSummary(skip_cols=['latency'])
+        dict1 = TabularSummary(skip_cols=['latency'])
         dict1.update(stern_test3)
-        dict2 = BidsTabularSummary(value_cols=['latency'])
+        dict2 = TabularSummary(value_cols=['latency'])
         dict2.update(stern_test3)
         try:
             dict2.update_summary(dict1)
@@ -139,34 +153,34 @@ def test_update_dict_bad_skip_col(self):
 
     def test_get_columns_info(self):
         df = get_new_dataframe(self.stern_test2_path)
-        col_info = BidsTabularSummary.get_columns_info(df)
+        col_info = TabularSummary.get_columns_info(df)
         self.assertIsInstance(col_info, dict, "get_columns_info should return a dictionary")
         self.assertEqual(len(col_info.keys()), len(df.columns),
                          "get_columns_info should return a dictionary with a key for each column")
 
     def test_get_columns_info_skip_columns(self):
         df = get_new_dataframe(self.stern_test2_path)
-        col_info = BidsTabularSummary.get_columns_info(df, ['latency'])
+        col_info = TabularSummary.get_columns_info(df, ['latency'])
         self.assertIsInstance(col_info, dict, "get_columns_info should return a dictionary")
         self.assertEqual(len(col_info.keys()), len(df.columns) - 1,
                          "get_columns_info should return a dictionary with a key for each column included")
-        col_info = BidsTabularSummary.get_columns_info(df, list(df.columns.values))
+        col_info = TabularSummary.get_columns_info(df, list(df.columns.values))
         self.assertIsInstance(col_info, dict, "get_columns_info should return a dictionary")
         self.assertFalse(col_info, "get_columns_info should return a dictionary with a key for each column included")
 
     def test_make_combined_dicts(self):
         files_bids = get_file_list(self.bids_base_dir, extensions=[".tsv"], name_suffix="_events")
-        file_dict = BidsFileDictionary("my name", files_bids)
-        dicts_all1, dicts1 = BidsTabularSummary.make_combined_dicts(file_dict)
-        self.assertTrue(isinstance(dicts_all1, BidsTabularSummary),
+        file_dict1 = FileDictionary("my name", files_bids)
+        dicts_all1, dicts1 = TabularSummary.make_combined_dicts(file_dict1.file_dict)
+        self.assertTrue(isinstance(dicts_all1, TabularSummary),
                         "make_combined_dicts should return a BidsTabularSummary")
         self.assertTrue(isinstance(dicts1, dict), "make_combined_dicts should also return a dictionary of file names")
         self.assertEqual(6, len(dicts1), "make_combined_dicts should return correct number of file names")
         self.assertEqual(10, len(dicts_all1.categorical_info),
                          "make_combined_dicts should return right number of entries")
-        dicts_all2, dicts2 = BidsTabularSummary.make_combined_dicts(file_dict,
-                                                                    skip_cols=["onset", "duration", "sample"])
-        self.assertTrue(isinstance(dicts_all2, BidsTabularSummary),
+        dicts_all2, dicts2 = TabularSummary.make_combined_dicts(file_dict1.file_dict,
+                                                                skip_cols=["onset", "duration", "sample"])
+        self.assertTrue(isinstance(dicts_all2, TabularSummary),
                         "make_combined_dicts should return a BidsTabularSummary")
         self.assertTrue(isinstance(dicts2, dict), "make_combined_dicts should also return a dictionary of file names")
         self.assertEqual(6, len(dicts2), "make_combined_dicts should return correct number of file names")
diff --git a/tests/tools/bids/test_bids_dataset.py b/tests/tools/bids/test_bids_dataset.py
index 925a55ef8..d7109eb5f 100644
--- a/tests/tools/bids/test_bids_dataset.py
+++ b/tests/tools/bids/test_bids_dataset.py
@@ -1,6 +1,5 @@
 import os
 import unittest
-from hed.errors import HedFileError
 from hed.schema.hed_schema_io import load_schema, load_schema_version
 from hed.schema.hed_schema import HedSchema
 from hed.schema.hed_schema_group import HedSchemaGroup
diff --git a/tests/tools/bids/test_bids_file.py b/tests/tools/bids/test_bids_file.py
index b2aac4c20..0a9dc0b96 100644
--- a/tests/tools/bids/test_bids_file.py
+++ b/tests/tools/bids/test_bids_file.py
@@ -26,7 +26,7 @@ def test_bids_file_constructor(self):
     def test_get_key(self):
         bids1 = BidsFile(Test.event_path)
         key1 = bids1.get_key('')
-        self.assertFalse(key1, "get_key when no entities should be empty")
+        self.assertEqual(key1, bids1.file_path, "get_key should be file path when no entities")
         key2 = bids1.get_key(('sub', 'task'))
         self.assertEqual(key2, 'sub-002_task-FacePerception', 'get_key should give the correct key with two entities')
         key3 = bids1.get_key(('sub', 'ses'))
diff --git a/tests/tools/bids/test_bids_file_dictionary.py b/tests/tools/bids/test_bids_file_dictionary.py
index 43d95e2f4..5c8e454e2 100644
--- a/tests/tools/bids/test_bids_file_dictionary.py
+++ b/tests/tools/bids/test_bids_file_dictionary.py
@@ -2,8 +2,7 @@
 import os
 
 from hed.errors.exceptions import HedFileError
-from hed.tools import BidsFileDictionary
-from hed.util import get_file_list
+from hed.tools import BidsFileDictionary, get_file_list
 
 
 class Test(unittest.TestCase):
@@ -41,7 +40,7 @@ def test_make_dict(self):
     def test_make_query(self):
         dict1 = BidsFileDictionary("My name", self.file_list, entities=('sub', 'run'))
         results1 = dict1.make_query(query_dict={'sub': '*', 'run': '*'})
-        self.assertEqual(len(results1), len(dict1.file_dict), "make_query should return all of the entries when *.")
+        self.assertEqual(len(results1), len(dict1._file_dict), "make_query should return all of the entries when *.")
         results2 = dict1.make_query(query_dict={'sub': '*', 'run': ['1']})
         self.assertEqual(len(results2), 2, "make_query should return the right number of entries.")
         results3 = dict1.make_query(query_dict={'sub': '*', 'run': ['*']})
@@ -51,7 +50,7 @@ def test_make_query(self):
         results5 = dict1.make_query(query_dict={'sub': '*', 'run': []})
         self.assertFalse(len(results5), "make_query be empty if the list for one of the entities is empty.")
         results6 = dict1.make_query(query_dict={'sub': '*'})
-        self.assertEqual(len(results6), len(dict1.file_dict), "make_query should return all of the entries when *.")
+        self.assertEqual(len(results6), len(dict1._file_dict), "make_query should return all of the entries when *.")
 
     def test_match_query(self):
         entity_dict = {'sub': '01', 'task': 'tempTask', 'run': '2'}
@@ -81,7 +80,7 @@ def test_split_by_entity(self):
 
     def test_split_dict_by_entity(self):
         dict1 = BidsFileDictionary("My name", self.file_list, entities=('sub', 'run'))
-        dist1_split, leftovers = BidsFileDictionary._split_dict_by_entity(dict1.file_dict, 'run')
+        dist1_split, leftovers = BidsFileDictionary._split_dict_by_entity(dict1._file_dict, 'run')
         self.assertIsInstance(dist1_split, dict, "split_by_entity returns a dictionary")
         self.assertEqual(3, len(dist1_split), 'split_by_entity should return the correct number of items')
         for value in dist1_split.values():
diff --git a/tests/tools/bids/test_bids_file_group.py b/tests/tools/bids/test_bids_file_group.py
index a7dc8eeb5..37956ef22 100644
--- a/tests/tools/bids/test_bids_file_group.py
+++ b/tests/tools/bids/test_bids_file_group.py
@@ -1,6 +1,7 @@
 import os
 import unittest
 from hed.schema.hed_schema_io import load_schema
+from hed.tools.analysis.tabular_summary import TabularSummary
 from hed.tools.bids.bids_file_group import BidsFileGroup
 from hed.validator.hed_validator import HedValidator
 
@@ -38,6 +39,15 @@ def test_validator(self):
         self.assertEqual(len(validation_issues), 6,
                          "BidsFileGroup should have 2 validation warnings for missing columns")
 
+    def test_summarize(self):
+        events = BidsFileGroup(self.root_path)
+        info = events.summarize()
+        self.assertIsInstance(info, TabularSummary, "summarize returns a TabularSummary")
+        self.assertEqual(len(info.categorical_info), 10, "summarize info has entries with all columns if non-skipped")
+        info2 = events.summarize(skip_cols=['onset', 'sample'])
+        self.assertEqual(len(info2.categorical_info), len(info.categorical_info)-2,
+                         "summarize info has two less entries if two columns are skipped")
+
 
 if __name__ == '__main__':
     unittest.main()
diff --git a/tests/tools/bids/test_bids_tabular_dictionary.py b/tests/tools/bids/test_bids_tabular_dictionary.py
index 551b35d08..fe05e0091 100644
--- a/tests/tools/bids/test_bids_tabular_dictionary.py
+++ b/tests/tools/bids/test_bids_tabular_dictionary.py
@@ -2,8 +2,7 @@
 import os
 
 from hed.errors.exceptions import HedFileError
-from hed.tools import BidsTabularDictionary
-from hed.util import get_file_list
+from hed.tools import BidsTabularDictionary, get_file_list
 
 
 class Test(unittest.TestCase):
diff --git a/tests/tools/bids/test_bids_tabular_file.py b/tests/tools/bids/test_bids_tabular_file.py
index 37ec3f8ed..ccf03b8bb 100644
--- a/tests/tools/bids/test_bids_tabular_file.py
+++ b/tests/tools/bids/test_bids_tabular_file.py
@@ -1,6 +1,6 @@
 import os
 import unittest
-from hed.models import TabularInput
+from hed.models.tabular_input import TabularInput
 from hed.tools import BidsSidecarFile, BidsTabularFile
 
 
diff --git a/tests/tools/curation/test_tsv_reports.py b/tests/tools/curation/test_tsv_reports.py
index 6b4b06dba..5cf4e1f4f 100644
--- a/tests/tools/curation/test_tsv_reports.py
+++ b/tests/tools/curation/test_tsv_reports.py
@@ -2,19 +2,16 @@
 import os
 from io import StringIO
 from unittest import mock
-
-from hed.errors.exceptions import HedFileError
-from hed.tools import BidsTabularDictionary, HedLogger, report_diffs
-from hed.util import get_file_list
+from hed.tools import BidsTabularDictionary, get_file_list, HedLogger, report_diffs
 
 
 class Test(unittest.TestCase):
     @classmethod
     def setUpClass(cls):
-        cls.bids_base_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)),
-                                         '../../data/bids/eeg_ds003654s_hed')
-        cls.file_list = get_file_list(cls.bids_base_dir, name_suffix="_events",
+        bids_base_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../../data/bids/eeg_ds003654s_hed')
+        cls.file_list = get_file_list(bids_base_dir, name_suffix="_events",
                                       extensions=['.tsv'], exclude_dirs=['stimuli'])
+        cls.bids_base_dir = bids_base_dir
 
     def test_report_tsv_diffs(self):
         dict1 = BidsTabularDictionary("Bids1", self.file_list, entities=('sub', 'run'))
diff --git a/tests/util/__init__.py b/tests/tools/util/__init__.py
similarity index 100%
rename from tests/util/__init__.py
rename to tests/tools/util/__init__.py
diff --git a/tests/util/test_data_util.py b/tests/tools/util/test_data_util.py
similarity index 96%
rename from tests/util/test_data_util.py
rename to tests/tools/util/test_data_util.py
index 6ac01b476..b274c2ed7 100644
--- a/tests/util/test_data_util.py
+++ b/tests/tools/util/test_data_util.py
@@ -3,7 +3,7 @@
 import numpy as np
 from pandas import DataFrame
 from hed.errors.exceptions import HedFileError
-from hed.util.data_util import add_columns, check_match, delete_columns, delete_rows_by_column, \
+from hed.tools.util.data_util import add_columns, check_match, delete_columns, delete_rows_by_column, \
     get_key_hash, get_new_dataframe, get_row_hash, get_value_dict, \
     make_info_dataframe, remove_quotes, reorder_columns, replace_values, separate_columns
 
@@ -12,7 +12,7 @@ class Test(unittest.TestCase):
 
     @classmethod
     def setUpClass(cls):
-        curation_base_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../data/curation')
+        curation_base_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../../data/curation')
         cls.stern_map_path = os.path.join(curation_base_dir, "sternberg_map.tsv")
         cls.stern_test1_path = os.path.join(curation_base_dir, "sternberg_test_events.tsv")
         cls.stern_test2_path = os.path.join(curation_base_dir, "sternberg_with_quotes_events.tsv")
diff --git a/tests/tools/test_hed_logger.py b/tests/tools/util/test_hed_logger.py
similarity index 96%
rename from tests/tools/test_hed_logger.py
rename to tests/tools/util/test_hed_logger.py
index 9d24de56e..2270e1a08 100644
--- a/tests/tools/test_hed_logger.py
+++ b/tests/tools/util/test_hed_logger.py
@@ -1,7 +1,7 @@
 import unittest
 from io import StringIO
 from unittest import mock
-from hed.tools.hed_logger import HedLogger
+from hed.tools.util.hed_logger import HedLogger
 
 
 class Test(unittest.TestCase):
diff --git a/tests/util/test_io_util.py b/tests/tools/util/test_io_util.py
similarity index 95%
rename from tests/util/test_io_util.py
rename to tests/tools/util/test_io_util.py
index 5cb92edf1..cdfe4afb5 100644
--- a/tests/util/test_io_util.py
+++ b/tests/tools/util/test_io_util.py
@@ -1,17 +1,16 @@
 import os
 import unittest
 from hed.errors.exceptions import HedFileError
-from hed.util.io_util import check_filename, extract_suffix_path, generate_filename, \
-    get_dir_dictionary, get_file_list, get_path_components
-
-from hed.util.io_util import parse_bids_filename, _split_entity
+from hed.tools import check_filename, extract_suffix_path, generate_filename, get_dir_dictionary, get_file_list, \
+    get_path_components, parse_bids_filename
+from hed.tools.util.io_util import _split_entity
 
 
 class Test(unittest.TestCase):
 
     @classmethod
     def setUpClass(cls):
-        cls.bids_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../data/bids/eeg_ds003654s_hed')
+        cls.bids_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../../data/bids/eeg_ds003654s_hed')
         stern_base_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../data/sternberg')
         att_base_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../data/attention_shift')
         cls.stern_map_path = os.path.join(stern_base_dir, "sternberg_map.tsv")
@@ -86,7 +85,8 @@ def test_get_dir_dictionary(self):
         self.assertEqual(len(dir_dict), 3, "get_dir_dictionary returns a dictionary of the correct length")
 
     def test_get_file_list_files(self):
-        dir_pairs = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../data/schema_test_data/prologue_tests')
+        dir_pairs = os.path.join(os.path.dirname(os.path.realpath(__file__)),
+                                 '../../data/schema_test_data/prologue_tests')
         dir_pairs = os.path.realpath(dir_pairs)
         test_files = [name for name in os.listdir(dir_pairs) if os.path.isfile(os.path.join(dir_pairs, name))]
         file_list1 = get_file_list(dir_pairs)
@@ -101,7 +101,7 @@ def test_get_file_list_files(self):
             raise HedFileError("FileShouldNotBeFound", f"get_event_files should have not have found file {file}", "")
 
     def test_get_get_file_list_suffix(self):
-        dir_data = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../data')
+        dir_data = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../../data')
         file_list = get_file_list(dir_data, extensions=[".json", ".tsv"])
         for item in file_list:
             if item.endswith(".json") or item.endswith(".tsv"):
@@ -123,7 +123,7 @@ def test_get_file_list_case(self):
             self.assertTrue(filename.startswith('sternberg'))
 
     def test_get_file_list_exclude_dir(self):
-        dir_data = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../data/bids/eeg_ds003654s_hed')
+        dir_data = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../../data/bids/eeg_ds003654s_hed')
         file_list1 = get_file_list(dir_data, extensions=[".bmp"])
         self.assertEqual(345, len(file_list1), 'get_file_list has the right number of files when no exclude')
         file_list2 = get_file_list(dir_data, extensions=[".bmp"], exclude_dirs=[])
diff --git a/tests/validator/test_hed_validator.py b/tests/validator/test_hed_validator.py
index e53194aba..d76b64543 100644
--- a/tests/validator/test_hed_validator.py
+++ b/tests/validator/test_hed_validator.py
@@ -74,7 +74,7 @@ def test_complex_file_validation_no_index(self):
         self.assertEqual(len(issues), 0)
         input_file = TabularInput(events_path, sidecar=sidecar)
 
-        validation_issues = input_file.validate_file_sidecars(validator)
+        validation_issues = input_file.validate_sidecar(validator)
         self.assertEqual(len(validation_issues), 0)
         validation_issues = input_file.validate_file(validator)
         self.assertEqual(len(validation_issues), 0)
@@ -94,7 +94,7 @@ def test_complex_file_validation_with_index(self):
         self.assertEqual(len(issues), 0)
         input_file = TabularInput(events_path, sidecar=sidecar)
 
-        validation_issues = input_file.validate_file_sidecars(validator)
+        validation_issues = input_file.validate_sidecar(validator)
         self.assertEqual(len(validation_issues), 0)
         validation_issues = input_file.validate_file(validator)
         self.assertEqual(len(validation_issues), 0)
@@ -114,7 +114,7 @@ def test_complex_file_validation_invalid(self):
         self.assertEqual(len(issues), 4)
         input_file = TabularInput(events_path, sidecar=sidecar)
 
-        validation_issues = input_file.validate_file_sidecars(validator, check_for_warnings=True)
+        validation_issues = input_file.validate_sidecar(validator, check_for_warnings=True)
         self.assertEqual(len(validation_issues), 4)
 
         validation_issues = input_file.validate_file(validator, check_for_warnings=True)
@@ -135,7 +135,7 @@ def test_complex_file_validation_invalid_definitions_removed(self):
         input_file = TabularInput(events_path, sidecar=sidecar)
         validator = HedValidator(hed_schema=hed_schema)
 
-        validation_issues1 = input_file.validate_file_sidecars(validator)
+        validation_issues1 = input_file.validate_sidecar(validator)
         self.assertEqual(len(validation_issues1), 4)
 
         validation_issues = input_file.validate_file(validator)
@@ -173,7 +173,7 @@ def test_tabular_input_with_HED_col_in_json(self):
         self.assertEqual(len(issues), 0)
         input_file = TabularInput(events_path, sidecar=sidecar)
 
-        validation_issues = input_file.validate_file_sidecars(validator)
+        validation_issues = input_file.validate_sidecar(validator)
         self.assertEqual(len(validation_issues), 0)
         validation_issues = input_file.validate_file(validator)
         self.assertEqual(len(validation_issues), 1)