Repository: NREL/OpenStudio (language: python)

Issue:
Wrap `Output:Schedules` and `Output:Constructions` objects
Enhancement Request
--------------
Including:
* `Output:Constructions`
* `Output:Schedules`
Wrap `Output:Schedules` and `Output:Constructions` objects
Enhancement Request
--------------
Including:
* `Output:Constructions`
* `Output:Schedules`


Discussion / hints:

Fix patch:
diff --git a/resources/model/OpenStudio.idd b/resources/model/OpenStudio.idd
index d8d3d48ba59..6b0aa46e98f 100644
--- a/resources/model/OpenStudio.idd
+++ b/resources/model/OpenStudio.idd
@@ -34612,6 +34612,41 @@ OS:UtilityCost:Computation,
 
 \group OpenStudio Output Requests
 
+OS:Output:Schedules,
+       \memo Produces a condensed reporting that illustrates the full range of schedule values in
+       \memo the eio output file. In the style of input: DaySchedule,  WeekSchedule, and
+       \memo Annual Schedule.
+       \format singleLine
+       \unique-object
+  A1,  \field Handle
+       \type handle
+       \required-field
+  A2;  \field Key Field
+       \required-field
+       \type choice
+       \key Hourly
+       \key Timestep
+
+OS:Output:Constructions,
+       \memo Adds a report to the eio output file which shows details for each construction,
+       \memo including overall properties, a list of material layers, and calculated results
+       \memo related to conduction transfer functions.
+       \format singleLine
+       \unique-object
+  A1,  \field Handle
+       \type handle
+       \required-field
+  A2,  \field Report Constructions
+       \type choice
+       \required-field
+       \key No
+       \key Yes
+  A3;  \field Report Materials
+       \type choice
+       \required-field
+       \key No
+       \key Yes
+
 OS:OutputControl:Files,
        \memo Conditionally turn on/off output from EnergyPlus.
        \unique-object
diff --git a/src/energyplus/CMakeLists.txt b/src/energyplus/CMakeLists.txt
index 90e29c56671..572f1475492 100644
--- a/src/energyplus/CMakeLists.txt
+++ b/src/energyplus/CMakeLists.txt
@@ -259,6 +259,8 @@ set(${target_name}_src
   ForwardTranslator/ForwardTranslateOutputJSON.cpp
   ForwardTranslator/ForwardTranslateOutputSQLite.cpp
   ForwardTranslator/ForwardTranslateOutputEnvironmentalImpactFactors.cpp
+  ForwardTranslator/ForwardTranslateOutputSchedules.cpp
+  ForwardTranslator/ForwardTranslateOutputConstructions.cpp
   ForwardTranslator/ForwardTranslateEnvironmentalImpactFactors.cpp
   ForwardTranslator/ForwardTranslateFuelFactors.cpp
   ForwardTranslator/ForwardTranslateOutputTableSummaryReports.cpp
@@ -543,6 +545,8 @@ set(${target_name}_src
   ReverseTranslator/ReverseTranslateOutputJSON.cpp
   ReverseTranslator/ReverseTranslateOutputSQLite.cpp
   ReverseTranslator/ReverseTranslateOutputEnvironmentalImpactFactors.cpp
+  ReverseTranslator/ReverseTranslateOutputSchedules.cpp
+  ReverseTranslator/ReverseTranslateOutputConstructions.cpp
   ReverseTranslator/ReverseTranslateEnvironmentalImpactFactors.cpp
   ReverseTranslator/ReverseTranslateFuelFactors.cpp
   ReverseTranslator/ReverseTranslateOutputIlluminanceMap.cpp
@@ -738,6 +742,8 @@ set(${target_name}_test_src
   Test/OutputSQLite_GTest.cpp
   Test/OutputEnvironmentalImpactFactors_GTest.cpp
   Test/OutputTableSummaryReports_GTest.cpp
+  Test/OutputSchedules_GTest.cpp
+  Test/OutputConstructions_GTest.cpp
   Test/People_GTest.cpp
   Test/PhotovoltaicPerformanceSandia_GTest.cpp
   Test/PerformancePrecisionTradeoffs_GTest.cpp
diff --git a/src/energyplus/ForwardTranslator.cpp b/src/energyplus/ForwardTranslator.cpp
index 2f88199232e..5d088e239d5 100644
--- a/src/energyplus/ForwardTranslator.cpp
+++ b/src/energyplus/ForwardTranslator.cpp
@@ -2293,6 +2293,16 @@ namespace energyplus {
         retVal = translateOutputSQLite(mo);
         break;
       }
+      case openstudio::IddObjectType::OS_Output_Schedules: {
+        auto mo = modelObject.cast<OutputSchedules>();
+        retVal = translateOutputSchedules(mo);
+        break;
+      }
+      case openstudio::IddObjectType::OS_Output_Constructions: {
+        auto mo = modelObject.cast<OutputConstructions>();
+        retVal = translateOutputConstructions(mo);
+        break;
+      }
       case openstudio::IddObjectType::OS_Output_EnvironmentalImpactFactors: {
         auto mo = modelObject.cast<OutputEnvironmentalImpactFactors>();
         retVal = translateOutputEnvironmentalImpactFactors(mo);
@@ -3306,6 +3316,8 @@ namespace energyplus {
     result.push_back(IddObjectType::OS_Output_Diagnostics);
     result.push_back(IddObjectType::OS_Output_JSON);
     result.push_back(IddObjectType::OS_Output_SQLite);
+    result.push_back(IddObjectType::OS_Output_Schedules);
+    result.push_back(IddObjectType::OS_Output_Constructions);
 
     // Note: we just always translate Output:EnvironmentalImpactFactors, and in there (it exists), then trigger translatation of the two others
     result.push_back(IddObjectType::OS_Output_EnvironmentalImpactFactors);
diff --git a/src/energyplus/ForwardTranslator.hpp b/src/energyplus/ForwardTranslator.hpp
index 8c1f394e795..6c90b8a9a95 100644
--- a/src/energyplus/ForwardTranslator.hpp
+++ b/src/energyplus/ForwardTranslator.hpp
@@ -314,6 +314,8 @@ namespace model {
   class OutputDiagnostics;
   class OutputJSON;
   class OutputSQLite;
+  class OutputSchedules;
+  class OutputConstructions;
   class OutputEnvironmentalImpactFactors;
   class EnvironmentalImpactFactors;
   class FuelFactors;
@@ -1158,6 +1160,10 @@ namespace energyplus {
 
     boost::optional<IdfObject> translateOutputSQLite(model::OutputSQLite& modelObject);
 
+    boost::optional<IdfObject> translateOutputSchedules(model::OutputSchedules& modelObject);
+
+    boost::optional<IdfObject> translateOutputConstructions(model::OutputConstructions& modelObject);
+
     boost::optional<IdfObject> translateOutputEnvironmentalImpactFactors(model::OutputEnvironmentalImpactFactors& modelObject);
 
     boost::optional<IdfObject> translateEnvironmentalImpactFactors(model::EnvironmentalImpactFactors& modelObject);
diff --git a/src/energyplus/ForwardTranslator/ForwardTranslateOutputConstructions.cpp b/src/energyplus/ForwardTranslator/ForwardTranslateOutputConstructions.cpp
new file mode 100644
index 00000000000..34e11d4ca33
--- /dev/null
+++ b/src/energyplus/ForwardTranslator/ForwardTranslateOutputConstructions.cpp
@@ -0,0 +1,69 @@
+/***********************************************************************************************************************
+*  OpenStudio(R), Copyright (c) 2008-2022, Alliance for Sustainable Energy, LLC, and other contributors. All rights reserved.
+*
+*  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
+*  following conditions are met:
+*
+*  (1) Redistributions of source code must retain the above copyright notice, this list of conditions and the following
+*  disclaimer.
+*
+*  (2) Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
+*  disclaimer in the documentation and/or other materials provided with the distribution.
+*
+*  (3) Neither the name of the copyright holder nor the names of any contributors may be used to endorse or promote products
+*  derived from this software without specific prior written permission from the respective party.
+*
+*  (4) Other than as required in clauses (1) and (2), distributions in any form of modifications or other derivative works
+*  may not use the "OpenStudio" trademark, "OS", "os", or any other confusingly similar designation without specific prior
+*  written permission from Alliance for Sustainable Energy, LLC.
+*
+*  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+*  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+*  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE UNITED STATES GOVERNMENT, OR THE UNITED
+*  STATES DEPARTMENT OF ENERGY, NOR ANY OF THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+*  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+*  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+*  STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+*  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************************************************************/
+
+#include "../ForwardTranslator.hpp"
+#include "../../model/Model.hpp"
+
+#include "../../model/OutputConstructions.hpp"
+
+#include <utilities/idd/Output_Constructions_FieldEnums.hxx>
+// #include "../../utilities/idd/IddEnums.hpp"
+#include <utilities/idd/IddEnums.hxx>
+
+using namespace openstudio::model;
+
+namespace openstudio {
+
+namespace energyplus {
+
+  boost::optional<IdfObject> ForwardTranslator::translateOutputConstructions(OutputConstructions& modelObject) {
+    // If nothing to write, don't
+    bool reportConstructions = modelObject.reportConstructions();
+    bool reportMaterials = modelObject.reportMaterials();
+    if (!reportConstructions && !reportMaterials) {
+      return boost::none;
+    }
+
+    IdfObject idfObject = createAndRegisterIdfObject(openstudio::IddObjectType::Output_Constructions, modelObject);
+
+    if (reportConstructions) {
+      idfObject.setString(Output_ConstructionsFields::DetailsType1, "Constructions");
+      if (reportMaterials) {
+        idfObject.setString(Output_ConstructionsFields::DetailsType2, "Materials");
+      }
+    } else if (reportMaterials) {
+      idfObject.setString(Output_ConstructionsFields::DetailsType1, "Materials");
+    }
+
+    return idfObject;
+  }
+
+}  // namespace energyplus
+
+}  // namespace openstudio
diff --git a/src/energyplus/ForwardTranslator/ForwardTranslateOutputSchedules.cpp b/src/energyplus/ForwardTranslator/ForwardTranslateOutputSchedules.cpp
new file mode 100644
index 00000000000..0125b6bfa98
--- /dev/null
+++ b/src/energyplus/ForwardTranslator/ForwardTranslateOutputSchedules.cpp
@@ -0,0 +1,56 @@
+/***********************************************************************************************************************
+*  OpenStudio(R), Copyright (c) 2008-2022, Alliance for Sustainable Energy, LLC, and other contributors. All rights reserved.
+*
+*  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
+*  following conditions are met:
+*
+*  (1) Redistributions of source code must retain the above copyright notice, this list of conditions and the following
+*  disclaimer.
+*
+*  (2) Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
+*  disclaimer in the documentation and/or other materials provided with the distribution.
+*
+*  (3) Neither the name of the copyright holder nor the names of any contributors may be used to endorse or promote products
+*  derived from this software without specific prior written permission from the respective party.
+*
+*  (4) Other than as required in clauses (1) and (2), distributions in any form of modifications or other derivative works
+*  may not use the "OpenStudio" trademark, "OS", "os", or any other confusingly similar designation without specific prior
+*  written permission from Alliance for Sustainable Energy, LLC.
+*
+*  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+*  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+*  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE UNITED STATES GOVERNMENT, OR THE UNITED
+*  STATES DEPARTMENT OF ENERGY, NOR ANY OF THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+*  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+*  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+*  STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+*  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************************************************************/
+
+#include "../ForwardTranslator.hpp"
+#include "../../model/Model.hpp"
+
+#include "../../model/OutputSchedules.hpp"
+
+#include <utilities/idd/Output_Schedules_FieldEnums.hxx>
+// #include "../../utilities/idd/IddEnums.hpp"
+#include <utilities/idd/IddEnums.hxx>
+
+using namespace openstudio::model;
+
+namespace openstudio {
+
+namespace energyplus {
+
+  boost::optional<IdfObject> ForwardTranslator::translateOutputSchedules(OutputSchedules& modelObject) {
+
+    IdfObject idfObject = createAndRegisterIdfObject(openstudio::IddObjectType::Output_Schedules, modelObject);
+
+    idfObject.setString(Output_SchedulesFields::KeyField, modelObject.keyField());
+
+    return idfObject;
+  }
+
+}  // namespace energyplus
+
+}  // namespace openstudio
diff --git a/src/energyplus/ReverseTranslator.cpp b/src/energyplus/ReverseTranslator.cpp
index 45028fa46de..74ae8a2d758 100644
--- a/src/energyplus/ReverseTranslator.cpp
+++ b/src/energyplus/ReverseTranslator.cpp
@@ -744,6 +744,14 @@ namespace energyplus {
         modelObject = translateOutputControlTableStyle(workspaceObject);
         break;
       }
+      case openstudio::IddObjectType::Output_Schedules: {
+        modelObject = translateOutputSchedules(workspaceObject);
+        break;
+      }
+      case openstudio::IddObjectType::Output_Constructions: {
+        modelObject = translateOutputConstructions(workspaceObject);
+        break;
+      }
       case openstudio::IddObjectType::People: {
         modelObject = translatePeople(workspaceObject);
         break;
diff --git a/src/energyplus/ReverseTranslator.hpp b/src/energyplus/ReverseTranslator.hpp
index 24cdf0f6b64..822ae96d184 100644
--- a/src/energyplus/ReverseTranslator.hpp
+++ b/src/energyplus/ReverseTranslator.hpp
@@ -259,6 +259,10 @@ namespace energyplus {
 
     boost::optional<model::ModelObject> translateOutputSQLite(const WorkspaceObject& workspaceObject);
 
+    boost::optional<model::ModelObject> translateOutputSchedules(const WorkspaceObject& workspaceObject);
+
+    boost::optional<model::ModelObject> translateOutputConstructions(const WorkspaceObject& workspaceObject);
+
     boost::optional<model::ModelObject> translateOutputEnvironmentalImpactFactors(const WorkspaceObject& workspaceObject);
 
     boost::optional<model::ModelObject> translateEnvironmentalImpactFactors(const WorkspaceObject& workspaceObject);
diff --git a/src/energyplus/ReverseTranslator/ReverseTranslateOutputConstructions.cpp b/src/energyplus/ReverseTranslator/ReverseTranslateOutputConstructions.cpp
new file mode 100644
index 00000000000..e832223de02
--- /dev/null
+++ b/src/energyplus/ReverseTranslator/ReverseTranslateOutputConstructions.cpp
@@ -0,0 +1,74 @@
+/***********************************************************************************************************************
+*  OpenStudio(R), Copyright (c) 2008-2022, Alliance for Sustainable Energy, LLC, and other contributors. All rights reserved.
+*
+*  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
+*  following conditions are met:
+*
+*  (1) Redistributions of source code must retain the above copyright notice, this list of conditions and the following
+*  disclaimer.
+*
+*  (2) Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
+*  disclaimer in the documentation and/or other materials provided with the distribution.
+*
+*  (3) Neither the name of the copyright holder nor the names of any contributors may be used to endorse or promote products
+*  derived from this software without specific prior written permission from the respective party.
+*
+*  (4) Other than as required in clauses (1) and (2), distributions in any form of modifications or other derivative works
+*  may not use the "OpenStudio" trademark, "OS", "os", or any other confusingly similar designation without specific prior
+*  written permission from Alliance for Sustainable Energy, LLC.
+*
+*  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+*  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+*  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE UNITED STATES GOVERNMENT, OR THE UNITED
+*  STATES DEPARTMENT OF ENERGY, NOR ANY OF THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+*  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+*  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+*  STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+*  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************************************************************/
+
+#include "../ReverseTranslator.hpp"
+
+#include "../../model/OutputConstructions.hpp"
+#include "../../model/OutputConstructions_Impl.hpp"
+
+#include <utilities/idd/Output_Constructions_FieldEnums.hxx>
+#include <utilities/idd/IddEnums.hxx>
+
+using namespace openstudio::model;
+
+namespace openstudio {
+
+namespace energyplus {
+
+  boost::optional<ModelObject> ReverseTranslator::translateOutputConstructions(const WorkspaceObject& workspaceObject) {
+
+    bool reportConstructions = false;
+    bool reportMaterials = false;
+
+    for (unsigned index : {Output_ConstructionsFields::DetailsType1, Output_ConstructionsFields::DetailsType2}) {
+      if (boost::optional<std::string> detailsType_ = workspaceObject.getString(index, true, false)) {
+        if (istringEqual("Constructions", detailsType_.get())) {
+          reportConstructions = true;
+        } else if (istringEqual("Materials", detailsType_.get())) {
+          reportMaterials = true;
+        }
+      }
+    }
+
+    if (!reportConstructions && !reportMaterials) {
+      return boost::none;
+    }
+
+    // This is a Unique ModelObject
+    openstudio::model::OutputConstructions modelObject = m_model.getUniqueModelObject<OutputConstructions>();
+
+    modelObject.setReportConstructions(reportConstructions);
+    modelObject.setReportMaterials(reportMaterials);
+
+    return modelObject;
+
+  }  // End of translate function
+
+}  // end namespace energyplus
+}  // end namespace openstudio
diff --git a/src/energyplus/ReverseTranslator/ReverseTranslateOutputSchedules.cpp b/src/energyplus/ReverseTranslator/ReverseTranslateOutputSchedules.cpp
new file mode 100644
index 00000000000..ab4a0792571
--- /dev/null
+++ b/src/energyplus/ReverseTranslator/ReverseTranslateOutputSchedules.cpp
@@ -0,0 +1,59 @@
+/***********************************************************************************************************************
+*  OpenStudio(R), Copyright (c) 2008-2022, Alliance for Sustainable Energy, LLC, and other contributors. All rights reserved.
+*
+*  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
+*  following conditions are met:
+*
+*  (1) Redistributions of source code must retain the above copyright notice, this list of conditions and the following
+*  disclaimer.
+*
+*  (2) Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
+*  disclaimer in the documentation and/or other materials provided with the distribution.
+*
+*  (3) Neither the name of the copyright holder nor the names of any contributors may be used to endorse or promote products
+*  derived from this software without specific prior written permission from the respective party.
+*
+*  (4) Other than as required in clauses (1) and (2), distributions in any form of modifications or other derivative works
+*  may not use the "OpenStudio" trademark, "OS", "os", or any other confusingly similar designation without specific prior
+*  written permission from Alliance for Sustainable Energy, LLC.
+*
+*  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+*  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+*  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE UNITED STATES GOVERNMENT, OR THE UNITED
+*  STATES DEPARTMENT OF ENERGY, NOR ANY OF THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+*  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+*  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+*  STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+*  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************************************************************/
+
+#include "../ReverseTranslator.hpp"
+
+#include "../../model/OutputSchedules.hpp"
+#include "../../model/OutputSchedules_Impl.hpp"
+
+#include <utilities/idd/Output_Schedules_FieldEnums.hxx>
+#include <utilities/idd/IddEnums.hxx>
+
+using namespace openstudio::model;
+
+namespace openstudio {
+
+namespace energyplus {
+
+  boost::optional<ModelObject> ReverseTranslator::translateOutputSchedules(const WorkspaceObject& workspaceObject) {
+    boost::optional<ModelObject> result;
+
+    if (boost::optional<std::string> keyField_ = workspaceObject.getString(Output_SchedulesFields::KeyField, false, true)) {
+      // This is a Unique ModelObject
+      auto modelObject = m_model.getUniqueModelObject<OutputSchedules>();
+      modelObject.setKeyField(keyField_.get());
+      result = modelObject;
+    }
+
+    return result;
+
+  }  // End of translate function
+
+}  // end namespace energyplus
+}  // end namespace openstudio
diff --git a/src/energyplus/Test/OutputConstructions_GTest.cpp b/src/energyplus/Test/OutputConstructions_GTest.cpp
new file mode 100644
index 00000000000..345071070af
--- /dev/null
+++ b/src/energyplus/Test/OutputConstructions_GTest.cpp
@@ -0,0 +1,137 @@
+/***********************************************************************************************************************
+*  OpenStudio(R), Copyright (c) 2008-2022, Alliance for Sustainable Energy, LLC, and other contributors. All rights reserved.
+*
+*  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
+*  following conditions are met:
+*
+*  (1) Redistributions of source code must retain the above copyright notice, this list of conditions and the following
+*  disclaimer.
+*
+*  (2) Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
+*  disclaimer in the documentation and/or other materials provided with the distribution.
+*
+*  (3) Neither the name of the copyright holder nor the names of any contributors may be used to endorse or promote products
+*  derived from this software without specific prior written permission from the respective party.
+*
+*  (4) Other than as required in clauses (1) and (2), distributions in any form of modifications or other derivative works
+*  may not use the "OpenStudio" trademark, "OS", "os", or any other confusingly similar designation without specific prior
+*  written permission from Alliance for Sustainable Energy, LLC.
+*
+*  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+*  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+*  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE UNITED STATES GOVERNMENT, OR THE UNITED
+*  STATES DEPARTMENT OF ENERGY, NOR ANY OF THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+*  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+*  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+*  STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+*  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************************************************************/
+
+#include <gtest/gtest.h>
+#include "EnergyPlusFixture.hpp"
+
+#include "../ForwardTranslator.hpp"
+#include "../ReverseTranslator.hpp"
+
+#include "../../model/Model.hpp"
+#include "../../model/OutputConstructions.hpp"
+#include "../../model/OutputConstructions_Impl.hpp"
+
+#include "../../utilities/idf/IdfFile.hpp"
+#include "../../utilities/idf/Workspace.hpp"
+#include "../../utilities/idf/IdfObject.hpp"
+#include "../../utilities/idf/WorkspaceObject.hpp"
+
+#include <utilities/idd/Output_Constructions_FieldEnums.hxx>
+#include <utilities/idd/IddEnums.hxx>
+
+using namespace openstudio::energyplus;
+using namespace openstudio::model;
+using namespace openstudio;
+
+TEST_F(EnergyPlusFixture, ForwardTranslator_OutputConstructions) {
+
+  ForwardTranslator ft;
+
+  // Create a model
+  Model m;
+
+  // Get the unique object
+  auto outputConstructions = m.getUniqueModelObject<OutputConstructions>();
+
+  {
+    EXPECT_TRUE(outputConstructions.setReportConstructions(false));
+
+    Workspace w = ft.translateModel(m);
+
+    WorkspaceObjectVector idfObjs = w.getObjectsByType(IddObjectType::Output_Constructions);
+    EXPECT_EQ(0u, idfObjs.size());
+  }
+
+  {
+    EXPECT_TRUE(outputConstructions.setReportMaterials(true));
+
+    Workspace w = ft.translateModel(m);
+
+    WorkspaceObjectVector idfObjs = w.getObjectsByType(IddObjectType::Output_Constructions);
+    EXPECT_EQ(1u, idfObjs.size());
+    WorkspaceObject idf_constructions(idfObjs[0]);
+
+    EXPECT_EQ("Materials", idf_constructions.getString(Output_ConstructionsFields::DetailsType1).get());
+    EXPECT_TRUE(idf_constructions.isEmpty(Output_ConstructionsFields::DetailsType2));
+  }
+
+  {
+    EXPECT_TRUE(outputConstructions.setReportConstructions(true));
+
+    Workspace w = ft.translateModel(m);
+
+    WorkspaceObjectVector idfObjs = w.getObjectsByType(IddObjectType::Output_Constructions);
+    EXPECT_EQ(1u, idfObjs.size());
+    WorkspaceObject idf_constructions(idfObjs[0]);
+
+    EXPECT_EQ("Constructions", idf_constructions.getString(Output_ConstructionsFields::DetailsType1).get());
+    EXPECT_EQ("Materials", idf_constructions.getString(Output_ConstructionsFields::DetailsType2).get());
+  }
+}
+
+TEST_F(EnergyPlusFixture, ReverseTranslator_OutputConstructions) {
+
+  ReverseTranslator rt;
+
+  Workspace w(StrictnessLevel::Minimal, IddFileType::EnergyPlus);
+
+  // Not there, Model shouldn't have it either
+  {
+    Model m = rt.translateWorkspace(w);
+    EXPECT_FALSE(m.getOptionalUniqueModelObject<OutputConstructions>());
+  }
+
+  OptionalWorkspaceObject _i_outputConstructions = w.addObject(IdfObject(IddObjectType::Output_Constructions));
+  ASSERT_TRUE(_i_outputConstructions);
+
+  // There but no keys, Model shouldn't have it either
+  {
+    Model m = rt.translateWorkspace(w);
+    EXPECT_FALSE(m.getOptionalUniqueModelObject<OutputConstructions>());
+  }
+
+  _i_outputConstructions->setString(Output_ConstructionsFields::DetailsType1, "Materials");
+
+  {
+    Model m = rt.translateWorkspace(w);
+    ASSERT_TRUE(m.getOptionalUniqueModelObject<OutputConstructions>());
+    auto outputConstructions = m.getUniqueModelObject<OutputConstructions>();
+    EXPECT_FALSE(outputConstructions.reportConstructions());
+    EXPECT_TRUE(outputConstructions.reportMaterials());
+  }
+
+  _i_outputConstructions->setString(Output_ConstructionsFields::DetailsType2, "Constructions");
+  {
+    Model m = rt.translateWorkspace(w);
+    ASSERT_TRUE(m.getOptionalUniqueModelObject<OutputConstructions>());
+    auto outputConstructions = m.getUniqueModelObject<OutputConstructions>();
+    EXPECT_TRUE(outputConstructions.reportConstructions());
+    EXPECT_TRUE(outputConstructions.reportMaterials());
+  }
+}
diff --git a/src/energyplus/Test/OutputSchedules_GTest.cpp b/src/energyplus/Test/OutputSchedules_GTest.cpp
new file mode 100644
index 00000000000..b9c6a65a03a
--- /dev/null
+++ b/src/energyplus/Test/OutputSchedules_GTest.cpp
@@ -0,0 +1,120 @@
+/***********************************************************************************************************************
+*  OpenStudio(R), Copyright (c) 2008-2022, Alliance for Sustainable Energy, LLC, and other contributors. All rights reserved.
+*
+*  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
+*  following conditions are met:
+*
+*  (1) Redistributions of source code must retain the above copyright notice, this list of conditions and the following
+*  disclaimer.
+*
+*  (2) Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
+*  disclaimer in the documentation and/or other materials provided with the distribution.
+*
+*  (3) Neither the name of the copyright holder nor the names of any contributors may be used to endorse or promote products
+*  derived from this software without specific prior written permission from the respective party.
+*
+*  (4) Other than as required in clauses (1) and (2), distributions in any form of modifications or other derivative works
+*  may not use the "OpenStudio" trademark, "OS", "os", or any other confusingly similar designation without specific prior
+*  written permission from Alliance for Sustainable Energy, LLC.
+*
+*  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+*  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+*  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE UNITED STATES GOVERNMENT, OR THE UNITED
+*  STATES DEPARTMENT OF ENERGY, NOR ANY OF THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+*  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+*  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+*  STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+*  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************************************************************/
+
+#include <gtest/gtest.h>
+#include "EnergyPlusFixture.hpp"
+
+#include "../ForwardTranslator.hpp"
+#include "../ReverseTranslator.hpp"
+
+#include "../../model/Model.hpp"
+#include "../../model/OutputSchedules.hpp"
+#include "../../model/OutputSchedules_Impl.hpp"
+
+#include "../../utilities/idf/IdfFile.hpp"
+#include "../../utilities/idf/Workspace.hpp"
+#include "../../utilities/idf/IdfObject.hpp"
+#include "../../utilities/idf/WorkspaceObject.hpp"
+
+#include <utilities/idd/Output_Schedules_FieldEnums.hxx>
+#include <utilities/idd/IddEnums.hxx>
+
+using namespace openstudio::energyplus;
+using namespace openstudio::model;
+using namespace openstudio;
+
+TEST_F(EnergyPlusFixture, ForwardTranslator_OutputSchedules) {
+
+  ForwardTranslator ft;
+
+  // Create a model
+  Model m;
+
+  // Get the unique object
+  OutputSchedules outputSchedules = m.getUniqueModelObject<OutputSchedules>();
+  EXPECT_EQ("Hourly", outputSchedules.keyField());
+  {
+    Workspace w = ft.translateModel(m);
+
+    WorkspaceObjectVector idfObjs = w.getObjectsByType(IddObjectType::Output_Schedules);
+    EXPECT_EQ(1u, idfObjs.size());
+    WorkspaceObject idf_schedules(idfObjs[0]);
+
+    EXPECT_EQ("Hourly", idf_schedules.getString(Output_SchedulesFields::KeyField).get());
+  }
+  {
+    EXPECT_TRUE(outputSchedules.setKeyField("Timestep"));
+    Workspace w = ft.translateModel(m);
+
+    WorkspaceObjectVector idfObjs = w.getObjectsByType(IddObjectType::Output_Schedules);
+    EXPECT_EQ(1u, idfObjs.size());
+    WorkspaceObject idf_schedules(idfObjs[0]);
+
+    EXPECT_EQ("Timestep", idf_schedules.getString(Output_SchedulesFields::KeyField).get());
+  }
+}
+
+TEST_F(EnergyPlusFixture, ReverseTranslator_OutputSchedules) {
+
+  ReverseTranslator rt;
+
+  Workspace w(StrictnessLevel::Minimal, IddFileType::EnergyPlus);
+
+  // Not there, Model shouldn't have it either
+  {
+    Model m = rt.translateWorkspace(w);
+    EXPECT_FALSE(m.getOptionalUniqueModelObject<OutputSchedules>());
+  }
+
+  OptionalWorkspaceObject _i_outputSchedules = w.addObject(IdfObject(IddObjectType::Output_Schedules));
+  ASSERT_TRUE(_i_outputSchedules);
+
+  // There but no keys, Model shouldn't have it either
+  {
+    Model m = rt.translateWorkspace(w);
+    EXPECT_FALSE(m.getOptionalUniqueModelObject<OutputSchedules>());
+  }
+
+  _i_outputSchedules->setString(Output_SchedulesFields::KeyField, "Hourly");
+
+  {
+    Model m = rt.translateWorkspace(w);
+    ASSERT_TRUE(m.getOptionalUniqueModelObject<OutputSchedules>());
+    auto outputSchedules = m.getUniqueModelObject<OutputSchedules>();
+    EXPECT_EQ("Hourly", outputSchedules.keyField());
+  }
+
+  _i_outputSchedules->setString(Output_SchedulesFields::KeyField, "Timestep");
+  {
+    Model m = rt.translateWorkspace(w);
+    ASSERT_TRUE(m.getOptionalUniqueModelObject<OutputSchedules>());
+    auto outputSchedules = m.getUniqueModelObject<OutputSchedules>();
+    EXPECT_EQ("Timestep", outputSchedules.keyField());
+  }
+}
diff --git a/src/model/CMakeLists.txt b/src/model/CMakeLists.txt
index ebb036adb6f..9f9c6dea088 100644
--- a/src/model/CMakeLists.txt
+++ b/src/model/CMakeLists.txt
@@ -1081,6 +1081,12 @@ set(${target_name}_src
   OutputTableSummaryReports.hpp
   OutputTableSummaryReports_Impl.hpp
   OutputTableSummaryReports.cpp
+  OutputSchedules.hpp
+  OutputSchedules_Impl.hpp
+  OutputSchedules.cpp
+  OutputConstructions.hpp
+  OutputConstructions_Impl.hpp
+  OutputConstructions.cpp
   OutsideSurfaceConvectionAlgorithm.hpp
   OutsideSurfaceConvectionAlgorithm_Impl.hpp
   OutsideSurfaceConvectionAlgorithm.cpp
@@ -2138,6 +2144,8 @@ set(${target_name}_test_src
   test/OutputMeter_GTest.cpp
   test/OutputVariable_GTest.cpp
   test/OutputTableSummaryReports_GTest.cpp
+  test/OutputSchedules_GTest.cpp
+  test/OutputConstructions_GTest.cpp
   test/ParentObject_GTest.cpp
   test/People_GTest.cpp
   test/PeopleDefinition_GTest.cpp
diff --git a/src/model/ConcreteModelObjects.hpp b/src/model/ConcreteModelObjects.hpp
index 9a4ee43b73d..e3bcb229226 100644
--- a/src/model/ConcreteModelObjects.hpp
+++ b/src/model/ConcreteModelObjects.hpp
@@ -351,6 +351,8 @@
 #include "OutputJSON.hpp"
 #include "OutputSQLite.hpp"
 #include "OutputEnvironmentalImpactFactors.hpp"
+#include "OutputSchedules.hpp"
+#include "OutputConstructions.hpp"
 #include "EnvironmentalImpactFactors.hpp"
 #include "FuelFactors.hpp"
 #include "OutputMeter.hpp"
@@ -888,6 +890,8 @@
 #include "OutputJSON_Impl.hpp"
 #include "OutputSQLite_Impl.hpp"
 #include "OutputEnvironmentalImpactFactors_Impl.hpp"
+#include "OutputSchedules_Impl.hpp"
+#include "OutputConstructions_Impl.hpp"
 #include "EnvironmentalImpactFactors_Impl.hpp"
 #include "FuelFactors_Impl.hpp"
 #include "OutputMeter_Impl.hpp"
diff --git a/src/model/Model.cpp b/src/model/Model.cpp
index 47c07b0b411..04ff91e759f 100644
--- a/src/model/Model.cpp
+++ b/src/model/Model.cpp
@@ -403,6 +403,40 @@ namespace model {
       return m_cachedOutputTableSummaryReports;
     }
 
+    boost::optional<OutputSchedules> Model_Impl::outputSchedules() const {
+      if (m_cachedOutputSchedules) {
+        return m_cachedOutputSchedules;
+      }
+
+      boost::optional<OutputSchedules> result = this->model().getOptionalUniqueModelObject<OutputSchedules>();
+      if (result) {
+        m_cachedOutputSchedules = result;
+        result->getImpl<OutputSchedules_Impl>()
+          .get()
+          ->OutputSchedules_Impl::onRemoveFromWorkspace.connect<Model_Impl, &Model_Impl::clearCachedOutputSchedules>(
+            const_cast<openstudio::model::detail::Model_Impl*>(this));
+      }
+
+      return m_cachedOutputSchedules;
+    }
+
+    boost::optional<OutputConstructions> Model_Impl::outputConstructions() const {
+      if (m_cachedOutputConstructions) {
+        return m_cachedOutputConstructions;
+      }
+
+      boost::optional<OutputConstructions> result = this->model().getOptionalUniqueModelObject<OutputConstructions>();
+      if (result) {
+        m_cachedOutputConstructions = result;
+        result->getImpl<OutputConstructions_Impl>()
+          .get()
+          ->OutputConstructions_Impl::onRemoveFromWorkspace.connect<Model_Impl, &Model_Impl::clearCachedOutputConstructions>(
+            const_cast<openstudio::model::detail::Model_Impl*>(this));
+      }
+
+      return m_cachedOutputConstructions;
+    }
+
     boost::optional<PerformancePrecisionTradeoffs> Model_Impl::performancePrecisionTradeoffs() const {
       if (m_cachedPerformancePrecisionTradeoffs) {
         return m_cachedPerformancePrecisionTradeoffs;
@@ -1517,6 +1551,8 @@ namespace model {
       clearCachedOutputSQLite(dummy);
       clearCachedOutputEnergyManagementSystem(dummy);
       clearCachedOutputTableSummaryReports(dummy);
+      clearCachedOutputSchedules(dummy);
+      clearCachedOutputConstructions(dummy);
       clearCachedPerformancePrecisionTradeoffs(dummy);
       clearCachedLifeCycleCostParameters(dummy);
       clearCachedSizingParameters(dummy);
@@ -1595,6 +1631,14 @@ namespace model {
       m_cachedOutputTableSummaryReports.reset();
     }
 
+    void Model_Impl::clearCachedOutputSchedules(const Handle&) {
+      m_cachedOutputSchedules.reset();
+    }
+
+    void Model_Impl::clearCachedOutputConstructions(const Handle&) {
+      m_cachedOutputConstructions.reset();
+    }
+
     void Model_Impl::clearCachedPerformancePrecisionTradeoffs(const Handle&) {
       m_cachedPerformancePrecisionTradeoffs.reset();
     }
@@ -1920,6 +1964,14 @@ namespace model {
     return getImpl<detail::Model_Impl>()->outputTableSummaryReports();
   }
 
+  boost::optional<OutputSchedules> Model::outputSchedules() const {
+    return getImpl<detail::Model_Impl>()->outputSchedules();
+  }
+
+  boost::optional<OutputConstructions> Model::outputConstructions() const {
+    return getImpl<detail::Model_Impl>()->outputConstructions();
+  }
+
   boost::optional<PerformancePrecisionTradeoffs> Model::performancePrecisionTradeoffs() const {
     return getImpl<detail::Model_Impl>()->performancePrecisionTradeoffs();
   }
@@ -3485,6 +3537,24 @@ namespace model {
     }
   }
 
+  template <>
+  OutputSchedules Model::getUniqueModelObject<OutputSchedules>() {
+    if (boost::optional<OutputSchedules> _b = outputSchedules()) {
+      return _b.get();
+    } else {
+      return OutputSchedules(*this);
+    }
+  }
+
+  template <>
+  OutputConstructions Model::getUniqueModelObject<OutputConstructions>() {
+    if (boost::optional<OutputConstructions> _b = outputConstructions()) {
+      return _b.get();
+    } else {
+      return OutputConstructions(*this);
+    }
+  }
+
   template <>
   PerformancePrecisionTradeoffs Model::getUniqueModelObject<PerformancePrecisionTradeoffs>() {
     if (boost::optional<PerformancePrecisionTradeoffs> _p = performancePrecisionTradeoffs()) {
@@ -4121,6 +4191,8 @@ namespace model {
     REGISTER_CONSTRUCTOR(OutputJSON);
     REGISTER_CONSTRUCTOR(OutputSQLite);
     REGISTER_CONSTRUCTOR(OutputEnvironmentalImpactFactors);
+    REGISTER_CONSTRUCTOR(OutputSchedules);
+    REGISTER_CONSTRUCTOR(OutputConstructions);
     REGISTER_CONSTRUCTOR(EnvironmentalImpactFactors);
     REGISTER_CONSTRUCTOR(FuelFactors);
     REGISTER_CONSTRUCTOR(OutputMeter);
@@ -4678,6 +4750,8 @@ namespace model {
     REGISTER_COPYCONSTRUCTORS(OutputJSON);
     REGISTER_COPYCONSTRUCTORS(OutputSQLite);
     REGISTER_COPYCONSTRUCTORS(OutputEnvironmentalImpactFactors);
+    REGISTER_COPYCONSTRUCTORS(OutputSchedules);
+    REGISTER_COPYCONSTRUCTORS(OutputConstructions);
     REGISTER_COPYCONSTRUCTORS(EnvironmentalImpactFactors);
     REGISTER_COPYCONSTRUCTORS(FuelFactors);
     REGISTER_COPYCONSTRUCTORS(OutputMeter);
diff --git a/src/model/Model.hpp b/src/model/Model.hpp
index 6f20788120c..6f1a2ab7f30 100644
--- a/src/model/Model.hpp
+++ b/src/model/Model.hpp
@@ -60,6 +60,8 @@ namespace model {
   class OutputSQLite;
   class OutputEnergyManagementSystem;
   class OutputTableSummaryReports;
+  class OutputSchedules;
+  class OutputConstructions;
   class PerformancePrecisionTradeoffs;
   class LifeCycleCostParameters;
   class SizingParameters;
@@ -192,6 +194,14 @@ namespace model {
    *  object which can be significantly faster than calling getOptionalUniqueModelObject<OutputTableSummaryReports>(). */
     boost::optional<OutputTableSummaryReports> outputTableSummaryReports() const;
 
+    /** Get the OutputSchedules object if there is one, this implementation uses a cached reference to the OutputSchedules
+   *  object which can be significantly faster than calling getOptionalUniqueModelObject<OutputSchedules>(). */
+    boost::optional<OutputSchedules> outputSchedules() const;
+
+    /** Get the OutputConstructions object if there is one, this implementation uses a cached reference to the OutputConstructions
+   *  object which can be significantly faster than calling getOptionalUniqueModelObject<OutputConstructions>(). */
+    boost::optional<OutputConstructions> outputConstructions() const;
+
     /** Get the PerformancePrecisionTradeoffs object if there is one, this implementation uses a cached reference to the PerformancePrecisionTradeoffs
    *  object which can be significantly faster than calling getOptionalUniqueModelObject<PerformancePrecisionTradeoffs>(). */
     boost::optional<PerformancePrecisionTradeoffs> performancePrecisionTradeoffs() const;
@@ -720,6 +730,12 @@ namespace model {
   template <>
   MODEL_API OutputTableSummaryReports Model::getUniqueModelObject<OutputTableSummaryReports>();
 
+  template <>
+  MODEL_API OutputSchedules Model::getUniqueModelObject<OutputSchedules>();
+
+  template <>
+  MODEL_API OutputConstructions Model::getUniqueModelObject<OutputConstructions>();
+
   template <>
   MODEL_API PerformancePrecisionTradeoffs Model::getUniqueModelObject<PerformancePrecisionTradeoffs>();
 
diff --git a/src/model/ModelCore.i b/src/model/ModelCore.i
index 3fa122a8104..c3a928e6dc5 100644
--- a/src/model/ModelCore.i
+++ b/src/model/ModelCore.i
@@ -42,6 +42,8 @@
   %ignore openstudio::model::Model::outputJSON;
   %ignore openstudio::model::Model::outputSQLite;
   %ignore openstudio::model::Model::outputTableSummaryReports;
+  %ignore openstudio::model::Model::outputSchedules;
+  %ignore openstudio::model::Model::outputConstructions;
   %ignore openstudio::model::Model::outsideSurfaceConvectionAlgorithm;
   %ignore openstudio::model::Model::performancePrecisionTradeoffs;
   %ignore openstudio::model::Model::runPeriodControlDaylightSavingTime;
diff --git a/src/model/ModelSimulation.i b/src/model/ModelSimulation.i
index d5aa0a84dd1..54ed944ef71 100644
--- a/src/model/ModelSimulation.i
+++ b/src/model/ModelSimulation.i
@@ -79,6 +79,8 @@ UNIQUEMODELOBJECT_TEMPLATES(OutputDebuggingData);
 UNIQUEMODELOBJECT_TEMPLATES(OutputDiagnostics);
 UNIQUEMODELOBJECT_TEMPLATES(OutputJSON);
 UNIQUEMODELOBJECT_TEMPLATES(OutputSQLite);
+UNIQUEMODELOBJECT_TEMPLATES(OutputSchedules);
+UNIQUEMODELOBJECT_TEMPLATES(OutputConstructions);
 MODELOBJECT_TEMPLATES(OutputEnvironmentalImpactFactors);
 UNIQUEMODELOBJECT_TEMPLATES(EnvironmentalImpactFactors);
 MODELOBJECT_TEMPLATES(FuelFactors);
@@ -129,6 +131,8 @@ SWIG_UNIQUEMODELOBJECT(OutputDebuggingData);
 SWIG_UNIQUEMODELOBJECT(OutputDiagnostics);
 SWIG_UNIQUEMODELOBJECT(OutputJSON);
 SWIG_UNIQUEMODELOBJECT(OutputSQLite);
+SWIG_UNIQUEMODELOBJECT(OutputSchedules);
+SWIG_UNIQUEMODELOBJECT(OutputConstructions);
 SWIG_MODELOBJECT(OutputEnvironmentalImpactFactors, 1);
 SWIG_UNIQUEMODELOBJECT(EnvironmentalImpactFactors);
 SWIG_MODELOBJECT(FuelFactors, 1);
@@ -226,6 +230,14 @@ SWIG_UNIQUEMODELOBJECT(PerformancePrecisionTradeoffs);
           return model.outputTableSummaryReports();
         }
 
+        boost::optional<OutputSchedules> outputSchedules(const openstudio::model::Model& model) {
+          return model.outputSchedules();
+        }
+
+        boost::optional<OutputConstructions> outputConstructions(const openstudio::model::Model& model) {
+          return model.outputConstructions();
+        }
+
         boost::optional<OutsideSurfaceConvectionAlgorithm> outsideSurfaceConvectionAlgorithm(const openstudio::model::Model& model) {
           return model.outsideSurfaceConvectionAlgorithm();
         }
@@ -385,6 +397,14 @@ SWIG_UNIQUEMODELOBJECT(PerformancePrecisionTradeoffs);
         return OpenStudio.OpenStudioModelSimulation.outputTableSummaryReports(this);
       }
 
+      public OptionalOutputSchedules outputSchedules() {
+        return OpenStudio.OpenStudioModelSimulation.outputSchedules(this);
+      }
+
+      public OptionalOutputConstructions outputConstructions() {
+        return OpenStudio.OpenStudioModelSimulation.outputConstructions(this);
+      }
+
       public OptionalOutsideSurfaceConvectionAlgorithm outsideSurfaceConvectionAlgorithm() {
         return OpenStudio.OpenStudioModelSimulation.outsideSurfaceConvectionAlgorithm(this);
       }
diff --git a/src/model/Model_Impl.hpp b/src/model/Model_Impl.hpp
index 3aaf9cbb63d..c19c75bd4d2 100644
--- a/src/model/Model_Impl.hpp
+++ b/src/model/Model_Impl.hpp
@@ -42,6 +42,8 @@
 #include "OutputSQLite.hpp"
 #include "OutputEnergyManagementSystem.hpp"
 #include "OutputTableSummaryReports.hpp"
+#include "OutputSchedules.hpp"
+#include "OutputConstructions.hpp"
 #include "PerformancePrecisionTradeoffs.hpp"
 #include "LifeCycleCostParameters.hpp"
 #include "SizingParameters.hpp"
@@ -216,6 +218,14 @@ namespace model {
      *  object which can be significantly faster than calling getOptionalUniqueModelObject<OutputTableSummaryReports>(). */
       boost::optional<OutputTableSummaryReports> outputTableSummaryReports() const;
 
+      /** Get the OutputSchedules object if there is one, this implementation uses a cached reference to the OutputSchedules
+     *  object which can be significantly faster than calling getOptionalUniqueModelObject<OutputSchedules>(). */
+      boost::optional<OutputSchedules> outputSchedules() const;
+
+      /** Get the OutputConstructions object if there is one, this implementation uses a cached reference to the OutputConstructions
+     *  object which can be significantly faster than calling getOptionalUniqueModelObject<OutputConstructions>(). */
+      boost::optional<OutputConstructions> outputConstructions() const;
+
       /** Get the PerformancePrecisionTradeoffs object if there is one, this implementation uses a cached reference to the PerformancePrecisionTradeoffs
      *  object which can be significantly faster than calling getOptionalUniqueModelObject<PerformancePrecisionTradeoffs>(). */
       boost::optional<PerformancePrecisionTradeoffs> performancePrecisionTradeoffs() const;
@@ -481,6 +491,8 @@ namespace model {
       mutable boost::optional<OutputSQLite> m_cachedOutputSQLite;
       mutable boost::optional<OutputEnergyManagementSystem> m_cachedOutputEnergyManagementSystem;
       mutable boost::optional<OutputTableSummaryReports> m_cachedOutputTableSummaryReports;
+      mutable boost::optional<OutputSchedules> m_cachedOutputSchedules;
+      mutable boost::optional<OutputConstructions> m_cachedOutputConstructions;
       mutable boost::optional<PerformancePrecisionTradeoffs> m_cachedPerformancePrecisionTradeoffs;
       mutable boost::optional<LifeCycleCostParameters> m_cachedLifeCycleCostParameters;
       mutable boost::optional<SizingParameters> m_cachedSizingParameters;
@@ -528,6 +540,8 @@ namespace model {
       void clearCachedOutputSQLite(const Handle& handle);
       void clearCachedOutputEnergyManagementSystem(const Handle& handle);
       void clearCachedOutputTableSummaryReports(const Handle& handle);
+      void clearCachedOutputSchedules(const Handle& handle);
+      void clearCachedOutputConstructions(const Handle& handle);
       void clearCachedPerformancePrecisionTradeoffs(const Handle& handle);
       void clearCachedLifeCycleCostParameters(const Handle& handle);
       void clearCachedSizingParameters(const Handle& handle);
diff --git a/src/model/OutputConstructions.cpp b/src/model/OutputConstructions.cpp
new file mode 100644
index 00000000000..f2cbdf53fae
--- /dev/null
+++ b/src/model/OutputConstructions.cpp
@@ -0,0 +1,120 @@
+/***********************************************************************************************************************
+*  OpenStudio(R), Copyright (c) 2008-2022, Alliance for Sustainable Energy, LLC, and other contributors. All rights reserved.
+*
+*  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
+*  following conditions are met:
+*
+*  (1) Redistributions of source code must retain the above copyright notice, this list of conditions and the following
+*  disclaimer.
+*
+*  (2) Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
+*  disclaimer in the documentation and/or other materials provided with the distribution.
+*
+*  (3) Neither the name of the copyright holder nor the names of any contributors may be used to endorse or promote products
+*  derived from this software without specific prior written permission from the respective party.
+*
+*  (4) Other than as required in clauses (1) and (2), distributions in any form of modifications or other derivative works
+*  may not use the "OpenStudio" trademark, "OS", "os", or any other confusingly similar designation without specific prior
+*  written permission from Alliance for Sustainable Energy, LLC.
+*
+*  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+*  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+*  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE UNITED STATES GOVERNMENT, OR THE UNITED
+*  STATES DEPARTMENT OF ENERGY, NOR ANY OF THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+*  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+*  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+*  STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+*  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************************************************************/
+
+#include "OutputConstructions.hpp"
+#include "OutputConstructions_Impl.hpp"
+
+#include "Model.hpp"
+#include "Model_Impl.hpp"
+
+#include <utilities/idd/IddFactory.hxx>
+#include <utilities/idd/IddEnums.hxx>
+#include <utilities/idd/OS_Output_Constructions_FieldEnums.hxx>
+
+#include "../utilities/idf/WorkspaceExtensibleGroup.hpp"
+#include "../utilities/core/Assert.hpp"
+
+namespace openstudio {
+namespace model {
+
+  namespace detail {
+
+    OutputConstructions_Impl::OutputConstructions_Impl(const IdfObject& idfObject, Model_Impl* model, bool keepHandle)
+      : ModelObject_Impl(idfObject, model, keepHandle) {
+      OS_ASSERT(idfObject.iddObject().type() == OutputConstructions::iddObjectType());
+    }
+
+    OutputConstructions_Impl::OutputConstructions_Impl(const openstudio::detail::WorkspaceObject_Impl& other, Model_Impl* model, bool keepHandle)
+      : ModelObject_Impl(other, model, keepHandle) {
+      OS_ASSERT(other.iddObject().type() == OutputConstructions::iddObjectType());
+    }
+
+    OutputConstructions_Impl::OutputConstructions_Impl(const OutputConstructions_Impl& other, Model_Impl* model, bool keepHandle)
+      : ModelObject_Impl(other, model, keepHandle) {}
+
+    const std::vector<std::string>& OutputConstructions_Impl::outputVariableNames() const {
+      static const std::vector<std::string> result;
+      return result;
+    }
+
+    IddObjectType OutputConstructions_Impl::iddObjectType() const {
+      return OutputConstructions::iddObjectType();
+    }
+
+    bool OutputConstructions_Impl::reportConstructions() const {
+      return getBooleanFieldValue(OS_Output_ConstructionsFields::ReportConstructions);
+    }
+
+    bool OutputConstructions_Impl::reportMaterials() const {
+      return getBooleanFieldValue(OS_Output_ConstructionsFields::ReportMaterials);
+    }
+
+    bool OutputConstructions_Impl::setReportConstructions(bool reportConstructions) {
+      return setBooleanFieldValue(OS_Output_ConstructionsFields::ReportConstructions, reportConstructions);
+    }
+
+    bool OutputConstructions_Impl::setReportMaterials(bool reportMaterials) {
+      return setBooleanFieldValue(OS_Output_ConstructionsFields::ReportMaterials, reportMaterials);
+    }
+
+  }  // namespace detail
+
+  IddObjectType OutputConstructions::iddObjectType() {
+    return {IddObjectType::OS_Output_Constructions};
+  }
+
+  bool OutputConstructions::reportConstructions() const {
+    return getImpl<detail::OutputConstructions_Impl>()->reportConstructions();
+  }
+
+  bool OutputConstructions::reportMaterials() const {
+    return getImpl<detail::OutputConstructions_Impl>()->reportMaterials();
+  }
+
+  bool OutputConstructions::setReportConstructions(bool reportConstructions) {
+    return getImpl<detail::OutputConstructions_Impl>()->setReportConstructions(reportConstructions);
+  }
+
+  bool OutputConstructions::setReportMaterials(bool reportMaterials) {
+    return getImpl<detail::OutputConstructions_Impl>()->setReportMaterials(reportMaterials);
+  }
+
+  /// @cond
+  OutputConstructions::OutputConstructions(std::shared_ptr<detail::OutputConstructions_Impl> impl) : ModelObject(std::move(impl)) {}
+  OutputConstructions::OutputConstructions(Model& model) : ModelObject(OutputConstructions::iddObjectType(), model) {
+    bool ok = setReportConstructions(true);
+    OS_ASSERT(ok);
+    ok = setReportMaterials(false);
+    OS_ASSERT(ok);
+  }
+
+  /// @endcond
+
+}  // namespace model
+}  // namespace openstudio
diff --git a/src/model/OutputConstructions.hpp b/src/model/OutputConstructions.hpp
new file mode 100644
index 00000000000..8f4577c3216
--- /dev/null
+++ b/src/model/OutputConstructions.hpp
@@ -0,0 +1,104 @@
+/***********************************************************************************************************************
+*  OpenStudio(R), Copyright (c) 2008-2022, Alliance for Sustainable Energy, LLC, and other contributors. All rights reserved.
+*
+*  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
+*  following conditions are met:
+*
+*  (1) Redistributions of source code must retain the above copyright notice, this list of conditions and the following
+*  disclaimer.
+*
+*  (2) Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
+*  disclaimer in the documentation and/or other materials provided with the distribution.
+*
+*  (3) Neither the name of the copyright holder nor the names of any contributors may be used to endorse or promote products
+*  derived from this software without specific prior written permission from the respective party.
+*
+*  (4) Other than as required in clauses (1) and (2), distributions in any form of modifications or other derivative works
+*  may not use the "OpenStudio" trademark, "OS", "os", or any other confusingly similar designation without specific prior
+*  written permission from Alliance for Sustainable Energy, LLC.
+*
+*  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+*  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+*  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE UNITED STATES GOVERNMENT, OR THE UNITED
+*  STATES DEPARTMENT OF ENERGY, NOR ANY OF THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+*  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+*  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+*  STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+*  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************************************************************/
+
+#ifndef MODEL_OUTPUTCONSTRUCTIONS_HPP
+#define MODEL_OUTPUTCONSTRUCTIONS_HPP
+
+#include <model/ModelAPI.hpp>
+#include "ModelObject.hpp"
+
+namespace openstudio {
+namespace model {
+
+  namespace detail {
+
+    class OutputConstructions_Impl;
+
+  }  // namespace detail
+
+  /** OutputConstructions is a ModelObject that wraps the OpenStudio IDD object 'OS:Output:Constructions'. */
+  class MODEL_API OutputConstructions : public ModelObject
+  {
+   public:
+    /** @name Constructors and Destructors */
+    //@{
+
+    virtual ~OutputConstructions() = default;
+
+    //@}
+
+    static IddObjectType iddObjectType();
+
+    /** @name Getters */
+    //@{
+
+    bool reportConstructions() const;
+
+    bool reportMaterials() const;
+
+    //@}
+    /** @name Setters */
+    //@{
+
+    bool setReportConstructions(bool reportConstructions);
+
+    bool setReportMaterials(bool reportMaterials);
+
+    //@}
+    /** @name Other */
+    //@{
+
+    //@}
+   protected:
+    /// @cond
+    using ImplType = detail::OutputConstructions_Impl;
+
+    explicit OutputConstructions(std::shared_ptr<detail::OutputConstructions_Impl> impl);
+
+    friend class detail::OutputConstructions_Impl;
+    friend class Model;
+    friend class IdfObject;
+    friend class openstudio::detail::IdfObject_Impl;
+    explicit OutputConstructions(Model& model);
+
+    /// @endcond
+   private:
+    REGISTER_LOGGER("openstudio.model.OutputConstructions");
+  };
+
+  /** \relates OutputConstructions*/
+  using OptionalOutputConstructions = boost::optional<OutputConstructions>;
+
+  /** \relates OutputConstructions*/
+  using OutputConstructionsVector = std::vector<OutputConstructions>;
+
+}  // namespace model
+}  // namespace openstudio
+
+#endif  // MODEL_OUTPUTCONSTRUCTIONS_HPP
diff --git a/src/model/OutputConstructions_Impl.hpp b/src/model/OutputConstructions_Impl.hpp
new file mode 100644
index 00000000000..5762f2852df
--- /dev/null
+++ b/src/model/OutputConstructions_Impl.hpp
@@ -0,0 +1,95 @@
+/***********************************************************************************************************************
+*  OpenStudio(R), Copyright (c) 2008-2022, Alliance for Sustainable Energy, LLC, and other contributors. All rights reserved.
+*
+*  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
+*  following conditions are met:
+*
+*  (1) Redistributions of source code must retain the above copyright notice, this list of conditions and the following
+*  disclaimer.
+*
+*  (2) Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
+*  disclaimer in the documentation and/or other materials provided with the distribution.
+*
+*  (3) Neither the name of the copyright holder nor the names of any contributors may be used to endorse or promote products
+*  derived from this software without specific prior written permission from the respective party.
+*
+*  (4) Other than as required in clauses (1) and (2), distributions in any form of modifications or other derivative works
+*  may not use the "OpenStudio" trademark, "OS", "os", or any other confusingly similar designation without specific prior
+*  written permission from Alliance for Sustainable Energy, LLC.
+*
+*  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+*  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+*  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE UNITED STATES GOVERNMENT, OR THE UNITED
+*  STATES DEPARTMENT OF ENERGY, NOR ANY OF THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+*  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+*  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+*  STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+*  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************************************************************/
+
+#ifndef MODEL_OUTPUTCONSTRUCTIONS_IMPL_HPP
+#define MODEL_OUTPUTCONSTRUCTIONS_IMPL_HPP
+
+#include <model/ModelAPI.hpp>
+#include "ModelObject_Impl.hpp"
+
+namespace openstudio {
+namespace model {
+
+  namespace detail {
+
+    /** OutputConstructions_Impl is a ModelObject_Impl that is the implementation class for OutputConstructions.*/
+    class MODEL_API OutputConstructions_Impl : public ModelObject_Impl
+    {
+     public:
+      /** @name Constructors and Destructors */
+      //@{
+
+      OutputConstructions_Impl(const IdfObject& idfObject, Model_Impl* model, bool keepHandle);
+
+      OutputConstructions_Impl(const openstudio::detail::WorkspaceObject_Impl& other, Model_Impl* model, bool keepHandle);
+
+      OutputConstructions_Impl(const OutputConstructions_Impl& other, Model_Impl* model, bool keepHandle);
+
+      virtual ~OutputConstructions_Impl() = default;
+
+      //@}
+      /** @name Virtual Methods */
+      //@{
+
+      virtual const std::vector<std::string>& outputVariableNames() const override;
+
+      virtual IddObjectType iddObjectType() const override;
+
+      //@}
+      /** @name Getters */
+      //@{
+
+      bool reportConstructions() const;
+
+      bool reportMaterials() const;
+
+      //@}
+      /** @name Setters */
+      //@{
+
+      bool setReportConstructions(bool reportConstructions);
+
+      bool setReportMaterials(bool reportMaterials);
+
+      //@}
+      /** @name Other */
+      //@{
+
+      //@}
+     protected:
+     private:
+      REGISTER_LOGGER("openstudio.model.OutputConstructions");
+    };
+
+  }  // namespace detail
+
+}  // namespace model
+}  // namespace openstudio
+
+#endif  // MODEL_OUTPUTCONSTRUCTIONS_IMPL_HPP
diff --git a/src/model/OutputSchedules.cpp b/src/model/OutputSchedules.cpp
new file mode 100644
index 00000000000..fda2b81e283
--- /dev/null
+++ b/src/model/OutputSchedules.cpp
@@ -0,0 +1,113 @@
+/***********************************************************************************************************************
+*  OpenStudio(R), Copyright (c) 2008-2022, Alliance for Sustainable Energy, LLC, and other contributors. All rights reserved.
+*
+*  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
+*  following conditions are met:
+*
+*  (1) Redistributions of source code must retain the above copyright notice, this list of conditions and the following
+*  disclaimer.
+*
+*  (2) Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
+*  disclaimer in the documentation and/or other materials provided with the distribution.
+*
+*  (3) Neither the name of the copyright holder nor the names of any contributors may be used to endorse or promote products
+*  derived from this software without specific prior written permission from the respective party.
+*
+*  (4) Other than as required in clauses (1) and (2), distributions in any form of modifications or other derivative works
+*  may not use the "OpenStudio" trademark, "OS", "os", or any other confusingly similar designation without specific prior
+*  written permission from Alliance for Sustainable Energy, LLC.
+*
+*  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+*  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+*  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE UNITED STATES GOVERNMENT, OR THE UNITED
+*  STATES DEPARTMENT OF ENERGY, NOR ANY OF THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+*  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+*  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+*  STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+*  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************************************************************/
+
+#include "OutputSchedules.hpp"
+#include "OutputSchedules_Impl.hpp"
+
+#include "Model.hpp"
+#include "Model_Impl.hpp"
+
+#include <utilities/idd/IddFactory.hxx>
+#include <utilities/idd/IddEnums.hxx>
+#include <utilities/idd/OS_Output_Schedules_FieldEnums.hxx>
+
+#include "../utilities/idf/WorkspaceExtensibleGroup.hpp"
+#include "../utilities/core/Assert.hpp"
+
+namespace openstudio {
+namespace model {
+
+  namespace detail {
+
+    OutputSchedules_Impl::OutputSchedules_Impl(const IdfObject& idfObject, Model_Impl* model, bool keepHandle)
+      : ModelObject_Impl(idfObject, model, keepHandle) {
+      OS_ASSERT(idfObject.iddObject().type() == OutputSchedules::iddObjectType());
+    }
+
+    OutputSchedules_Impl::OutputSchedules_Impl(const openstudio::detail::WorkspaceObject_Impl& other, Model_Impl* model, bool keepHandle)
+      : ModelObject_Impl(other, model, keepHandle) {
+      OS_ASSERT(other.iddObject().type() == OutputSchedules::iddObjectType());
+    }
+
+    OutputSchedules_Impl::OutputSchedules_Impl(const OutputSchedules_Impl& other, Model_Impl* model, bool keepHandle)
+      : ModelObject_Impl(other, model, keepHandle) {}
+
+    const std::vector<std::string>& OutputSchedules_Impl::outputVariableNames() const {
+      static const std::vector<std::string> result;
+      return result;
+    }
+
+    IddObjectType OutputSchedules_Impl::iddObjectType() const {
+      return OutputSchedules::iddObjectType();
+    }
+
+    std::string OutputSchedules_Impl::keyField() const {
+      boost::optional<std::string> value = getString(OS_Output_SchedulesFields::KeyField, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    bool OutputSchedules_Impl::setKeyField(const std::string& keyField) {
+      bool result = setString(OS_Output_SchedulesFields::KeyField, keyField);
+      return result;
+    }
+
+  }  // namespace detail
+
+  IddObjectType OutputSchedules::iddObjectType() {
+    return {IddObjectType::OS_Output_Schedules};
+  }
+
+  std::vector<std::string> OutputSchedules::keyFieldValues() {
+    return getIddKeyNames(IddFactory::instance().getObject(iddObjectType()).get(), OS_Output_SchedulesFields::KeyField);
+  }
+
+  std::vector<std::string> OutputSchedules::validKeyFieldValues() {
+    return keyFieldValues();
+  }
+
+  std::string OutputSchedules::keyField() const {
+    return getImpl<detail::OutputSchedules_Impl>()->keyField();
+  }
+
+  bool OutputSchedules::setKeyField(const std::string& keyField) {
+    return getImpl<detail::OutputSchedules_Impl>()->setKeyField(keyField);
+  }
+
+  /// @cond
+  OutputSchedules::OutputSchedules(std::shared_ptr<detail::OutputSchedules_Impl> impl) : ModelObject(impl) {}
+  OutputSchedules::OutputSchedules(Model& model) : ModelObject(OutputSchedules::iddObjectType(), model) {
+    bool ok = setKeyField("Hourly");
+    OS_ASSERT(ok);
+  }
+
+  /// @endcond
+
+}  // namespace model
+}  // namespace openstudio
diff --git a/src/model/OutputSchedules.hpp b/src/model/OutputSchedules.hpp
new file mode 100644
index 00000000000..21b01358152
--- /dev/null
+++ b/src/model/OutputSchedules.hpp
@@ -0,0 +1,103 @@
+/***********************************************************************************************************************
+*  OpenStudio(R), Copyright (c) 2008-2022, Alliance for Sustainable Energy, LLC, and other contributors. All rights reserved.
+*
+*  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
+*  following conditions are met:
+*
+*  (1) Redistributions of source code must retain the above copyright notice, this list of conditions and the following
+*  disclaimer.
+*
+*  (2) Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
+*  disclaimer in the documentation and/or other materials provided with the distribution.
+*
+*  (3) Neither the name of the copyright holder nor the names of any contributors may be used to endorse or promote products
+*  derived from this software without specific prior written permission from the respective party.
+*
+*  (4) Other than as required in clauses (1) and (2), distributions in any form of modifications or other derivative works
+*  may not use the "OpenStudio" trademark, "OS", "os", or any other confusingly similar designation without specific prior
+*  written permission from Alliance for Sustainable Energy, LLC.
+*
+*  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+*  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+*  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE UNITED STATES GOVERNMENT, OR THE UNITED
+*  STATES DEPARTMENT OF ENERGY, NOR ANY OF THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+*  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+*  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+*  STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+*  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************************************************************/
+
+#ifndef MODEL_OUTPUTSCHEDULES_HPP
+#define MODEL_OUTPUTSCHEDULES_HPP
+
+#include <model/ModelAPI.hpp>
+#include "ModelObject.hpp"
+
+namespace openstudio {
+namespace model {
+
+  namespace detail {
+
+    class OutputSchedules_Impl;
+
+  }  // namespace detail
+
+  /** OutputSchedules is a ModelObject that wraps the OpenStudio IDD object 'OS:Output:Schedules'. */
+  class MODEL_API OutputSchedules : public ModelObject
+  {
+   public:
+    /** @name Constructors and Destructors */
+    //@{
+
+    virtual ~OutputSchedules() = default;
+
+    //@}
+
+    static IddObjectType iddObjectType();
+
+    static std::vector<std::string> keyFieldValues();
+    static std::vector<std::string> validKeyFieldValues();
+
+    /** @name Getters */
+    //@{
+
+    std::string keyField() const;
+
+    //@}
+    /** @name Setters */
+    //@{
+
+    bool setKeyField(const std::string& keyField);
+
+    //@}
+    /** @name Other */
+    //@{
+
+    //@}
+   protected:
+    /// @cond
+    using ImplType = detail::OutputSchedules_Impl;
+
+    explicit OutputSchedules(std::shared_ptr<detail::OutputSchedules_Impl> impl);
+
+    friend class detail::OutputSchedules_Impl;
+    friend class Model;
+    friend class IdfObject;
+    friend class openstudio::detail::IdfObject_Impl;
+    explicit OutputSchedules(Model& model);
+
+    /// @endcond
+   private:
+    REGISTER_LOGGER("openstudio.model.OutputSchedules");
+  };
+
+  /** \relates OutputSchedules*/
+  using OptionalOutputSchedules = boost::optional<OutputSchedules>;
+
+  /** \relates OutputSchedules*/
+  using OutputSchedulesVector = std::vector<OutputSchedules>;
+
+}  // namespace model
+}  // namespace openstudio
+
+#endif  // MODEL_OUTPUTSCHEDULES_HPP
diff --git a/src/model/OutputSchedules_Impl.hpp b/src/model/OutputSchedules_Impl.hpp
new file mode 100644
index 00000000000..3306ed728c0
--- /dev/null
+++ b/src/model/OutputSchedules_Impl.hpp
@@ -0,0 +1,91 @@
+/***********************************************************************************************************************
+*  OpenStudio(R), Copyright (c) 2008-2022, Alliance for Sustainable Energy, LLC, and other contributors. All rights reserved.
+*
+*  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
+*  following conditions are met:
+*
+*  (1) Redistributions of source code must retain the above copyright notice, this list of conditions and the following
+*  disclaimer.
+*
+*  (2) Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
+*  disclaimer in the documentation and/or other materials provided with the distribution.
+*
+*  (3) Neither the name of the copyright holder nor the names of any contributors may be used to endorse or promote products
+*  derived from this software without specific prior written permission from the respective party.
+*
+*  (4) Other than as required in clauses (1) and (2), distributions in any form of modifications or other derivative works
+*  may not use the "OpenStudio" trademark, "OS", "os", or any other confusingly similar designation without specific prior
+*  written permission from Alliance for Sustainable Energy, LLC.
+*
+*  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+*  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+*  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE UNITED STATES GOVERNMENT, OR THE UNITED
+*  STATES DEPARTMENT OF ENERGY, NOR ANY OF THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+*  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+*  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+*  STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+*  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************************************************************/
+
+#ifndef MODEL_OUTPUTSCHEDULES_IMPL_HPP
+#define MODEL_OUTPUTSCHEDULES_IMPL_HPP
+
+#include <model/ModelAPI.hpp>
+#include "ModelObject_Impl.hpp"
+
+namespace openstudio {
+namespace model {
+
+  namespace detail {
+
+    /** OutputSchedules_Impl is a ModelObject_Impl that is the implementation class for OutputSchedules.*/
+    class MODEL_API OutputSchedules_Impl : public ModelObject_Impl
+    {
+     public:
+      /** @name Constructors and Destructors */
+      //@{
+
+      OutputSchedules_Impl(const IdfObject& idfObject, Model_Impl* model, bool keepHandle);
+
+      OutputSchedules_Impl(const openstudio::detail::WorkspaceObject_Impl& other, Model_Impl* model, bool keepHandle);
+
+      OutputSchedules_Impl(const OutputSchedules_Impl& other, Model_Impl* model, bool keepHandle);
+
+      virtual ~OutputSchedules_Impl() = default;
+
+      //@}
+      /** @name Virtual Methods */
+      //@{
+
+      virtual const std::vector<std::string>& outputVariableNames() const override;
+
+      virtual IddObjectType iddObjectType() const override;
+
+      //@}
+      /** @name Getters */
+      //@{
+
+      std::string keyField() const;
+
+      //@}
+      /** @name Setters */
+      //@{
+
+      bool setKeyField(const std::string& keyField);
+
+      //@}
+      /** @name Other */
+      //@{
+
+      //@}
+     protected:
+     private:
+      REGISTER_LOGGER("openstudio.model.OutputSchedules");
+    };
+
+  }  // namespace detail
+
+}  // namespace model
+}  // namespace openstudio
+
+#endif  // MODEL_OUTPUTSCHEDULES_IMPL_HPP


Test patch:
diff --git a/src/model/test/OutputConstructions_GTest.cpp b/src/model/test/OutputConstructions_GTest.cpp
new file mode 100644
index 00000000000..e16b42824aa
--- /dev/null
+++ b/src/model/test/OutputConstructions_GTest.cpp
@@ -0,0 +1,50 @@
+/***********************************************************************************************************************
+*  OpenStudio(R), Copyright (c) 2008-2022, Alliance for Sustainable Energy, LLC, and other contributors. All rights reserved.
+*
+*  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
+*  following conditions are met:
+*
+*  (1) Redistributions of source code must retain the above copyright notice, this list of conditions and the following
+*  disclaimer.
+*
+*  (2) Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
+*  disclaimer in the documentation and/or other materials provided with the distribution.
+*
+*  (3) Neither the name of the copyright holder nor the names of any contributors may be used to endorse or promote products
+*  derived from this software without specific prior written permission from the respective party.
+*
+*  (4) Other than as required in clauses (1) and (2), distributions in any form of modifications or other derivative works
+*  may not use the "OpenStudio" trademark, "OS", "os", or any other confusingly similar designation without specific prior
+*  written permission from Alliance for Sustainable Energy, LLC.
+*
+*  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+*  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+*  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE UNITED STATES GOVERNMENT, OR THE UNITED
+*  STATES DEPARTMENT OF ENERGY, NOR ANY OF THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+*  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+*  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+*  STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+*  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************************************************************/
+#include <gtest/gtest.h>
+
+#include "ModelFixture.hpp"
+#include "../OutputConstructions.hpp"
+#include "../OutputConstructions_Impl.hpp"
+
+using namespace openstudio;
+using namespace openstudio::model;
+
+TEST_F(ModelFixture, OutputConstructions_GettersSetters) {
+  Model m;
+  OutputConstructions mo = m.getUniqueModelObject<OutputConstructions>();
+
+  EXPECT_TRUE(mo.reportConstructions());
+  EXPECT_FALSE(mo.reportMaterials());
+
+  EXPECT_TRUE(mo.setReportConstructions(false));
+  EXPECT_TRUE(mo.setReportMaterials(true));
+
+  EXPECT_FALSE(mo.reportConstructions());
+  EXPECT_TRUE(mo.reportMaterials());
+}  // End of Getter_Setters test
diff --git a/src/model/test/OutputSchedules_GTest.cpp b/src/model/test/OutputSchedules_GTest.cpp
new file mode 100644
index 00000000000..d860c56e793
--- /dev/null
+++ b/src/model/test/OutputSchedules_GTest.cpp
@@ -0,0 +1,49 @@
+/***********************************************************************************************************************
+*  OpenStudio(R), Copyright (c) 2008-2022, Alliance for Sustainable Energy, LLC, and other contributors. All rights reserved.
+*
+*  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
+*  following conditions are met:
+*
+*  (1) Redistributions of source code must retain the above copyright notice, this list of conditions and the following
+*  disclaimer.
+*
+*  (2) Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
+*  disclaimer in the documentation and/or other materials provided with the distribution.
+*
+*  (3) Neither the name of the copyright holder nor the names of any contributors may be used to endorse or promote products
+*  derived from this software without specific prior written permission from the respective party.
+*
+*  (4) Other than as required in clauses (1) and (2), distributions in any form of modifications or other derivative works
+*  may not use the "OpenStudio" trademark, "OS", "os", or any other confusingly similar designation without specific prior
+*  written permission from Alliance for Sustainable Energy, LLC.
+*
+*  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+*  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+*  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE UNITED STATES GOVERNMENT, OR THE UNITED
+*  STATES DEPARTMENT OF ENERGY, NOR ANY OF THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+*  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+*  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+*  STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+*  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************************************************************/
+#include <gtest/gtest.h>
+
+#include "ModelFixture.hpp"
+#include "../OutputSchedules.hpp"
+#include "../OutputSchedules_Impl.hpp"
+
+using namespace openstudio;
+using namespace openstudio::model;
+
+TEST_F(ModelFixture, OutputSchedules_GettersSetters) {
+  Model m;
+  OutputSchedules mo = m.getUniqueModelObject<OutputSchedules>();
+
+  EXPECT_EQ("Hourly", mo.keyField());
+
+  EXPECT_TRUE(mo.setKeyField("Timestep"));
+  EXPECT_EQ("Timestep", mo.keyField());
+
+  EXPECT_FALSE(mo.setKeyField("Invalid"));
+  EXPECT_EQ("Timestep", mo.keyField());
+}  // End of Getter_Setters test
diff --git a/src/model/test/UniqueModelObject_GTest.cpp b/src/model/test/UniqueModelObject_GTest.cpp
index ea6c604c7ce..0db75e8afbb 100644
--- a/src/model/test/UniqueModelObject_GTest.cpp
+++ b/src/model/test/UniqueModelObject_GTest.cpp
@@ -70,6 +70,10 @@
 #include "../OutputJSON_Impl.hpp"
 #include "../OutputSQLite.hpp"
 #include "../OutputSQLite_Impl.hpp"
+#include "../OutputSchedules.hpp"
+#include "../OutputSchedules_Impl.hpp"
+#include "../OutputConstructions.hpp"
+#include "../OutputConstructions_Impl.hpp"
 #include "../PerformancePrecisionTradeoffs.hpp"
 #include "../PerformancePrecisionTradeoffs_Impl.hpp"
 #include "../RadianceParameters.hpp"
@@ -547,6 +551,56 @@ TEST_F(ModelFixture, OutputSQLite_UniqueModelObject_Clone) {
   EXPECT_EQ("! Custom Object", outputSQLiteClone2.comment());
 }
 
+TEST_F(ModelFixture, OutputSchedules_UniqueModelObject_Clone) {
+  // create a model to use
+  Model model;
+
+  // Get the Unique ModelObject
+  EXPECT_FALSE(model.getOptionalUniqueModelObject<OutputSchedules>());
+  OutputSchedules outputSchedules = model.getUniqueModelObject<OutputSchedules>();
+  EXPECT_TRUE(model.getOptionalUniqueModelObject<OutputSchedules>());
+  // We use a comment to see if cloning to another model works
+  outputSchedules.setComment("Custom Object");
+
+  // clone it into the same model
+  OutputSchedules outputSchedulesClone = outputSchedules.clone(model).cast<OutputSchedules>();
+  // UniqueModelObject: should be the same as the original
+  EXPECT_EQ(outputSchedules, outputSchedulesClone);
+  EXPECT_EQ("! Custom Object", outputSchedulesClone.comment());
+
+  // clone it into a different model
+  Model model2;
+  EXPECT_FALSE(model2.getOptionalUniqueModelObject<OutputSchedules>());
+  OutputSchedules outputSchedulesClone2 = outputSchedules.clone(model2).cast<OutputSchedules>();
+  EXPECT_TRUE(model2.getOptionalUniqueModelObject<OutputSchedules>());
+  EXPECT_EQ("! Custom Object", outputSchedulesClone2.comment());
+}
+
+TEST_F(ModelFixture, OutputConstructions_UniqueModelObject_Clone) {
+  // create a model to use
+  Model model;
+
+  // Get the Unique ModelObject
+  EXPECT_FALSE(model.getOptionalUniqueModelObject<OutputConstructions>());
+  OutputConstructions outputConstructions = model.getUniqueModelObject<OutputConstructions>();
+  EXPECT_TRUE(model.getOptionalUniqueModelObject<OutputConstructions>());
+  // We use a comment to see if cloning to another model works
+  outputConstructions.setComment("Custom Object");
+
+  // clone it into the same model
+  OutputConstructions outputConstructionsClone = outputConstructions.clone(model).cast<OutputConstructions>();
+  // UniqueModelObject: should be the same as the original
+  EXPECT_EQ(outputConstructions, outputConstructionsClone);
+  EXPECT_EQ("! Custom Object", outputConstructionsClone.comment());
+
+  // clone it into a different model
+  Model model2;
+  EXPECT_FALSE(model2.getOptionalUniqueModelObject<OutputConstructions>());
+  OutputConstructions outputConstructionsClone2 = outputConstructions.clone(model2).cast<OutputConstructions>();
+  EXPECT_TRUE(model2.getOptionalUniqueModelObject<OutputConstructions>());
+  EXPECT_EQ("! Custom Object", outputConstructionsClone2.comment());
+}
+
 TEST_F(ModelFixture, PerformancePrecisionTradeoffs_UniqueModelObject_Clone) {
   // create a model to use
   Model model;