diff --git a/.gitignore b/.gitignore
index 6248f48..06a20fa 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,6 +6,7 @@
 dist
 build
 eggs
+.eggs
 parts
 
 # odml files
diff --git a/odml/base.py b/odml/base.py
index 1c64e5b..4cb674a 100644
--- a/odml/base.py
+++ b/odml/base.py
@@ -615,3 +615,19 @@ class Sectionable(BaseObject):
         parent) or None
         """
         return self._repository
+
+    def create_section(self, name, type="undefined", oid=None):
+        """
+        Creates a new subsection that is a child of this section.
+
+        :param name: The name of the section to create.
+        :param type: The type of the section.
+        :param oid: object id, UUID string as specified in RFC 4122. If no id
+                    is provided, an id will be generated and assigned.
+        :return: The new section.
+        """
+        from odml.section import BaseSection
+        sec = BaseSection(name=name, type=type, oid=oid)
+        sec.parent = self
+
+        return sec
diff --git a/odml/property.py b/odml/property.py
index 92f9245..74787dd 100644
--- a/odml/property.py
+++ b/odml/property.py
@@ -62,7 +62,6 @@ class BaseProperty(base.BaseObject):
         if not name:
             name = self._id
 
-        self._name = name
         self._parent = None
         self._name = name
         self._value_origin = value_origin
diff --git a/odml/section.py b/odml/section.py
index 3c47630..bdea567 100644
--- a/odml/section.py
+++ b/odml/section.py
@@ -236,6 +236,12 @@ class BaseSection(base.Sectionable):
         """ The list of all properties contained in this section """
         return self._props
 
+    @property
+    def props(self):
+        """ The list of all properties contained in this section;
+            NIXpy format style alias for 'properties'."""
+        return self._props
+
     @property
     def sections(self):
         """ The list of all child-sections of this section """
@@ -582,3 +588,22 @@ class BaseSection(base.Sectionable):
                              "Section has no parent, cannot reorder in parent list.")
 
         return self._reorder(self.parent.sections, new_index)
+
+    def create_property(self, name, value=None, dtype=None, oid=None):
+        """
+        Create a new property that is a child of this section.
+
+        :param name: The name of the property.
+        :param value: Some data value, it can be a single value or
+                      a list of homogeneous values.
+        :param dtype: The data type of the values stored in the property,
+                      if dtype is not given, the type is deduced from the values.
+                      Check odml.DType for supported data types.
+        :param oid: object id, UUID string as specified in RFC 4122. If no id
+                    is provided, an id will be generated and assigned.
+        :return: The new property.
+        """
+        prop = BaseProperty(name=name, value=value, dtype=dtype, oid=oid)
+        prop.parent = self
+
+        return prop

harmonize attribute naming with nix
Accessing properties in nixpy and odml uses different attribute names, i.e. `props` and `properties`. 
diff --git a/test/test_doc.py b/test/test_doc.py
index 6882493..f28b2f5 100644
--- a/test/test_doc.py
+++ b/test/test_doc.py
@@ -291,3 +291,32 @@ class TestSection(unittest.TestCase):
 
         doc_b.sections["subsecA"].properties[0].name = "newPropB"
         self.assertNotEqual(doc_a, doc_b)
+
+    def test_create_section(self):
+        root = Document()
+        self.assertEqual(len(root.sections), 0)
+
+        name = "subsec"
+        type = "subtype"
+        oid = "79b613eb-a256-46bf-84f6-207df465b8f7"
+        subsec = root.create_section(name, type, oid)
+
+        self.assertEqual(len(root.sections), 1)
+        self.assertEqual(subsec.parent, root)
+        self.assertEqual(root.sections[name], subsec)
+        self.assertEqual(root.sections[name].type, type)
+        self.assertEqual(root.sections[name].oid, oid)
+
+        name = "othersec"
+        subsec = root.create_section(name)
+        self.assertEqual(len(root.sections), 2)
+        self.assertEqual(subsec.parent, root)
+        self.assertEqual(root.sections[name], subsec)
+        self.assertEqual(root.sections[name].type, "undefined")
+
+        name = "subsubsec"
+        subsec = root.sections[0].create_section(name)
+        self.assertEqual(len(root.sections), 2)
+        self.assertEqual(subsec.parent, root.sections[0])
+        self.assertEqual(len(root.sections[0].sections), 1)
+        self.assertEqual(root.sections[0].sections[0].name, name)
diff --git a/test/test_section.py b/test/test_section.py
index 395a26d..29ec649 100644
--- a/test/test_section.py
+++ b/test/test_section.py
@@ -203,6 +203,29 @@ class TestSection(unittest.TestCase):
         with self.assertRaises(ValueError):
             sec.properties[0] = "prop"
 
+        # same tests with props alias
+        prop = Property(name="prop2", parent=sec)
+        newprop = Property(name="newprop2")
+
+        self.assertEqual(prop.parent, sec)
+        self.assertEqual(sec.props[1], prop)
+        self.assertEqual(len(sec.props), 2)
+        self.assertIsNone(newprop.parent)
+
+        sec.props[1] = newprop
+        self.assertEqual(newprop.parent, sec)
+        self.assertEqual(sec.props[1], newprop)
+        self.assertEqual(len(sec.props), 2)
+        self.assertIsNone(prop.parent)
+
+        # Test set property fails
+        with self.assertRaises(ValueError):
+            sec.props[1] = Document()
+        with self.assertRaises(ValueError):
+            sec.props[1] = newsec
+        with self.assertRaises(ValueError):
+            sec.props[1] = "prop2"
+
     def test_id(self):
         s = Section(name="S")
         self.assertIsNotNone(s.id)
@@ -863,6 +886,63 @@ class TestSection(unittest.TestCase):
         self.assertNotEqual(sec_a, sec_b)
         self.assertNotEqual(sec_a.properties, sec_b.properties)
 
+    def test_create_section(self):
+        root = Section("root")
+        self.assertEqual(len(root.sections), 0)
+
+        name = "subsec"
+        type = "subtype"
+        oid = "79b613eb-a256-46bf-84f6-207df465b8f7"
+        subsec = root.create_section(name, type, oid)
+
+        self.assertEqual(len(root.sections), 1)
+        self.assertEqual(subsec.parent, root)
+        self.assertEqual(root.sections[name], subsec)
+        self.assertEqual(root.sections[name].type, type)
+        self.assertEqual(root.sections[name].oid, oid)
+
+        name = "othersec"
+        subsec = root.create_section(name)
+        self.assertEqual(len(root.sections), 2)
+        self.assertEqual(subsec.parent, root)
+        self.assertEqual(root.sections[name], subsec)
+        self.assertEqual(root.sections[name].type, "undefined")
+
+        name = "subsubsec"
+        subsec = root.sections[0].create_section(name)
+        self.assertEqual(len(root.sections), 2)
+        self.assertEqual(subsec.parent, root.sections[0])
+        self.assertEqual(len(root.sections[0].sections), 1)
+        self.assertEqual(root.sections[0].sections[0].name, name)
+
+    def test_create_property(self):
+        root = Section("root")
+        self.assertEqual(len(root.properties), 0)
+
+        name = "prop"
+        oid = "79b613eb-a256-46bf-84f6-207df465b8f7"
+        prop = root.create_property(name, oid=oid)
+        self.assertEqual(len(root.properties), 1)
+        self.assertEqual(prop.parent, root)
+        self.assertEqual(root.properties[name].oid, oid)
+
+        name = "test_values"
+        values = ["a", "b"]
+        prop = root.create_property(name, value=values)
+        self.assertEqual(len(root.properties), 2)
+        self.assertEqual(root.properties[name].value, values)
+
+        name = "test_dtype"
+        dtype = "str"
+        prop = root.create_property(name, dtype=dtype)
+        self.assertEqual(len(root.properties), 3)
+        self.assertEqual(root.properties[name].dtype, dtype)
+
+        name = "test_dtype_fail"
+        dtype = "I do not exist"
+        prop = root.create_property(name, dtype=dtype)
+        self.assertIsNone(prop.dtype)
+
     def test_link(self):
         pass
 

pip install -e .
parse_log_pytest
requirements.txt
pytest
apt-get update apt-get install -y libxml2-dev libxslt1-dev lib32z1-dev
3.9
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
docopt==0.6.2
exceptiongroup==1.2.2
iniconfig==2.1.0
isodate==0.7.2
lxml==5.3.1
-e git+https://github.com/G-Node/python-odml.git@4ce2e1b0e247334d949982abc8c275da3a661320#egg=odML
packaging==24.2
pathlib==1.0.1
pluggy==1.5.0
pyparsing==3.2.3
pytest==8.3.5
PyYAML==3.13
rdflib==7.1.4
tomli==2.2.1

name: python-odml
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - docopt==0.6.2
      - exceptiongroup==1.2.2
      - iniconfig==2.1.0
      - isodate==0.7.2
      - lxml==5.3.1
      - packaging==24.2
      - pathlib==1.0.1
      - pluggy==1.5.0
      - pyparsing==3.2.3
      - pytest==8.3.5
      - pyyaml==3.13
      - rdflib==7.1.4
      - tomli==2.2.1
prefix: /opt/conda/envs/python-odml

test/test_doc.py::TestSection::test_create_section test/test_section.py::TestSection::test_children test/test_section.py::TestSection::test_create_property test/test_section.py::TestSection::test_create_section
test/test_doc.py::TestSection::test_append test/test_doc.py::TestSection::test_comparison test/test_doc.py::TestSection::test_date test/test_doc.py::TestSection::test_extend test/test_doc.py::TestSection::test_get_terminology_equivalent test/test_doc.py::TestSection::test_id test/test_doc.py::TestSection::test_insert test/test_doc.py::TestSection::test_new_id test/test_doc.py::TestSection::test_simple_attributes test/test_section.py::TestSection::test_append test/test_section.py::TestSection::test_clone test/test_section.py::TestSection::test_clone_keep_id test/test_section.py::TestSection::test_comparison test/test_section.py::TestSection::test_contains test/test_section.py::TestSection::test_extend test/test_section.py::TestSection::test_id test/test_section.py::TestSection::test_include test/test_section.py::TestSection::test_insert test/test_section.py::TestSection::test_link test/test_section.py::TestSection::test_merge test/test_section.py::TestSection::test_merge_check test/test_section.py::TestSection::test_name test/test_section.py::TestSection::test_new_id test/test_section.py::TestSection::test_parent test/test_section.py::TestSection::test_path test/test_section.py::TestSection::test_remove test/test_section.py::TestSection::test_reorder test/test_section.py::TestSection::test_repository test/test_section.py::TestSection::test_simple_attributes test/test_section.py::TestSection::test_unmerge
.gitignore odml/base.py odml/section.py odml/property.py
.gitignore odml/base.py odml/section.py odml/property.py