diff --git a/stix2/properties.py b/stix2/properties.py
index c876c11..a267eb5 100644
--- a/stix2/properties.py
+++ b/stix2/properties.py
@@ -537,7 +537,7 @@ def enumerate_types(types, spec_version):
     return return_types
 
 
-SELECTOR_REGEX = re.compile(r"^[a-z0-9_-]{3,250}(\.(\[\d+\]|[a-z0-9_-]{1,250}))*$")
+SELECTOR_REGEX = re.compile(r"^([a-z0-9_-]{3,250}(\.(\[\d+\]|[a-z0-9_-]{1,250}))*|id)$")
 
 
 class SelectorProperty(Property):

diff --git a/stix2/test/v20/test_granular_markings.py b/stix2/test/v20/test_granular_markings.py
index e912cc1..ae2da3b 100644
--- a/stix2/test/v20/test_granular_markings.py
+++ b/stix2/test/v20/test_granular_markings.py
@@ -1089,3 +1089,17 @@ def test_clear_marking_not_present(data):
     """Test clearing markings for a selector that has no associated markings."""
     with pytest.raises(MarkingNotFoundError):
         data = markings.clear_markings(data, ["labels"])
+
+
+def test_set_marking_on_id_property():
+    malware = Malware(
+        granular_markings=[
+            {
+                "selectors": ["id"],
+                "marking_ref": MARKING_IDS[0],
+            },
+        ],
+        **MALWARE_KWARGS
+    )
+
+    assert "id" in malware["granular_markings"][0]["selectors"]
diff --git a/stix2/test/v21/test_granular_markings.py b/stix2/test/v21/test_granular_markings.py
index 1c3194b..ff8fe26 100644
--- a/stix2/test/v21/test_granular_markings.py
+++ b/stix2/test/v21/test_granular_markings.py
@@ -1307,3 +1307,17 @@ def test_clear_marking_not_present(data):
     """Test clearing markings for a selector that has no associated markings."""
     with pytest.raises(MarkingNotFoundError):
         markings.clear_markings(data, ["malware_types"])
+
+
+def test_set_marking_on_id_property():
+    malware = Malware(
+        granular_markings=[
+            {
+                "selectors": ["id"],
+                "marking_ref": MARKING_IDS[0],
+            },
+        ],
+        **MALWARE_KWARGS
+    )
+
+    assert "id" in malware["granular_markings"][0]["selectors"]

Placing GranularMarking on id property causes ValueError
https://github.com/oasis-open/cti-python-stix2/blob/6faf6b9fa1bfe65250ac07eaab322ff0f4be6d59/stix2/properties.py#L540

```
Traceback (most recent call last):
  File "C:\Users\user-1\cti-python-stix2\stix2\base.py", line 104, in _check_property
    kwargs[prop_name] = prop.clean(kwargs[prop_name])
  File "C:\Users\user-1\cti-python-stix2\stix2\properties.py", line 216, in clean
    valid = self.contained.clean(item)
  File "C:\Users\user-1\cti-python-stix2\stix2\properties.py", line 547, in clean
    raise ValueError("must adhere to selector syntax.")
ValueError: must adhere to selector syntax.
```
stix2/test/v20/test_granular_markings.py::test_set_marking_on_id_property stix2/test/v21/test_granular_markings.py::test_set_marking_on_id_property
stix2/test/v20/test_granular_markings.py::test_add_marking_mark_one_selector_multiple_refs stix2/test/v20/test_granular_markings.py::test_add_marking_mark_multiple_selector_one_refs[data0] stix2/test/v20/test_granular_markings.py::test_add_marking_mark_multiple_selector_one_refs[data1] stix2/test/v20/test_granular_markings.py::test_add_marking_mark_multiple_selector_one_refs[data2] stix2/test/v20/test_granular_markings.py::test_add_marking_mark_multiple_selector_multiple_refs stix2/test/v20/test_granular_markings.py::test_add_marking_mark_another_property_same_marking stix2/test/v20/test_granular_markings.py::test_add_marking_mark_same_property_same_marking stix2/test/v20/test_granular_markings.py::test_add_marking_bad_selector[data0-marking0] stix2/test/v20/test_granular_markings.py::test_get_markings_smoke[data0] stix2/test/v20/test_granular_markings.py::test_get_markings_not_marked[data0] stix2/test/v20/test_granular_markings.py::test_get_markings_not_marked[data1] stix2/test/v20/test_granular_markings.py::test_get_markings_multiple_selectors[data0] stix2/test/v20/test_granular_markings.py::test_get_markings_bad_selector[data0-foo] stix2/test/v20/test_granular_markings.py::test_get_markings_bad_selector[data1-] stix2/test/v20/test_granular_markings.py::test_get_markings_bad_selector[data2-selector2] stix2/test/v20/test_granular_markings.py::test_get_markings_bad_selector[data3-selector3] stix2/test/v20/test_granular_markings.py::test_get_markings_bad_selector[data4-x.z.[-2]] stix2/test/v20/test_granular_markings.py::test_get_markings_bad_selector[data5-c.f] stix2/test/v20/test_granular_markings.py::test_get_markings_bad_selector[data6-c.[2].i] stix2/test/v20/test_granular_markings.py::test_get_markings_bad_selector[data7-c.[3]] stix2/test/v20/test_granular_markings.py::test_get_markings_bad_selector[data8-d] stix2/test/v20/test_granular_markings.py::test_get_markings_bad_selector[data9-x.[0]] stix2/test/v20/test_granular_markings.py::test_get_markings_bad_selector[data10-z.y.w] stix2/test/v20/test_granular_markings.py::test_get_markings_bad_selector[data11-x.z.[1]] stix2/test/v20/test_granular_markings.py::test_get_markings_bad_selector[data12-x.z.foo3] stix2/test/v20/test_granular_markings.py::test_get_markings_positional_arguments_combinations[data0] stix2/test/v20/test_granular_markings.py::test_remove_marking_remove_one_selector_with_multiple_refs[data0] stix2/test/v20/test_granular_markings.py::test_remove_marking_remove_one_selector_with_multiple_refs[data1] stix2/test/v20/test_granular_markings.py::test_remove_marking_remove_multiple_selector_one_ref stix2/test/v20/test_granular_markings.py::test_remove_marking_mark_one_selector_from_multiple_ones stix2/test/v20/test_granular_markings.py::test_remove_marking_mark_one_selector_markings_from_multiple_ones stix2/test/v20/test_granular_markings.py::test_remove_marking_mark_mutilple_selector_multiple_refs stix2/test/v20/test_granular_markings.py::test_remove_marking_mark_another_property_same_marking stix2/test/v20/test_granular_markings.py::test_remove_marking_mark_same_property_same_marking stix2/test/v20/test_granular_markings.py::test_remove_no_markings stix2/test/v20/test_granular_markings.py::test_remove_marking_bad_selector stix2/test/v20/test_granular_markings.py::test_remove_marking_not_present stix2/test/v20/test_granular_markings.py::test_is_marked_smoke[data0] stix2/test/v20/test_granular_markings.py::test_is_marked_smoke[data1] stix2/test/v20/test_granular_markings.py::test_is_marked_invalid_selector[data0-foo] stix2/test/v20/test_granular_markings.py::test_is_marked_invalid_selector[data1-] stix2/test/v20/test_granular_markings.py::test_is_marked_invalid_selector[data2-selector2] stix2/test/v20/test_granular_markings.py::test_is_marked_invalid_selector[data3-selector3] stix2/test/v20/test_granular_markings.py::test_is_marked_invalid_selector[data4-x.z.[-2]] stix2/test/v20/test_granular_markings.py::test_is_marked_invalid_selector[data5-c.f] stix2/test/v20/test_granular_markings.py::test_is_marked_invalid_selector[data6-c.[2].i] stix2/test/v20/test_granular_markings.py::test_is_marked_invalid_selector[data7-c.[3]] stix2/test/v20/test_granular_markings.py::test_is_marked_invalid_selector[data8-d] stix2/test/v20/test_granular_markings.py::test_is_marked_invalid_selector[data9-x.[0]] stix2/test/v20/test_granular_markings.py::test_is_marked_invalid_selector[data10-z.y.w] stix2/test/v20/test_granular_markings.py::test_is_marked_invalid_selector[data11-x.z.[1]] stix2/test/v20/test_granular_markings.py::test_is_marked_invalid_selector[data12-x.z.foo3] stix2/test/v20/test_granular_markings.py::test_is_marked_mix_selector[data0] stix2/test/v20/test_granular_markings.py::test_is_marked_mix_selector[data1] stix2/test/v20/test_granular_markings.py::test_is_marked_valid_selector_no_refs[data0] stix2/test/v20/test_granular_markings.py::test_is_marked_valid_selector_no_refs[data1] stix2/test/v20/test_granular_markings.py::test_is_marked_valid_selector_and_refs[data0] stix2/test/v20/test_granular_markings.py::test_is_marked_valid_selector_and_refs[data1] stix2/test/v20/test_granular_markings.py::test_is_marked_valid_selector_multiple_refs[data0] stix2/test/v20/test_granular_markings.py::test_is_marked_valid_selector_multiple_refs[data1] stix2/test/v20/test_granular_markings.py::test_is_marked_no_marking_refs[data0] stix2/test/v20/test_granular_markings.py::test_is_marked_no_marking_refs[data1] stix2/test/v20/test_granular_markings.py::test_is_marked_no_selectors[data0] stix2/test/v20/test_granular_markings.py::test_is_marked_no_selectors[data1] stix2/test/v20/test_granular_markings.py::test_is_marked_positional_arguments_combinations stix2/test/v20/test_granular_markings.py::test_create_sdo_with_invalid_marking stix2/test/v20/test_granular_markings.py::test_set_marking_mark_one_selector_multiple_refs stix2/test/v20/test_granular_markings.py::test_set_marking_mark_multiple_selector_one_refs stix2/test/v20/test_granular_markings.py::test_set_marking_mark_multiple_selector_multiple_refs_from_none stix2/test/v20/test_granular_markings.py::test_set_marking_mark_another_property_same_marking stix2/test/v20/test_granular_markings.py::test_set_marking_bad_selector[marking0] stix2/test/v20/test_granular_markings.py::test_set_marking_bad_selector[marking1] stix2/test/v20/test_granular_markings.py::test_set_marking_bad_selector[marking2] stix2/test/v20/test_granular_markings.py::test_set_marking_bad_selector[marking3] stix2/test/v20/test_granular_markings.py::test_set_marking_mark_same_property_same_marking stix2/test/v20/test_granular_markings.py::test_clear_marking_smoke[data0] stix2/test/v20/test_granular_markings.py::test_clear_marking_smoke[data1] stix2/test/v20/test_granular_markings.py::test_clear_marking_multiple_selectors[data0] stix2/test/v20/test_granular_markings.py::test_clear_marking_multiple_selectors[data1] stix2/test/v20/test_granular_markings.py::test_clear_marking_one_selector[data0] stix2/test/v20/test_granular_markings.py::test_clear_marking_one_selector[data1] stix2/test/v20/test_granular_markings.py::test_clear_marking_all_selectors[data0] stix2/test/v20/test_granular_markings.py::test_clear_marking_all_selectors[data1] stix2/test/v20/test_granular_markings.py::test_clear_marking_bad_selector[data0-foo] stix2/test/v20/test_granular_markings.py::test_clear_marking_bad_selector[data1-] stix2/test/v20/test_granular_markings.py::test_clear_marking_bad_selector[data2-selector2] stix2/test/v20/test_granular_markings.py::test_clear_marking_bad_selector[data3-selector3] stix2/test/v20/test_granular_markings.py::test_clear_marking_not_present[data0] stix2/test/v20/test_granular_markings.py::test_clear_marking_not_present[data1] stix2/test/v21/test_granular_markings.py::test_add_marking_mark_one_selector_multiple_refs stix2/test/v21/test_granular_markings.py::test_add_marking_mark_multiple_selector_one_refs[data0] stix2/test/v21/test_granular_markings.py::test_add_marking_mark_multiple_selector_one_refs[data1] stix2/test/v21/test_granular_markings.py::test_add_marking_mark_multiple_selector_one_refs[data2] stix2/test/v21/test_granular_markings.py::test_add_marking_mark_multiple_selector_multiple_refs stix2/test/v21/test_granular_markings.py::test_add_marking_mark_multiple_selector_multiple_refs_mixed stix2/test/v21/test_granular_markings.py::test_add_marking_mark_another_property_same_marking stix2/test/v21/test_granular_markings.py::test_add_marking_mark_same_property_same_marking stix2/test/v21/test_granular_markings.py::test_add_marking_bad_selector[data0-marking0] stix2/test/v21/test_granular_markings.py::test_get_markings_smoke[data0] stix2/test/v21/test_granular_markings.py::test_get_markings_not_marked[data0] stix2/test/v21/test_granular_markings.py::test_get_markings_not_marked[data1] stix2/test/v21/test_granular_markings.py::test_get_markings_multiple_selectors[data0] stix2/test/v21/test_granular_markings.py::test_get_markings_bad_selector[data0-foo] stix2/test/v21/test_granular_markings.py::test_get_markings_bad_selector[data1-] stix2/test/v21/test_granular_markings.py::test_get_markings_bad_selector[data2-selector2] stix2/test/v21/test_granular_markings.py::test_get_markings_bad_selector[data3-selector3] stix2/test/v21/test_granular_markings.py::test_get_markings_bad_selector[data4-x.z.[-2]] stix2/test/v21/test_granular_markings.py::test_get_markings_bad_selector[data5-c.f] stix2/test/v21/test_granular_markings.py::test_get_markings_bad_selector[data6-c.[2].i] stix2/test/v21/test_granular_markings.py::test_get_markings_bad_selector[data7-c.[3]] stix2/test/v21/test_granular_markings.py::test_get_markings_bad_selector[data8-d] stix2/test/v21/test_granular_markings.py::test_get_markings_bad_selector[data9-x.[0]] stix2/test/v21/test_granular_markings.py::test_get_markings_bad_selector[data10-z.y.w] stix2/test/v21/test_granular_markings.py::test_get_markings_bad_selector[data11-x.z.[1]] stix2/test/v21/test_granular_markings.py::test_get_markings_bad_selector[data12-x.z.foo3] stix2/test/v21/test_granular_markings.py::test_get_markings_positional_arguments_combinations[data0] stix2/test/v21/test_granular_markings.py::test_get_markings_multiple_selectors_langs[data0] stix2/test/v21/test_granular_markings.py::test_get_markings_multiple_selectors_with_options[data0] stix2/test/v21/test_granular_markings.py::test_remove_marking_remove_one_selector_with_multiple_refs[data0] stix2/test/v21/test_granular_markings.py::test_remove_marking_remove_one_selector_with_multiple_refs[data1] stix2/test/v21/test_granular_markings.py::test_remove_marking_remove_multiple_selector_one_ref stix2/test/v21/test_granular_markings.py::test_remove_marking_mark_one_selector_from_multiple_ones stix2/test/v21/test_granular_markings.py::test_remove_marking_mark_one_selector_from_multiple_ones_mixed stix2/test/v21/test_granular_markings.py::test_remove_marking_mark_one_selector_markings_from_multiple_ones stix2/test/v21/test_granular_markings.py::test_remove_marking_mark_mutilple_selector_multiple_refs stix2/test/v21/test_granular_markings.py::test_remove_marking_mark_another_property_same_marking stix2/test/v21/test_granular_markings.py::test_remove_marking_mark_same_property_same_marking stix2/test/v21/test_granular_markings.py::test_remove_no_markings stix2/test/v21/test_granular_markings.py::test_remove_marking_bad_selector stix2/test/v21/test_granular_markings.py::test_remove_marking_not_present stix2/test/v21/test_granular_markings.py::test_is_marked_smoke[data0] stix2/test/v21/test_granular_markings.py::test_is_marked_smoke[data1] stix2/test/v21/test_granular_markings.py::test_is_marked_invalid_selector[data0-foo] stix2/test/v21/test_granular_markings.py::test_is_marked_invalid_selector[data1-] stix2/test/v21/test_granular_markings.py::test_is_marked_invalid_selector[data2-selector2] stix2/test/v21/test_granular_markings.py::test_is_marked_invalid_selector[data3-selector3] stix2/test/v21/test_granular_markings.py::test_is_marked_invalid_selector[data4-x.z.[-2]] stix2/test/v21/test_granular_markings.py::test_is_marked_invalid_selector[data5-c.f] stix2/test/v21/test_granular_markings.py::test_is_marked_invalid_selector[data6-c.[2].i] stix2/test/v21/test_granular_markings.py::test_is_marked_invalid_selector[data7-c.[3]] stix2/test/v21/test_granular_markings.py::test_is_marked_invalid_selector[data8-d] stix2/test/v21/test_granular_markings.py::test_is_marked_invalid_selector[data9-x.[0]] stix2/test/v21/test_granular_markings.py::test_is_marked_invalid_selector[data10-z.y.w] stix2/test/v21/test_granular_markings.py::test_is_marked_invalid_selector[data11-x.z.[1]] stix2/test/v21/test_granular_markings.py::test_is_marked_invalid_selector[data12-x.z.foo3] stix2/test/v21/test_granular_markings.py::test_is_marked_mix_selector[data0] stix2/test/v21/test_granular_markings.py::test_is_marked_mix_selector[data1] stix2/test/v21/test_granular_markings.py::test_is_marked_valid_selector_no_refs[data0] stix2/test/v21/test_granular_markings.py::test_is_marked_valid_selector_no_refs[data1] stix2/test/v21/test_granular_markings.py::test_is_marked_valid_selector_and_refs[data0] stix2/test/v21/test_granular_markings.py::test_is_marked_valid_selector_and_refs[data1] stix2/test/v21/test_granular_markings.py::test_is_marked_valid_selector_multiple_refs[data0] stix2/test/v21/test_granular_markings.py::test_is_marked_valid_selector_multiple_refs[data1] stix2/test/v21/test_granular_markings.py::test_is_marked_no_marking_refs[data0] stix2/test/v21/test_granular_markings.py::test_is_marked_no_marking_refs[data1] stix2/test/v21/test_granular_markings.py::test_is_marked_no_selectors[data0] stix2/test/v21/test_granular_markings.py::test_is_marked_no_selectors[data1] stix2/test/v21/test_granular_markings.py::test_is_marked_positional_arguments_combinations stix2/test/v21/test_granular_markings.py::test_create_sdo_with_invalid_marking stix2/test/v21/test_granular_markings.py::test_set_marking_mark_one_selector_multiple_refs stix2/test/v21/test_granular_markings.py::test_set_marking_mark_one_selector_multiple_lang_refs stix2/test/v21/test_granular_markings.py::test_set_marking_mark_multiple_selector_one_refs stix2/test/v21/test_granular_markings.py::test_set_marking_mark_multiple_mixed_markings stix2/test/v21/test_granular_markings.py::test_set_marking_mark_multiple_selector_multiple_refs_from_none stix2/test/v21/test_granular_markings.py::test_set_marking_mark_another_property_same_marking stix2/test/v21/test_granular_markings.py::test_set_marking_bad_selector[marking0] stix2/test/v21/test_granular_markings.py::test_set_marking_bad_selector[marking1] stix2/test/v21/test_granular_markings.py::test_set_marking_bad_selector[marking2] stix2/test/v21/test_granular_markings.py::test_set_marking_bad_selector[marking3] stix2/test/v21/test_granular_markings.py::test_set_marking_mark_same_property_same_marking stix2/test/v21/test_granular_markings.py::test_clear_marking_smoke[data0] stix2/test/v21/test_granular_markings.py::test_clear_marking_smoke[data1] stix2/test/v21/test_granular_markings.py::test_clear_marking_multiple_selectors[data0] stix2/test/v21/test_granular_markings.py::test_clear_marking_multiple_selectors[data1] stix2/test/v21/test_granular_markings.py::test_clear_marking_one_selector[data0] stix2/test/v21/test_granular_markings.py::test_clear_marking_one_selector[data1] stix2/test/v21/test_granular_markings.py::test_clear_marking_all_selectors[data0] stix2/test/v21/test_granular_markings.py::test_clear_marking_all_selectors[data1] stix2/test/v21/test_granular_markings.py::test_clear_marking_bad_selector[data0-foo] stix2/test/v21/test_granular_markings.py::test_clear_marking_bad_selector[data1-] stix2/test/v21/test_granular_markings.py::test_clear_marking_bad_selector[data2-selector2] stix2/test/v21/test_granular_markings.py::test_clear_marking_bad_selector[data3-selector3] stix2/test/v21/test_granular_markings.py::test_clear_marking_not_present[data0] stix2/test/v21/test_granular_markings.py::test_clear_marking_not_present[data1]