diff --git a/stix2/core.py b/stix2/core.py
index 3eaabb0..8ee11f5 100644
--- a/stix2/core.py
+++ b/stix2/core.py
@@ -15,6 +15,10 @@ from .utils import get_dict
 
 class STIXObjectProperty(Property):
 
+    def __init__(self, allow_custom=False):
+        self.allow_custom = allow_custom
+        super(STIXObjectProperty, self).__init__()
+
     def clean(self, value):
         try:
             dictified = get_dict(value)
@@ -25,7 +29,10 @@ class STIXObjectProperty(Property):
         if 'type' in dictified and dictified['type'] == 'bundle':
             raise ValueError('This property may not contain a Bundle object')
 
-        parsed_obj = parse(dictified)
+        if self.allow_custom:
+            parsed_obj = parse(dictified, allow_custom=True)
+        else:
+            parsed_obj = parse(dictified)
         return parsed_obj
 
 
@@ -48,6 +55,10 @@ class Bundle(_STIXBase):
             else:
                 kwargs['objects'] = list(args) + kwargs.get('objects', [])
 
+        allow_custom = kwargs.get('allow_custom', False)
+        if allow_custom:
+            self._properties['objects'] = ListProperty(STIXObjectProperty(True))
+
         super(Bundle, self).__init__(**kwargs)
 
 
diff --git a/stix2/properties.py b/stix2/properties.py
index afe994f..ca7f04c 100644
--- a/stix2/properties.py
+++ b/stix2/properties.py
@@ -124,7 +124,11 @@ class ListProperty(Property):
                 obj_type = self.contained.type
             elif type(self.contained).__name__ is 'STIXObjectProperty':
                 # ^ this way of checking doesn't require a circular import
-                obj_type = type(valid)
+                # valid is already an instance of a python-stix2 class; no need
+                # to turn it into a dictionary and then pass it to the class
+                # constructor again
+                result.append(valid)
+                continue
             else:
                 obj_type = self.contained
 

Unable to creat 'Bundle' when using custom fields with SDO
Hi,

When attempting to generate a bundle, a failure message is created when passing an SDO with custom objects even with `allow_custom=True` set on the SDO object.

example:

`v = factory.create(
Vulnerability,
name="Test Vulnerability",
custom_field = "This is custom",
allow_custom=True
)`

`print Bundle(v)`

Will result in the following output:

`File "stix.py", line 142, in <module>
    print Bundle(v)
  File "/usr/local/lib/python2.7/dist-packages/stix2/core.py", line 51, in __init__
    super(Bundle, self).__init__(**kwargs)
  File "/usr/local/lib/python2.7/dist-packages/stix2/base.py", line 121, in __init__
    self._check_property(prop_name, prop_metadata, setting_kwargs)
  File "/usr/local/lib/python2.7/dist-packages/stix2/base.py", line 55, in _check_property
    kwargs[prop_name] = prop.clean(kwargs[prop_name])
  File "/usr/local/lib/python2.7/dist-packages/stix2/properties.py", line 115, in clean
    valid = self.contained.clean(item)
  File "/usr/local/lib/python2.7/dist-packages/stix2/core.py", line 28, in clean
    parsed_obj = parse(dictified)
  File "/usr/local/lib/python2.7/dist-packages/stix2/core.py", line 94, in parse
    return obj_class(allow_custom=allow_custom, **obj)
  File "/usr/local/lib/python2.7/dist-packages/stix2/base.py", line 104, in __init__
    raise ExtraPropertiesError(cls, extra_kwargs)
stix2.exceptions.ExtraPropertiesError: Unexpected properties for Vulnerability: (custom_field).`



diff --git a/stix2/test/test_custom.py b/stix2/test/test_custom.py
index ff432c1..48529b9 100644
--- a/stix2/test/test_custom.py
+++ b/stix2/test/test_custom.py
@@ -81,6 +81,18 @@ def test_parse_identity_custom_property(data):
     assert identity.foo == "bar"
 
 
+def test_custom_property_in_bundled_object():
+    identity = stix2.Identity(
+        name="John Smith",
+        identity_class="individual",
+        x_foo="bar",
+        allow_custom=True,
+    )
+    bundle = stix2.Bundle(identity, allow_custom=True)
+
+    assert bundle.objects[0].x_foo == "bar"
+
+
 @stix2.sdo.CustomObject('x-new-type', [
     ('property1', stix2.properties.StringProperty(required=True)),
     ('property2', stix2.properties.IntegerProperty()),

pip install -e .
parse_log_pytest
requirements.txt
pytest
pip install tox-travis pre-commit
3.6
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
alabaster==0.7.13
antlr4-python3-runtime==4.9.3
appdirs==1.4.4
async-generator==1.10
attrs==21.4.0
Babel==2.11.0
bleach==4.1.0
bump2version==1.0.1
bumpversion==0.6.0
certifi==2021.5.30
cfgv==3.3.1
charset-normalizer==2.0.12
colorama==0.4.5
coverage==6.2
cpe==1.3.1
decorator==5.1.1
defusedxml==0.7.1
distlib==0.3.9
docutils==0.18.1
entrypoints==0.4
filelock==3.4.1
identify==2.4.4
idna==3.10
imagesize==1.4.1
importlib-metadata==4.8.3
importlib-resources==5.2.3
iniconfig==1.1.1
ipython-genutils==0.2.0
itsdangerous==2.0.1
Jinja2==3.0.3
jsonpointer==2.3
jsonschema==3.2.0
jupyter-client==7.1.2
jupyter-core==4.9.2
jupyterlab-pygments==0.1.2
MarkupSafe==2.0.1
mistune==0.8.4
nbclient==0.5.9
nbconvert==6.0.7
nbformat==5.1.3
nbsphinx==0.8.8
nest-asyncio==1.6.0
nodeenv==1.6.0
packaging==21.3
pandocfilters==1.5.1
platformdirs==2.4.0
pluggy==1.0.0
pre-commit==2.17.0
py==1.11.0
Pygments==2.14.0
pyparsing==3.1.4
pyrsistent==0.18.0
pytest==7.0.1
pytest-cov==4.0.0
python-dateutil==2.9.0.post0
pytz==2025.2
PyYAML==6.0.1
pyzmq==25.1.2
requests==2.27.1
requests-cache==0.7.5
rfc3339-validator==0.1.4
rfc3986-validator==0.1.1
simplejson==3.20.1
six==1.17.0
snowballstemmer==2.2.0
Sphinx==5.3.0
sphinx-prompt==1.5.0
sphinxcontrib-applehelp==1.0.2
sphinxcontrib-devhelp==1.0.2
sphinxcontrib-htmlhelp==2.0.0
sphinxcontrib-jsmath==1.0.1
sphinxcontrib-qthelp==1.0.3
sphinxcontrib-serializinghtml==1.1.5
-e git+https://github.com/oasis-open/cti-python-stix2.git@3c80e5e7ebb641b5feb55337f9470ec9d9d58572#egg=stix2
stix2-patterns==2.0.0
stix2-validator==3.0.2
taxii2-client==2.3.0
testpath==0.6.0
toml==0.10.2
tomli==1.2.3
tornado==6.1
tox==3.28.0
tox-travis==0.13
traitlets==4.3.3
typing_extensions==4.1.1
url-normalize==1.4.3
urllib3==1.26.20
virtualenv==20.16.2
webcolors==1.11.1
webencodings==0.5.1
zipp==3.6.0

name: cti-python-stix2
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
  - certifi=2021.5.30=py36h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - 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=1.1.1w=h7f8727e_0
  - pip=21.2.2=py36h06a4308_0
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - alabaster==0.7.13
      - antlr4-python3-runtime==4.9.3
      - appdirs==1.4.4
      - async-generator==1.10
      - attrs==21.4.0
      - babel==2.11.0
      - bleach==4.1.0
      - bump2version==1.0.1
      - bumpversion==0.6.0
      - cfgv==3.3.1
      - charset-normalizer==2.0.12
      - colorama==0.4.5
      - coverage==6.2
      - cpe==1.3.1
      - decorator==5.1.1
      - defusedxml==0.7.1
      - distlib==0.3.9
      - docutils==0.18.1
      - entrypoints==0.4
      - filelock==3.4.1
      - identify==2.4.4
      - idna==3.10
      - imagesize==1.4.1
      - importlib-metadata==4.8.3
      - importlib-resources==5.2.3
      - iniconfig==1.1.1
      - ipython-genutils==0.2.0
      - itsdangerous==2.0.1
      - jinja2==3.0.3
      - jsonpointer==2.3
      - jsonschema==3.2.0
      - jupyter-client==7.1.2
      - jupyter-core==4.9.2
      - jupyterlab-pygments==0.1.2
      - markupsafe==2.0.1
      - mistune==0.8.4
      - nbclient==0.5.9
      - nbconvert==6.0.7
      - nbformat==5.1.3
      - nbsphinx==0.8.8
      - nest-asyncio==1.6.0
      - nodeenv==1.6.0
      - packaging==21.3
      - pandocfilters==1.5.1
      - platformdirs==2.4.0
      - pluggy==1.0.0
      - pre-commit==2.17.0
      - py==1.11.0
      - pygments==2.14.0
      - pyparsing==3.1.4
      - pyrsistent==0.18.0
      - pytest==7.0.1
      - pytest-cov==4.0.0
      - python-dateutil==2.9.0.post0
      - pytz==2025.2
      - pyyaml==6.0.1
      - pyzmq==25.1.2
      - requests==2.27.1
      - requests-cache==0.7.5
      - rfc3339-validator==0.1.4
      - rfc3986-validator==0.1.1
      - simplejson==3.20.1
      - six==1.17.0
      - snowballstemmer==2.2.0
      - sphinx==5.3.0
      - sphinx-prompt==1.5.0
      - sphinxcontrib-applehelp==1.0.2
      - sphinxcontrib-devhelp==1.0.2
      - sphinxcontrib-htmlhelp==2.0.0
      - sphinxcontrib-jsmath==1.0.1
      - sphinxcontrib-qthelp==1.0.3
      - sphinxcontrib-serializinghtml==1.1.5
      - stix2-patterns==2.0.0
      - stix2-validator==3.0.2
      - taxii2-client==2.3.0
      - testpath==0.6.0
      - toml==0.10.2
      - tomli==1.2.3
      - tornado==6.1
      - tox==3.28.0
      - tox-travis==0.13
      - traitlets==4.3.3
      - typing-extensions==4.1.1
      - url-normalize==1.4.3
      - urllib3==1.26.20
      - virtualenv==20.16.2
      - webcolors==1.11.1
      - webencodings==0.5.1
      - zipp==3.6.0
prefix: /opt/conda/envs/cti-python-stix2

stix2/test/test_custom.py::test_custom_property_in_bundled_object
stix2/test/test_custom.py::test_identity_custom_property stix2/test/test_custom.py::test_identity_custom_property_invalid stix2/test/test_custom.py::test_identity_custom_property_allowed stix2/test/test_custom.py::test_parse_identity_custom_property[{\n stix2/test/test_custom.py::test_custom_object_type stix2/test/test_custom.py::test_custom_object_no_init stix2/test/test_custom.py::test_parse_custom_object_type stix2/test/test_custom.py::test_parse_unregistered_custom_object_type stix2/test/test_custom.py::test_custom_observable_object stix2/test/test_custom.py::test_custom_observable_object_no_init stix2/test/test_custom.py::test_custom_observable_object_invalid_ref_property stix2/test/test_custom.py::test_custom_observable_object_invalid_refs_property stix2/test/test_custom.py::test_custom_observable_object_invalid_refs_list_property stix2/test/test_custom.py::test_custom_observable_object_invalid_valid_refs stix2/test/test_custom.py::test_custom_no_properties_raises_exception stix2/test/test_custom.py::test_custom_wrong_properties_arg_raises_exception stix2/test/test_custom.py::test_parse_custom_observable_object stix2/test/test_custom.py::test_parse_unregistered_custom_observable_object stix2/test/test_custom.py::test_parse_invalid_custom_observable_object stix2/test/test_custom.py::test_observable_custom_property stix2/test/test_custom.py::test_observable_custom_property_invalid stix2/test/test_custom.py::test_observable_custom_property_allowed stix2/test/test_custom.py::test_observed_data_with_custom_observable_object stix2/test/test_custom.py::test_custom_extension stix2/test/test_custom.py::test_custom_extension_wrong_observable_type stix2/test/test_custom.py::test_custom_extension_invalid_observable stix2/test/test_custom.py::test_custom_extension_no_properties stix2/test/test_custom.py::test_custom_extension_empty_properties stix2/test/test_custom.py::test_custom_extension_no_init stix2/test/test_custom.py::test_parse_observable_with_custom_extension stix2/test/test_custom.py::test_parse_observable_with_unregistered_custom_extension
stix2/core.py stix2/properties.py
stix2/core.py stix2/properties.py