Repository: NextCenturyCorporation/MCS (language: python)

Issue:
EndHabitutation step
Hello,

I have tested the validation example provided for the interactive reorientation task, but after taking the EndHabituation with its predetermined params at step 501 I get a None output, am using the step incorrectly?

Tried on MCS 4.4
Metadata levels oracle, level2, level1

```python
import machine_common_sense as mcs

controller = mcs.create_controller(config_file_path='mcs_config.ini')

scene_data, status = mcs.load_scene_json_file('eval_4_reor_validation_01.json')

output = controller.start_scene(scene_data)

action = "Pass"
for i in range(500):
    output = controller.step(action)

action = output.action_list[0]
output = controller.step(action)

print("Output ", output) # None <--------------

action = "Pass"
for i in range(48):
    output = controller.step(action)

action = output.action_list[0]
output = controller.step(action)

controller.end_scene()

```
MCS-724 Updated the JSON schema GitHub doc
- Added descriptions for the `floorTextures` and `holes` scene properties (that Jacob added earlier this summer)
- Added base sizes for all objects
- Added new materials and linkified them
- Updated stale entries
- Removed max width on all pages

To see it yourself:

```
cd docs
make html
google-chrome _build/html/schema.html
```

Edit: Also includes integration test update for https://github.com/NextCenturyCorporation/ai2thor/pull/167


Discussion / hints:

Fix patch:
diff --git a/.gitignore b/.gitignore
index f7ec84db5..c00f0f5d8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -25,6 +25,7 @@ eggs/
 dist/
 sdist/
 wheels/
+build/
 
 docs/_build
 **/mcs_config.ini
@@ -36,11 +37,11 @@ docs/_build
 *.mp4
 *.png
 *.zip
-scripts/**/*.gif
-scripts/**/*.json
-scripts/**/*.mp4
-scripts/**/*.png
-scripts/**/*.zip
+machine_common_sense/scripts/**/*.gif
+machine_common_sense/scripts/**/*.json
+machine_common_sense/scripts/**/*.mp4
+machine_common_sense/scripts/**/*.png
+machine_common_sense/scripts/**/*.zip
 
 # Logging output and user config
 logs/*.log
diff --git a/CPU_Container.dockerfile b/CPU_Container.dockerfile
index 870f2016e..48705ac4d 100644
--- a/CPU_Container.dockerfile
+++ b/CPU_Container.dockerfile
@@ -9,7 +9,7 @@ ARG DEBIAN_FRONTEND=noninteractive
 ENV TZ=America/New_York
 
 # --build-arg mcsversion=0.0.x to override default in docker build command
-ARG mcsversion=0.4.4
+ARG mcsversion=0.4.5
 ARG mcs_library_version=master
 
 WORKDIR /mcs
diff --git a/Dockerfile b/Dockerfile
index 703fd0e96..b71f1c927 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -19,7 +19,7 @@ ENV NVIDIA_DRIVER_CAPABILITIES ${NVIDIA_DRIVER_CAPABILITIES},display
 # ENV LANG C.UTF-8
 
 # --build-arg mcsversion=0.0.x to override default in docker build command
-ARG mcsversion=0.4.4
+ARG mcsversion=0.4.5
 ARG mcs_library_version=master
 
 WORKDIR /mcs
diff --git a/README.md b/README.md
index 8edb3ed7d..a1b8187b3 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
 
 # MCS Python Package
 
-Python interface for interacting with MCS AI2Thor environment and running scenes. The latest release of the MCS Python library is `0.4.4`. You can find the latest documentation [here](https://nextcenturycorporation.github.io/MCS).
+Python interface for interacting with MCS AI2Thor environment and running scenes. The latest release of the MCS Python library is `0.4.5`. You can find the latest documentation [here](https://nextcenturycorporation.github.io/MCS).
 
 - [Quickstart Installation](#quickstart-installation)
 - [Usage](#usage)
@@ -52,7 +52,7 @@ With the activated Python virtual environment, install the MCS package from the
 
 ### Sample MCS Config File
 
-There may be additional settings you want to specify, which can be accomplished via the MCS configuration file. You can use the [sample_config.ini](./sample_config.ini) file to start. This file has the `metadata` level set to `oracle`, which ensures that the data for all objects in a scene is returned, as well as object masks. For the purposes of this guide, we will pass this along to the MCS controller via the `config_file_path` property, which is outlined in the `Usage` example below.
+There may be additional settings you want to specify, which can be accomplished via the MCS configuration file. You can use the [sample_config.ini](./sample_config.ini) file to start. This file has the `metadata` level set to `oracle`, which ensures that the data for all objects in a scene is returned, as well as object masks. For the purposes of this guide, we will pass this along to the MCS controller via the `config_file_or_dict`, which is outlined in the `Usage` example below.
 
 For more in-depth information on configuration files and more about the different properties within, see the documentation about the [MCS configuration file](https://nextcenturycorporation.github.io/MCS/install.html#mcs-configuration-file)
 
@@ -64,7 +64,7 @@ Example usage of the MCS library:
 import machine_common_sense as mcs
 
 # Unity app file will be downloaded automatically
-controller = mcs.create_controller(config_file_path='./some-path/sample_config.ini')
+controller = mcs.create_controller(config_file_or_dict='./some-path/sample_config.ini')
 
 # Either load the scene data dict from an MCS scene config JSON file or create your own.
 # We will give you the training scene config JSON files and the format to make your own.
diff --git a/docs/source/conf.py b/docs/source/conf.py
index ba03e02c1..801aca22a 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -81,6 +81,9 @@
 # html_static_path = ['_static']
 # html_sidebars = {}
 html_theme = 'classic'
+html_theme_options = {
+    'body_max_width': None
+}
 
 napoleon_use_ivar = True
 autogenerate_summary = True
diff --git a/docs/source/containerize.rst b/docs/source/containerize.rst
index 0914dfe47..02e05209f 100644
--- a/docs/source/containerize.rst
+++ b/docs/source/containerize.rst
@@ -11,7 +11,7 @@ You can run the GPU image with:
 .. code-block:: console
 
     docker run -it -e PYTHONIOENCODING=utf8 -e XAUTHORITY=/tmp/.docker.xauth -e DISPLAY=:1 \
-           -v ${PWD}/machine_common_sense/scenes:/input -v ${PWD}/scripts:/scripts \
+           -v ${PWD}/machine_common_sense/scenes:/input -v ${PWD}/machine_common_sense/scripts:/scripts \
            -v /tmp/.X11-unix:/tmp/.X11-unix \
            -v /tmp/.docker.xauth:/tmp/.docker.xauth \
            --net host --gpus all --rm mcs-playroom:0.0.6 bash
@@ -61,7 +61,7 @@ Run Image (bash)
 
 .. code-block:: console
 
-    docker run -it -p 5900:5900 -v ${PWD}/machine_common_sense/scenes:/input -v ${PWD}/scripts:/scripts mcs-playroom-cpu bash
+    docker run -it -p 5900:5900 -v ${PWD}/machine_common_sense/scenes:/input -v ${PWD}/machine_common_sense/scripts:/scripts mcs-playroom-cpu bash
 
 Run with VNC
 ************
diff --git a/docs/source/dev.rst b/docs/source/dev.rst
index 636c419a4..427c28d5e 100644
--- a/docs/source/dev.rst
+++ b/docs/source/dev.rst
@@ -120,7 +120,9 @@ More Config Options
 
 Outlined here is a list of config file options that can be used **in addition** to the ones listed under the :ref:`MCS Config File` section.
 
-To use an MCS configuration file, you can either pass in a file path via the `config_file_path` property in the create_controller() method, or set the `MCS_CONFIG_FILE_PATH` environment variable to the path of your MCS configuration file (note that the configuration must be an INI file -- see `sample_config.ini <https://github.com/NextCenturyCorporation/MCS/blob/master/sample_config.ini>`_ for an example).
+To use a specific configuration, you can either pass in a file path or dictionary of values via the `config_file_or_dict` in the create_controller() method, or set the `MCS_CONFIG_FILE_PATH` environment variable to the path of your MCS configuration file (note that the configuration must be an INI file -- see `sample_config.ini <https://github.com/NextCenturyCorporation/MCS/blob/master/sample_config.ini>`_ for an example).
+
+Please note that the `MCS_CONFIG_FILE_PATH` environment variable is meant for use by the TA2 team during evaluation.
 
 Developer Config File Properties
 ********************************
@@ -172,10 +174,5 @@ After iterating with the contributor, if you feel the PR is reasonably close, fe
 Releases
 --------
 
-Update the version number in the following files:
+Please see the following `Confluence page <https://nextcentury.atlassian.net/wiki/spaces/MCS/pages/1442742340/MCS+Release+Procedures>`_
 
-- `CPU_Container.dockerfile <https://github.com/NextCenturyCorporation/MCS/blob/master/CPU_Container.dockerfile>`_
-- `Dockerfile <https://github.com/NextCenturyCorporation/MCS/blob/master/Dockerfile>`_
-- `README.md <https://github.com/NextCenturyCorporation/MCS/blob/master/README.md>`_
-- `machine_common_sense/_version.py <https://github.com/NextCenturyCorporation/MCS/blob/master/machine_common_sense/_version.py>`_
-- `docs/source/install.rst <https://github.com/NextCenturyCorporation/MCS/blob/master/docs/source/install.rst>`_ (just the links at the top of the file)
diff --git a/docs/source/examples.rst b/docs/source/examples.rst
index 7345e37a4..6880e593b 100644
--- a/docs/source/examples.rst
+++ b/docs/source/examples.rst
@@ -1,12 +1,12 @@
 Example Usage
 =============
 
-Here are some example usage snippets for different use cases. Note that there are also additional scripts that may be useful in the scripts/ folder of the github project. 
+Here are some example usage snippets for different use cases. Note that there are also additional scripts that may be useful in the machine_common_sense/scripts/ folder of the github project. 
 
-Using your own config file and/or unity build
+Using your own config data and/or unity build
 ----------------------------------------------
 
-In this case, make sure your `MCS_CONFIG_FILE_PATH` path isn't set, as that takes precedence over the `config_file_path` parameter:
+Please note that for the below example, make sure `MCS_CONFIG_FILE_PATH` is not set, since it will override the `config_file_or_dict` specified below and is meant more for internal use by TA2 during evaluation:
 
 .. code-block:: python
 
@@ -14,7 +14,7 @@ In this case, make sure your `MCS_CONFIG_FILE_PATH` path isn't set, as that take
 
     # Specify a location for the Unity app as opposed to downloading it automatically
     controller = mcs.create_controller(unity_app_file_path='./some-path/unity-app', 
-                                       config_file_path='./some-path/config.ini')
+                                       config_file_or_dict='./some-path/config.ini')
 
     # Either load the scene data dict from an MCS scene config JSON file or create your own.
     # We will give you the training scene config JSON files and the format to make your own.
@@ -36,6 +36,12 @@ In this case, make sure your `MCS_CONFIG_FILE_PATH` path isn't set, as that take
     # to the end_scene function here.
     controller.end_scene()
 
+Note that you can alternatively pass in a dictionary of config values:
+
+.. code-block:: python
+
+    controller = mcs.create_controller(unity_app_file_path='./some-path/unity-app', 
+                                       config_file_or_dict={'metadata': 'oracle', 'history_enabled': True})
 
 
 Run multiple scenes sequentially
@@ -46,7 +52,7 @@ Run multiple scenes sequentially
     import machine_common_sense as mcs
 
     # Only create the MCS controller ONCE!
-    controller = mcs.create_controller()
+    controller = mcs.create_controller(config_file_or_dict={})
 
     for scene_json_file_path in scene_json_file_list:
         scene_data, status = mcs.load_scene_json_file(scene_json_file_path)
@@ -71,7 +77,7 @@ Run with console logging
     logger = logging.getLogger('machine_common_sense')
     mcs.init_logging()
 
-    controller = mcs.create_controller(config_file_path='./some-path/config.ini')
+    controller = mcs.create_controller(config_file_or_dict='./some-path/config.ini')
     scene_data, status = mcs.load_scene_json_file(scene_json_file_path)
     output = controller.start_scene(scene_data)
 
diff --git a/docs/source/install.rst b/docs/source/install.rst
index 3b98bb297..50ae8f7e3 100644
--- a/docs/source/install.rst
+++ b/docs/source/install.rst
@@ -2,8 +2,8 @@
 Installation and Setup
 =======================
 
-.. _Download and unzip the Mac ZIP: https://github.com/NextCenturyCorporation/MCS/releases/download/0.4.4/MCS-AI2-THOR-Unity-App-v0.4.4-mac.zip
-.. _Download and unzip the Linux ZIP: https://github.com/NextCenturyCorporation/MCS/releases/download/0.4.4/MCS-AI2-THOR-Unity-App-v0.4.4-linux.zip
+.. _Download and unzip the Mac ZIP: https://github.com/NextCenturyCorporation/MCS/releases/download/0.4.5/MCS-AI2-THOR-Unity-App-v0.4.5-mac.zip
+.. _Download and unzip the Linux ZIP: https://github.com/NextCenturyCorporation/MCS/releases/download/0.4.5/MCS-AI2-THOR-Unity-App-v0.4.5-linux.zip
 
 Virtual Environments
 ------------------------
@@ -93,7 +93,7 @@ Mac Version:
 Addressables
 ************
 
-As of 0.4.4, we are using addressable assets that are stored remotely on AWS, greatly decreasing the size of our Unity releases. This also means that there is a bit of a trade off on first-time start up when you download a new release, since the resources will have to be downloaded. If you would like to avoid this load time on initial start up (which could result in a timeout), you can download the latest release using the links above, and then run the `cache-addressables.py <https://github.com/NextCenturyCorporation/MCS/blob/master/scripts/cache_addressables.py>`_ script:
+As of 0.4.4, we are using addressable assets that are stored remotely on AWS, greatly decreasing the size of our Unity releases. This also means that there is a bit of a trade off on first-time start up when you download a new release, since the resources will have to be downloaded. If you would like to avoid this load time on initial start up (which could result in a timeout), you can download the latest release using the links above, and then run the `cache-addressables.py <https://github.com/NextCenturyCorporation/MCS/blob/master/machine_common_sense/scripts/cache_addressables.py>`_ script:
 
 If the python package is installed from PyPI, the script is available in your virtual environment already.
 
@@ -116,7 +116,7 @@ After downloading the Unity app, you will need to reference the path using the `
 MCS Configuration File
 ----------------------
 
-To use an MCS configuration file, you can either pass in a file path via the `config_file_path` property in the create_controller() method, or set the `MCS_CONFIG_FILE_PATH` environment variable to the path of your MCS configuration file (note that the configuration must be an INI file -- see `sample_config.ini <https://github.com/NextCenturyCorporation/MCS/blob/master/sample_config.ini>`_ for an example).
+To use a specific configuration, you can either pass in a file path or dictionary of values via the `config_file_or_dict` in the create_controller() method, or set the `MCS_CONFIG_FILE_PATH` environment variable to the path of your MCS configuration file (note that the configuration must be an INI file -- see `sample_config.ini <https://github.com/NextCenturyCorporation/MCS/blob/master/sample_config.ini>`_ for an example).
 
 Config File Properties
 **********************
@@ -202,11 +202,9 @@ Example Using the Config File to Generate Scene Graphs or Maps
     import os
     import machine_common_sense as mcs
 
-    os.environ['MCS_CONFIG_FILE_PATH'] = # Path to your MCS configuration file
-
     scene_files = # List of scene configuration file paths
 
-    controller = mcs.create_controller()
+    controller = mcs.create_controller(config_file_or_dict='path/to/config')
 
     for scene_file in scene_files:
         scene_data, status = mcs.load_scene_json_file(scene_file)
diff --git a/docs/source/remotely.rst b/docs/source/remotely.rst
index 378b1bf00..77d114ed4 100644
--- a/docs/source/remotely.rst
+++ b/docs/source/remotely.rst
@@ -39,7 +39,7 @@ Run the following script to test MCS with the X11 server created above.
     # test.py
     import machine_common_sense as mcs
     # use your path to the MCS Unity executable
-    controller = mcs.create_controller()
+    controller = mcs.create_controller(config_file_or_dict={})
     # find a test scene
     scene_file_path = 'docs/source/scenes/ball_far.json'
     scene_data, status = mcs.load_scene_json_file(scene_file_path)
@@ -85,5 +85,5 @@ The following code was run on an AWS p2-xlarge with the Ubuntu Deep Learning AMI
     python -m pip install -r requirements.txt
     python -m pip install -e .
 
-    python scripts/run_just_rotate.py docs/source/scenes/ball_far.json
+    python machine_common_sense/scripts/run_just_rotate.py docs/source/scenes/ball_far.json
 
diff --git a/docs/source/schema.rst b/docs/source/schema.rst
index 25e30c433..bfa0b7505 100644
--- a/docs/source/schema.rst
+++ b/docs/source/schema.rst
@@ -1,12 +1,10 @@
 Scene File Schema
-=================
+#################
 
 Scenes
-------
+======
 
-A **scene** is a JSON object (called a :ref:`scene config<Scene Config>`) that, when passed to the MCS Unity application via the MCS Python Library, describes the objects, materials (colors and textures), and scripted actions that will happen in that specific instance of the MCS 3D simulation environment.
-
-Please note that all scenes are currently in a room that is 5-by-5 (X/Z) and 3 high (Y) using Unity's global coordinate system, where we consider 1 unit to be approximately 2 feet.
+A **scene** is a JSON object (called a :ref:`scene config<Scene Config>`) that, when passed to the MCS Unity application via the machine_common_sense python library, describes the objects, materials (colors and textures), environmental features, and scripted actions that are present in a specific instance of the MCS 3D simulation environment.
 
 Scene Config
 ************
@@ -80,11 +78,12 @@ Example:
 
 Each **scene config** has the following properties:
 
-- `answer` (:ref:`answer config <Answer Config>`, optional): The best answer to the goal for the scene. Default: none
 - `ceilingMaterial` (string, optional): The material (color/texture) for the room's ceiling. See the :ref:`material list <Material List>` for options. Default (v0.0.3+): `"AI2-THOR/Materials/Walls/Drywall"`
 - `floorMaterial` (string, optional): The material (color/texture) for the room's floor. See the :ref:`material list <Material List>` for options. Default (v0.0.3+): `"AI2-THOR/Materials/Fabrics/CarpetWhite 3"`
 - `floorProperties` (:ref:`physics config <Physics Config>`, optional): Enable custom friction, bounciness, and/or drag on the floor. Default: see :ref:`physics config <Physics Config>`.
+- `floorTextures` (:ref:`material position config list <Material Position Config>`, optional): A list of materials to apply to specific areas of the room's floor. These materials override the material set by `floorMaterial` for those specific areas. Default: none
 - `goal` (:ref:`goal config <Goal Config>`, optional): The goal for the scene. Default: none
+- `holes` (:ref:`grid config list <Grid Config>`, optional): The list of X/Z coordinates corresponding to one or more holes in the room's floor. Coordinates must be integers. Holes are always size 1x1 centered on the given X/Z coordinate. Adjacent holes are combined. Y coordinates are ignored. Holes are too deep to escape. Default: none
 - `intuitivePhysics` (bool, optional): Specific performer and room setup for intuitive physics scenes.
 - `isometric` (bool, optional): Specific performer and room setup for agent scenes.
 - `name` (string, required): A unique name for the scene used for our logs. Default: the filename
@@ -156,13 +155,6 @@ Each **goal metadata config** has the following properties:
 
 (Coming soon!)
 
-Answer Config
-*************
-
-Each **answer config** has the following properties:
-
-(Coming soon!)
-
 Change Materials Config
 ***********************
 
@@ -180,6 +172,24 @@ Each **force config** has the following properties:
 - `stepEnd` (integer, required): The step on which the action should end.  Must be equal to or greater than the `stepBegin`.
 - `vector` (:ref:`vector config <Vector Config>`, required): The coordinates to describe the movement. Default: `{ "x": 0, "y": 0, "z": 0 }`
 - `relative` (bool, optional): Whether to apply the force using the object's relative coordinate system, rather than the environment's absolute coordinate system. Default: `false`
+- `repeat` (bool, optional): Whether to indefinitely repeat this action. Will wait `stepWait` number of steps after `stepEnd`, then will execute this action for `stepEnd - stepBegin + 1` number of steps, then repeat. Default: `false`
+- `stepWait` (integer, optional): If `repeat` is `true`, the number of steps to wait after the `stepEnd` before repeating this action. Default: `0`
+
+Grid Config
+*************
+
+Each **grid config** has the following properties:
+
+- `x` (integer)
+- `z` (integer)
+
+Material Position Config
+************************
+
+Each **material position config** has the following properties:
+
+- `material` (string, required): The material to use.
+- `positions` (:ref:`grid config list <Grid Config>`): The list of X/Z coordinates corresponding to one or more areas in which to apply the material. Coordinates must be integers. Areas are always size 1x1 centered on the given X/Z coordinate. Adjacent areas are combined. Y coordinates are ignored.
 
 Move Config
 ***********
@@ -189,6 +199,8 @@ Each **move config** has the following properties:
 - `stepBegin` (integer, required): The step on which the action should begin.  Must be non-negative.  A value of `0` means the action will begin during scene initialization.
 - `stepEnd` (integer, required): The step on which the action should end.  Must be equal to or greater than the `stepBegin`.
 - `vector` (:ref:`vector config <Vector Config>`, required): The coordinates to describe the movement. Default: `{ "x": 0, "y": 0, "z": 0 }`
+- `repeat` (bool, optional): Whether to indefinitely repeat this action. Will wait `stepWait` number of steps after `stepEnd`, then will execute this action for `stepEnd - stepBegin + 1` number of steps, then repeat. Default: `false`
+- `stepWait` (integer, optional): If `repeat` is `true`, the number of steps to wait after the `stepEnd` before repeating this action. Default: `0`
 
 Physics Config
 **************
@@ -228,6 +240,8 @@ Each **size config** has the following properties:
 - `stepBegin` (integer, required): The step on which the action should begin.  Must be non-negative.  A value of `0` means the action will begin during scene initialization.
 - `stepEnd` (integer, required): The step on which the action should end.  Must be equal to or greater than the `stepBegin`.
 - `size` (:ref:`vector config <Vector Config>`, required): The coordinates to describe the size, which is multiplied by the object's current size. Default: `{ "x": 1, "y": 1, "z": 1 }`
+- `repeat` (bool, optional): Whether to indefinitely repeat this action. Will wait `stepWait` number of steps after `stepEnd`, then will execute this action for `stepEnd - stepBegin + 1` number of steps, then repeat. Default: `false`
+- `stepWait` (integer, optional): If `repeat` is `true`, the number of steps to wait after the `stepEnd` before repeating this action. Default: `0`
 
 Single Step Config
 ******************
@@ -243,6 +257,8 @@ Each **step begin and end config** has the following properties:
 
 - `stepBegin` (integer, required): The step on which the action should occur.  Must be non-negative.  A value of `0` means the action will occur during scene initialization.
 - `stepEnd` (integer, required): The step on which the action should end.  Must be equal to or greater than the `stepBegin`.
+- `repeat` (bool, optional): Whether to indefinitely repeat this action. Will wait `stepWait` number of steps after `stepEnd`, then will execute this action for `stepEnd - stepBegin + 1` number of steps, then repeat. Default: `false`
+- `stepWait` (integer, optional): If `repeat` is `true`, the number of steps to wait after the `stepEnd` before repeating this action. Default: `0`
 
 Open Close Config
 *****************
@@ -286,7 +302,7 @@ Room Material Config
 - `back` (string, optional): The material (color/texture) for the room's back outer wall. See the :ref:`material list <Material List>` for options.  If not provided, walls will use 'wallMaterial' property.  Default: none
 
 Object List
------------
+===========
 
 Attributes
 **********
@@ -296,12 +312,15 @@ Attributes
 - Receptacle: Can hold objects with the `PutObject` action.
 - Openable: Can be opened with the `OpenObject` action.
 
-You can use any of these strings with an object's `type` property.
+Interactable Objects
+********************
 
-Block Objects (Blank)
-*********************
+Some objects have attributes like `receptacle` or `openable` by default. Some objects have restrictions on categories of materials that can be used on them; only the listed categories are allowed. Each object's base size is using a scale of (x=1, y=1, z=1). Most objects will be positioned on top of the floor with `position.y = 0`; objects marked with `(*)` instead bisect the floor and must be offset by half their height.
+
+Small Objects
+-------------
 
-Blocks have the `pickupable` and `receptacle` attributes by default. Use the :ref:`block materials (blank) <Block Materials (Blank)>`.
+All of the following object types have the `pickupable` attribute by default.
 
 .. list-table::
     :header-rows: 1
@@ -309,142 +328,250 @@ Blocks have the `pickupable` and `receptacle` attributes by default. Use the :re
     * - Object Type
       - Shape
       - Default Mass
+      - Receptacle
+      - Openable
+      - Materials
+      - Base Size
+      - Details
+    * - `"apple_1"`
+      - apple
+      - 0.25
+      - 
+      - 
+      - none
+      - x=0.111,y=0.12,z=0.122
+      - 
+    * - `"apple_2"`
+      - apple
+      - 0.25
+      - 
+      - 
+      - none
+      - x=0.117,y=0.121,z=0.116
+      - 
+    * - `"ball"`
+      - ball
+      - 1
+      - 
+      - 
+      - :ref:`block_blank <Block Materials (Blank)>`, :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`rubber <Rubber Materials>`, :ref:`wood <Wood Materials>`
+      - x=1,y=1,z=1
+      - 
     * - `"block_blank_blue_cube"`
       - blank block cube
       - 0.66
+      - X
+      -
+      - :ref:`block_blank <Block Materials (Blank)>`, :ref:`wood <Wood Materials>`
+      - x=0.1,y=0.1,z=0.1
+      -
     * - `"block_blank_blue_cylinder"`
       - blank block cylinder
       - 0.66
+      - X
+      -
+      - :ref:`block_blank <Block Materials (Blank)>`, :ref:`wood <Wood Materials>`
+      - x=0.1,y=0.1,z=0.1
+      -
     * - `"block_blank_red_cube"`
       - blank block cube
       - 0.66
+      - X
+      -
+      - :ref:`block_blank <Block Materials (Blank)>`, :ref:`wood <Wood Materials>`
+      - x=0.1,y=0.1,z=0.1
+      -
     * - `"block_blank_red_cylinder"` 
       - blank block cylinder 
       - 0.66
+      - X
+      -
+      - :ref:`block_blank <Block Materials (Blank)>`, :ref:`wood <Wood Materials>`
+      - x=0.1,y=0.1,z=0.1
+      -
     * - `"block_blank_wood_cube"`
       - blank block cube 
       - 0.66
+      - X
+      -
+      - :ref:`block_blank <Block Materials (Blank)>`, :ref:`wood <Wood Materials>`
+      - x=0.1,y=0.1,z=0.1
+      -
     * - `"block_blank_wood_cylinder"` 
       - blank block cylinder 
       - 0.66
+      - X
+      -
+      - :ref:`block_blank <Block Materials (Blank)>`, :ref:`wood <Wood Materials>`
+      - x=0.1,y=0.1,z=0.1
+      -
     * - `"block_blank_yellow_cube"` 
       - blank block cube
       - 0.66
+      - X
+      -
+      - :ref:`block_blank <Block Materials (Blank)>`, :ref:`wood <Wood Materials>`
+      - x=0.1,y=0.1,z=0.1
+      -
     * - `"block_blank_yellow_cylinder"`
       - blank block cylinder 
       - 0.66
-
-Block Objects (Letter/Number)
-*****************************
-
-Blocks have the `pickupable` and `receptacle` attributes by default. Use the :ref:`block materials (letter/number) <Block Materials (Letter/Number)>`.
-
-.. list-table::
-    :header-rows: 1
-
-    * - Object Type
-      - Shape
-      - Default Mass
+      - X
+      -
+      - :ref:`block_blank <Block Materials (Blank)>`, :ref:`wood <Wood Materials>`
+      - x=0.1,y=0.1,z=0.1
+      -
     * - `"block_blue_letter_a"`
       - letter block cube
       - 0.66
+      - X
+      -
+      - :ref:`block_letter_number <Block Materials (Letter/Number)>`, :ref:`wood <Wood Materials>`
+      - x=0.1,y=0.1,z=0.1
+      -
     * - `"block_blue_letter_b"` 
       - letter block cube 
       - 0.66
+      - X
+      -
+      - :ref:`block_letter_number <Block Materials (Letter/Number)>`, :ref:`wood <Wood Materials>`
+      - x=0.1,y=0.1,z=0.1
+      -
     * - `"block_blue_letter_c"`
       - letter block cube 
       - 0.66
+      - X
+      -
+      - :ref:`block_letter_number <Block Materials (Letter/Number)>`, :ref:`wood <Wood Materials>`
+      - x=0.1,y=0.1,z=0.1
+      -
     * - `"block_blue_letter_d"`
       - letter block cube 
       - 0.66
+      - X
+      -
+      - :ref:`block_letter_number <Block Materials (Letter/Number)>`, :ref:`wood <Wood Materials>`
+      - x=0.1,y=0.1,z=0.1
+      -
     * - `"block_blue_letter_m"`
       - letter block cube 
       - 0.66
+      - X
+      -
+      - :ref:`block_letter_number <Block Materials (Letter/Number)>`, :ref:`wood <Wood Materials>`
+      - x=0.1,y=0.1,z=0.1
+      -
     * - `"block_blue_letter_s"`
       - letter block cube 
       - 0.66
+      - X
+      -
+      - :ref:`block_letter_number <Block Materials (Letter/Number)>`, :ref:`wood <Wood Materials>`
+      - x=0.1,y=0.1,z=0.1
+      -
     * - `"block_yellow_number_1"`
       - number block cube 
       - 0.66
+      - X
+      -
+      - :ref:`block_letter_number <Block Materials (Letter/Number)>`, :ref:`wood <Wood Materials>`
+      - x=0.1,y=0.1,z=0.1
+      -
     * - `"block_yellow_number_2"`
       - number block cube 
       - 0.66
+      - X
+      -
+      - :ref:`block_letter_number <Block Materials (Letter/Number)>`, :ref:`wood <Wood Materials>`
+      - x=0.1,y=0.1,z=0.1
+      -
     * - `"block_yellow_number_3"`
       - number block cube 
       - 0.66
+      - X
+      -
+      - :ref:`block_letter_number <Block Materials (Letter/Number)>`, :ref:`wood <Wood Materials>`
+      - x=0.1,y=0.1,z=0.1
+      -
     * - `"block_yellow_number_4"`
       - number block cube 
       - 0.66
+      - X
+      -
+      - :ref:`block_letter_number <Block Materials (Letter/Number)>`, :ref:`wood <Wood Materials>`
+      - x=0.1,y=0.1,z=0.1
+      -
     * - `"block_yellow_number_5"`
       - number block cube 
       - 0.66
+      - X
+      -
+      - :ref:`block_letter_number <Block Materials (Letter/Number)>`, :ref:`wood <Wood Materials>`
+      - x=0.1,y=0.1,z=0.1
+      -
     * - `"block_yellow_number_6"`
       - number block cube 
       - 0.66
-
-Pickupable Objects
-******************
-
-The following object types have the `pickupable` attribute by default.
-
-.. list-table::
-    :header-rows: 1
-
-    * - Object Type
-      - Shape
-      - Default Mass
-      - Receptacle
-      - Openable
-      - Materials
-      - Details
-    * - `"apple_1"`
-      - apple
+      - X
+      -
+      - :ref:`block_letter_number <Block Materials (Letter/Number)>`, :ref:`wood <Wood Materials>`
+      - x=0.1,y=0.1,z=0.1
+      -
+    * - `"bowl_3"`
+      - bowl
       - 0.25
+      - X
       - 
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=0.175,y=0.116,z=0.171
       - 
-      - none
-      - 
-    * - `"apple_2"`
-      - apple
+    * - `"bowl_4"`
+      - bowl
       - 0.25
+      - X
       - 
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=0.209,y=0.059,z=0.206
       - 
-      - none
-      - 
-    * - `"ball"`
-      - ball
-      - 1
-      - 
-      - 
-      - block (blank), metal, plastic, rubber, wood
-      - 
-    * - `"cake"`
-      - cake
-      - 0.5
-      - 
+    * - `"bowl_6"`
+      - bowl
+      - 0.25
+      - X
       - 
-      - none
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=0.198,y=0.109,z=0.201
       - 
     * - `"car_1"`
       - car
       - 0.5
       - 
       - 
-      - block (blank), wood
-      - 
+      - :ref:`block_blank <Block Materials (Blank)>`, :ref:`flat <Flat Materials>`, :ref:`wood <Wood Materials>`
+      - x=0.075,y=0.065,z=0.14
+      - Toy sedan
     * - `"case_1"`
-      - box
+      - case
       - 5
       - X
       - X
-      - metal, plastic
-      - same as suitcase_1
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`
+      - x=0.71,y=0.19,z=0.42
+      - Suitcase. Same as suitcase_1
+    * - `"case_3"`
+      - case
+      - 5
+      - X
+      - X
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`
+      - x=0.81,y=0.21,z=0.56
+      - Suitcase
     * - `"crayon_black"`
       - crayon
       - 0.125
       - 
       - 
       - none
+      - x=0.01,y=0.085,z=0.01
       - 
     * - `"crayon_blue"`
       - crayon
@@ -452,6 +579,7 @@ The following object types have the `pickupable` attribute by default.
       - 
       - 
       - none
+      - x=0.01,y=0.085,z=0.01
       - 
     * - `"crayon_green"`
       - crayon
@@ -459,6 +587,7 @@ The following object types have the `pickupable` attribute by default.
       - 
       - 
       - none
+      - x=0.01,y=0.085,z=0.01
       - 
     * - `"crayon_pink"`
       - crayon
@@ -466,6 +595,7 @@ The following object types have the `pickupable` attribute by default.
       - 
       - 
       - none
+      - x=0.01,y=0.085,z=0.01
       - 
     * - `"crayon_red"`
       - crayon
@@ -473,6 +603,7 @@ The following object types have the `pickupable` attribute by default.
       - 
       - 
       - none
+      - x=0.01,y=0.085,z=0.01
       - 
     * - `"crayon_yellow"`
       - crayon
@@ -480,69 +611,47 @@ The following object types have the `pickupable` attribute by default.
       - 
       - 
       - none
-      - 
-    * - `"dog_on_wheels"`
-      - dog
-      - 0.5
-      - 
-      - 
-      - block (blank), wood
-      - 
-    * - `"duck_on_wheels"`
-      - duck
-      - 0.5
-      - 
-      - 
-      - block (blank), wood
-      - 
-    * - `"bowl_3"`
-      - bowl
-      - 0.25
-      - X
-      - 
-      - metal, plastic, wood
-      - 
-    * - `"bowl_4"`
-      - bowl
-      - 0.25
-      - X
-      - 
-      - metal, plastic, wood
-      - 
-    * - `"bowl_6"`
-      - bowl
-      - 0.25
-      - X
-      - 
-      - metal, plastic, wood
+      - x=0.01,y=0.085,z=0.01
       - 
     * - `"cup_2"`
       - cup
       - 0.25
       - X
       - 
-      - metal, plastic, wood
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=0.105,y=0.135,z=0.104
       - 
     * - `"cup_3"`
       - cup
       - 0.25
       - X
       - 
-      - metal, plastic, wood
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=0.123,y=0.149,z=0.126
       - 
     * - `"cup_6"`
       - cup
       - 0.25
       - X
       - 
-      - metal, plastic, wood
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=0.106,y=0.098,z=0.106
       - 
-    * - `"gift_box_1"`
-      - box
+    * - `"dog_on_wheels"`
+      - dog
       - 0.5
-      - X
-      - X
-      - cardboard
+      - 
+      - 
+      - :ref:`block_blank <Block Materials (Blank)>`, :ref:`flat <Flat Materials>`, :ref:`wood <Wood Materials>`
+      - x=0.355,y=0.134,z=0.071
+      - 
+    * - `"duck_on_wheels"`
+      - duck
+      - 0.5
+      - 
+      - 
+      - :ref:`block_blank <Block Materials (Blank)>`, :ref:`flat <Flat Materials>`, :ref:`wood <Wood Materials>`
+      - x=0.21,y=0.17,z=0.065
       - 
     * - `"pacifier"`
       - pacifier
@@ -550,62 +659,71 @@ The following object types have the `pickupable` attribute by default.
       - 0.5
       - 
       - none
+      - x=0.07,y=0.04,z=0.05
       - 
     * - `"plate_1"`
       - plate
       - 0.25
       - X
       - 
-      - metal, plastic, wood
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=0.208,y=0.117,z=0.222
       - 
     * - `"plate_3"`
       - plate
       - 0.25
       - X
       - 
-      - metal, plastic, wood
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=0.304,y=0.208,z=0.305
       - 
     * - `"plate_4"`
       - plate
       - 0.25
       - X
       - 
-      - metal, plastic, wood
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=0.202,y=0.113,z=0.206
       - 
     * - `"racecar_red"`
       - car
       - 0.5
       - 
       - 
-      - block (blank), wood
-      - 
+      - :ref:`block_blank <Block Materials (Blank)>`, :ref:`flat <Flat Materials>`, :ref:`wood <Wood Materials>`
+      - x=0.07,y=0.06,z=0.15
+      - Toy racecar
     * - `"soccer_ball"`
       - ball
       - 0.5
       - 
       - 
       - none
-      - 
+      - x=0.22,y=0.22,z=0.22
+      - (*)
     * - `"suitcase_1"`
-      - box 
+      - case 
       - 5
       - X
       - X
-      - metal, plastic
-      - same as case_1
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`
+      - x=0.71,y=0.19,z=0.42
+      - Same as case_1
     * - `"train_1"`
       - train
       - 0.5
       - 
       - 
-      - block (blank), wood
+      - :ref:`block_blank <Block Materials (Blank)>`, :ref:`flat <Flat Materials>`, :ref:`wood <Wood Materials>`
+      - x=0.16,y=0.2,z=0.23
       - 
     * - `"trolley_1"`
       - trolley
       - 0.5
       - 
       - 
-      - block (blank), wood
+      - :ref:`block_blank <Block Materials (Blank)>`, :ref:`flat <Flat Materials>`, :ref:`wood <Wood Materials>`
+      - x=0.16,y=0.2,z=0.23
       - 
     * - `"trophy"`
       - trophy
@@ -613,24 +731,27 @@ The following object types have the `pickupable` attribute by default.
       - 
       - 
       - none
+      - x=0.19,y=0.3,z=0.14
       - 
     * - `"truck_1"`
       - truck
       - 0.5
       - 
       - 
-      - block (blank), wood
+      - :ref:`block_blank <Block Materials (Blank)>`, :ref:`flat <Flat Materials>`, :ref:`wood <Wood Materials>`
+      - x=0.2,y=0.18,z=0.25
       - 
     * - `"turtle_on_wheels"`
       - turtle
       - 
       - 
       - 0.5
-      - block (blank), wood
+      - :ref:`block_blank <Block Materials (Blank)>`, :ref:`flat <Flat Materials>`, :ref:`wood <Wood Materials>`
+      - x=0.24,y=0.14,z=0.085
       - 
 
 Furniture Objects
-*****************
+-----------------
 
 .. list-table::
     :header-rows: 1
@@ -642,6 +763,7 @@ Furniture Objects
       - Receptacle
       - Openable
       - Materials
+      - Base Size
       - Details
     * - `"bookcase_1_shelf"`
       - bookcase
@@ -649,7 +771,8 @@ Furniture Objects
       - 
       - X
       - 
-      - metal, plastic, wood
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=1,y=1,z=0.5
       - 
     * - `"bookcase_2_shelf"`
       - bookcase
@@ -657,7 +780,8 @@ Furniture Objects
       - 
       - X
       - 
-      - metal, plastic, wood
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=1,y=1.5,z=0.5
       - 
     * - `"bookcase_3_shelf"`
       - bookcase
@@ -665,7 +789,8 @@ Furniture Objects
       - 
       - X
       - 
-      - metal, plastic, wood
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=1,y=2,z=0.5
       - 
     * - `"bookcase_4_shelf"`
       - bookcase
@@ -673,7 +798,8 @@ Furniture Objects
       - 
       - X
       - 
-      - metal, plastic, wood
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=1,y=2.5,z=0.5
       - 
     * - `"bookcase_1_shelf_sideless"`
       - bookcase
@@ -681,7 +807,8 @@ Furniture Objects
       - 
       - X
       - 
-      - metal, plastic, wood
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=1,y=1,z=0.5
       - 
     * - `"bookcase_2_shelf_sideless"`
       - bookcase
@@ -689,7 +816,8 @@ Furniture Objects
       - 
       - X
       - 
-      - metal, plastic, wood
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=1,y=1.5,z=0.5
       - 
     * - `"bookcase_3_shelf_sideless"`
       - bookcase
@@ -697,7 +825,8 @@ Furniture Objects
       - 
       - X
       - 
-      - metal, plastic, wood
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=1,y=2,z=0.5
       - 
     * - `"bookcase_4_shelf_sideless"`
       - bookcase
@@ -705,7 +834,8 @@ Furniture Objects
       - 
       - X
       - 
-      - metal, plastic, wood
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=1,y=2.5,z=0.5
       - 
     * - `"cart_1"`
       - cart
@@ -713,47 +843,17 @@ Furniture Objects
       - X
       - X
       - 
-      - metal
+      - :ref:`metal <Metal Materials>`
+      - x=0.725,y=1.29,z=0.55
       - 
-    * - `"chest_1"`
-      - box
-      - 15
-      - 
-      - X
-      - X
-      - metal, plastic, wood
-      - Rectangular box
-    * - `"chest_2"`
-      - box
-      - 15
-      - 
-      - X
-      - X
-      - metal, plastic, wood
-      - Domed chest
-    * - `"chest_3"`
-      - box
-      - 15
-      - 
-      - X
-      - X
-      - metal, plastic, wood
-      - Rectangular box
-    * - `"chest_8"`
-      - box
-      - 15
-      - 
-      - X
-      - X
-      - metal, plastic, wood
-      - Domed chest
     * - `"chair_1"`
       - chair
       - 5
       - X
       - X
       - 
-      - metal, plastic, wood
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=0.54,y=1.04,z=0.46
       - 
     * - `"chair_2"`
       - stool
@@ -761,7 +861,8 @@ Furniture Objects
       - X
       - X
       - 
-      - metal, plastic, wood
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=0.3,y=0.75,z=0.3
       - 
     * - `"chair_3"`
       - stool
@@ -769,7 +870,8 @@ Furniture Objects
       - X
       - X
       - 
-      - metal, plastic, wood
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=0.42,y=0.8,z=0.63
       - 
     * - `"chair_4"`
       - chair
@@ -777,7 +879,8 @@ Furniture Objects
       - X
       - X
       - 
-      - metal, plastic
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`
+      - x=0.54,y=0.88,z=0.44
       - 
     * - `"changing_table"`
       - changing table
@@ -785,23 +888,53 @@ Furniture Objects
       - 
       - X
       - X
-      - wood
+      - :ref:`wood <Wood Materials>`
+      - x=1.1,y=0.96,z=0.58
       - 
-    * - `"crib"`
-      - crib
-      - 25
+    * - `"chest_1"`
+      - box
+      - 15
       - 
+      - X
+      - X
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=0.83,y=0.42,z=0.55
+      - Rectangular box
+    * - `"chest_2"`
+      - box
+      - 15
       - 
+      - X
+      - X
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=0.52,y=0.42,z=0.31
+      - Domed chest
+    * - `"chest_3"`
+      - box
+      - 15
       - 
-      - wood
+      - X
+      - X
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=0.46,y=0.26,z=0.32
+      - Rectangular box
+    * - `"chest_8"`
+      - box
+      - 15
       - 
-    * - `"foam_floor_tiles"`
-      - foam floor tiles
-      - 1
+      - X
+      - X
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=0.42,y=0.32,z=0.36
+      - Domed chest
+    * - `"crib"`
+      - crib
+      - 25
       - 
       - 
       - 
-      - none
+      - :ref:`wood <Wood Materials>`
+      - x=0.65,y=0.9,z=1.25
       - 
     * - `"shelf_1"`
       - shelf
@@ -809,7 +942,8 @@ Furniture Objects
       - 
       - X
       - 
-      - metal, plastic, wood
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=0.78,y=0.77,z=0.4
       - Object with four cubbies
     * - `"shelf_2"`
       - shelf
@@ -817,7 +951,8 @@ Furniture Objects
       - 
       - X
       - 
-      - metal, plastic, wood
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=0.93,y=0.73,z=1.02
       - Object with three shelves
     * - `"sofa_1"`
       - sofa
@@ -825,7 +960,8 @@ Furniture Objects
       - 
       - X
       - 
-      - sofa 1
+      - :ref:`sofa_1 <Sofa 1 Materials>`
+      - x=2.64,y=1.15,z=1.23
       - 
     * - `"sofa_2"`
       - sofa
@@ -833,7 +969,8 @@ Furniture Objects
       - 
       - X
       - 
-      - sofa 2
+      - :ref:`sofa_2 <Sofa 2 Materials>`
+      - x=2.55,y=1.25,z=0.95
       - 
     * - `"sofa_3"`
       - sofa
@@ -841,7 +978,8 @@ Furniture Objects
       - 
       - X
       - 
-      - sofa 3
+      - :ref:`sofa_3 <Sofa 3 Materials>`
+      - x=2.4,y=1.25,z=0.95
       - 
     * - `"sofa_chair_1"`
       - sofa chair
@@ -849,7 +987,8 @@ Furniture Objects
       - 
       - X
       - 
-      - sofa chair 1
+      - :ref:`sofa_chair_1 <Sofa Chair 1 Materials>`
+      - x=1.43,y=1.15,z=1.23
       - 
     * - `"sofa_chair_2"`
       - sofa chair
@@ -857,7 +996,8 @@ Furniture Objects
       - 
       - X
       - 
-      - sofa 2
+      - :ref:`sofa_2 <Sofa 2 Materials>`
+      - x=1.425,y=1.25,z=0.95
       - 
     * - `"sofa_chair_3"`
       - sofa chair
@@ -865,7 +1005,8 @@ Furniture Objects
       - 
       - X
       - 
-      - sofa 3
+      - :ref:`sofa_3 <Sofa 3 Materials>`
+      - x=1.425,y=1.25,z=0.95
       - 
     * - `"table_1"`
       - table
@@ -873,7 +1014,8 @@ Furniture Objects
       - X
       - X
       - 
-      - metal, plastic, wood
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=0.69,y=0.88,z=1.63
       - Rectangular table with legs
     * - `"table_2"`
       - table
@@ -881,7 +1023,8 @@ Furniture Objects
       - X
       - X
       - 
-      - metal, plastic, wood
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=0.67,y=0.74,z=0.67
       - Circular table
     * - `"table_3"`
       - table
@@ -889,7 +1032,8 @@ Furniture Objects
       - X
       - X
       - 
-      - metal, plastic, wood
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=0.573,y=1.018,z=0.557
       - Circular table
     * - `"table_4"`
       - table
@@ -897,7 +1041,8 @@ Furniture Objects
       - X
       - X
       - 
-      - metal, plastic, wood
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=0.62,y=0.62,z=1.17
       - Semi-circular table
     * - `"table_5"`
       - table
@@ -905,7 +1050,8 @@ Furniture Objects
       - X
       - X
       - 
-      - metal, wood
+      - :ref:`metal <Metal Materials>`, :ref:`wood <Wood Materials>`
+      - x=1.2,y=0.7,z=0.9
       - Rectangular table with sides
     * - `"table_7"`
       - table
@@ -913,7 +1059,17 @@ Furniture Objects
       - X
       - X
       - 
-      - metal, wood
+      - :ref:`metal <Metal Materials>`, :ref:`wood <Wood Materials>`
+      - x=1.02,y=0.45,z=0.65
+      - Rectangular table with legs
+    * - `"table_8"`
+      - table
+      - 10
+      - X
+      - X
+      - 
+      - :ref:`metal <Metal Materials>`, :ref:`wood <Wood Materials>`
+      - x=0.65,y=0.71,z=1.02
       - Rectangular table with legs
     * - `"table_11"`
       - table
@@ -921,7 +1077,8 @@ Furniture Objects
       - X
       - X
       - 
-      - metal, plastic, wood
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=1,y=0.5,z=1
       - Rectangular table with T legs
     * - `"table_12"`
       - table
@@ -929,7 +1086,8 @@ Furniture Objects
       - X
       - X
       - 
-      - metal, plastic, wood
+      - :ref:`metal <Metal Materials>`, :ref:`plastic <Plastic Materials>`, :ref:`wood <Wood Materials>`
+      - x=1,y=0.5,z=1
       - Rectangular table with X legs
     * - `"tv_2"`
       - television
@@ -937,21 +1095,23 @@ Furniture Objects
       - 
       - 
       - 
-      - 
-      - 
+      - none
+      - x=1.234,y=0.896,z=0.256
+      - (*)
     * - `"wardrobe"`
       - wardrobe
       - 100
       - 
       - X
       - X
-      - wood
+      - :ref:`wood <Wood Materials>`
+      - x=1.07,y=2.1,z=0.49
       - 
 
 Primitive Objects
 *****************
 
-The following primitive shapes have the `physics` attribute by default, a default mass of 1, default dimensions of (x=1, y=1, z=1), and no material restrictions. Please note these are NOT the internal Unity primitive 3D GameObjects.
+The following objects have a default mass of 1, base size of (x=1, y=1, z=1), and no material restrictions. You can configure them with properties like `physics`, `moveable`, `pickupable`, or `structure`. Please note that these are NOT the internal Unity primitive 3D GameObjects.
 
 - `"circle_frustum"`
 - `"cone"`
@@ -967,117 +1127,53 @@ The following primitive shapes have the `physics` attribute by default, a defaul
 Other Objects
 *************
 
-- `"cube_hollow_narrow"`
-- `"cube_hollow_wide"`
-- `"hash"`
-- `"letter_l_narrow"`
-- `"letter_l_wide"`
-- `"letter_x"`
+The following objects have a default mass of 1 and no material restrictions. You can configure them with properties like `physics`, `moveable`, `pickupable`, or `structure`.
+
+.. list-table::
+    :header-rows: 1
+
+    * - Object Type
+      - Base Size
+    * - `"cube_hollow_narrow"`
+      - (x=1,y=1,z=1)
+    * - `"cube_hollow_wide"`
+      - (x=1,y=1,z=1)
+    * - `"hash"`
+      - (x=1,y=1,z=1)
+    * - `"letter_l_narrow"`
+      - (x=0.5,y=1,z=0.5)
+    * - `"letter_l_wide"`
+      - (x=1,y=1,z=0.5)
+    * - `"letter_l_wide_tall"`
+      - (x=1,y=2,z=0.5)
+    * - `"letter_x"`
+      - (x=1,y=1,z=1)
+    * - `"lock_wall"`
+      - (x=1,y=1,z=1)
 
 Deprecated Objects
 ******************
 
 The following object types are not currently used:
 
-.. list-table::
-    :header-rows: 1
-
-    * - Object Type
-      - Moveable
-      - Pickupable
-      - Receptacle
-      - Openable
-      - Materials
-    * - `"box_2"`
-      - X
-      - X
-      - X
-      - X
-      - cardboard
-    * - `"box_3"`
-      - X
-      - X
-      - X
-      - X
-      - cardboard
-    * - `"box_4"`
-      - X
-      - X
-      - X
-      - X
-      - cardboard
-    * - `"painting_2"`
-      - 
-      - 
-      - 
-      - 
-      - none
-    * - `"painting_4"`
-      - 
-      - 
-      - 
-      - 
-      - none
-    * - `"painting_5"`
-      - 
-      - 
-      - 
-      - 
-      - none
-    * - `"painting_9"`
-      - 
-      - 
-      - 
-      - 
-      - none
-    * - `"painting_10"`
-      - 
-      - 
-      - 
-      - 
-      - none
-    * - `"painting_16"`
-      - 
-      - 
-      - 
-      - 
-      - none
-    * - `"plant_1"`
-      - 
-      - 
-      - 
-      - 
-      - none
-    * - `"plant_5"`
-      - 
-      - 
-      - 
-      - 
-      - none
-    * - `"plant_7"`
-      - 
-      - 
-      - 
-      - 
-      - none
-    * - `"plant_9"`
-      - 
-      - 
-      - 
-      - 
-      - none
-    * - `"plant_12"`
-      - 
-      - 
-      - 
-      - 
-      - none
-    * - `"plant_16"`
-      - 
-      - 
-      - 
-      - 
-      - none
+* - `"box_2"`
+* - `"box_3"`
+* - `"box_4"`
+* - `"cake"`
+* - `"foam_floor_tiles"`
+* - `"gift_box_1"`
+* - `"painting_2"`
+* - `"painting_4"`
+* - `"painting_5"`
+* - `"painting_9"`
+* - `"painting_10"`
+* - `"painting_16"`
+* - `"plant_1"`
+* - `"plant_5"`
+* - `"plant_7"`
+* - `"plant_9"`
+* - `"plant_12"`
+* - `"plant_16"`
 
 Child Components
 ****************
@@ -1086,15 +1182,70 @@ Some objects have child components representing cabinets, drawers, or shelves. C
 
 The following objects have the following child components:
 
-- `"changing_table"`:
-  - `"<id>_drawer_top"`
-  - `"<id>_drawer_bottom"`
-  - `"<id>_shelf_top"`
-  - `"<id>_shelf_middle"`
-  - `"<id>_shelf_bottom"`
+* `"changing_table"`:
+    * `"<id>_drawer_top"`
+    * `"<id>_drawer_bottom"`
+    * `"<id>_shelf_top"`
+    * `"<id>_shelf_middle"`
+    * `"<id>_shelf_bottom"`
+* `"bookcase_1_shelf"`:
+    * `"<id>_bottom"`
+    * `"<id>_shelf_1"`
+* `"bookcase_1_shelf_sideless"`:
+    * `"<id>_bottom"`
+    * `"<id>_shelf_1"`
+* `"bookcase_2_shelf"`:
+    * `"<id>_bottom"`
+    * `"<id>_shelf_1"`
+    * `"<id>_shelf_2"`
+* `"bookcase_2_shelf_sideless"`:
+    * `"<id>_bottom"`
+    * `"<id>_shelf_1"`
+    * `"<id>_shelf_2"`
+* `"bookcase_3_shelf"`:
+    * `"<id>_bottom"`
+    * `"<id>_shelf_1"`
+    * `"<id>_shelf_2"`
+    * `"<id>_shelf_3"`
+* `"bookcase_3_shelf_sideless"`:
+    * `"<id>_bottom"`
+    * `"<id>_shelf_1"`
+    * `"<id>_shelf_2"`
+    * `"<id>_shelf_3"`
+* `"bookcase_4_shelf"`:
+    * `"<id>_bottom"`
+    * `"<id>_shelf_1"`
+    * `"<id>_shelf_2"`
+    * `"<id>_shelf_3"`
+    * `"<id>_shelf_4"`
+* `"bookcase_4_shelf_sideless"`:
+    * `"<id>_bottom"`
+    * `"<id>_shelf_1"`
+    * `"<id>_shelf_2"`
+    * `"<id>_shelf_3"`
+    * `"<id>_shelf_4"`
+* `"shelf_1"`:
+    * `"<id>_bottom_left_shelf"`
+    * `"<id>_bottom_right_shelf"`
+    * `"<id>_top_left_shelf"`
+    * `"<id>_top_right_shelf"`
+* `"shelf_2"`:
+    * `"<id>_middle_shelf"`
+    * `"<id>_lower_shelf"`
+* `"wardrobe"`:
+    * `"<id>_bottom_shelf_left"`
+    * `"<id>_left_door"`
+    * `"<id>_lower_drawer_bottom_left"`
+    * `"<id>_lower_drawer_bottom_right"`
+    * `"<id>_lower_drawer_top_left"`
+    * `"<id>_lower_drawer_top_right"`
+    * `"<id>_middle_shelf_left"`
+    * `"<id>_middle_shelf_right"`
+    * `"<id>_right_door"`
+    * `"<id>_top_shelf"`
 
 Material List
--------------
+=============
 
 In Unity, "Materials" are the colors and textures applied to objects in the 3D simulation environment. Some objects may have default materials. Some objects may have multiple materials. Some materials may have patterns intended for objects of a specific size, and may look odd if applied to objects that are too big or small.
 
@@ -1105,7 +1256,7 @@ The following materials are currently available:
 Block Materials (Blank)
 ***********************
 
-Colors that look good on the blank blocks, as well as some of the baby toys.
+Colors that were designed for the blank blocks, and look good on some of the wooden baby toys.
 
 - `"UnityAssetStore/Wooden_Toys_Bundle/ToyBlocks/meshes/Materials/blue_1x1"`
 - `"UnityAssetStore/Wooden_Toys_Bundle/ToyBlocks/meshes/Materials/gray_1x1"`
@@ -1144,6 +1295,7 @@ Ceramic Materials
 
 - `"AI2-THOR/Materials/Ceramics/BrownMarbleFake 1"`
 - `"AI2-THOR/Materials/Ceramics/ConcreteBoards1"`
+- `"AI2-THOR/Materials/Ceramics/ConcreteFloor"`
 - `"AI2-THOR/Materials/Ceramics/GREYGRANITE"`
 - `"AI2-THOR/Materials/Ceramics/PinkConcrete_Bedroom1"`
 - `"AI2-THOR/Materials/Ceramics/RedBrick"`
@@ -1153,13 +1305,79 @@ Ceramic Materials
 Fabric Materials
 ****************
 
+- `"AI2-THOR/Materials/Fabrics/BedroomCarpet"` (blue pattern)
 - `"AI2-THOR/Materials/Fabrics/Carpet2"`
+- `"AI2-THOR/Materials/Fabrics/Carpet3"`
 - `"AI2-THOR/Materials/Fabrics/Carpet4"`
+- `"AI2-THOR/Materials/Fabrics/Carpet8"`
 - `"AI2-THOR/Materials/Fabrics/CarpetDark"`
+- `"AI2-THOR/Materials/Fabrics/CarpetDark 1"`
+- `"AI2-THOR/Materials/Fabrics/CarpetDarkGreen"`
 - `"AI2-THOR/Materials/Fabrics/CarpetGreen"`
+- `"AI2-THOR/Materials/Fabrics/CarpetWhite"`
 - `"AI2-THOR/Materials/Fabrics/CarpetWhite 3"`
+- `"AI2-THOR/Materials/Fabrics/HotelCarpet"` (red pattern)
 - `"AI2-THOR/Materials/Fabrics/HotelCarpet3"` (red pattern)
+- `"AI2-THOR/Materials/Fabrics/RUG2"` (red and blue pattern)
+- `"AI2-THOR/Materials/Fabrics/Rug3"` (blue and red pattern)
+- `"AI2-THOR/Materials/Fabrics/RUG4"` (red and yellow pattern)
+- `"AI2-THOR/Materials/Fabrics/Rug5"` (white pattern)
+- `"AI2-THOR/Materials/Fabrics/Rug6"` (green, purple, and red pattern)
+- `"AI2-THOR/Materials/Fabrics/RUG7"` (red and blue pattern)
 - `"AI2-THOR/Materials/Fabrics/RugPattern224"` (brown, green, and white pattern)
+- `"Custom/Materials/AzureCarpetMCS"`
+- `"Custom/Materials/BlueCarpetMCS"`
+- `"Custom/Materials/ChartreuseCarpetMCS"`
+- `"Custom/Materials/CyanCarpetMCS"`
+- `"Custom/Materials/GreenCarpetMCS"`
+- `"Custom/Materials/GreyCarpetMCS"`
+- `"Custom/Materials/LimeCarpetMCS"`
+- `"Custom/Materials/MagentaCarpetMCS"`
+- `"Custom/Materials/MaroonCarpetMCS"`
+- `"Custom/Materials/NavyCarpetMCS"`
+- `"Custom/Materials/OliveCarpetMCS"`
+- `"Custom/Materials/OrangeCarpetMCS"`
+- `"Custom/Materials/PurpleCarpetMCS"`
+- `"Custom/Materials/RedCarpetMCS"`
+- `"Custom/Materials/RoseCarpetMCS"`
+- `"Custom/Materials/SpringGreenCarpetMCS"`
+- `"Custom/Materials/TealCarpetMCS"`
+- `"Custom/Materials/VioletCarpetMCS"`
+- `"Custom/Materials/WhiteCarpetMCS"`
+- `"Custom/Materials/YellowCarpetMCS"`
+
+Flat Materials
+****************
+
+Custom-made textures that are completely flat colors.
+
+- `"Custom/Materials/Azure"`
+- `"Custom/Materials/Black"`
+- `"Custom/Materials/Blue"`
+- `"Custom/Materials/Brown"`
+- `"Custom/Materials/Chartreuse"`
+- `"Custom/Materials/Cyan"`
+- `"Custom/Materials/Goldenrod"`
+- `"Custom/Materials/Green"`
+- `"Custom/Materials/Grey"`
+- `"Custom/Materials/Indigo"`
+- `"Custom/Materials/Lime"`
+- `"Custom/Materials/Magenta"`
+- `"Custom/Materials/Maroon"`
+- `"Custom/Materials/Navy"`
+- `"Custom/Materials/Olive"`
+- `"Custom/Materials/Orange"`
+- `"Custom/Materials/Pink"`
+- `"Custom/Materials/Purple"`
+- `"Custom/Materials/Red"`
+- `"Custom/Materials/Rose"`
+- `"Custom/Materials/Silver"`
+- `"Custom/Materials/SpringGreen"`
+- `"Custom/Materials/Tan"`
+- `"Custom/Materials/Teal"`
+- `"Custom/Materials/Violet"`
+- `"Custom/Materials/White"`
+- `"Custom/Materials/Yellow"`
 
 Metal Materials
 ***************
@@ -1169,6 +1387,7 @@ Metal Materials
 - `"AI2-THOR/Materials/Metals/Brass 1"`
 - `"AI2-THOR/Materials/Metals/Brass_Mat"`
 - `"AI2-THOR/Materials/Metals/BrownMetal 1"`
+- `"AI2-THOR/Materials/Metals/BrushedAluminum_Blue"`
 - `"AI2-THOR/Materials/Metals/BrushedIron_AlbedoTransparency"`
 - `"AI2-THOR/Materials/Metals/GenericStainlessSteel"`
 - `"AI2-THOR/Materials/Metals/HammeredMetal_AlbedoTransparency 1"`
@@ -1198,8 +1417,10 @@ Sofa 1 Materials
 
 Specific textures for `sofa_1` only.
 
+- `"AI2-THOR/Materials/Fabrics/Sofa1_Blue"`
 - `"AI2-THOR/Materials/Fabrics/Sofa1_Brown"`
 - `"AI2-THOR/Materials/Fabrics/Sofa1_Red"`
+- `"AI2-THOR/Materials/Fabrics/Sofa1_White"`
 
 Sofa Chair 1 Materials
 **********************
@@ -1207,7 +1428,9 @@ Sofa Chair 1 Materials
 Specific textures for `sofa_chair_1` only.
 
 - `"AI2-THOR/Materials/Fabrics/SofaChair1_Black"`
+- `"AI2-THOR/Materials/Fabrics/SofaChair1_Blue"`
 - `"AI2-THOR/Materials/Fabrics/SofaChair1_Brown"`
+- `"AI2-THOR/Materials/Fabrics/SofaChair1_White"`
 
 Sofa 2 Materials
 ****************
@@ -1216,10 +1439,22 @@ Specific textures for `sofa_2` AND `sofa_chair_2` only.
 
 - `"AI2-THOR/Materials/Fabrics/SofaChair2_Grey"`
 - `"AI2-THOR/Materials/Fabrics/SofaChair2_White"`
+- `"AI2-THOR/Materials/Fabrics/SofaChair2_Fabric_AlbedoTransparency"`
+
+Sofa 3 Materials
+****************
+
+Specific textures for `sofa_3` AND `sofa_chair_3` only.
+
+- `"AI2-THOR/Materials/Fabrics/Sofa3_Blue"`
+- `"AI2-THOR/Materials/Fabrics/Sofa3_Brown"`
+- `"AI2-THOR/Materials/Fabrics/Sofa3_Green_Dark"`
+- `"AI2-THOR/Materials/Fabrics/Sofa3_Red"`
 
 Wall Materials
 **************
 
+- `"AI2-THOR/Materials/Walls/BrownDrywall"`
 - `"AI2-THOR/Materials/Walls/Drywall"`
 - `"AI2-THOR/Materials/Walls/DrywallBeige"`
 - `"AI2-THOR/Materials/Walls/DrywallGreen"`
@@ -1229,6 +1464,26 @@ Wall Materials
 - `"AI2-THOR/Materials/Walls/RedDrywall"`
 - `"AI2-THOR/Materials/Walls/WallDrywallGrey"`
 - `"AI2-THOR/Materials/Walls/YellowDrywall"`
+- `"Custom/Materials/AzureDrywallMCS"`
+- `"Custom/Materials/BlueDrywallMCS"`
+- `"Custom/Materials/ChartreuseDrywallMCS"`
+- `"Custom/Materials/CyanDrywallMCS"`
+- `"Custom/Materials/GreenDrywallMCS"`
+- `"Custom/Materials/GreyDrywallMCS"`
+- `"Custom/Materials/LimeDrywallMCS"`
+- `"Custom/Materials/MagentaDrywallMCS"`
+- `"Custom/Materials/MaroonDrywallMCS"`
+- `"Custom/Materials/NavyDrywallMCS"`
+- `"Custom/Materials/OliveDrywallMCS"`
+- `"Custom/Materials/OrangeDrywallMCS"`
+- `"Custom/Materials/PurpleDrywallMCS"`
+- `"Custom/Materials/RedDrywallMCS"`
+- `"Custom/Materials/RoseDrywallMCS"`
+- `"Custom/Materials/SpringGreenDrywallMCS"`
+- `"Custom/Materials/TealDrywallMCS"`
+- `"Custom/Materials/VioletDrywallMCS"`
+- `"Custom/Materials/WhiteDrywallMCS"`
+- `"Custom/Materials/YellowDrywallMCS"`
 
 Wood Materials
 **************
@@ -1246,6 +1501,26 @@ Wood Materials
 - `"AI2-THOR/Materials/Wood/WoodGrain_Brown"`
 - `"AI2-THOR/Materials/Wood/WoodGrain_Tan"`
 - `"AI2-THOR/Materials/Wood/WornWood"`
+- `"Custom/Materials/AzureWoodMCS"`
+- `"Custom/Materials/BlueWoodMCS"`
+- `"Custom/Materials/ChartreuseWoodMCS"`
+- `"Custom/Materials/CyanWoodMCS"`
+- `"Custom/Materials/GreenWoodMCS"`
+- `"Custom/Materials/GreyWoodMCS"`
+- `"Custom/Materials/LimeWoodMCS"`
+- `"Custom/Materials/MagentaWoodMCS"`
+- `"Custom/Materials/MaroonWoodMCS"`
+- `"Custom/Materials/NavyWoodMCS"`
+- `"Custom/Materials/OliveWoodMCS"`
+- `"Custom/Materials/OrangeWoodMCS"`
+- `"Custom/Materials/PurpleWoodMCS"`
+- `"Custom/Materials/RedWoodMCS"`
+- `"Custom/Materials/RoseWoodMCS"`
+- `"Custom/Materials/SpringGreenWoodMCS"`
+- `"Custom/Materials/TealWoodMCS"`
+- `"Custom/Materials/VioletWoodMCS"`
+- `"Custom/Materials/WhiteWoodMCS"`
+- `"Custom/Materials/YellowWoodMCS"`
 - `"UnityAssetStore/Baby_Room/Models/Materials/wood 1"`
 - `"UnityAssetStore/Kindergarten_Interior/Models/Materials/color wood 1"` (blue)
 - `"UnityAssetStore/Kindergarten_Interior/Models/Materials/color wood 2"` (red)
diff --git a/machine_common_sense/__init__.py b/machine_common_sense/__init__.py
index b170f5efa..1cba21f55 100644
--- a/machine_common_sense/__init__.py
+++ b/machine_common_sense/__init__.py
@@ -70,14 +70,27 @@ def init_logging(log_config=None,
         log_config_file=log_config_file)
 
 
-def create_controller(unity_app_file_path=None,
-                      unity_cache_version=None,
-                      config_file_path=None):
+def create_controller(config_file_or_dict=None,
+                      unity_app_file_path=None,
+                      unity_cache_version=None):
     """
     Creates and returns a new MCS Controller object.
 
     Parameters
     ----------
+    config_file_or_dict: str or dict, required
+        Can be a path to configuration file to read in or a dictionary
+        of various properties, such as metadata level and whether or
+        not to save history files (default None)
+
+        * Note the **order of precedence for config options**, in case more
+          than one is given:
+
+        1. **MCS_CONFIG_FILE_PATH** environment variable (meant for internal
+           TA2 use during evaluation)
+        2. If no environment variable given, use **config_file_or_dict**
+           parameter. The value can be a string file path or a dictionary.
+        3. Raises FileNotFoundError if no config found.
     unity_app_file_path : str, optional
         The file path to your MCS Unity application.  If Not provided,
         the internal cache and downloader will attempt to locate and use
@@ -88,10 +101,6 @@ def create_controller(unity_app_file_path=None,
         version provided will be found via cache and internal downloader.
         If not provided, the version matching the MCS code will be used.
         (default None)
-    config_file_path: str, optional
-        Path to configuration file to read in and set various properties,
-        such as metadata level and whether or not to save history files
-        (default None)
 
     Returns
     -------
@@ -105,7 +114,7 @@ def create_controller(unity_app_file_path=None,
             unity_exec = unity_provider.get_executable(
                 unity_cache_version).as_posix()
 
-        config = ConfigManager(config_file_path)
+        config = ConfigManager(config_file_or_dict)
         with time_limit(TIME_LIMIT_SECONDS):
             controller = Controller(unity_exec, config)
         if not controller:
@@ -117,7 +126,9 @@ def create_controller(unity_app_file_path=None,
         return None
 
 
-"""
+def change_config(controller: Controller,
+                  config_file_or_dict=None):
+    """
     Creates and returns a new MCS Controller object.  Should only be called
     After a run and before a scene is changed.
 
@@ -126,16 +137,13 @@ def create_controller(unity_app_file_path=None,
     controller : Controller
         The currently used controller that the config should be changed
         on.
-    config_file_path: str, optional
-        Path to configuration file to read in and set various properties,
-        such as metadata level and whether or not to save history files
-        (default None)
+    config_file_or_dict: str or dict, optional
+        Can be a path to configuration file to read in or a dictionary
+        of various properties, such as metadata level and whether or
+        not to save history files (default None)
 
     """
-
-
-def change_config(controller: Controller, config_file_path: str = None):
-    config = ConfigManager(config_file_path)
+    config = ConfigManager(config_file_or_dict)
     controller._set_config(config)
     controller.remove_all_event_handlers()
     add_subscribers(controller, config)
diff --git a/machine_common_sense/_version.py b/machine_common_sense/_version.py
index 9a8e054a6..68eb9b688 100644
--- a/machine_common_sense/_version.py
+++ b/machine_common_sense/_version.py
@@ -1,1 +1,1 @@
-__version__ = '0.4.4'
+__version__ = '0.4.5'
diff --git a/machine_common_sense/action.py b/machine_common_sense/action.py
index 7fc627612..ef7d1b96b 100644
--- a/machine_common_sense/action.py
+++ b/machine_common_sense/action.py
@@ -47,12 +47,16 @@ class Action(Enum):
         If the object is completely closed.
     "NOT_INTERACTABLE"
         If the object corresponding to the "objectImageCoords" vector is not an
-        interactable object.
+        interactable object. This includes structural objects like the room's
+        walls.
     "NOT_OBJECT"
         If the object corresponding to the "objectId" (or object corresponding
         to the "objectImageCoords" vector) is not an object.
     "NOT_OPENABLE"
         If the object itself cannot be closed.
+    "NOT_RECEPTACLE"
+        If the object corresponding to the "objectImageCoords" vector is not a
+        receptacle object.
     "OBSTRUCTED"
         If you cannot close the object because your path is obstructed.
     "OUT_OF_REACH"
@@ -229,12 +233,16 @@ class Action(Enum):
         If the object is completely opened.
     "NOT_INTERACTABLE"
         If the object corresponding to the "objectImageCoords" vector is not an
-        interactable object.
+        interactable object. This includes structural objects like the room's
+        walls.
     "NOT_OBJECT"
         If the object corresponding to the "objectId" (or object corresponding
         to the "objectImageCoords" vector) is not an object.
     "NOT_OPENABLE"
         If the object itself cannot be opened.
+    "NOT_RECEPTACLE"
+        If the object corresponding to the "objectImageCoords" vector is not a
+        receptacle object.
     "OBSTRUCTED"
         If you cannot open the object because your path is obstructed.
     "OUT_OF_REACH"
@@ -425,6 +433,7 @@ class Action(Enum):
     "NOT_INTERACTABLE"
         If the object corresponding to the "objectImageCoords" or
         "receptacleObjectImageCoords" vector is not an interactable object.
+        This includes structural objects like the room's walls.
     "NOT_OBJECT"
         If the object corresponding to the "objectId" and/or
         "receptacleObjectId" (or object corresponding to the
diff --git a/machine_common_sense/config_manager.py b/machine_common_sense/config_manager.py
index 0eb77f32a..2f51493cb 100644
--- a/machine_common_sense/config_manager.py
+++ b/machine_common_sense/config_manager.py
@@ -3,6 +3,7 @@
 import logging
 import os
 from dataclasses import dataclass, field
+from enum import Enum, unique
 from typing import List
 
 import numpy as np
@@ -24,30 +25,30 @@ class Vector3d:
     z: float = 0
 
 
-class ConfigManager(object):
-
-    DEFAULT_CLIPPING_PLANE_FAR = 15.0
-    DEFAULT_ROOM_DIMENSIONS = Vector3d(x=10, y=3, z=10)
-
+@unique
+class MetadataTier(Enum):
     # Normal metadata plus metadata for all hidden objects
-    CONFIG_METADATA_TIER_ORACLE = 'oracle'
+    ORACLE = 'oracle'
     # No metadata, except for the images, depth masks, object masks,
     # and haptic/audio feedback
-    CONFIG_METADATA_TIER_LEVEL_2 = 'level2'
+    LEVEL_2 = 'level2'
     # No metadata, except for the images, depth masks, and haptic/audio
     # feedback
-    CONFIG_METADATA_TIER_LEVEL_1 = 'level1'
+    LEVEL_1 = 'level1'
     # No metadata, except for the images and haptic/audio
     # feedback
-    CONFIG_METADATA_TIER_NONE = 'none'
-
+    NONE = 'none'
     # Default metadata level if none specified, meant for use during
     # development
-    CONFIG_METADATA_TIER_DEFAULT = 'default'
+    DEFAULT = 'default'
+
+
+class ConfigManager(object):
+
+    DEFAULT_CLIPPING_PLANE_FAR = 15.0
+    DEFAULT_ROOM_DIMENSIONS = Vector3d(x=10, y=3, z=10)
 
     CONFIG_FILE_ENV_VAR = 'MCS_CONFIG_FILE_PATH'
-    METADATA_ENV_VAR = 'MCS_METADATA_LEVEL'
-    DEFAULT_CONFIG_FILE = './mcs_config.ini'
 
     CONFIG_DEFAULT_SECTION = 'MCS'
 
@@ -67,26 +68,41 @@ class ConfigManager(object):
     SCREEN_WIDTH_DEFAULT = 600
     SCREEN_WIDTH_MIN = 450
 
-    def __init__(self, config_file_path=None):
-        # For config file, look for environment variable first,
-        # then look for config_path parameter from constructor
-        self._config_file = os.getenv(
-            self.CONFIG_FILE_ENV_VAR, config_file_path)
-
-        if(self._config_file is None):
-            self._config_file = self.DEFAULT_CONFIG_FILE
+    def __init__(self, config_file_or_dict=None):
+        '''
+        Configuration preferences passed in by the user.
+        '''
+        self._config = configparser.ConfigParser()
 
-        self._read_config_file()
+        # For config, look for environment variable first,
+        # then look at config_file_or_dict from constructor
+        try:
+            if (os.getenv(self.CONFIG_FILE_ENV_VAR) is not None):
+                self._read_in_config_file(os.getenv(self.CONFIG_FILE_ENV_VAR))
+            elif (isinstance(config_file_or_dict, dict)):
+                self._read_in_config_dict(config_file_or_dict)
+            elif(isinstance(config_file_or_dict, str)):
+                self._read_in_config_file(config_file_or_dict)
+            else:
+                raise FileNotFoundError("No config options given")
+        except FileNotFoundError as err:
+            raise RuntimeError("Configuration not set") from err
 
         self._validate_screen_size()
 
-    def _read_config_file(self):
-        self._config = configparser.ConfigParser()
-        if os.path.exists(self._config_file):
-            self._config.read(self._config_file)
-            logger.info('Config File Path: ' + self._config_file)
+    def _read_in_config_dict(self, config_dict):
+        self._config[self.CONFIG_DEFAULT_SECTION] = config_dict
+        logger.info('No config file given or file path does not exist,'
+                    ' using config dictionary')
+        logger.info('Read in config dictionary: ' + str(config_dict))
+
+    def _read_in_config_file(self, config_file_path):
+        if os.path.exists(config_file_path):
+            self._config.read(config_file_path)
+            logger.info('Config File Path: ' + config_file_path)
         else:
-            logger.info('No Config File')
+            logger.warning('No config file at given path: ' + config_file_path)
+            raise FileNotFoundError()
 
     def _validate_screen_size(self):
         if(self.get_size() < self.SCREEN_WIDTH_MIN):
@@ -104,17 +120,13 @@ def get_evaluation_name(self):
         )
 
     def get_metadata_tier(self):
-        # Environment variable override for metadata property
-        metadata_env_var = os.getenv('MCS_METADATA_LEVEL', None)
-
-        if(metadata_env_var is None):
-            return self._config.get(
-                self.CONFIG_DEFAULT_SECTION,
-                self.CONFIG_METADATA_TIER,
-                fallback='default'
-            )
+        metadata = self._config.get(
+            self.CONFIG_DEFAULT_SECTION,
+            self.CONFIG_METADATA_TIER,
+            fallback='default'
+        )
 
-        return metadata_env_var
+        return MetadataTier(metadata)
 
     def set_metadata_tier(self, mode):
         self._config.set(
@@ -182,19 +194,19 @@ def is_video_enabled(self):
     def is_depth_maps_enabled(self) -> bool:
         metadata_tier = self.get_metadata_tier()
         return metadata_tier in [
-            self.CONFIG_METADATA_TIER_LEVEL_1,
-            self.CONFIG_METADATA_TIER_LEVEL_2,
-            self.CONFIG_METADATA_TIER_ORACLE,
+            MetadataTier.LEVEL_1,
+            MetadataTier.LEVEL_2,
+            MetadataTier.ORACLE,
         ]
 
     def is_object_masks_enabled(self) -> bool:
         metadata_tier = self.get_metadata_tier()
         return (
-            metadata_tier != self.CONFIG_METADATA_TIER_LEVEL_1 and
+            metadata_tier != MetadataTier.LEVEL_1 and
             metadata_tier in
             [
-                self.CONFIG_METADATA_TIER_LEVEL_2,
-                self.CONFIG_METADATA_TIER_ORACLE,
+                MetadataTier.LEVEL_2,
+                MetadataTier.ORACLE,
             ]
         )
 
@@ -284,6 +296,8 @@ class ForceConfigSchema(Schema):
     stepEnd = fields.Int()
     vector = fields.Nested(Vector3dSchema)
     relative = fields.Bool()
+    repeat = fields.Bool()
+    stepWait = fields.Int()
 
     @post_load
     def make_force_config(self, data, **kwargs):
@@ -294,6 +308,8 @@ class MoveConfigSchema(Schema):
     stepBegin = fields.Int()
     stepEnd = fields.Int()
     vector = fields.Nested(Vector3dSchema)
+    repeat = fields.Bool()
+    stepWait = fields.Int()
 
     @post_load
     def make_move_config(self, data, **kwargs):
@@ -356,6 +372,8 @@ class SizeConfigSchema(Schema):
     stepBegin = fields.Int()
     stepEnd = fields.Int()
     size = fields.Nested(Vector3dSchema)
+    repeat = fields.Bool()
+    stepWait = fields.Int()
 
     @post_load
     def make_size_config(self, data, **kwargs):
@@ -373,6 +391,8 @@ def make_single_step_config(self, data, **kwargs):
 class StepBeginEndConfigSchema(Schema):
     stepBegin = fields.Int()
     stepEnd = fields.Int()
+    repeat = fields.Bool()
+    stepWait = fields.Int()
 
     @post_load
     def make_step_begin_end_config(self, data, **kwargs):
@@ -529,6 +549,8 @@ class ForceConfig:
     stepEnd: int
     vector: Vector3d = Vector3d(0, 0, 0)
     relative: bool = False
+    repeat: bool = False
+    stepWait: int = 0
 
 
 @dataclass
@@ -536,6 +558,8 @@ class MoveConfig:
     stepBegin: int
     stepEnd: int
     vector: Vector3d = Vector3d(0, 0, 0)
+    repeat: bool = False
+    stepWait: int = 0
 
 
 @dataclass
@@ -580,6 +604,8 @@ class SizeConfig:
     stepBegin: int
     stepEnd: int
     size: Vector3d = Vector3d(1, 1, 1)
+    repeat: bool = False
+    stepWait: int = 0
 
 
 @dataclass
@@ -591,6 +617,8 @@ class SingleStepConfig:
 class StepBeginEndConfig:
     stepBegin: int
     stepEnd: int
+    repeat: bool = False
+    stepWait: int = 0
 
 
 @dataclass
diff --git a/machine_common_sense/controller.py b/machine_common_sense/controller.py
index 988743353..3431dbb04 100644
--- a/machine_common_sense/controller.py
+++ b/machine_common_sense/controller.py
@@ -24,7 +24,7 @@
 DEFAULT_MOVE = 0.1
 
 from .action import Action
-from .config_manager import (ConfigManager, SceneConfiguration,
+from .config_manager import (ConfigManager, MetadataTier, SceneConfiguration,
                              SceneConfigurationSchema)
 from .controller_events import (AfterStepPayload, BeforeStepPayload,
                                 EndScenePayload, EventType, StartScenePayload)
@@ -85,10 +85,8 @@ class Controller():
 
     Parameters
     ----------
-    config_file_path: str, optional
-        Path to configuration file to read in and set various properties,
-        such as metadata level and whether or not to save history files
-        (default None)
+    unity_app_file: str
+    config: ConfigManager
     """
 
     # AI2-THOR creates a square grid across the scene that is
@@ -134,7 +132,7 @@ class Controller():
     OBJECT_MOVE_ACTIONS = ["CloseObject", "OpenObject"]
     MOVE_ACTIONS = ["MoveAhead", "MoveLeft", "MoveRight", "MoveBack"]
 
-    def __init__(self, unity_app_file_path, config):
+    def __init__(self, unity_app_file_path: str, config: ConfigManager):
 
         self._subscribers = []
 
@@ -732,7 +730,7 @@ def wrap_step(self, **kwargs):
         # whether or not to randomize segmentation mask colors
         consistentColors = False
         metadata_tier = self._config.get_metadata_tier()
-        if(metadata_tier == ConfigManager.CONFIG_METADATA_TIER_ORACLE):
+        if(metadata_tier == MetadataTier.ORACLE):
             consistentColors = True
 
         # Create the step data dict for the AI2-THOR step function.
@@ -769,4 +767,4 @@ def get_metadata_level(self):
         string
             A string containing the current metadata level.
         """
-        return self._config.get_metadata_tier()
+        return self._config.get_metadata_tier().value
diff --git a/machine_common_sense/controller_logger.py b/machine_common_sense/controller_logger.py
index 3e876d35d..db0b47f98 100644
--- a/machine_common_sense/controller_logger.py
+++ b/machine_common_sense/controller_logger.py
@@ -18,7 +18,7 @@ def on_start_scene(self, payload):
             payload.scene_config.name)
         logger.debug(
             "METADATA TIER: " +
-            payload.config.get_metadata_tier())
+            payload.config.get_metadata_tier().value)
         logger.debug(f"STEP: {payload.step_number}")
         logger.debug("ACTION: Initialize")
 
diff --git a/machine_common_sense/controller_media.py b/machine_common_sense/controller_media.py
index 030e68a67..45cc5359e 100644
--- a/machine_common_sense/controller_media.py
+++ b/machine_common_sense/controller_media.py
@@ -5,7 +5,7 @@
 import numpy as np
 import PIL
 
-from .config_manager import ConfigManager
+from .config_manager import ConfigManager, Vector3d
 from .controller_events import (AbstractControllerSubscriber,
                                 ControllerEventPayload)
 from .plotter import TopDownPlotter
@@ -70,7 +70,7 @@ def get_basename(self, payload: ControllerEventPayload):
         scene_name = payload.scene_config.name.replace('json', '')
         return '_'.join(
             [payload.config.get_evaluation_name(),
-             payload.config.get_metadata_tier(),
+             payload.config.get_metadata_tier().value,
              payload.config.get_team(),
              scene_name,
              AbstractVideoEventHandler.PLACEHOLDER, timestamp]) + '.mp4'
@@ -172,7 +172,12 @@ def on_start_scene(self, payload: ControllerEventPayload):
         self.__plotter = TopDownPlotter(
             team=payload.config.get_team(),
             scene_name=payload.scene_config.name.replace('json', ''),
-            room_size=payload.scene_config.roomDimensions)
+            room_size=(
+                # Room is automatically expanded in intuitive physics scenes.
+                Vector3d(14, 10, 10) if payload.scene_config.intuitivePhysics
+                else payload.scene_config.roomDimensions
+            )
+        )
         self.save_video_for_step(payload)
 
     def on_after_step(self, payload: ControllerEventPayload):
diff --git a/machine_common_sense/controller_output_handler.py b/machine_common_sense/controller_output_handler.py
index 689704bc7..ffaceac81 100644
--- a/machine_common_sense/controller_output_handler.py
+++ b/machine_common_sense/controller_output_handler.py
@@ -6,7 +6,7 @@
 import PIL
 from ai2thor.server import Event
 
-from .config_manager import ConfigManager, SceneConfiguration
+from .config_manager import ConfigManager, MetadataTier, SceneConfiguration
 from .controller import DEFAULT_MOVE
 from .material import Material
 from .object_metadata import ObjectMetadata
@@ -115,7 +115,7 @@ def _get_objects(self, key: str):
         # Return object list for all tier levels, the restrict output function
         # will then strip out the necessary metadata
         metadata_tier = self._config.get_metadata_tier()
-        show_all = metadata_tier != ConfigManager.CONFIG_METADATA_TIER_DEFAULT
+        show_all = metadata_tier != MetadataTier.DEFAULT
         # if no config specified, return visible objects (for now)
         return sorted(
             [
@@ -205,7 +205,6 @@ def retrieve_object_output(
 
         return ObjectMetadata(
             uuid=object_metadata['objectId'],
-            color={'r': rgb[0], 'g': rgb[1], 'b': rgb[2]},
             dimensions=(
                 bounds['objectBoundsCorners']
                 if 'objectBoundsCorners' in bounds
@@ -224,6 +223,7 @@ def retrieve_object_output(
             material_list=material_list,
             position=object_metadata['position'],
             rotation=object_metadata['rotation'],
+            segment_color={'r': rgb[0], 'g': rgb[1], 'b': rgb[2]},
             shape=object_metadata['shape'],
             state_list=self._scene_config.retrieve_object_states(
                 object_metadata['objectId'],
@@ -268,20 +268,20 @@ def _get_step_metadata(self, goal, habituation_trial,
         metadata_tier = self._config.get_metadata_tier()
         restrict_depth_map = (
             restricted and
-            metadata_tier == ConfigManager.CONFIG_METADATA_TIER_NONE
+            metadata_tier == MetadataTier.NONE
         )
 
         restrict_object_mask_list = (
             restricted and
-            (metadata_tier == ConfigManager.CONFIG_METADATA_TIER_NONE or
-             metadata_tier == ConfigManager.CONFIG_METADATA_TIER_LEVEL_1)
+            (metadata_tier == MetadataTier.NONE or
+             metadata_tier == MetadataTier.LEVEL_1)
         )
 
         restrict_non_oracle = (
             restricted and
-            (metadata_tier == ConfigManager.CONFIG_METADATA_TIER_NONE or
-             metadata_tier == ConfigManager.CONFIG_METADATA_TIER_LEVEL_1 or
-             metadata_tier == ConfigManager.CONFIG_METADATA_TIER_LEVEL_2)
+            (metadata_tier == MetadataTier.NONE or
+             metadata_tier == MetadataTier.LEVEL_1 or
+             metadata_tier == MetadataTier.LEVEL_2)
         )
 
         depth_map_list = [] if restrict_depth_map else (
diff --git a/machine_common_sense/goal_metadata.py b/machine_common_sense/goal_metadata.py
index a6f5b8f28..4d564767b 100644
--- a/machine_common_sense/goal_metadata.py
+++ b/machine_common_sense/goal_metadata.py
@@ -16,15 +16,18 @@ class GoalMetadata:
         available for the single step corresponding to the inner list's index
         within the outer list. Each action is returned as a tuple containing
         the action string and the action's restricted paramters, if any.
+
         For example: ("Pass", {}) forces a Pass action; ("PickupObject", {})
         forces a PickupObject action with any parameters; and
         ("PickupObject", {"objectId": "a"}) forces a PickupObject action with
         the specific parameters objectId=a.
+
         An action_list of None means that all actions are always available.
         An empty inner list means that all actions will be available on that
         specific step.
-        See StepMetadata.action_list for the available actions of the current
-        step.
+
+        See :mod:`StepMetadata.action_list <machine_common_sense.StepMetadata>`
+        for the available actions of the current step.
         May be a subset of all possible actions. See
         :mod:`Action <machine_common_sense.Action>`.
     category : string
diff --git a/machine_common_sense/history_writer.py b/machine_common_sense/history_writer.py
index 26987641f..f57476731 100644
--- a/machine_common_sense/history_writer.py
+++ b/machine_common_sense/history_writer.py
@@ -3,9 +3,12 @@
 import os
 import pathlib
 from time import perf_counter
-from typing import Dict
 
-from .controller_events import AbstractControllerSubscriber
+from machine_common_sense.step_metadata import StepMetadata
+
+from .controller_events import (AbstractControllerSubscriber, AfterStepPayload,
+                                BeforeStepPayload, EndScenePayload,
+                                StartScenePayload)
 from .scene_history import SceneHistory
 from .stringifier import Stringifier
 
@@ -19,23 +22,21 @@ def __init__(self):
         self.__history_writer = None
         self.__history_item = None
 
-    def on_start_scene(self, payload):
+    def on_start_scene(self, payload: StartScenePayload):
         if payload.config.is_history_enabled():
 
             # Ensure the previous scene history writer has saved its file.
             if self.__history_writer:
                 self.__history_writer.check_file_written()
 
-            hist_info = {}
-            hist_info[
-                payload.config.CONFIG_EVALUATION_NAME
-            ] = payload.config.get_evaluation_name()
-            hist_info[
-                payload.config.CONFIG_METADATA_TIER
-            ] = payload.config.get_metadata_tier()
-            hist_info[
-                payload.config.CONFIG_TEAM
-            ] = payload.config.get_team()
+            hist_info = {
+                payload.config.CONFIG_EVALUATION_NAME:
+                    payload.config.get_evaluation_name(),
+                payload.config.CONFIG_METADATA_TIER:
+                    payload.config.get_metadata_tier().value,
+                payload.config.CONFIG_TEAM:
+                    payload.config.get_team()
+            }
 
             # Create a new scene history writer with each new scene (config
             # data) so we always create a new, separate scene history file.
@@ -43,15 +44,16 @@ def on_start_scene(self, payload):
                                                   hist_info,
                                                   payload.timestamp)
 
-    def on_before_step(self, payload):
+    def on_before_step(self, payload: BeforeStepPayload):
         if payload.config.is_history_enabled():
             if payload.step_number == 0:
                 self.__history_writer.init_timer()
             if payload.step_number > 0:
                 self.__history_writer.add_step(self.__history_item)
 
-    def on_after_step(self, payload):
-        output = payload.step_output.copy_without_depth_or_images()
+    def on_after_step(self, payload: AfterStepPayload):
+        output: StepMetadata = \
+            payload.step_output.copy_without_depth_or_images()
 
         self.__history_item = SceneHistory(
             step=payload.step_number,
@@ -61,7 +63,7 @@ def on_after_step(self, payload):
             output=output,
             delta_time_millis=0)
 
-    def on_end_scene(self, payload):
+    def on_end_scene(self, payload: EndScenePayload):
         if (
             self.__history_writer is not None and
             payload.config.is_history_enabled()
@@ -73,11 +75,12 @@ def on_end_scene(self, payload):
                 for step in self.__history_writer.current_steps:
                     currentStep = step.get("step")
 
-                    findStepInReport = (payload.report.get(
-                        currentStep) or
-                        payload.report.get(str(currentStep)))
+                    findStepInReport = (
+                        payload.report.get(currentStep) or
+                        payload.report.get(str(currentStep))
+                    )
 
-                    if(findStepInReport is not None):
+                    if (findStepInReport is not None):
                         # Use classification and confidence rather than rating
                         # and score to be compatible with old history files.
                         step["classification"] = findStepInReport.get("rating")
@@ -95,7 +98,6 @@ def _get_filename_without_timestamp(self, filepath: pathlib.Path):
 
 
 class HistoryWriter(object):
-
     HISTORY_DIRECTORY = "SCENE_HISTORY"
 
     def __init__(self, scene_config_data=None, hist_info={}, timestamp=''):
@@ -158,17 +160,35 @@ def init_timer(self):
             sent to controller"""
         self.last_step_time_millis = perf_counter() * 1000
 
-    def add_step(self, step_obj: Dict):
+    def add_step(self, step_obj: SceneHistory):
         """Add a new step to the array of history steps"""
         current_time = perf_counter() * 1000
         if step_obj is not None:
-            step_obj.delta_time_millis = current_time - \
-                self.last_step_time_millis
+            step_obj.delta_time_millis = (
+                current_time - self.last_step_time_millis)
             self.last_step_time_millis = current_time
+            if step_obj.output:
+                step_obj.target_visible = self.is_target_visible(
+                    step_obj)
             logger.debug("Adding history step")
             self.current_steps.append(
                 dict(self.filter_history_output(step_obj)))
 
+    def is_target_visible(
+            self,
+            history: SceneHistory) -> bool:
+        """Determine the visibility of the target object, if any"""
+        try:
+            meta = history.output.goal.metadata
+            goal_id = meta['target']['id']
+            for hist_obj in history.output.object_list:
+                uuid = hist_obj.uuid
+                if uuid == goal_id and hist_obj.visible:
+                    return True
+            return False
+        except Exception:
+            return False
+
     def write_history_file(self, rating, score):
         """ Add the end score obj, create the object
             that will be written to file"""
diff --git a/machine_common_sense/logging_config.py b/machine_common_sense/logging_config.py
index f57f3a9fa..9171731f7 100644
--- a/machine_common_sense/logging_config.py
+++ b/machine_common_sense/logging_config.py
@@ -113,6 +113,13 @@ def get_errors_only_console_config():
                 "handlers": ["console"],
                 "propagate": False
             },
+            "loggers": {
+                "machine_common_sense": {
+                    "level": "ERROR",
+                    "handlers": ["console"],
+                    "propagate": False
+                }
+            },
             "handlers": {
                 "console": {
                     "class": "logging.StreamHandler",
diff --git a/machine_common_sense/object_metadata.py b/machine_common_sense/object_metadata.py
index daab58dc1..3cf27416d 100644
--- a/machine_common_sense/object_metadata.py
+++ b/machine_common_sense/object_metadata.py
@@ -9,9 +9,6 @@ class ObjectMetadata(object):
     ----------
     uuid : string
         The unique ID of this object, used with some actions.
-    color : dict
-        The "r", "g", and "b" pixel values of this object in images from the
-        StepMetadata's "object_mask_list".
     dimensions : list of dicts
         The dimensions of this object in the environment's 3D global
         coordinate system as a list of 8 points (dicts with "x", "y", and "z").
@@ -43,6 +40,9 @@ class ObjectMetadata(object):
     rotation : dict
         This object's rotation angles around the "x", "y", and "z" axes
         in degrees.
+    segment_color : dict
+        The "r", "g", and "b" pixel values of this object in images from the
+        StepMetadata's "object_mask_list".
     shape : string
         This object's shape in plain English.
     state_list : list of strings
@@ -61,7 +61,6 @@ class ObjectMetadata(object):
     def __init__(
         self,
         uuid="",
-        color=None,
         dimensions=None,
         direction=None,
         distance=-1.0,
@@ -72,6 +71,7 @@ def __init__(
         material_list=None,
         position=None,
         rotation=None,
+        segment_color=None,
         shape="",
         state_list=None,
         texture_color_list=None,
@@ -80,7 +80,6 @@ def __init__(
         openable=False
     ):
         self.uuid = uuid
-        self.color = {} if color is None else color
         self.dimensions = [] if dimensions is None else dimensions
         self.direction = {} if direction is None else direction
         self.distance = distance
@@ -91,6 +90,9 @@ def __init__(
         self.material_list = [] if material_list is None else material_list
         self.position = {} if position is None else position
         self.rotation = {} if rotation is None else rotation
+        self.segment_color = {} \
+            if segment_color is None \
+            else segment_color
         self.shape = shape
         self.state_list = [] if state_list is None else state_list
         self.texture_color_list = (
@@ -107,7 +109,6 @@ def __str__(self):
     #   certain fields to be left out of output file
     def __iter__(self):
         yield 'uuid', self.uuid
-        yield 'color', self.color
         yield 'dimensions', self.dimensions
         yield 'direction', self.direction
         yield 'distance', self.distance
@@ -118,6 +119,7 @@ def __iter__(self):
         yield 'material_list', self.material_list
         yield 'position', self.position
         yield 'rotation', self.rotation
+        yield 'segment_color', self.segment_color
         yield 'shape', self.shape
         yield 'state_list', self.state_list
         yield 'texture_color_list', self.texture_color_list
diff --git a/machine_common_sense/plotter.py b/machine_common_sense/plotter.py
index 1c7238554..9bf724377 100644
--- a/machine_common_sense/plotter.py
+++ b/machine_common_sense/plotter.py
@@ -47,12 +47,14 @@ class TopDownPlotter():
     GOAL_COLOR = colour.COLOR_NAME_TO_RGB['gold']
 
     ROBOT_PLOT_WIDTH = 0.2
-    HEADING_LENGTH = 0.4
+    HEADING_LENGTH = 0.2
+    ROBOT_NOSE_RADIUS = 0.08
     PLOT_IMAGE_SIZE = 512
 
     FONT = cv2.FONT_HERSHEY_COMPLEX
     FONT_SCALE = 0.4
     FONT_THICKNESS = 1
+    WALL_BUFFER = 50
 
     def __init__(self, team: str, scene_name: str, room_size: Vector3d):
         self._team = team
@@ -112,16 +114,21 @@ def _draw_grid_lines(self, img: np.ndarray) -> np.ndarray:
         self.center_x = int(x_dim / 2) - 1  # ex: 512 /2 = 256 - 1 = 255
         self.center_z = int(z_dim / 2) - 1  # ex: 256 /2 = 128 - 1 = 127
         largest_dimension = max(room_x, room_z)
-        self.x_scale = (x_dim - 1) / largest_dimension
-        self.z_scale = (z_dim - 1) / largest_dimension
+
+        # Add a buffer into the scale to properly show the room's walls.
+        buffered_x_dim = x_dim - self.WALL_BUFFER
+        buffered_z_dim = z_dim - self.WALL_BUFFER
+        self.x_scale = (buffered_x_dim) / largest_dimension
+        self.z_scale = (buffered_z_dim) / largest_dimension
 
         # outer buffer space to keep 1:1 aspect ratio
-        buffer_x = (x_dim - (x_dim * room_x / largest_dimension)) / 2
-        buffer_z = (z_dim - (z_dim * room_z / largest_dimension)) / 2
+        buffer_x = (x_dim - (buffered_x_dim * room_x / largest_dimension)) / 2
+        buffer_z = (z_dim - (buffered_z_dim * room_z / largest_dimension)) / 2
 
         img = self._draw_vertical_grid_lines(img, buffer_z)
         img = self._draw_horizontal_grid_lines(img, buffer_x)
         img = self._draw_room_border(img, buffer_x, buffer_z)
+
         return img
 
     def _draw_vertical_grid_lines(
@@ -210,11 +217,14 @@ def _draw_robot_heading(self, img: np.ndarray, robot: Robot) -> np.ndarray:
         )
         z_point = int(self.center_z - robot.z * self.z_scale)
         x_point = int(self.center_x + robot.x * self.x_scale)
-        rr, cc = skimage.draw.line(
-            z_point,
-            x_point,
-            z_point - int(heading.z * self.x_scale),
-            x_point + int(heading.x * self.x_scale))
+        rr, cc = skimage.draw.disk(
+            center=(
+                z_point - int(heading.z * self.x_scale),
+                x_point + int(heading.x * self.x_scale)
+            ),
+            radius=self.ROBOT_NOSE_RADIUS * self.x_scale,
+            shape=img.shape[:2]
+        )
         img[rr, cc] = self.ROBOT_COLOR
         return img
 
diff --git a/machine_common_sense/scene_history.py b/machine_common_sense/scene_history.py
index f82de6797..ba0b062bb 100644
--- a/machine_common_sense/scene_history.py
+++ b/machine_common_sense/scene_history.py
@@ -17,7 +17,8 @@ def __init__(
         violations_xy_list: List[Dict[str, float]] = None,
         internal_state: object = None,
         delta_time_millis=0,
-        output=None
+        output=None,
+        target_visible=False
 
     ):
         self.step = step
@@ -30,6 +31,7 @@ def __init__(
         self.internal_state = internal_state
         self.delta_time_millis = delta_time_millis
         self.output = output
+        self.target_visible = target_visible
 
     def __str__(self):
         return Stringifier.class_to_str(self)
@@ -48,3 +50,4 @@ def __iter__(self):
         yield 'output', dict(self.output) if(
             self.output) is not None else self.output
         yield 'delta_time_millis', self.delta_time_millis
+        yield 'target_visible', self.target_visible
diff --git a/machine_common_sense/scripts/__init__.py b/machine_common_sense/scripts/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/scripts/cache_addressables.py b/machine_common_sense/scripts/cache_addressables.py
similarity index 100%
rename from scripts/cache_addressables.py
rename to machine_common_sense/scripts/cache_addressables.py
diff --git a/scripts/config_level1.ini b/machine_common_sense/scripts/config_level1.ini
similarity index 100%
rename from scripts/config_level1.ini
rename to machine_common_sense/scripts/config_level1.ini
diff --git a/scripts/config_level1_debug.ini b/machine_common_sense/scripts/config_level1_debug.ini
similarity index 100%
rename from scripts/config_level1_debug.ini
rename to machine_common_sense/scripts/config_level1_debug.ini
diff --git a/scripts/config_level2.ini b/machine_common_sense/scripts/config_level2.ini
similarity index 100%
rename from scripts/config_level2.ini
rename to machine_common_sense/scripts/config_level2.ini
diff --git a/scripts/config_level2_debug.ini b/machine_common_sense/scripts/config_level2_debug.ini
similarity index 100%
rename from scripts/config_level2_debug.ini
rename to machine_common_sense/scripts/config_level2_debug.ini
diff --git a/scripts/config_no_debug.ini b/machine_common_sense/scripts/config_no_debug.ini
similarity index 100%
rename from scripts/config_no_debug.ini
rename to machine_common_sense/scripts/config_no_debug.ini
diff --git a/scripts/config_oracle.ini b/machine_common_sense/scripts/config_oracle.ini
similarity index 100%
rename from scripts/config_oracle.ini
rename to machine_common_sense/scripts/config_oracle.ini
diff --git a/scripts/config_oracle_debug.ini b/machine_common_sense/scripts/config_oracle_debug.ini
similarity index 100%
rename from scripts/config_oracle_debug.ini
rename to machine_common_sense/scripts/config_oracle_debug.ini
diff --git a/scripts/config_with_debug.ini b/machine_common_sense/scripts/config_with_debug.ini
similarity index 100%
rename from scripts/config_with_debug.ini
rename to machine_common_sense/scripts/config_with_debug.ini
diff --git a/scripts/getch_helper.py b/machine_common_sense/scripts/getch_helper.py
similarity index 78%
rename from scripts/getch_helper.py
rename to machine_common_sense/scripts/getch_helper.py
index d8ef45a7d..b46914bb5 100644
--- a/scripts/getch_helper.py
+++ b/machine_common_sense/scripts/getch_helper.py
@@ -64,18 +64,17 @@ def __call__(self):
         import Carbon  # pylint: disable=import-error
         if Carbon.Evt.EventAvail(0x0008)[0] == 0:  # 0x0008 is the keyDownMask
             return ''
-        else:
-            #
-            # The event contains the following info:
-            # (what, msg, when, where, mod)=Carbon.Evt.GetNextEvent(0x0008)[1]
-            #
-            # The message (msg) contains the ASCII char which is
-            # extracted with the 0x000000FF charCodeMask; this
-            # number is converted to an ASCII character with chr() and
-            # returned
-            #
-            (what, msg, *other) = Carbon.Evt.GetNextEvent(0x0008)[1]
-            return chr(msg & 0x000000FF)
+        #
+        # The event contains the following info:
+        # (what, msg, when, where, mod)=Carbon.Evt.GetNextEvent(0x0008)[1]
+        #
+        # The message (msg) contains the ASCII char which is
+        # extracted with the 0x000000FF charCodeMask; this
+        # number is converted to an ASCII character with chr() and
+        # returned
+        #
+        (what, msg, *other) = Carbon.Evt.GetNextEvent(0x0008)[1]
+        return chr(msg & 0x000000FF)
 
 
 getch = _Getch()
diff --git a/scripts/run_action_file.py b/machine_common_sense/scripts/run_action_file.py
similarity index 95%
rename from scripts/run_action_file.py
rename to machine_common_sense/scripts/run_action_file.py
index b1b217b98..46d0ba48a 100644
--- a/scripts/run_action_file.py
+++ b/machine_common_sense/scripts/run_action_file.py
@@ -1,7 +1,7 @@
-from runner_script import SingleFileRunnerScript
-
 import machine_common_sense as mcs
 
+from .runner_script import SingleFileRunnerScript
+
 action_list_from_file = []
 
 
diff --git a/scripts/run_human_input.py b/machine_common_sense/scripts/run_human_input.py
similarity index 96%
rename from scripts/run_human_input.py
rename to machine_common_sense/scripts/run_human_input.py
index 25ac83803..90afb443f 100644
--- a/scripts/run_human_input.py
+++ b/machine_common_sense/scripts/run_human_input.py
@@ -1,12 +1,12 @@
 import argparse
 import cmd
 
-from getch_helper import getch
-
 import machine_common_sense as mcs
 from machine_common_sense.goal_metadata import GoalMetadata
 from machine_common_sense.logging_config import LoggingConfig
 
+from .getch_helper import getch
+
 commandList = []
 
 
@@ -29,9 +29,10 @@ def parse_args():
         '--config_file_path',
         type=str,
         default=None,
+        required=True,
         help='Path to configuration file to read in and set various ' +
         'properties, such as metadata level and whether or not to ' +
-        'save history files properties. [default=None]')
+        'save history files properties.')
     return parser.parse_args()
 
 
@@ -177,9 +178,10 @@ def show_available_actions(self, output):
         ):
             print('Only actions available during this step:')
             for action, params in output.action_list:
-                action_string = action + ''.join([
-                    (',' + key + '=' + value) for key, value in params.items()
-                ])
+                action_string = action + ''.join(
+                    ',' + key + '=' + value for key, value in params.items()
+                )
+
                 print(f'    {action_string}')
         else:
             print('All actions available during this step.')
@@ -252,7 +254,7 @@ def main():
 
     controller = mcs.create_controller(
         unity_app_file_path=args.mcs_unity_build_file,
-        config_file_path=args.config_file_path,
+        config_file_or_dict=args.config_file_path,
         unity_cache_version=args.mcs_unity_version)
 
     scene_file_path = args.mcs_scene_json_file
diff --git a/scripts/run_init_scenes.py b/machine_common_sense/scripts/run_init_scenes.py
similarity index 93%
rename from scripts/run_init_scenes.py
rename to machine_common_sense/scripts/run_init_scenes.py
index 07a80a252..b308ff848 100644
--- a/scripts/run_init_scenes.py
+++ b/machine_common_sense/scripts/run_init_scenes.py
@@ -1,6 +1,5 @@
 import argparse
 import glob
-import os
 
 import machine_common_sense as mcs
 
@@ -20,7 +19,6 @@ def parse_args():
 
 
 def main():
-    os.environ['MCS_DEBUG_MODE'] = 'False'
     args = parse_args()
 
     output_folder = args.image_output_folder + '/'
@@ -28,7 +26,7 @@ def main():
 
     controller = mcs.create_controller(
         unity_app_file_path=args.mcs_unity_build_file,
-        config_file_path='./run_scripts_config_oracle_metadata.ini')
+        config_file_or_dict='./config_oracle_debug.ini')
 
     for json_file_name in json_file_list:
         scene_data, status = mcs.load_scene_json_file(json_file_name)
diff --git a/scripts/run_interactive_scenes.py b/machine_common_sense/scripts/run_interactive_scenes.py
similarity index 84%
rename from scripts/run_interactive_scenes.py
rename to machine_common_sense/scripts/run_interactive_scenes.py
index a4a28e48e..f5b4f9dab 100644
--- a/scripts/run_interactive_scenes.py
+++ b/machine_common_sense/scripts/run_interactive_scenes.py
@@ -1,4 +1,4 @@
-from runner_script import MultipleFileRunnerScript
+from .runner_script import MultipleFileRunnerScript
 
 
 def action_callback(scene_data, step_metadata, runner_script):
diff --git a/scripts/run_just_pass.py b/machine_common_sense/scripts/run_just_pass.py
similarity index 58%
rename from scripts/run_just_pass.py
rename to machine_common_sense/scripts/run_just_pass.py
index e478179d8..09f4215fa 100644
--- a/scripts/run_just_pass.py
+++ b/machine_common_sense/scripts/run_just_pass.py
@@ -1,11 +1,13 @@
-from runner_script import SingleFileRunnerScript
+from .runner_script import SingleFileRunnerScript
 
 
 def action_callback(scene_data, step_metadata, runner_script):
     last_step = 60
-    if 'goal' in scene_data.keys():
-        if 'last_step' in scene_data['goal'].keys():
-            last_step = scene_data['goal']['last_step']
+    if (
+        'goal' in scene_data.keys(
+        ) and 'last_step' in scene_data['goal'].keys()
+    ):
+        last_step = scene_data['goal']['last_step']
     if step_metadata.step_number < last_step:
         return 'Pass', {}
     return None, None
diff --git a/scripts/run_just_rotate.py b/machine_common_sense/scripts/run_just_rotate.py
similarity index 84%
rename from scripts/run_just_rotate.py
rename to machine_common_sense/scripts/run_just_rotate.py
index 35208386e..a92006a1f 100644
--- a/scripts/run_just_rotate.py
+++ b/machine_common_sense/scripts/run_just_rotate.py
@@ -1,4 +1,4 @@
-from runner_script import SingleFileRunnerScript
+from .runner_script import SingleFileRunnerScript
 
 
 def action_callback(scene_data, step_metadata, runner_script):
diff --git a/scripts/run_last_action.py b/machine_common_sense/scripts/run_last_action.py
similarity index 69%
rename from scripts/run_last_action.py
rename to machine_common_sense/scripts/run_last_action.py
index 44a291320..d8a1fc101 100644
--- a/scripts/run_last_action.py
+++ b/machine_common_sense/scripts/run_last_action.py
@@ -1,11 +1,13 @@
-from runner_script import SingleFileRunnerScript
+from .runner_script import SingleFileRunnerScript
 
 
 def action_callback(scene_data, step_metadata, runner_script):
     last_step = 60
-    if 'goal' in scene_data.keys():
-        if 'last_step' in scene_data['goal'].keys():
-            last_step = scene_data['goal']['last_step']
+    if (
+        'goal' in scene_data.keys(
+        ) and 'last_step' in scene_data['goal'].keys()
+    ):
+        last_step = scene_data['goal']['last_step']
     if step_metadata.step_number <= last_step:
         action, params = (
             step_metadata.action_list[len(step_metadata.action_list) - 1]
diff --git a/scripts/run_passive_scenes.py b/machine_common_sense/scripts/run_passive_scenes.py
similarity index 69%
rename from scripts/run_passive_scenes.py
rename to machine_common_sense/scripts/run_passive_scenes.py
index 50fa165d6..c3cc92c97 100644
--- a/scripts/run_passive_scenes.py
+++ b/machine_common_sense/scripts/run_passive_scenes.py
@@ -1,11 +1,13 @@
-from runner_script import MultipleFileRunnerScript
+from .runner_script import MultipleFileRunnerScript
 
 
 def action_callback(scene_data, step_metadata, runner_script):
     last_step = 60
-    if 'goal' in scene_data.keys():
-        if 'last_step' in scene_data['goal'].keys():
-            last_step = scene_data['goal']['last_step']
+    if (
+        'goal' in scene_data.keys(
+        ) and 'last_step' in scene_data['goal'].keys()
+    ):
+        last_step = scene_data['goal']['last_step']
     if step_metadata.step_number <= last_step:
         action, params = (
             step_metadata.action_list[len(step_metadata.action_list) - 1]
diff --git a/scripts/run_reorientation_scenes.py b/machine_common_sense/scripts/run_reorientation_scenes.py
similarity index 99%
rename from scripts/run_reorientation_scenes.py
rename to machine_common_sense/scripts/run_reorientation_scenes.py
index bb7bd8ee8..6ad0a5647 100644
--- a/scripts/run_reorientation_scenes.py
+++ b/machine_common_sense/scripts/run_reorientation_scenes.py
@@ -174,7 +174,7 @@ def action_callback(scene_data, step_metadata, runner_script):
             rotate_right_count += 3
         else:
             raise ValueError(f'The chosenCorner is not valid: {target_corner}')
-        rotate_right_count = rotate_right_count % 36
+        rotate_right_count %= 36
         if rotate_right_count > 18:
             rotate_right_count -= 36
         scene_state['target_id'] = (
diff --git a/scripts/run_scene_timer.py b/machine_common_sense/scripts/run_scene_timer.py
similarity index 92%
rename from scripts/run_scene_timer.py
rename to machine_common_sense/scripts/run_scene_timer.py
index a7201febb..fe973e863 100644
--- a/scripts/run_scene_timer.py
+++ b/machine_common_sense/scripts/run_scene_timer.py
@@ -33,15 +33,17 @@ def run_scene(controller, file_name):
         scene_data['name'] = scene_file_name[0:scene_file_name.find('.')]
 
     last_step = DEFAULT_STEP_COUNT
-    if 'goal' in scene_data.keys():
-        if 'last_step' in scene_data['goal'].keys():
-            last_step = scene_data['goal']['last_step']
+    if (
+        'goal' in scene_data.keys(
+        ) and 'last_step' in scene_data['goal'].keys()
+    ):
+        last_step = scene_data['goal']['last_step']
 
     step_time_list = []
 
     output = controller.start_scene(scene_data)
 
-    for i in range(output.step_number + 1, last_step + 1):
+    for _ in range(output.step_number + 1, last_step + 1):
         start = time.perf_counter()
         output = controller.step('Pass')
         end = time.perf_counter()
@@ -67,6 +69,7 @@ def main():
         f'FOUND {len(file_list)} SCENE CONFIGURATION FILES... '
         f'STARTING THE MCS UNITY APP...')
     controller = mcs.create_controller(
+        config_file_or_dict={},
         unity_app_file_path=args.mcs_unity_build_file)
 
     scene_time_list = []
@@ -77,7 +80,7 @@ def main():
     step_time_min_list = []
     step_time_sum_list = []
 
-    for i in range(0, len(file_list)):
+    for i in range(len(file_list)):
         print('========================================================='
               '=======================')
         print(f'RUNNING FILE {(i + 1)}: {file_list[i]}')
diff --git a/scripts/run_scene_with_command_file.py b/machine_common_sense/scripts/run_scene_with_command_file.py
similarity index 86%
rename from scripts/run_scene_with_command_file.py
rename to machine_common_sense/scripts/run_scene_with_command_file.py
index 372010016..bebb6fe39 100644
--- a/scripts/run_scene_with_command_file.py
+++ b/machine_common_sense/scripts/run_scene_with_command_file.py
@@ -20,12 +20,8 @@ def parse_args():
 
 
 def load_command_file(command_text_file):
-    commands = []
-    command_file = open(command_text_file, 'r')
-    for line in command_file:
-        commands.append(line.strip())
-    command_file.close()
-
+    with open(command_text_file, 'r') as command_file:
+        commands = [line.strip() for line in command_file]
     return commands
 
 
@@ -49,7 +45,7 @@ def main():
 
     controller = mcs.create_controller(
         unity_app_file_path=args.mcs_unity_build_file,
-        config_file_path='./run_scripts_config_with_history.ini'
+        config_file_or_dict='./run_scripts_config_with_history.ini'
     )
 
     config_file_path = args.mcs_config_json_file
diff --git a/scripts/run_scripts_config_with_history.ini b/machine_common_sense/scripts/run_scripts_config_with_history.ini
similarity index 100%
rename from scripts/run_scripts_config_with_history.ini
rename to machine_common_sense/scripts/run_scripts_config_with_history.ini
diff --git a/scripts/runner_script.py b/machine_common_sense/scripts/runner_script.py
similarity index 73%
rename from scripts/runner_script.py
rename to machine_common_sense/scripts/runner_script.py
index 9db324885..936da382d 100644
--- a/scripts/runner_script.py
+++ b/machine_common_sense/scripts/runner_script.py
@@ -3,6 +3,7 @@
 import logging
 import os.path
 import subprocess
+from typing import Callable, Dict, List, Tuple
 
 import machine_common_sense as mcs
 
@@ -15,9 +16,19 @@
 
 
 class AbstractRunnerScript():
-    def __init__(self, name, action_callback):
+    def __init__(
+        self,
+        name: str,
+        action_callback: Callable[
+            [Dict, mcs.StepMetadata, 'AbstractRunnerScript'],
+            Tuple[str, Dict]
+        ]
+    ):
         self._name = name
-        args, filename_list = self._read_args()
+        args, filenames = self._read_args()
+        if not len(filenames):
+            print('No matching files found... Exiting')
+            exit()
         self.args = args
 
         debug = (args.save_videos or args.save_gifs or args.debug)
@@ -29,16 +40,19 @@ def __init__(self, name, action_callback):
         if args.oracle:
             config_suffix = 'oracle_debug' if debug else 'oracle'
 
-        config_file_path = SCRIPT_FOLDER + '/config_' + config_suffix + '.ini'
-        if args.config_file:
-            config_file_path = args.config_file
+        config_file_path = (
+            args.config_file or
+            SCRIPT_FOLDER + '/config_' + config_suffix + '.ini'
+        )
+
+        print('========================================')
         controller = mcs.create_controller(
             unity_app_file_path=args.mcs_unity_build_file,
             unity_cache_version=args.mcs_unity_version,
-            config_file_path=config_file_path
+            config_file_or_dict=config_file_path
         )
 
-        for filename in filename_list:
+        for filename in filenames:
             scene_name = self.run_scene(
                 controller,
                 filename,
@@ -69,11 +83,14 @@ def __init__(self, name, action_callback):
                     scene_name + '.gif'
                 ])
 
-    def _append_subclass_args_to_parser(self, parser):
+    def _append_subclass_args_to_parser(
+        self,
+        parser: argparse.ArgumentParser
+    ) -> argparse.ArgumentParser:
         # To override
         return parser
 
-    def _read_args(self):
+    def _read_args(self) -> Tuple[argparse.Namespace, List[str]]:
         parser = argparse.ArgumentParser(description=('Run ' + self._name))
         parser.add_argument(
             '--config_file',
@@ -150,18 +167,24 @@ def _read_args(self):
         parser = self._append_subclass_args_to_parser(parser)
         return self._read_subclass_args(parser)
 
-    def _read_subclass_args(self, parser):
+    def _read_subclass_args(
+        self,
+        parser: argparse.ArgumentParser
+    ) -> Tuple[argparse.Namespace, List[str]]:
         # To override
         return None, []
 
     def run_scene(
         self,
-        controller,
-        filename,
-        action_callback,
-        last_step,
-        prefix,
-        rename
+        controller: mcs.Controller,
+        filename: str,
+        action_callback: Callable[
+            [Dict, mcs.StepMetadata, 'AbstractRunnerScript'],
+            Tuple[str, Dict]
+        ],
+        last_step: int,
+        prefix: str,
+        rename: bool
     ):
         scene_data, status = mcs.load_scene_json_file(filename)
 
@@ -183,10 +206,10 @@ def run_scene(
         )
 
         # Use the prefix and/or rename arguments for the new scene name.
-        scene_name = (
-            ((prefix + '_') if prefix else '') +
-            (rename if rename else scene_data.get('name', ''))
+        scene_name = ((prefix + '_') if prefix else '') + (
+            rename or scene_data.get('name', '')
         )
+
         if rename and 'sceneInfo' in scene_data.get('goal', {}):
             # Rename the scene using its hypercube cell ID.
             scene_id = scene_data['goal']['sceneInfo']['id'][0]
@@ -210,20 +233,33 @@ def run_scene(
 
 
 class SingleFileRunnerScript(AbstractRunnerScript):
-    def _append_subclass_args_to_parser(self, parser):
+    def _append_subclass_args_to_parser(
+        self,
+        parser: argparse.ArgumentParser
+    ) -> argparse.ArgumentParser:
         parser.add_argument(
             'mcs_scene_filename',
             help='Filename of MCS scene to run'
         )
         return parser
 
-    def _read_subclass_args(self, parser):
+    def _read_subclass_args(
+        self,
+        parser: argparse.ArgumentParser
+    ) -> Tuple[argparse.Namespace, List[str]]:
         args = parser.parse_args()
         return args, [args.mcs_scene_filename]
 
 
 class MultipleFileRunnerScript(AbstractRunnerScript):
-    def __init__(self, name, action_callback):
+    def __init__(
+        self,
+        name: str,
+        action_callback: Callable[
+            [Dict, mcs.StepMetadata, 'AbstractRunnerScript'],
+            Tuple[str, Dict]
+        ]
+    ):
         super().__init__(name, action_callback)
         if self.args.zip_prefix:
             for file_type in (
@@ -239,7 +275,10 @@ def __init__(self, name, action_callback):
                 glob.glob(self.args.mcs_scene_prefix + '*/frame_image_*.png')
             )
 
-    def _append_subclass_args_to_parser(self, parser):
+    def _append_subclass_args_to_parser(
+        self,
+        parser: argparse.ArgumentParser
+    ) -> argparse.ArgumentParser:
         parser.add_argument(
             'mcs_scene_prefix',
             help='Filename prefix of all MCS scenes to run'
@@ -251,9 +290,21 @@ def _append_subclass_args_to_parser(self, parser):
         )
         return parser
 
-    def _read_subclass_args(self, parser):
+    def _read_subclass_args(
+        self,
+        parser: argparse.ArgumentParser
+    ) -> Tuple[argparse.Namespace, List[str]]:
         args = parser.parse_args()
-        filename_list = glob.glob(args.mcs_scene_prefix + '*_debug.json')
-        if len(filename_list) == 0:
-            filename_list = glob.glob(args.mcs_scene_prefix + '*.json')
-        return args, sorted(filename_list)
+        filenames = glob.glob(args.mcs_scene_prefix + '*_debug.json')
+        print(
+            f'Found {len(filenames)} files matching '
+            f'{args.mcs_scene_prefix + "*_debug.json"}'
+        )
+        if not len(filenames):
+            print('No matching files found... trying non-debug files')
+            filenames = glob.glob(args.mcs_scene_prefix + '*.json')
+            print(
+                f'Found {len(filenames)} files matching '
+                f'{args.mcs_scene_prefix + "*.json"}'
+            )
+        return args, sorted(filenames)
diff --git a/scripts/sample_command_text.txt b/machine_common_sense/scripts/sample_command_text.txt
similarity index 100%
rename from scripts/sample_command_text.txt
rename to machine_common_sense/scripts/sample_command_text.txt
diff --git a/machine_common_sense/serializer.py b/machine_common_sense/serializer.py
index f65810513..1f828ba39 100644
--- a/machine_common_sense/serializer.py
+++ b/machine_common_sense/serializer.py
@@ -155,16 +155,16 @@ def _ext_unpack(code, data):
                                 habituation_total, last_preview_phase_step,
                                 last_step, metadata)
         elif code == 5:
-            uuid, color, dimensions, direction, distance, distance_in_steps, \
+            uuid, dimensions, direction, distance, distance_in_steps, \
                 distance_in_world, held, mass, material_list, position, \
-                rotation, shape, state_list, texture_color_list, \
-                visible = msgpack.unpackb(
+                rotation, segment_color, shape, state_list, \
+                texture_color_list, visible = msgpack.unpackb(
                     data, ext_hook=SerializerMsgPack._ext_unpack)
-            return ObjectMetadata(uuid, color, dimensions, direction, distance,
+            return ObjectMetadata(uuid, dimensions, direction, distance,
                                   distance_in_steps, distance_in_world, held,
                                   mass, material_list, position, rotation,
-                                  shape, state_list, texture_color_list,
-                                  visible)
+                                  segment_color, shape, state_list,
+                                  texture_color_list, visible)
         elif code == 6:
             x = msgpack.unpackb(data, ext_hook=SerializerMsgPack._ext_unpack)
             return np.asarray(x)
@@ -211,7 +211,9 @@ class McsStepMetadataEncoder(json.JSONEncoder):
         json_dump = json.dumps(output, cls=McsStepMetadataEncoder, indent=4)
         """
 
+        # Empty docstring here to override superclass function docstring.
         def default(self, x):
+            """"""
             if isinstance(x, StepMetadata):
                 return {
                     'action_list': x.action_list,
@@ -253,7 +255,6 @@ def default(self, x):
             elif isinstance(x, ObjectMetadata):
                 return {
                     'uuid': x.uuid,
-                    'color': x.color,
                     'dimensions': x.dimensions,
                     'direction': x.direction,
                     'distance': x.distance,
@@ -264,6 +265,7 @@ def default(self, x):
                     'material_list': x.material_list,
                     'position': x.position,
                     'rotation': x.rotation,
+                    'segment_color': x.segment_color,
                     'shape': x.shape,
                     'state_list': x.state_list,
                     'texture_color_list': x.texture_color_list,
@@ -281,14 +283,22 @@ def convert_object_list(raw_list):
         object_list = []
         for object_raw in raw_list:
             obj = ObjectMetadata(
-                object_raw['uuid'], object_raw['color'],
-                object_raw['dimensions'], object_raw['direction'],
-                object_raw['distance'], object_raw['distance_in_steps'],
-                object_raw['distance_in_world'], object_raw['held'],
-                object_raw['mass'], object_raw['material_list'],
-                object_raw['position'], object_raw['rotation'],
-                object_raw['shape'], object_raw['state_list'],
-                object_raw['texture_color_list'], object_raw['visible'])
+                object_raw['uuid'],
+                object_raw['dimensions'],
+                object_raw['direction'],
+                object_raw['distance'],
+                object_raw['distance_in_steps'],
+                object_raw['distance_in_world'],
+                object_raw['held'],
+                object_raw['mass'],
+                object_raw['material_list'],
+                object_raw['position'],
+                object_raw['rotation'],
+                object_raw['segment_color'],
+                object_raw['shape'],
+                object_raw['state_list'],
+                object_raw['texture_color_list'],
+                object_raw['visible'])
             object_list.append(obj)
         return object_list
 
diff --git a/machine_common_sense/step_metadata.py b/machine_common_sense/step_metadata.py
index 77fc4fda6..e72852c70 100644
--- a/machine_common_sense/step_metadata.py
+++ b/machine_common_sense/step_metadata.py
@@ -22,7 +22,18 @@ class StepMetadata:
         the specific parameters objectId=a.
         An action_list of None or an empty list means that all actions will
         be available for the next step.
-        Derived from GoalMetadata.action_list.
+
+        To "step" using the first action from the action_list:
+
+        .. highlight:: python
+        .. code-block:: python
+
+            step_metadata = controller.start_scene(scene_data)
+            action, params = step_metadata.action_list[0]
+            step_metadata = controller.step(action, **params)
+
+        Derived from :mod:`GoalMetadata.action_list[step_number]
+        <machine_common_sense.GoalMetadata>`.
         May be a subset of all possible actions. See
         :mod:`Action <machine_common_sense.Action>`.
     camera_aspect_ratio : (float, float)
@@ -174,7 +185,7 @@ def check_list_none(self, obj_list):
         if obj_list is None:
             return None
         else:
-            return dict((obj.uuid, dict(obj)) for obj in obj_list)
+            return {obj.uuid: dict(obj) for obj in obj_list}
 
     def copy_without_depth_or_images(self):
         """Return a deep copy of this StepMetadata with default depth_map_list,
diff --git a/machine_common_sense/stringifier.py b/machine_common_sense/stringifier.py
index 867d5a132..f5302ebf7 100644
--- a/machine_common_sense/stringifier.py
+++ b/machine_common_sense/stringifier.py
@@ -128,7 +128,7 @@ def value_to_str(input_value, depth=0):
             return "null"
         if isinstance(input_value, dict):
             text_list = [
-                next_indent + "\"" + dict_key + "\": " +
+                next_indent + "\"" + str(dict_key) + "\": " +
                 Stringifier.value_to_str(dict_value, depth + 1)
                 for dict_key, dict_value in input_value.items()
             ]
diff --git a/scripts/black_image.png b/scripts/black_image.png
deleted file mode 100644
index 31575d816..000000000
Binary files a/scripts/black_image.png and /dev/null differ
diff --git a/scripts/create_intuitive_physics_frames.py b/scripts/create_intuitive_physics_frames.py
index 7431cb566..99361f679 100644
--- a/scripts/create_intuitive_physics_frames.py
+++ b/scripts/create_intuitive_physics_frames.py
@@ -12,15 +12,11 @@
 def run():
     folder_prefix = sys.argv[1]
     eval_number = sys.argv[2]
-    move_across = False
-    if len(sys.argv) > 3:
-        move_across = True
-
+    move_across = len(sys.argv) > 3
     folder_list = glob.glob(folder_prefix + '*')
-    folder_list = [
+    folder_list = sorted([
         folder for folder in folder_list if os.path.isdir(folder)
-    ]
-    folder_list.sort()
+    ])
 
     file_list = []
 
diff --git a/scripts/generate_passive_quartet_videos.py b/scripts/generate_passive_quartet_videos.py
index d89a864e3..204930f35 100644
--- a/scripts/generate_passive_quartet_videos.py
+++ b/scripts/generate_passive_quartet_videos.py
@@ -40,13 +40,15 @@ def run_scene(controller, file_name: str) -> None:
         scene_data['name'] = scene_file_name[0:scene_file_name.find('.')]
 
     last_step = 30
-    if 'goal' in scene_data.keys():
-        if 'last_step' in scene_data['goal'].keys():
-            last_step = scene_data['goal']['last_step']
+    if (
+        'goal' in scene_data.keys(
+        ) and 'last_step' in scene_data['goal'].keys()
+    ):
+        last_step = scene_data['goal']['last_step']
 
     output = controller.start_scene(scene_data)
 
-    for i in range(output.step_number + 1, last_step + 1):
+    for _ in range(output.step_number + 1, last_step + 1):
         action = output.action_list[len(output.action_list) - 1]
         output = controller.step(action)
 
@@ -57,9 +59,7 @@ def list_quartets(input_dir: str) -> List:
     num_files = len(files)
     if num_files % 4 != 0:
         raise ValueError('Number of scene files is not a multiple of 4')
-    # TODO not ensuring the same basename
-    quartets = [files[x:x + 4] for x in range(0, num_files, 4)]
-    return quartets
+    return [files[x:x + 4] for x in range(0, num_files, 4)]
 
 
 def cleanup(quartet: List) -> None:
@@ -69,11 +69,11 @@ def cleanup(quartet: List) -> None:
 
 
 def main():
-    os.environ['MCS_DEBUG_MODE'] = 'True'
     args = parse_args()
     quartets = list_quartets(args.input)
     output_dir = pathlib.Path(args.output)
-    controller = mcs.create_controller(unity_app_file_path=args.engine)
+    controller = mcs.create_controller(config_file_or_dict={},
+                                       unity_app_file_path=args.engine)
 
     # object_permanence, shape_constancy, spatio_temporal_continuity -
     # {0001 - 0100} - {1 - 4}
diff --git a/setup.py b/setup.py
index d96820a99..b5a82ffb7 100644
--- a/setup.py
+++ b/setup.py
@@ -32,6 +32,7 @@ def get_version():
     license='Apache-2',
     python_requires=">3.6",
     packages=setuptools.find_packages(),
+    package_data={'': ['*.ini'], },
     install_requires=[
         'shapely>=1.7.0',
         'colour>=0.1.5',
@@ -45,9 +46,12 @@ def get_version():
     ],
     entry_points={
         'console_scripts': [
-            'run_in_human_input_mode=scripts.run_human_input:main',
-            'run_scene_timer=scripts.run_scene_timer:main',
-            'cache_addressables=scripts.cache_addressables:main'
+            ('run_in_human_input_mode='
+             'machine_common_sense.scripts.run_human_input:main'),
+            ('run_scene_timer='
+             'machine_common_sense.scripts.run_scene_timer:main'),
+            ('cache_addressables='
+             'machine_common_sense.scripts.cache_addressables:main')
         ]
     }
 )


Test patch:
diff --git a/integration_tests/README.md b/integration_tests/README.md
index bdf48ab98..b22e27ee4 100644
--- a/integration_tests/README.md
+++ b/integration_tests/README.md
@@ -7,19 +7,19 @@ The goal of the integration tests is to:
 ## Run Handmade Tests
 
 ```
-python run_handmade_tests.py <mcs_unity_build_file_path>
+python run_handmade_tests.py --mcs_unity_build_file_path <mcs_unity_build_file_path>
 ```
 
 ### Run Specific Metadata Tier
 
 ```
-python run_handmade_tests.py <mcs_unity_build_file_path> --metadata <level1|level2|oracle>
+python run_handmade_tests.py --mcs_unity_build_file_path <mcs_unity_build_file_path> --metadata <level1|level2|oracle>
 ```
 
 ### Run Specific Test Scene
 
 ```
-python run_handmade_tests.py <mcs_unity_build_file_path> --test 001
+python run_handmade_tests.py --mcs_unity_build_file_path <mcs_unity_build_file_path> --test 001
 ```
 
 Replace `001` with any test scene.
@@ -31,7 +31,7 @@ TODO MCS-432
 ## Run All Tests
 
 ```
-python run_tests.py <mcs_unity_build_file_path>
+python run_tests.py --mcs_unity_build_file_path <mcs_unity_build_file_path>
 ```
 
 ## Run the Autofixer
@@ -41,7 +41,7 @@ The autofixer will automatically fix any broken test cases and overwrite the tes
 Please make sure that you know what you're doing when you run the autofixer, so it doesn't "fix" a test case that's actually exposing a bug! You can also use the `--test` and `--metadata` arguments to run the autofixer on only specific test files. Remember to commit the modified files in the git repository.
 
 ```
-python run_tests.py <mcs_unity_build_file_path> --autofix
+python run_tests.py --mcs_unity_build_file_path <mcs_unity_build_file_path> --autofix
 ```
 
 ## Adding New Handmade Test Scenes
diff --git a/integration_tests/additional_integration_tests.py b/integration_tests/additional_integration_tests.py
index 8ce0de520..1b4c892ac 100644
--- a/integration_tests/additional_integration_tests.py
+++ b/integration_tests/additional_integration_tests.py
@@ -65,7 +65,7 @@ def run_depth_and_segmentation_test(controller, metadata_tier):
                 f'Step 1 {metadata_tier} failed: object_mask_list with length '
                 f'{len(step_metadata_0.object_mask_list)} should be length 1'
             )
-    # Verify the consistent color of each object across both steps.
+    # Verify the consistent segment_color of each object across both steps.
     if metadata_tier == 'oracle':
         if (
             step_metadata_0.object_list[0].uuid !=
@@ -88,24 +88,24 @@ def run_depth_and_segmentation_test(controller, metadata_tier):
                 f'{step_metadata_1.object_list[1].uuid}'
             )
         if (
-            step_metadata_0.object_list[0].color !=
-            step_metadata_1.object_list[0].color
+            step_metadata_0.object_list[0].segment_color !=
+            step_metadata_1.object_list[0].segment_color
         ):
             return (
                 False,
-                f'Step 1 {metadata_tier} failed: object_list[0].color '
-                f'{step_metadata_0.object_list[0].color} != '
-                f'{step_metadata_1.object_list[0].color}'
+                f'Step 1 {metadata_tier} failed: object_list[0].segment_color '
+                f'{step_metadata_0.object_list[0].segment_color} != '
+                f'{step_metadata_1.object_list[0].segment_color}'
             )
         if (
-            step_metadata_0.object_list[1].color !=
-            step_metadata_1.object_list[1].color
+            step_metadata_0.object_list[1].segment_color !=
+            step_metadata_1.object_list[1].segment_color
         ):
             return (
                 False,
-                f'Step 1 {metadata_tier} failed: object_list[1].color '
-                f'{step_metadata_0.object_list[1].color} != '
-                f'{step_metadata_1.object_list[1].color}'
+                f'Step 1 {metadata_tier} failed: object_list[1].segment_color '
+                f'{step_metadata_0.object_list[1].segment_color} != '
+                f'{step_metadata_1.object_list[1].segment_color}'
             )
 
     # Stop the test scene.
diff --git a/integration_tests/data/042.put_onto_floor.level1.outputs.json b/integration_tests/data/042.put_onto_floor.level1.outputs.json
index 4dbc12640..d6a5a2fbd 100644
--- a/integration_tests/data/042.put_onto_floor.level1.outputs.json
+++ b/integration_tests/data/042.put_onto_floor.level1.outputs.json
@@ -21,7 +21,7 @@
     "head_tilt": 0,
     "position_x": null,
     "position_z": null,
-    "return_status": "NOT_RECEPTACLE",
+    "return_status": "NOT_INTERACTABLE",
     "rotation_y": null,
     "objects_count": 0,
     "structural_objects_count": 0
diff --git a/integration_tests/data/042.put_onto_floor.level2.outputs.json b/integration_tests/data/042.put_onto_floor.level2.outputs.json
index 4dbc12640..d6a5a2fbd 100644
--- a/integration_tests/data/042.put_onto_floor.level2.outputs.json
+++ b/integration_tests/data/042.put_onto_floor.level2.outputs.json
@@ -21,7 +21,7 @@
     "head_tilt": 0,
     "position_x": null,
     "position_z": null,
-    "return_status": "NOT_RECEPTACLE",
+    "return_status": "NOT_INTERACTABLE",
     "rotation_y": null,
     "objects_count": 0,
     "structural_objects_count": 0
diff --git a/integration_tests/data/042.put_onto_floor.oracle.outputs.json b/integration_tests/data/042.put_onto_floor.oracle.outputs.json
index 24a36a25d..5f90535b0 100644
--- a/integration_tests/data/042.put_onto_floor.oracle.outputs.json
+++ b/integration_tests/data/042.put_onto_floor.oracle.outputs.json
@@ -87,9 +87,9 @@
         "objects_count": 1,
         "position_x": 0.0,
         "position_z": 0.0,
-        "return_status": "NOT_RECEPTACLE",
+        "return_status": "NOT_INTERACTABLE",
         "rotation_y": 0.0,
         "step_number": 2,
         "structural_objects_count": 6
     }
-]
\ No newline at end of file
+]
diff --git a/integration_tests/data/047.open_and_close_with_image_coord.level1.outputs.json b/integration_tests/data/047.open_and_close_with_image_coord.level1.outputs.json
index b7905b5fb..efe98a72c 100644
--- a/integration_tests/data/047.open_and_close_with_image_coord.level1.outputs.json
+++ b/integration_tests/data/047.open_and_close_with_image_coord.level1.outputs.json
@@ -14,7 +14,7 @@
         "objects_count": 0,
         "position_x": null,
         "position_z": null,
-        "return_status": "NOT_RECEPTACLE",
+        "return_status": "NOT_INTERACTABLE",
         "rotation_y": null,
         "step_number": 1,
         "structural_objects_count": 0
@@ -24,7 +24,7 @@
         "objects_count": 0,
         "position_x": null,
         "position_z": null,
-        "return_status": "NOT_RECEPTACLE",
+        "return_status": "NOT_INTERACTABLE",
         "rotation_y": null,
         "step_number": 2,
         "structural_objects_count": 0
@@ -49,4 +49,4 @@
         "step_number": 4,
         "structural_objects_count": 0
     }
-]
\ No newline at end of file
+]
diff --git a/integration_tests/data/047.open_and_close_with_image_coord.level2.outputs.json b/integration_tests/data/047.open_and_close_with_image_coord.level2.outputs.json
index b7905b5fb..efe98a72c 100644
--- a/integration_tests/data/047.open_and_close_with_image_coord.level2.outputs.json
+++ b/integration_tests/data/047.open_and_close_with_image_coord.level2.outputs.json
@@ -14,7 +14,7 @@
         "objects_count": 0,
         "position_x": null,
         "position_z": null,
-        "return_status": "NOT_RECEPTACLE",
+        "return_status": "NOT_INTERACTABLE",
         "rotation_y": null,
         "step_number": 1,
         "structural_objects_count": 0
@@ -24,7 +24,7 @@
         "objects_count": 0,
         "position_x": null,
         "position_z": null,
-        "return_status": "NOT_RECEPTACLE",
+        "return_status": "NOT_INTERACTABLE",
         "rotation_y": null,
         "step_number": 2,
         "structural_objects_count": 0
@@ -49,4 +49,4 @@
         "step_number": 4,
         "structural_objects_count": 0
     }
-]
\ No newline at end of file
+]
diff --git a/integration_tests/data/047.open_and_close_with_image_coord.oracle.outputs.json b/integration_tests/data/047.open_and_close_with_image_coord.oracle.outputs.json
index 669151d7d..2a10a759f 100644
--- a/integration_tests/data/047.open_and_close_with_image_coord.oracle.outputs.json
+++ b/integration_tests/data/047.open_and_close_with_image_coord.oracle.outputs.json
@@ -56,7 +56,7 @@
         "objects_count": 1,
         "position_x": 0.0,
         "position_z": 0.0,
-        "return_status": "NOT_RECEPTACLE",
+        "return_status": "NOT_INTERACTABLE",
         "rotation_y": 0.0,
         "step_number": 1,
         "structural_objects_count": 6
@@ -87,7 +87,7 @@
         "objects_count": 1,
         "position_x": 0.0,
         "position_z": 0.0,
-        "return_status": "NOT_RECEPTACLE",
+        "return_status": "NOT_INTERACTABLE",
         "rotation_y": 0.0,
         "step_number": 2,
         "structural_objects_count": 6
@@ -154,4 +154,4 @@
         "step_number": 4,
         "structural_objects_count": 6
     }
-]
\ No newline at end of file
+]
diff --git a/integration_tests/data/069.intuitive_physics_scene_start.oracle.outputs.json b/integration_tests/data/069.intuitive_physics_scene_start.oracle.outputs.json
index 852d81c80..5172e33bc 100644
--- a/integration_tests/data/069.intuitive_physics_scene_start.oracle.outputs.json
+++ b/integration_tests/data/069.intuitive_physics_scene_start.oracle.outputs.json
@@ -70,13 +70,13 @@
                 "visible": true
             },
             {
-                "direction_x": -0.975,
+                "direction_x": -0.857,
                 "direction_y": 0.0,
-                "direction_z": 0.22,
-                "distance": 20.5,
+                "direction_z": 0.514,
+                "distance": 8.746,
                 "held": false,
                 "id": "wall_left",
-                "position_x": -20.0,
+                "position_x": -7.5,
                 "position_z": 0.0,
                 "shape": "structural",
                 "texture_color_list": [
@@ -85,13 +85,13 @@
                 "visible": true
             },
             {
-                "direction_x": 0.975,
+                "direction_x": 0.857,
                 "direction_y": 0.0,
-                "direction_z": 0.22,
-                "distance": 20.5,
+                "direction_z": 0.514,
+                "distance": 8.746,
                 "held": false,
                 "id": "wall_right",
-                "position_x": 20.0,
+                "position_x": 7.5,
                 "position_z": 0.0,
                 "shape": "structural",
                 "texture_color_list": [
@@ -173,13 +173,13 @@
                 "visible": true
             },
             {
-                "direction_x": -0.975,
+                "direction_x": -0.857,
                 "direction_y": 0.0,
-                "direction_z": 0.22,
-                "distance": 20.5,
+                "direction_z": 0.514,
+                "distance": 8.746,
                 "held": false,
                 "id": "wall_left",
-                "position_x": -20.0,
+                "position_x": -7.5,
                 "position_z": 0.0,
                 "shape": "structural",
                 "texture_color_list": [
@@ -188,13 +188,13 @@
                 "visible": true
             },
             {
-                "direction_x": 0.975,
+                "direction_x": 0.857,
                 "direction_y": 0.0,
-                "direction_z": 0.22,
-                "distance": 20.5,
+                "direction_z": 0.514,
+                "distance": 8.746,
                 "held": false,
                 "id": "wall_right",
-                "position_x": 20.0,
+                "position_x": 7.5,
                 "position_z": 0.0,
                 "shape": "structural",
                 "texture_color_list": [
diff --git a/integration_tests/data/087.moving_rotating_occluder.actions.txt b/integration_tests/data/087.moving_rotating_occluder.actions.txt
new file mode 100644
index 000000000..22e3ce2ee
--- /dev/null
+++ b/integration_tests/data/087.moving_rotating_occluder.actions.txt
@@ -0,0 +1,15 @@
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
diff --git a/integration_tests/data/087.moving_rotating_occluder.level1.outputs.json b/integration_tests/data/087.moving_rotating_occluder.level1.outputs.json
new file mode 100644
index 000000000..d9bc4fed4
--- /dev/null
+++ b/integration_tests/data/087.moving_rotating_occluder.level1.outputs.json
@@ -0,0 +1,145 @@
+[{
+    "step_number": 0,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 1,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 2,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 3,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 4,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 5,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 6,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 7,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 8,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 9,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 10,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 11,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 12,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 13,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 14,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 15,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}]
diff --git a/integration_tests/data/087.moving_rotating_occluder.level2.outputs.json b/integration_tests/data/087.moving_rotating_occluder.level2.outputs.json
new file mode 100644
index 000000000..d9bc4fed4
--- /dev/null
+++ b/integration_tests/data/087.moving_rotating_occluder.level2.outputs.json
@@ -0,0 +1,145 @@
+[{
+    "step_number": 0,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 1,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 2,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 3,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 4,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 5,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 6,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 7,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 8,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 9,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 10,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 11,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 12,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 13,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 14,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 15,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}]
diff --git a/integration_tests/data/087.moving_rotating_occluder.oracle.outputs.json b/integration_tests/data/087.moving_rotating_occluder.oracle.outputs.json
new file mode 100644
index 000000000..6250f4bdb
--- /dev/null
+++ b/integration_tests/data/087.moving_rotating_occluder.oracle.outputs.json
@@ -0,0 +1,610 @@
+﻿[
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 0,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.086,
+                "direction_z": 0.996,
+                "distance": 8.532,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.281,
+                "direction_z": 0.96,
+                "distance": 8.857,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 1,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.115,
+                "direction_z": 0.993,
+                "distance": 8.557,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 330,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.307,
+                "direction_z": 0.952,
+                "distance": 8.93,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 2,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.144,
+                "direction_z": 0.99,
+                "distance": 8.59,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 300,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.332,
+                "direction_z": 0.943,
+                "distance": 9.01,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 3,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.172,
+                "direction_z": 0.985,
+                "distance": 8.629,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 270,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.356,
+                "direction_z": 0.934,
+                "distance": 9.096,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 4,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.2,
+                "direction_z": 0.98,
+                "distance": 8.676,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 270,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.38,
+                "direction_z": 0.925,
+                "distance": 9.188,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 5,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.228,
+                "direction_z": 0.974,
+                "distance": 8.729,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 270,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.403,
+                "direction_z": 0.915,
+                "distance": 9.286,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 6,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.255,
+                "direction_z": 0.967,
+                "distance": 8.79,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 270,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.425,
+                "direction_z": 0.905,
+                "distance": 9.389,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 7,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.228,
+                "direction_z": 0.974,
+                "distance": 8.729,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 270,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.403,
+                "direction_z": 0.915,
+                "distance": 9.286,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 8,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.2,
+                "direction_z": 0.98,
+                "distance": 8.676,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 270,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.38,
+                "direction_z": 0.925,
+                "distance": 9.188,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 9,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.172,
+                "direction_z": 0.985,
+                "distance": 8.629,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 270,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.356,
+                "direction_z": 0.934,
+                "distance": 9.096,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 10,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.144,
+                "direction_z": 0.99,
+                "distance": 8.59,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 300,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.332,
+                "direction_z": 0.943,
+                "distance": 9.01,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 11,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.115,
+                "direction_z": 0.993,
+                "distance": 8.557,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 330,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.307,
+                "direction_z": 0.952,
+                "distance": 8.93,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 12,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.086,
+                "direction_z": 0.996,
+                "distance": 8.532,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.281,
+                "direction_z": 0.96,
+                "distance": 8.857,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 13,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.086,
+                "direction_z": 0.996,
+                "distance": 8.532,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.281,
+                "direction_z": 0.96,
+                "distance": 8.857,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 14,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.086,
+                "direction_z": 0.996,
+                "distance": 8.532,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.281,
+                "direction_z": 0.96,
+                "distance": 8.857,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 15,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.086,
+                "direction_z": 0.996,
+                "distance": 8.532,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.281,
+                "direction_z": 0.96,
+                "distance": 8.857,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    }
+]
\ No newline at end of file
diff --git a/integration_tests/data/087.moving_rotating_occluder.scene.json b/integration_tests/data/087.moving_rotating_occluder.scene.json
new file mode 100644
index 000000000..695bc9acc
--- /dev/null
+++ b/integration_tests/data/087.moving_rotating_occluder.scene.json
@@ -0,0 +1,127 @@
+﻿{
+    "name": "validate scripted occluder movement and rotation",
+    "version": 2,
+    "ceilingMaterial": "AI2-THOR/Materials/Walls/Drywall",
+    "floorMaterial": "AI2-THOR/Materials/Fabrics/CarpetWhite 3",
+    "wallMaterial": "AI2-THOR/Materials/Walls/Drywall",
+    "performerStart": {
+        "position": {
+            "x": 0,
+            "z": -4.5
+        },
+        "rotation": {
+            "x": 0,
+            "y": 0
+        }
+    },
+    "roomDimensions": {
+        "x": 10,
+        "y": 5,
+        "z": 10
+    },
+    "objects": [{
+      "id": "occluder_wall_1",
+      "type": "cube",
+      "kinematic": true,
+      "structure": true,
+      "mass": 100,
+      "materials": ["AI2-THOR/Materials/Walls/DrywallOrange"],
+      "shows": [
+        {
+          "stepBegin": 0,
+          "position": {
+            "x": 0,
+            "y": 1.5,
+            "z": 4
+          },
+          "scale": {
+            "x": 1,
+            "y": 3,
+            "z": 0.1
+          }
+        }
+      ],
+      "moves": [
+        {
+          "stepBegin": 1,
+          "stepEnd": 6,
+          "vector": {
+            "x": 0,
+            "y": 0.25,
+            "z": 0
+          }
+        },
+        {
+          "stepBegin": 7,
+          "stepEnd": 12,
+          "vector": {
+            "x": 0,
+            "y": -0.25,
+            "z": 0
+          }
+        }
+      ],
+      "rotates": [
+        {
+          "stepBegin": 1,
+          "stepEnd": 3,
+          "vector": {
+            "x": 0,
+            "y": -30,
+            "z": 0
+          }
+        },
+        {
+          "stepBegin": 10,
+          "stepEnd": 12,
+          "vector": {
+            "x": 0,
+            "y": 30,
+            "z": 0
+          }
+        }
+      ]
+    }, {
+      "id": "occluder_pole_1",
+      "type": "cylinder",
+      "kinematic": true,
+      "structure": true,
+      "mass": 100,
+      "materials": ["AI2-THOR/Materials/Metals/Metal"],
+      "shows": [
+        {
+          "stepBegin": 0,
+          "position": {
+            "x": 0,
+            "y": 3.25,
+            "z": 4
+          },
+          "scale": {
+            "x": 0.095,
+            "y": 2,
+            "z": 0.095
+          }
+        }
+      ],
+      "moves": [
+        {
+          "stepBegin": 1,
+          "stepEnd": 6,
+          "vector": {
+            "x": 0,
+            "y": 0.25,
+            "z": 0
+          }
+        },
+        {
+          "stepBegin": 7,
+          "stepEnd": 12,
+          "vector": {
+            "x": 0,
+            "y": -0.25,
+            "z": 0
+          }
+        }
+      ]
+    }]
+}
diff --git a/integration_tests/data/088.placer.actions.txt b/integration_tests/data/088.placer.actions.txt
new file mode 100644
index 000000000..f48622da8
--- /dev/null
+++ b/integration_tests/data/088.placer.actions.txt
@@ -0,0 +1,50 @@
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
diff --git a/integration_tests/data/088.placer.level1.outputs.json b/integration_tests/data/088.placer.level1.outputs.json
new file mode 100644
index 000000000..1cf05b125
--- /dev/null
+++ b/integration_tests/data/088.placer.level1.outputs.json
@@ -0,0 +1,460 @@
+[{
+    "step_number": 0,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 1,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 2,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 3,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 4,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 5,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 6,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 7,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 8,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 9,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 10,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 11,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 12,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 13,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 14,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 15,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 16,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 17,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 18,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 19,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 20,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 21,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 22,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 23,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 24,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 25,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 26,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 27,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 28,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 29,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 30,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 31,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 32,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 33,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 34,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 35,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 36,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 37,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 38,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 39,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 40,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 41,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 42,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 43,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 44,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 45,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 46,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 47,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 48,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 49,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 50,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}]
diff --git a/integration_tests/data/088.placer.level2.outputs.json b/integration_tests/data/088.placer.level2.outputs.json
new file mode 100644
index 000000000..1cf05b125
--- /dev/null
+++ b/integration_tests/data/088.placer.level2.outputs.json
@@ -0,0 +1,460 @@
+[{
+    "step_number": 0,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 1,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 2,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 3,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 4,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 5,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 6,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 7,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 8,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 9,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 10,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 11,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 12,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 13,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 14,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 15,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 16,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 17,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 18,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 19,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 20,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 21,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 22,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 23,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 24,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 25,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 26,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 27,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 28,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 29,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 30,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 31,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 32,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 33,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 34,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 35,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 36,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 37,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 38,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 39,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 40,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 41,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 42,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 43,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 44,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 45,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 46,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 47,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 48,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 49,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 50,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}]
diff --git a/integration_tests/data/088.placer.oracle.outputs.json b/integration_tests/data/088.placer.oracle.outputs.json
new file mode 100644
index 000000000..79cdce6e8
--- /dev/null
+++ b/integration_tests/data/088.placer.oracle.outputs.json
@@ -0,0 +1,2425 @@
+﻿[
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.086,
+                "direction_z": 0.996,
+                "distance": 8.532,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 0,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.281,
+                "direction_z": 0.96,
+                "distance": 8.857,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "held"
+                ],
+                "texture_color_list": [
+                    "magenta"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 6
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.701,
+                "direction_z": 0.713,
+                "distance": 8.551,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": false
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 1,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.879,
+                "direction_z": 0.477,
+                "distance": 12.791,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "held"
+                ],
+                "texture_color_list": [
+                    "magenta",
+                    "purple"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.685,
+                "direction_z": 0.728,
+                "distance": 8.378,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": false
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 2,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.874,
+                "direction_z": 0.485,
+                "distance": 12.572,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "held"
+                ],
+                "texture_color_list": [
+                    "magenta",
+                    "purple"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.669,
+                "direction_z": 0.743,
+                "distance": 8.209,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": false
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 3,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.87,
+                "direction_z": 0.494,
+                "distance": 12.354,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "held"
+                ],
+                "texture_color_list": [
+                    "magenta",
+                    "purple"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.652,
+                "direction_z": 0.758,
+                "distance": 8.044,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": false
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 4,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.865,
+                "direction_z": 0.503,
+                "distance": 12.137,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "held"
+                ],
+                "texture_color_list": [
+                    "magenta",
+                    "purple"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.633,
+                "direction_z": 0.774,
+                "distance": 7.883,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": false
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 5,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.859,
+                "direction_z": 0.512,
+                "distance": 11.922,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "held"
+                ],
+                "texture_color_list": [
+                    "magenta",
+                    "purple"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.614,
+                "direction_z": 0.789,
+                "distance": 7.727,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": false
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 6,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.854,
+                "direction_z": 0.521,
+                "distance": 11.708,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "held"
+                ],
+                "texture_color_list": [
+                    "magenta",
+                    "purple"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.593,
+                "direction_z": 0.805,
+                "distance": 7.576,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": false
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 7,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.848,
+                "direction_z": 0.531,
+                "distance": 11.495,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "held"
+                ],
+                "texture_color_list": [
+                    "magenta",
+                    "purple"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.571,
+                "direction_z": 0.821,
+                "distance": 7.431,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": false
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 8,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.841,
+                "direction_z": 0.541,
+                "distance": 11.284,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "held"
+                ],
+                "texture_color_list": [
+                    "magenta",
+                    "purple"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.548,
+                "direction_z": 0.837,
+                "distance": 7.291,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": false
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 9,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.835,
+                "direction_z": 0.551,
+                "distance": 11.074,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "held"
+                ],
+                "texture_color_list": [
+                    "magenta",
+                    "purple"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.523,
+                "direction_z": 0.852,
+                "distance": 7.157,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": false
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 10,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.828,
+                "direction_z": 0.561,
+                "distance": 10.867,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "held"
+                ],
+                "texture_color_list": [
+                    "magenta",
+                    "purple"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.497,
+                "direction_z": 0.868,
+                "distance": 7.029,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": false
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 11,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.82,
+                "direction_z": 0.572,
+                "distance": 10.661,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "held"
+                ],
+                "texture_color_list": [
+                    "magenta",
+                    "purple"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.469,
+                "direction_z": 0.883,
+                "distance": 6.908,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": false
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 12,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.812,
+                "direction_z": 0.583,
+                "distance": 10.457,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "held"
+                ],
+                "texture_color_list": [
+                    "magenta",
+                    "purple"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.44,
+                "direction_z": 0.898,
+                "distance": 6.795,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": false
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 13,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.804,
+                "direction_z": 0.595,
+                "distance": 10.255,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "held"
+                ],
+                "texture_color_list": [
+                    "magenta",
+                    "purple"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.41,
+                "direction_z": 0.912,
+                "distance": 6.688,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": false
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 14,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.795,
+                "direction_z": 0.607,
+                "distance": 10.055,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "held"
+                ],
+                "texture_color_list": [
+                    "magenta",
+                    "purple"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.378,
+                "direction_z": 0.926,
+                "distance": 6.59,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 15,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.786,
+                "direction_z": 0.619,
+                "distance": 9.857,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "held"
+                ],
+                "texture_color_list": [
+                    "magenta",
+                    "purple"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.345,
+                "direction_z": 0.939,
+                "distance": 6.499,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 16,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.776,
+                "direction_z": 0.631,
+                "distance": 9.662,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "held"
+                ],
+                "texture_color_list": [
+                    "magenta",
+                    "purple"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.311,
+                "direction_z": 0.951,
+                "distance": 6.417,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 17,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.765,
+                "direction_z": 0.644,
+                "distance": 9.469,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "held"
+                ],
+                "texture_color_list": [
+                    "magenta",
+                    "purple"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.275,
+                "direction_z": 0.962,
+                "distance": 6.344,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 18,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.754,
+                "direction_z": 0.657,
+                "distance": 9.28,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "held"
+                ],
+                "texture_color_list": [
+                    "magenta",
+                    "purple"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.238,
+                "direction_z": 0.971,
+                "distance": 6.28,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 19,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.742,
+                "direction_z": 0.671,
+                "distance": 9.093,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "held"
+                ],
+                "texture_color_list": [
+                    "magenta",
+                    "purple"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.2,
+                "direction_z": 0.98,
+                "distance": 6.225,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 20,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.729,
+                "direction_z": 0.685,
+                "distance": 8.909,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "held"
+                ],
+                "texture_color_list": [
+                    "magenta",
+                    "purple"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.161,
+                "direction_z": 0.987,
+                "distance": 6.18,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 21,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.715,
+                "direction_z": 0.699,
+                "distance": 8.728,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "held"
+                ],
+                "texture_color_list": [
+                    "magenta",
+                    "purple"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.161,
+                "direction_z": 0.987,
+                "distance": 6.18,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 22,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.715,
+                "direction_z": 0.699,
+                "distance": 8.728,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "held"
+                ],
+                "texture_color_list": [
+                    "magenta",
+                    "purple"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.161,
+                "direction_z": 0.987,
+                "distance": 6.18,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 23,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.715,
+                "direction_z": 0.699,
+                "distance": 8.728,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "held"
+                ],
+                "texture_color_list": [
+                    "magenta",
+                    "purple"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.158,
+                "direction_z": 0.987,
+                "distance": 6.178,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 24,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.715,
+                "direction_z": 0.699,
+                "distance": 8.728,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "released"
+                ],
+                "texture_color_list": [
+                    "cyan",
+                    "blue",
+                    "green"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.152,
+                "direction_z": 0.988,
+                "distance": 6.172,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 25,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.715,
+                "direction_z": 0.699,
+                "distance": 8.728,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "released"
+                ],
+                "texture_color_list": [
+                    "cyan",
+                    "blue",
+                    "green"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.142,
+                "direction_z": 0.99,
+                "distance": 6.162,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 26,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.715,
+                "direction_z": 0.699,
+                "distance": 8.728,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "released"
+                ],
+                "texture_color_list": [
+                    "cyan",
+                    "blue",
+                    "green"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.128,
+                "direction_z": 0.992,
+                "distance": 6.151,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 27,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.729,
+                "direction_z": 0.685,
+                "distance": 8.909,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "released"
+                ],
+                "texture_color_list": [
+                    "cyan",
+                    "blue",
+                    "green"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.11,
+                "direction_z": 0.994,
+                "distance": 6.137,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 28,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.742,
+                "direction_z": 0.671,
+                "distance": 9.093,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "released"
+                ],
+                "texture_color_list": [
+                    "cyan",
+                    "blue",
+                    "green"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.088,
+                "direction_z": 0.996,
+                "distance": 6.124,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 29,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.754,
+                "direction_z": 0.657,
+                "distance": 9.28,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "released"
+                ],
+                "texture_color_list": [
+                    "cyan",
+                    "blue",
+                    "green"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.061,
+                "direction_z": 0.998,
+                "distance": 6.112,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 30,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.765,
+                "direction_z": 0.644,
+                "distance": 9.469,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "released"
+                ],
+                "texture_color_list": [
+                    "cyan",
+                    "blue",
+                    "green"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.031,
+                "direction_z": 1.0,
+                "distance": 6.103,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 31,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.776,
+                "direction_z": 0.631,
+                "distance": 9.662,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "released"
+                ],
+                "texture_color_list": [
+                    "cyan",
+                    "blue",
+                    "green"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": -0.004,
+                "direction_z": 1.0,
+                "distance": 6.1,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 32,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.786,
+                "direction_z": 0.619,
+                "distance": 9.857,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "released"
+                ],
+                "texture_color_list": [
+                    "cyan",
+                    "blue",
+                    "green"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": -0.042,
+                "direction_z": 0.999,
+                "distance": 6.105,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 33,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.795,
+                "direction_z": 0.607,
+                "distance": 10.055,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "released"
+                ],
+                "texture_color_list": [
+                    "cyan",
+                    "blue",
+                    "green"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": -0.085,
+                "direction_z": 0.996,
+                "distance": 6.122,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 34,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.804,
+                "direction_z": 0.595,
+                "distance": 10.255,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "released"
+                ],
+                "texture_color_list": [
+                    "cyan",
+                    "blue",
+                    "green"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": -0.069,
+                "direction_z": 0.998,
+                "distance": 6.115,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 35,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.812,
+                "direction_z": 0.583,
+                "distance": 10.457,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "released"
+                ],
+                "texture_color_list": [
+                    "cyan",
+                    "blue",
+                    "green"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": -0.058,
+                "direction_z": 0.998,
+                "distance": 6.11,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 36,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.82,
+                "direction_z": 0.572,
+                "distance": 10.661,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "released"
+                ],
+                "texture_color_list": [
+                    "cyan",
+                    "blue",
+                    "green"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": -0.051,
+                "direction_z": 0.999,
+                "distance": 6.108,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 37,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.828,
+                "direction_z": 0.561,
+                "distance": 10.867,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "released"
+                ],
+                "texture_color_list": [
+                    "cyan",
+                    "blue",
+                    "green"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": -0.048,
+                "direction_z": 0.999,
+                "distance": 6.107,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 38,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.835,
+                "direction_z": 0.551,
+                "distance": 11.074,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "released"
+                ],
+                "texture_color_list": [
+                    "cyan",
+                    "blue",
+                    "green"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": -0.049,
+                "direction_z": 0.999,
+                "distance": 6.107,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 39,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.841,
+                "direction_z": 0.541,
+                "distance": 11.284,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "released"
+                ],
+                "texture_color_list": [
+                    "cyan",
+                    "blue",
+                    "green"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": -0.053,
+                "direction_z": 0.999,
+                "distance": 6.109,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 40,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.848,
+                "direction_z": 0.531,
+                "distance": 11.495,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "released"
+                ],
+                "texture_color_list": [
+                    "cyan",
+                    "blue",
+                    "green"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": -0.062,
+                "direction_z": 0.998,
+                "distance": 6.112,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 41,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.854,
+                "direction_z": 0.521,
+                "distance": 11.708,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "released"
+                ],
+                "texture_color_list": [
+                    "cyan",
+                    "blue",
+                    "green"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": -0.075,
+                "direction_z": 0.997,
+                "distance": 6.117,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 42,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.859,
+                "direction_z": 0.512,
+                "distance": 11.922,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "released"
+                ],
+                "texture_color_list": [
+                    "cyan",
+                    "blue",
+                    "green"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": -0.078,
+                "direction_z": 0.996,
+                "distance": 6.119,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 43,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.865,
+                "direction_z": 0.503,
+                "distance": 12.137,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "released"
+                ],
+                "texture_color_list": [
+                    "cyan",
+                    "blue",
+                    "green"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": -0.076,
+                "direction_z": 0.997,
+                "distance": 6.118,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 44,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.87,
+                "direction_z": 0.494,
+                "distance": 12.354,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "released"
+                ],
+                "texture_color_list": [
+                    "cyan",
+                    "blue",
+                    "green"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": -0.077,
+                "direction_z": 0.997,
+                "distance": 6.118,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 45,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.874,
+                "direction_z": 0.485,
+                "distance": 12.572,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "released"
+                ],
+                "texture_color_list": [
+                    "cyan",
+                    "blue",
+                    "green"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": -0.083,
+                "direction_z": 0.996,
+                "distance": 6.121,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 46,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.879,
+                "direction_z": 0.477,
+                "distance": 12.791,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "released"
+                ],
+                "texture_color_list": [
+                    "cyan",
+                    "blue",
+                    "green"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": -0.084,
+                "direction_z": 0.996,
+                "distance": 6.121,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 47,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.883,
+                "direction_z": 0.469,
+                "distance": 13.011,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "released"
+                ],
+                "texture_color_list": [
+                    "cyan",
+                    "blue",
+                    "green"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": -0.084,
+                "direction_z": 0.996,
+                "distance": 6.121,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 48,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.887,
+                "direction_z": 0.461,
+                "distance": 13.233,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "released"
+                ],
+                "texture_color_list": [
+                    "cyan",
+                    "blue",
+                    "green"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": -0.084,
+                "direction_z": 0.996,
+                "distance": 6.121,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 49,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.887,
+                "direction_z": 0.461,
+                "distance": 13.233,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "released"
+                ],
+                "texture_color_list": [
+                    "cyan",
+                    "blue",
+                    "green"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": -0.084,
+                "direction_z": 0.996,
+                "distance": 6.121,
+                "id": "target_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 50,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.887,
+                "direction_z": 0.461,
+                "distance": 13.233,
+                "id": "placer_object",
+                "position_x": 0.0,
+                "position_z": 1.6,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "state_list": [
+                    "released"
+                ],
+                "texture_color_list": [
+                    "cyan",
+                    "blue",
+                    "green"
+                ],
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 7
+    }
+]
\ No newline at end of file
diff --git a/integration_tests/data/088.placer.scene.json b/integration_tests/data/088.placer.scene.json
new file mode 100644
index 000000000..bfaa9afe2
--- /dev/null
+++ b/integration_tests/data/088.placer.scene.json
@@ -0,0 +1,125 @@
+﻿{
+    "name": "validate scripted placer movement and placing",
+    "version": 2,
+    "ceilingMaterial": "AI2-THOR/Materials/Walls/Drywall",
+    "floorMaterial": "AI2-THOR/Materials/Fabrics/CarpetWhite 3",
+    "wallMaterial": "AI2-THOR/Materials/Walls/Drywall",
+    "performerStart": {
+        "position": {
+            "x": 0,
+            "z": -4.5
+        },
+        "rotation": {
+            "x": 0,
+            "y": 0
+        }
+    },
+    "roomDimensions": {
+        "x": 10,
+        "y": 10,
+        "z": 10
+    },
+    "objects": [{
+      "id": "target_object",
+      "type": "cube",
+      "mass": 5,
+      "moveable": true,
+      "shows": [
+        {
+          "position": {
+            "x": 0,
+            "y": 7.005,
+            "z": 1.6
+          },
+          "rotation": {
+            "x": 0,
+            "y": 0,
+            "z": 0
+          },
+          "stepBegin": 1,
+          "scale": {
+            "x": 0.5,
+            "y": 0.5,
+            "z": 0.5
+          }
+        }
+      ],
+      "materials": ["UnityAssetStore/Kindergarten_Interior/Models/Materials/color wood 4"],
+      "moves": [
+        {
+          "stepBegin": 1,
+          "stepEnd": 21,
+          "vector": {
+            "x": 0,
+            "y": -0.25,
+            "z": 0
+          }
+        }
+      ],
+      "kinematic": true,
+      "togglePhysics": [
+        {
+          "stepBegin": 24
+        }
+      ]
+    },
+    {
+      "id": "placer_object",
+      "type": "cylinder",
+      "kinematic": true,
+      "structure": true,
+      "mass": 50,
+      "materials": ["Custom/Materials/Magenta"],
+      "shows": [
+        {
+          "stepBegin": 1,
+          "position": {
+            "x": 0,
+            "y": 12.255,
+            "z": 1.6
+          },
+          "scale": {
+            "x": 0.2,
+            "y": 5,
+            "z": 0.2
+          }
+        }
+      ],
+      "moves": [
+        {
+          "stepBegin": 1,
+          "stepEnd": 21,
+          "vector": {
+            "x": 0,
+            "y": -0.25,
+            "z": 0
+          }
+        },
+        {
+          "stepBegin": 27,
+          "stepEnd": 48,
+          "vector": {
+            "x": 0,
+            "y": 0.25,
+            "z": 0
+          }
+        }
+      ],
+      "states": [
+          ["held"],["held"],["held"],["held"],["held"],["held"],["held"],["held"],["held"],["held"],
+          ["held"],["held"],["held"],["held"],["held"],["held"],["held"],["held"],["held"],["held"],
+          ["held"],["held"],["held"],["held"],["released"],["released"],["released"],["released"],["released"],["released"],
+          ["released"],["released"],["released"],["released"],["released"],["released"],["released"],["released"],["released"],["released"],
+          ["released"],["released"],["released"],["released"],["released"],["released"],["released"],["released"],["released"],["released"],
+          ["released"]
+      ],
+      "changeMaterials": [
+        {
+          "stepBegin": 24,
+          "materials": [
+            "Custom/Materials/Cyan"
+          ]
+        }
+      ]
+    }]
+}
diff --git a/integration_tests/data/089.moving_rotating_occluder_with_repeat.actions.txt b/integration_tests/data/089.moving_rotating_occluder_with_repeat.actions.txt
new file mode 100644
index 000000000..c2295f7d5
--- /dev/null
+++ b/integration_tests/data/089.moving_rotating_occluder_with_repeat.actions.txt
@@ -0,0 +1,25 @@
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
diff --git a/integration_tests/data/089.moving_rotating_occluder_with_repeat.level1.outputs.json b/integration_tests/data/089.moving_rotating_occluder_with_repeat.level1.outputs.json
new file mode 100644
index 000000000..4716ede38
--- /dev/null
+++ b/integration_tests/data/089.moving_rotating_occluder_with_repeat.level1.outputs.json
@@ -0,0 +1,235 @@
+[{
+    "step_number": 0,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 1,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 2,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 3,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 4,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 5,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 6,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 7,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 8,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 9,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 10,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 11,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 12,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 13,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 14,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 15,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 16,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 17,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 18,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 19,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 20,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 21,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 22,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 23,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 24,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 25,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}]
diff --git a/integration_tests/data/089.moving_rotating_occluder_with_repeat.level2.outputs.json b/integration_tests/data/089.moving_rotating_occluder_with_repeat.level2.outputs.json
new file mode 100644
index 000000000..4716ede38
--- /dev/null
+++ b/integration_tests/data/089.moving_rotating_occluder_with_repeat.level2.outputs.json
@@ -0,0 +1,235 @@
+[{
+    "step_number": 0,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 1,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 2,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 3,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 4,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 5,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 6,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 7,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 8,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 9,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 10,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 11,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 12,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 13,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 14,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 15,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 16,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 17,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 18,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 19,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 20,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 21,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 22,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 23,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 24,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 25,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}]
diff --git a/integration_tests/data/089.moving_rotating_occluder_with_repeat.oracle.outputs.json b/integration_tests/data/089.moving_rotating_occluder_with_repeat.oracle.outputs.json
new file mode 100644
index 000000000..f4fc607d9
--- /dev/null
+++ b/integration_tests/data/089.moving_rotating_occluder_with_repeat.oracle.outputs.json
@@ -0,0 +1,990 @@
+﻿[
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 0,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.086,
+                "direction_z": 0.996,
+                "distance": 8.532,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.281,
+                "direction_z": 0.96,
+                "distance": 8.857,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 1,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.115,
+                "direction_z": 0.993,
+                "distance": 8.557,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 330,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.307,
+                "direction_z": 0.952,
+                "distance": 8.93,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 2,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.144,
+                "direction_z": 0.99,
+                "distance": 8.59,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 300,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.332,
+                "direction_z": 0.943,
+                "distance": 9.01,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 3,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.172,
+                "direction_z": 0.985,
+                "distance": 8.629,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 270,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.356,
+                "direction_z": 0.934,
+                "distance": 9.096,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 4,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.2,
+                "direction_z": 0.98,
+                "distance": 8.676,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 270,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.38,
+                "direction_z": 0.925,
+                "distance": 9.188,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 5,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.228,
+                "direction_z": 0.974,
+                "distance": 8.729,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 270,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.403,
+                "direction_z": 0.915,
+                "distance": 9.286,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 6,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.255,
+                "direction_z": 0.967,
+                "distance": 8.79,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 270,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.425,
+                "direction_z": 0.905,
+                "distance": 9.389,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 7,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.228,
+                "direction_z": 0.974,
+                "distance": 8.729,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 270,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.403,
+                "direction_z": 0.915,
+                "distance": 9.286,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 8,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.2,
+                "direction_z": 0.98,
+                "distance": 8.676,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 270,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.38,
+                "direction_z": 0.925,
+                "distance": 9.188,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 9,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.172,
+                "direction_z": 0.985,
+                "distance": 8.629,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 270,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.356,
+                "direction_z": 0.934,
+                "distance": 9.096,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 10,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.144,
+                "direction_z": 0.99,
+                "distance": 8.59,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 300,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.332,
+                "direction_z": 0.943,
+                "distance": 9.01,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 11,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.115,
+                "direction_z": 0.993,
+                "distance": 8.557,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 330,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.307,
+                "direction_z": 0.952,
+                "distance": 8.93,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 12,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.086,
+                "direction_z": 0.996,
+                "distance": 8.532,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.281,
+                "direction_z": 0.96,
+                "distance": 8.857,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 13,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.115,
+                "direction_z": 0.993,
+                "distance": 8.557,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 330,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.307,
+                "direction_z": 0.952,
+                "distance": 8.93,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 14,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.144,
+                "direction_z": 0.99,
+                "distance": 8.59,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 300,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.332,
+                "direction_z": 0.943,
+                "distance": 9.01,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 15,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.172,
+                "direction_z": 0.985,
+                "distance": 8.629,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 270,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.356,
+                "direction_z": 0.934,
+                "distance": 9.096,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 16,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.2,
+                "direction_z": 0.98,
+                "distance": 8.676,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 270,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.38,
+                "direction_z": 0.925,
+                "distance": 9.188,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 17,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.228,
+                "direction_z": 0.974,
+                "distance": 8.729,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 270,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.403,
+                "direction_z": 0.915,
+                "distance": 9.286,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 18,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.255,
+                "direction_z": 0.967,
+                "distance": 8.79,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 270,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.425,
+                "direction_z": 0.905,
+                "distance": 9.389,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 19,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.228,
+                "direction_z": 0.974,
+                "distance": 8.729,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 270,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.403,
+                "direction_z": 0.915,
+                "distance": 9.286,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 20,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.2,
+                "direction_z": 0.98,
+                "distance": 8.676,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 270,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.38,
+                "direction_z": 0.925,
+                "distance": 9.188,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 21,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.172,
+                "direction_z": 0.985,
+                "distance": 8.629,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 270,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.356,
+                "direction_z": 0.934,
+                "distance": 9.096,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 22,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.144,
+                "direction_z": 0.99,
+                "distance": 8.59,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 300,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.332,
+                "direction_z": 0.943,
+                "distance": 9.01,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 23,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.115,
+                "direction_z": 0.993,
+                "distance": 8.557,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 330,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.307,
+                "direction_z": 0.952,
+                "distance": 8.93,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 24,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.086,
+                "direction_z": 0.996,
+                "distance": 8.532,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.281,
+                "direction_z": 0.96,
+                "distance": 8.857,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    },
+    {
+        "head_tilt": 0,
+        "objects_count": 0,
+        "position_x": 0.0,
+        "position_z": -4.5,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 25,
+        "structural_objects": [
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.115,
+                "direction_z": 0.993,
+                "distance": 8.557,
+                "id": "occluder_wall_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 330,
+                "rotation_z": 0.0,
+                "visible": true
+            },
+            {
+                "direction_x": 0.0,
+                "direction_y": 0.307,
+                "direction_z": 0.952,
+                "distance": 8.93,
+                "id": "occluder_pole_1",
+                "position_x": 0.0,
+                "position_z": 4.0,
+                "rotation_x": 0.0,
+                "rotation_y": 0.0,
+                "rotation_z": 0.0,
+                "visible": true
+            }
+        ],
+        "structural_objects_count": 8
+    }
+]
diff --git a/integration_tests/data/089.moving_rotating_occluder_with_repeat.scene.json b/integration_tests/data/089.moving_rotating_occluder_with_repeat.scene.json
new file mode 100644
index 000000000..0d7916e96
--- /dev/null
+++ b/integration_tests/data/089.moving_rotating_occluder_with_repeat.scene.json
@@ -0,0 +1,139 @@
+﻿{
+    "name": "validate scripted occluder movement and rotation with infinite repeat interval",
+    "version": 2,
+    "ceilingMaterial": "AI2-THOR/Materials/Walls/Drywall",
+    "floorMaterial": "AI2-THOR/Materials/Fabrics/CarpetWhite 3",
+    "wallMaterial": "AI2-THOR/Materials/Walls/Drywall",
+    "performerStart": {
+        "position": {
+            "x": 0,
+            "z": -4.5
+        },
+        "rotation": {
+            "x": 0,
+            "y": 0
+        }
+    },
+    "roomDimensions": {
+        "x": 10,
+        "y": 5,
+        "z": 10
+    },
+    "objects": [{
+      "id": "occluder_wall_1",
+      "type": "cube",
+      "kinematic": true,
+      "structure": true,
+      "mass": 100,
+      "materials": ["AI2-THOR/Materials/Walls/DrywallOrange"],
+      "shows": [
+        {
+          "stepBegin": 0,
+          "position": {
+            "x": 0,
+            "y": 1.5,
+            "z": 4
+          },
+          "scale": {
+            "x": 1,
+            "y": 3,
+            "z": 0.1
+          }
+        }
+      ],
+      "moves": [
+        {
+          "stepBegin": 1,
+          "stepEnd": 6,
+          "repeat": true,
+          "stepWait": 7,
+          "vector": {
+            "x": 0,
+            "y": 0.25,
+            "z": 0
+          }
+        },
+        {
+          "stepBegin": 7,
+          "stepEnd": 12,
+          "repeat": true,
+          "stepWait": 7,
+          "vector": {
+            "x": 0,
+            "y": -0.25,
+            "z": 0
+          }
+        }
+      ],
+      "rotates": [
+        {
+          "stepBegin": 1,
+          "stepEnd": 3,
+          "repeat": true,
+          "stepWait": 10,
+          "vector": {
+            "x": 0,
+            "y": -30,
+            "z": 0
+          }
+        },
+        {
+          "stepBegin": 10,
+          "stepEnd": 12,
+          "repeat": true,
+          "stepWait": 10,
+          "vector": {
+            "x": 0,
+            "y": 30,
+            "z": 0
+          }
+        }
+      ]
+    }, {
+      "id": "occluder_pole_1",
+      "type": "cylinder",
+      "kinematic": true,
+      "structure": true,
+      "mass": 100,
+      "materials": ["AI2-THOR/Materials/Metals/Metal"],
+      "shows": [
+        {
+          "stepBegin": 0,
+          "position": {
+            "x": 0,
+            "y": 3.25,
+            "z": 4
+          },
+          "scale": {
+            "x": 0.095,
+            "y": 2,
+            "z": 0.095
+          }
+        }
+      ],
+      "moves": [
+        {
+          "stepBegin": 1,
+          "stepEnd": 6,
+          "repeat": true,
+          "stepWait": 7,
+          "vector": {
+            "x": 0,
+            "y": 0.25,
+            "z": 0
+          }
+        },
+        {
+          "stepBegin": 7,
+          "stepEnd": 12,
+          "repeat": true,
+          "stepWait": 7,
+          "vector": {
+            "x": 0,
+            "y": -0.25,
+            "z": 0
+          }
+        }
+      ]
+    }]
+}
diff --git a/integration_tests/data/090.multiple_scripted_forces_with_repeat.actions.txt b/integration_tests/data/090.multiple_scripted_forces_with_repeat.actions.txt
new file mode 100644
index 000000000..8ccd452df
--- /dev/null
+++ b/integration_tests/data/090.multiple_scripted_forces_with_repeat.actions.txt
@@ -0,0 +1,20 @@
+﻿Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
+Pass
diff --git a/integration_tests/data/090.multiple_scripted_forces_with_repeat.level1.outputs.json b/integration_tests/data/090.multiple_scripted_forces_with_repeat.level1.outputs.json
new file mode 100644
index 000000000..7cf808f56
--- /dev/null
+++ b/integration_tests/data/090.multiple_scripted_forces_with_repeat.level1.outputs.json
@@ -0,0 +1,190 @@
+[{
+    "step_number": 0,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 1,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 2,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 3,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 4,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 5,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 6,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 7,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 8,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 9,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 10,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 11,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 12,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 13,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 14,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 15,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 16,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 17,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 18,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 19,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 20,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}]
diff --git a/integration_tests/data/090.multiple_scripted_forces_with_repeat.level2.outputs.json b/integration_tests/data/090.multiple_scripted_forces_with_repeat.level2.outputs.json
new file mode 100644
index 000000000..7cf808f56
--- /dev/null
+++ b/integration_tests/data/090.multiple_scripted_forces_with_repeat.level2.outputs.json
@@ -0,0 +1,190 @@
+[{
+    "step_number": 0,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 1,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 2,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 3,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 4,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 5,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 6,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 7,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 8,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 9,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 10,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 11,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 12,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 13,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 14,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 15,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 16,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 17,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 18,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 19,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}, {
+    "step_number": 20,
+    "head_tilt": 0,
+    "position_x": null,
+    "position_z": null,
+    "return_status": "SUCCESSFUL",
+    "rotation_y": null,
+    "objects_count": 0,
+    "structural_objects_count": 0
+}]
diff --git a/integration_tests/data/090.multiple_scripted_forces_with_repeat.oracle.outputs.json b/integration_tests/data/090.multiple_scripted_forces_with_repeat.oracle.outputs.json
new file mode 100644
index 000000000..6632c7138
--- /dev/null
+++ b/integration_tests/data/090.multiple_scripted_forces_with_repeat.oracle.outputs.json
@@ -0,0 +1,380 @@
+﻿[
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "id": "testBall",
+                "position_x": 0.0,
+                "position_z": 1.606,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": 0.0,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 0,
+        "structural_objects_count": 6
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "id": "testBall",
+                "position_x": 0.0,
+                "position_z": 1.223,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": 0.0,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 1,
+        "structural_objects_count": 6
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "id": "testBall",
+                "position_x": 0.0,
+                "position_z": 1.438,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": 0.0,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 2,
+        "structural_objects_count": 6
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "id": "testBall",
+                "position_x": 0.0,
+                "position_z": 1.642,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": 0.0,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 3,
+        "structural_objects_count": 6
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "id": "testBall",
+                "position_x": 0.0,
+                "position_z": 1.448,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": 0.0,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 4,
+        "structural_objects_count": 6
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "id": "testBall",
+                "position_x": 0.0,
+                "position_z": 1.265,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": 0.0,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 5,
+        "structural_objects_count": 6
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "id": "testBall",
+                "position_x": 0.0,
+                "position_z": 1.479,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": 0.0,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 6,
+        "structural_objects_count": 6
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "id": "testBall",
+                "position_x": 0.0,
+                "position_z": 1.683,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": 0.0,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 7,
+        "structural_objects_count": 6
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "id": "testBall",
+                "position_x": 0.0,
+                "position_z": 1.49,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": 0.0,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 8,
+        "structural_objects_count": 6
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "id": "testBall",
+                "position_x": 0.0,
+                "position_z": 1.306,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": 0.0,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 9,
+        "structural_objects_count": 6
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "id": "testBall",
+                "position_x": 0.0,
+                "position_z": 1.521,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": 0.0,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 10,
+        "structural_objects_count": 6
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "id": "testBall",
+                "position_x": 0.0,
+                "position_z": 1.725,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": 0.0,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 11,
+        "structural_objects_count": 6
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "id": "testBall",
+                "position_x": 0.0,
+                "position_z": 1.531,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": 0.0,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 12,
+        "structural_objects_count": 6
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "id": "testBall",
+                "position_x": 0.0,
+                "position_z": 1.348,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": 0.0,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 13,
+        "structural_objects_count": 6
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "id": "testBall",
+                "position_x": 0.0,
+                "position_z": 1.563,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": 0.0,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 14,
+        "structural_objects_count": 6
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "id": "testBall",
+                "position_x": 0.0,
+                "position_z": 1.767,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": 0.0,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 15,
+        "structural_objects_count": 6
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "id": "testBall",
+                "position_x": 0.0,
+                "position_z": 1.573,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": 0.0,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 16,
+        "structural_objects_count": 6
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "id": "testBall",
+                "position_x": 0.0,
+                "position_z": 1.39,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": 0.0,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 17,
+        "structural_objects_count": 6
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "id": "testBall",
+                "position_x": 0.0,
+                "position_z": 1.604,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": 0.0,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 18,
+        "structural_objects_count": 6
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "id": "testBall",
+                "position_x": 0.0,
+                "position_z": 1.808,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": 0.0,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 19,
+        "structural_objects_count": 6
+    },
+    {
+        "head_tilt": 0,
+        "objects": [
+            {
+                "id": "testBall",
+                "position_x": 0.0,
+                "position_z": 1.615,
+                "visible": true
+            }
+        ],
+        "objects_count": 1,
+        "position_x": 0.0,
+        "position_z": 0.0,
+        "return_status": "SUCCESSFUL",
+        "rotation_y": 0.0,
+        "step_number": 20,
+        "structural_objects_count": 6
+    }
+]
\ No newline at end of file
diff --git a/integration_tests/data/090.multiple_scripted_forces_with_repeat.scene.json b/integration_tests/data/090.multiple_scripted_forces_with_repeat.scene.json
new file mode 100644
index 000000000..16cb54702
--- /dev/null
+++ b/integration_tests/data/090.multiple_scripted_forces_with_repeat.scene.json
@@ -0,0 +1,67 @@
+﻿{
+    "name": "validate multiple scripted forces with repeat",
+    "version": 2,
+    "ceilingMaterial": "AI2-THOR/Materials/Walls/Drywall",
+    "floorMaterial": "AI2-THOR/Materials/Fabrics/CarpetWhite 3",
+    "wallMaterial": "AI2-THOR/Materials/Walls/Drywall",
+    "performerStart": {
+        "position": {
+            "x": 0,
+            "z": 0
+        },
+        "rotation": {
+            "x": 0,
+            "y": 0
+        }
+    },
+    "objects": [{
+        "id": "testBall",
+        "type": "ball",
+        "mass": 1,
+        "materials": ["AI2-THOR/Materials/Plastics/BlueRubber"],
+        "salientMaterials": ["rubber"],
+        "pickupable": true,
+        "shows": [{
+            "stepBegin": 0,
+            "position": {
+                "x": 0,
+                "y": 0.25,
+                "z": 2
+            },
+            "scale": {
+                "x": 0.5,
+                "y": 0.5,
+                "z": 0.5
+            }
+        }],
+        "forces": [{
+            "stepBegin": 2,
+            "stepEnd": 2,
+            "vector": {
+                "x": 0,
+                "y": 0,
+                "z": 400
+            }
+        }, {
+            "stepBegin": 4,
+            "stepEnd": 4,
+            "repeat": true,
+            "stepWait": 4,
+            "vector": {
+                "x": 0,
+                "y": 0,
+                "z": -800
+            }
+        }, {
+            "stepBegin": 6,
+            "stepEnd": 6,
+            "repeat": true,
+            "stepWait": 4,
+            "vector": {
+                "x": 0,
+                "y": 0,
+                "z": 800
+            }
+        }]
+    }]
+}
diff --git a/integration_tests/run_handmade_tests.py b/integration_tests/run_handmade_tests.py
index d60b0cda1..79111c04b 100644
--- a/integration_tests/run_handmade_tests.py
+++ b/integration_tests/run_handmade_tests.py
@@ -296,9 +296,9 @@ def start_handmade_tests(
             controller = mcs.create_controller(
                 unity_app_file_path=mcs_unity_build,
                 unity_cache_version=unity_version,
-                config_file_path=config_filename)
+                config_file_or_dict=config_filename)
         else:
-            mcs.change_config(controller, config_file_path=config_filename)
+            mcs.change_config(controller, config_file_or_dict=config_filename)
         # Run each test scene and record if it failed validation.
         for scene_filename in scene_filename_list:
             if (
diff --git a/tests/mock_controller.py b/tests/mock_controller.py
index 64bd9f600..d6ea33f11 100644
--- a/tests/mock_controller.py
+++ b/tests/mock_controller.py
@@ -56,9 +56,9 @@ def step(self, data):
         event.instance_segmentation_frame = MOCK_VARIABLES[
             'instance_segmentation_frame'
         ].copy()
-        output = ai2thor.server.MultiAgentEvent(
-            0, [event for _ in range(0, MOCK_VARIABLES['event_count'])])
-        return output
+        return ai2thor.server.MultiAgentEvent(
+            0, [event for _ in range(MOCK_VARIABLES['event_count'])]
+        )
 
     def get_last_step_data(self):
         return self.__last_step_data
@@ -92,22 +92,11 @@ def __init__(self):
         if(check_config_path is not None):
             os.environ.pop(ConfigManager.CONFIG_FILE_ENV_VAR)
 
-        check_metadata_tier = os.getenv(
-            ConfigManager.METADATA_ENV_VAR, None)
-
-        if(check_metadata_tier is not None):
-            os.environ.pop(ConfigManager.METADATA_ENV_VAR)
-
-        check_debug_mode = os.getenv('MCS_DEBUG_MODE', None)
-
-        if(check_debug_mode is not None):
-            os.environ.pop('MCS_DEBUG_MODE')
-
         self._subscribers = []
 
         self._end_scene_not_registered = False  # atexit not needed for tests
         self._controller = MockController()
-        self._config = ConfigManager()
+        self._config = ConfigManager(config_file_or_dict={})
         self._config._config[
             ConfigManager.CONFIG_DEFAULT_SECTION
         ] = {}
diff --git a/tests/test_config_manager.py b/tests/test_config_manager.py
index 419630996..8de0b9a24 100644
--- a/tests/test_config_manager.py
+++ b/tests/test_config_manager.py
@@ -1,11 +1,11 @@
 import os
 import unittest
-from unittest.mock import patch
+from unittest.mock import DEFAULT, patch
 
 from machine_common_sense.config_manager import (ChangeMaterialConfig,
                                                  ConfigManager, ForceConfig,
-                                                 GoalSchema, MoveConfig,
-                                                 OpenCloseConfig,
+                                                 GoalSchema, MetadataTier,
+                                                 MoveConfig, OpenCloseConfig,
                                                  PhysicsConfig,
                                                  SceneConfiguration,
                                                  SceneObjectSchema, ShowConfig,
@@ -23,34 +23,117 @@ def mock_env(**env_vars):
     @classmethod
     @mock_env()
     def setUpClass(cls):
-        cls.config_mngr = ConfigManager(None)
+        cls.config_mngr = ConfigManager(config_file_or_dict={})
         cls.config_mngr._config[
             cls.config_mngr.CONFIG_DEFAULT_SECTION
         ] = {}
 
-    @classmethod
+    @ classmethod
     def tearDownClass(cls):
         pass
 
     def test_init(self):
-        self.assertEqual(
-            self.config_mngr._config_file,
-            self.config_mngr.DEFAULT_CONFIG_FILE)
+        self.assertIsNotNone(self.config_mngr._config)
 
-    @mock_env()
-    def test_init_with_arg(self):
+    @ mock_env()
+    @ patch.multiple(ConfigManager, _read_in_config_dict=DEFAULT,
+                     _read_in_config_file=DEFAULT)
+    def test_init_with_arg(self, _read_in_config_dict, _read_in_config_file):
         file_path = './arg-test.ini'
-        config_mngr = ConfigManager(file_path)
+        _ = ConfigManager(file_path)
+
+        _read_in_config_file.assert_called_once_with(file_path)
+        _read_in_config_dict.assert_not_called()
+
+    @ mock_env(MCS_CONFIG_FILE_PATH='~/somefolder/env-var-test.ini')
+    @ patch.multiple(ConfigManager, _read_in_config_dict=DEFAULT,
+                     _read_in_config_file=DEFAULT)
+    def test_init_with_env_variable(
+            self, _read_in_config_dict, _read_in_config_file):
+        _ = ConfigManager()
 
-        self.assertEqual(config_mngr._config_file, file_path)
+        _read_in_config_dict.assert_not_called()
+        _read_in_config_file.assert_called_once_with(
+            os.environ.get('MCS_CONFIG_FILE_PATH'))
 
     @mock_env(MCS_CONFIG_FILE_PATH='~/somefolder/env-var-test.ini')
-    def test_init_with_env_variable(self):
-        config_mngr = ConfigManager()
+    @patch.multiple(ConfigManager, _read_in_config_dict=DEFAULT,
+                    _read_in_config_file=DEFAULT)
+    def test_init_with_arg_and_env_variable(
+            self, _read_in_config_dict, _read_in_config_file):
+        '''Ensures environment variable overrides provided file path'''
+        file_path = './arg-test.ini'
+        _ = ConfigManager(file_path)
 
-        self.assertEqual(
-            config_mngr._config_file,
-            '~/somefolder/env-var-test.ini')
+        _read_in_config_dict.assert_not_called()
+        _read_in_config_file.assert_called_once_with(
+            os.environ.get('MCS_CONFIG_FILE_PATH')
+        )
+
+    @mock_env(MCS_CONFIG_FILE_PATH='~/somefolder/env-var-test.ini')
+    def test_nonexistent_file_from_env_variable(self):
+        '''Missing config files should raise an exception'''
+        self.assertRaises(RuntimeError, ConfigManager)
+
+    @mock_env(MCS_CONFIG_FILE_PATH=('machine_common_sense/scripts/'
+                                    'config_level2_debug.ini'))
+    def test_init_no_override_with_env_var_and_dict(self):
+        config_options = {
+            'metadata': 'oracle',
+            'seed': 10
+        }
+        config_mngr = ConfigManager(config_options)
+        self.assertEqual(config_mngr.get_metadata_tier(),
+                         MetadataTier.LEVEL_2)
+        self.assertEqual(config_mngr.get_seed(), None)
+
+    @mock_env(MCS_CONFIG_FILE_PATH=('machine_common_sense/scripts/'
+                                    'config_level2_debug.ini'))
+    @patch.multiple(ConfigManager, _read_in_config_dict=DEFAULT,
+                    _read_in_config_file=DEFAULT)
+    def test_init_env_var_and_dict_function_calls(
+            self, _read_in_config_dict, _read_in_config_file):
+        config_options = {
+            'metadata': 'oracle',
+            'seed': 10
+        }
+        _ = ConfigManager(config_options)
+        _read_in_config_dict.assert_not_called()
+        _read_in_config_file.assert_called_once_with(
+            os.environ.get('MCS_CONFIG_FILE_PATH'))
+
+    def test_init_with_filepath(self):
+        config_file = 'machine_common_sense/scripts/config_level2_debug.ini'
+        config_mngr = ConfigManager(config_file_or_dict=config_file)
+        self.assertEqual(config_mngr.get_metadata_tier(),
+                         MetadataTier.LEVEL_2)
+        self.assertEqual(config_mngr.get_seed(), None)
+
+    def test_init_with_filepath_missing(self):
+        '''Provided config file path must exist or an exception occurs'''
+        missing_config_file = '~/somefolder/env-var-test.ini'
+        self.assertRaises(RuntimeError, ConfigManager, missing_config_file)
+
+    def test_init_with_no_config(self):
+        '''No dictionary, no file, and no env should raise an exception'''
+        self.assertRaises(RuntimeError, ConfigManager)
+
+    def test_init_with_dict(self):
+        config_options = {
+            'metadata': 'oracle',
+            'video_enabled': 'false',
+            'save_debug_images': True,
+            'seed': 10
+        }
+
+        config_mngr = ConfigManager(config_options)
+
+        self.assertIsNotNone(config_mngr._config)
+        self.assertEqual(config_mngr.get_metadata_tier(),
+                         MetadataTier.ORACLE)
+        self.assertFalse(config_mngr.is_video_enabled())
+        self.assertTrue(config_mngr.is_save_debug_images())
+        self.assertEqual(config_mngr.get_seed(), 10)
 
     def test_validate_screen_size(self):
         self.config_mngr._config[
@@ -85,9 +168,11 @@ def test_get_evaluation_name(self):
             self.config_mngr.get_evaluation_name(),
             'test_eval')
 
-    @mock_env()
     def test_get_metadata_tier(self):
-        self.assertEqual(self.config_mngr.get_metadata_tier(), 'default')
+        self.assertEqual(
+            self.config_mngr.get_metadata_tier(),
+            MetadataTier.DEFAULT)
+        self.assertEqual(self.config_mngr.get_metadata_tier().value, 'default')
 
         self.config_mngr._config[
             self.config_mngr.CONFIG_DEFAULT_SECTION
@@ -97,12 +182,11 @@ def test_get_metadata_tier(self):
 
         self.assertEqual(
             self.config_mngr.get_metadata_tier(),
+            MetadataTier.ORACLE)
+        self.assertEqual(
+            self.config_mngr.get_metadata_tier().value,
             'oracle')
 
-    @mock_env(MCS_METADATA_LEVEL='level2')
-    def test_get_metadata_tier_with_env_variable(self):
-        self.assertEqual(self.config_mngr.get_metadata_tier(), 'level2')
-
     def test_get_seed(self):
         self.assertEqual(self.config_mngr.get_seed(), None)
 
diff --git a/tests/test_controller.py b/tests/test_controller.py
index 09b458d9f..f705b1661 100644
--- a/tests/test_controller.py
+++ b/tests/test_controller.py
@@ -8,7 +8,7 @@
 import numpy
 
 import machine_common_sense as mcs
-from machine_common_sense.config_manager import (ConfigManager,
+from machine_common_sense.config_manager import (ConfigManager, MetadataTier,
                                                  SceneConfiguration, Vector3d)
 from machine_common_sense.controller_events import EndScenePayload, EventType
 from machine_common_sense.goal_metadata import GoalMetadata
@@ -309,7 +309,7 @@ def test_end_scene(self):
 
     def test_start_scene(self):
         self.controller.set_metadata_tier(
-            ConfigManager.CONFIG_METADATA_TIER_ORACLE)
+            MetadataTier.ORACLE.value)
         output = self.controller.start_scene({'name': TEST_FILE_NAME})
         self.assertIsNotNone(output)
         self.controller._publish_event.assert_called_with(
@@ -356,7 +356,7 @@ def test_start_scene(self):
 
     def test_start_scene_preview_phase(self):
         self.controller.set_metadata_tier(
-            ConfigManager.CONFIG_METADATA_TIER_ORACLE)
+            MetadataTier.ORACLE.value)
         last_preview_phase_step = 5
         output = self.controller.start_scene({'name': TEST_FILE_NAME, 'goal': {
             'last_preview_phase_step': last_preview_phase_step}
@@ -390,7 +390,7 @@ def test_start_scene_preview_phase(self):
 
     def test_step(self):
         self.controller.set_metadata_tier(
-            ConfigManager.CONFIG_METADATA_TIER_ORACLE)
+            MetadataTier.ORACLE.value)
         output = self.controller.start_scene({'name': TEST_FILE_NAME})
         output = self.controller.step('MoveAhead')
         self.assertIsNotNone(output)
@@ -434,7 +434,7 @@ def test_step(self):
 
     def test_step_events(self):
         self.controller.set_metadata_tier(
-            ConfigManager.CONFIG_METADATA_TIER_ORACLE)
+            MetadataTier.ORACLE.value)
         output = self.controller.start_scene({'name': TEST_FILE_NAME})
         output = self.controller.step('MoveAhead')
         self.controller._publish_event.assert_any_call(
@@ -917,7 +917,7 @@ def test_remove_none(self):
 
     def test_set_config(self):
         first_config = self.controller._config
-        new_config = ConfigManager()
+        new_config = ConfigManager(config_file_or_dict={})
         previous_noise = first_config.is_noise_enabled()
 
         def flip():
diff --git a/tests/test_controller_output_handler.py b/tests/test_controller_output_handler.py
index 53ed42001..f18a909e7 100644
--- a/tests/test_controller_output_handler.py
+++ b/tests/test_controller_output_handler.py
@@ -4,7 +4,7 @@
 import numpy
 
 import machine_common_sense as mcs
-from machine_common_sense.config_manager import (ConfigManager,
+from machine_common_sense.config_manager import (ConfigManager, MetadataTier,
                                                  SceneConfiguration,
                                                  SceneConfigurationSchema)
 from machine_common_sense.controller_output_handler import (
@@ -15,7 +15,7 @@
 class TestControllerOutputHandler(unittest.TestCase):
 
     def setUp(self):
-        self._config = ConfigManager()
+        self._config = ConfigManager(config_file_or_dict={})
         self._config._config[
             ConfigManager.CONFIG_DEFAULT_SECTION
         ] = {}
@@ -477,7 +477,7 @@ def test_retrieve_head_tilt(self):
 
     def test_wrap_output(self):
         self._config.set_metadata_tier(
-            ConfigManager.CONFIG_METADATA_TIER_DEFAULT)
+            MetadataTier.DEFAULT.value)
         (
             mock_scene_event_data,
             image_data,
@@ -508,7 +508,7 @@ def test_wrap_output(self):
 
         self.assertEqual(len(actual.object_list), 1)
         self.assertEqual(actual.object_list[0].uuid, "testId")
-        self.assertEqual(actual.object_list[0].color, {
+        self.assertEqual(actual.object_list[0].segment_color, {
             "r": 12,
             "g": 34,
             "b": 56
@@ -540,7 +540,7 @@ def test_wrap_output(self):
 
         self.assertEqual(len(actual.structural_object_list), 1)
         self.assertEqual(actual.structural_object_list[0].uuid, "testWallId")
-        self.assertEqual(actual.structural_object_list[0].color, {
+        self.assertEqual(actual.structural_object_list[0].segment_color, {
             "r": 101,
             "g": 102,
             "b": 103
@@ -644,7 +644,7 @@ def test_wrap_output_with_config_metadata_level2(self):
 
     def test_wrap_output_with_config_metadata_level1(self):
         self._config.set_metadata_tier(
-            ConfigManager.CONFIG_METADATA_TIER_LEVEL_1)
+            MetadataTier.LEVEL_1.value)
         (
             mock_scene_event_data,
             image_data,
@@ -723,7 +723,7 @@ def test_wrap_output_with_config_metadata_none(self):
 
     def test_wrap_output_with_config_metadata_oracle_non_restrict(self):
         self._config.set_metadata_tier(
-            ConfigManager.CONFIG_METADATA_TIER_ORACLE)
+            MetadataTier.ORACLE.value)
         (
             mock_scene_event_data,
             image_data,
@@ -772,7 +772,7 @@ def test_wrap_output_with_config_metadata_oracle_non_restrict(self):
 
     def test_wrap_output_with_config_metadata_oracle(self):
         self._config.set_metadata_tier(
-            ConfigManager.CONFIG_METADATA_TIER_ORACLE)
+            MetadataTier.ORACLE.value)
         (
             mock_scene_event_data,
             image_data,
@@ -821,7 +821,7 @@ def test_wrap_output_with_config_metadata_oracle(self):
 
     def test_save_images(self):
         self._config.set_metadata_tier(
-            ConfigManager.CONFIG_METADATA_TIER_ORACLE)
+            MetadataTier.ORACLE.value)
         image_data = numpy.array([[0]], dtype=numpy.uint8)
         depth_data = numpy.array([[[0, 0, 0]]], dtype=numpy.uint8)
         object_mask_data = numpy.array([[192]], dtype=numpy.uint8)
@@ -856,7 +856,7 @@ def test_save_images(self):
 
     def test_save_images_with_multiple_images(self):
         self._config.set_metadata_tier(
-            ConfigManager.CONFIG_METADATA_TIER_ORACLE)
+            MetadataTier.ORACLE.value)
         image_data_1 = numpy.array([[64]], dtype=numpy.uint8)
         depth_data_1 = numpy.array([[[128, 64, 32]]], dtype=numpy.uint8)
         object_mask_data_1 = numpy.array([[192]], dtype=numpy.uint8)
@@ -917,7 +917,7 @@ def test_retrieve_object_list(self):
         self.assertEqual(len(actual), 2)
 
         self.assertEqual(actual[0].uuid, "testId1")
-        self.assertEqual(actual[0].color, {
+        self.assertEqual(actual[0].segment_color, {
             "r": 12,
             "g": 34,
             "b": 56
@@ -942,7 +942,7 @@ def test_retrieve_object_list(self):
         self.assertEqual(actual[0].visible, True)
 
         self.assertEqual(actual[1].uuid, "testId2")
-        self.assertEqual(actual[1].color, {
+        self.assertEqual(actual[1].segment_color, {
             "r": 98,
             "g": 76,
             "b": 54
@@ -1014,7 +1014,7 @@ def test_retrieve_object_list_with_config_metadata_oracle(self):
         self.assertEqual(len(actual), 3)
 
         self.assertEqual(actual[0].uuid, "testId1")
-        self.assertEqual(actual[0].color, {
+        self.assertEqual(actual[0].segment_color, {
             "r": 12,
             "g": 34,
             "b": 56
@@ -1039,7 +1039,7 @@ def test_retrieve_object_list_with_config_metadata_oracle(self):
         self.assertEqual(actual[0].visible, True)
 
         self.assertEqual(actual[1].uuid, "testId2")
-        self.assertEqual(actual[1].color, {
+        self.assertEqual(actual[1].segment_color, {
             "r": 98,
             "g": 76,
             "b": 54
@@ -1066,7 +1066,7 @@ def test_retrieve_object_list_with_config_metadata_oracle(self):
         self.assertEqual(actual[1].visible, True)
 
         self.assertEqual(actual[2].uuid, "testId3")
-        self.assertEqual(actual[2].color, {
+        self.assertEqual(actual[2].segment_color, {
             "r": 101,
             "g": 102,
             "b": 103
diff --git a/tests/test_history_event_handler.py b/tests/test_history_event_handler.py
index a76cc34f4..222d4dd62 100644
--- a/tests/test_history_event_handler.py
+++ b/tests/test_history_event_handler.py
@@ -16,7 +16,7 @@
 class TestHistoryEventHandler(unittest.TestCase):
 
     scene_config = SceneConfiguration(name=TEST_FILE_NAME)
-    config_mngr = ConfigManager()
+    config_mngr = ConfigManager({})
 
     def setUp(self):
         self.config_mngr._config[
diff --git a/tests/test_mcs.py b/tests/test_mcs.py
index f3bc09772..29ca8669a 100644
--- a/tests/test_mcs.py
+++ b/tests/test_mcs.py
@@ -21,7 +21,7 @@ def test_create_controller(self):
 
     def test_add_subscribers(self):
         ctrl = MockController()
-        cfg = ConfigManager()
+        cfg = ConfigManager({})
         ctrl._subscribers.clear()
 
         def return_true():
diff --git a/tests/test_object_metadata.py b/tests/test_object_metadata.py
index 9d72558b7..aeb1815eb 100644
--- a/tests/test_object_metadata.py
+++ b/tests/test_object_metadata.py
@@ -8,7 +8,6 @@ class TestObjectMetadata(unittest.TestCase):
 
     str_output = '''    {
         "uuid": "",
-        "color": {},
         "dimensions": [],
         "direction": {},
         "distance": -1.0,
@@ -19,6 +18,7 @@ class TestObjectMetadata(unittest.TestCase):
         "material_list": [],
         "position": {},
         "rotation": {},
+        "segment_color": {},
         "shape": "",
         "state_list": [],
         "texture_color_list": [],
@@ -40,10 +40,6 @@ def test_uuid(self):
         self.assertEqual(self.object_metadata.uuid, "")
         self.assertIsInstance(self.object_metadata.uuid, str)
 
-    def test_color(self):
-        self.assertFalse(self.object_metadata.color)
-        self.assertIsInstance(self.object_metadata.color, dict)
-
     def test_dimensions(self):
         self.assertFalse(self.object_metadata.dimensions)
         self.assertIsInstance(self.object_metadata.dimensions, list)
@@ -84,6 +80,10 @@ def test_rotation(self):
         self.assertFalse(self.object_metadata.rotation)
         self.assertIsInstance(self.object_metadata.rotation, dict)
 
+    def test_segment_color(self):
+        self.assertFalse(self.object_metadata.segment_color)
+        self.assertIsInstance(self.object_metadata.segment_color, dict)
+
     def test_shape(self):
         self.assertEqual(self.object_metadata.shape, "")
         self.assertIsInstance(self.object_metadata.shape, str)
diff --git a/tests/test_serializer.py b/tests/test_serializer.py
index c6a7d1287..fda20f1a1 100644
--- a/tests/test_serializer.py
+++ b/tests/test_serializer.py
@@ -37,6 +37,8 @@ def test_serialization_json(self):
         self.assertAlmostEqual(unpacked_metadata.reward, -0.036000000000000004)
         self.assertAlmostEqual(unpacked_metadata.rotation, 0.0, delta=1e-04)
         self.assertIsInstance(unpacked_metadata.object_list[-1].shape, str)
+        self.assertIsInstance(
+            unpacked_metadata.object_list[0].segment_color, dict)
 
 
 if __name__ == '__main__':
diff --git a/tests/test_step_metadata.py b/tests/test_step_metadata.py
index 7d979c33c..ed96831b0 100644
--- a/tests/test_step_metadata.py
+++ b/tests/test_step_metadata.py
@@ -1,3 +1,4 @@
+import copy
 import textwrap
 import unittest
 
@@ -39,6 +40,46 @@ class TestStepMetadata(unittest.TestCase):
         "structural_object_list": []
     }'''
 
+    str_output_segment_map_ints = '''    {
+        "action_list": [],
+        "camera_aspect_ratio": [0.0,0.0],
+        "camera_clipping_planes": [0.0,0.0],
+        "camera_field_of_view": 0.0,
+        "camera_height": 0.0,
+        "depth_map_list": [],
+        "goal": {
+            "action_list": null,
+            "category": "",
+            "description": "",
+            "habituation_total": 0,
+            "last_preview_phase_step": 0,
+            "last_step": null,
+            "metadata": {}
+        },
+        "habituation_trial": null,
+        "head_tilt": 0.0,
+        "image_list": [],
+        "object_list": [],
+        "object_mask_list": [],
+        "performer_radius": 0.0,
+        "performer_reach": 0.0,
+        "physics_frames_per_second": 0,
+        "pose": "UNDEFINED",
+        "position": {},
+        "return_status": "UNDEFINED",
+        "reward": 0,
+        "rotation": 0.0,
+        "step_number": 0,
+        "structural_object_list": [],
+        "segment_map": {
+            "0": {
+                "r": 218,
+                "g": 65,
+                "b": 21
+            }
+        }
+    }'''
+
     @classmethod
     def setUpClass(cls):
         cls.step_metadata = mcs.StepMetadata()
@@ -133,6 +174,18 @@ def test_str(self):
         self.assertEqual(str(self.step_metadata),
                          textwrap.dedent(self.str_output))
 
+    def test_str_int_segment_map(self):
+        metadata = copy.deepcopy(self.step_metadata)
+        metadata.segment_map = {
+            0: {
+                'r': 218,
+                'g': 65,
+                'b': 21
+            }
+        }
+        self.assertEqual(str(metadata),
+                         textwrap.dedent(self.str_output_segment_map_ints))
+
     def test_copy_without_depth_or_images(self):
         data = mcs.StepMetadata(
             action_list=['action_1', 'action_2'],