Repository: NREL/OpenStudio (language: python)

Issue:
Update to EnergyPlus 23.1.0
Enhancement Request
--------------
Once v23.1-IOFreeze is released, we should update to it.

## Detailed Description

https://github.com/NREL/EnergyPlus/blob/develop/src/Transition/InputRulesFiles/Rules22-2-0-to-23-1-0.md

### Major changes

### New additions

- [x] `ZoneAirHeatBalanceAlgorithm`: new "Do Space Heat Balance for Sizing" and "Do Space Heat Balance for Simulation" fields. 
- [ ] `HeatPump:AirToWater:FuelFired:Heating` and `HeatPump:AirToWater:FuelFired:Cooling`: new objects. https://github.com/NREL/OpenStudio/pull/4806
- [ ] `OutputControl:Timestamp`: new object. https://github.com/NREL/OpenStudio/pull/4808
- [ ] `SolarCollectorPerformance:PhotovoltaicThermal:BIPVT`: new object. https://github.com/NREL/OpenStudio/pull/4813
- [ ] `MaterialProperty:VariableAbsorptance`: new object. https://github.com/NREL/OpenStudio/issues/4801

### Minor stuff

### Other



Discussion / hints:

Fix patch:
diff --git a/CMakeLists.txt b/CMakeLists.txt
index fd21ad5600b..dce98b1a4ab 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -16,7 +16,7 @@ if(CCACHE_PROGRAM)
 endif()
 
 # Project macro can only take digits in the version, it splits these out to specific variables
-project(OpenStudio VERSION 3.5.2)
+project(OpenStudio VERSION 3.6.0)
 
 include(CMake/compiler_flags.cmake)
 
@@ -189,19 +189,18 @@ if(hasParent)
 endif()
 
 # EnergyPlus Idd version
-set(ENERGYPLUS_VERSION_MAJOR 22)
-set(ENERGYPLUS_VERSION_MINOR 2)
+set(ENERGYPLUS_VERSION_MAJOR 23)
+set(ENERGYPLUS_VERSION_MINOR 1)
 set(ENERGYPLUS_VERSION_PATCH 0)
 set(ENERGYPLUS_VERSION "${ENERGYPLUS_VERSION_MAJOR}.${ENERGYPLUS_VERSION_MINOR}.${ENERGYPLUS_VERSION_PATCH}")
 # Build SHA is not required to have a value, but if it does OpenStudio will require this build.
-set(ENERGYPLUS_BUILD_SHA "aa78da9668")
+set(ENERGYPLUS_BUILD_SHA "ff86a13c18")
 
 # ENERGYPLUS_RELEASE_NAME is used to locate the E+ download
 # from the github releases
-set(ENERGYPLUS_RELEASE_NAME "v22.2.0-WithIHGFix")
+set(ENERGYPLUS_RELEASE_NAME "v23.1.0-IOFreeze")
 
-# TODO: Temporary change to a fork until a patched release is issued on NREL's
-set(ENERGYPLUS_REPO "jmarrec")
+set(ENERGYPLUS_REPO "NREL")
 
 # Radiance
 set(RADIANCE_VERSION "5.0.a.12")
@@ -604,10 +603,10 @@ endif()
 if(UNIX)
   if(APPLE)
     if (ARCH MATCHES "arm64")
-      set(ENERGYPLUS_EXPECTED_HASH 35ba21891e7059987391f1ab59958025)
+      set(ENERGYPLUS_EXPECTED_HASH 1494609bef92599b4dd266ff859d8304)
       set(ENERGYPLUS_PLATFORM "Darwin-macOS12.1-arm64")
     else()
-      set(ENERGYPLUS_EXPECTED_HASH 481fafde9496735d809e810bd95b720f)
+      set(ENERGYPLUS_EXPECTED_HASH 4dafda1a64ac9160f38c7750daceec4b)
       set(ENERGYPLUS_PLATFORM "Darwin-macOS10.15-x86_64")
     endif()
   elseif(LSB_RELEASE_ID_SHORT MATCHES "CentOS")
@@ -616,9 +615,9 @@ if(UNIX)
     set(ENERGYPLUS_PLATFORM "Centos7-x86_64")
   else()
     if(LSB_RELEASE_VERSION_SHORT MATCHES "20.04")
-      set(ENERGYPLUS_EXPECTED_HASH fd2b9e55a15227f872601e9e57ffe819)
+      set(ENERGYPLUS_EXPECTED_HASH fe5a4b8dd60fec342b7ed1f9216b7061)
     else() # 18.04
-      set(ENERGYPLUS_EXPECTED_HASH 05a97ef513fa3f2ac7678bd9eef026db)
+      set(ENERGYPLUS_EXPECTED_HASH fec576b594e24c11f3f83c6c3bb1e897)
     endif()
     set(ENERGYPLUS_PLATFORM "Linux${ENERGYPLUS_SYSTEM_VERSION}-x86_64")
   endif()
@@ -652,11 +651,11 @@ elseif(WIN32)
   if(CMAKE_SIZEOF_VOID_P EQUAL 8) # 64 bit
     set(ENERGYPLUS_PATH "EnergyPlus-${ENERGYPLUS_VERSION}-${ENERGYPLUS_BUILD_SHA}-Windows-x86_64")
     set(ENERGYPLUS_ARCH 64)
-    set(ENERGYPLUS_EXPECTED_HASH 8611314c5056abedca59144627e79078)
+    set(ENERGYPLUS_EXPECTED_HASH 0a6a1100cf7bce4a8dd93a1ec4c8a2bb)
   else()
     set(ENERGYPLUS_PATH "EnergyPlus-${ENERGYPLUS_VERSION}-${ENERGYPLUS_BUILD_SHA}-Windows-i386")
     set(ENERGYPLUS_ARCH 32)
-    set(ENERGYPLUS_EXPECTED_HASH 76afec50c80fc4b53f2f4da572573688)
+    set(ENERGYPLUS_EXPECTED_HASH 0baa693ae4bca138933331632ebaf5e5)
   endif()
   if(EXISTS "${PROJECT_BINARY_DIR}/${ENERGYPLUS_PATH}.zip")
     file(MD5 "${PROJECT_BINARY_DIR}/${ENERGYPLUS_PATH}.zip" ENERGYPLUS_HASH)
diff --git a/resources/CMakeLists.txt b/resources/CMakeLists.txt
index d55ae26b0d5..6ff9a5e3d33 100644
--- a/resources/CMakeLists.txt
+++ b/resources/CMakeLists.txt
@@ -123,6 +123,7 @@ set(utilities_resources_src
   utilities/SqlFile/1ZoneEvapCooler-V9-6-0.sql
   utilities/SqlFile/1ZoneEvapCooler-V22-1-0.sql
   utilities/SqlFile/1ZoneEvapCooler-V22-2-0.sql
+  utilities/SqlFile/1ZoneEvapCooler-V23-1-0.sql
   utilities/xml/base.xml
   utilities/xml/hpxml_with_error.xml
   utilities/xml/schema/HPXML.xsd
diff --git a/resources/energyplus/ProposedEnergy+.idd b/resources/energyplus/ProposedEnergy+.idd
index 955339c17c5..b3fc2b54416 100644
--- a/resources/energyplus/ProposedEnergy+.idd
+++ b/resources/energyplus/ProposedEnergy+.idd
@@ -1,4 +1,4 @@
-!IDD_Version 22.2.0
+!IDD_Version 23.1.0
 !IDD_BUILD TBD
 ! **************************************************************************
 ! This file is the Input Data Dictionary (IDD) for EnergyPlus.
@@ -404,7 +404,7 @@ Version,
       \format singleLine
       \min-fields 1
   A1 ; \field Version Identifier
-      \default 22.2
+      \default 23.1
 
 SimulationControl,
       \unique-object
@@ -768,16 +768,29 @@ HeatBalanceSettings:ConductionFiniteDifference,
        \maximum 0.01
 
 ZoneAirHeatBalanceAlgorithm,
-       \memo Determines which algorithm will be used to solve the zone air heat balance.
+       \memo Controls the zone/space air heat balance.
        \unique-object
        \format singleLine
-       \min-fields 1
-  A1 ; \field Algorithm
+       \min-fields 2
+  A1 , \field Algorithm
+       \note Determines which algorithm will be used to solve the air heat balance
        \type choice
        \key ThirdOrderBackwardDifference
        \key AnalyticalSolution
        \key EulerMethod
        \default ThirdOrderBackwardDifference
+  A2 , \field Do Space Heat Balance for Sizing
+       \note If yes, space heat balance will be calculated and reported during sizing.
+       \type choice
+       \key No
+       \key Yes
+       \default No
+  A3 ; \field Do Space Heat Balance for Simulation
+       \note If yes, space heat balance will be calculated and reported during simulation.
+       \type choice
+       \key No
+       \key Yes
+       \default No
 
 ZoneAirContaminantBalance,
        \memo Determines which contaminant concentration will be simulates.
diff --git a/resources/model/OpenStudio.idd b/resources/model/OpenStudio.idd
index c2805da6006..ec27818b8ee 100644
--- a/resources/model/OpenStudio.idd
+++ b/resources/model/OpenStudio.idd
@@ -1,4 +1,4 @@
-!IDD_Version 3.5.2
+!IDD_Version 3.6.0
 ! *****************************************************************************
 ! This file is the Input Data Dictionary (IDD) for OpenStudio Model.
 !
@@ -40,7 +40,7 @@ OS:Version,
        \required-field
   A2, \field Version Identifier
        \type alpha
-       \default 3.5.2
+       \default 3.6.0
   A3; \field Prerelease Identifier
        \type alpha
 
@@ -691,19 +691,32 @@ OS:ZoneAirContaminantBalance,
        \object-list ScheduleNames
 
 OS:ZoneAirHeatBalanceAlgorithm,
-       \memo Determines which algorithm will be used to solve the zone air heat balance.
+       \memo Controls the zone/space air heat balance.
        \unique-object
        \format singleLine
-       \min-fields 1
+       \min-fields 4
   A1, \field Handle
        \type handle
        \required-field
-  A2; \field Algorithm
+  A2, \field Algorithm
+       \note Determines which algorithm will be used to solve the air heat balance
        \type choice
        \default ThirdOrderBackwardDifference
        \key ThirdOrderBackwardDifference
        \key AnalyticalSolution
        \key EulerMethod
+  A3, \field Do Space Heat Balance for Sizing
+       \note If yes, space heat balance will be calculated and reported during sizing.
+       \type choice
+       \key No
+       \key Yes
+       \default No
+  A4; \field Do Space Heat Balance for Simulation
+       \note If yes, space heat balance will be calculated and reported during simulation.
+       \type choice
+       \key No
+       \key Yes
+       \default No
 
 OS:ZoneAirMassFlowConservation,
        \memo Enforces the zone air mass flow balance by adjusting zone mixing object flow rates.
diff --git a/resources/utilities/SqlFile/1ZoneEvapCooler-V23-1-0.idf b/resources/utilities/SqlFile/1ZoneEvapCooler-V23-1-0.idf
new file mode 100644
index 00000000000..d10a535cece
--- /dev/null
+++ b/resources/utilities/SqlFile/1ZoneEvapCooler-V23-1-0.idf
@@ -0,0 +1,642 @@
+!-Generator IDFEditor 1.34
+!-Option OriginalOrderTop UseSpecialFormat
+!-NOTE: All comments with '!-' are ignored by the IDFEditor and are generated automatically.
+!-      Use '!' comments if they need to be retained when using the IDFEditor.
+! 1ZoneEvapCooler.idf
+!
+! Basic file description:  This file models a small one-zone house with a whole-house direct evaporative cooler system.
+!                          Because evaporative coolers cannot be controlled with the ZoneControl:Thermostat object,
+!                          this file illustrates how an evaporative cooler system can be thermostatically controlled
+!                          in a crude manner using the AvailabilityManager objects:
+!
+!                              AvailabilityManager:LowTemperatureTurnOff
+!                              AvailabilityManager:HighTemperatureTurnOn
+!
+!                          Availability managers are capable of turning on or off the fan for an air system (or the pump
+!                          for a plant system) by monitoring temperature conditions at a user-specified system node.
+!                          In this model, the availability managers are monitoring the zone outlet air node to act as
+!                          a crude thermostatic control for the zone.
+!
+!                          Keep in mind that availability manager control is "lagged".  This means that the node
+!                          conditions from the previous time step are used to make control decisions at the current
+!                          time step.
+!
+!                          There are two ways to use the availability managers for controlling an evaporative cooler:
+!
+!                              Method 1.  The fan is scheduled to be available at all times, meaning that the system
+!                                         is on all the time by default.  This usually results in over-cooling.
+!                                         To prevent over-cooling, the LOW TEMPERATURE TURN OFF object is used to
+!                                         turn off the system fan when the temperature falls below the setpoint (23 C).
+!
+!                              Method 2.  The fan is scheduled to be unavailable at all times, meaning that the system
+!                                         is off all the time by default.  This usually results in under-cooling.
+!                                         To prevent under-cooling, the HIGH TEMPERATURE TURN ON object is used to
+!                                         turn on the system fan when the temperature rises above the setpoint (26 C).
+!
+!                          With either method, all other equipment is scheduled to be always available.  In this file,
+!                          for demonstration purposes only, the fan is scheduled to be available from 12 AM-12 PM to
+!                          to demonstrate Method 1, and scheduled to be unavailable from 12 PM-12 AM for Method 2.
+!
+!                          Note that ZoneControl:Thermostat is still used in this model to control the baseboard
+!                          heating in the winter, but it does not effect the evaporative cooler system.
+!
+! Highlights:              Test of AvailabilityManagers for controlling an air system.
+!
+! Simulation Location/Run: DENVER_STAPLETON_CO_USA_WMO_724690, 2 design days, 1 run period,
+!                          Run Control executes two design days (see RUN PERIOD object)
+!
+! Location:                Denver, CO
+!
+! Design Days:             DENVER_STAPLETON_CO_USA Annual Heating 99%, MaxDB=-16°C
+!                          DENVER_STAPLETON_CO_USA Annual Cooling (DB=>MWB) 1%, MaxDB=32.6°C MWB=15.5°C
+!
+! Run Period (Weather File): Full Annual Simulation, DENVER_STAPLETON_CO_USA_WMO_724690
+!
+! Run Control:             No zone or system sizing, design day run control (no weather file simulation)
+!
+! Building:                Fictional 1 zone building with resistive walls based on 1ZoneUncontrolled example.
+!                          No windows.  No internal gains.  No internal mass.  The building is oriented due north.
+!
+! Floor Area:              232.25 m2
+! Number of Stories:       1
+
+  Version,23.1;
+
+  Timestep,6;
+
+  Building,
+    Bldg,                    !- Name
+    0.0,                     !- North Axis {deg}
+    Suburbs,                 !- Terrain
+    0.05,                    !- Loads Convergence Tolerance Value {W}
+    0.05,                    !- Temperature Convergence Tolerance Value {deltaC}
+    MinimalShadowing,        !- Solar Distribution
+    30,                      !- Maximum Number of Warmup Days
+    6;                       !- Minimum Number of Warmup Days
+
+  HeatBalanceAlgorithm,ConductionTransferFunction;
+
+  SurfaceConvectionAlgorithm:Inside,TARP;
+
+  SurfaceConvectionAlgorithm:Outside,DOE-2;
+
+  SimulationControl,
+    No,                      !- Do Zone Sizing Calculation
+    No,                      !- Do System Sizing Calculation
+    No,                      !- Do Plant Sizing Calculation
+    Yes,                     !- Run Simulation for Sizing Periods
+    Yes,                     !- Run Simulation for Weather File Run Periods
+    No,                      !- Do HVAC Sizing Simulation for Sizing Periods
+    1;                       !- Maximum Number of HVAC Sizing Simulation Passes
+
+  RunPeriod,
+    Run Period 1,            !- Name
+    1,                       !- Begin Month
+    1,                       !- Begin Day of Month
+    ,                        !- Begin Year
+    12,                      !- End Month
+    31,                      !- End Day of Month
+    ,                        !- End Year
+    Tuesday,                 !- Day of Week for Start Day
+    Yes,                     !- Use Weather File Holidays and Special Days
+    Yes,                     !- Use Weather File Daylight Saving Period
+    No,                      !- Apply Weekend Holiday Rule
+    Yes,                     !- Use Weather File Rain Indicators
+    Yes;                     !- Use Weather File Snow Indicators
+
+  Site:Location,
+    Denver Centennial CO USA WMO=724666,  !- Name
+    39.74,                   !- Latitude {deg}
+    -105.18,                 !- Longitude {deg}
+    -7.00,                   !- Time Zone {hr}
+    1793.00;                 !- Elevation {m}
+
+ !  WMO=724666 Time Zone=NAM        (GMT-07:00) Mountain Time (US & Canada)
+ !  Data Source=ASHRAE 2009 Annual Design Conditions
+ ! Using Design Conditions from "Climate Design Data 2009 ASHRAE Handbook"
+ ! Denver Centennial CO USA Extreme Annual Wind Speeds, 1%=11.1m/s, 2.5%=9.5m/s, 5%=8.4m/s
+ ! Denver Centennial CO USA Extreme Annual Temperatures, Max Drybulb=-22.9°C Min Drybulb=36.1°C
+ ! Denver Centennial CO USA Annual Heating Design Conditions Wind Speed=3m/s Wind Dir=340
+ ! Coldest Month=December
+ ! Denver Centennial CO USA Annual Heating 99.6%, MaxDB=-18.8°C
+
+  SizingPeriod:DesignDay,
+    Denver Centennial Ann Htg 99.6% Condns DB,  !- Name
+    12,                      !- Month
+    21,                      !- Day of Month
+    WinterDesignDay,         !- Day Type
+    -18.8,                   !- Maximum Dry-Bulb Temperature {C}
+    0.0,                     !- Daily Dry-Bulb Temperature Range {deltaC}
+    ,                        !- Dry-Bulb Temperature Range Modifier Type
+    ,                        !- Dry-Bulb Temperature Range Modifier Day Schedule Name
+    Wetbulb,                 !- Humidity Condition Type
+    -18.8,                   !- Wetbulb or DewPoint at Maximum Dry-Bulb {C}
+    ,                        !- Humidity Condition Day Schedule Name
+    ,                        !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir}
+    ,                        !- Enthalpy at Maximum Dry-Bulb {J/kg}
+    ,                        !- Daily Wet-Bulb Temperature Range {deltaC}
+    81560.,                  !- Barometric Pressure {Pa}
+    3,                       !- Wind Speed {m/s}
+    340,                     !- Wind Direction {deg}
+    No,                      !- Rain Indicator
+    No,                      !- Snow Indicator
+    No,                      !- Daylight Saving Time Indicator
+    ASHRAEClearSky,          !- Solar Model Indicator
+    ,                        !- Beam Solar Day Schedule Name
+    ,                        !- Diffuse Solar Day Schedule Name
+    ,                        !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) {dimensionless}
+    ,                        !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) {dimensionless}
+    0.00;                    !- Sky Clearness
+
+ ! Denver Centennial Annual Cooling Design Conditions Wind Speed=4.9m/s Wind Dir=0
+ ! Hottest Month=July
+ ! Denver Centennial CO USA Annual Cooling (DB=>MWB) 1%, MaxDB=32°C MWB=15.5°C
+
+  SizingPeriod:DesignDay,
+    Denver Centennial Ann Clg 1% Condns DB=>MWB,  !- Name
+    7,                       !- Month
+    21,                      !- Day of Month
+    SummerDesignDay,         !- Day Type
+    32,                      !- Maximum Dry-Bulb Temperature {C}
+    15.2,                    !- Daily Dry-Bulb Temperature Range {deltaC}
+    ,                        !- Dry-Bulb Temperature Range Modifier Type
+    ,                        !- Dry-Bulb Temperature Range Modifier Day Schedule Name
+    Wetbulb,                 !- Humidity Condition Type
+    15.5,                    !- Wetbulb or DewPoint at Maximum Dry-Bulb {C}
+    ,                        !- Humidity Condition Day Schedule Name
+    ,                        !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir}
+    ,                        !- Enthalpy at Maximum Dry-Bulb {J/kg}
+    ,                        !- Daily Wet-Bulb Temperature Range {deltaC}
+    81560.,                  !- Barometric Pressure {Pa}
+    4.9,                     !- Wind Speed {m/s}
+    0,                       !- Wind Direction {deg}
+    No,                      !- Rain Indicator
+    No,                      !- Snow Indicator
+    No,                      !- Daylight Saving Time Indicator
+    ASHRAEClearSky,          !- Solar Model Indicator
+    ,                        !- Beam Solar Day Schedule Name
+    ,                        !- Diffuse Solar Day Schedule Name
+    ,                        !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) {dimensionless}
+    ,                        !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) {dimensionless}
+    1.00;                    !- Sky Clearness
+
+  Material:NoMass,
+    R13LAYER,                !- Name
+    Rough,                   !- Roughness
+    2.290965,                !- Thermal Resistance {m2-K/W}
+    0.9000000,               !- Thermal Absorptance
+    0.7500000,               !- Solar Absorptance
+    0.7500000;               !- Visible Absorptance
+
+  Material:NoMass,
+    R31LAYER,                !- Name
+    Rough,                   !- Roughness
+    5.456,                   !- Thermal Resistance {m2-K/W}
+    0.9000000,               !- Thermal Absorptance
+    0.7500000,               !- Solar Absorptance
+    0.7500000;               !- Visible Absorptance
+
+  Material,
+    C5 - 4 IN HW CONCRETE,   !- Name
+    MediumRough,             !- Roughness
+    0.1014984,               !- Thickness {m}
+    1.729577,                !- Conductivity {W/m-K}
+    2242.585,                !- Density {kg/m3}
+    836.8000,                !- Specific Heat {J/kg-K}
+    0.9000000,               !- Thermal Absorptance
+    0.6500000,               !- Solar Absorptance
+    0.6500000;               !- Visible Absorptance
+
+  Construction,
+    R13WALL,                 !- Name
+    R13LAYER;                !- Outside Layer
+
+  Construction,
+    FLOOR,                   !- Name
+    C5 - 4 IN HW CONCRETE;   !- Outside Layer
+
+  Construction,
+    ROOF31,                  !- Name
+    R31LAYER;                !- Outside Layer
+
+  Site:GroundTemperature:BuildingSurface,18.89,18.92,19.02,19.12,19.21,19.23,19.07,19.32,19.09,19.21,19.13,18.96;
+
+  Zone,
+    Main Zone,               !- Name
+    0,                       !- Direction of Relative North {deg}
+    0,                       !- X Origin {m}
+    0,                       !- Y Origin {m}
+    0,                       !- Z Origin {m}
+    1,                       !- Type
+    1,                       !- Multiplier
+    autocalculate,           !- Ceiling Height {m}
+    autocalculate;           !- Volume {m3}
+
+  ScheduleTypeLimits,
+    Fraction,                !- Name
+    0.0,                     !- Lower Limit Value
+    1.0,                     !- Upper Limit Value
+    CONTINUOUS;              !- Numeric Type
+
+  GlobalGeometryRules,
+    UpperLeftCorner,         !- Starting Vertex Position
+    CounterClockWise,        !- Vertex Entry Direction
+    World;                   !- Coordinate System
+
+  BuildingSurface:Detailed,
+    Zn001:Wall001,           !- Name
+    Wall,                    !- Surface Type
+    R13WALL,                 !- Construction Name
+    Main Zone,               !- Zone Name
+    ,                        !- Space Name
+    Outdoors,                !- Outside Boundary Condition
+    ,                        !- Outside Boundary Condition Object
+    SunExposed,              !- Sun Exposure
+    WindExposed,             !- Wind Exposure
+    0.5000000,               !- View Factor to Ground
+    4,                       !- Number of Vertices
+    0,0,4.572000,  !- X,Y,Z ==> Vertex 1 {m}
+    0,0,0,  !- X,Y,Z ==> Vertex 2 {m}
+    15.24000,0,0,  !- X,Y,Z ==> Vertex 3 {m}
+    15.24000,0,4.572000;  !- X,Y,Z ==> Vertex 4 {m}
+
+  BuildingSurface:Detailed,
+    Zn001:Wall002,           !- Name
+    Wall,                    !- Surface Type
+    R13WALL,                 !- Construction Name
+    Main Zone,               !- Zone Name
+    ,                        !- Space Name
+    Outdoors,                !- Outside Boundary Condition
+    ,                        !- Outside Boundary Condition Object
+    SunExposed,              !- Sun Exposure
+    WindExposed,             !- Wind Exposure
+    0.5000000,               !- View Factor to Ground
+    4,                       !- Number of Vertices
+    15.24000,0,4.572000,  !- X,Y,Z ==> Vertex 1 {m}
+    15.24000,0,0,  !- X,Y,Z ==> Vertex 2 {m}
+    15.24000,15.24000,0,  !- X,Y,Z ==> Vertex 3 {m}
+    15.24000,15.24000,4.572000;  !- X,Y,Z ==> Vertex 4 {m}
+
+  BuildingSurface:Detailed,
+    Zn001:Wall003,           !- Name
+    Wall,                    !- Surface Type
+    R13WALL,                 !- Construction Name
+    Main Zone,               !- Zone Name
+    ,                        !- Space Name
+    Outdoors,                !- Outside Boundary Condition
+    ,                        !- Outside Boundary Condition Object
+    SunExposed,              !- Sun Exposure
+    WindExposed,             !- Wind Exposure
+    0.5000000,               !- View Factor to Ground
+    4,                       !- Number of Vertices
+    15.24000,15.24000,4.572000,  !- X,Y,Z ==> Vertex 1 {m}
+    15.24000,15.24000,0,  !- X,Y,Z ==> Vertex 2 {m}
+    0,15.24000,0,  !- X,Y,Z ==> Vertex 3 {m}
+    0,15.24000,4.572000;  !- X,Y,Z ==> Vertex 4 {m}
+
+  BuildingSurface:Detailed,
+    Zn001:Wall004,           !- Name
+    Wall,                    !- Surface Type
+    R13WALL,                 !- Construction Name
+    Main Zone,               !- Zone Name
+    ,                        !- Space Name
+    Outdoors,                !- Outside Boundary Condition
+    ,                        !- Outside Boundary Condition Object
+    SunExposed,              !- Sun Exposure
+    WindExposed,             !- Wind Exposure
+    0.5000000,               !- View Factor to Ground
+    4,                       !- Number of Vertices
+    0,15.24000,4.572000,  !- X,Y,Z ==> Vertex 1 {m}
+    0,15.24000,0,  !- X,Y,Z ==> Vertex 2 {m}
+    0,0,0,  !- X,Y,Z ==> Vertex 3 {m}
+    0,0,4.572000;  !- X,Y,Z ==> Vertex 4 {m}
+
+  BuildingSurface:Detailed,
+    Zn001:Flr001,            !- Name
+    Floor,                   !- Surface Type
+    FLOOR,                   !- Construction Name
+    Main Zone,               !- Zone Name
+    ,                        !- Space Name
+    Surface,                 !- Outside Boundary Condition
+    Zn001:Flr001,            !- Outside Boundary Condition Object
+    NoSun,                   !- Sun Exposure
+    NoWind,                  !- Wind Exposure
+    1.000000,                !- View Factor to Ground
+    4,                       !- Number of Vertices
+    15.24000,0.000000,0.0,  !- X,Y,Z ==> Vertex 1 {m}
+    0.000000,0.000000,0.0,  !- X,Y,Z ==> Vertex 2 {m}
+    0.000000,15.24000,0.0,  !- X,Y,Z ==> Vertex 3 {m}
+    15.24000,15.24000,0.0;  !- X,Y,Z ==> Vertex 4 {m}
+
+  BuildingSurface:Detailed,
+    Zn001:Roof001,           !- Name
+    Roof,                    !- Surface Type
+    ROOF31,                  !- Construction Name
+    Main Zone,               !- Zone Name
+    ,                        !- Space Name
+    Outdoors,                !- Outside Boundary Condition
+    ,                        !- Outside Boundary Condition Object
+    SunExposed,              !- Sun Exposure
+    WindExposed,             !- Wind Exposure
+    0,                       !- View Factor to Ground
+    4,                       !- Number of Vertices
+    0.000000,15.24000,4.572,  !- X,Y,Z ==> Vertex 1 {m}
+    0.000000,0.000000,4.572,  !- X,Y,Z ==> Vertex 2 {m}
+    15.24000,0.000000,4.572,  !- X,Y,Z ==> Vertex 3 {m}
+    15.24000,15.24000,4.572;  !- X,Y,Z ==> Vertex 4 {m}
+
+  ZoneInfiltration:DesignFlowRate,
+    Main Zone Infiltration,  !- Name
+    Main Zone,               !- Zone or ZoneList or Space or SpaceList Name
+    System Availability Schedule,  !- Schedule Name
+    Flow/Zone,               !- Design Flow Rate Calculation Method
+    0.02,                    !- Design Flow Rate {m3/s}
+    ,                        !- Flow per Zone Floor Area {m3/s-m2}
+    ,                        !- Flow per Exterior Surface Area {m3/s-m2}
+    ,                        !- Air Changes per Hour {1/hr}
+    1.0000,                  !- Constant Term Coefficient
+    0.0000,                  !- Temperature Term Coefficient
+    0.0000,                  !- Velocity Term Coefficient
+    0.0000;                  !- Velocity Squared Term Coefficient
+
+  ScheduleTypeLimits,
+    Any Number;              !- Name
+
+  Schedule:Compact,
+    System Availability Schedule,  !- Name
+    Any Number,              !- Schedule Type Limits Name
+    THROUGH: 12/31,          !- Field 1
+    FOR: AllDays,            !- Field 2
+    UNTIL: 24:00,1;          !- Field 3
+
+  Schedule:Compact,
+    Fan Availability Schedule,  !- Name
+    Any Number,              !- Schedule Type Limits Name
+    THROUGH: 12/31,          !- Field 1
+    FOR: AllDays,            !- Field 2
+    UNTIL: 12:00,1,          !- Field 3
+    UNTIL: 24:00,0;          !- Field 5
+
+  AirLoopHVAC,
+    Evap Cooler System,      !- Name
+    ,                        !- Controller List Name
+    Evap Cooler Availability List,  !- Availability Manager List Name
+    2.0,                     !- Design Supply Air Flow Rate {m3/s}
+    Air Loop Branches,       !- Branch List Name
+    ,                        !- Connector List Name
+    Supply Inlet Node,       !- Supply Side Inlet Node Name
+    Zone Equipment Outlet Node,  !- Demand Side Outlet Node Name
+    Zone Equipment Inlet Node,  !- Demand Side Inlet Node Names
+    Supply Outlet Node;      !- Supply Side Outlet Node Names
+
+  AvailabilityManagerAssignmentList,
+    Evap Cooler Availability List,  !- Name
+    AvailabilityManager:LowTemperatureTurnOff,  !- Availability Manager 1 Object Type
+    Low Temperature Turn Off Availability Manager,  !- Availability Manager 1 Name
+    AvailabilityManager:HighTemperatureTurnOn,  !- Availability Manager 2 Object Type
+    High Temperature Turn On Availability Manager;  !- Availability Manager 2 Name
+
+  AvailabilityManager:LowTemperatureTurnOff,
+    Low Temperature Turn Off Availability Manager,  !- Name
+    Main Zone Outlet Node,   !- Sensor Node Name
+    23.0;                    !- Temperature {C}
+
+  AvailabilityManager:HighTemperatureTurnOn,
+    High Temperature Turn On Availability Manager,  !- Name
+    Main Zone Outlet Node,   !- Sensor Node Name
+    27.0;                    !- Temperature {C}
+
+  BranchList,
+    Air Loop Branches,       !- Name
+    Air Loop Main Branch;    !- Branch 1 Name
+
+  Branch,
+    Air Loop Main Branch,    !- Name
+    ,                        !- Pressure Drop Curve Name
+    AirLoopHVAC:OutdoorAirSystem,  !- Component 1 Object Type
+    Outside Air System,      !- Component 1 Name
+    Supply Inlet Node,       !- Component 1 Inlet Node Name
+    Fan Inlet Node,          !- Component 1 Outlet Node Name
+    Fan:ConstantVolume,      !- Component 2 Object Type
+    Supply Fan,              !- Component 2 Name
+    Fan Inlet Node,          !- Component 2 Inlet Node Name
+    Evap Cooler Inlet Node,  !- Component 2 Outlet Node Name
+    EvaporativeCooler:Direct:CelDekPad,  !- Component 3 Object Type
+    Evaporative Cooler,      !- Component 3 Name
+    Evap Cooler Inlet Node,  !- Component 3 Inlet Node Name
+    Supply Outlet Node;      !- Component 3 Outlet Node Name
+
+  AirLoopHVAC:OutdoorAirSystem,
+    Outside Air System,      !- Name
+    Outside Air System Controllers,  !- Controller List Name
+    Outside Air System Equipment;  !- Outdoor Air Equipment List Name
+
+  OutdoorAir:Node,
+    Outside Air Inlet Node;  !- Name
+
+  AirLoopHVAC:ControllerList,
+    Outside Air System Controllers,  !- Name
+    Controller:OutdoorAir,   !- Controller 1 Object Type
+    Outside Air Controller;  !- Controller 1 Name
+
+  Controller:OutdoorAir,
+    Outside Air Controller,  !- Name
+    Relief Air Outlet Node,  !- Relief Air Outlet Node Name
+    Supply Inlet Node,       !- Return Air Node Name
+    Fan Inlet Node,          !- Mixed Air Node Name
+    Outside Air Inlet Node,  !- Actuator Node Name
+    2.0,                     !- Minimum Outdoor Air Flow Rate {m3/s}
+    2.0,                     !- Maximum Outdoor Air Flow Rate {m3/s}
+    NoEconomizer,            !- Economizer Control Type
+    ModulateFlow,            !- Economizer Control Action Type
+    19.,                     !- Economizer Maximum Limit Dry-Bulb Temperature {C}
+    ,                        !- Economizer Maximum Limit Enthalpy {J/kg}
+    ,                        !- Economizer Maximum Limit Dewpoint Temperature {C}
+    ,                        !- Electronic Enthalpy Limit Curve Name
+    4.,                      !- Economizer Minimum Limit Dry-Bulb Temperature {C}
+    NoLockout,               !- Lockout Type
+    FixedMinimum;            !- Minimum Limit Type
+
+  AirLoopHVAC:OutdoorAirSystem:EquipmentList,
+    Outside Air System Equipment,  !- Name
+    OutdoorAir:Mixer,        !- Component 1 Object Type
+    Outside Air Mixing Box;  !- Component 1 Name
+
+  OutdoorAir:Mixer,
+    Outside Air Mixing Box,  !- Name
+    Fan Inlet Node,          !- Mixed Air Node Name
+    Outside Air Inlet Node,  !- Outdoor Air Stream Node Name
+    Relief Air Outlet Node,  !- Relief Air Stream Node Name
+    Supply Inlet Node;       !- Return Air Stream Node Name
+
+  Fan:ConstantVolume,
+    Supply Fan,              !- Name
+    Fan Availability Schedule,  !- Availability Schedule Name
+    0.7,                     !- Fan Total Efficiency
+    600.0,                   !- Pressure Rise {Pa}
+    2.0,                     !- Maximum Flow Rate {m3/s}
+    0.9,                     !- Motor Efficiency
+    1.0,                     !- Motor In Airstream Fraction
+    Fan Inlet Node,          !- Air Inlet Node Name
+    Evap Cooler Inlet Node;  !- Air Outlet Node Name
+
+  EvaporativeCooler:Direct:CelDekPad,
+    Evaporative Cooler,      !- Name
+    System Availability Schedule,  !- Availability Schedule Name
+    0.6,                     !- Direct Pad Area {m2}
+    0.2,                     !- Direct Pad Depth {m}
+    225,                     !- Recirculating Water Pump Power Consumption {W}
+    Evap Cooler Inlet Node,  !- Air Inlet Node Name
+    Supply Outlet Node,      !- Air Outlet Node Name
+    CONSTANT;                !- Control Type
+
+  AirLoopHVAC:SupplyPath,
+    Zone Supply Air Path,    !- Name
+    Zone Equipment Inlet Node,  !- Supply Air Path Inlet Node Name
+    AirLoopHVAC:ZoneSplitter,!- Component 1 Object Type
+    Zone Supply Air Splitter;!- Component 1 Name
+
+  AirLoopHVAC:ZoneSplitter,
+    Zone Supply Air Splitter,!- Name
+    Zone Equipment Inlet Node,  !- Inlet Node Name
+    Main Zone Inlet Node ATInlet;  !- Outlet 1 Node Name
+
+  AirLoopHVAC:ReturnPath,
+    Zone Return Air Path,    !- Name
+    Zone Equipment Outlet Node,  !- Return Air Path Outlet Node Name
+    AirLoopHVAC:ZoneMixer,   !- Component 1 Object Type
+    Zone Return Air Mixer;   !- Component 1 Name
+
+  AirLoopHVAC:ZoneMixer,
+    Zone Return Air Mixer,   !- Name
+    Zone Equipment Outlet Node,  !- Outlet Node Name
+    Main Zone Outlet Node;   !- Inlet 1 Node Name
+
+  ZoneHVAC:EquipmentConnections,
+    Main Zone,               !- Zone Name
+    Main Zone Equipment,     !- Zone Conditioning Equipment List Name
+    Main Zone Inlet Node,    !- Zone Air Inlet Node or NodeList Name
+    ,                        !- Zone Air Exhaust Node or NodeList Name
+    Main Zone Node,          !- Zone Air Node Name
+    Main Zone Outlet Node;   !- Zone Return Air Node or NodeList Name
+
+  ZoneHVAC:EquipmentList,
+    Main Zone Equipment,     !- Name
+    SequentialLoad,          !- Load Distribution Scheme
+    ZoneHVAC:AirDistributionUnit,  !- Zone Equipment 1 Object Type
+    Main Zone Direct Air ADU,!- Zone Equipment 1 Name
+    1,                       !- Zone Equipment 1 Cooling Sequence
+    2,                       !- Zone Equipment 1 Heating or No-Load Sequence
+    ,                        !- Zone Equipment 1 Sequential Cooling Fraction Schedule Name
+    ,                        !- Zone Equipment 1 Sequential Heating Fraction Schedule Name
+    ZoneHVAC:Baseboard:Convective:Electric,  !- Zone Equipment 2 Object Type
+    Main Zone Baseboard,     !- Zone Equipment 2 Name
+    2,                       !- Zone Equipment 2 Cooling Sequence
+    1,                       !- Zone Equipment 2 Heating or No-Load Sequence
+    ,                        !- Zone Equipment 2 Sequential Cooling Fraction Schedule Name
+    ;                        !- Zone Equipment 2 Sequential Heating Fraction Schedule Name
+
+  AirTerminal:SingleDuct:ConstantVolume:NoReheat,
+    Main Zone Direct Air,    !- Name
+    System Availability Schedule,  !- Availability Schedule Name
+    Main Zone Inlet Node ATInlet,  !- Air Inlet Node Name
+    Main Zone Inlet Node,    !- Air Outlet Node Name
+    1.5,                     !- Maximum Air Flow Rate {m3/s}
+    ,                        !- Design Specification Outdoor Air Object Name
+    ;                        !- Per Person Ventilation Rate Mode
+
+  ZoneHVAC:AirDistributionUnit,
+    Main Zone Direct Air ADU,!- Name
+    Main Zone Inlet Node,    !- Air Distribution Unit Outlet Node Name
+    AirTerminal:SingleDuct:ConstantVolume:NoReheat,  !- Air Terminal Object Type
+    Main Zone Direct Air,    !- Air Terminal Name
+    ,                        !- Nominal Upstream Leakage Fraction
+    ,                        !- Constant Downstream Leakage Fraction
+    ;                        !- Design Specification Air Terminal Sizing Object Name
+
+  ZoneHVAC:Baseboard:Convective:Electric,
+    Main Zone Baseboard,     !- Name
+    System Availability Schedule,  !- Availability Schedule Name
+    HeatingDesignCapacity,   !- Heating Design Capacity Method
+    8000,                    !- Heating Design Capacity {W}
+    ,                        !- Heating Design Capacity Per Floor Area {W/m2}
+    ,                        !- Fraction of Autosized Heating Design Capacity
+    0.97;                    !- Efficiency
+
+  ZoneControl:Thermostat,
+    Main Zone Thermostat,    !- Name
+    Main Zone,               !- Zone or ZoneList Name
+    Zone Control Type Sched, !- Control Type Schedule Name
+    ThermostatSetpoint:SingleHeating,  !- Control 1 Object Type
+    Heating Setpoint;        !- Control 1 Name
+
+  Schedule:Compact,
+    Zone Control Type Sched, !- Name
+    Any Number,              !- Schedule Type Limits Name
+    Through: 12/31,          !- Field 1
+    For: AllDays,            !- Field 2
+    Until: 24:00,1;          !- Field 3
+
+  ThermostatSetpoint:SingleHeating,
+    Heating Setpoint,        !- Name
+    Heating Setpoint Schedule;  !- Setpoint Temperature Schedule Name
+
+  Schedule:Compact,
+    Heating Setpoint Schedule,  !- Name
+    Any Number,              !- Schedule Type Limits Name
+    Through: 12/31,          !- Field 1
+    For: AllDays,            !- Field 2
+    Until: 24:00,20.0;       !- Field 3
+
+  Output:VariableDictionary,Regular;
+
+  Output:Surfaces:Drawing,DXF;
+
+  Output:Constructions,Constructions;
+
+  Output:Variable,*,Site Outdoor Air Drybulb Temperature,hourly;
+
+  Output:Variable,*,Site Outdoor Air Wetbulb Temperature,hourly;
+
+  Output:Variable,*,Site Outdoor Air Humidity Ratio,hourly;
+
+  Output:Variable,*,Site Outdoor Air Relative Humidity,hourly;
+
+  Output:Variable,*,Zone Mean Air Temperature,Annual;
+
+  Output:Variable,*,Zone Mean Air Temperature,RunPeriod;
+
+  Output:Variable,*,Zone Mean Air Temperature,Environment;
+
+  Output:Variable,*,Zone Mean Air Temperature,Monthly;
+
+  Output:Variable,*,Zone Mean Air Temperature,Daily;
+
+  Output:Variable,*,Zone Mean Air Temperature,Hourly;
+
+  Output:Variable,*,Zone Mean Air Temperature,Timestep;
+
+  Output:Variable,*,Zone Mean Air Temperature,Detailed;
+
+  Output:Variable,Supply Outlet Node,System Node Mass Flow Rate,hourly;
+
+  Output:Variable,*,System Node Temperature,hourly;
+
+  Output:Variable,*,Baseboard Electricity Rate,hourly;
+
+  Output:Meter:MeterFileOnly,Electricity:Facility,monthly;
+
+  Output:Meter:MeterFileOnly,Electricity:HVAC,monthly;
+
+  Output:Meter:MeterFileOnly,Electricity:Facility,runperiod;
+
+  Output:Meter:MeterFileOnly,Electricity:HVAC,runperiod;
+
+  OutputControl:Table:Style,
+    TabAndHTML;              !- Column Separator
+
+  Output:Table:SummaryReports,
+    AllSummary;              !- Report 1 Name
+
+  Output:SQLite,
+    SimpleAndTabular;        !- Option Type
diff --git a/resources/utilities/SqlFile/1ZoneEvapCooler-V23-1-0.sql b/resources/utilities/SqlFile/1ZoneEvapCooler-V23-1-0.sql
new file mode 100644
index 00000000000..5f819a90033
Binary files /dev/null and b/resources/utilities/SqlFile/1ZoneEvapCooler-V23-1-0.sql differ
diff --git a/resources/utilities/SqlFile/Reproduce.txt b/resources/utilities/SqlFile/Reproduce.txt
index 703e6b85abc..52bb1961c32 100644
--- a/resources/utilities/SqlFile/Reproduce.txt
+++ b/resources/utilities/SqlFile/Reproduce.txt
@@ -1,7 +1,7 @@
 Run files with corresponding version of EnergyPlus and copy of `USA_CO_Golden-NREL.724666_TMY3.epw` for that version:
 
 ```
-/c/EnergyPlusV22-2-0/energyplus.exe -w /c/EnergyPlusV22-2-0/WeatherData/USA_CO_Golden-NREL.724666_TMY3.epw -r 1ZoneEvapCooler-V22-2-0.idf
+/c/EnergyPlusV23-1-0/energyplus.exe -w /c/EnergyPlusV23-1-0/WeatherData/USA_CO_Golden-NREL.724666_TMY3.epw -r 1ZoneEvapCooler-V23-1-0.idf
 ```
 
 *Note*: the weather file does change across versions of EnergyPlus. (Actually, it hasn't changed since 8.2.0)
diff --git a/resources/utilities/SqlFile/update_all.sh b/resources/utilities/SqlFile/update_all.sh
index b385e0cbb68..1d29877846c 100755
--- a/resources/utilities/SqlFile/update_all.sh
+++ b/resources/utilities/SqlFile/update_all.sh
@@ -7,8 +7,8 @@ if [ ! -z $token ]; then
 fi;
 
 # All versions you want to run
-# declare -a all_versions=("8.5.0" "8.6.0" "8.7.0" "8.8.0" "8.9.0" "9.0.1" "9.1.0" "9.2.0" "9.3.0", "9.4.0", "9.5.0", "9.6.0", "22.1.0", "22.2.0")
-declare -a all_versions=("22.2.0-IOFreeze")
+# declare -a all_versions=("8.5.0" "8.6.0" "8.7.0" "8.8.0" "8.9.0" "9.0.1" "9.1.0" "9.2.0" "9.3.0", "9.4.0", "9.5.0", "9.6.0", "22.1.0", "22.2.0", "23.1.0")
+declare -a all_versions=("23.1.0-IOFreeze")
 
 # DO NOT RERUN IF SQL ALREADY THERE
 rerun_if_already_there=false
diff --git a/src/energyplus/CMakeLists.txt b/src/energyplus/CMakeLists.txt
index eb216af90a8..986c2f95cad 100644
--- a/src/energyplus/CMakeLists.txt
+++ b/src/energyplus/CMakeLists.txt
@@ -802,6 +802,7 @@ set(${target_name}_test_src
   Test/WaterHeaterSizing_GTest.cpp
   Test/WaterHeaterStratified_GTest.cpp
   Test/WaterUseConnections_GTest.cpp
+  Test/ZoneAirHeatBalanceAlgorithm_GTest.cpp
   Test/ZoneHVACBaseboardRadiantConvectiveWater_GTest.cpp
   Test/ZoneHVACLowTemperatureRadiantElectric_GTest.cpp
   Test/ZoneHVACLowTempRadiantConstFlow_GTest.cpp
diff --git a/src/energyplus/ForwardTranslator.hpp b/src/energyplus/ForwardTranslator.hpp
index f3e28ab787e..4f6c0087c7e 100644
--- a/src/energyplus/ForwardTranslator.hpp
+++ b/src/energyplus/ForwardTranslator.hpp
@@ -521,7 +521,7 @@ namespace energyplus {
     struct ForwardTranslatorInitializer;
   };
 
-#define ENERGYPLUS_VERSION "22.2"
+#define ENERGYPLUS_VERSION "23.1"
 
   class ENERGYPLUS_API ForwardTranslator
   {
diff --git a/src/energyplus/ForwardTranslator/ForwardTranslateZoneAirHeatBalanceAlgorithm.cpp b/src/energyplus/ForwardTranslator/ForwardTranslateZoneAirHeatBalanceAlgorithm.cpp
index 1a7127c51d2..556e640ebee 100644
--- a/src/energyplus/ForwardTranslator/ForwardTranslateZoneAirHeatBalanceAlgorithm.cpp
+++ b/src/energyplus/ForwardTranslator/ForwardTranslateZoneAirHeatBalanceAlgorithm.cpp
@@ -29,8 +29,9 @@
 
 #include "../ForwardTranslator.hpp"
 #include "../../model/ZoneAirHeatBalanceAlgorithm.hpp"
-#include <utilities/idd/ZoneAirHeatBalanceAlgorithm_FieldEnums.hxx>
+
 #include "../../utilities/idd/IddEnums.hpp"
+#include <utilities/idd/ZoneAirHeatBalanceAlgorithm_FieldEnums.hxx>
 #include <utilities/idd/IddEnums.hxx>
 
 using namespace openstudio::model;
@@ -40,13 +41,23 @@ namespace openstudio {
 namespace energyplus {
 
   boost::optional<IdfObject> ForwardTranslator::translateZoneAirHeatBalanceAlgorithm(ZoneAirHeatBalanceAlgorithm& modelObject) {
-    IdfObject idfObject(openstudio::IddObjectType::ZoneAirHeatBalanceAlgorithm);
 
+    IdfObject idfObject = createAndRegisterIdfObject(openstudio::IddObjectType::ZoneAirHeatBalanceAlgorithm, modelObject);
     idfObject.setString(ZoneAirHeatBalanceAlgorithmFields::Algorithm, modelObject.algorithm());
 
-    m_idfObjects.push_back(idfObject);
+    if (modelObject.doSpaceHeatBalanceforSizing()) {
+      idfObject.setString(ZoneAirHeatBalanceAlgorithmFields::DoSpaceHeatBalanceforSizing, "Yes");
+    } else {
+      idfObject.setString(ZoneAirHeatBalanceAlgorithmFields::DoSpaceHeatBalanceforSizing, "No");
+    }
+
+    if (modelObject.doSpaceHeatBalanceforSimulation()) {
+      idfObject.setString(ZoneAirHeatBalanceAlgorithmFields::DoSpaceHeatBalanceforSimulation, "Yes");
+    } else {
+      idfObject.setString(ZoneAirHeatBalanceAlgorithmFields::DoSpaceHeatBalanceforSimulation, "No");
+    }
 
-    return boost::optional<IdfObject>(idfObject);
+    return idfObject;
   }
 
 }  // namespace energyplus
diff --git a/src/energyplus/ReverseTranslator.cpp b/src/energyplus/ReverseTranslator.cpp
index d0af92f92fa..bac566dddc7 100644
--- a/src/energyplus/ReverseTranslator.cpp
+++ b/src/energyplus/ReverseTranslator.cpp
@@ -1009,8 +1009,7 @@ namespace energyplus {
         break;
       }
       case openstudio::IddObjectType::ZoneAirHeatBalanceAlgorithm: {
-        // DLM: why is this commented out?
-        //modelObject = translateZoneAirHeatBalanceAlgorithm(workspaceObject);
+        modelObject = translateZoneAirHeatBalanceAlgorithm(workspaceObject);
         break;
       }
       case openstudio::IddObjectType::ZoneAirMassFlowConservation: {
diff --git a/src/energyplus/ReverseTranslator/ReverseTranslateZoneAirHeatBalanceAlgorithm.cpp b/src/energyplus/ReverseTranslator/ReverseTranslateZoneAirHeatBalanceAlgorithm.cpp
index dbc44202ac3..af7c2979abb 100644
--- a/src/energyplus/ReverseTranslator/ReverseTranslateZoneAirHeatBalanceAlgorithm.cpp
+++ b/src/energyplus/ReverseTranslator/ReverseTranslateZoneAirHeatBalanceAlgorithm.cpp
@@ -49,9 +49,25 @@ namespace energyplus {
 
     auto mo = m_model.getUniqueModelObject<ZoneAirHeatBalanceAlgorithm>();
 
-    boost::optional<std::string> s = workspaceObject.getString(ZoneAirHeatBalanceAlgorithmFields::Algorithm);
-    if (s) {
-      mo.setString(OS_ZoneAirHeatBalanceAlgorithmFields::Algorithm, s.get());
+    if (auto algorithm_ = workspaceObject.getString(ZoneAirHeatBalanceAlgorithmFields::Algorithm, false, true)) {
+      mo.setAlgorithm(algorithm_.get());
+    }
+
+    if (auto doSpaceHeatBalanceforSizing_ = workspaceObject.getString(ZoneAirHeatBalanceAlgorithmFields::DoSpaceHeatBalanceforSizing, false, true)) {
+      if (istringEqual("Yes", doSpaceHeatBalanceforSizing_.get())) {
+        mo.setDoSpaceHeatBalanceforSizing(true);
+      } else {
+        mo.setDoSpaceHeatBalanceforSizing(false);
+      }
+    }
+
+    if (auto doSpaceHeatBalanceforSimulation_ =
+          workspaceObject.getString(ZoneAirHeatBalanceAlgorithmFields::DoSpaceHeatBalanceforSimulation, false, true)) {
+      if (istringEqual("Yes", doSpaceHeatBalanceforSimulation_.get())) {
+        mo.setDoSpaceHeatBalanceforSimulation(true);
+      } else {
+        mo.setDoSpaceHeatBalanceforSimulation(false);
+      }
     }
 
     return mo;
diff --git a/src/energyplus/Test/ZoneAirHeatBalanceAlgorithm_GTest.cpp b/src/energyplus/Test/ZoneAirHeatBalanceAlgorithm_GTest.cpp
new file mode 100644
index 00000000000..4e279d4fa0d
--- /dev/null
+++ b/src/energyplus/Test/ZoneAirHeatBalanceAlgorithm_GTest.cpp
@@ -0,0 +1,96 @@
+/***********************************************************************************************************************
+*  OpenStudio(R), Copyright (c) 2008-2019, 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/ZoneAirHeatBalanceAlgorithm.hpp"
+#include "../../model/ZoneAirHeatBalanceAlgorithm_Impl.hpp"
+
+#include "../../utilities/idf/IdfObject.hpp"
+#include "../../utilities/idf/WorkspaceObject.hpp"
+
+#include <utilities/idd/ZoneAirHeatBalanceAlgorithm_FieldEnums.hxx>
+#include <utilities/idd/IddEnums.hxx>
+
+#include <resources.hxx>
+
+#include <sstream>
+
+using namespace openstudio::energyplus;
+using namespace openstudio::model;
+using namespace openstudio;
+
+TEST_F(EnergyPlusFixture, ForwardTranslator_ZoneAirHeatBalanceAlgorithm) {
+  Model model;
+  ZoneAirHeatBalanceAlgorithm zoneAHBA = model.getUniqueModelObject<ZoneAirHeatBalanceAlgorithm>();
+
+  EXPECT_TRUE(zoneAHBA.setAlgorithm("AnalyticalSolution"));
+  EXPECT_TRUE(zoneAHBA.setDoSpaceHeatBalanceforSizing(false));
+  EXPECT_TRUE(zoneAHBA.setDoSpaceHeatBalanceforSimulation(true));
+
+  ForwardTranslator ft;
+  Workspace workspace = ft.translateModel(model);
+
+  EXPECT_EQ(1u, workspace.getObjectsByType(IddObjectType::ZoneAirHeatBalanceAlgorithm).size());
+
+  IdfObject idf_zoneAHBA = workspace.getObjectsByType(IddObjectType::ZoneAirHeatBalanceAlgorithm)[0];
+
+  EXPECT_EQ("AnalyticalSolution", idf_zoneAHBA.getString(ZoneAirHeatBalanceAlgorithmFields::Algorithm, false).get());
+  EXPECT_EQ("No", idf_zoneAHBA.getString(ZoneAirHeatBalanceAlgorithmFields::DoSpaceHeatBalanceforSizing, false).get());
+  EXPECT_EQ("Yes", idf_zoneAHBA.getString(ZoneAirHeatBalanceAlgorithmFields::DoSpaceHeatBalanceforSimulation, false).get());
+}
+
+TEST_F(EnergyPlusFixture, ReverseTranslator_ZoneAirHeatBalanceAlgorithm) {
+  ReverseTranslator rt;
+
+  Workspace w(StrictnessLevel::Minimal, IddFileType::EnergyPlus);
+
+  Model model;
+  model = rt.translateWorkspace(w);
+  EXPECT_FALSE(model.getOptionalUniqueModelObject<ZoneAirHeatBalanceAlgorithm>());
+
+  OptionalWorkspaceObject idf_zoneAHBA = w.addObject(IdfObject(IddObjectType::ZoneAirHeatBalanceAlgorithm));
+  ASSERT_TRUE(idf_zoneAHBA);
+
+  EXPECT_TRUE(idf_zoneAHBA->setString(ZoneAirHeatBalanceAlgorithmFields::Algorithm, "EulerMethod"));
+  EXPECT_TRUE(idf_zoneAHBA->setString(ZoneAirHeatBalanceAlgorithmFields::DoSpaceHeatBalanceforSizing, "Yes"));
+  EXPECT_TRUE(idf_zoneAHBA->setString(ZoneAirHeatBalanceAlgorithmFields::DoSpaceHeatBalanceforSimulation, "No"));
+
+  model = rt.translateWorkspace(w);
+  ZoneAirHeatBalanceAlgorithm zoneAHBA = model.getUniqueModelObject<ZoneAirHeatBalanceAlgorithm>();
+
+  EXPECT_EQ("EulerMethod", zoneAHBA.algorithm());
+  EXPECT_TRUE(zoneAHBA.doSpaceHeatBalanceforSizing());
+  EXPECT_FALSE(zoneAHBA.doSpaceHeatBalanceforSimulation());
+}
diff --git a/src/model/CMakeLists.txt b/src/model/CMakeLists.txt
index 949591b3ffa..ea16d159bf9 100644
--- a/src/model/CMakeLists.txt
+++ b/src/model/CMakeLists.txt
@@ -2320,6 +2320,7 @@ set(${target_name}_test_src
   test/WeatherFile_GTest.cpp
   test/WindowPropertyFrameAndDivider_GTest.cpp
   test/YearDescription_GTest.cpp
+  test/ZoneAirHeatBalanceAlgorithm_GTest.cpp
   test/ZoneAirMassFlowConservation_GTest.cpp
   test/ZoneCapacitanceMultiplierResearchSpecial_GTest.cpp
   test/ZoneControlContaminantController_GTest.cpp
diff --git a/src/model/ZoneAirHeatBalanceAlgorithm.cpp b/src/model/ZoneAirHeatBalanceAlgorithm.cpp
index c03ca1a69dc..3d29cea3990 100644
--- a/src/model/ZoneAirHeatBalanceAlgorithm.cpp
+++ b/src/model/ZoneAirHeatBalanceAlgorithm.cpp
@@ -95,6 +95,22 @@ namespace model {
       return isEmpty(OS_ZoneAirHeatBalanceAlgorithmFields::Algorithm);
     }
 
+    bool ZoneAirHeatBalanceAlgorithm_Impl::doSpaceHeatBalanceforSizing() const {
+      return getBooleanFieldValue(OS_ZoneAirHeatBalanceAlgorithmFields::DoSpaceHeatBalanceforSizing);
+    }
+
+    bool ZoneAirHeatBalanceAlgorithm_Impl::isDoSpaceHeatBalanceforSizingDefaulted() const {
+      return isEmpty(OS_ZoneAirHeatBalanceAlgorithmFields::DoSpaceHeatBalanceforSizing);
+    }
+
+    bool ZoneAirHeatBalanceAlgorithm_Impl::doSpaceHeatBalanceforSimulation() const {
+      return getBooleanFieldValue(OS_ZoneAirHeatBalanceAlgorithmFields::DoSpaceHeatBalanceforSimulation);
+    }
+
+    bool ZoneAirHeatBalanceAlgorithm_Impl::isDoSpaceHeatBalanceforSimulationDefaulted() const {
+      return isEmpty(OS_ZoneAirHeatBalanceAlgorithmFields::DoSpaceHeatBalanceforSimulation);
+    }
+
     bool ZoneAirHeatBalanceAlgorithm_Impl::setAlgorithm(const std::string& algorithm) {
       bool result = setString(OS_ZoneAirHeatBalanceAlgorithmFields::Algorithm, algorithm);
       return result;
@@ -105,8 +121,37 @@ namespace model {
       OS_ASSERT(result);
     }
 
-    std::vector<std::string> ZoneAirHeatBalanceAlgorithm_Impl::validAlgorithmValues() const {
-      return ZoneAirHeatBalanceAlgorithm::validAlgorithmValues();
+    bool ZoneAirHeatBalanceAlgorithm_Impl::setDoSpaceHeatBalanceforSizing(bool doSpaceHeatBalanceforSizing) {
+      this->getBooleanFieldValue(OS_ZoneAirHeatBalanceAlgorithmFields::DoSpaceHeatBalanceforSizing);
+      bool result = false;
+      if (doSpaceHeatBalanceforSizing) {
+        result = setString(OS_ZoneAirHeatBalanceAlgorithmFields::DoSpaceHeatBalanceforSizing, "Yes");
+      } else {
+        result = setString(OS_ZoneAirHeatBalanceAlgorithmFields::DoSpaceHeatBalanceforSizing, "No");
+      }
+      OS_ASSERT(result);
+      return result;
+    }
+
+    void ZoneAirHeatBalanceAlgorithm_Impl::resetDoSpaceHeatBalanceforSizing() {
+      bool result = setString(OS_ZoneAirHeatBalanceAlgorithmFields::DoSpaceHeatBalanceforSizing, "");
+      OS_ASSERT(result);
+    }
+
+    bool ZoneAirHeatBalanceAlgorithm_Impl::setDoSpaceHeatBalanceforSimulation(bool doSpaceHeatBalanceforSimulation) {
+      bool result = false;
+      if (doSpaceHeatBalanceforSimulation) {
+        result = setString(OS_ZoneAirHeatBalanceAlgorithmFields::DoSpaceHeatBalanceforSimulation, "Yes");
+      } else {
+        result = setString(OS_ZoneAirHeatBalanceAlgorithmFields::DoSpaceHeatBalanceforSimulation, "No");
+      }
+      OS_ASSERT(result);
+      return result;
+    }
+
+    void ZoneAirHeatBalanceAlgorithm_Impl::resetDoSpaceHeatBalanceforSimulation() {
+      bool result = setString(OS_ZoneAirHeatBalanceAlgorithmFields::DoSpaceHeatBalanceforSimulation, "");
+      OS_ASSERT(result);
     }
 
   }  // namespace detail
@@ -127,6 +172,22 @@ namespace model {
     return getImpl<detail::ZoneAirHeatBalanceAlgorithm_Impl>()->isAlgorithmDefaulted();
   }
 
+  bool ZoneAirHeatBalanceAlgorithm::doSpaceHeatBalanceforSizing() const {
+    return getImpl<detail::ZoneAirHeatBalanceAlgorithm_Impl>()->doSpaceHeatBalanceforSizing();
+  }
+
+  bool ZoneAirHeatBalanceAlgorithm::isDoSpaceHeatBalanceforSizingDefaulted() const {
+    return getImpl<detail::ZoneAirHeatBalanceAlgorithm_Impl>()->isDoSpaceHeatBalanceforSizingDefaulted();
+  }
+
+  bool ZoneAirHeatBalanceAlgorithm::doSpaceHeatBalanceforSimulation() const {
+    return getImpl<detail::ZoneAirHeatBalanceAlgorithm_Impl>()->doSpaceHeatBalanceforSimulation();
+  }
+
+  bool ZoneAirHeatBalanceAlgorithm::isDoSpaceHeatBalanceforSimulationDefaulted() const {
+    return getImpl<detail::ZoneAirHeatBalanceAlgorithm_Impl>()->isDoSpaceHeatBalanceforSimulationDefaulted();
+  }
+
   bool ZoneAirHeatBalanceAlgorithm::setAlgorithm(const std::string& algorithm) {
     return getImpl<detail::ZoneAirHeatBalanceAlgorithm_Impl>()->setAlgorithm(algorithm);
   }
@@ -135,6 +196,22 @@ namespace model {
     getImpl<detail::ZoneAirHeatBalanceAlgorithm_Impl>()->resetAlgorithm();
   }
 
+  bool ZoneAirHeatBalanceAlgorithm::setDoSpaceHeatBalanceforSizing(bool doSpaceHeatBalanceforSizing) {
+    return getImpl<detail::ZoneAirHeatBalanceAlgorithm_Impl>()->setDoSpaceHeatBalanceforSizing(doSpaceHeatBalanceforSizing);
+  }
+
+  void ZoneAirHeatBalanceAlgorithm::resetDoSpaceHeatBalanceforSizing() {
+    getImpl<detail::ZoneAirHeatBalanceAlgorithm_Impl>()->resetDoSpaceHeatBalanceforSizing();
+  }
+
+  bool ZoneAirHeatBalanceAlgorithm::setDoSpaceHeatBalanceforSimulation(bool doSpaceHeatBalanceforSimulation) {
+    return getImpl<detail::ZoneAirHeatBalanceAlgorithm_Impl>()->setDoSpaceHeatBalanceforSimulation(doSpaceHeatBalanceforSimulation);
+  }
+
+  void ZoneAirHeatBalanceAlgorithm::resetDoSpaceHeatBalanceforSimulation() {
+    getImpl<detail::ZoneAirHeatBalanceAlgorithm_Impl>()->resetDoSpaceHeatBalanceforSimulation();
+  }
+
   /// @cond
   ZoneAirHeatBalanceAlgorithm::ZoneAirHeatBalanceAlgorithm(std::shared_ptr<detail::ZoneAirHeatBalanceAlgorithm_Impl> impl)
     : ModelObject(std::move(impl)) {}
@@ -142,7 +219,10 @@ namespace model {
   ZoneAirHeatBalanceAlgorithm::ZoneAirHeatBalanceAlgorithm(Model& model) : ModelObject(ZoneAirHeatBalanceAlgorithm::iddObjectType(), model) {
     OS_ASSERT(getImpl<detail::ZoneAirHeatBalanceAlgorithm_Impl>());
 
-    setAlgorithm("ThirdOrderBackwardDifference");
+    // Leaving the IDD defaults
+    // Algorithm: ThirdOrderBackwardDifference
+    // DoSpaceHeatBalanceforSizing: false
+    // DoSpaceHeatBalanceforSimulation: false
   }
 
   /// @endcond
diff --git a/src/model/ZoneAirHeatBalanceAlgorithm.hpp b/src/model/ZoneAirHeatBalanceAlgorithm.hpp
index c1c9b0631f3..4098e0fc581 100644
--- a/src/model/ZoneAirHeatBalanceAlgorithm.hpp
+++ b/src/model/ZoneAirHeatBalanceAlgorithm.hpp
@@ -69,6 +69,14 @@ namespace model {
 
     bool isAlgorithmDefaulted() const;
 
+    bool doSpaceHeatBalanceforSizing() const;
+
+    bool isDoSpaceHeatBalanceforSizingDefaulted() const;
+
+    bool doSpaceHeatBalanceforSimulation() const;
+
+    bool isDoSpaceHeatBalanceforSimulationDefaulted() const;
+
     //@}
     /** @name Setters */
     //@{
@@ -77,6 +85,14 @@ namespace model {
 
     void resetAlgorithm();
 
+    bool setDoSpaceHeatBalanceforSizing(bool doSpaceHeatBalanceforSizing);
+
+    void resetDoSpaceHeatBalanceforSizing();
+
+    bool setDoSpaceHeatBalanceforSimulation(bool doSpaceHeatBalanceforSimulation);
+
+    void resetDoSpaceHeatBalanceforSimulation();
+
     //@}
     /** @name Other */
     //@{
diff --git a/src/model/ZoneAirHeatBalanceAlgorithm_Impl.hpp b/src/model/ZoneAirHeatBalanceAlgorithm_Impl.hpp
index d7a1753bd1d..ff4eae4c2f8 100644
--- a/src/model/ZoneAirHeatBalanceAlgorithm_Impl.hpp
+++ b/src/model/ZoneAirHeatBalanceAlgorithm_Impl.hpp
@@ -79,17 +79,27 @@ namespace model {
       //@{
 
       std::string algorithm() const;
-
       bool isAlgorithmDefaulted() const;
 
+      bool doSpaceHeatBalanceforSizing() const;
+      bool isDoSpaceHeatBalanceforSizingDefaulted() const;
+
+      bool doSpaceHeatBalanceforSimulation() const;
+      bool isDoSpaceHeatBalanceforSimulationDefaulted() const;
+
       //@}
       /** @name Setters */
       //@{
 
       bool setAlgorithm(const std::string& algorithm);
-
       void resetAlgorithm();
 
+      bool setDoSpaceHeatBalanceforSizing(bool doSpaceHeatBalanceforSizing);
+      void resetDoSpaceHeatBalanceforSizing();
+
+      bool setDoSpaceHeatBalanceforSimulation(bool doSpaceHeatBalanceforSimulation);
+      void resetDoSpaceHeatBalanceforSimulation();
+
       //@}
       /** @name Other */
       //@{
@@ -98,8 +108,6 @@ namespace model {
      protected:
      private:
       REGISTER_LOGGER("openstudio.model.ZoneAirHeatBalanceAlgorithm");
-
-      std::vector<std::string> validAlgorithmValues() const;
     };
 
   }  // namespace detail
diff --git a/src/osversion/VersionTranslator.cpp b/src/osversion/VersionTranslator.cpp
index 0789fbf2b94..d86a52fd2ad 100644
--- a/src/osversion/VersionTranslator.cpp
+++ b/src/osversion/VersionTranslator.cpp
@@ -158,8 +158,8 @@ namespace osversion {
     m_updateMethods[VersionString("3.4.0")] = &VersionTranslator::update_3_3_0_to_3_4_0;
     m_updateMethods[VersionString("3.5.0")] = &VersionTranslator::update_3_4_0_to_3_5_0;
     m_updateMethods[VersionString("3.5.1")] = &VersionTranslator::update_3_5_0_to_3_5_1;
-    m_updateMethods[VersionString("3.5.2")] = &VersionTranslator::update_3_5_1_to_3_5_2;
-    // m_updateMethods[VersionString("3.5.2")] = &VersionTranslator::defaultUpdate;
+    m_updateMethods[VersionString("3.6.0")] = &VersionTranslator::update_3_5_1_to_3_6_0;
+    // m_updateMethods[VersionString("3.6.0")] = &VersionTranslator::defaultUpdate;
 
     // List of previous versions that may be updated to this one.
     //   - To increment the translator, add an entry for the version just released (branched for
@@ -205,7 +205,7 @@ namespace osversion {
       VersionString("3.1.0"),  VersionString("3.2.0"),  VersionString("3.2.1"),  VersionString("3.3.0"),
       VersionString("3.4.0"),  VersionString("3.5.0"),  VersionString("3.5.1")
       // Note: do **not** include the **current** version in m_startVersions, stop at the previous release
-      //VersionString("3.5.2"),
+      //VersionString("3.6.0"),
     };
   }
 
@@ -7584,12 +7584,12 @@ namespace osversion {
 
   }  // end update_3_5_0_to_3_5_1
 
-  std::string VersionTranslator::update_3_5_1_to_3_5_2(const IdfFile& idf_3_5_1, const IddFileAndFactoryWrapper& idd_3_5_2) {
+  std::string VersionTranslator::update_3_5_1_to_3_6_0(const IdfFile& idf_3_5_1, const IddFileAndFactoryWrapper& idd_3_6_0) {
     std::stringstream ss;
     boost::optional<std::string> value;
 
     ss << idf_3_5_1.header() << '\n' << '\n';
-    IdfFile targetIdf(idd_3_5_2.iddFile());
+    IdfFile targetIdf(idd_3_6_0.iddFile());
     ss << targetIdf.versionObject().get();
 
     for (const IdfObject& object : idf_3_5_1.objects()) {
@@ -7599,9 +7599,9 @@ namespace osversion {
 
         // Kusuda fields get moved over to OS:Site:GroundTemperature:Undisturbed:KusudaAchenbach
 
-        auto iddObject = idd_3_5_2.getObject(iddname);
+        auto iddObject = idd_3_6_0.getObject(iddname);
         IdfObject ghxObject(iddObject.get());
-        IdfObject kusudaObject(idd_3_5_2.getObject("OS:Site:GroundTemperature:Undisturbed:KusudaAchenbach").get());
+        IdfObject kusudaObject(idd_3_6_0.getObject("OS:Site:GroundTemperature:Undisturbed:KusudaAchenbach").get());
 
         for (size_t i = 0; i < object.numFields(); ++i) {
           if (i < 19) {
@@ -7638,7 +7638,7 @@ namespace osversion {
 
     return ss.str();
 
-  }  // end update_3_5_1_to_3_5_2
+  }  // end update_3_5_1_to_3_6_0
 
 }  // namespace osversion
 }  // namespace openstudio
diff --git a/src/osversion/VersionTranslator.hpp b/src/osversion/VersionTranslator.hpp
index 0e485872881..64c63e7bc72 100644
--- a/src/osversion/VersionTranslator.hpp
+++ b/src/osversion/VersionTranslator.hpp
@@ -257,7 +257,7 @@ namespace osversion {
     std::string update_3_3_0_to_3_4_0(const IdfFile& idf_3_3_0, const IddFileAndFactoryWrapper& idd_3_4_0);
     std::string update_3_4_0_to_3_5_0(const IdfFile& idf_3_4_0, const IddFileAndFactoryWrapper& idd_3_5_0);
     std::string update_3_5_0_to_3_5_1(const IdfFile& idf_3_5_0, const IddFileAndFactoryWrapper& idd_3_5_1);
-    std::string update_3_5_1_to_3_5_2(const IdfFile& idf_3_5_1, const IddFileAndFactoryWrapper& idd_3_5_2);
+    std::string update_3_5_1_to_3_6_0(const IdfFile& idf_3_5_1, const IddFileAndFactoryWrapper& idd_3_6_0);
 
     IdfObject updateUrlField_0_7_1_to_0_7_2(const IdfObject& object, unsigned index);
 
diff --git a/src/utilities/idd/Test/IddFile_GTest.cpp b/src/utilities/idd/Test/IddFile_GTest.cpp
index 76fd7e5041c..1bb0447d152 100644
--- a/src/utilities/idd/Test/IddFile_GTest.cpp
+++ b/src/utilities/idd/Test/IddFile_GTest.cpp
@@ -79,7 +79,7 @@ TEST_F(IddFixture, EpIddFile) {
     EXPECT_EQ("", logMessage.logMessage());
   }
 
-  EXPECT_EQ("22.2.0", loadedIddFile->version());
+  EXPECT_EQ("23.1.0", loadedIddFile->version());
   EXPECT_EQ(epIddFile.objects().size(), loadedIddFile->objects().size());
   if (epIddFile.objects().size() != loadedIddFile->objects().size()) {
     // get sets of IddObjectType
diff --git a/src/utilities/sql/Test/SqlFile_GTest.cpp b/src/utilities/sql/Test/SqlFile_GTest.cpp
index acf6e80d48e..a8b3ec753de 100644
--- a/src/utilities/sql/Test/SqlFile_GTest.cpp
+++ b/src/utilities/sql/Test/SqlFile_GTest.cpp
@@ -340,7 +340,8 @@ TEST_F(SqlFileFixture, AnnualTotalCosts) {
   // 22.2.0 forces you to use a schedule with a value of 1, so that produces a lot of deviations
   //                 = {252660024.14000002, 28129.12, 428.19, 360.93, 781.28, 3322324.62, 249308000.0};
   // To reduce the deviation, I switched the PTAC/PTHP to a Fan:OnOff with a Always Off Discrete Schedule, but it still behaves slightly differently
-  SqlResults ep_2220 = {191883303.43, 27902.68, 407.55, 361.09, 776.63, 3322855.48, 188531000.0};
+  // SqlResults ep_2220 = {191883303.43, 27902.68, 407.55, 361.09, 776.63, 3322855.48, 188531000.0};
+  SqlResults ep_2310 = {191883303.43, 27902.68, 407.55, 361.09, 776.63, 3322855.48, 188531000.0};
   // To update, cd build/resources, then in Ruby
   /** ```ruby
    sqlFile2 = OpenStudio::SqlFile.new('energyplus/Office_With_Many_HVAC_Types/eplusout.sql')
@@ -373,15 +374,15 @@ TEST_F(SqlFileFixture, AnnualTotalCosts) {
   // =========== Check that within our development based on the current E+ version we do not make the results vary (at all)  =================
 
   // Total annual costs for all fuel types
-  EXPECT_NEAR(ep_2220.annualTotalUtilityCost, sqlFile2.annualTotalUtilityCost().get(), 0.03);
+  EXPECT_NEAR(ep_2310.annualTotalUtilityCost, sqlFile2.annualTotalUtilityCost().get(), 0.03);
 
   // Costs by fuel type
-  EXPECT_DOUBLE_EQ(ep_2220.annualTotalCost_Electricity, sqlFile2.annualTotalCost(FuelType::Electricity).get());
-  EXPECT_DOUBLE_EQ(ep_2220.annualTotalCost_Gas, sqlFile2.annualTotalCost(FuelType::Gas).get());
-  EXPECT_DOUBLE_EQ(ep_2220.annualTotalCost_DistrictCooling, sqlFile2.annualTotalCost(FuelType::DistrictCooling).get());
-  EXPECT_DOUBLE_EQ(ep_2220.annualTotalCost_DistrictHeating, sqlFile2.annualTotalCost(FuelType::DistrictHeating).get());
-  EXPECT_NEAR(ep_2220.annualTotalCost_Water, sqlFile2.annualTotalCost(FuelType::Water).get(), 0.03);
-  EXPECT_DOUBLE_EQ(ep_2220.annualTotalCost_FuelOil_1, sqlFile2.annualTotalCost(FuelType::FuelOil_1).get());
+  EXPECT_DOUBLE_EQ(ep_2310.annualTotalCost_Electricity, sqlFile2.annualTotalCost(FuelType::Electricity).get());
+  EXPECT_DOUBLE_EQ(ep_2310.annualTotalCost_Gas, sqlFile2.annualTotalCost(FuelType::Gas).get());
+  EXPECT_DOUBLE_EQ(ep_2310.annualTotalCost_DistrictCooling, sqlFile2.annualTotalCost(FuelType::DistrictCooling).get());
+  EXPECT_DOUBLE_EQ(ep_2310.annualTotalCost_DistrictHeating, sqlFile2.annualTotalCost(FuelType::DistrictHeating).get());
+  EXPECT_NEAR(ep_2310.annualTotalCost_Water, sqlFile2.annualTotalCost(FuelType::Water).get(), 0.03);
+  EXPECT_DOUBLE_EQ(ep_2310.annualTotalCost_FuelOil_1, sqlFile2.annualTotalCost(FuelType::FuelOil_1).get());
 
   // These have a relatively high tolerance and shouldn't fail, and they depend on the above values divided by square footage which shouldn't vary
   // So it's fine to keep it as is
@@ -626,6 +627,7 @@ TEST_F(SqlFileFixture, Regressions) {
   regressionTestSqlFile("1ZoneEvapCooler-V9-6-0.sql", 43.28, 20, 20);
   regressionTestSqlFile("1ZoneEvapCooler-V22-1-0.sql", 43.28, 20, 20);
   regressionTestSqlFile("1ZoneEvapCooler-V22-2-0.sql", 43.28, 20, 20);
+  regressionTestSqlFile("1ZoneEvapCooler-V23-1-0.sql", 43.28, 20, 20);
 }
 
 TEST_F(SqlFileFixture, SqlFile_LeapYear) {


Test patch:
diff --git a/src/model/test/ZoneAirHeatBalanceAlgorithm_GTest.cpp b/src/model/test/ZoneAirHeatBalanceAlgorithm_GTest.cpp
new file mode 100644
index 00000000000..b16824432ab
--- /dev/null
+++ b/src/model/test/ZoneAirHeatBalanceAlgorithm_GTest.cpp
@@ -0,0 +1,99 @@
+/***********************************************************************************************************************
+*  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 "ModelFixture.hpp"
+
+#include "../ZoneAirHeatBalanceAlgorithm.hpp"
+#include "../ZoneAirHeatBalanceAlgorithm_Impl.hpp"
+
+using namespace openstudio;
+using namespace openstudio::model;
+
+TEST_F(ModelFixture, ZoneAirHeatBalanceAlgorithm_GettersSetters) {
+  Model m;
+  auto zoneAirHeatBalanceAlgorithm = m.getUniqueModelObject<ZoneAirHeatBalanceAlgorithm>();
+
+  // Algorithm: Optional String
+  // Default value from IDD
+  EXPECT_TRUE(zoneAirHeatBalanceAlgorithm.isAlgorithmDefaulted());
+  EXPECT_EQ("ThirdOrderBackwardDifference", zoneAirHeatBalanceAlgorithm.algorithm());
+  // Set
+  EXPECT_TRUE(zoneAirHeatBalanceAlgorithm.setAlgorithm("AnalyticalSolution"));
+  EXPECT_EQ("AnalyticalSolution", zoneAirHeatBalanceAlgorithm.algorithm());
+  EXPECT_FALSE(zoneAirHeatBalanceAlgorithm.isAlgorithmDefaulted());
+  // Bad Value
+  EXPECT_FALSE(zoneAirHeatBalanceAlgorithm.setAlgorithm("BADENUM"));
+  EXPECT_EQ("AnalyticalSolution", zoneAirHeatBalanceAlgorithm.algorithm());
+  // Reset
+  zoneAirHeatBalanceAlgorithm.resetAlgorithm();
+  EXPECT_TRUE(zoneAirHeatBalanceAlgorithm.isAlgorithmDefaulted());
+  EXPECT_EQ("ThirdOrderBackwardDifference", zoneAirHeatBalanceAlgorithm.algorithm());
+
+  // Do Space Heat Balance for Sizing: Optional Boolean
+  // Default value from IDD
+  EXPECT_TRUE(zoneAirHeatBalanceAlgorithm.isDoSpaceHeatBalanceforSizingDefaulted());
+  EXPECT_FALSE(zoneAirHeatBalanceAlgorithm.doSpaceHeatBalanceforSizing());
+  // Set
+  EXPECT_TRUE(zoneAirHeatBalanceAlgorithm.setDoSpaceHeatBalanceforSizing(true));
+  EXPECT_TRUE(zoneAirHeatBalanceAlgorithm.doSpaceHeatBalanceforSizing());
+  EXPECT_FALSE(zoneAirHeatBalanceAlgorithm.isDoSpaceHeatBalanceforSizingDefaulted());
+
+  EXPECT_TRUE(zoneAirHeatBalanceAlgorithm.setDoSpaceHeatBalanceforSizing(false));
+  EXPECT_FALSE(zoneAirHeatBalanceAlgorithm.doSpaceHeatBalanceforSizing());
+  EXPECT_FALSE(zoneAirHeatBalanceAlgorithm.isDoSpaceHeatBalanceforSizingDefaulted());
+
+  EXPECT_TRUE(zoneAirHeatBalanceAlgorithm.setDoSpaceHeatBalanceforSizing(true));
+  EXPECT_TRUE(zoneAirHeatBalanceAlgorithm.doSpaceHeatBalanceforSizing());
+  EXPECT_FALSE(zoneAirHeatBalanceAlgorithm.isDoSpaceHeatBalanceforSizingDefaulted());
+  // Reset
+  zoneAirHeatBalanceAlgorithm.resetDoSpaceHeatBalanceforSizing();
+  EXPECT_TRUE(zoneAirHeatBalanceAlgorithm.isDoSpaceHeatBalanceforSizingDefaulted());
+  EXPECT_FALSE(zoneAirHeatBalanceAlgorithm.doSpaceHeatBalanceforSizing());
+
+  // Do Space Heat Balance for Simulation: Optional Boolean
+  // Default value from IDD
+  EXPECT_TRUE(zoneAirHeatBalanceAlgorithm.isDoSpaceHeatBalanceforSimulationDefaulted());
+  EXPECT_FALSE(zoneAirHeatBalanceAlgorithm.doSpaceHeatBalanceforSimulation());
+  // Set
+  EXPECT_TRUE(zoneAirHeatBalanceAlgorithm.setDoSpaceHeatBalanceforSimulation(true));
+  EXPECT_TRUE(zoneAirHeatBalanceAlgorithm.doSpaceHeatBalanceforSimulation());
+  EXPECT_FALSE(zoneAirHeatBalanceAlgorithm.isDoSpaceHeatBalanceforSimulationDefaulted());
+
+  EXPECT_TRUE(zoneAirHeatBalanceAlgorithm.setDoSpaceHeatBalanceforSimulation(false));
+  EXPECT_FALSE(zoneAirHeatBalanceAlgorithm.doSpaceHeatBalanceforSimulation());
+  EXPECT_FALSE(zoneAirHeatBalanceAlgorithm.isDoSpaceHeatBalanceforSimulationDefaulted());
+
+  EXPECT_TRUE(zoneAirHeatBalanceAlgorithm.setDoSpaceHeatBalanceforSimulation(true));
+  EXPECT_TRUE(zoneAirHeatBalanceAlgorithm.doSpaceHeatBalanceforSimulation());
+  EXPECT_FALSE(zoneAirHeatBalanceAlgorithm.isDoSpaceHeatBalanceforSimulationDefaulted());
+  // Reset
+  zoneAirHeatBalanceAlgorithm.resetDoSpaceHeatBalanceforSimulation();
+  EXPECT_TRUE(zoneAirHeatBalanceAlgorithm.isDoSpaceHeatBalanceforSimulationDefaulted());
+  EXPECT_FALSE(zoneAirHeatBalanceAlgorithm.doSpaceHeatBalanceforSimulation());
+}
diff --git a/src/osversion/test/3_5_2/test_vt_GroundHeatExchangerHorizontalTrench.osm b/src/osversion/test/3_6_0/test_vt_GroundHeatExchangerHorizontalTrench.osm
similarity index 100%
rename from src/osversion/test/3_5_2/test_vt_GroundHeatExchangerHorizontalTrench.osm
rename to src/osversion/test/3_6_0/test_vt_GroundHeatExchangerHorizontalTrench.osm
diff --git a/src/osversion/test/3_5_2/test_vt_GroundHeatExchangerHorizontalTrench.rb b/src/osversion/test/3_6_0/test_vt_GroundHeatExchangerHorizontalTrench.rb
similarity index 100%
rename from src/osversion/test/3_5_2/test_vt_GroundHeatExchangerHorizontalTrench.rb
rename to src/osversion/test/3_6_0/test_vt_GroundHeatExchangerHorizontalTrench.rb
diff --git a/src/osversion/test/VersionTranslator_GTest.cpp b/src/osversion/test/VersionTranslator_GTest.cpp
index 58ca3a7367f..dbb1cbf0b66 100644
--- a/src/osversion/test/VersionTranslator_GTest.cpp
+++ b/src/osversion/test/VersionTranslator_GTest.cpp
@@ -2467,13 +2467,13 @@ TEST_F(OSVersionFixture, update_3_5_0_to_3_5_1_VRF_Terminal_v340_osc) {
   EXPECT_EQ("OS:ZoneHVAC:TerminalUnit:VariableRefrigerantFlow", ocd->primaryComponentObject().iddObject().name());
 }
 
-TEST_F(OSVersionFixture, update_3_5_1_to_3_5_2_GroundHeatExchangerHorizontalTrench) {
-  openstudio::path path = resourcesPath() / toPath("osversion/3_5_2/test_vt_GroundHeatExchangerHorizontalTrench.osm");
+TEST_F(OSVersionFixture, update_3_5_1_to_3_6_0_GroundHeatExchangerHorizontalTrench) {
+  openstudio::path path = resourcesPath() / toPath("osversion/3_6_0/test_vt_GroundHeatExchangerHorizontalTrench.osm");
   osversion::VersionTranslator vt;
   boost::optional<model::Model> model = vt.loadModel(path);
   ASSERT_TRUE(model) << "Failed to load " << path;
 
-  openstudio::path outPath = resourcesPath() / toPath("osversion/3_5_2/test_vt_GroundHeatExchangerHorizontalTrench_updated.osm");
+  openstudio::path outPath = resourcesPath() / toPath("osversion/3_6_0/test_vt_GroundHeatExchangerHorizontalTrench_updated.osm");
   model->save(outPath, true);
 
   std::vector<WorkspaceObject> ghxs = model->getObjectsByType("OS:GroundHeatExchanger:HorizontalTrench");