Repository: NREL/OpenStudio (language: python)

Issue:
Wrap OutputControl:Table:Style and Output:SQLite
Enhancement Request
--------------
https://github.com/NREL/EnergyPlus/pull/8474 allowed for different units between the energyplus tabular output and the output SQL file. Since the openstudio_results measure requires the SQL file in SI units, this allows for generating both the tabular output and the openstudio standard output in IP units with one run (see [this](https://unmethours.com/question/76065/output-units-of-eplustbl-and-openstudio_results/) UnmetHours question). 

It's easy enough to make the required input changes with an EnergyPlus measures, but would be _even easier_ if those objects were wrapped. Or maybe set thru a FT option? 

## Detailed Description
<!--- Provide a detailed description of the change or addition you are proposing. Include screenshot/schemas as appropriate -->

## Possible Implementation
<!--- Not mandatory, but if you can, suggest an idea for implementing the feature -->

Wrap OutputControl:Table:Style and Output:SQLite
Enhancement Request
--------------
https://github.com/NREL/EnergyPlus/pull/8474 allowed for different units between the energyplus tabular output and the output SQL file. Since the openstudio_results measure requires the SQL file in SI units, this allows for generating both the tabular output and the openstudio standard output in IP units with one run (see [this](https://unmethours.com/question/76065/output-units-of-eplustbl-and-openstudio_results/) UnmetHours question). 

It's easy enough to make the required input changes with an EnergyPlus measures, but would be _even easier_ if those objects were wrapped. Or maybe set thru a FT option? 

## Detailed Description
<!--- Provide a detailed description of the change or addition you are proposing. Include screenshot/schemas as appropriate -->

## Possible Implementation
<!--- Not mandatory, but if you can, suggest an idea for implementing the feature -->



Discussion / hints:
This would override the FT default behavior of writing:
```
OutputControl:Table:Style,
  HTML;                                   !- Column Separator

Output:SQLite,
  SimpleAndTabular;                       !- Option Type
```
which, based on the UnmetHours post, sounds OK as long as the SQL remains SI.

I'll also point out that there is currently a [setIPTabularOutput](https://github.com/NREL/OpenStudio/blob/develop/src/energyplus/ForwardTranslator.cpp#L178-L180) FT method. Perhaps use of this without changing `Output:SQLite` to _not_ use UseOutputControlTableStyle would cause issues for the openstudio results measure? Either way, it seems wrapping these two objects would provide greater flexibility.
This would override the FT default behavior of writing:
```
OutputControl:Table:Style,
  HTML;                                   !- Column Separator

Output:SQLite,
  SimpleAndTabular;                       !- Option Type
```
which, based on the UnmetHours post, sounds OK as long as the SQL remains SI.

I'll also point out that there is currently a [setIPTabularOutput](https://github.com/NREL/OpenStudio/blob/develop/src/energyplus/ForwardTranslator.cpp#L178-L180) FT method. Perhaps use of this without changing `Output:SQLite` to _not_ use UseOutputControlTableStyle would cause issues for the openstudio results measure? Either way, it seems wrapping these two objects would provide greater flexibility.

Fix patch:
diff --git a/resources/model/OpenStudio.idd b/resources/model/OpenStudio.idd
index f4a9b1d49e8..ad99daf1db9 100644
--- a/resources/model/OpenStudio.idd
+++ b/resources/model/OpenStudio.idd
@@ -34180,6 +34180,38 @@ OS:OutputControl:ReportingTolerances,
        \minimum 0
        \maximum 10
 
+OS:OutputControl:Table:Style,
+       \memo default style for the OutputControl:Table:Style is comma -- this works well for
+       \memo importing into spreadsheet programs such as Excel(tm) but not so well for word
+       \memo processing programs -- there tab may be a better choice. fixed puts spaces between
+       \memo the "columns". HTML produces tables in HTML. XML produces an XML file.
+       \memo note - if no OutputControl:Table:Style is included, the defaults are comma and None.
+       \unique-object
+   A1, \field Handle
+       \type handle
+       \required-field
+   A2, \field Column Separator
+       \type choice
+       \key Comma
+       \key Tab
+       \key Fixed
+       \key HTML
+       \key XML
+       \key CommaAndHTML
+       \key CommaAndXML
+       \key TabAndHTML
+       \key XMLandHTML
+       \key All
+       \required-field
+   A3; \field Unit Conversion
+       \type choice
+       \key None
+       \key JtoKWH
+       \key JtoMJ
+       \key JtoGJ
+       \key InchPound
+       \required-field
+
 OS:Output:Meter,
        \memo each OS:Output:Meter command picks meters to be put onto the standard output file (.eso) and
        \memo meter file (.mtr). Not all meters are reported in every simulation. A list of
@@ -34605,6 +34637,29 @@ OS:Output:JSON,
        \key No
        \required-field
 
+OS:Output:SQLite,
+       \memo Output from EnergyPlus can be written to an SQLite format file.
+       \unique-object
+  A1,  \field Handle
+       \type handle
+       \required-field
+  A2,  \field Option Type
+       \type choice
+       \key Simple
+       \key SimpleAndTabular
+       \required-field
+  A3;  \field Unit Conversion for Tabular Data
+       \type choice
+       \note Unit conversion option used when writing SQLite Tabular Data
+       \note This option applies to TabularData and TabularDatawithString in the SQLite file
+       \key UseOutputControlTableStyle
+       \key None
+       \key JtoKWH
+       \key JtoMJ
+       \key JtoGJ
+       \key InchPound
+       \required-field
+
 OS:Output:EnergyManagementSystem,
    \memo This object is used to control the output produced by the Energy Management System
    \unique-object
diff --git a/src/energyplus/CMakeLists.txt b/src/energyplus/CMakeLists.txt
index 64d9c284a8c..c88ef9db11c 100644
--- a/src/energyplus/CMakeLists.txt
+++ b/src/energyplus/CMakeLists.txt
@@ -249,12 +249,14 @@ set(${target_name}_src
   ForwardTranslator/ForwardTranslateOutsideSurfaceConvectionAlgorithm.cpp
   ForwardTranslator/ForwardTranslateOutputControlFiles.cpp
   ForwardTranslator/ForwardTranslateOutputControlReportingTolerances.cpp
+  ForwardTranslator/ForwardTranslateOutputControlTableStyle.cpp
   ForwardTranslator/ForwardTranslateOutputMeter.cpp
   ForwardTranslator/ForwardTranslateOutputVariable.cpp
   ForwardTranslator/ForwardTranslateOutputDebuggingData.cpp
   ForwardTranslator/ForwardTranslateOutputDiagnostics.cpp
   ForwardTranslator/ForwardTranslateOutputEnergyManagementSystem.cpp
   ForwardTranslator/ForwardTranslateOutputJSON.cpp
+  ForwardTranslator/ForwardTranslateOutputSQLite.cpp
   ForwardTranslator/ForwardTranslateOutputEnvironmentalImpactFactors.cpp
   ForwardTranslator/ForwardTranslateEnvironmentalImpactFactors.cpp
   ForwardTranslator/ForwardTranslateFuelFactors.cpp
@@ -527,10 +529,13 @@ set(${target_name}_src
   ReverseTranslator/ReverseTranslateMeterCustomDecrement.cpp
   ReverseTranslator/ReverseTranslateOtherEquipment.cpp
   ReverseTranslator/ReverseTranslateOutputControlFiles.cpp
+  ReverseTranslator/ReverseTranslateOutputControlReportingTolerances.cpp
+  ReverseTranslator/ReverseTranslateOutputControlTableStyle.cpp
   ReverseTranslator/ReverseTranslateOutputDebuggingData.cpp
   ReverseTranslator/ReverseTranslateOutputDiagnostics.cpp
   ReverseTranslator/ReverseTranslateOutputEnergyManagementSystem.cpp
   ReverseTranslator/ReverseTranslateOutputJSON.cpp
+  ReverseTranslator/ReverseTranslateOutputSQLite.cpp
   ReverseTranslator/ReverseTranslateOutputEnvironmentalImpactFactors.cpp
   ReverseTranslator/ReverseTranslateEnvironmentalImpactFactors.cpp
   ReverseTranslator/ReverseTranslateFuelFactors.cpp
@@ -712,9 +717,12 @@ set(${target_name}_test_src
   Test/MaterialPropertyPhaseChangeHysteresis_GTest.cpp
   Test/Meter_GTest.cpp
   Test/OutputControlFiles_GTest.cpp
+  Test/OutputControlReportingTolerances_GTest.cpp
+  Test/OutputControlTableStyle_GTest.cpp
   Test/OutputDebuggingData_GTest.cpp
   Test/OutputDiagnostics_GTest.cpp
   Test/OutputJSON_GTest.cpp
+  Test/OutputSQLite_GTest.cpp
   Test/OutputEnvironmentalImpactFactors_GTest.cpp
   Test/OutputTableSummaryReports_GTest.cpp
   Test/People_GTest.cpp
diff --git a/src/energyplus/ForwardTranslator.cpp b/src/energyplus/ForwardTranslator.cpp
index 760664f1545..66e88f97728 100644
--- a/src/energyplus/ForwardTranslator.cpp
+++ b/src/energyplus/ForwardTranslator.cpp
@@ -70,6 +70,10 @@
 #include "../model/SpaceInfiltrationFlowCoefficient_Impl.hpp"
 #include "../model/ElectricEquipmentITEAirCooled.hpp"
 #include "../model/ElectricEquipmentITEAirCooled_Impl.hpp"
+#include "../model/OutputControlTableStyle.hpp"
+#include "../model/OutputControlTableStyle_Impl.hpp"
+#include "../model/OutputSQLite.hpp"
+#include "../model/OutputSQLite_Impl.hpp"
 
 #include "../utilities/idf/Workspace.hpp"
 #include "../utilities/idf/IdfExtensibleGroup.hpp"
@@ -678,7 +682,7 @@ namespace energyplus {
 
     if (fullModelTranslation) {
       // add output requests
-      this->createStandardOutputRequests();
+      this->createStandardOutputRequests(model);
     }
 
     Workspace workspace(StrictnessLevel::Minimal, IddFileType::EnergyPlus);
@@ -2299,6 +2303,11 @@ namespace energyplus {
         retVal = translateOutputControlReportingTolerances(outputControlReportingTolerances);
         break;
       }
+      case openstudio::IddObjectType::OS_OutputControl_Table_Style: {
+        model::OutputControlTableStyle outputControlTableStyle = modelObject.cast<OutputControlTableStyle>();
+        retVal = translateOutputControlTableStyle(outputControlTableStyle);
+        break;
+      }
       case openstudio::IddObjectType::OS_Output_DebuggingData: {
         auto mo = modelObject.cast<OutputDebuggingData>();
         retVal = translateOutputDebuggingData(mo);
@@ -2314,6 +2323,11 @@ namespace energyplus {
         retVal = translateOutputJSON(mo);
         break;
       }
+      case openstudio::IddObjectType::OS_Output_SQLite: {
+        auto mo = modelObject.cast<OutputSQLite>();
+        retVal = translateOutputSQLite(mo);
+        break;
+      }
       case openstudio::IddObjectType::OS_Output_EnvironmentalImpactFactors: {
         auto mo = modelObject.cast<OutputEnvironmentalImpactFactors>();
         retVal = translateOutputEnvironmentalImpactFactors(mo);
@@ -3288,9 +3302,11 @@ namespace energyplus {
     result.push_back(IddObjectType::OS_ZoneCapacitanceMultiplier_ResearchSpecial);
     result.push_back(IddObjectType::OS_OutputControl_Files);
     result.push_back(IddObjectType::OS_OutputControl_ReportingTolerances);
+    result.push_back(IddObjectType::OS_OutputControl_Table_Style);
     result.push_back(IddObjectType::OS_Output_DebuggingData);
     result.push_back(IddObjectType::OS_Output_Diagnostics);
     result.push_back(IddObjectType::OS_Output_JSON);
+    result.push_back(IddObjectType::OS_Output_SQLite);
 
     // 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);
@@ -4373,13 +4389,14 @@ namespace energyplus {
     }
   }
 
-  void ForwardTranslator::createStandardOutputRequests() {
+  void ForwardTranslator::createStandardOutputRequests(const model::Model& model) {
     if (!m_excludeHTMLOutputReport) {
-      IdfObject tableStyle(IddObjectType::OutputControl_Table_Style);
-      m_idfObjects.push_back(tableStyle);
-      tableStyle.setString(OutputControl_Table_StyleFields::ColumnSeparator, "HTML");
-      if (m_ipTabularOutput) {
-        tableStyle.setString(OutputControl_Table_StyleFields::UnitConversion, "InchPound");
+      if (!model.getOptionalUniqueModelObject<model::OutputControlTableStyle>()) {
+        IdfObject& tableStyle = m_idfObjects.emplace_back(IddObjectType::OutputControl_Table_Style);
+        tableStyle.setString(OutputControl_Table_StyleFields::ColumnSeparator, "HTML");
+        if (m_ipTabularOutput) {
+          tableStyle.setString(OutputControl_Table_StyleFields::UnitConversion, "InchPound");
+        }
       }
     }
 
@@ -4391,9 +4408,10 @@ namespace energyplus {
     }
 
     if (!m_excludeSQliteOutputReport) {
-      IdfObject sqliteOutput(IddObjectType::Output_SQLite);
-      sqliteOutput.setString(Output_SQLiteFields::OptionType, "SimpleAndTabular");
-      m_idfObjects.push_back(sqliteOutput);
+      if (!model.getOptionalUniqueModelObject<model::OutputSQLite>()) {
+        IdfObject& sqliteOutput = m_idfObjects.emplace_back(IddObjectType::Output_SQLite);
+        sqliteOutput.setString(Output_SQLiteFields::OptionType, "SimpleAndTabular");
+      }
     }
 
     // ensure at least one life cycle cost exists to prevent crash in E+ 8
diff --git a/src/energyplus/ForwardTranslator.hpp b/src/energyplus/ForwardTranslator.hpp
index 1f29c5710f7..9baf6243178 100644
--- a/src/energyplus/ForwardTranslator.hpp
+++ b/src/energyplus/ForwardTranslator.hpp
@@ -306,9 +306,11 @@ namespace model {
   class OutsideSurfaceConvectionAlgorithm;
   class OutputControlFiles;
   class OutputControlReportingTolerances;
+  class OutputControlTableStyle;
   class OutputDebuggingData;
   class OutputDiagnostics;
   class OutputJSON;
+  class OutputSQLite;
   class OutputEnvironmentalImpactFactors;
   class EnvironmentalImpactFactors;
   class FuelFactors;
@@ -1136,12 +1138,16 @@ namespace energyplus {
 
     boost::optional<IdfObject> translateOutputControlReportingTolerances(model::OutputControlReportingTolerances& modelObject);
 
+    boost::optional<IdfObject> translateOutputControlTableStyle(model::OutputControlTableStyle& modelObject);
+
     boost::optional<IdfObject> translateOutputDebuggingData(model::OutputDebuggingData& modelObject);
 
     boost::optional<IdfObject> translateOutputDiagnostics(model::OutputDiagnostics& modelObject);
 
     boost::optional<IdfObject> translateOutputJSON(model::OutputJSON& modelObject);
 
+    boost::optional<IdfObject> translateOutputSQLite(model::OutputSQLite& modelObject);
+
     boost::optional<IdfObject> translateOutputEnvironmentalImpactFactors(model::OutputEnvironmentalImpactFactors& modelObject);
 
     boost::optional<IdfObject> translateEnvironmentalImpactFactors(model::EnvironmentalImpactFactors& modelObject);
@@ -1573,7 +1579,7 @@ namespace energyplus {
     // This should be used by the various translateUnitaryFoo methods.
     void fixSPMsForUnitarySystem(const model::HVACComponent& unitary, const std::string& fanInletNodeName, const std::string& FanOutletNodeName);
 
-    void createStandardOutputRequests();
+    void createStandardOutputRequests(const model::Model& model);
 
     std::string stripOS2(const std::string& s);
 
diff --git a/src/energyplus/ForwardTranslator/ForwardTranslateOutputControlFiles.cpp b/src/energyplus/ForwardTranslator/ForwardTranslateOutputControlFiles.cpp
index f3623d18e28..b0cb846889f 100644
--- a/src/energyplus/ForwardTranslator/ForwardTranslateOutputControlFiles.cpp
+++ b/src/energyplus/ForwardTranslator/ForwardTranslateOutputControlFiles.cpp
@@ -43,8 +43,8 @@ namespace openstudio {
 namespace energyplus {
 
   boost::optional<IdfObject> ForwardTranslator::translateOutputControlFiles(OutputControlFiles& modelObject) {
-    IdfObject idfObject(openstudio::IddObjectType::OutputControl_Files);
-    m_idfObjects.push_back(idfObject);
+
+    IdfObject idfObject = createAndRegisterIdfObject(openstudio::IddObjectType::OutputControl_Files, modelObject);
 
     if (modelObject.outputCSV()) {
       idfObject.setString(OutputControl_FilesFields::OutputCSV, "Yes");
diff --git a/src/energyplus/ForwardTranslator/ForwardTranslateOutputControlReportingTolerances.cpp b/src/energyplus/ForwardTranslator/ForwardTranslateOutputControlReportingTolerances.cpp
index 35e1c80d9a6..d7d0f79714b 100644
--- a/src/energyplus/ForwardTranslator/ForwardTranslateOutputControlReportingTolerances.cpp
+++ b/src/energyplus/ForwardTranslator/ForwardTranslateOutputControlReportingTolerances.cpp
@@ -44,14 +44,8 @@ namespace openstudio {
 namespace energyplus {
 
   boost::optional<IdfObject> ForwardTranslator::translateOutputControlReportingTolerances(OutputControlReportingTolerances& modelObject) {
-    IdfObject idfObject(openstudio::IddObjectType::OutputControl_ReportingTolerances);
 
-    m_idfObjects.push_back(idfObject);
-
-    OptionalString s = modelObject.name();
-    if (s) {
-      idfObject.setName(*s);
-    }
+    IdfObject idfObject = createAndRegisterIdfObject(openstudio::IddObjectType::OutputControl_ReportingTolerances, modelObject);
 
     boost::optional<double> value;
 
@@ -63,7 +57,7 @@ namespace energyplus {
       idfObject.setDouble(OutputControl_ReportingTolerancesFields::ToleranceforTimeHeatingSetpointNotMet, value.get());
     }
 
-    return boost::optional<IdfObject>(idfObject);
+    return idfObject;
   }
 
 }  // namespace energyplus
diff --git a/src/energyplus/ForwardTranslator/ForwardTranslateOutputControlTableStyle.cpp b/src/energyplus/ForwardTranslator/ForwardTranslateOutputControlTableStyle.cpp
new file mode 100644
index 00000000000..f0098a49550
--- /dev/null
+++ b/src/energyplus/ForwardTranslator/ForwardTranslateOutputControlTableStyle.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 "../ForwardTranslator.hpp"
+#include "../../model/Model.hpp"
+#include "../../model/OutputControlTableStyle.hpp"
+#include <utilities/idd/OutputControl_Table_Style_FieldEnums.hxx>
+#include "../../utilities/idd/IddEnums.hpp"
+#include <utilities/idd/IddEnums.hxx>
+#include <utilities/idd/IddFactory.hxx>
+
+using namespace openstudio::model;
+
+using namespace std;
+
+namespace openstudio {
+
+namespace energyplus {
+
+  boost::optional<IdfObject> ForwardTranslator::translateOutputControlTableStyle(OutputControlTableStyle& modelObject) {
+
+    IdfObject idfObject = createAndRegisterIdfObject(openstudio::IddObjectType::OutputControl_Table_Style, modelObject);
+
+    idfObject.setString(OutputControl_Table_StyleFields::ColumnSeparator, modelObject.columnSeparator());
+
+    idfObject.setString(OutputControl_Table_StyleFields::UnitConversion, modelObject.unitConversion());
+
+    return idfObject;
+  }
+
+}  // namespace energyplus
+
+}  // namespace openstudio
diff --git a/src/energyplus/ForwardTranslator/ForwardTranslateOutputDebuggingData.cpp b/src/energyplus/ForwardTranslator/ForwardTranslateOutputDebuggingData.cpp
index 8586c90e496..8a4d6713bcd 100644
--- a/src/energyplus/ForwardTranslator/ForwardTranslateOutputDebuggingData.cpp
+++ b/src/energyplus/ForwardTranslator/ForwardTranslateOutputDebuggingData.cpp
@@ -43,8 +43,8 @@ namespace openstudio {
 namespace energyplus {
 
   boost::optional<IdfObject> ForwardTranslator::translateOutputDebuggingData(model::OutputDebuggingData& modelObject) {
-    IdfObject idfObject(openstudio::IddObjectType::Output_DebuggingData);
-    m_idfObjects.push_back(idfObject);
+
+    IdfObject idfObject = createAndRegisterIdfObject(openstudio::IddObjectType::Output_DebuggingData, modelObject);
 
     // Report Debugging Data
     if (modelObject.reportDebuggingData()) {
diff --git a/src/energyplus/ForwardTranslator/ForwardTranslateOutputDiagnostics.cpp b/src/energyplus/ForwardTranslator/ForwardTranslateOutputDiagnostics.cpp
index 6e7499b757a..8575a6064a8 100644
--- a/src/energyplus/ForwardTranslator/ForwardTranslateOutputDiagnostics.cpp
+++ b/src/energyplus/ForwardTranslator/ForwardTranslateOutputDiagnostics.cpp
@@ -51,8 +51,7 @@ namespace energyplus {
       return boost::none;
     }
 
-    IdfObject idfObject(openstudio::IddObjectType::Output_Diagnostics);
-    m_idfObjects.push_back(idfObject);
+    IdfObject idfObject = createAndRegisterIdfObject(openstudio::IddObjectType::Output_Diagnostics, modelObject);
 
     for (const std::string& key : modelObject.keys()) {
       IdfExtensibleGroup eg = idfObject.pushExtensibleGroup();
diff --git a/src/energyplus/ForwardTranslator/ForwardTranslateOutputEnergyManagementSystem.cpp b/src/energyplus/ForwardTranslator/ForwardTranslateOutputEnergyManagementSystem.cpp
index bdd3e10af98..9359f96534d 100644
--- a/src/energyplus/ForwardTranslator/ForwardTranslateOutputEnergyManagementSystem.cpp
+++ b/src/energyplus/ForwardTranslator/ForwardTranslateOutputEnergyManagementSystem.cpp
@@ -54,13 +54,8 @@ namespace energyplus {
   boost::optional<IdfObject> ForwardTranslator::translateOutputEnergyManagementSystem(OutputEnergyManagementSystem& modelObject) {
     boost::optional<std::string> s;
 
-    IdfObject idfObject(openstudio::IddObjectType::Output_EnergyManagementSystem);
-    m_idfObjects.push_back(idfObject);
-    //Name
-    s = modelObject.name();
-    if (s) {
-      idfObject.setName(*s);
-    }
+    IdfObject idfObject = createAndRegisterIdfObject(openstudio::IddObjectType::Output_EnergyManagementSystem, modelObject);
+
     s = modelObject.actuatorAvailabilityDictionaryReporting();
     if (s) {
       idfObject.setString(Output_EnergyManagementSystemFields::ActuatorAvailabilityDictionaryReporting, s.get());
diff --git a/src/energyplus/ForwardTranslator/ForwardTranslateOutputEnvironmentalImpactFactors.cpp b/src/energyplus/ForwardTranslator/ForwardTranslateOutputEnvironmentalImpactFactors.cpp
index 96b7d023fcd..a15d972cb4f 100644
--- a/src/energyplus/ForwardTranslator/ForwardTranslateOutputEnvironmentalImpactFactors.cpp
+++ b/src/energyplus/ForwardTranslator/ForwardTranslateOutputEnvironmentalImpactFactors.cpp
@@ -59,8 +59,7 @@ namespace energyplus {
     }
 
     // It doesn't have a name
-    IdfObject idfObject(openstudio::IddObjectType::Output_EnvironmentalImpactFactors);
-    m_idfObjects.push_back(idfObject);
+    IdfObject idfObject = createAndRegisterIdfObject(openstudio::IddObjectType::Output_EnvironmentalImpactFactors, modelObject);
 
     idfObject.setString(Output_EnvironmentalImpactFactorsFields::ReportingFrequency, modelObject.reportingFrequency());
 
diff --git a/src/energyplus/ForwardTranslator/ForwardTranslateOutputJSON.cpp b/src/energyplus/ForwardTranslator/ForwardTranslateOutputJSON.cpp
index 5ccc357505e..e60f39c3b9d 100644
--- a/src/energyplus/ForwardTranslator/ForwardTranslateOutputJSON.cpp
+++ b/src/energyplus/ForwardTranslator/ForwardTranslateOutputJSON.cpp
@@ -44,8 +44,7 @@ namespace energyplus {
 
   boost::optional<IdfObject> ForwardTranslator::translateOutputJSON(model::OutputJSON& modelObject) {
 
-    IdfObject idfObject(openstudio::IddObjectType::Output_JSON);
-    m_idfObjects.push_back(idfObject);
+    IdfObject idfObject = createAndRegisterIdfObject(openstudio::IddObjectType::Output_JSON, modelObject);
 
     // Option Type: Required String
     std::string optionType = modelObject.optionType();
diff --git a/src/energyplus/ForwardTranslator/ForwardTranslateOutputSQLite.cpp b/src/energyplus/ForwardTranslator/ForwardTranslateOutputSQLite.cpp
new file mode 100644
index 00000000000..0d8eeb7c5da
--- /dev/null
+++ b/src/energyplus/ForwardTranslator/ForwardTranslateOutputSQLite.cpp
@@ -0,0 +1,57 @@
+/***********************************************************************************************************************
+*  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/OutputSQLite.hpp"
+
+#include <utilities/idd/Output_SQLite_FieldEnums.hxx>
+// #include "../../utilities/idd/IddEnums.hpp"
+#include <utilities/idd/IddEnums.hxx>
+
+using namespace openstudio::model;
+
+namespace openstudio {
+
+namespace energyplus {
+
+  boost::optional<IdfObject> ForwardTranslator::translateOutputSQLite(model::OutputSQLite& modelObject) {
+
+    IdfObject idfObject = createAndRegisterIdfObject(openstudio::IddObjectType::Output_SQLite, modelObject);
+
+    idfObject.setString(Output_SQLiteFields::OptionType, modelObject.optionType());
+
+    idfObject.setString(Output_SQLiteFields::UnitConversionforTabularData, modelObject.unitConversionforTabularData());
+
+    return idfObject;
+  }  // End of translate function
+
+}  // end namespace energyplus
+}  // end namespace openstudio
diff --git a/src/energyplus/ForwardTranslator/ForwardTranslateOutputTableSummaryReports.cpp b/src/energyplus/ForwardTranslator/ForwardTranslateOutputTableSummaryReports.cpp
index 3ee8d99add9..a6cb9691f66 100644
--- a/src/energyplus/ForwardTranslator/ForwardTranslateOutputTableSummaryReports.cpp
+++ b/src/energyplus/ForwardTranslator/ForwardTranslateOutputTableSummaryReports.cpp
@@ -54,14 +54,14 @@ namespace energyplus {
       return boost::none;
     }
 
-    IdfObject idfObject = createRegisterAndNameIdfObject(openstudio::IddObjectType::Output_Table_SummaryReports, modelObject);
+    IdfObject idfObject = createAndRegisterIdfObject(openstudio::IddObjectType::Output_Table_SummaryReports, modelObject);
 
     for (const std::string& summaryReport : summaryReports) {
       auto eg = idfObject.pushExtensibleGroup();
       eg.setString(Output_Table_SummaryReportsExtensibleFields::ReportName, summaryReport);
     }
 
-    return boost::optional<IdfObject>(idfObject);
+    return idfObject;
   }
 
 }  // namespace energyplus
diff --git a/src/energyplus/ForwardTranslator/ForwardTranslateOutputVariable.cpp b/src/energyplus/ForwardTranslator/ForwardTranslateOutputVariable.cpp
index 423527fbed7..26b8de6f15d 100644
--- a/src/energyplus/ForwardTranslator/ForwardTranslateOutputVariable.cpp
+++ b/src/energyplus/ForwardTranslator/ForwardTranslateOutputVariable.cpp
@@ -48,8 +48,8 @@ namespace openstudio {
 namespace energyplus {
 
   boost::optional<IdfObject> ForwardTranslator::translateOutputVariable(OutputVariable& modelObject) {
-    IdfObject idfObject(openstudio::IddObjectType::Output_Variable);
-    m_idfObjects.push_back(idfObject);
+
+    IdfObject idfObject = createAndRegisterIdfObject(openstudio::IddObjectType::Output_Variable, modelObject);
 
     if (!modelObject.isKeyValueDefaulted()) {
       idfObject.setString(Output_VariableFields::KeyValue, modelObject.keyValue());
diff --git a/src/energyplus/ReverseTranslator.cpp b/src/energyplus/ReverseTranslator.cpp
index c077fa8a25f..b93398c8ffd 100644
--- a/src/energyplus/ReverseTranslator.cpp
+++ b/src/energyplus/ReverseTranslator.cpp
@@ -681,6 +681,10 @@ namespace energyplus {
         modelObject = translateOutputJSON(workspaceObject);
         break;
       }
+      case openstudio::IddObjectType::Output_SQLite: {
+        modelObject = translateOutputSQLite(workspaceObject);
+        break;
+      }
       case openstudio::IddObjectType::Output_EnvironmentalImpactFactors: {
         modelObject = translateOutputEnvironmentalImpactFactors(workspaceObject);
         break;
@@ -713,9 +717,6 @@ namespace energyplus {
         modelObject = translateOutputMeterMeterFileOnly(workspaceObject);
         break;
       }
-      case openstudio::IddObjectType::Output_SQLite: {
-        break;  // no-op
-      }
       case openstudio::IddObjectType::Output_Table_Monthly: {
         break;  // no-op
       }
@@ -731,8 +732,13 @@ namespace energyplus {
         modelObject = translateOutputControlFiles(workspaceObject);
         break;
       }
+      case openstudio::IddObjectType::OutputControl_ReportingTolerances: {
+        modelObject = translateOutputControlReportingTolerances(workspaceObject);
+        break;
+      }
       case openstudio::IddObjectType::OutputControl_Table_Style: {
-        break;  // no-op
+        modelObject = translateOutputControlTableStyle(workspaceObject);
+        break;
       }
       case openstudio::IddObjectType::People: {
         modelObject = translatePeople(workspaceObject);
diff --git a/src/energyplus/ReverseTranslator.hpp b/src/energyplus/ReverseTranslator.hpp
index 5bd30b202f5..58d389a1641 100644
--- a/src/energyplus/ReverseTranslator.hpp
+++ b/src/energyplus/ReverseTranslator.hpp
@@ -245,12 +245,18 @@ namespace energyplus {
 
     boost::optional<model::ModelObject> translateOutputControlFiles(const WorkspaceObject& workspaceObject);
 
+    boost::optional<model::ModelObject> translateOutputControlReportingTolerances(const WorkspaceObject& workspaceObject);
+
+    boost::optional<model::ModelObject> translateOutputControlTableStyle(const WorkspaceObject& workspaceObject);
+
     boost::optional<model::ModelObject> translateOutputDebuggingData(const WorkspaceObject& workspaceObject);
 
     boost::optional<model::ModelObject> translateOutputDiagnostics(const WorkspaceObject& workspaceObject);
 
     boost::optional<model::ModelObject> translateOutputJSON(const WorkspaceObject& workspaceObject);
 
+    boost::optional<model::ModelObject> translateOutputSQLite(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/ReverseTranslateOutputControlReportingTolerances.cpp b/src/energyplus/ReverseTranslator/ReverseTranslateOutputControlReportingTolerances.cpp
new file mode 100644
index 00000000000..80135bf57c4
--- /dev/null
+++ b/src/energyplus/ReverseTranslator/ReverseTranslateOutputControlReportingTolerances.cpp
@@ -0,0 +1,66 @@
+/***********************************************************************************************************************
+*  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/OutputControlReportingTolerances.hpp"
+#include "../../model/OutputControlReportingTolerances_Impl.hpp"
+
+#include <utilities/idd/OutputControl_ReportingTolerances_FieldEnums.hxx>
+#include <utilities/idd/IddEnums.hxx>
+
+using namespace openstudio::model;
+
+namespace openstudio {
+
+namespace energyplus {
+
+  boost::optional<ModelObject> ReverseTranslator::translateOutputControlReportingTolerances(const WorkspaceObject& workspaceObject) {
+    boost::optional<ModelObject> result;
+
+    // This is a Unique ModelObject
+    openstudio::model::OutputControlReportingTolerances modelObject = m_model.getUniqueModelObject<OutputControlReportingTolerances>();
+
+    if (boost::optional<double> _toleranceforTimeHeatingSetpointNotMet =
+          workspaceObject.getDouble(OutputControl_ReportingTolerancesFields::ToleranceforTimeHeatingSetpointNotMet, true)) {
+      modelObject.setToleranceforTimeHeatingSetpointNotMet(_toleranceforTimeHeatingSetpointNotMet.get());
+    }
+
+    if (boost::optional<double> _toleranceforTimeCoolingSetpointNotMet =
+          workspaceObject.getDouble(OutputControl_ReportingTolerancesFields::ToleranceforTimeCoolingSetpointNotMet, true)) {
+      modelObject.setToleranceforTimeCoolingSetpointNotMet(_toleranceforTimeCoolingSetpointNotMet.get());
+    }
+
+    result = modelObject;
+    return result;
+
+  }  // End of translate function
+
+}  // end namespace energyplus
+}  // end namespace openstudio
diff --git a/src/energyplus/ReverseTranslator/ReverseTranslateOutputControlTableStyle.cpp b/src/energyplus/ReverseTranslator/ReverseTranslateOutputControlTableStyle.cpp
new file mode 100644
index 00000000000..63ec49a4347
--- /dev/null
+++ b/src/energyplus/ReverseTranslator/ReverseTranslateOutputControlTableStyle.cpp
@@ -0,0 +1,64 @@
+/***********************************************************************************************************************
+*  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/OutputControlTableStyle.hpp"
+#include "../../model/OutputControlTableStyle_Impl.hpp"
+
+#include <utilities/idd/OutputControl_Table_Style_FieldEnums.hxx>
+#include <utilities/idd/IddEnums.hxx>
+
+using namespace openstudio::model;
+
+namespace openstudio {
+
+namespace energyplus {
+
+  boost::optional<ModelObject> ReverseTranslator::translateOutputControlTableStyle(const WorkspaceObject& workspaceObject) {
+    boost::optional<ModelObject> result;
+
+    // This is a Unique ModelObject
+    openstudio::model::OutputControlTableStyle modelObject = m_model.getUniqueModelObject<OutputControlTableStyle>();
+
+    if (boost::optional<std::string> _columnSeparator = workspaceObject.getString(OutputControl_Table_StyleFields::ColumnSeparator, true)) {
+      modelObject.setColumnSeparator(_columnSeparator.get());
+    }
+
+    if (boost::optional<std::string> _unitConversion = workspaceObject.getString(OutputControl_Table_StyleFields::UnitConversion, true)) {
+      modelObject.setUnitConversion(_unitConversion.get());
+    }
+
+    result = modelObject;
+    return result;
+
+  }  // End of translate function
+
+}  // end namespace energyplus
+}  // end namespace openstudio
diff --git a/src/energyplus/ReverseTranslator/ReverseTranslateOutputSQLite.cpp b/src/energyplus/ReverseTranslator/ReverseTranslateOutputSQLite.cpp
new file mode 100644
index 00000000000..a9f5a64c82d
--- /dev/null
+++ b/src/energyplus/ReverseTranslator/ReverseTranslateOutputSQLite.cpp
@@ -0,0 +1,65 @@
+/***********************************************************************************************************************
+*  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/OutputSQLite.hpp"
+#include "../../model/OutputSQLite_Impl.hpp"
+
+#include <utilities/idd/Output_SQLite_FieldEnums.hxx>
+#include <utilities/idd/IddEnums.hxx>
+
+using namespace openstudio::model;
+
+namespace openstudio {
+
+namespace energyplus {
+
+  boost::optional<ModelObject> ReverseTranslator::translateOutputSQLite(const WorkspaceObject& workspaceObject) {
+    boost::optional<ModelObject> result;
+
+    // This is a Unique ModelObject
+    openstudio::model::OutputSQLite modelObject = m_model.getUniqueModelObject<OutputSQLite>();
+
+    if (boost::optional<std::string> _optionType = workspaceObject.getString(Output_SQLiteFields::OptionType, true)) {
+      modelObject.setOptionType(_optionType.get());
+    }
+
+    if (boost::optional<std::string> _unitConversionforTabularData =
+          workspaceObject.getString(Output_SQLiteFields::UnitConversionforTabularData, true)) {
+      modelObject.setUnitConversionforTabularData(_unitConversionforTabularData.get());
+    }
+
+    result = modelObject;
+    return result;
+
+  }  // End of translate function
+
+}  // end namespace energyplus
+}  // end namespace openstudio
diff --git a/src/energyplus/Test/OutputControlReportingTolerances_GTest.cpp b/src/energyplus/Test/OutputControlReportingTolerances_GTest.cpp
new file mode 100644
index 00000000000..802cfc0aca0
--- /dev/null
+++ b/src/energyplus/Test/OutputControlReportingTolerances_GTest.cpp
@@ -0,0 +1,109 @@
+/***********************************************************************************************************************
+*  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/OutputControlReportingTolerances.hpp"
+#include "../../model/OutputControlReportingTolerances_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/OutputControl_ReportingTolerances_FieldEnums.hxx>
+#include <utilities/idd/IddEnums.hxx>
+
+using namespace openstudio::energyplus;
+using namespace openstudio::model;
+using namespace openstudio;
+
+TEST_F(EnergyPlusFixture, ForwardTranslator_OutputControlReportingTolerances) {
+
+  // Not there, and workspace should not have it
+  {
+    Model m;
+    ForwardTranslator ft;
+    Workspace w = ft.translateModel(m);
+
+    WorkspaceObjectVector idfObjs = w.getObjectsByType(IddObjectType::OutputControl_ReportingTolerances);
+    ASSERT_EQ(0u, idfObjs.size());
+  }
+
+  // It's there
+  {
+    Model m;
+    ForwardTranslator ft;
+
+    OutputControlReportingTolerances outputControlReportingTolerances = m.getUniqueModelObject<OutputControlReportingTolerances>();
+
+    EXPECT_TRUE(outputControlReportingTolerances.setToleranceforTimeHeatingSetpointNotMet(1.16));
+    EXPECT_TRUE(outputControlReportingTolerances.setToleranceforTimeCoolingSetpointNotMet(0.75));
+
+    Workspace w = ft.translateModel(m);
+
+    WorkspaceObjectVector idfObjs = w.getObjectsByType(IddObjectType::OutputControl_ReportingTolerances);
+    ASSERT_EQ(1u, idfObjs.size());
+
+    WorkspaceObject idf_reportingtolerances(idfObjs[0]);
+
+    EXPECT_EQ(1.16, idf_reportingtolerances.getDouble(OutputControl_ReportingTolerancesFields::ToleranceforTimeHeatingSetpointNotMet, false).get());
+    EXPECT_EQ(0.75, idf_reportingtolerances.getDouble(OutputControl_ReportingTolerancesFields::ToleranceforTimeCoolingSetpointNotMet, false).get());
+  }
+}
+
+TEST_F(EnergyPlusFixture, ReverseTranslator_OutputControlReportingTolerances) {
+
+  ReverseTranslator rt;
+
+  Workspace w(StrictnessLevel::Minimal, IddFileType::EnergyPlus);
+
+  // Not there, Model shouldn't have it either
+  Model m;
+  m = rt.translateWorkspace(w);
+  EXPECT_FALSE(m.getOptionalUniqueModelObject<OutputControlReportingTolerances>());
+
+  OptionalWorkspaceObject _i_outputControlReportingTolerances = w.addObject(IdfObject(IddObjectType::OutputControl_ReportingTolerances));
+  ASSERT_TRUE(_i_outputControlReportingTolerances);
+
+  EXPECT_TRUE(_i_outputControlReportingTolerances->setDouble(OutputControl_ReportingTolerancesFields::ToleranceforTimeHeatingSetpointNotMet, 1.75));
+  EXPECT_TRUE(_i_outputControlReportingTolerances->setDouble(OutputControl_ReportingTolerancesFields::ToleranceforTimeCoolingSetpointNotMet, 0.25));
+
+  m = rt.translateWorkspace(w);
+
+  // Get the unique object
+  OutputControlReportingTolerances outputControlReportingTolerances = m.getUniqueModelObject<OutputControlReportingTolerances>();
+  EXPECT_EQ(1.75, outputControlReportingTolerances.toleranceforTimeHeatingSetpointNotMet());
+  EXPECT_EQ(0.25, outputControlReportingTolerances.toleranceforTimeCoolingSetpointNotMet());
+}
diff --git a/src/energyplus/Test/OutputControlTableStyle_GTest.cpp b/src/energyplus/Test/OutputControlTableStyle_GTest.cpp
new file mode 100644
index 00000000000..d1ae5ec784a
--- /dev/null
+++ b/src/energyplus/Test/OutputControlTableStyle_GTest.cpp
@@ -0,0 +1,141 @@
+/***********************************************************************************************************************
+*  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/OutputControlTableStyle.hpp"
+#include "../../model/OutputControlTableStyle_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/OutputControl_Table_Style_FieldEnums.hxx>
+#include <utilities/idd/IddEnums.hxx>
+
+using namespace openstudio::energyplus;
+using namespace openstudio::model;
+using namespace openstudio;
+
+TEST_F(EnergyPlusFixture, ForwardTranslator_OutputControlTableStyle) {
+
+  // Not there, but workspace should have it
+  {
+    Model m;
+    ForwardTranslator ft;
+    Workspace w = ft.translateModel(m);
+
+    WorkspaceObjectVector idfObjs = w.getObjectsByType(IddObjectType::OutputControl_Table_Style);
+    ASSERT_EQ(1u, idfObjs.size());
+
+    WorkspaceObject idf_tablestyle = idfObjs[0];
+
+    EXPECT_EQ("HTML", idf_tablestyle.getString(OutputControl_Table_StyleFields::ColumnSeparator, false).get());
+    EXPECT_TRUE(idf_tablestyle.isEmpty(OutputControl_Table_StyleFields::UnitConversion));
+  }
+
+  // Not there, m_ipTabularOutput = True
+  {
+    Model m;
+    ForwardTranslator ft;
+    ft.setIPTabularOutput(true);
+    Workspace w = ft.translateModel(m);
+
+    WorkspaceObjectVector idfObjs = w.getObjectsByType(IddObjectType::OutputControl_Table_Style);
+    ASSERT_EQ(1u, idfObjs.size());
+
+    WorkspaceObject idf_tablestyle = idfObjs[0];
+
+    EXPECT_EQ("HTML", idf_tablestyle.getString(OutputControl_Table_StyleFields::ColumnSeparator, false).get());
+    EXPECT_EQ("InchPound", idf_tablestyle.getString(OutputControl_Table_StyleFields::UnitConversion, false).get());
+  }
+
+  // Not there, m_excludeHTMLOutputReport = True
+  {
+    Model m;
+    ForwardTranslator ft;
+    ft.setExcludeHTMLOutputReport(true);
+    Workspace w = ft.translateModel(m);
+
+    WorkspaceObjectVector idfObjs = w.getObjectsByType(IddObjectType::OutputControl_Table_Style);
+    ASSERT_EQ(0u, idfObjs.size());
+  }
+
+  // It's already in the model
+  {
+    Model m;
+    ForwardTranslator ft;
+
+    OutputControlTableStyle outputControlTableStyle = m.getUniqueModelObject<OutputControlTableStyle>();
+
+    EXPECT_TRUE(outputControlTableStyle.setColumnSeparator("Tab"));
+    EXPECT_TRUE(outputControlTableStyle.setUnitConversion("JtoKWH"));
+
+    Workspace w = ft.translateModel(m);
+
+    WorkspaceObjectVector idfObjs = w.getObjectsByType(IddObjectType::OutputControl_Table_Style);
+    ASSERT_EQ(1u, idfObjs.size());
+
+    WorkspaceObject idf_tablestyle(idfObjs[0]);
+
+    EXPECT_EQ("Tab", idf_tablestyle.getString(OutputControl_Table_StyleFields::ColumnSeparator, false).get());
+    EXPECT_EQ("JtoKWH", idf_tablestyle.getString(OutputControl_Table_StyleFields::UnitConversion, false).get());
+  }
+}
+
+TEST_F(EnergyPlusFixture, ReverseTranslator_OutputControlTableStyle) {
+
+  ReverseTranslator rt;
+
+  Workspace w(StrictnessLevel::Minimal, IddFileType::EnergyPlus);
+
+  // Not there, Model shouldn't have it either
+  Model m;
+  m = rt.translateWorkspace(w);
+  EXPECT_FALSE(m.getOptionalUniqueModelObject<OutputControlTableStyle>());
+
+  OptionalWorkspaceObject _i_outputControlTableStyle = w.addObject(IdfObject(IddObjectType::OutputControl_Table_Style));
+  ASSERT_TRUE(_i_outputControlTableStyle);
+
+  EXPECT_TRUE(_i_outputControlTableStyle->setString(OutputControl_Table_StyleFields::ColumnSeparator, "XML"));
+  EXPECT_TRUE(_i_outputControlTableStyle->setString(OutputControl_Table_StyleFields::UnitConversion, "JtoMJ"));
+
+  m = rt.translateWorkspace(w);
+
+  // Get the unique object
+  OutputControlTableStyle outputControlTableStyle = m.getUniqueModelObject<OutputControlTableStyle>();
+  EXPECT_EQ("XML", outputControlTableStyle.columnSeparator());
+  EXPECT_EQ("JtoMJ", outputControlTableStyle.unitConversion());
+}
diff --git a/src/energyplus/Test/OutputSQLite_GTest.cpp b/src/energyplus/Test/OutputSQLite_GTest.cpp
new file mode 100644
index 00000000000..8b8f8aafa95
--- /dev/null
+++ b/src/energyplus/Test/OutputSQLite_GTest.cpp
@@ -0,0 +1,125 @@
+/***********************************************************************************************************************
+*  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/OutputSQLite.hpp"
+#include "../../model/OutputSQLite_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_SQLite_FieldEnums.hxx>
+#include <utilities/idd/IddEnums.hxx>
+
+using namespace openstudio::energyplus;
+using namespace openstudio::model;
+using namespace openstudio;
+
+TEST_F(EnergyPlusFixture, ForwardTranslator_OutputSQLite) {
+
+  // Not there, but workspace should have it
+  {
+    Model m;
+    ForwardTranslator ft;
+    Workspace w = ft.translateModel(m);
+
+    WorkspaceObjectVector idfObjs = w.getObjectsByType(IddObjectType::Output_SQLite);
+    ASSERT_EQ(1u, idfObjs.size());
+
+    WorkspaceObject idf_sqlite(idfObjs[0]);
+
+    EXPECT_EQ("SimpleAndTabular", idf_sqlite.getString(Output_SQLiteFields::OptionType, false).get());
+    EXPECT_TRUE(idf_sqlite.isEmpty(Output_SQLiteFields::UnitConversionforTabularData));
+  }
+
+  // Not there, m_excludeSQliteOutputReport = True
+  {
+    Model m;
+    ForwardTranslator ft;
+    ft.setExcludeSQliteOutputReport(true);
+    Workspace w = ft.translateModel(m);
+
+    WorkspaceObjectVector idfObjs = w.getObjectsByType(IddObjectType::Output_SQLite);
+    ASSERT_EQ(0u, idfObjs.size());
+  }
+
+  // It's already in the model
+  {
+    Model m;
+    ForwardTranslator ft;
+
+    OutputSQLite outputSQLite = m.getUniqueModelObject<OutputSQLite>();
+
+    EXPECT_TRUE(outputSQLite.setOptionType("Simple"));
+    EXPECT_TRUE(outputSQLite.setUnitConversionforTabularData("None"));
+
+    Workspace w = ft.translateModel(m);
+
+    WorkspaceObjectVector idfObjs = w.getObjectsByType(IddObjectType::Output_SQLite);
+    ASSERT_EQ(1u, idfObjs.size());
+
+    WorkspaceObject idf_sqlite(idfObjs[0]);
+
+    EXPECT_EQ("Simple", idf_sqlite.getString(Output_SQLiteFields::OptionType, false).get());
+    EXPECT_EQ("None", idf_sqlite.getString(Output_SQLiteFields::UnitConversionforTabularData, false).get());
+  }
+}
+
+TEST_F(EnergyPlusFixture, ReverseTranslator_OutputSQLite) {
+
+  ReverseTranslator rt;
+
+  Workspace w(StrictnessLevel::Minimal, IddFileType::EnergyPlus);
+
+  // Not there, Model shouldn't have it either
+  Model m;
+  m = rt.translateWorkspace(w);
+  EXPECT_FALSE(m.getOptionalUniqueModelObject<OutputSQLite>());
+
+  OptionalWorkspaceObject _i_outputSQLite = w.addObject(IdfObject(IddObjectType::Output_SQLite));
+  ASSERT_TRUE(_i_outputSQLite);
+
+  EXPECT_TRUE(_i_outputSQLite->setString(Output_SQLiteFields::OptionType, "Simple"));
+  EXPECT_TRUE(_i_outputSQLite->setString(Output_SQLiteFields::UnitConversionforTabularData, "InchPound"));
+
+  m = rt.translateWorkspace(w);
+
+  // Get the unique object
+  OutputSQLite outputSQLite = m.getUniqueModelObject<OutputSQLite>();
+  EXPECT_EQ("Simple", outputSQLite.optionType());
+  EXPECT_EQ("InchPound", outputSQLite.unitConversionforTabularData());
+}
diff --git a/src/model/CMakeLists.txt b/src/model/CMakeLists.txt
index 9bd8ad6d000..086a1d9f07e 100644
--- a/src/model/CMakeLists.txt
+++ b/src/model/CMakeLists.txt
@@ -1037,12 +1037,18 @@ set(${target_name}_src
   OutputControlReportingTolerances.hpp
   OutputControlReportingTolerances_Impl.hpp
   OutputControlReportingTolerances.cpp
+  OutputControlTableStyle.hpp
+  OutputControlTableStyle_Impl.hpp
+  OutputControlTableStyle.cpp
   OutputDebuggingData.hpp
   OutputDebuggingData_Impl.hpp
   OutputDebuggingData.cpp
   OutputJSON.hpp
   OutputJSON_Impl.hpp
   OutputJSON.cpp
+  OutputSQLite.hpp
+  OutputSQLite_Impl.hpp
+  OutputSQLite.cpp
   OutputEnvironmentalImpactFactors.hpp
   OutputEnvironmentalImpactFactors_Impl.hpp
   OutputEnvironmentalImpactFactors.cpp
@@ -2097,8 +2103,10 @@ set(${target_name}_test_src
   test/OtherEquipment_GTest.cpp
   test/OutputControlFiles_GTest.cpp
   test/OutputControlReportingTolerances_GTest.cpp
+  test/OutputControlTableStyle_GTest.cpp
   test/OutputDebuggingData_GTest.cpp
   test/OutputJSON_GTest.cpp
+  test/OutputSQLite_GTest.cpp
   test/OutputEnvironmentalImpactFactors_GTest.cpp
   test/EnvironmentalImpactFactors_GTest.cpp
   test/FuelFactors_GTest.cpp
diff --git a/src/model/ConcreteModelObjects.hpp b/src/model/ConcreteModelObjects.hpp
index d23fba0bb8f..28cf35a663d 100644
--- a/src/model/ConcreteModelObjects.hpp
+++ b/src/model/ConcreteModelObjects.hpp
@@ -342,10 +342,12 @@
 #include "OtherEquipmentDefinition.hpp"
 #include "OutputControlFiles.hpp"
 #include "OutputControlReportingTolerances.hpp"
+#include "OutputControlTableStyle.hpp"
 #include "OutputDebuggingData.hpp"
 #include "OutputDiagnostics.hpp"
 #include "OutputEnergyManagementSystem.hpp"
 #include "OutputJSON.hpp"
+#include "OutputSQLite.hpp"
 #include "OutputEnvironmentalImpactFactors.hpp"
 #include "EnvironmentalImpactFactors.hpp"
 #include "FuelFactors.hpp"
@@ -871,10 +873,12 @@
 #include "OtherEquipmentDefinition_Impl.hpp"
 #include "OutputControlFiles_Impl.hpp"
 #include "OutputControlReportingTolerances_Impl.hpp"
+#include "OutputControlTableStyle_Impl.hpp"
 #include "OutputDebuggingData_Impl.hpp"
 #include "OutputDiagnostics_Impl.hpp"
 #include "OutputEnergyManagementSystem_Impl.hpp"
 #include "OutputJSON_Impl.hpp"
+#include "OutputSQLite_Impl.hpp"
 #include "OutputEnvironmentalImpactFactors_Impl.hpp"
 #include "EnvironmentalImpactFactors_Impl.hpp"
 #include "FuelFactors_Impl.hpp"
diff --git a/src/model/Model.cpp b/src/model/Model.cpp
index 5e644902687..0fd001e2009 100644
--- a/src/model/Model.cpp
+++ b/src/model/Model.cpp
@@ -286,6 +286,23 @@ namespace model {
       return m_cachedOutputControlReportingTolerances;
     }
 
+    boost::optional<OutputControlTableStyle> Model_Impl::outputControlTableStyle() const {
+      if (m_cachedOutputControlTableStyle) {
+        return m_cachedOutputControlTableStyle;
+      }
+
+      boost::optional<OutputControlTableStyle> result = this->model().getOptionalUniqueModelObject<OutputControlTableStyle>();
+      if (result) {
+        m_cachedOutputControlTableStyle = result;
+        result->getImpl<OutputControlTableStyle_Impl>()
+          .get()
+          ->OutputControlTableStyle_Impl::onRemoveFromWorkspace.connect<Model_Impl, &Model_Impl::clearCachedOutputControlTableStyle>(
+            const_cast<openstudio::model::detail::Model_Impl*>(this));
+      }
+
+      return m_cachedOutputControlTableStyle;
+    }
+
     boost::optional<OutputDiagnostics> Model_Impl::outputDiagnostics() const {
       if (m_cachedOutputDiagnostics) {
         return m_cachedOutputDiagnostics;
@@ -335,6 +352,23 @@ namespace model {
       return m_cachedOutputJSON;
     }
 
+    boost::optional<OutputSQLite> Model_Impl::outputSQLite() const {
+      if (m_cachedOutputSQLite) {
+        return m_cachedOutputSQLite;
+      }
+
+      boost::optional<OutputSQLite> result = this->model().getOptionalUniqueModelObject<OutputSQLite>();
+      if (result) {
+        m_cachedOutputSQLite = result;
+        result->getImpl<OutputSQLite_Impl>()
+          .get()
+          ->OutputSQLite_Impl::onRemoveFromWorkspace.connect<Model_Impl, &Model_Impl::clearCachedOutputSQLite>(
+            const_cast<openstudio::model::detail::Model_Impl*>(this));
+      }
+
+      return m_cachedOutputSQLite;
+    }
+
     boost::optional<OutputEnergyManagementSystem> Model_Impl::outputEnergyManagementSystem() const {
       if (m_cachedOutputEnergyManagementSystem) {
         return m_cachedOutputEnergyManagementSystem;
@@ -1476,9 +1510,11 @@ namespace model {
       clearCachedFoundationKivaSettings(dummy);
       clearCachedOutputControlFiles(dummy);
       clearCachedOutputControlReportingTolerances(dummy);
+      clearCachedOutputControlTableStyle(dummy);
       clearCachedOutputDiagnostics(dummy);
       clearCachedOutputDebuggingData(dummy);
       clearCachedOutputJSON(dummy);
+      clearCachedOutputSQLite(dummy);
       clearCachedOutputEnergyManagementSystem(dummy);
       clearCachedOutputTableSummaryReports(dummy);
       clearCachedPerformancePrecisionTradeoffs(dummy);
@@ -1531,6 +1567,10 @@ namespace model {
       m_cachedOutputControlReportingTolerances.reset();
     }
 
+    void Model_Impl::clearCachedOutputControlTableStyle(const Handle&) {
+      m_cachedOutputControlTableStyle.reset();
+    }
+
     void Model_Impl::clearCachedOutputDiagnostics(const Handle&) {
       m_cachedOutputDiagnostics.reset();
     }
@@ -1543,6 +1583,10 @@ namespace model {
       m_cachedOutputJSON.reset();
     }
 
+    void Model_Impl::clearCachedOutputSQLite(const Handle&) {
+      m_cachedOutputSQLite.reset();
+    }
+
     void Model_Impl::clearCachedOutputEnergyManagementSystem(const Handle&) {
       m_cachedOutputEnergyManagementSystem.reset();
     }
@@ -1844,6 +1888,10 @@ namespace model {
     return getImpl<detail::Model_Impl>()->outputControlReportingTolerances();
   }
 
+  boost::optional<OutputControlTableStyle> Model::outputControlTableStyle() const {
+    return getImpl<detail::Model_Impl>()->outputControlTableStyle();
+  }
+
   boost::optional<OutputDiagnostics> Model::outputDiagnostics() const {
     return getImpl<detail::Model_Impl>()->outputDiagnostics();
   }
@@ -1856,6 +1904,10 @@ namespace model {
     return getImpl<detail::Model_Impl>()->outputJSON();
   }
 
+  boost::optional<OutputSQLite> Model::outputSQLite() const {
+    return getImpl<detail::Model_Impl>()->outputSQLite();
+  }
+
   boost::optional<OutputEnergyManagementSystem> Model::outputEnergyManagementSystem() const {
     return getImpl<detail::Model_Impl>()->outputEnergyManagementSystem();
   }
@@ -3366,6 +3418,15 @@ namespace model {
     }
   }
 
+  template <>
+  OutputControlTableStyle Model::getUniqueModelObject<OutputControlTableStyle>() {
+    if (boost::optional<OutputControlTableStyle> _b = outputControlTableStyle()) {
+      return _b.get();
+    } else {
+      return OutputControlTableStyle(*this);
+    }
+  }
+
   template <>
   OutputDiagnostics Model::getUniqueModelObject<OutputDiagnostics>() {
     if (boost::optional<OutputDiagnostics> _b = outputDiagnostics()) {
@@ -3393,6 +3454,15 @@ namespace model {
     }
   }
 
+  template <>
+  OutputSQLite Model::getUniqueModelObject<OutputSQLite>() {
+    if (boost::optional<OutputSQLite> _b = outputSQLite()) {
+      return _b.get();
+    } else {
+      return OutputSQLite(*this);
+    }
+  }
+
   template <>
   OutputEnergyManagementSystem Model::getUniqueModelObject<OutputEnergyManagementSystem>() {
     if (boost::optional<OutputEnergyManagementSystem> _b = outputEnergyManagementSystem()) {
@@ -4038,10 +4108,12 @@ namespace model {
     REGISTER_CONSTRUCTOR(OtherEquipmentDefinition);
     REGISTER_CONSTRUCTOR(OutputControlFiles);
     REGISTER_CONSTRUCTOR(OutputControlReportingTolerances);
+    REGISTER_CONSTRUCTOR(OutputControlTableStyle);
     REGISTER_CONSTRUCTOR(OutputDebuggingData);
     REGISTER_CONSTRUCTOR(OutputDiagnostics);
     REGISTER_CONSTRUCTOR(OutputEnergyManagementSystem);
     REGISTER_CONSTRUCTOR(OutputJSON);
+    REGISTER_CONSTRUCTOR(OutputSQLite);
     REGISTER_CONSTRUCTOR(OutputEnvironmentalImpactFactors);
     REGISTER_CONSTRUCTOR(EnvironmentalImpactFactors);
     REGISTER_CONSTRUCTOR(FuelFactors);
@@ -4575,10 +4647,12 @@ namespace model {
     REGISTER_COPYCONSTRUCTORS(OtherEquipmentDefinition);
     REGISTER_COPYCONSTRUCTORS(OutputControlFiles);
     REGISTER_COPYCONSTRUCTORS(OutputControlReportingTolerances);
+    REGISTER_COPYCONSTRUCTORS(OutputControlTableStyle);
     REGISTER_COPYCONSTRUCTORS(OutputDebuggingData);
     REGISTER_COPYCONSTRUCTORS(OutputDiagnostics);
     REGISTER_COPYCONSTRUCTORS(OutputEnergyManagementSystem);
     REGISTER_COPYCONSTRUCTORS(OutputJSON);
+    REGISTER_COPYCONSTRUCTORS(OutputSQLite);
     REGISTER_COPYCONSTRUCTORS(OutputEnvironmentalImpactFactors);
     REGISTER_COPYCONSTRUCTORS(EnvironmentalImpactFactors);
     REGISTER_COPYCONSTRUCTORS(FuelFactors);
diff --git a/src/model/Model.hpp b/src/model/Model.hpp
index 3d504d65cc4..6f20788120c 100644
--- a/src/model/Model.hpp
+++ b/src/model/Model.hpp
@@ -53,9 +53,11 @@ namespace model {
   class FoundationKivaSettings;
   class OutputControlFiles;
   class OutputControlReportingTolerances;
+  class OutputControlTableStyle;
   class OutputDiagnostics;
   class OutputDebuggingData;
   class OutputJSON;
+  class OutputSQLite;
   class OutputEnergyManagementSystem;
   class OutputTableSummaryReports;
   class PerformancePrecisionTradeoffs;
@@ -162,6 +164,10 @@ namespace model {
    *  object which can be significantly faster than calling getOptionalUniqueModelObject<OutputControlReportingTolerances>(). */
     boost::optional<OutputControlReportingTolerances> outputControlReportingTolerances() const;
 
+    /** Get the OutputControlTableStyle object if there is one, this implementation uses a cached reference to the OutputControlTableStyle
+   *  object which can be significantly faster than calling getOptionalUniqueModelObject<OutputControlTableStyle>(). */
+    boost::optional<OutputControlTableStyle> outputControlTableStyle() const;
+
     /** Get the OutputDiagnostics object if there is one, this implementation uses a cached reference to the OutputDiagnostics
    *  object which can be significantly faster than calling getOptionalUniqueModelObject<OutputDiagnostics>(). */
     boost::optional<OutputDiagnostics> outputDiagnostics() const;
@@ -174,6 +180,10 @@ namespace model {
    *  object which can be significantly faster than calling getOptionalUniqueModelObject<OutputJSON>(). */
     boost::optional<OutputJSON> outputJSON() const;
 
+    /** Get the OutputSQLite object if there is one, this implementation uses a cached reference to the OutputSQLite
+   *  object which can be significantly faster than calling getOptionalUniqueModelObject<OutputSQLite>(). */
+    boost::optional<OutputSQLite> outputSQLite() const;
+
     /** Get the OutputEnergyManagementSystem object if there is one, this implementation uses a cached reference to the OutputEnergyManagementSystem
    *  object which can be significantly faster than calling getOptionalUniqueModelObject<OutputControlFiles>(). */
     boost::optional<OutputEnergyManagementSystem> outputEnergyManagementSystem() const;
@@ -689,6 +699,9 @@ namespace model {
   template <>
   MODEL_API OutputControlReportingTolerances Model::getUniqueModelObject<OutputControlReportingTolerances>();
 
+  template <>
+  MODEL_API OutputControlTableStyle Model::getUniqueModelObject<OutputControlTableStyle>();
+
   template <>
   MODEL_API OutputDiagnostics Model::getUniqueModelObject<OutputDiagnostics>();
 
@@ -698,6 +711,9 @@ namespace model {
   template <>
   MODEL_API OutputJSON Model::getUniqueModelObject<OutputJSON>();
 
+  template <>
+  MODEL_API OutputSQLite Model::getUniqueModelObject<OutputSQLite>();
+
   template <>
   MODEL_API OutputEnergyManagementSystem Model::getUniqueModelObject<OutputEnergyManagementSystem>();
 
diff --git a/src/model/ModelCore.i b/src/model/ModelCore.i
index 6dfe6e22d84..3fa122a8104 100644
--- a/src/model/ModelCore.i
+++ b/src/model/ModelCore.i
@@ -36,9 +36,11 @@
   %ignore openstudio::model::Model::lightingSimulationControl;
   %ignore openstudio::model::Model::outputControlFiles;
   %ignore openstudio::model::Model::outputControlReportingTolerances;
+  %ignore openstudio::model::Model::outputControlTableStyle;
   %ignore openstudio::model::Model::outputDebuggingData;
   %ignore openstudio::model::Model::outputDiagnostics;
   %ignore openstudio::model::Model::outputJSON;
+  %ignore openstudio::model::Model::outputSQLite;
   %ignore openstudio::model::Model::outputTableSummaryReports;
   %ignore openstudio::model::Model::outsideSurfaceConvectionAlgorithm;
   %ignore openstudio::model::Model::performancePrecisionTradeoffs;
diff --git a/src/model/ModelSimulation.i b/src/model/ModelSimulation.i
index b022ca8a82f..d5aa0a84dd1 100644
--- a/src/model/ModelSimulation.i
+++ b/src/model/ModelSimulation.i
@@ -74,9 +74,11 @@ UNIQUEMODELOBJECT_TEMPLATES(HeatBalanceAlgorithm);
 UNIQUEMODELOBJECT_TEMPLATES(InsideSurfaceConvectionAlgorithm);
 UNIQUEMODELOBJECT_TEMPLATES(OutputControlFiles);
 UNIQUEMODELOBJECT_TEMPLATES(OutputControlReportingTolerances);
+UNIQUEMODELOBJECT_TEMPLATES(OutputControlTableStyle);
 UNIQUEMODELOBJECT_TEMPLATES(OutputDebuggingData);
 UNIQUEMODELOBJECT_TEMPLATES(OutputDiagnostics);
 UNIQUEMODELOBJECT_TEMPLATES(OutputJSON);
+UNIQUEMODELOBJECT_TEMPLATES(OutputSQLite);
 MODELOBJECT_TEMPLATES(OutputEnvironmentalImpactFactors);
 UNIQUEMODELOBJECT_TEMPLATES(EnvironmentalImpactFactors);
 MODELOBJECT_TEMPLATES(FuelFactors);
@@ -122,9 +124,11 @@ SWIG_UNIQUEMODELOBJECT(HeatBalanceAlgorithm);
 SWIG_UNIQUEMODELOBJECT(InsideSurfaceConvectionAlgorithm);
 SWIG_UNIQUEMODELOBJECT(OutputControlFiles);
 SWIG_UNIQUEMODELOBJECT(OutputControlReportingTolerances);
+SWIG_UNIQUEMODELOBJECT(OutputControlTableStyle);
 SWIG_UNIQUEMODELOBJECT(OutputDebuggingData);
 SWIG_UNIQUEMODELOBJECT(OutputDiagnostics);
 SWIG_UNIQUEMODELOBJECT(OutputJSON);
+SWIG_UNIQUEMODELOBJECT(OutputSQLite);
 SWIG_MODELOBJECT(OutputEnvironmentalImpactFactors, 1);
 SWIG_UNIQUEMODELOBJECT(EnvironmentalImpactFactors);
 SWIG_MODELOBJECT(FuelFactors, 1);
@@ -198,6 +202,10 @@ SWIG_UNIQUEMODELOBJECT(PerformancePrecisionTradeoffs);
           return model.outputControlReportingTolerances();
         }
 
+        boost::optional<OutputControlTableStyle> outputControlTableStyle(const openstudio::model::Model& model) {
+          return model.outputControlTableStyle();
+        }
+
         boost::optional<OutputDebuggingData> outputDebuggingData(const openstudio::model::Model& model) {
           return model.outputDebuggingData();
         }
@@ -210,6 +218,10 @@ SWIG_UNIQUEMODELOBJECT(PerformancePrecisionTradeoffs);
           return model.outputJSON();
         }
 
+        boost::optional<OutputSQLite> outputSQLite(const openstudio::model::Model& model) {
+          return model.outputSQLite();
+        }
+
         boost::optional<OutputTableSummaryReports> outputTableSummaryReports(const openstudio::model::Model& model) {
           return model.outputTableSummaryReports();
         }
@@ -349,6 +361,10 @@ SWIG_UNIQUEMODELOBJECT(PerformancePrecisionTradeoffs);
         return OpenStudio.OpenStudioModelSimulation.outputControlReportingTolerances(this);
       }
 
+      public OptionalOutputControlTableStyle outputControlTableStyle() {
+        return OpenStudio.OpenStudioModelSimulation.outputControlTableStyle(this);
+      }
+
       public OptionalOutputDebuggingData outputDebuggingData() {
         return OpenStudio.OpenStudioModelSimulation.outputDebuggingData(this);
       }
@@ -361,6 +377,10 @@ SWIG_UNIQUEMODELOBJECT(PerformancePrecisionTradeoffs);
         return OpenStudio.OpenStudioModelSimulation.outputJSON(this);
       }
 
+      public OptionalOutputSQLite outputSQLite() {
+        return OpenStudio.OpenStudioModelSimulation.outputSQLite(this);
+      }
+
       public OptionalOutputTableSummaryReports outputTableSummaryReports() {
         return OpenStudio.OpenStudioModelSimulation.outputTableSummaryReports(this);
       }
diff --git a/src/model/Model_Impl.hpp b/src/model/Model_Impl.hpp
index c8ecba00025..3aaf9cbb63d 100644
--- a/src/model/Model_Impl.hpp
+++ b/src/model/Model_Impl.hpp
@@ -35,9 +35,11 @@
 #include "FoundationKivaSettings.hpp"
 #include "OutputControlFiles.hpp"
 #include "OutputControlReportingTolerances.hpp"
+#include "OutputControlTableStyle.hpp"
 #include "OutputDiagnostics.hpp"
 #include "OutputDebuggingData.hpp"
 #include "OutputJSON.hpp"
+#include "OutputSQLite.hpp"
 #include "OutputEnergyManagementSystem.hpp"
 #include "OutputTableSummaryReports.hpp"
 #include "PerformancePrecisionTradeoffs.hpp"
@@ -186,6 +188,10 @@ namespace model {
      *  object which can be significantly faster than calling getOptionalUniqueModelObject<OutputControlReportingTolerances>(). */
       boost::optional<OutputControlReportingTolerances> outputControlReportingTolerances() const;
 
+      /** Get the OutputControlTableStyle object if there is one, this implementation uses a cached reference to the OutputControlTableStyle
+     *  object which can be significantly faster than calling getOptionalUniqueModelObject<OutputControlTableStyle>(). */
+      boost::optional<OutputControlTableStyle> outputControlTableStyle() const;
+
       /** Get the OutputDiagnostics object if there is one, this implementation uses a cached reference to the OutputDiagnostics
      *  object which can be significantly faster than calling getOptionalUniqueModelObject<OutputDiagnostics>(). */
       boost::optional<OutputDiagnostics> outputDiagnostics() const;
@@ -198,6 +204,10 @@ namespace model {
      *  object which can be significantly faster than calling getOptionalUniqueModelObject<OutputJSON>(). */
       boost::optional<OutputJSON> outputJSON() const;
 
+      /** Get the OutputSQLite object if there is one, this implementation uses a cached reference to the OutputSQLite
+     *  object which can be significantly faster than calling getOptionalUniqueModelObject<OutputSQLite>(). */
+      boost::optional<OutputSQLite> outputSQLite() const;
+
       /** Get the OutputEnergyManagementSystem object if there is one, this implementation uses a cached reference to the OutputEnergyManagementSystem
      *  object which can be significantly faster than calling getOptionalUniqueModelObject<OutputControlFiles>(). */
       boost::optional<OutputEnergyManagementSystem> outputEnergyManagementSystem() const;
@@ -464,9 +474,11 @@ namespace model {
       mutable boost::optional<FoundationKivaSettings> m_cachedFoundationKivaSettings;
       mutable boost::optional<OutputControlFiles> m_cachedOutputControlFiles;
       mutable boost::optional<OutputControlReportingTolerances> m_cachedOutputControlReportingTolerances;
+      mutable boost::optional<OutputControlTableStyle> m_cachedOutputControlTableStyle;
       mutable boost::optional<OutputDiagnostics> m_cachedOutputDiagnostics;
       mutable boost::optional<OutputDebuggingData> m_cachedOutputDebuggingData;
       mutable boost::optional<OutputJSON> m_cachedOutputJSON;
+      mutable boost::optional<OutputSQLite> m_cachedOutputSQLite;
       mutable boost::optional<OutputEnergyManagementSystem> m_cachedOutputEnergyManagementSystem;
       mutable boost::optional<OutputTableSummaryReports> m_cachedOutputTableSummaryReports;
       mutable boost::optional<PerformancePrecisionTradeoffs> m_cachedPerformancePrecisionTradeoffs;
@@ -509,9 +521,11 @@ namespace model {
       void clearCachedFoundationKivaSettings(const Handle& handle);
       void clearCachedOutputControlFiles(const Handle& handle);
       void clearCachedOutputControlReportingTolerances(const Handle& handle);
+      void clearCachedOutputControlTableStyle(const Handle& handle);
       void clearCachedOutputDiagnostics(const Handle& handle);
       void clearCachedOutputDebuggingData(const Handle& handle);
       void clearCachedOutputJSON(const Handle& handle);
+      void clearCachedOutputSQLite(const Handle& handle);
       void clearCachedOutputEnergyManagementSystem(const Handle& handle);
       void clearCachedOutputTableSummaryReports(const Handle& handle);
       void clearCachedPerformancePrecisionTradeoffs(const Handle& handle);
diff --git a/src/model/OutputControlTableStyle.cpp b/src/model/OutputControlTableStyle.cpp
new file mode 100644
index 00000000000..f4b298c97e2
--- /dev/null
+++ b/src/model/OutputControlTableStyle.cpp
@@ -0,0 +1,133 @@
+/***********************************************************************************************************************
+*  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 "OutputControlTableStyle.hpp"
+#include "OutputControlTableStyle_Impl.hpp"
+
+#include <utilities/idd/OS_OutputControl_Table_Style_FieldEnums.hxx>
+#include <utilities/idd/IddEnums.hxx>
+#include <utilities/idd/IddFactory.hxx>
+
+#include "../utilities/units/Unit.hpp"
+
+#include "../utilities/core/Assert.hpp"
+
+namespace openstudio {
+namespace model {
+
+  namespace detail {
+
+    OutputControlTableStyle_Impl::OutputControlTableStyle_Impl(const IdfObject& idfObject, Model_Impl* model, bool keepHandle)
+      : ModelObject_Impl(idfObject, model, keepHandle) {
+      OS_ASSERT(idfObject.iddObject().type() == OutputControlTableStyle::iddObjectType());
+    }
+
+    OutputControlTableStyle_Impl::OutputControlTableStyle_Impl(const openstudio::detail::WorkspaceObject_Impl& other, Model_Impl* model,
+                                                               bool keepHandle)
+      : ModelObject_Impl(other, model, keepHandle) {
+      OS_ASSERT(other.iddObject().type() == OutputControlTableStyle::iddObjectType());
+    }
+
+    OutputControlTableStyle_Impl::OutputControlTableStyle_Impl(const OutputControlTableStyle_Impl& other, Model_Impl* model, bool keepHandle)
+      : ModelObject_Impl(other, model, keepHandle) {}
+
+    const std::vector<std::string>& OutputControlTableStyle_Impl::outputVariableNames() const {
+      static const std::vector<std::string> result;
+      return result;
+    }
+
+    IddObjectType OutputControlTableStyle_Impl::iddObjectType() const {
+      return OutputControlTableStyle::iddObjectType();
+    }
+
+    std::string OutputControlTableStyle_Impl::columnSeparator() const {
+      boost::optional<std::string> value = getString(OS_OutputControl_Table_StyleFields::ColumnSeparator, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    std::string OutputControlTableStyle_Impl::unitConversion() const {
+      boost::optional<std::string> value = getString(OS_OutputControl_Table_StyleFields::UnitConversion, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    bool OutputControlTableStyle_Impl::setColumnSeparator(const std::string& columnSeparator) {
+      bool result = setString(OS_OutputControl_Table_StyleFields::ColumnSeparator, columnSeparator);
+      return result;
+    }
+
+    bool OutputControlTableStyle_Impl::setUnitConversion(const std::string& unitConversion) {
+      bool result = setString(OS_OutputControl_Table_StyleFields::UnitConversion, unitConversion);
+      return result;
+    }
+
+  }  // namespace detail
+
+  IddObjectType OutputControlTableStyle::iddObjectType() {
+    return IddObjectType(IddObjectType::OS_OutputControl_Table_Style);
+  }
+
+  std::vector<std::string> OutputControlTableStyle::columnSeparatorValues() {
+    return getIddKeyNames(IddFactory::instance().getObject(iddObjectType()).get(), OS_OutputControl_Table_StyleFields::ColumnSeparator);
+  }
+
+  std::vector<std::string> OutputControlTableStyle::unitConversionValues() {
+    return getIddKeyNames(IddFactory::instance().getObject(iddObjectType()).get(), OS_OutputControl_Table_StyleFields::UnitConversion);
+  }
+
+  std::string OutputControlTableStyle::columnSeparator() const {
+    return getImpl<detail::OutputControlTableStyle_Impl>()->columnSeparator();
+  }
+
+  std::string OutputControlTableStyle::unitConversion() const {
+    return getImpl<detail::OutputControlTableStyle_Impl>()->unitConversion();
+  }
+
+  bool OutputControlTableStyle::setColumnSeparator(const std::string& columnSeparator) {
+    return getImpl<detail::OutputControlTableStyle_Impl>()->setColumnSeparator(columnSeparator);
+  }
+
+  bool OutputControlTableStyle::setUnitConversion(const std::string& unitConversion) {
+    return getImpl<detail::OutputControlTableStyle_Impl>()->setUnitConversion(unitConversion);
+  }
+
+  /// @cond
+  OutputControlTableStyle::OutputControlTableStyle(std::shared_ptr<detail::OutputControlTableStyle_Impl> impl) : ModelObject(std::move(impl)) {}
+  OutputControlTableStyle::OutputControlTableStyle(Model& model) : ModelObject(OutputControlTableStyle::iddObjectType(), model) {
+    bool ok = setColumnSeparator("HTML");
+    OS_ASSERT(ok);
+    ok = setUnitConversion("None");
+    OS_ASSERT(ok);
+  }
+
+  /// @endcond
+
+}  // namespace model
+}  // namespace openstudio
diff --git a/src/model/OutputControlTableStyle.hpp b/src/model/OutputControlTableStyle.hpp
new file mode 100644
index 00000000000..585971390b1
--- /dev/null
+++ b/src/model/OutputControlTableStyle.hpp
@@ -0,0 +1,109 @@
+/***********************************************************************************************************************
+*  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_OUTPUTCONTROLTABLESTYLE_HPP
+#define MODEL_OUTPUTCONTROLTABLESTYLE_HPP
+
+#include "ModelAPI.hpp"
+#include "ModelObject.hpp"
+
+namespace openstudio {
+
+namespace model {
+
+  namespace detail {
+
+    class OutputControlTableStyle_Impl;
+
+  }  // namespace detail
+
+  /** OutputControlTableStyle is a ModelObject that wraps the OpenStudio IDD object 'OS:OutputControl:Table:Style'. */
+  class MODEL_API OutputControlTableStyle : public ModelObject
+  {
+   public:
+    /** @name Constructors and Destructors */
+    //@{
+
+    virtual ~OutputControlTableStyle() {}
+
+    //@}
+
+    static IddObjectType iddObjectType();
+
+    static std::vector<std::string> columnSeparatorValues();
+
+    static std::vector<std::string> unitConversionValues();
+
+    /** @name Getters */
+    //@{
+
+    std::string columnSeparator() const;
+
+    std::string unitConversion() const;
+
+    //@}
+    /** @name Setters */
+    //@{
+
+    bool setColumnSeparator(const std::string& columnSeparator);
+
+    bool setUnitConversion(const std::string& unitConversion);
+
+    //@}
+    /** @name Other */
+    //@{
+
+    //@}
+   protected:
+    /// @cond
+    typedef detail::OutputControlTableStyle_Impl ImplType;
+
+    explicit OutputControlTableStyle(std::shared_ptr<detail::OutputControlTableStyle_Impl> impl);
+
+    friend class detail::OutputControlTableStyle_Impl;
+    friend class Model;
+    friend class IdfObject;
+    friend class openstudio::detail::IdfObject_Impl;
+    explicit OutputControlTableStyle(Model& model);
+
+    /// @endcond
+   private:
+    REGISTER_LOGGER("openstudio.model.OutputControlTableStyle");
+  };
+
+  /** \relates OutputControlTableStyle*/
+  typedef boost::optional<OutputControlTableStyle> OptionalOutputControlTableStyle;
+
+  /** \relates OutputControlTableStyle*/
+  typedef std::vector<OutputControlTableStyle> OutputControlTableStyleVector;
+
+}  // namespace model
+}  // namespace openstudio
+
+#endif  // MODEL_OUTPUTCONTROLTABLESTYLE_HPP
diff --git a/src/model/OutputControlTableStyle_Impl.hpp b/src/model/OutputControlTableStyle_Impl.hpp
new file mode 100644
index 00000000000..3c1e7de9402
--- /dev/null
+++ b/src/model/OutputControlTableStyle_Impl.hpp
@@ -0,0 +1,97 @@
+/***********************************************************************************************************************
+*  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_OUTPUTCONTROLTABLESTYLE_IMPL_HPP
+#define MODEL_OUTPUTCONTROLTABLESTYLE_IMPL_HPP
+
+#include "ModelAPI.hpp"
+#include "ModelObject_Impl.hpp"
+
+namespace openstudio {
+namespace model {
+
+  namespace detail {
+
+    /** OutputControlTableStyle_Impl is a ModelObject_Impl that is the implementation class for OutputControlTableStyle.*/
+    class MODEL_API OutputControlTableStyle_Impl : public ModelObject_Impl
+    {
+
+     public:
+      /** @name Constructors and Destructors */
+      //@{
+
+      OutputControlTableStyle_Impl(const IdfObject& idfObject, Model_Impl* model, bool keepHandle);
+
+      OutputControlTableStyle_Impl(const openstudio::detail::WorkspaceObject_Impl& other, Model_Impl* model, bool keepHandle);
+
+      OutputControlTableStyle_Impl(const OutputControlTableStyle_Impl& other, Model_Impl* model, bool keepHandle);
+
+      virtual ~OutputControlTableStyle_Impl() {}
+
+      //@}
+
+      /** @name Virtual Methods */
+      //@{
+
+      virtual const std::vector<std::string>& outputVariableNames() const override;
+
+      virtual IddObjectType iddObjectType() const override;
+
+      //@}
+      /** @name Getters */
+      //@{
+
+      std::string columnSeparator() const;
+
+      std::string unitConversion() const;
+
+      //@}
+      /** @name Setters */
+      //@{
+
+      bool setColumnSeparator(const std::string& columnSeparator);
+
+      bool setUnitConversion(const std::string& unitConversion);
+
+      //@}
+      /** @name Other */
+      //@{
+
+      //@}
+     protected:
+     private:
+      REGISTER_LOGGER("openstudio.model.OutputControlTableStyle");
+    };
+
+  }  // namespace detail
+
+}  // namespace model
+}  // namespace openstudio
+
+#endif  // MODEL_OUTPUTCONTROLTABLESTYLE_IMPL_HPP
diff --git a/src/model/OutputSQLite.cpp b/src/model/OutputSQLite.cpp
new file mode 100644
index 00000000000..66913b2aa87
--- /dev/null
+++ b/src/model/OutputSQLite.cpp
@@ -0,0 +1,135 @@
+/***********************************************************************************************************************
+*  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 "OutputSQLite.hpp"
+#include "OutputSQLite_Impl.hpp"
+
+#include "Model.hpp"
+#include "Model_Impl.hpp"
+
+#include <utilities/idd/IddFactory.hxx>
+#include <utilities/idd/IddEnums.hxx>
+#include <utilities/idd/OS_Output_SQLite_FieldEnums.hxx>
+
+#include "../utilities/core/Assert.hpp"
+
+namespace openstudio {
+namespace model {
+
+  namespace detail {
+
+    OutputSQLite_Impl::OutputSQLite_Impl(const IdfObject& idfObject, Model_Impl* model, bool keepHandle)
+      : ModelObject_Impl(idfObject, model, keepHandle) {
+      OS_ASSERT(idfObject.iddObject().type() == OutputSQLite::iddObjectType());
+    }
+
+    OutputSQLite_Impl::OutputSQLite_Impl(const openstudio::detail::WorkspaceObject_Impl& other, Model_Impl* model, bool keepHandle)
+      : ModelObject_Impl(other, model, keepHandle) {
+      OS_ASSERT(other.iddObject().type() == OutputSQLite::iddObjectType());
+    }
+
+    OutputSQLite_Impl::OutputSQLite_Impl(const OutputSQLite_Impl& other, Model_Impl* model, bool keepHandle)
+      : ModelObject_Impl(other, model, keepHandle) {}
+
+    const std::vector<std::string>& OutputSQLite_Impl::outputVariableNames() const {
+      static const std::vector<std::string> result;
+      if (result.empty()) {
+      }
+      return result;
+    }
+
+    IddObjectType OutputSQLite_Impl::iddObjectType() const {
+      return OutputSQLite::iddObjectType();
+    }
+
+    std::string OutputSQLite_Impl::optionType() const {
+      boost::optional<std::string> value = getString(OS_Output_SQLiteFields::OptionType, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    std::string OutputSQLite_Impl::unitConversionforTabularData() const {
+      boost::optional<std::string> value = getString(OS_Output_SQLiteFields::UnitConversionforTabularData, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    bool OutputSQLite_Impl::setOptionType(const std::string& optionType) {
+      bool result = setString(OS_Output_SQLiteFields::OptionType, optionType);
+      return result;
+    }
+
+    bool OutputSQLite_Impl::setUnitConversionforTabularData(const std::string& unitConversionforTabularData) {
+      bool result = setString(OS_Output_SQLiteFields::UnitConversionforTabularData, unitConversionforTabularData);
+      return result;
+    }
+
+  }  // namespace detail
+
+  IddObjectType OutputSQLite::iddObjectType() {
+    return IddObjectType(IddObjectType::OS_Output_SQLite);
+  }
+
+  std::vector<std::string> OutputSQLite::optionTypeValues() {
+    return getIddKeyNames(IddFactory::instance().getObject(iddObjectType()).get(), OS_Output_SQLiteFields::OptionType);
+  }
+
+  std::vector<std::string> OutputSQLite::unitConversionforTabularDataValues() {
+    return getIddKeyNames(IddFactory::instance().getObject(iddObjectType()).get(), OS_Output_SQLiteFields::UnitConversionforTabularData);
+  }
+
+  std::string OutputSQLite::optionType() const {
+    return getImpl<detail::OutputSQLite_Impl>()->optionType();
+  }
+
+  std::string OutputSQLite::unitConversionforTabularData() const {
+    return getImpl<detail::OutputSQLite_Impl>()->unitConversionforTabularData();
+  }
+
+  bool OutputSQLite::setOptionType(const std::string& optionType) {
+    return getImpl<detail::OutputSQLite_Impl>()->setOptionType(optionType);
+  }
+
+  bool OutputSQLite::setUnitConversionforTabularData(const std::string& unitConversionforTabularData) {
+    return getImpl<detail::OutputSQLite_Impl>()->setUnitConversionforTabularData(unitConversionforTabularData);
+  }
+
+  /// @cond
+  OutputSQLite::OutputSQLite(std::shared_ptr<detail::OutputSQLite_Impl> impl) : ModelObject(impl) {}
+  OutputSQLite::OutputSQLite(Model& model) : ModelObject(OutputSQLite::iddObjectType(), model) {
+    bool ok = setOptionType("SimpleAndTabular");
+    OS_ASSERT(ok);
+    ok = setUnitConversionforTabularData("UseOutputControlTableStyle");
+    OS_ASSERT(ok);
+  }
+
+  /// @endcond
+
+}  // namespace model
+}  // namespace openstudio
diff --git a/src/model/OutputSQLite.hpp b/src/model/OutputSQLite.hpp
new file mode 100644
index 00000000000..7ca6854b564
--- /dev/null
+++ b/src/model/OutputSQLite.hpp
@@ -0,0 +1,108 @@
+/***********************************************************************************************************************
+*  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_OUTPUTSQLITE_HPP
+#define MODEL_OUTPUTSQLITE_HPP
+
+#include <model/ModelAPI.hpp>
+#include "ModelObject.hpp"
+
+namespace openstudio {
+namespace model {
+
+  namespace detail {
+
+    class OutputSQLite_Impl;
+
+  }  // namespace detail
+
+  /** OutputSQLite is a ModelObject that wraps the OpenStudio IDD object 'OS:Output:SQLite'. */
+  class MODEL_API OutputSQLite : public ModelObject
+  {
+   public:
+    /** @name Constructors and Destructors */
+    //@{
+
+    virtual ~OutputSQLite() {}
+
+    //@}
+
+    static IddObjectType iddObjectType();
+
+    static std::vector<std::string> optionTypeValues();
+
+    static std::vector<std::string> unitConversionforTabularDataValues();
+
+    /** @name Getters */
+    //@{
+
+    std::string optionType() const;
+
+    std::string unitConversionforTabularData() const;
+
+    //@}
+    /** @name Setters */
+    //@{
+
+    bool setOptionType(const std::string& optionType);
+
+    bool setUnitConversionforTabularData(const std::string& unitConversionforTabularData);
+
+    //@}
+    /** @name Other */
+    //@{
+
+    //@}
+   protected:
+    /// @cond
+    typedef detail::OutputSQLite_Impl ImplType;
+
+    explicit OutputSQLite(std::shared_ptr<detail::OutputSQLite_Impl> impl);
+
+    friend class detail::OutputSQLite_Impl;
+    friend class Model;
+    friend class IdfObject;
+    friend class openstudio::detail::IdfObject_Impl;
+    explicit OutputSQLite(Model& model);
+
+    /// @endcond
+   private:
+    REGISTER_LOGGER("openstudio.model.OutputSQLite");
+  };
+
+  /** \relates OutputSQLite*/
+  typedef boost::optional<OutputSQLite> OptionalOutputSQLite;
+
+  /** \relates OutputSQLite*/
+  typedef std::vector<OutputSQLite> OutputSQLiteVector;
+
+}  // namespace model
+}  // namespace openstudio
+
+#endif  // MODEL_OUTPUTSQLITE_HPP
diff --git a/src/model/OutputSQLite_Impl.hpp b/src/model/OutputSQLite_Impl.hpp
new file mode 100644
index 00000000000..029ca891921
--- /dev/null
+++ b/src/model/OutputSQLite_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_OUTPUTSQLITE_IMPL_HPP
+#define MODEL_OUTPUTSQLITE_IMPL_HPP
+
+#include <model/ModelAPI.hpp>
+#include "ModelObject_Impl.hpp"
+
+namespace openstudio {
+namespace model {
+
+  namespace detail {
+
+    /** OutputSQLite_Impl is a ModelObject_Impl that is the implementation class for OutputSQLite.*/
+    class MODEL_API OutputSQLite_Impl : public ModelObject_Impl
+    {
+     public:
+      /** @name Constructors and Destructors */
+      //@{
+
+      OutputSQLite_Impl(const IdfObject& idfObject, Model_Impl* model, bool keepHandle);
+
+      OutputSQLite_Impl(const openstudio::detail::WorkspaceObject_Impl& other, Model_Impl* model, bool keepHandle);
+
+      OutputSQLite_Impl(const OutputSQLite_Impl& other, Model_Impl* model, bool keepHandle);
+
+      virtual ~OutputSQLite_Impl() {}
+
+      //@}
+      /** @name Virtual Methods */
+      //@{
+
+      virtual const std::vector<std::string>& outputVariableNames() const override;
+
+      virtual IddObjectType iddObjectType() const override;
+
+      //@}
+      /** @name Getters */
+      //@{
+
+      std::string optionType() const;
+
+      std::string unitConversionforTabularData() const;
+
+      //@}
+      /** @name Setters */
+      //@{
+
+      bool setOptionType(const std::string& optionType);
+
+      bool setUnitConversionforTabularData(const std::string& unitConversionforTabularData);
+
+      //@}
+      /** @name Other */
+      //@{
+
+      //@}
+     protected:
+     private:
+      REGISTER_LOGGER("openstudio.model.OutputSQLite");
+    };
+
+  }  // namespace detail
+
+}  // namespace model
+}  // namespace openstudio
+
+#endif  // MODEL_OUTPUTSQLITE_IMPL_HPP


Test patch:
diff --git a/src/model/test/Model_GTest.cpp b/src/model/test/Model_GTest.cpp
index 357f41a1ebd..61fa21a04d7 100644
--- a/src/model/test/Model_GTest.cpp
+++ b/src/model/test/Model_GTest.cpp
@@ -82,12 +82,16 @@
 #include "../OutputControlFiles_Impl.hpp"
 #include "../OutputControlReportingTolerances.hpp"
 #include "../OutputControlReportingTolerances_Impl.hpp"
+#include "../OutputControlTableStyle.hpp"
+#include "../OutputControlTableStyle_Impl.hpp"
 #include "../OutputDiagnostics.hpp"
 #include "../OutputDiagnostics_Impl.hpp"
 #include "../OutputDebuggingData.hpp"
 #include "../OutputDebuggingData_Impl.hpp"
 #include "../OutputJSON.hpp"
 #include "../OutputJSON_Impl.hpp"
+#include "../OutputSQLite.hpp"
+#include "../OutputSQLite_Impl.hpp"
 #include "../OutputEnergyManagementSystem.hpp"
 #include "../OutputEnergyManagementSystem_Impl.hpp"
 #include "../OutputTableSummaryReports.hpp"
@@ -952,6 +956,12 @@ TEST_F(ModelFixture, UniqueModelObjectCachedGetters) {
   EXPECT_TRUE(m.getOptionalUniqueModelObject<OutputControlReportingTolerances>());
   EXPECT_EQ(++i, m.getModelObjects<ModelObject>().size());
 
+  EXPECT_FALSE(m.getOptionalUniqueModelObject<OutputControlTableStyle>());
+  EXPECT_EQ(i, m.getModelObjects<ModelObject>().size());
+  auto outputControlTableStyle = m.getUniqueModelObject<OutputControlTableStyle>();
+  EXPECT_TRUE(m.getOptionalUniqueModelObject<OutputControlTableStyle>());
+  EXPECT_EQ(++i, m.getModelObjects<ModelObject>().size());
+
   EXPECT_FALSE(m.getOptionalUniqueModelObject<OutputDiagnostics>());
   EXPECT_EQ(i, m.getModelObjects<ModelObject>().size());
   auto outputDiagnostics = m.getUniqueModelObject<OutputDiagnostics>();
@@ -970,6 +980,12 @@ TEST_F(ModelFixture, UniqueModelObjectCachedGetters) {
   EXPECT_TRUE(m.getOptionalUniqueModelObject<OutputJSON>());
   EXPECT_EQ(++i, m.getModelObjects<ModelObject>().size());
 
+  EXPECT_FALSE(m.getOptionalUniqueModelObject<OutputSQLite>());
+  EXPECT_EQ(i, m.getModelObjects<ModelObject>().size());
+  auto outputSQLite = m.getUniqueModelObject<OutputSQLite>();
+  EXPECT_TRUE(m.getOptionalUniqueModelObject<OutputSQLite>());
+  EXPECT_EQ(++i, m.getModelObjects<ModelObject>().size());
+
   EXPECT_FALSE(m.getOptionalUniqueModelObject<OutputEnergyManagementSystem>());
   EXPECT_EQ(i, m.getModelObjects<ModelObject>().size());
   auto outputEnergyManagementSystem = m.getUniqueModelObject<OutputEnergyManagementSystem>();
diff --git a/src/model/test/OutputControlTableStyle_GTest.cpp b/src/model/test/OutputControlTableStyle_GTest.cpp
new file mode 100644
index 00000000000..1a3e3868936
--- /dev/null
+++ b/src/model/test/OutputControlTableStyle_GTest.cpp
@@ -0,0 +1,55 @@
+/***********************************************************************************************************************
+*  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 "../OutputControlTableStyle.hpp"
+#include "../OutputControlTableStyle_Impl.hpp"
+
+using namespace openstudio;
+using namespace openstudio::model;
+
+TEST_F(ModelFixture, OutputControlTableStyle_GettersSetters) {
+  Model model;
+  OutputControlTableStyle outputControlTableStyle = model.getUniqueModelObject<OutputControlTableStyle>();
+
+  EXPECT_EQ("HTML", outputControlTableStyle.columnSeparator());
+  EXPECT_EQ("None", outputControlTableStyle.unitConversion());
+
+  EXPECT_TRUE(outputControlTableStyle.setColumnSeparator("Tab"));
+  EXPECT_TRUE(outputControlTableStyle.setUnitConversion("JtoKWH"));
+  EXPECT_EQ("Tab", outputControlTableStyle.columnSeparator());
+  EXPECT_EQ("JtoKWH", outputControlTableStyle.unitConversion());
+
+  EXPECT_FALSE(outputControlTableStyle.setColumnSeparator("Invalid"));
+  EXPECT_FALSE(outputControlTableStyle.setUnitConversion("AnotherInvalid"));
+  EXPECT_EQ("Tab", outputControlTableStyle.columnSeparator());
+  EXPECT_EQ("JtoKWH", outputControlTableStyle.unitConversion());
+}
diff --git a/src/model/test/OutputSQLite_GTest.cpp b/src/model/test/OutputSQLite_GTest.cpp
new file mode 100644
index 00000000000..149944a46c5
--- /dev/null
+++ b/src/model/test/OutputSQLite_GTest.cpp
@@ -0,0 +1,55 @@
+/***********************************************************************************************************************
+*  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 "../OutputSQLite.hpp"
+#include "../OutputSQLite_Impl.hpp"
+
+using namespace openstudio;
+using namespace openstudio::model;
+
+TEST_F(ModelFixture, OutputSQLite_GettersSetters) {
+
+  Model model;
+  OutputSQLite outputSQLite = model.getUniqueModelObject<OutputSQLite>();
+
+  EXPECT_EQ("SimpleAndTabular", outputSQLite.optionType());
+  EXPECT_EQ("UseOutputControlTableStyle", outputSQLite.unitConversionforTabularData());
+
+  EXPECT_TRUE(outputSQLite.setOptionType("Simple"));
+  EXPECT_TRUE(outputSQLite.setUnitConversionforTabularData("None"));
+  EXPECT_EQ("Simple", outputSQLite.optionType());
+  EXPECT_EQ("None", outputSQLite.unitConversionforTabularData());
+
+  EXPECT_FALSE(outputSQLite.setOptionType("Invalid"));
+  EXPECT_FALSE(outputSQLite.setUnitConversionforTabularData("AnotherInvalid"));
+  EXPECT_EQ("Simple", outputSQLite.optionType());
+  EXPECT_EQ("None", outputSQLite.unitConversionforTabularData());
+}  // End of Getter_Setters test
diff --git a/src/model/test/UniqueModelObject_GTest.cpp b/src/model/test/UniqueModelObject_GTest.cpp
index 7109e4a841e..ea6c604c7ce 100644
--- a/src/model/test/UniqueModelObject_GTest.cpp
+++ b/src/model/test/UniqueModelObject_GTest.cpp
@@ -58,6 +58,8 @@
 #include "../OutputControlFiles_Impl.hpp"
 #include "../OutputControlReportingTolerances.hpp"
 #include "../OutputControlReportingTolerances_Impl.hpp"
+#include "../OutputControlTableStyle.hpp"
+#include "../OutputControlTableStyle_Impl.hpp"
 #include "../OutputDebuggingData.hpp"
 #include "../OutputDebuggingData_Impl.hpp"
 #include "../OutputDiagnostics.hpp"
@@ -66,6 +68,8 @@
 #include "../OutputEnergyManagementSystem_Impl.hpp"
 #include "../OutputJSON.hpp"
 #include "../OutputJSON_Impl.hpp"
+#include "../OutputSQLite.hpp"
+#include "../OutputSQLite_Impl.hpp"
 #include "../PerformancePrecisionTradeoffs.hpp"
 #include "../PerformancePrecisionTradeoffs_Impl.hpp"
 #include "../RadianceParameters.hpp"
@@ -393,6 +397,31 @@ TEST_F(ModelFixture, OutputControlReportingTolerances_UniqueModelObject_Clone) {
   EXPECT_EQ("! Custom Object", outputControlReportingTolerancesClone2.comment());
 }
 
+TEST_F(ModelFixture, OutputControlTableStyle_UniqueModelObject_Clone) {
+  // create a model to use
+  Model model;
+
+  // Get the Unique ModelObject
+  EXPECT_FALSE(model.getOptionalUniqueModelObject<OutputControlTableStyle>());
+  OutputControlTableStyle outputControlTableStyle = model.getUniqueModelObject<OutputControlTableStyle>();
+  EXPECT_TRUE(model.getOptionalUniqueModelObject<OutputControlTableStyle>());
+  // We use a comment to see if cloning to another model works
+  outputControlTableStyle.setComment("Custom Object");
+
+  // clone it into the same model
+  OutputControlTableStyle outputControlTableStyleClone = outputControlTableStyle.clone(model).cast<OutputControlTableStyle>();
+  // UniqueModelObject: should be the same as the original
+  EXPECT_EQ(outputControlTableStyle, outputControlTableStyleClone);
+  EXPECT_EQ("! Custom Object", outputControlTableStyleClone.comment());
+
+  // clone it into a different model
+  Model model2;
+  EXPECT_FALSE(model2.getOptionalUniqueModelObject<OutputControlTableStyle>());
+  OutputControlTableStyle outputControlTableStyleClone2 = outputControlTableStyle.clone(model2).cast<OutputControlTableStyle>();
+  EXPECT_TRUE(model2.getOptionalUniqueModelObject<OutputControlTableStyle>());
+  EXPECT_EQ("! Custom Object", outputControlTableStyleClone2.comment());
+}
+
 TEST_F(ModelFixture, OutputDebuggingData_UniqueModelObject_Clone) {
   // create a model to use
   Model model;
@@ -493,6 +522,31 @@ TEST_F(ModelFixture, OutputJSON_UniqueModelObject_Clone) {
   EXPECT_EQ("! Custom Object", outputJSONClone2.comment());
 }
 
+TEST_F(ModelFixture, OutputSQLite_UniqueModelObject_Clone) {
+  // create a model to use
+  Model model;
+
+  // Get the Unique ModelObject
+  EXPECT_FALSE(model.getOptionalUniqueModelObject<OutputSQLite>());
+  OutputSQLite outputSQLite = model.getUniqueModelObject<OutputSQLite>();
+  EXPECT_TRUE(model.getOptionalUniqueModelObject<OutputSQLite>());
+  // We use a comment to see if cloning to another model works
+  outputSQLite.setComment("Custom Object");
+
+  // clone it into the same model
+  OutputSQLite outputSQLiteClone = outputSQLite.clone(model).cast<OutputSQLite>();
+  // UniqueModelObject: should be the same as the original
+  EXPECT_EQ(outputSQLite, outputSQLiteClone);
+  EXPECT_EQ("! Custom Object", outputSQLiteClone.comment());
+
+  // clone it into a different model
+  Model model2;
+  EXPECT_FALSE(model2.getOptionalUniqueModelObject<OutputSQLite>());
+  OutputSQLite outputSQLiteClone2 = outputSQLite.clone(model2).cast<OutputSQLite>();
+  EXPECT_TRUE(model2.getOptionalUniqueModelObject<OutputSQLite>());
+  EXPECT_EQ("! Custom Object", outputSQLiteClone2.comment());
+}
+
 TEST_F(ModelFixture, PerformancePrecisionTradeoffs_UniqueModelObject_Clone) {
   // create a model to use
   Model model;