Repository: NREL/OpenStudio (language: python)

Issue:
Wrap AirConditioner:VariableRefrigerantFlow:FluidTemperatureControl:HR
Enhancement Request
--------------
Wrap AirConditioner:VariableRefrigerantFlow:FluidTemperatureControl:HR in OpenStudio for an alternative approach to VRF heat pump modeling.

## Detailed Description

## Possible Implementation


VRF model object lists
Pull request overview
---------------------

 - Use ModelObjectList for loading indexes instead of extensible list.

### Pull Request Author

<!--- Add to this list or remove from it as applicable.  This is a simple templated set of guidelines. -->

 - [ ] Model API Changes / Additions
 - [ ] Any new or modified fields have been implemented in the EnergyPlus ForwardTranslator (and ReverseTranslator as appropriate)
 - [ ] Model API methods are tested (in `src/model/test`)
 - [ ] EnergyPlus ForwardTranslator Tests (in `src/energyplus/Test`)
 - [ ] If a new object or method, added a test in NREL/OpenStudio-resources: Add Link
 - [ ] If needed, added VersionTranslation rules for the objects (`src/osversion/VersionTranslator.cpp`)
 - [ ] Verified that C# bindings built fine on Windows, partial classes used as needed, etc.
 - [ ] All new and existing tests passes
 - [ ] If methods have been deprecated, update rest of code to use the new methods

**Labels:**

 - [ ] If change to an IDD file, add the label `IDDChange`
 - [ ] If breaking existing API, add the label `APIChange`
 - [ ] If deemed ready, add label `Pull Request - Ready for CI` so that CI builds your PR

### Review Checklist

This will not be exhaustively relevant to every PR.
 - [ ] Perform a Code Review on GitHub
 - [ ] Code Style, strip trailing whitespace, etc.
 - [ ] All related changes have been implemented: model changes, model tests, FT changes, FT tests, VersionTranslation, OS App
 - [ ] Labeling is ok
 - [ ] If defect, verify by running develop branch and reproducing defect, then running PR and reproducing fix
 - [ ] If feature, test running new feature, try creative ways to break it
 - [ ] CI status: all green or justified



Discussion / hints:

Fix patch:
diff --git a/developer/doc/ReleaseNotes/OpenStudio_Release_Notes_3_6_0_TBD.md b/developer/doc/ReleaseNotes/OpenStudio_Release_Notes_3_6_0_TBD.md
new file mode 100644
index 00000000000..ba9665822d2
--- /dev/null
+++ b/developer/doc/ReleaseNotes/OpenStudio_Release_Notes_3_6_0_TBD.md
@@ -0,0 +1,96 @@
+# OpenStudio Version 3.6.0
+
+_Release Notes_ -  _TBD_
+
+These release notes describe version 3.6.0 of the OpenStudio SDK developed by the National Renewable Energy Laboratory (NREL), Buildings and Thermal Sciences Center, Commercial Buildings Research Group, Tools Development Section, and associated collaborators. The notes are organized into the following sections:
+
+-  Overview
+-  Where to Find OpenStudio Documentation
+-  Installation Notes
+-  OpenStudio SDK: Changelog
+
+# Overview
+
+As of April 2020, development and distribution of the OpenStudioApplication and the SketchUp plugin have transitioned to the OpenStudio Coalition, who is independently managing and distributing the software through its own [openstudiocoalition/OpenStudioApplication](https://github.com/openstudiocoalition/OpenStudioApplication) repository. The OpenStudio SDK is continuing to be actively developed and distributed by NREL and is released two times per year, through a spring and a fall release.
+
+Below is the list of components that is included in this SDK installer:
+
+__**OpenStudio SDK 3.6.0**__
+- EnergyPlus
+- Command Line Interface (CLI)
+- Radiance
+- Ruby API
+- C++ SDK
+
+**Note** that [PAT](https://github.com/NREL/OpenStudio-PAT) is not included in either the SDK or the OpenStudio Coalition's Application installers. You will need to install PAT separately which is distributed on the [OpenStudio-PAT](https://github.com/NREL/OpenStudio-PAT) GitHub page.
+
+# Where to Find OpenStudio SDK Documentation
+
+- OpenStudio SDK release documentation, including these release notes, tutorials, and other user documentation, is available at [https://www.openstudio.net/](https://www.openstudio.net/.)
+- C++ API documentation is available at [https://openstudio-sdk-documentation.s3.amazonaws.com/index.html](https://openstudio-sdk-documentation.s3.amazonaws.com/index.html)
+- Measure development documentation is available at [http://nrel.github.io/OpenStudio-user-documentation/reference/measure_writing_guide/](http://nrel.github.io/OpenStudio-user-documentation/reference/measure_writing_guide/ )
+- A roadmap for planned features is available at http://nrel.github.io/OpenStudio-user-documentation/getting_started/roadmap/.
+
+# Installation Notes
+
+OpenStudio SDK 3.6.0 is supported on 64-bit Windows 7 – 11, OS X 10.15, Ubuntu 18.04, 20.04 and Centos7
+
+OpenStudio SDK 3.6.0 supports [EnergyPlus Release 22.1.0](https://github.com/NREL/EnergyPlus/releases/tag/v22.1.0), which is bundled with the OpenStudio installer. It is no longer necessary to download and install EnergyPlus separately. Other builds of EnergyPlus are not supported by OpenStudio SDK 3.6.0.
+
+OpenStudio SDK 3.6.0 supports Radiance 5.0.a.12, which is bundled with the OpenStudio installer; users no longer must install Radiance separately, and OpenStudio will use the included Radiance version regardless of any other versions that may be installed on the system. Other builds of Radiance are not supported by OpenStudio SDK 3.6.0.
+
+As usual, you can refer to the **[OpenStudio SDK Compatibility Matrix](https://github.com/NREL/OpenStudio/wiki/OpenStudio-SDK-Version-Compatibility-Matrix)** for more information.
+
+
+## Installation Steps
+
+- Download and install [OpenStudio SDK](https://github.com/NREL/openstudio) and/or [openstudiocoalition/OpenStudioApplication](https://github.com/openstudiocoalition/OpenStudioApplication) depending on your needs. Select components for installation. Note that OpenStudio Application is a standalone app and does not require you to install OpenStudio SDK.
+- Setup a Building Component Library (BCL) account to access online building components and measures. View instructions on how to setup your account and configure the key in OpenStudio.
+- The OpenStudio Application SketchUp Plug-in requires SketchUp 2021-2022 (not available for Linux). The OpenStudio Application SketchUp Plug-in does not support older versions of SketchUp. SketchUp must be installed before OpenStudio Application to automatically activate the plugin. If you install SketchUp after OpenStudio Application, simply re-run the OpenStudio Application installer.
+
+For help with common installation problems please visit, http://nrel.github.io/OpenStudio-user-documentation/getting_started/getting_started/.
+
+# OpenStudio SDK: Changelog
+
+The 3.6.0 is a major release. This update includes several new features, performance improvements, and bug fixes.
+You can find the list of Pull Requests that got into this release [here](https://github.com/NREL/OpenStudio/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aclosed+created%3A2021-04-27..2022-09-26+).
+
+
+## Python Bindings
+
+As of OpenStudio SDK 3.2.0, Python bindings are officially supported and distributed through Python Package Index (PyPI). To install, users will need to have Python3 installed along with pip and simply run the following command in a terminal window.
+
+`pip install openstudio==3.6.0`
+
+Please see [openstudio on PyPi](https://pypi.org/project/openstudio/) for further instructions on how to install. Users can also visit the test channel at [openstudio on TestPyPi](https://test.pypi.org/project/openstudio/) to install development bindings.
+
+You can also refer to the [OpenStudio SDK Python Binding Version Compatibility Matrix](https://github.com/NREL/OpenStudio/wiki/OpenStudio-SDK-Python-Binding-Version-Compatibility-Matrix) to see the list of supported platforms and python versions.
+
+## New Features, Major Fixes and API-breaking changes
+
+* [#4778](https://github.com/NREL/OpenStudio/pull/4778) - Wrap AirConditioner:VariableRefrigerantFlow:FluidTemperatureControl and AirConditioner:VariableRefrigerantFlow:FluidTemperatureControl:HR
+    * `ZoneHVAC:TerminalUnit:VariableRefrigerantFlow` has API-breaking changes related to setters and getters for its heating and cooling coils. They now use `HVACComponent` instead of the more restrictive `CoilHeatingDXVariableRefrigerantFlow` and `CoilCoolingDXVariableRefrigerantFlow`.
+    * `AirConditionerVariableRefrigerantFlow::clone` was changed to stop cloning the child `Curve` objects (20 of them)
+
+## Minor changes and bug fixes
+
+
+
+**Deprecated methods removed**:
+
+**Developer changes**:
+
+**Full Changelog**: https://github.com/NREL/OpenStudio/compare/v3.5.1...v3.6.0
+
+**New Contributors**:
+
+
+### OpenStudio Standards v0.3.0
+
+
+
+### OpenStudio Server 3.6.0
+
+
+
+## Issue Statistics Since Previous Release
diff --git a/resources/energyplus/ProposedEnergy+.idd b/resources/energyplus/ProposedEnergy+.idd
index 55f70a8c1e0..e3ab85138d5 100644
--- a/resources/energyplus/ProposedEnergy+.idd
+++ b/resources/energyplus/ProposedEnergy+.idd
@@ -38452,7 +38452,7 @@ AirConditioner:VariableRefrigerantFlow,
        \memo or more electric compressors and outdoor fan). Serves one or more VRF zone terminal
        \memo units. See ZoneHVAC:TerminalUnit:VariableRefrigerantFlow and ZoneTerminalUnitList.
        \min-fields 37
-  A1 , \field Heat Pump Name
+  A1 , \field Name
        \required-field
        \type alpha
        \reference-class-name validBranchEquipmentTypes
@@ -39015,7 +39015,7 @@ AirConditioner:VariableRefrigerantFlow:FluidTemperatureControl,
        \memo Indoor units are modeled separately, see ZoneHVAC:TerminalUnit:VariableRefrigerantFlow
        \extensible:3 - repeat last three fields, remembering to remove ; from "inner" fields.
        \min-fields 41
-  A1 , \field Heat Pump Name
+  A1 , \field Name
        \required-field
        \type alpha
        \note Enter a unique name for this variable refrigerant flow heat pump
diff --git a/resources/model/OpenStudio.idd b/resources/model/OpenStudio.idd
index deb7d7d227b..96857ed22a7 100644
--- a/resources/model/OpenStudio.idd
+++ b/resources/model/OpenStudio.idd
@@ -10226,6 +10226,689 @@ OS:AirConditioner:VariableRefrigerantFlow,
        \note Enter the time constant used to model the transition
        \note from cooling only mode to heat recovery mode
 
+OS:AirConditioner:VariableRefrigerantFlow:FluidTemperatureControl,
+       \memo This is a key object in the new physics based VRF model applicable for Fluid
+       \memo Temperature Control
+       \memo It describes the Variable Refrigerant Flow system excluding the performance of indoor units
+       \memo Indoor units are modeled separately, see ZoneHVAC:TerminalUnit:VariableRefrigerantFlow
+  A1,  \field Handle
+       \type handle
+       \required-field
+  A2 , \field Name
+       \required-field
+       \type alpha
+       \reference ConnectionObject
+  A3 , \field Availability Schedule
+       \type object-list
+       \object-list ScheduleNames
+       \required-field
+       \note Enter the name of a schedule that defines the availability of the unit
+       \note Schedule values of 0 denote the unit is off. All other values denote the unit is available
+       \note If this field is left blank, the unit is available the entire simulation
+  A4 , \field Zone Terminal Unit List
+       \required-field
+       \type object-list
+       \object-list ModelObjectLists
+       \note Enter the name of a ZoneTerminalUnitList. This list connects zone terminal units to this
+       \note heat pump
+  A5 , \field Refrigerant Type
+       \required-field
+       \type choice
+       \key R11
+       \key R12
+       \key R22
+       \key R123
+       \key R134a
+       \key R404a
+       \key R407a
+       \key R410a
+       \key NH3
+       \key R507a
+       \key R744
+  N1 , \field Rated Evaporative Capacity
+       \type real
+       \units W
+       \autosizable
+       \minimum> 0.0
+       \required-field
+       \note Enter the total evaporative capacity in watts at rated conditions
+       \note This is the capacity corresponding to the max compressor speed at rated conditions
+       \note The actual evaporative capacity is obtained by multiplying the
+       \note rated capacity with the modification factor calculated by Evaporative
+       \note Capacity Multiplier Function of Temperature Curve
+  N2 , \field Rated Compressor Power Per Unit of Rated Evaporative Capacity
+       \type real
+       \units dimensionless
+       \minimum> 0.0
+       \required-field
+       \note Enter the rated compressor power per Watt of rated evaporative capacity [W/W]
+       \note Rated compressor power corresponds to the max compressor speed at rated conditions
+       \note The actual compressor power is obtained by multiplying the
+       \note rated power with the modification factor calculated by Compressor
+       \note Power Multiplier Function of Temperature Curve
+  N3 , \field Minimum Outdoor Air Temperature in Cooling Mode
+       \type real
+       \units C
+       \required-field
+       \note Enter the minimum outdoor temperature allowed for cooling operation
+       \note Cooling is disabled below this temperature
+  N4 , \field Maximum Outdoor Air Temperature in Cooling Mode
+       \type real
+       \units C
+       \required-field
+       \note Enter the maximum outdoor temperature allowed for cooling operation
+       \note Cooling is disabled above this temperature
+  N5 , \field Minimum Outdoor Air Temperature in Heating Mode
+       \type real
+       \units C
+       \required-field
+       \note Enter the minimum outdoor temperature allowed for heating operation
+       \note Heating is disabled below this temperature
+  N6 , \field Maximum Outdoor Air Temperature in Heating Mode
+       \type real
+       \units C
+       \required-field
+       \note Enter the maximum outdoor temperature allowed for heating operation
+       \note Heating is disabled below this temperature
+  N7 , \field Reference Outdoor Unit Superheating
+       \type real
+       \units deltaC
+       \required-field
+  N8 , \field Reference Outdoor Unit Subcooling
+       \type real
+       \units deltaC
+       \required-field
+  A6 , \field Refrigerant Temperature Control Algorithm for Indoor Unit
+       \type choice
+       \key ConstantTemp
+       \key VariableTemp
+       \required-field
+  N9 , \field Reference Evaporating Temperature for Indoor Unit
+       \note This field is used if Refrigerant Temperature Control Algorithm
+       \note is ConstantTemp
+       \note Evaporating temperature is the refrigerant temperature, not air temperature
+       \type real
+       \units C
+       \required-field
+  N10, \field Reference Condensing Temperature for Indoor Unit
+       \note This field is used if Refrigerant Temperature Control Algorithm
+       \note is ConstantTemp
+       \note Condensing temperature is the refrigerant temperature, not air temperature
+       \type real
+       \units C
+       \required-field
+  N11, \field Variable Evaporating Temperature Minimum for Indoor Unit
+       \note This field is used if Refrigerant Temperature Control Algorithm
+       \note is VariableTemp
+       \note Evaporating temperature is the refrigerant temperature, not air temperature
+       \type real
+       \units C
+       \required-field
+  N12, \field Variable Evaporating Temperature Maximum for Indoor Unit
+       \note This field is used if Refrigerant Temperature Control Algorithm
+       \note is VariableTemp
+       \note Evaporating temperature is the refrigerant temperature, not air temperature
+       \type real
+       \units C
+       \required-field
+  N13, \field Variable Condensing Temperature Minimum for Indoor Unit
+       \note This field is used if Refrigerant Temperature Control Algorithm
+       \note is VariableTemp
+       \note Condensing temperature is the refrigerant temperature, not air temperature
+       \type real
+       \units C
+       \required-field
+  N14, \field Variable Condensing Temperature Maximum for Indoor Unit
+       \note This field is used if Refrigerant Temperature Control Algorithm
+       \note is VariableTemp
+       \note Condensing temperature is the refrigerant temperature, not air temperature
+       \type real
+       \units C
+       \required-field
+  N15, \field Outdoor Unit Fan Power Per Unit of Rated Evaporative Capacity
+       \note Enter the outdoor unit fan power per Watt of rated evaporative capacity [W/W]
+       \units dimensionless
+       \minimum> 0.0
+       \required-field
+       \type real
+  N16, \field Outdoor Unit Fan Flow Rate Per Unit of Rated Evaporative Capacity
+       \note This field is only used if the previous is set to autocalculate and performance input method is NominalCapacity
+       \units m3/s-W
+       \minimum> 0.0
+       \required-field
+       \type real
+  A7 , \field Outdoor Unit Evaporating Temperature Function of Superheating Curve Name
+       \required-field
+       \type object-list
+       \object-list UnivariateFunctions
+  A8 , \field Outdoor Unit Condensing Temperature Function of Subcooling Curve Name
+       \required-field
+       \type object-list
+       \object-list UnivariateFunctions
+  N17, \field Diameter of Main Pipe Connecting Outdoor Unit to the First Branch Joint
+       \note used to calculate the piping loss
+       \type real
+       \units m
+       \minimum 0.0
+       \required-field
+  N18, \field Length of Main Pipe Connecting Outdoor Unit to the First Branch Joint
+       \note used to calculate the heat loss of the main pipe
+       \type real
+       \units m
+       \minimum 0.0
+       \required-field
+  N19, \field Equivalent Length of Main Pipe Connecting Outdoor Unit to the First Branch Joint
+       \note used to calculate the refrigerant pressure drop of the main pipe
+       \type real
+       \units m
+       \minimum 0.0
+       \required-field
+  N20, \field Height Difference Between Outdoor Unit and Indoor Units
+       \note Difference between outdoor unit height and indoor unit height
+       \note Positive means outdoor unit is higher than indoor unit
+       \note Negative means outdoor unit is lower than indoor unit
+       \type real
+       \units m
+       \required-field
+  N21, \field Main Pipe Insulation Thickness
+       \type real
+       \units m
+       \minimum 0.0
+       \required-field
+  N22, \field Main Pipe Insulation Thermal Conductivity
+       \type real
+       \units W/m-K
+       \minimum 0.0
+       \required-field
+  N23, \field Crankcase Heater Power per Compressor
+       \type real
+       \units W
+       \required-field
+       \note Enter the value of the resistive heater located in the compressor(s). This heater
+       \note is used to warm the refrigerant and oil when the compressor is off
+  N24, \field Number of Compressors
+       \type integer
+       \units dimensionless
+       \required-field
+       \note Enter the total number of compressor. This input is used only for crankcase
+       \note heater calculations.
+  N25, \field Ratio of Compressor Size to Total Compressor Capacity
+       \type real
+       \units W/W
+       \required-field
+       \note Enter the ratio of the first stage compressor to total compressor capacity
+       \note All other compressors are assumed to be equally sized. This inputs is used
+       \note only for crankcase heater calculations
+  N26, \field Maximum Outdoor Dry-Bulb Temperature for Crankcase Heater
+       \type real
+       \units C
+       \required-field
+       \note Enter the maximum outdoor temperature above which the crankcase heaters are disabled
+  A9 , \field Defrost Strategy
+       \type choice
+       \key ReverseCycle
+       \key Resistive
+       \required-field
+       \note Select a defrost strategy.
+       \note Reverse cycle reverses the operating mode from heating to
+       \note cooling to melt frost formation on the condenser coil
+       \note The resistive strategy uses a resistive heater
+       \note to melt the frost.
+  A10, \field Defrost Control
+       \type choice
+       \key Timed
+       \key OnDemand
+       \required-field
+       \note Choose a defrost control type
+       \note Either use a fixed Timed defrost period or select
+       \note OnDemand to defrost only when necessary
+  A11, \field Defrost Energy Input Ratio Modifier Function of Temperature Curve Name
+       \type object-list
+       \object-list BivariateFunctions
+       \note A valid performance curve must be used if ReverseCycle defrost strategy is selected
+  N27, \field Defrost Time Period Fraction
+       \type real
+       \minimum 0.0
+       \required-field
+       \note Fraction of time in defrost mode
+       \note Only applicable if timed defrost control is specified
+  N28, \field Resistive Defrost Heater Capacity
+       \type real
+       \minimum 0.0
+       \required-field
+       \autosizable
+       \units W
+       \note Enter the size of the resistive defrost heating element
+       \note Only applicable if resistive defrost strategy is specified
+       \ip-units W
+  N29, \field Maximum Outdoor Dry-bulb Temperature for Defrost Operation
+       \type real
+       \units C
+       \required-field
+       \note Enter the maximum outdoor temperature above which the defrost operation is disabled
+  N30, \field Compressor Maximum Delta Pressure
+       \type real
+       \units Pa
+       \required-field
+       \minimum 0.0
+       \maximum 50000000.0
+  A12; \field Loading Index List
+       \type object-list
+       \object-list ModelObjectLists
+
+OS:AirConditioner:VariableRefrigerantFlow:FluidTemperatureControl:LoadingIndex,
+       \min-fields 5
+  A1,  \field Handle
+       \type handle
+       \required-field
+  A2,  \field Name
+       \required-field
+       \type alpha
+       \reference AirConditionerVariableRefrigerantFlowFluidTemperatureControlLoadingIndex
+  N1,  \field Compressor Speed
+       \required-field
+       \type real
+       \note Minimum compressor speed
+       \units rev/min
+       \minimum> 0
+  A3,  \field Evaporative Capacity Multiplier Function of Temperature Curve Name
+       \required-field
+       \type object-list
+       \object-list BivariateFunctions
+  A4;  \field Compressor Power Multiplier Function of Temperature Curve Name
+       \required-field
+       \type object-list
+       \object-list BivariateFunctions
+
+OS:AirConditioner:VariableRefrigerantFlow:FluidTemperatureControl:HR,
+       \memo This is a key object in the new physics based VRF Heat Recovery (HR) model applicable for Fluid
+       \memo Temperature Control. It describes the VRF HR system excluding the performance of indoor units.
+       \memo Indoor units are modeled separately in the ZoneHVAC:TerminalUnit:VariableRefrigerantFlow object
+  A1,  \field Handle
+       \type handle
+       \required-field
+  A2 , \field Name
+       \required-field
+       \type alpha
+       \reference ConnectionObject
+  A3 , \field Availability Schedule
+       \type object-list
+       \object-list ScheduleNames
+       \required-field
+       \note Enter the name of a schedule that defines the availability of the unit
+       \note Schedule values of 0 denote the unit is off. All other values denote the unit is available
+       \note If this field is left blank, the unit is available the entire simulation
+  A4 , \field Zone Terminal Unit List
+       \required-field
+       \type object-list
+       \object-list ModelObjectLists
+       \note Enter the name of a ZoneTerminalUnitList. This list connects zone terminal units to this
+       \note heat pump
+  A5 , \field Refrigerant Type
+       \required-field
+       \type choice
+       \key R11
+       \key R12
+       \key R22
+       \key R123
+       \key R134a
+       \key R404a
+       \key R407a
+       \key R410a
+       \key NH3
+       \key R507a
+       \key R744
+  N1 , \field Rated Evaporative Capacity
+       \type real
+       \units W
+       \autosizable
+       \minimum> 0.0
+       \required-field
+       \note Enter the total evaporative capacity in watts at rated conditions
+       \note This is the capacity corresponding to the max compressor speed at rated conditions
+       \note The actual evaporative capacity is obtained by multiplying the
+       \note rated capacity with the modification factor calculated by Evaporative
+       \note Capacity Multiplier Function of Temperature Curve
+  N2 , \field Rated Compressor Power Per Unit of Rated Evaporative Capacity
+       \type real
+       \units dimensionless
+       \minimum> 0.0
+       \required-field
+       \note Enter the rated compressor power per Watt of rated evaporative capacity [W/W]
+       \note Rated compressor power corresponds to the max compressor speed at rated conditions
+       \note The actual compressor power is obtained by multiplying the
+       \note rated power with the modification factor calculated by Compressor
+       \note Power Multiplier Function of Temperature Curve
+  N3 , \field Minimum Outdoor Air Temperature in Cooling Only Mode
+       \type real
+       \units C
+       \required-field
+       \note Enter the minimum outdoor temperature allowed for cooling operation
+       \note Cooling is disabled below this temperature
+  N4 , \field Maximum Outdoor Air Temperature in Cooling Only Mode
+       \type real
+       \units C
+       \required-field
+       \note Enter the maximum outdoor temperature allowed for cooling operation
+       \note Cooling is disabled above this temperature
+  N5 , \field Minimum Outdoor Air Temperature in Heating Only Mode
+       \type real
+       \units C
+       \required-field
+       \note Enter the minimum outdoor temperature allowed for heating operation
+       \note Heating is disabled below this temperature
+  N6 , \field Maximum Outdoor Air Temperature in Heating Only Mode
+       \type real
+       \units C
+       \required-field
+       \note Enter the maximum outdoor temperature allowed for heating operation
+       \note Heating is disabled below this temperature
+  N7 , \field Minimum Outdoor Temperature in Heat Recovery Mode
+       \type real
+       \units C
+       \required-field
+       \note The minimum outdoor temperature below which heat
+       \note recovery mode will not operate.
+  N8 , \field Maximum Outdoor Temperature in Heat Recovery Mode
+       \type real
+       \units C
+       \required-field
+       \note The maximum outdoor temperature above which heat
+       \note recovery mode will not operate.
+  A6 , \field Refrigerant Temperature Control Algorithm for Indoor Unit
+       \type choice
+       \key ConstantTemp
+       \key VariableTemp
+       \required-field
+  N9 , \field Reference Evaporating Temperature for Indoor Unit
+       \note This field is used if Refrigerant Temperature Control Algorithm
+       \note is ConstantTemp
+       \note Evaporating temperature is the refrigerant temperature, not air temperature
+       \type real
+       \units C
+       \required-field
+  N10, \field Reference Condensing Temperature for Indoor Unit
+       \note This field is used if Refrigerant Temperature Control Algorithm
+       \note is ConstantTemp
+       \note Condensing temperature is the refrigerant temperature, not air temperature
+       \type real
+       \units C
+       \required-field
+  N11, \field Variable Evaporating Temperature Minimum for Indoor Unit
+       \note This field is used if Refrigerant Temperature Control Algorithm
+       \note is VariableTemp
+       \note Evaporating temperature is the refrigerant temperature, not air temperature
+       \type real
+       \units C
+       \required-field
+  N12, \field Variable Evaporating Temperature Maximum for Indoor Unit
+       \note This field is used if Refrigerant Temperature Control Algorithm
+       \note is VariableTemp
+       \note Evaporating temperature is the refrigerant temperature, not air temperature
+       \type real
+       \units C
+       \required-field
+  N13, \field Variable Condensing Temperature Minimum for Indoor Unit
+       \note This field is used if Refrigerant Temperature Control Algorithm
+       \note is VariableTemp
+       \note Condensing temperature is the refrigerant temperature, not air temperature
+       \type real
+       \units C
+       \required-field
+  N14, \field Variable Condensing Temperature Maximum for Indoor Unit
+       \note This field is used if Refrigerant Temperature Control Algorithm
+       \note is VariableTemp
+       \note Condensing temperature is the refrigerant temperature, not air temperature
+       \type real
+       \units C
+       \required-field
+  N15, \field Outdoor Unit Evaporator Reference Superheating
+       \type real
+       \units deltaC
+       \required-field
+  N16, \field Outdoor Unit Condenser Reference Subcooling
+       \type real
+       \units deltaC
+       \required-field
+  N17, \field Outdoor Unit Evaporator Rated Bypass Factor
+       \type real
+       \units dimensionless
+       \minimum> 0
+       \required-field
+  N18, \field Outdoor Unit Condenser Rated Bypass Factor
+       \type real
+       \units dimensionless
+       \minimum> 0
+       \required-field
+  N19, \field Difference between Outdoor Unit Evaporating Temperature and Outdoor Air Temperature in Heat Recovery Mode
+       \type real
+       \units deltaC
+       \required-field
+  N20, \field Outdoor Unit Heat Exchanger Capacity Ratio
+       \note Enter the rated capacity ratio between the main and supplementary outdoor unit heat exchangers [W/W]
+       \type real
+       \units dimensionless
+       \minimum> 0
+       \required-field
+  N21, \field Outdoor Unit Fan Power Per Unit of Rated Evaporative Capacity
+       \note Enter the outdoor unit fan power per Watt of rated evaporative capacity [W/W]
+       \units dimensionless
+       \minimum> 0.0
+       \required-field
+       \type real
+  N22, \field Outdoor Unit Fan Flow Rate Per Unit of Rated Evaporative Capacity
+       \note Enter the outdoor unit fan flow rate per Watt of rated evaporative capacity [W/W]
+       \units m3/s-W
+       \minimum> 0.0
+       \required-field
+       \type real
+  A7 , \field Outdoor Unit Evaporating Temperature Function of Superheating Curve Name
+       \required-field
+       \type object-list
+       \object-list UnivariateFunctions
+  A8 , \field Outdoor Unit Condensing Temperature Function of Subcooling Curve Name
+       \required-field
+       \type object-list
+       \object-list UnivariateFunctions
+  N23, \field Diameter of Main Pipe for Suction Gas
+       \note used to calculate the piping loss
+       \type real
+       \units m
+       \minimum 0.0
+       \required-field
+  N24, \field Diameter of Main Pipe for Discharge Gas
+       \note used to calculate the piping loss
+       \type real
+       \units m
+       \minimum 0.0
+       \required-field
+  N25, \field Length of Main Pipe Connecting Outdoor Unit to the First Branch Joint
+       \note used to calculate the heat loss of the main pipe
+       \type real
+       \units m
+       \minimum 0.0
+       \required-field
+  N26, \field Equivalent Length of Main Pipe Connecting Outdoor Unit to the First Branch Joint
+       \note used to calculate the refrigerant pressure drop of the main pipe
+       \type real
+       \units m
+       \minimum 0.0
+       \required-field
+  N27, \field Height Difference Between Outdoor Unit and Indoor Units
+       \note Difference between outdoor unit height and indoor unit height
+       \note Positive means outdoor unit is higher than indoor unit
+       \note Negative means outdoor unit is lower than indoor unit
+       \type real
+       \units m
+       \required-field
+  N28, \field Main Pipe Insulation Thickness
+       \type real
+       \units m
+       \minimum 0.0
+       \required-field
+  N29, \field Main Pipe Insulation Thermal Conductivity
+       \type real
+       \units W/m-K
+       \minimum 0.0
+       \required-field
+  N30, \field Crankcase Heater Power per Compressor
+       \type real
+       \units W
+       \required-field
+       \note Enter the value of the resistive heater located in the compressor(s). This heater
+       \note is used to warm the refrigerant and oil when the compressor is off
+  N31, \field Number of Compressors
+       \type integer
+       \units dimensionless
+       \required-field
+       \note Enter the total number of compressor. This input is used only for crankcase
+       \note heater calculations.
+  N32, \field Ratio of Compressor Size to Total Compressor Capacity
+       \type real
+       \units W/W
+       \required-field
+       \note Enter the ratio of the first stage compressor to total compressor capacity
+       \note All other compressors are assumed to be equally sized. This inputs is used
+       \note only for crankcase heater calculations
+  N33, \field Maximum Outdoor Dry-Bulb Temperature for Crankcase Heater
+       \type real
+       \units C
+       \required-field
+       \note Enter the maximum outdoor temperature above which the crankcase heaters are disabled
+  A9 , \field Defrost Strategy
+       \type choice
+       \key ReverseCycle
+       \key Resistive
+       \required-field
+       \note Select a defrost strategy.
+       \note Reverse cycle reverses the operating mode from heating to
+       \note cooling to melt frost formation on the condenser coil
+       \note The resistive strategy uses a resistive heater
+       \note to melt the frost.
+  A10, \field Defrost Control
+       \type choice
+       \key Timed
+       \key OnDemand
+       \required-field
+       \note Choose a defrost control type
+       \note Either use a fixed Timed defrost period or select
+       \note OnDemand to defrost only when necessary
+  A11, \field Defrost Energy Input Ratio Modifier Function of Temperature Curve Name
+       \type object-list
+       \object-list BivariateFunctions
+       \note A valid performance curve must be used if ReverseCycle defrost strategy is selected
+  N34, \field Defrost Time Period Fraction
+       \type real
+       \minimum 0.0
+       \required-field
+       \note Fraction of time in defrost mode
+       \note Only applicable if timed defrost control is specified
+  N35, \field Resistive Defrost Heater Capacity
+       \type real
+       \minimum 0.0
+       \required-field
+       \autosizable
+       \units W
+       \note Enter the size of the resistive defrost heating element
+       \note Only applicable if resistive defrost strategy is specified
+       \ip-units W
+  N36, \field Maximum Outdoor Dry-bulb Temperature for Defrost Operation
+       \type real
+       \units C
+       \required-field
+       \note Enter the maximum outdoor temperature above which the defrost operation is disabled
+  N37, \field Initial Heat Recovery Cooling Capacity Fraction
+       \type real
+       \units W/W
+       \required-field
+       \note This is used to describe the transition from Cooling Only mode to Heat Recovery mode
+       \note Enter the fractional capacity available at the start
+       \note of heat recovery mode. The capacity exponentially approaches
+       \note the steady-state value according to the inputs for
+       \note Heat Recovery Cooling Capacity Modifier and Heat Recovery
+       \note Cooling Capacity Time Constant
+  N38, \field Heat Recovery Cooling Capacity Time Constant
+       \type real
+       \units hr
+       \required-field
+       \note This is used to describe the transition from Cooling Only mode to Heat Recovery mode
+       \note Enter the time constant used to model the transition
+       \note from cooling only mode to heat recovery mode
+  N39, \field Initial Heat Recovery Cooling Energy Fraction
+       \type real
+       \units W/W
+       \required-field
+       \note This is used to describe the transition from Cooling Only mode to Heat Recovery mode
+       \note Enter the fractional electric consumption rate at the start
+       \note of heat recovery mode. The electric consumption rate exponentially
+       \note approaches the steady-state value according to the inputs for
+       \note Heat Recovery Cooling Energy Modifier and Heat Recovery
+       \note Cooling Energy Time Constant
+  N40, \field Heat Recovery Cooling Energy Time Constant
+       \type real
+       \units hr
+       \required-field
+       \note This is used to describe the transition from Cooling Only mode to Heat Recovery mode
+       \note Enter the time constant used to model the transition
+       \note from cooling only mode to heat recovery mode
+  N41, \field Initial Heat Recovery Heating Capacity Fraction
+       \type real
+       \units W/W
+       \required-field
+       \note This is used to describe the transition from Heating Only mode to Heat Recovery mode
+       \note Enter the fractional capacity available at the start
+       \note of heat recovery mode. The capacity exponentially approaches
+       \note the steady-state value according to the inputs for
+       \note Heat Recovery Heating Capacity Modifier and Heat Recovery
+       \note Heating Capacity Time Constant
+  N42, \field Heat Recovery Heating Capacity Time Constant
+       \type real
+       \units hr
+       \required-field
+       \note This is used to describe the transition from Heating Only mode to Heat Recovery mode
+       \note Enter the time constant used to model the transition
+       \note from cooling only mode to heat recovery mode
+  N43, \field Initial Heat Recovery Heating Energy Fraction
+       \type real
+       \units W/W
+       \required-field
+       \note This is used to describe the transition from Heating Only mode to Heat Recovery mode
+       \note Enter the fractional electric consumption rate at the start
+       \note of heat recovery mode. The electric consumption rate exponentially
+       \note approaches the steady-state value according to the inputs for
+       \note Heat Recovery Cooling Energy Modifier and Heat Recovery
+       \note Cooling Energy Time Constant
+  N44, \field Heat Recovery Heating Energy Time Constant
+       \type real
+       \units hr
+       \required-field
+       \note This is used to describe the transition from Heating Only mode to Heat Recovery mode
+       \note Enter the time constant used to model the transition
+       \note from cooling only mode to heat recovery mode
+  N45, \field Compressor Maximum Delta Pressure
+       \type real
+       \units Pa
+       \required-field
+       \minimum 0.0
+       \maximum 50000000.0
+  N46, \field Compressor Inverter Efficiency
+       \type real
+       \units dimensionless
+       \minimum> 0
+       \maximum 1.0
+       \required-field
+       \note Efficiency of the compressor inverter
+  N47, \field Compressor Evaporative Capacity Correction Factor
+       \type real
+       \units dimensionless
+       \minimum> 0
+       \required-field
+       \note Describe the evaporative capacity difference because of system configuration
+       \note difference between test bed and real system.
+  A12; \field Loading Index List
+       \type object-list
+       \object-list ModelObjectLists
+
 OS:AirLoopHVAC,
        \memo Defines a central forced air system
        \min-fields 13
@@ -17555,6 +18238,58 @@ OS:Coil:Cooling:DX:VariableRefrigerantFlow,
        \type object-list
        \object-list ConnectionNames
 
+OS:Coil:Cooling:DX:VariableRefrigerantFlow:FluidTemperatureControl,
+       \memo This is a key object in the new physics based VRF model applicable for Fluid
+       \memo Temperature Control. It describes the the indoor unit coil of the system at cooling mode.
+       \memo Used with ZoneHVAC:TerminalUnit:VariableRefrigerantFlow.
+       \memo Outdoor unit is modeled separately, see AirConditioner:VariableRefrigerantFlow:FluidTemperatureControl
+       \memo or AirConditioner:VariableRefrigerantFlow:FluidTemperatureControl:HR
+  A1,  \field Handle
+       \type handle
+       \required-field
+  A2,  \field Name
+       \required-field
+       \type alpha
+       \reference CoolingCoilsDXVarRefrigFlowFluidTemperatureControl
+       \reference ConnectionObject
+  A3,  \field Availability Schedule
+       \type object-list
+       \object-list ScheduleNames
+       \required-field
+       \note Enter the name of a schedule that defines the availability of the coil
+       \note Schedule values of 0 denote the unit is off. All other values denote the unit is available
+       \note If this field is left blank, the unit is available the entire simulation
+  A4,  \field Coil Air Inlet Node
+       \type object-list
+       \object-list ConnectionNames
+       \note the inlet node to the coil
+  A5,  \field Coil Air Outlet Node
+       \type object-list
+       \object-list ConnectionNames
+       \note the outlet node to the coil
+  N1,  \field Rated Total Cooling Capacity
+       \required-field
+       \autosizable
+       \type real
+       \units W
+       \minimum> 0.0
+       \note Supply air fan heat is not included
+  N2,  \field Rated Sensible Heat Ratio
+       \required-field
+       \autosizable
+       \type real
+       \minimum> 0.0
+       \note Supply air fan heat is not included
+  N3,  \field Indoor Unit Reference Superheating
+       \type real
+       \units deltaC
+       \minimum 0.0
+       \required-field
+  A6;  \field Indoor Unit Evaporating Temperature Function of Superheating Curve
+       \required-field
+       \type object-list
+       \object-list UnivariateFunctions
+
 OS:Coil:Cooling:LowTemperatureRadiant:ConstantFlow,
         \min-fields 10
    A1 , \field Handle
@@ -18087,6 +18822,53 @@ OS:Coil:Heating:DX:VariableRefrigerantFlow,
        \note cubic curve = a + b*ff + c*ff**2 + d*ff**3
        \note ff = fraction of the full load flow
 
+OS:Coil:Heating:DX:VariableRefrigerantFlow:FluidTemperatureControl,
+       \memo This is a key object in the new physics based VRF model applicable for Fluid
+       \memo Temperature Control. It describes the the indoor unit coil of the system at heating mode.
+       \memo Used with ZoneHVAC:TerminalUnit:VariableRefrigerantFlow.
+       \memo Outdoor unit is modeled separately, see AirConditioner:VariableRefrigerantFlow:FluidTemperatureControl
+       \memo or AirConditioner:VariableRefrigerantFlow:FluidTemperatureControl:HR
+  A1,  \field Handle
+       \type handle
+       \required-field
+  A2,  \field Name
+       \required-field
+       \type alpha
+       \reference HeatingCoilsDXVarRefrigFlowFluidTemperatureControl
+       \reference ConnectionObject
+  A3,  \field Availability Schedule
+       \type object-list
+       \object-list ScheduleNames
+       \required-field
+       \note Enter the name of a schedule that defines the availability of the coil
+       \note Schedule values of 0 denote the unit is off. All other values denote the unit is available
+       \note If this field is left blank, the unit is available the entire simulation
+  A4,  \field Coil Air Inlet Node
+       \type object-list
+       \object-list ConnectionNames
+       \note the inlet node to the coil
+  A5,  \field Coil Air Outlet Node
+       \type object-list
+       \object-list ConnectionNames
+       \note the outlet node to the coil
+  N1,  \field Rated Total Heating Capacity
+       \required-field
+       \autosizable
+       \type real
+       \units W
+       \minimum> 0.0
+       \autosizable
+       \note Supply air fan heat is not included
+  N2,  \field Indoor Unit Reference Subcooling
+       \type real
+       \units deltaC
+       \minimum 0.0
+       \required-field
+  A6;  \field Indoor Unit Condensing Temperature Function of Subcooling Curve
+       \required-field
+       \type object-list
+       \object-list UnivariateFunctions
+
 OS:Coil:Heating:Electric,
        \min-fields 1
   A1, \field Handle
@@ -27793,11 +28575,13 @@ OS:ZoneHVAC:TerminalUnit:VariableRefrigerantFlow,
   A10,  \field Cooling Coil
         \type object-list
         \object-list CoolingCoilsDXVarRefrigFlow
+        \object-list CoolingCoilsDXVarRefrigFlowFluidTemperatureControl
         \note Cooling Coil Type must be Coil:Cooling:DX:VariableRefrigerantFlow
         \note This field may be left blank if heating-only mode is used
   A11,  \field Heating Coil
         \type object-list
         \object-list HeatingCoilsDXVarRefrigFlow
+        \object-list HeatingCoilsDXVarRefrigFlowFluidTemperatureControl
         \note Heating Coil Type must be Coil:Heating:DX:VariableRefrigerantFlow
         \note This field may be left blank if cooling-only mode is used
   N8 ,  \field Zone Terminal Unit On Parasitic Electric Energy Use
diff --git a/src/energyplus/CMakeLists.txt b/src/energyplus/CMakeLists.txt
index 3e2f4518967..d76e1eafadd 100644
--- a/src/energyplus/CMakeLists.txt
+++ b/src/energyplus/CMakeLists.txt
@@ -13,6 +13,8 @@ set(${target_name}_src
   ForwardTranslator.hpp
   ForwardTranslator.cpp
   ForwardTranslator/ForwardTranslateAirConditionerVariableRefrigerantFlow.cpp
+  ForwardTranslator/ForwardTranslateAirConditionerVariableRefrigerantFlowFluidTemperatureControl.cpp
+  ForwardTranslator/ForwardTranslateAirConditionerVariableRefrigerantFlowFluidTemperatureControlHR.cpp
   ForwardTranslator/ForwardTranslateAirflowNetwork.cpp
   ForwardTranslator/ForwardTranslateAirGap.cpp
   ForwardTranslator/ForwardTranslateAirLoopHVAC.cpp
@@ -75,6 +77,7 @@ set(${target_name}_src
   ForwardTranslator/ForwardTranslateCoilCoolingDXTwoSpeed.cpp
   ForwardTranslator/ForwardTranslateCoilCoolingDXTwoStageWithHumidityControlMode.cpp
   ForwardTranslator/ForwardTranslateCoilCoolingDXVariableRefrigerantFlow.cpp
+  ForwardTranslator/ForwardTranslateCoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl.cpp
   ForwardTranslator/ForwardTranslateCoilCoolingDXVariableSpeed.cpp
   ForwardTranslator/ForwardTranslateCoilCoolingWater.cpp
   ForwardTranslator/ForwardTranslateCoilCoolingWaterToAirHeatPumpEquationFit.cpp
@@ -83,6 +86,7 @@ set(${target_name}_src
   ForwardTranslator/ForwardTranslateCoilHeatingDXMultiSpeed.cpp
   ForwardTranslator/ForwardTranslateCoilHeatingDXSingleSpeed.cpp
   ForwardTranslator/ForwardTranslateCoilHeatingDXVariableRefrigerantFlow.cpp
+  ForwardTranslator/ForwardTranslateCoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl.cpp
   ForwardTranslator/ForwardTranslateCoilHeatingDXVariableSpeed.cpp
   ForwardTranslator/ForwardTranslateCoilHeatingElectric.cpp
   ForwardTranslator/ForwardTranslateCoilHeatingElectricMultiStage.cpp
@@ -637,6 +641,8 @@ set(${target_name}_test_src
   Test/ReverseTranslator_GTest.cpp
 
   Test/AirConditionerVariableRefrigerantFlow_GTest.cpp
+  Test/AirConditionerVariableRefrigerantFlowFluidTemperatureControl_GTest.cpp
+  Test/AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_GTest.cpp
   Test/AirflowNetwork_GTest.cpp
 
   Test/AirLoopHVACUnitarySystem_GTest.cpp
diff --git a/src/energyplus/ForwardTranslator.cpp b/src/energyplus/ForwardTranslator.cpp
index 28141e63f97..9297c34703c 100644
--- a/src/energyplus/ForwardTranslator.cpp
+++ b/src/energyplus/ForwardTranslator.cpp
@@ -594,6 +594,22 @@ namespace energyplus {
       translateAndMapModelObject(vrf);
     }
 
+    // get AirConditionerVariableRefrigerantFlowFluidTemperatureControl objects in sorted order
+    std::vector<AirConditionerVariableRefrigerantFlowFluidTemperatureControl> vrfftcs =
+      model.getConcreteModelObjects<AirConditionerVariableRefrigerantFlowFluidTemperatureControl>();
+    std::sort(vrfftcs.begin(), vrfftcs.end(), WorkspaceObjectNameLess());
+    for (auto& vrfftc : vrfftcs) {
+      translateAndMapModelObject(vrfftc);
+    }
+
+    // get AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR objects in sorted order
+    std::vector<AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR> vrfftchrs =
+      model.getConcreteModelObjects<AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR>();
+    std::sort(vrfftchrs.begin(), vrfftchrs.end(), WorkspaceObjectNameLess());
+    for (auto& vrfftchr : vrfftchrs) {
+      translateAndMapModelObject(vrfftchr);
+    }
+
     // get plant loops in sorted order
     std::vector<PlantLoop> plantLoops = model.getConcreteModelObjects<PlantLoop>();
     std::sort(plantLoops.begin(), plantLoops.end(), WorkspaceObjectNameLess());
@@ -688,6 +704,18 @@ namespace energyplus {
         retVal = translateAirConditionerVariableRefrigerantFlow(vrf);
         break;
       }
+      case openstudio::IddObjectType::OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl: {
+        model::AirConditionerVariableRefrigerantFlowFluidTemperatureControl vrf =
+          modelObject.cast<AirConditionerVariableRefrigerantFlowFluidTemperatureControl>();
+        retVal = translateAirConditionerVariableRefrigerantFlowFluidTemperatureControl(vrf);
+        break;
+      }
+      case openstudio::IddObjectType::OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HR: {
+        model::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR vrf =
+          modelObject.cast<AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR>();
+        retVal = translateAirConditionerVariableRefrigerantFlowFluidTemperatureControlHR(vrf);
+        break;
+      }
       case openstudio::IddObjectType::OS_AirLoopHVAC: {
         model::AirLoopHVAC airLoopHVAC = modelObject.cast<AirLoopHVAC>();
         retVal = translateAirLoopHVAC(airLoopHVAC);
@@ -1032,6 +1060,12 @@ namespace energyplus {
         retVal = translateCoilCoolingDXVariableRefrigerantFlow(coil);
         break;
       }
+      case openstudio::IddObjectType::OS_Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControl: {
+        model::CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl coil =
+          modelObject.cast<CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl>();
+        retVal = translateCoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl(coil);
+        break;
+      }
       case openstudio::IddObjectType::OS_Coil_Cooling_DX_VariableSpeed: {
         model::CoilCoolingDXVariableSpeed coil = modelObject.cast<CoilCoolingDXVariableSpeed>();
         if (this->isHVACComponentWithinUnitary(coil)) {
@@ -1058,6 +1092,10 @@ namespace energyplus {
         retVal = translateCoilCoolingWater(coil);
         break;
       }
+      case openstudio::IddObjectType::OS_Coil_Cooling_Water_Panel_Radiant: {
+        // no-op
+        return retVal;
+      }
       case openstudio::IddObjectType::OS_Coil_Cooling_WaterToAirHeatPump_EquationFit: {
         model::CoilCoolingWaterToAirHeatPumpEquationFit coil = modelObject.cast<CoilCoolingWaterToAirHeatPumpEquationFit>();
         retVal = translateCoilCoolingWaterToAirHeatPumpEquationFit(coil);
@@ -1148,6 +1186,12 @@ namespace energyplus {
         retVal = translateCoilHeatingDXVariableRefrigerantFlow(coil);
         break;
       }
+      case openstudio::IddObjectType::OS_Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControl: {
+        model::CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl coil =
+          modelObject.cast<CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl>();
+        retVal = translateCoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl(coil);
+        break;
+      }
       case openstudio::IddObjectType::OS_Coil_Heating_Water: {
         model::CoilHeatingWater coil = modelObject.cast<CoilHeatingWater>();
         retVal = translateCoilHeatingWater(coil);
diff --git a/src/energyplus/ForwardTranslator.hpp b/src/energyplus/ForwardTranslator.hpp
index da16ac25651..87959cbed82 100644
--- a/src/energyplus/ForwardTranslator.hpp
+++ b/src/energyplus/ForwardTranslator.hpp
@@ -52,6 +52,8 @@ class Transformation;
 namespace model {
 
   class AirConditionerVariableRefrigerantFlow;
+  class AirConditionerVariableRefrigerantFlowFluidTemperatureControl;
+  class AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR;
   class AirflowNetworkSimulationControl;
   class AirflowNetworkZone;
   class AirflowNetworkSurface;
@@ -135,6 +137,7 @@ namespace model {
   class CoilCoolingDXTwoSpeed;
   class CoilCoolingDXTwoStageWithHumidityControlMode;
   class CoilCoolingDXVariableRefrigerantFlow;
+  class CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl;
   class CoilCoolingDXVariableSpeed;
   class CoilCoolingWater;
   class CoilCoolingWaterToAirHeatPumpEquationFit;
@@ -143,6 +146,7 @@ namespace model {
   class CoilHeatingDXMultiSpeed;
   class CoilHeatingDXSingleSpeed;
   class CoilHeatingDXVariableRefrigerantFlow;
+  class CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl;
   class CoilHeatingDXVariableSpeed;
   class CoilHeatingElectric;
   class CoilHeatingElectricMultiStage;
@@ -606,6 +610,12 @@ namespace energyplus {
 
     boost::optional<IdfObject> translateAirConditionerVariableRefrigerantFlow(model::AirConditionerVariableRefrigerantFlow& modelObject);
 
+    boost::optional<IdfObject> translateAirConditionerVariableRefrigerantFlowFluidTemperatureControl(
+      model::AirConditionerVariableRefrigerantFlowFluidTemperatureControl& modelObject);
+
+    boost::optional<IdfObject> translateAirConditionerVariableRefrigerantFlowFluidTemperatureControlHR(
+      model::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR& modelObject);
+
     boost::optional<IdfObject> translateAirflowNetworkSimulationControl(model::AirflowNetworkSimulationControl& modelObject);
 
     boost::optional<IdfObject> translateAirflowNetworkZone(model::AirflowNetworkZone& modelObject);
@@ -787,6 +797,9 @@ namespace energyplus {
 
     boost::optional<IdfObject> translateCoilCoolingDXVariableRefrigerantFlow(model::CoilCoolingDXVariableRefrigerantFlow& modelObject);
 
+    boost::optional<IdfObject> translateCoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl(
+      model::CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl& modelObject);
+
     boost::optional<IdfObject> translateCoilCoolingDXVariableSpeed(model::CoilCoolingDXVariableSpeed& modelObject);
 
     boost::optional<IdfObject> translateCoilCoolingDXVariableSpeedWithoutUnitary(model::CoilCoolingDXVariableSpeed& modelObject);
@@ -808,6 +821,9 @@ namespace energyplus {
 
     boost::optional<IdfObject> translateCoilHeatingDXVariableRefrigerantFlow(model::CoilHeatingDXVariableRefrigerantFlow& modelObject);
 
+    boost::optional<IdfObject> translateCoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl(
+      model::CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl& modelObject);
+
     boost::optional<IdfObject> translateCoilHeatingDXVariableSpeed(model::CoilHeatingDXVariableSpeed& modelObject);
 
     boost::optional<IdfObject> translateCoilHeatingDXVariableSpeedWithoutUnitary(model::CoilHeatingDXVariableSpeed& modelObject);
diff --git a/src/energyplus/ForwardTranslator/ForwardTranslateAirConditionerVariableRefrigerantFlow.cpp b/src/energyplus/ForwardTranslator/ForwardTranslateAirConditionerVariableRefrigerantFlow.cpp
index 824d1007aa0..16c7941cafc 100644
--- a/src/energyplus/ForwardTranslator/ForwardTranslateAirConditionerVariableRefrigerantFlow.cpp
+++ b/src/energyplus/ForwardTranslator/ForwardTranslateAirConditionerVariableRefrigerantFlow.cpp
@@ -63,17 +63,15 @@ namespace energyplus {
     boost::optional<std::string> s;
     boost::optional<double> value;
 
-    IdfObject idfObject(IddObjectType::AirConditioner_VariableRefrigerantFlow);
-
-    m_idfObjects.push_back(idfObject);
-
-    // Name
-
-    s = modelObject.name();
-    if (s) {
-      idfObject.setString(AirConditioner_VariableRefrigerantFlowFields::HeatPumpName, *s);
+    std::vector<ZoneHVACTerminalUnitVariableRefrigerantFlow> terminals = modelObject.terminals();
+    if (terminals.empty()) {
+      LOG(Warn, modelObject.briefDescription() << " will not be translated as it has no terminals.");
+      return boost::none;
     }
 
+    // Heat Pump Name
+    IdfObject idfObject = createRegisterAndNameIdfObject(openstudio::IddObjectType::AirConditioner_VariableRefrigerantFlow, modelObject);
+
     // AvailabilityScheduleName
 
     if (boost::optional<model::Schedule> schedule = modelObject.availabilitySchedule()) {
@@ -672,8 +670,6 @@ namespace energyplus {
 
     m_idfObjects.push_back(_zoneTerminalUnitList);
 
-    std::vector<ZoneHVACTerminalUnitVariableRefrigerantFlow> terminals = modelObject.terminals();
-
     for (auto& terminal : terminals) {
       boost::optional<IdfObject> _terminal = translateAndMapModelObject(terminal);
 
diff --git a/src/energyplus/ForwardTranslator/ForwardTranslateAirConditionerVariableRefrigerantFlowFluidTemperatureControl.cpp b/src/energyplus/ForwardTranslator/ForwardTranslateAirConditionerVariableRefrigerantFlowFluidTemperatureControl.cpp
new file mode 100644
index 00000000000..ab1396b7b93
--- /dev/null
+++ b/src/energyplus/ForwardTranslator/ForwardTranslateAirConditionerVariableRefrigerantFlowFluidTemperatureControl.cpp
@@ -0,0 +1,359 @@
+/***********************************************************************************************************************
+*  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/AirConditionerVariableRefrigerantFlowFluidTemperatureControl.hpp"
+#include "../../model/AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl.hpp"
+#include "../../model/LoadingIndex.hpp"
+#include "../../model/LoadingIndex_Impl.hpp"
+
+#include "../../model/Schedule.hpp"
+#include "../../model/Schedule_Impl.hpp"
+#include "../../model/Node.hpp"
+#include "../../model/Node_Impl.hpp"
+#include "../../model/PlantLoop.hpp"
+#include "../../model/PlantLoop_Impl.hpp"
+#include "../../model/ThermalZone.hpp"
+#include "../../model/ThermalZone_Impl.hpp"
+#include "../../model/ZoneHVACTerminalUnitVariableRefrigerantFlow.hpp"
+#include "../../model/ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl.hpp"
+#include "../../model/Curve.hpp"
+#include "../../model/Curve_Impl.hpp"
+
+#include "../../utilities/core/Logger.hpp"
+#include "../../utilities/core/Assert.hpp"
+#include "../../utilities/idd/IddEnums.hpp"
+#include "../../utilities/idf/IdfExtensibleGroup.hpp"
+
+#include <utilities/idd/AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_FieldEnums.hxx>
+#include <utilities/idd/ZoneTerminalUnitList_FieldEnums.hxx>
+#include <utilities/idd/IddEnums.hxx>
+#include <utilities/idd/FluidProperties_Name_FieldEnums.hxx>
+
+using namespace openstudio::model;
+
+namespace openstudio {
+
+namespace energyplus {
+
+  boost::optional<IdfObject> ForwardTranslator::translateAirConditionerVariableRefrigerantFlowFluidTemperatureControl(
+    model::AirConditionerVariableRefrigerantFlowFluidTemperatureControl& modelObject) {
+
+    // Terminals
+    std::vector<ZoneHVACTerminalUnitVariableRefrigerantFlow> terminals = modelObject.terminals();
+    if (terminals.empty()) {
+      LOG(Warn, modelObject.briefDescription() << " will not be translated as it has no terminals.");
+      return boost::none;
+    }
+
+    // Name
+    IdfObject idfObject =
+      createRegisterAndNameIdfObject(openstudio::IddObjectType::AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl, modelObject);
+
+    // Availability Schedule Name: Optional Object, required in Model
+    {
+      auto sch = modelObject.availabilitySchedule();
+      if (boost::optional<IdfObject> owo_ = translateAndMapModelObject(sch)) {
+        idfObject.setString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::AvailabilityScheduleName, owo_->nameString());
+      }
+    }
+
+    // Refrigerant Type: Optional Object
+    boost::optional<IdfObject> fluidProperties = createFluidProperties(modelObject.refrigerantType());
+    if (fluidProperties) {
+      boost::optional<std::string> value = fluidProperties.get().getString(FluidProperties_NameFields::FluidName, true);
+      if (value) {
+        idfObject.setString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::RefrigerantType, value.get());
+      }
+    }
+
+    if (modelObject.isRatedEvaporativeCapacityAutosized()) {
+      idfObject.setString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::RatedEvaporativeCapacity, "Autosize");
+    } else {
+      // Rated Evaporative Capacity: boost::optional<double>
+      if (boost::optional<double> _ratedEvaporativeCapacity = modelObject.ratedEvaporativeCapacity()) {
+        idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::RatedEvaporativeCapacity,
+                            _ratedEvaporativeCapacity.get());
+      }
+    }
+
+    // Rated Compressor Power Per Unit of Rated Evaporative Capacity: Optional Double
+    double ratedCompressorPowerPerUnitofRatedEvaporativeCapacity = modelObject.ratedCompressorPowerPerUnitofRatedEvaporativeCapacity();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::RatedCompressorPowerPerUnitofRatedEvaporativeCapacity,
+                        ratedCompressorPowerPerUnitofRatedEvaporativeCapacity);
+
+    // Minimum Outdoor Air Temperature in Cooling Mode: Optional Double
+    double minimumOutdoorAirTemperatureinCoolingMode = modelObject.minimumOutdoorAirTemperatureinCoolingMode();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::MinimumOutdoorAirTemperatureinCoolingMode,
+                        minimumOutdoorAirTemperatureinCoolingMode);
+
+    // Maximum Outdoor Air Temperature in Cooling Mode: Optional Double
+    double maximumOutdoorAirTemperatureinCoolingMode = modelObject.maximumOutdoorAirTemperatureinCoolingMode();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::MaximumOutdoorAirTemperatureinCoolingMode,
+                        maximumOutdoorAirTemperatureinCoolingMode);
+
+    // Minimum Outdoor Air Temperature in Heating Mode: Optional Double
+    double minimumOutdoorAirTemperatureinHeatingMode = modelObject.minimumOutdoorAirTemperatureinHeatingMode();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::MinimumOutdoorAirTemperatureinHeatingMode,
+                        minimumOutdoorAirTemperatureinHeatingMode);
+
+    // Maximum Outdoor Air Temperature in Heating Mode: Optional Double
+    double maximumOutdoorAirTemperatureinHeatingMode = modelObject.maximumOutdoorAirTemperatureinHeatingMode();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::MaximumOutdoorAirTemperatureinHeatingMode,
+                        maximumOutdoorAirTemperatureinHeatingMode);
+
+    // Reference Outdoor Unit Superheating: Optional Double
+    double referenceOutdoorUnitSuperheating = modelObject.referenceOutdoorUnitSuperheating();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::ReferenceOutdoorUnitSuperheating,
+                        referenceOutdoorUnitSuperheating);
+
+    // Reference Outdoor Unit Subcooling: Optional Double
+    double referenceOutdoorUnitSubcooling = modelObject.referenceOutdoorUnitSubcooling();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::ReferenceOutdoorUnitSubcooling,
+                        referenceOutdoorUnitSubcooling);
+
+    // Refrigerant Temperature Control Algorithm for Indoor Unit: Optional String
+    std::string refrigerantTemperatureControlAlgorithmforIndoorUnit = modelObject.refrigerantTemperatureControlAlgorithmforIndoorUnit();
+    idfObject.setString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::RefrigerantTemperatureControlAlgorithmforIndoorUnit,
+                        refrigerantTemperatureControlAlgorithmforIndoorUnit);
+
+    // Reference Evaporating Temperature for Indoor Unit: Optional Double
+    double referenceEvaporatingTemperatureforIndoorUnit = modelObject.referenceEvaporatingTemperatureforIndoorUnit();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::ReferenceEvaporatingTemperatureforIndoorUnit,
+                        referenceEvaporatingTemperatureforIndoorUnit);
+
+    // Reference Condensing Temperature for Indoor Unit: Optional Double
+    double referenceCondensingTemperatureforIndoorUnit = modelObject.referenceCondensingTemperatureforIndoorUnit();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::ReferenceCondensingTemperatureforIndoorUnit,
+                        referenceCondensingTemperatureforIndoorUnit);
+
+    // Variable Evaporating Temperature Minimum for Indoor Unit: Optional Double
+    double variableEvaporatingTemperatureMinimumforIndoorUnit = modelObject.variableEvaporatingTemperatureMinimumforIndoorUnit();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::VariableEvaporatingTemperatureMinimumforIndoorUnit,
+                        variableEvaporatingTemperatureMinimumforIndoorUnit);
+
+    // Variable Evaporating Temperature Maximum for Indoor Unit: Optional Double
+    double variableEvaporatingTemperatureMaximumforIndoorUnit = modelObject.variableEvaporatingTemperatureMaximumforIndoorUnit();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::VariableEvaporatingTemperatureMaximumforIndoorUnit,
+                        variableEvaporatingTemperatureMaximumforIndoorUnit);
+
+    // Variable Condensing Temperature Minimum for Indoor Unit: Optional Double
+    double variableCondensingTemperatureMinimumforIndoorUnit = modelObject.variableCondensingTemperatureMinimumforIndoorUnit();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::VariableCondensingTemperatureMinimumforIndoorUnit,
+                        variableCondensingTemperatureMinimumforIndoorUnit);
+
+    // Variable Condensing Temperature Maximum for Indoor Unit: Optional Double
+    double variableCondensingTemperatureMaximumforIndoorUnit = modelObject.variableCondensingTemperatureMaximumforIndoorUnit();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::VariableCondensingTemperatureMaximumforIndoorUnit,
+                        variableCondensingTemperatureMaximumforIndoorUnit);
+
+    // Outdoor Unit Fan Power Per Unit of Rated Evaporative Capacity: Optional Double
+    double outdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity = modelObject.outdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::OutdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity,
+                        outdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity);
+
+    // Outdoor Unit Fan Flow Rate Per Unit of Rated Evaporative Capacity: Optional Double
+    double outdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity = modelObject.outdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::OutdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity,
+                        outdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity);
+
+    // Outdoor Unit Evaporating Temperature Function of Superheating Curve Name: Required Object
+    Curve outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve = modelObject.outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve();
+    if (boost::optional<IdfObject> owo_ = translateAndMapModelObject(outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve)) {
+      idfObject.setString(
+        AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::OutdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurveName,
+        owo_->nameString());
+    }
+
+    // Outdoor Unit Condensing Temperature Function of Subcooling Curve Name: Required Object
+    Curve outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve = modelObject.outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve();
+    if (boost::optional<IdfObject> owo_ = translateAndMapModelObject(outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve)) {
+      idfObject.setString(
+        AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::OutdoorUnitCondensingTemperatureFunctionofSubcoolingCurveName,
+        owo_->nameString());
+    }
+
+    // Diameter of Main Pipe Connecting Outdoor Unit to the First Branch Joint: Optional Double
+    double diameterofMainPipeConnectingOutdoorUnittotheFirstBranchJoint = modelObject.diameterofMainPipeConnectingOutdoorUnittotheFirstBranchJoint();
+    idfObject.setDouble(
+      AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::DiameterofMainPipeConnectingOutdoorUnittotheFirstBranchJoint,
+      diameterofMainPipeConnectingOutdoorUnittotheFirstBranchJoint);
+
+    // Length of Main Pipe Connecting Outdoor Unit to the First Branch Joint: Optional Double
+    double lengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint = modelObject.lengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint();
+    idfObject.setDouble(
+      AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::LengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint,
+      lengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint);
+
+    // Equivalent Length of Main Pipe Connecting Outdoor Unit to the First Branch Joint: Optional Double
+    double equivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint =
+      modelObject.equivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint();
+    idfObject.setDouble(
+      AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::EquivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint,
+      equivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint);
+
+    // Height Difference Between Outdoor Unit and Indoor Units: Optional Double
+    double heightDifferenceBetweenOutdoorUnitandIndoorUnits = modelObject.heightDifferenceBetweenOutdoorUnitandIndoorUnits();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::HeightDifferenceBetweenOutdoorUnitandIndoorUnits,
+                        heightDifferenceBetweenOutdoorUnitandIndoorUnits);
+
+    // Main Pipe Insulation Thickness: Optional Double
+    double mainPipeInsulationThickness = modelObject.mainPipeInsulationThickness();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::MainPipeInsulationThickness,
+                        mainPipeInsulationThickness);
+
+    // Main Pipe Insulation Thermal Conductivity: Optional Double
+    double mainPipeInsulationThermalConductivity = modelObject.mainPipeInsulationThermalConductivity();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::MainPipeInsulationThermalConductivity,
+                        mainPipeInsulationThermalConductivity);
+
+    // Crankcase Heater Power per Compressor: Optional Double
+    double crankcaseHeaterPowerperCompressor = modelObject.crankcaseHeaterPowerperCompressor();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::CrankcaseHeaterPowerperCompressor,
+                        crankcaseHeaterPowerperCompressor);
+
+    // Number of Compressors: Optional Integer
+    int numberofCompressors = modelObject.numberofCompressors();
+    idfObject.setInt(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::NumberofCompressors, numberofCompressors);
+
+    // Ratio of Compressor Size to Total Compressor Capacity: Optional Double
+    double ratioofCompressorSizetoTotalCompressorCapacity = modelObject.ratioofCompressorSizetoTotalCompressorCapacity();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::RatioofCompressorSizetoTotalCompressorCapacity,
+                        ratioofCompressorSizetoTotalCompressorCapacity);
+
+    // Maximum Outdoor Dry-Bulb Temperature for Crankcase Heater: Optional Double
+    double maximumOutdoorDryBulbTemperatureforCrankcaseHeater = modelObject.maximumOutdoorDryBulbTemperatureforCrankcaseHeater();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::MaximumOutdoorDryBulbTemperatureforCrankcaseHeater,
+                        maximumOutdoorDryBulbTemperatureforCrankcaseHeater);
+
+    // Defrost Strategy: Optional String
+    std::string defrostStrategy = modelObject.defrostStrategy();
+    idfObject.setString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::DefrostStrategy, defrostStrategy);
+
+    // Defrost Control: Optional String
+    std::string defrostControl = modelObject.defrostControl();
+    idfObject.setString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::DefrostControl, defrostControl);
+
+    // Defrost Energy Input Ratio Modifier Function of Temperature Curve Name: Optional Object
+    if (boost::optional<Curve> _defrostEnergyInputRatioModifierFunctionofTemperatureCurve =
+          modelObject.defrostEnergyInputRatioModifierFunctionofTemperatureCurve()) {
+      if (boost::optional<IdfObject> owo_ = translateAndMapModelObject(_defrostEnergyInputRatioModifierFunctionofTemperatureCurve.get())) {
+        idfObject.setString(
+          AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::DefrostEnergyInputRatioModifierFunctionofTemperatureCurveName,
+          owo_->nameString());
+      }
+    }
+
+    // Defrost Time Period Fraction: Optional Double
+    double defrostTimePeriodFraction = modelObject.defrostTimePeriodFraction();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::DefrostTimePeriodFraction, defrostTimePeriodFraction);
+
+    if (modelObject.isResistiveDefrostHeaterCapacityAutosized()) {
+      idfObject.setString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::ResistiveDefrostHeaterCapacity, "Autosize");
+    } else {
+      // Resistive Defrost Heater Capacity: boost::optional<double>
+      if (boost::optional<double> _resistiveDefrostHeaterCapacity = modelObject.resistiveDefrostHeaterCapacity()) {
+        idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::ResistiveDefrostHeaterCapacity,
+                            _resistiveDefrostHeaterCapacity.get());
+      }
+    }
+
+    // Maximum Outdoor Dry-bulb Temperature for Defrost Operation: Optional Double
+    double maximumOutdoorDrybulbTemperatureforDefrostOperation = modelObject.maximumOutdoorDrybulbTemperatureforDefrostOperation();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::MaximumOutdoorDrybulbTemperatureforDefrostOperation,
+                        maximumOutdoorDrybulbTemperatureforDefrostOperation);
+
+    // Compressor Maximum Delta Pressure: Optional Double
+    double compressorMaximumDeltaPressure = modelObject.compressorMaximumDeltaPressure();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::CompressormaximumdeltaPressure,
+                        compressorMaximumDeltaPressure);
+
+    // Number of Compressor Loading Index Entries: Optional Integer
+    std::vector<LoadingIndex> loadingIndexes = modelObject.loadingIndexes();
+    if (auto num = loadingIndexes.size()) {
+      idfObject.setInt(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::NumberofCompressorLoadingIndexEntries, num);
+    }
+
+    // Zone Terminal Unit List Name
+    IdfObject _zoneTerminalUnitList(IddObjectType::ZoneTerminalUnitList);
+
+    std::string terminalUnitListName = modelObject.name().get() + " Terminal List";
+
+    _zoneTerminalUnitList.setString(ZoneTerminalUnitListFields::ZoneTerminalUnitListName, terminalUnitListName);
+
+    idfObject.setString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::ZoneTerminalUnitListName, terminalUnitListName);
+
+    m_idfObjects.push_back(_zoneTerminalUnitList);
+
+    for (auto& terminal : terminals) {
+      boost::optional<IdfObject> terminal_ = translateAndMapModelObject(terminal);
+
+      OS_ASSERT(terminal_);
+
+      IdfExtensibleGroup eg = _zoneTerminalUnitList.pushExtensibleGroup();
+
+      eg.setString(ZoneTerminalUnitListExtensibleFields::ZoneTerminalUnitName, terminal_->name().get());
+    }
+
+    // Loading Index Extensible Groups
+    for (auto& loadingIndex : loadingIndexes) {
+      auto eg = idfObject.pushExtensibleGroup();
+
+      // Compressor Speed at Loading Index
+      eg.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlExtensibleFields::CompressorSpeedatLoadingIndex,
+                   loadingIndex.compressorSpeed());
+
+      // Loading Index Evaporative Capacity Multiplier Function of Temperature Curve Name
+      {
+        auto curve = loadingIndex.evaporativeCapacityMultiplierFunctionofTemperatureCurve();
+        if (auto curve_ = translateAndMapModelObject(curve)) {
+          eg.setString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlExtensibleFields::
+                         LoadingIndexEvaporativeCapacityMultiplierFunctionofTemperatureCurveName,
+                       curve_->name().get());
+        }
+      }
+
+      // Loading Index Compressor Power Multiplier Function of Temperature Curve Name
+      {
+        auto curve = loadingIndex.compressorPowerMultiplierFunctionofTemperatureCurve();
+        if (auto curve_ = translateAndMapModelObject(curve)) {
+          eg.setString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlExtensibleFields::
+                         LoadingIndexCompressorPowerMultiplierFunctionofTemperatureCurveName,
+                       curve_->name().get());
+        }
+      }
+    }
+
+    return idfObject;
+  }  // End of translate function
+
+}  // end namespace energyplus
+}  // end namespace openstudio
diff --git a/src/energyplus/ForwardTranslator/ForwardTranslateAirConditionerVariableRefrigerantFlowFluidTemperatureControlHR.cpp b/src/energyplus/ForwardTranslator/ForwardTranslateAirConditionerVariableRefrigerantFlowFluidTemperatureControlHR.cpp
new file mode 100644
index 00000000000..9aa614558f7
--- /dev/null
+++ b/src/energyplus/ForwardTranslator/ForwardTranslateAirConditionerVariableRefrigerantFlowFluidTemperatureControlHR.cpp
@@ -0,0 +1,448 @@
+/***********************************************************************************************************************
+*  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/AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR.hpp"
+#include "../../model/AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl.hpp"
+#include "../../model/LoadingIndex.hpp"
+#include "../../model/LoadingIndex_Impl.hpp"
+
+#include "../../model/Schedule.hpp"
+#include "../../model/Schedule_Impl.hpp"
+#include "../../model/Node.hpp"
+#include "../../model/Node_Impl.hpp"
+#include "../../model/PlantLoop.hpp"
+#include "../../model/PlantLoop_Impl.hpp"
+#include "../../model/ThermalZone.hpp"
+#include "../../model/ThermalZone_Impl.hpp"
+#include "../../model/ZoneHVACTerminalUnitVariableRefrigerantFlow.hpp"
+#include "../../model/ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl.hpp"
+#include "../../model/Curve.hpp"
+#include "../../model/Curve_Impl.hpp"
+#include "../../utilities/core/Logger.hpp"
+#include "../../utilities/core/Assert.hpp"
+#include "../../utilities/idd/IddEnums.hpp"
+#include "../../utilities/idf/IdfExtensibleGroup.hpp"
+
+#include <utilities/idd/IddEnums.hxx>
+#include <utilities/idd/AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HR_FieldEnums.hxx>
+#include <utilities/idd/ZoneTerminalUnitList_FieldEnums.hxx>
+#include <utilities/idd/FluidProperties_Name_FieldEnums.hxx>
+
+using namespace openstudio::model;
+
+namespace openstudio {
+
+namespace energyplus {
+
+  boost::optional<IdfObject> ForwardTranslator::translateAirConditionerVariableRefrigerantFlowFluidTemperatureControlHR(
+    model::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR& modelObject) {
+
+    // Terminals
+    std::vector<ZoneHVACTerminalUnitVariableRefrigerantFlow> terminals = modelObject.terminals();
+    if (terminals.empty()) {
+      LOG(Warn, modelObject.briefDescription() << " will not be translated as it has no terminals.");
+      return boost::none;
+    }
+
+    // Name
+    IdfObject idfObject =
+      createRegisterAndNameIdfObject(openstudio::IddObjectType::AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HR, modelObject);
+
+    // Availability Schedule Name: Optional Object, required in Model
+    {
+      auto sch = modelObject.availabilitySchedule();
+      if (boost::optional<IdfObject> owo_ = translateAndMapModelObject(sch)) {
+        idfObject.setString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::AvailabilityScheduleName, owo_->nameString());
+      }
+    }
+
+    // Refrigerant Type: Optional Object
+    boost::optional<IdfObject> fluidProperties = createFluidProperties(modelObject.refrigerantType());
+    if (fluidProperties) {
+      boost::optional<std::string> value = fluidProperties.get().getString(FluidProperties_NameFields::FluidName, true);
+      if (value) {
+        idfObject.setString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::RefrigerantType, value.get());
+      }
+    }
+
+    if (modelObject.isRatedEvaporativeCapacityAutosized()) {
+      idfObject.setString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::RatedEvaporativeCapacity, "Autosize");
+    } else {
+      // Rated Evaporative Capacity: boost::optional<double>
+      if (boost::optional<double> _ratedEvaporativeCapacity = modelObject.ratedEvaporativeCapacity()) {
+        idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::RatedEvaporativeCapacity,
+                            _ratedEvaporativeCapacity.get());
+      }
+    }
+
+    // Rated Compressor Power Per Unit of Rated Evaporative Capacity: Optional Double
+    double ratedCompressorPowerPerUnitofRatedEvaporativeCapacity = modelObject.ratedCompressorPowerPerUnitofRatedEvaporativeCapacity();
+    idfObject.setDouble(
+      AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::RatedCompressorPowerPerUnitofRatedEvaporativeCapacity,
+      ratedCompressorPowerPerUnitofRatedEvaporativeCapacity);
+
+    // Minimum Outdoor Air Temperature in Cooling Only Mode: Optional Double
+    double minimumOutdoorAirTemperatureinCoolingOnlyMode = modelObject.minimumOutdoorAirTemperatureinCoolingOnlyMode();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MinimumOutdoorAirTemperatureinCoolingOnlyMode,
+                        minimumOutdoorAirTemperatureinCoolingOnlyMode);
+
+    // Maximum Outdoor Air Temperature in Cooling Only Mode: Optional Double
+    double maximumOutdoorAirTemperatureinCoolingOnlyMode = modelObject.maximumOutdoorAirTemperatureinCoolingOnlyMode();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MaximumOutdoorAirTemperatureinCoolingOnlyMode,
+                        maximumOutdoorAirTemperatureinCoolingOnlyMode);
+
+    // Minimum Outdoor Air Temperature in Heating Only Mode: Optional Double
+    double minimumOutdoorAirTemperatureinHeatingOnlyMode = modelObject.minimumOutdoorAirTemperatureinHeatingOnlyMode();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MinimumOutdoorAirTemperatureinHeatingOnlyMode,
+                        minimumOutdoorAirTemperatureinHeatingOnlyMode);
+
+    // Maximum Outdoor Air Temperature in Heating Only Mode: Optional Double
+    double maximumOutdoorAirTemperatureinHeatingOnlyMode = modelObject.maximumOutdoorAirTemperatureinHeatingOnlyMode();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MaximumOutdoorAirTemperatureinHeatingOnlyMode,
+                        maximumOutdoorAirTemperatureinHeatingOnlyMode);
+
+    // Minimum Outdoor Temperature in Heat Recovery Mode: Optional Double
+    double minimumOutdoorTemperatureinHeatRecoveryMode = modelObject.minimumOutdoorTemperatureinHeatRecoveryMode();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MinimumOutdoorTemperatureinHeatRecoveryMode,
+                        minimumOutdoorTemperatureinHeatRecoveryMode);
+
+    // Maximum Outdoor Temperature in Heat Recovery Mode: Optional Double
+    double maximumOutdoorTemperatureinHeatRecoveryMode = modelObject.maximumOutdoorTemperatureinHeatRecoveryMode();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MaximumOutdoorTemperatureinHeatRecoveryMode,
+                        maximumOutdoorTemperatureinHeatRecoveryMode);
+
+    // Refrigerant Temperature Control Algorithm for Indoor Unit: Optional String
+    std::string refrigerantTemperatureControlAlgorithmforIndoorUnit = modelObject.refrigerantTemperatureControlAlgorithmforIndoorUnit();
+    idfObject.setString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::RefrigerantTemperatureControlAlgorithmforIndoorUnit,
+                        refrigerantTemperatureControlAlgorithmforIndoorUnit);
+
+    // Reference Evaporating Temperature for Indoor Unit: Optional Double
+    double referenceEvaporatingTemperatureforIndoorUnit = modelObject.referenceEvaporatingTemperatureforIndoorUnit();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::ReferenceEvaporatingTemperatureforIndoorUnit,
+                        referenceEvaporatingTemperatureforIndoorUnit);
+
+    // Reference Condensing Temperature for Indoor Unit: Optional Double
+    double referenceCondensingTemperatureforIndoorUnit = modelObject.referenceCondensingTemperatureforIndoorUnit();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::ReferenceCondensingTemperatureforIndoorUnit,
+                        referenceCondensingTemperatureforIndoorUnit);
+
+    // Variable Evaporating Temperature Minimum for Indoor Unit: Optional Double
+    double variableEvaporatingTemperatureMinimumforIndoorUnit = modelObject.variableEvaporatingTemperatureMinimumforIndoorUnit();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::VariableEvaporatingTemperatureMinimumforIndoorUnit,
+                        variableEvaporatingTemperatureMinimumforIndoorUnit);
+
+    // Variable Evaporating Temperature Maximum for Indoor Unit: Optional Double
+    double variableEvaporatingTemperatureMaximumforIndoorUnit = modelObject.variableEvaporatingTemperatureMaximumforIndoorUnit();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::VariableEvaporatingTemperatureMaximumforIndoorUnit,
+                        variableEvaporatingTemperatureMaximumforIndoorUnit);
+
+    // Variable Condensing Temperature Minimum for Indoor Unit: Optional Double
+    double variableCondensingTemperatureMinimumforIndoorUnit = modelObject.variableCondensingTemperatureMinimumforIndoorUnit();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::VariableCondensingTemperatureMinimumforIndoorUnit,
+                        variableCondensingTemperatureMinimumforIndoorUnit);
+
+    // Variable Condensing Temperature Maximum for Indoor Unit: Optional Double
+    double variableCondensingTemperatureMaximumforIndoorUnit = modelObject.variableCondensingTemperatureMaximumforIndoorUnit();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::VariableCondensingTemperatureMaximumforIndoorUnit,
+                        variableCondensingTemperatureMaximumforIndoorUnit);
+
+    // Outdoor Unit Evaporator Reference Superheating: Optional Double
+    double outdoorUnitEvaporatorReferenceSuperheating = modelObject.outdoorUnitEvaporatorReferenceSuperheating();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::OutdoorUnitEvaporatorReferenceSuperheating,
+                        outdoorUnitEvaporatorReferenceSuperheating);
+
+    // Outdoor Unit Condenser Reference Subcooling: Optional Double
+    double outdoorUnitCondenserReferenceSubcooling = modelObject.outdoorUnitCondenserReferenceSubcooling();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::OutdoorUnitCondenserReferenceSubcooling,
+                        outdoorUnitCondenserReferenceSubcooling);
+
+    // Outdoor Unit Evaporator Rated Bypass Factor: Optional Double
+    double outdoorUnitEvaporatorRatedBypassFactor = modelObject.outdoorUnitEvaporatorRatedBypassFactor();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::OutdoorUnitEvaporatorRatedBypassFactor,
+                        outdoorUnitEvaporatorRatedBypassFactor);
+
+    // Outdoor Unit Condenser Rated Bypass Factor: Optional Double
+    double outdoorUnitCondenserRatedBypassFactor = modelObject.outdoorUnitCondenserRatedBypassFactor();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::OutdoorUnitCondenserRatedBypassFactor,
+                        outdoorUnitCondenserRatedBypassFactor);
+
+    // Difference between Outdoor Unit Evaporating Temperature and Outdoor Air Temperature in Heat Recovery Mode: Optional Double
+    double differencebetweenOutdoorUnitEvaporatingTemperatureandOutdoorAirTemperatureinHeatRecoveryMode =
+      modelObject.differencebetweenOutdoorUnitEvaporatingTemperatureandOutdoorAirTemperatureinHeatRecoveryMode();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::
+                          DifferencebetweenOutdoorUnitEvaporatingTemperatureandOutdoorAirTemperatureinHeatRecoveryMode,
+                        differencebetweenOutdoorUnitEvaporatingTemperatureandOutdoorAirTemperatureinHeatRecoveryMode);
+
+    // Outdoor Unit Heat Exchanger Capacity Ratio: Optional Double
+    double outdoorUnitHeatExchangerCapacityRatio = modelObject.outdoorUnitHeatExchangerCapacityRatio();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::OutdoorUnitHeatExchangerCapacityRatio,
+                        outdoorUnitHeatExchangerCapacityRatio);
+
+    // Outdoor Unit Fan Power Per Unit of Rated Evaporative Capacity: Optional Double
+    double outdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity = modelObject.outdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::OutdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity,
+                        outdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity);
+
+    // Outdoor Unit Fan Flow Rate Per Unit of Rated Evaporative Capacity: Optional Double
+    double outdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity = modelObject.outdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity();
+    idfObject.setDouble(
+      AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::OutdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity,
+      outdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity);
+
+    // Outdoor Unit Evaporating Temperature Function of Superheating Curve Name: Required Object
+    Curve outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve = modelObject.outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve();
+    if (boost::optional<IdfObject> owo_ = translateAndMapModelObject(outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve)) {
+      idfObject.setString(
+        AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::OutdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurveName,
+        owo_->nameString());
+    }
+
+    // Outdoor Unit Condensing Temperature Function of Subcooling Curve Name: Required Object
+    Curve outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve = modelObject.outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve();
+    if (boost::optional<IdfObject> owo_ = translateAndMapModelObject(outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve)) {
+      idfObject.setString(
+        AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::OutdoorUnitCondensingTemperatureFunctionofSubcoolingCurveName,
+        owo_->nameString());
+    }
+
+    // Diameter of Main Pipe for Suction Gas: Optional Double
+    double diameterofMainPipeforSuctionGas = modelObject.diameterofMainPipeforSuctionGas();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::DiameterofMainPipeforSuctionGas,
+                        diameterofMainPipeforSuctionGas);
+
+    // Diameter of Main Pipe for Discharge Gas: Optional Double
+    double diameterofMainPipeforDischargeGas = modelObject.diameterofMainPipeforDischargeGas();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::DiameterofMainPipeforDischargeGas,
+                        diameterofMainPipeforDischargeGas);
+
+    // Length of Main Pipe Connecting Outdoor Unit to the First Branch Joint: Optional Double
+    double lengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint = modelObject.lengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint();
+    idfObject.setDouble(
+      AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::LengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint,
+      lengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint);
+
+    // Equivalent Length of Main Pipe Connecting Outdoor Unit to the First Branch Joint: Optional Double
+    double equivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint =
+      modelObject.equivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint();
+    idfObject.setDouble(
+      AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::EquivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint,
+      equivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint);
+
+    // Height Difference Between Outdoor Unit and Indoor Units: Optional Double
+    double heightDifferenceBetweenOutdoorUnitandIndoorUnits = modelObject.heightDifferenceBetweenOutdoorUnitandIndoorUnits();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::HeightDifferenceBetweenOutdoorUnitandIndoorUnits,
+                        heightDifferenceBetweenOutdoorUnitandIndoorUnits);
+
+    // Main Pipe Insulation Thickness: Optional Double
+    double mainPipeInsulationThickness = modelObject.mainPipeInsulationThickness();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MainPipeInsulationThickness,
+                        mainPipeInsulationThickness);
+
+    // Main Pipe Insulation Thermal Conductivity: Optional Double
+    double mainPipeInsulationThermalConductivity = modelObject.mainPipeInsulationThermalConductivity();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MainPipeInsulationThermalConductivity,
+                        mainPipeInsulationThermalConductivity);
+
+    // Crankcase Heater Power per Compressor: Optional Double
+    double crankcaseHeaterPowerperCompressor = modelObject.crankcaseHeaterPowerperCompressor();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::CrankcaseHeaterPowerperCompressor,
+                        crankcaseHeaterPowerperCompressor);
+
+    // Number of Compressors: Optional Integer
+    int numberofCompressors = modelObject.numberofCompressors();
+    idfObject.setInt(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::NumberofCompressors, numberofCompressors);
+
+    // Ratio of Compressor Size to Total Compressor Capacity: Optional Double
+    double ratioofCompressorSizetoTotalCompressorCapacity = modelObject.ratioofCompressorSizetoTotalCompressorCapacity();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::RatioofCompressorSizetoTotalCompressorCapacity,
+                        ratioofCompressorSizetoTotalCompressorCapacity);
+
+    // Maximum Outdoor Dry-Bulb Temperature for Crankcase Heater: Optional Double
+    double maximumOutdoorDryBulbTemperatureforCrankcaseHeater = modelObject.maximumOutdoorDryBulbTemperatureforCrankcaseHeater();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MaximumOutdoorDryBulbTemperatureforCrankcaseHeater,
+                        maximumOutdoorDryBulbTemperatureforCrankcaseHeater);
+
+    // Defrost Strategy: Optional String
+    std::string defrostStrategy = modelObject.defrostStrategy();
+    idfObject.setString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::DefrostStrategy, defrostStrategy);
+
+    // Defrost Control: Optional String
+    std::string defrostControl = modelObject.defrostControl();
+    idfObject.setString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::DefrostControl, defrostControl);
+
+    // Defrost Energy Input Ratio Modifier Function of Temperature Curve Name: Optional Object
+    if (boost::optional<Curve> _defrostEnergyInputRatioModifierFunctionofTemperatureCurve =
+          modelObject.defrostEnergyInputRatioModifierFunctionofTemperatureCurve()) {
+      if (boost::optional<IdfObject> owo_ = translateAndMapModelObject(_defrostEnergyInputRatioModifierFunctionofTemperatureCurve.get())) {
+        idfObject.setString(
+          AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::DefrostEnergyInputRatioModifierFunctionofTemperatureCurveName,
+          owo_->nameString());
+      }
+    }
+
+    // Defrost Time Period Fraction: Optional Double
+    double defrostTimePeriodFraction = modelObject.defrostTimePeriodFraction();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::DefrostTimePeriodFraction,
+                        defrostTimePeriodFraction);
+
+    if (modelObject.isResistiveDefrostHeaterCapacityAutosized()) {
+      idfObject.setString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::ResistiveDefrostHeaterCapacity, "Autosize");
+    } else {
+      // Resistive Defrost Heater Capacity: boost::optional<double>
+      if (boost::optional<double> _resistiveDefrostHeaterCapacity = modelObject.resistiveDefrostHeaterCapacity()) {
+        idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::ResistiveDefrostHeaterCapacity,
+                            _resistiveDefrostHeaterCapacity.get());
+      }
+    }
+
+    // Maximum Outdoor Dry-bulb Temperature for Defrost Operation: Optional Double
+    double maximumOutdoorDrybulbTemperatureforDefrostOperation = modelObject.maximumOutdoorDrybulbTemperatureforDefrostOperation();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MaximumOutdoorDrybulbTemperatureforDefrostOperation,
+                        maximumOutdoorDrybulbTemperatureforDefrostOperation);
+
+    // Initial Heat Recovery Cooling Capacity Fraction: Optional Double
+    double initialHeatRecoveryCoolingCapacityFraction = modelObject.initialHeatRecoveryCoolingCapacityFraction();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::InitialHeatRecoveryCoolingCapacityFraction,
+                        initialHeatRecoveryCoolingCapacityFraction);
+
+    // Heat Recovery Cooling Capacity Time Constant: Optional Double
+    double heatRecoveryCoolingCapacityTimeConstant = modelObject.heatRecoveryCoolingCapacityTimeConstant();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::HeatRecoveryCoolingCapacityTimeConstant,
+                        heatRecoveryCoolingCapacityTimeConstant);
+
+    // Initial Heat Recovery Cooling Energy Fraction: Optional Double
+    double initialHeatRecoveryCoolingEnergyFraction = modelObject.initialHeatRecoveryCoolingEnergyFraction();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::InitialHeatRecoveryCoolingEnergyFraction,
+                        initialHeatRecoveryCoolingEnergyFraction);
+
+    // Heat Recovery Cooling Energy Time Constant: Optional Double
+    double heatRecoveryCoolingEnergyTimeConstant = modelObject.heatRecoveryCoolingEnergyTimeConstant();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::HeatRecoveryCoolingEnergyTimeConstant,
+                        heatRecoveryCoolingEnergyTimeConstant);
+
+    // Initial Heat Recovery Heating Capacity Fraction: Optional Double
+    double initialHeatRecoveryHeatingCapacityFraction = modelObject.initialHeatRecoveryHeatingCapacityFraction();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::InitialHeatRecoveryHeatingCapacityFraction,
+                        initialHeatRecoveryHeatingCapacityFraction);
+
+    // Heat Recovery Heating Capacity Time Constant: Optional Double
+    double heatRecoveryHeatingCapacityTimeConstant = modelObject.heatRecoveryHeatingCapacityTimeConstant();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::HeatRecoveryHeatingCapacityTimeConstant,
+                        heatRecoveryHeatingCapacityTimeConstant);
+
+    // Initial Heat Recovery Heating Energy Fraction: Optional Double
+    double initialHeatRecoveryHeatingEnergyFraction = modelObject.initialHeatRecoveryHeatingEnergyFraction();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::InitialHeatRecoveryHeatingEnergyFraction,
+                        initialHeatRecoveryHeatingEnergyFraction);
+
+    // Heat Recovery Heating Energy Time Constant: Optional Double
+    double heatRecoveryHeatingEnergyTimeConstant = modelObject.heatRecoveryHeatingEnergyTimeConstant();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::HeatRecoveryHeatingEnergyTimeConstant,
+                        heatRecoveryHeatingEnergyTimeConstant);
+
+    // Compressor Maximum Delta Pressure: Optional Double
+    double compressorMaximumDeltaPressure = modelObject.compressorMaximumDeltaPressure();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::CompressormaximumdeltaPressure,
+                        compressorMaximumDeltaPressure);
+
+    // Compressor Inverter Efficiency: Optional Double
+    double compressorInverterEfficiency = modelObject.compressorInverterEfficiency();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::CompressorInverterEfficiency,
+                        compressorInverterEfficiency);
+
+    // Compressor Evaporative Capacity Correction Factor: Optional Double
+    double compressorEvaporativeCapacityCorrectionFactor = modelObject.compressorEvaporativeCapacityCorrectionFactor();
+    idfObject.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::CompressorEvaporativeCapacityCorrectionFactor,
+                        compressorEvaporativeCapacityCorrectionFactor);
+
+    // Number of Compressor Loading Index Entries: Optional Integer
+    std::vector<LoadingIndex> loadingIndexes = modelObject.loadingIndexes();
+    if (auto num = loadingIndexes.size()) {
+      idfObject.setInt(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::NumberofCompressorLoadingIndexEntries, num);
+    }
+
+    // Terminal Unit List
+
+    IdfObject _zoneTerminalUnitList(IddObjectType::ZoneTerminalUnitList);
+
+    std::string terminalUnitListName = modelObject.name().get() + " Terminal List";
+
+    _zoneTerminalUnitList.setString(ZoneTerminalUnitListFields::ZoneTerminalUnitListName, terminalUnitListName);
+
+    idfObject.setString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::ZoneTerminalUnitListName, terminalUnitListName);
+
+    m_idfObjects.push_back(_zoneTerminalUnitList);
+
+    for (auto& terminal : terminals) {
+      boost::optional<IdfObject> terminal_ = translateAndMapModelObject(terminal);
+
+      OS_ASSERT(terminal_);
+
+      IdfExtensibleGroup eg = _zoneTerminalUnitList.pushExtensibleGroup();
+
+      eg.setString(ZoneTerminalUnitListExtensibleFields::ZoneTerminalUnitName, terminal_->name().get());
+    }
+
+    // Loading Index Extensible Groups
+    for (auto& loadingIndex : loadingIndexes) {
+      auto eg = idfObject.pushExtensibleGroup();
+
+      // Compressor Speed at Loading Index
+      eg.setDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRExtensibleFields::CompressorSpeedatLoadingIndex,
+                   loadingIndex.compressorSpeed());
+
+      // Loading Index Evaporative Capacity Multiplier Function of Temperature Curve Name
+      {
+        auto curve = loadingIndex.evaporativeCapacityMultiplierFunctionofTemperatureCurve();
+        if (auto curve_ = translateAndMapModelObject(curve)) {
+          eg.setString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRExtensibleFields::
+                         LoadingIndexEvaporativeCapacityMultiplierFunctionofTemperatureCurveName,
+                       curve_->name().get());
+        }
+      }
+
+      // Loading Index Compressor Power Multiplier Function of Temperature Curve Name
+      {
+        auto curve = loadingIndex.compressorPowerMultiplierFunctionofTemperatureCurve();
+        if (auto curve_ = translateAndMapModelObject(curve)) {
+          eg.setString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRExtensibleFields::
+                         LoadingIndexCompressorPowerMultiplierFunctionofTemperatureCurveName,
+                       curve_->name().get());
+        }
+      }
+    }
+
+    return idfObject;
+  }  // End of translate function
+
+}  // end namespace energyplus
+}  // end namespace openstudio
diff --git a/src/energyplus/ForwardTranslator/ForwardTranslateCoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl.cpp b/src/energyplus/ForwardTranslator/ForwardTranslateCoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl.cpp
new file mode 100644
index 00000000000..bf4bc01da06
--- /dev/null
+++ b/src/energyplus/ForwardTranslator/ForwardTranslateCoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl.cpp
@@ -0,0 +1,112 @@
+/***********************************************************************************************************************
+*  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/CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl.hpp"
+#include "../../model/CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl.hpp"
+
+#include "../../model/Schedule.hpp"
+#include "../../model/Schedule_Impl.hpp"
+#include "../../model/Node.hpp"
+#include "../../model/Node_Impl.hpp"
+#include "../../model/Curve.hpp"
+#include "../../model/Curve_Impl.hpp"
+
+#include <utilities/idd/Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControl_FieldEnums.hxx>
+// #include "../../utilities/idd/IddEnums.hpp"
+#include <utilities/idd/IddEnums.hxx>
+
+using namespace openstudio::model;
+
+namespace openstudio {
+
+namespace energyplus {
+
+  boost::optional<IdfObject> ForwardTranslator::translateCoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl(
+    model::CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl& modelObject) {
+    boost::optional<std::string> s;
+    boost::optional<double> value;
+
+    IdfObject idfObject(IddObjectType::Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControl);
+
+    m_idfObjects.push_back(idfObject);
+
+    // Name
+    s = modelObject.name();
+    if (s) {
+      idfObject.setName(*s);
+    }
+
+    // Availability Schedule Name: Optional Object
+    if (boost::optional<Schedule> _availabilitySchedule = modelObject.availabilitySchedule()) {
+      if (boost::optional<IdfObject> _owo = translateAndMapModelObject(_availabilitySchedule.get())) {
+        idfObject.setString(Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::AvailabilityScheduleName, _owo->nameString());
+      }
+    }
+
+    if (modelObject.isRatedTotalCoolingCapacityAutosized()) {
+      idfObject.setString(Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::RatedTotalCoolingCapacity, "Autosize");
+    } else {
+      // Rated Total Cooling Capacity: boost::optional<double>
+      if (boost::optional<double> _ratedTotalCoolingCapacity = modelObject.ratedTotalCoolingCapacity()) {
+        idfObject.setDouble(Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::RatedTotalCoolingCapacity,
+                            _ratedTotalCoolingCapacity.get());
+      }
+    }
+
+    if (modelObject.isRatedSensibleHeatRatioAutosized()) {
+      idfObject.setString(Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::RatedSensibleHeatRatio, "Autosize");
+    } else {
+      // Rated Sensible Heat Ratio: boost::optional<double>
+      if (boost::optional<double> _ratedSensibleHeatRatio = modelObject.ratedSensibleHeatRatio()) {
+        idfObject.setDouble(Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::RatedSensibleHeatRatio,
+                            _ratedSensibleHeatRatio.get());
+      }
+    }
+
+    // Indoor Unit Reference Superheating: Optional Double
+    double indoorUnitReferenceSuperheating = modelObject.indoorUnitReferenceSuperheating();
+    idfObject.setDouble(Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::IndoorUnitReferenceSuperheating,
+                        indoorUnitReferenceSuperheating);
+
+    // Indoor Unit Evaporating Temperature Function of Superheating Curve Name: Required Object
+    Curve indoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve = modelObject.indoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve();
+    if (boost::optional<IdfObject> _owo = translateAndMapModelObject(indoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve)) {
+      idfObject.setString(
+        Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::IndoorUnitEvaporatingTemperatureFunctionofSuperheatingCurveName,
+        _owo->nameString());
+    }
+
+    return idfObject;
+  }  // End of translate function
+
+}  // end namespace energyplus
+}  // end namespace openstudio
\ No newline at end of file
diff --git a/src/energyplus/ForwardTranslator/ForwardTranslateCoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl.cpp b/src/energyplus/ForwardTranslator/ForwardTranslateCoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl.cpp
new file mode 100644
index 00000000000..5978406f6b8
--- /dev/null
+++ b/src/energyplus/ForwardTranslator/ForwardTranslateCoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl.cpp
@@ -0,0 +1,102 @@
+/***********************************************************************************************************************
+*  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/CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl.hpp"
+#include "../../model/CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl.hpp"
+
+#include "../../model/Schedule.hpp"
+#include "../../model/Schedule_Impl.hpp"
+#include "../../model/Node.hpp"
+#include "../../model/Node_Impl.hpp"
+#include "../../model/Curve.hpp"
+#include "../../model/Curve_Impl.hpp"
+
+#include <utilities/idd/Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControl_FieldEnums.hxx>
+// #include "../../utilities/idd/IddEnums.hpp"
+#include <utilities/idd/IddEnums.hxx>
+
+using namespace openstudio::model;
+
+namespace openstudio {
+
+namespace energyplus {
+
+  boost::optional<IdfObject> ForwardTranslator::translateCoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl(
+    model::CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl& modelObject) {
+    boost::optional<std::string> s;
+    boost::optional<double> value;
+
+    IdfObject idfObject(IddObjectType::Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControl);
+
+    m_idfObjects.push_back(idfObject);
+
+    // Name
+    s = modelObject.name();
+    if (s) {
+      idfObject.setName(*s);
+    }
+
+    // Availability Schedule: Optional Object
+    if (boost::optional<Schedule> _availabilitySchedule = modelObject.availabilitySchedule()) {
+      if (boost::optional<IdfObject> _owo = translateAndMapModelObject(_availabilitySchedule.get())) {
+        idfObject.setString(Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::AvailabilitySchedule, _owo->nameString());
+      }
+    }
+
+    if (modelObject.isRatedTotalHeatingCapacityAutosized()) {
+      idfObject.setString(Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::RatedTotalHeatingCapacity, "Autosize");
+    } else {
+      // Rated Total Heating Capacity: boost::optional<double>
+      if (boost::optional<double> _ratedTotalHeatingCapacity = modelObject.ratedTotalHeatingCapacity()) {
+        idfObject.setDouble(Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::RatedTotalHeatingCapacity,
+                            _ratedTotalHeatingCapacity.get());
+      }
+    }
+
+    // Indoor Unit Reference Subcooling: Optional Double
+    double indoorUnitReferenceSubcooling = modelObject.indoorUnitReferenceSubcooling();
+    idfObject.setDouble(Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::IndoorUnitReferenceSubcooling,
+                        indoorUnitReferenceSubcooling);
+
+    // Indoor Unit Condensing Temperature Function of Subcooling Curve Name: Required Object
+    Curve indoorUnitCondensingTemperatureFunctionofSubcoolingCurve = modelObject.indoorUnitCondensingTemperatureFunctionofSubcoolingCurve();
+    if (boost::optional<IdfObject> _owo = translateAndMapModelObject(indoorUnitCondensingTemperatureFunctionofSubcoolingCurve)) {
+      idfObject.setString(
+        Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::IndoorUnitCondensingTemperatureFunctionofSubcoolingCurveName,
+        _owo->nameString());
+    }
+
+    return idfObject;
+  }  // End of translate function
+
+}  // end namespace energyplus
+}  // end namespace openstudio
\ No newline at end of file
diff --git a/src/energyplus/ForwardTranslator/ForwardTranslateZoneHVACTerminalUnitVariableRefrigerantFlow.cpp b/src/energyplus/ForwardTranslator/ForwardTranslateZoneHVACTerminalUnitVariableRefrigerantFlow.cpp
index 09ef816d337..3826841997c 100644
--- a/src/energyplus/ForwardTranslator/ForwardTranslateZoneHVACTerminalUnitVariableRefrigerantFlow.cpp
+++ b/src/energyplus/ForwardTranslator/ForwardTranslateZoneHVACTerminalUnitVariableRefrigerantFlow.cpp
@@ -60,9 +60,12 @@
 #include <utilities/idd/Fan_OnOff_FieldEnums.hxx>
 #include <utilities/idd/Fan_SystemModel_FieldEnums.hxx>
 #include <utilities/idd/Fan_ConstantVolume_FieldEnums.hxx>
+#include <utilities/idd/Fan_VariableVolume_FieldEnums.hxx>
 #include <utilities/idd/OutdoorAir_Mixer_FieldEnums.hxx>
 #include <utilities/idd/Coil_Cooling_DX_VariableRefrigerantFlow_FieldEnums.hxx>
 #include <utilities/idd/Coil_Heating_DX_VariableRefrigerantFlow_FieldEnums.hxx>
+#include <utilities/idd/Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControl_FieldEnums.hxx>
+#include <utilities/idd/Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControl_FieldEnums.hxx>
 #include <utilities/idd/Coil_Heating_Fuel_FieldEnums.hxx>
 #include <utilities/idd/Coil_Heating_Electric_FieldEnums.hxx>
 #include <utilities/idd/Coil_Heating_Water_FieldEnums.hxx>
@@ -278,6 +281,8 @@ namespace energyplus {
         return std::pair<unsigned, unsigned>{Fan_ConstantVolumeFields::AirInletNodeName, Fan_ConstantVolumeFields::AirOutletNodeName};
       } else if (idf_fan.iddObject().type() == IddObjectType::Fan_SystemModel) {
         return std::pair<unsigned, unsigned>{Fan_SystemModelFields::AirInletNodeName, Fan_SystemModelFields::AirOutletNodeName};
+      } else if (idf_fan.iddObject().type() == IddObjectType::Fan_VariableVolume) {
+        return std::pair<unsigned, unsigned>{Fan_VariableVolumeFields::AirInletNodeName, Fan_VariableVolumeFields::AirOutletNodeName};
       } else {
         LOG(Error, "VRF named " << modelObject.name().get() << " uses an unsupported fan type.");
         OS_ASSERT(false);
@@ -318,12 +323,17 @@ namespace energyplus {
       if (boost::optional<IdfObject> _coolingCoil = translateAndMapModelObject(coolingCoil.get())) {
 
         idfObject.setString(ZoneHVAC_TerminalUnit_VariableRefrigerantFlowFields::CoolingCoilObjectType, _coolingCoil->iddObject().name());
-
         idfObject.setString(ZoneHVAC_TerminalUnit_VariableRefrigerantFlowFields::CoolingCoilObjectName, _coolingCoil->name().get());
 
-        compsInOrder.emplace_back(Component(_coolingCoil.get(), modelObject.name().get() + " Cooling Coil Outlet Node",
-                                            Coil_Cooling_DX_VariableRefrigerantFlowFields::CoilAirInletNode,
-                                            Coil_Cooling_DX_VariableRefrigerantFlowFields::CoilAirOutletNode));
+        if (_coolingCoil->iddObject().type() == IddObjectType::Coil_Cooling_DX_VariableRefrigerantFlow) {
+          compsInOrder.emplace_back(Component(_coolingCoil.get(), modelObject.name().get() + " Cooling Coil Outlet Node",
+                                              Coil_Cooling_DX_VariableRefrigerantFlowFields::CoilAirInletNode,
+                                              Coil_Cooling_DX_VariableRefrigerantFlowFields::CoilAirOutletNode));
+        } else if (_coolingCoil->iddObject().type() == IddObjectType::Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControl) {
+          compsInOrder.emplace_back(Component(_coolingCoil.get(), modelObject.name().get() + " Cooling Coil Outlet Node",
+                                              Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::CoilAirInletNode,
+                                              Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::CoilAirOutletNode));
+        }
       }
     }
 
@@ -331,12 +341,17 @@ namespace energyplus {
       if (boost::optional<IdfObject> _heatingCoil = translateAndMapModelObject(heatingCoil.get())) {
 
         idfObject.setString(ZoneHVAC_TerminalUnit_VariableRefrigerantFlowFields::HeatingCoilObjectType, _heatingCoil->iddObject().name());
-
         idfObject.setString(ZoneHVAC_TerminalUnit_VariableRefrigerantFlowFields::HeatingCoilObjectName, _heatingCoil->name().get());
 
-        compsInOrder.emplace_back(Component(_heatingCoil.get(), modelObject.name().get() + " Heating Coil Outlet Node",
-                                            Coil_Heating_DX_VariableRefrigerantFlowFields::CoilAirInletNode,
-                                            Coil_Heating_DX_VariableRefrigerantFlowFields::CoilAirOutletNode));
+        if (_heatingCoil->iddObject().type() == IddObjectType::Coil_Heating_DX_VariableRefrigerantFlow) {
+          compsInOrder.emplace_back(Component(_heatingCoil.get(), modelObject.name().get() + " Heating Coil Outlet Node",
+                                              Coil_Heating_DX_VariableRefrigerantFlowFields::CoilAirInletNode,
+                                              Coil_Heating_DX_VariableRefrigerantFlowFields::CoilAirOutletNode));
+        } else if (_heatingCoil->iddObject().type() == IddObjectType::Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControl) {
+          compsInOrder.emplace_back(Component(_heatingCoil.get(), modelObject.name().get() + " Heating Coil Outlet Node",
+                                              Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::CoilAirInletNode,
+                                              Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::CoilAirOutletNode));
+        }
       }
     }
 
diff --git a/src/energyplus/Test/AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_GTest.cpp b/src/energyplus/Test/AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_GTest.cpp
new file mode 100644
index 00000000000..33ddd441e77
--- /dev/null
+++ b/src/energyplus/Test/AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_GTest.cpp
@@ -0,0 +1,503 @@
+/***********************************************************************************************************************
+*  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/AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR.hpp"
+#include "../../model/LoadingIndex.hpp"
+#include "../../model/PlantLoop.hpp"
+#include "../../model/Node.hpp"
+#include "../../model/ScheduleConstant.hpp"
+#include "../../model/ScheduleConstant_Impl.hpp"
+#include "../../model/CurveBiquadratic.hpp"
+#include "../../model/CurveBiquadratic_Impl.hpp"
+#include "../../model/CurveCubic.hpp"
+#include "../../model/CurveCubic_Impl.hpp"
+#include "../../model/ZoneHVACTerminalUnitVariableRefrigerantFlow.hpp"
+#include "../../model/ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl.hpp"
+#include "../../model/CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl.hpp"
+#include "../../model/CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl.hpp"
+#include "../../model/CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl.hpp"
+#include "../../model/CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl.hpp"
+#include "../../model/FanVariableVolume.hpp"
+#include "../../model/FanVariableVolume_Impl.hpp"
+
+#include "../../utilities/idf/IdfObject.hpp"
+#include "../../utilities/idf/IdfExtensibleGroup.hpp"
+#include "../../utilities/idf/WorkspaceObject.hpp"
+#include "../../utilities/idf/WorkspaceExtensibleGroup.hpp"
+
+#include <utilities/idd/IddEnums.hxx>
+#include <utilities/idd/AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HR_FieldEnums.hxx>
+#include <utilities/idd/ZoneHVAC_TerminalUnit_VariableRefrigerantFlow_FieldEnums.hxx>
+#include <utilities/idd/Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControl_FieldEnums.hxx>
+#include <utilities/idd/Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControl_FieldEnums.hxx>
+
+#include <resources.hxx>
+
+#include <sstream>
+
+using namespace openstudio::energyplus;
+using namespace openstudio::model;
+using namespace openstudio;
+
+TEST_F(EnergyPlusFixture, ForwardTranslator_AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR) {
+  Model model;
+  AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR vrf(model);
+
+  ScheduleConstant scheduleConstant(model);
+  scheduleConstant.setValue(0.5);
+  EXPECT_TRUE(vrf.setAvailabilitySchedule(scheduleConstant));
+  EXPECT_TRUE(vrf.setRefrigerantType("R11"));
+  EXPECT_TRUE(vrf.setRatedEvaporativeCapacity(1));
+  EXPECT_TRUE(vrf.setRatedCompressorPowerPerUnitofRatedEvaporativeCapacity(2));
+  EXPECT_TRUE(vrf.setMinimumOutdoorAirTemperatureinCoolingOnlyMode(3));
+  EXPECT_TRUE(vrf.setMaximumOutdoorAirTemperatureinCoolingOnlyMode(4));
+  EXPECT_TRUE(vrf.setMinimumOutdoorAirTemperatureinHeatingOnlyMode(5));
+  EXPECT_TRUE(vrf.setMaximumOutdoorAirTemperatureinHeatingOnlyMode(6));
+  EXPECT_TRUE(vrf.setMinimumOutdoorTemperatureinHeatRecoveryMode(7));
+  EXPECT_TRUE(vrf.setMaximumOutdoorTemperatureinHeatRecoveryMode(8));
+  EXPECT_TRUE(vrf.setRefrigerantTemperatureControlAlgorithmforIndoorUnit("ConstantTemp"));
+  EXPECT_TRUE(vrf.setReferenceEvaporatingTemperatureforIndoorUnit(9));
+  EXPECT_TRUE(vrf.setReferenceCondensingTemperatureforIndoorUnit(10));
+  EXPECT_TRUE(vrf.setVariableEvaporatingTemperatureMinimumforIndoorUnit(11));
+  EXPECT_TRUE(vrf.setVariableEvaporatingTemperatureMaximumforIndoorUnit(12));
+  EXPECT_TRUE(vrf.setVariableCondensingTemperatureMinimumforIndoorUnit(13));
+  EXPECT_TRUE(vrf.setVariableCondensingTemperatureMaximumforIndoorUnit(14));
+  EXPECT_TRUE(vrf.setOutdoorUnitEvaporatorReferenceSuperheating(15));
+  EXPECT_TRUE(vrf.setOutdoorUnitCondenserReferenceSubcooling(16));
+  EXPECT_TRUE(vrf.setOutdoorUnitEvaporatorRatedBypassFactor(17));
+  EXPECT_TRUE(vrf.setOutdoorUnitCondenserRatedBypassFactor(18));
+  EXPECT_TRUE(vrf.setDifferencebetweenOutdoorUnitEvaporatingTemperatureandOutdoorAirTemperatureinHeatRecoveryMode(19));
+  EXPECT_TRUE(vrf.setOutdoorUnitHeatExchangerCapacityRatio(20));
+  EXPECT_TRUE(vrf.setOutdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity(21));
+  EXPECT_TRUE(vrf.setOutdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity(22));
+  CurveCubic curve1(model);
+  EXPECT_TRUE(vrf.setOutdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve(curve1));
+  CurveCubic curve2(model);
+  EXPECT_TRUE(vrf.setOutdoorUnitCondensingTemperatureFunctionofSubcoolingCurve(curve2));
+  EXPECT_TRUE(vrf.setDiameterofMainPipeforSuctionGas(23));
+  EXPECT_TRUE(vrf.setDiameterofMainPipeforDischargeGas(24));
+  EXPECT_TRUE(vrf.setLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(25));
+  EXPECT_TRUE(vrf.setEquivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(26));
+  EXPECT_TRUE(vrf.setHeightDifferenceBetweenOutdoorUnitandIndoorUnits(27));
+  EXPECT_TRUE(vrf.setMainPipeInsulationThickness(28));
+  EXPECT_TRUE(vrf.setMainPipeInsulationThermalConductivity(29));
+  EXPECT_TRUE(vrf.setCrankcaseHeaterPowerperCompressor(30));
+  EXPECT_TRUE(vrf.setNumberofCompressors(31));
+  EXPECT_TRUE(vrf.setRatioofCompressorSizetoTotalCompressorCapacity(32));
+  EXPECT_TRUE(vrf.setMaximumOutdoorDryBulbTemperatureforCrankcaseHeater(33));
+  EXPECT_TRUE(vrf.setDefrostStrategy("ReverseCycle"));
+  EXPECT_TRUE(vrf.setDefrostControl("OnDemand"));
+  CurveBiquadratic curve3(model);
+  EXPECT_TRUE(vrf.setDefrostEnergyInputRatioModifierFunctionofTemperatureCurve(curve3));
+  EXPECT_TRUE(vrf.setDefrostTimePeriodFraction(34));
+  EXPECT_TRUE(vrf.setResistiveDefrostHeaterCapacity(35));
+  EXPECT_TRUE(vrf.setMaximumOutdoorDrybulbTemperatureforDefrostOperation(36));
+  EXPECT_TRUE(vrf.setInitialHeatRecoveryCoolingCapacityFraction(37));
+  EXPECT_TRUE(vrf.setHeatRecoveryCoolingCapacityTimeConstant(38));
+  EXPECT_TRUE(vrf.setInitialHeatRecoveryCoolingEnergyFraction(39));
+  EXPECT_TRUE(vrf.setHeatRecoveryCoolingEnergyTimeConstant(40));
+  EXPECT_TRUE(vrf.setInitialHeatRecoveryHeatingCapacityFraction(41));
+  EXPECT_TRUE(vrf.setHeatRecoveryHeatingCapacityTimeConstant(42));
+  EXPECT_TRUE(vrf.setInitialHeatRecoveryHeatingEnergyFraction(43));
+  EXPECT_TRUE(vrf.setHeatRecoveryHeatingEnergyTimeConstant(44));
+  EXPECT_TRUE(vrf.setCompressorMaximumDeltaPressure(45));
+  EXPECT_TRUE(vrf.setCompressorInverterEfficiency(0.5));
+  EXPECT_TRUE(vrf.setCompressorEvaporativeCapacityCorrectionFactor(47));
+
+  CurveBiquadratic evaporativeCapacityMultiplierFunctionofTemperatureCurve1(model);
+  CurveBiquadratic compressorPowerMultiplierFunctionofTemperatureCurve1(model);
+
+  CurveBiquadratic evaporativeCapacityMultiplierFunctionofTemperatureCurve2(model);
+  CurveBiquadratic compressorPowerMultiplierFunctionofTemperatureCurve2(model);
+
+  CurveBiquadratic evaporativeCapacityMultiplierFunctionofTemperatureCurve3(model);
+  CurveBiquadratic compressorPowerMultiplierFunctionofTemperatureCurve3(model);
+
+  vrf.removeAllLoadingIndexes();
+  LoadingIndex loadingIndex1(model, 1, evaporativeCapacityMultiplierFunctionofTemperatureCurve1,
+                             compressorPowerMultiplierFunctionofTemperatureCurve1);
+  EXPECT_TRUE(vrf.addLoadingIndex(loadingIndex1));
+  LoadingIndex loadingIndex2(model, 2, evaporativeCapacityMultiplierFunctionofTemperatureCurve2,
+                             compressorPowerMultiplierFunctionofTemperatureCurve2);
+  EXPECT_TRUE(vrf.addLoadingIndex(loadingIndex2));
+  LoadingIndex loadingIndex3(model, 3, evaporativeCapacityMultiplierFunctionofTemperatureCurve3,
+                             compressorPowerMultiplierFunctionofTemperatureCurve3);
+  EXPECT_TRUE(vrf.addLoadingIndex(loadingIndex3));
+
+  CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl coolingCoil(model);
+  EXPECT_TRUE(coolingCoil.setAvailabilitySchedule(scheduleConstant));
+  EXPECT_TRUE(coolingCoil.setRatedTotalCoolingCapacity(10));
+  EXPECT_TRUE(coolingCoil.setRatedSensibleHeatRatio(20));
+  EXPECT_TRUE(coolingCoil.setIndoorUnitReferenceSuperheating(30));
+  CurveCubic curve4(model);
+  EXPECT_TRUE(coolingCoil.setIndoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve(curve4));
+
+  CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl heatingCoil(model);
+  EXPECT_TRUE(heatingCoil.setAvailabilitySchedule(scheduleConstant));
+  EXPECT_TRUE(heatingCoil.setRatedTotalHeatingCapacity(40));
+  EXPECT_TRUE(heatingCoil.setIndoorUnitReferenceSubcooling(50));
+  CurveCubic curve5(model);
+  EXPECT_TRUE(heatingCoil.setIndoorUnitCondensingTemperatureFunctionofSubcoolingCurve(curve5));
+
+  FanVariableVolume fan(model);
+  ZoneHVACTerminalUnitVariableRefrigerantFlow term(model, coolingCoil, heatingCoil, fan);
+
+  EXPECT_TRUE(vrf.addTerminal(term));
+
+  ForwardTranslator ft;
+  Workspace workspace = ft.translateModel(model);
+
+  EXPECT_EQ(1u, workspace.getObjectsByType(IddObjectType::AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HR).size());
+  EXPECT_EQ(1u, workspace.getObjectsByType(IddObjectType::ZoneHVAC_TerminalUnit_VariableRefrigerantFlow).size());
+  EXPECT_EQ(13u, workspace.getObjectsByType(IddObjectType::Curve_Biquadratic).size());
+  EXPECT_EQ(4u, workspace.getObjectsByType(IddObjectType::Curve_Cubic).size());
+  EXPECT_EQ(1u, workspace.getObjectsByType(IddObjectType::Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControl).size());
+  EXPECT_EQ(1u, workspace.getObjectsByType(IddObjectType::Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControl).size());
+  EXPECT_EQ(1u, workspace.getObjectsByType(IddObjectType::Fan_VariableVolume).size());
+
+  IdfObject idf_vrf = workspace.getObjectsByType(IddObjectType::AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HR)[0];
+
+  EXPECT_EQ(vrf.nameString(), idf_vrf.getString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::Name, false).get());
+  EXPECT_EQ(scheduleConstant.nameString(),
+            idf_vrf.getString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::AvailabilityScheduleName, false).get());
+  EXPECT_EQ(vrf.nameString() + " Terminal List",
+            idf_vrf.getString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::ZoneTerminalUnitListName, false).get());
+  EXPECT_EQ("R11", idf_vrf.getString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::RefrigerantType, false).get());
+  EXPECT_EQ(1, idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::RatedEvaporativeCapacity, false).get());
+  EXPECT_EQ(
+    2, idf_vrf
+         .getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::RatedCompressorPowerPerUnitofRatedEvaporativeCapacity,
+                    false)
+         .get());
+  EXPECT_EQ(
+    3,
+    idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MinimumOutdoorAirTemperatureinCoolingOnlyMode, false)
+      .get());
+  EXPECT_EQ(
+    4,
+    idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MaximumOutdoorAirTemperatureinCoolingOnlyMode, false)
+      .get());
+  EXPECT_EQ(
+    5,
+    idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MinimumOutdoorAirTemperatureinHeatingOnlyMode, false)
+      .get());
+  EXPECT_EQ(
+    6,
+    idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MaximumOutdoorAirTemperatureinHeatingOnlyMode, false)
+      .get());
+  EXPECT_EQ(
+    7, idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MinimumOutdoorTemperatureinHeatRecoveryMode, false)
+         .get());
+  EXPECT_EQ(
+    8, idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MaximumOutdoorTemperatureinHeatRecoveryMode, false)
+         .get());
+  EXPECT_EQ(
+    "ConstantTemp",
+    idf_vrf
+      .getString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::RefrigerantTemperatureControlAlgorithmforIndoorUnit, false)
+      .get());
+  EXPECT_EQ(
+    9, idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::ReferenceEvaporatingTemperatureforIndoorUnit, false)
+         .get());
+  EXPECT_EQ(
+    10, idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::ReferenceCondensingTemperatureforIndoorUnit, false)
+          .get());
+  EXPECT_EQ(
+    11,
+    idf_vrf
+      .getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::VariableEvaporatingTemperatureMinimumforIndoorUnit, false)
+      .get());
+  EXPECT_EQ(
+    12,
+    idf_vrf
+      .getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::VariableEvaporatingTemperatureMaximumforIndoorUnit, false)
+      .get());
+  EXPECT_EQ(13, idf_vrf
+                  .getDouble(
+                    AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::VariableCondensingTemperatureMinimumforIndoorUnit, false)
+                  .get());
+  EXPECT_EQ(14, idf_vrf
+                  .getDouble(
+                    AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::VariableCondensingTemperatureMaximumforIndoorUnit, false)
+                  .get());
+  EXPECT_EQ(
+    15, idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::OutdoorUnitEvaporatorReferenceSuperheating, false)
+          .get());
+  EXPECT_EQ(
+    16,
+    idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::OutdoorUnitCondenserReferenceSubcooling, false).get());
+  EXPECT_EQ(
+    17,
+    idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::OutdoorUnitEvaporatorRatedBypassFactor, false).get());
+  EXPECT_EQ(
+    18,
+    idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::OutdoorUnitCondenserRatedBypassFactor, false).get());
+  EXPECT_EQ(19, idf_vrf
+                  .getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::
+                               DifferencebetweenOutdoorUnitEvaporatingTemperatureandOutdoorAirTemperatureinHeatRecoveryMode,
+                             false)
+                  .get());
+  EXPECT_EQ(
+    20,
+    idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::OutdoorUnitHeatExchangerCapacityRatio, false).get());
+  EXPECT_EQ(
+    21,
+    idf_vrf
+      .getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::OutdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity, false)
+      .get());
+  EXPECT_EQ(
+    22, idf_vrf
+          .getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::OutdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity,
+                     false)
+          .get());
+  EXPECT_EQ(
+    curve1.nameString(),
+    idf_vrf
+      .getString(
+        AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::OutdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurveName,
+        false)
+      .get());
+  EXPECT_EQ(
+    curve2.nameString(),
+    idf_vrf
+      .getString(
+        AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::OutdoorUnitCondensingTemperatureFunctionofSubcoolingCurveName, false)
+      .get());
+  EXPECT_EQ(23,
+            idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::DiameterofMainPipeforSuctionGas, false).get());
+  EXPECT_EQ(
+    24, idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::DiameterofMainPipeforDischargeGas, false).get());
+  EXPECT_EQ(
+    25,
+    idf_vrf
+      .getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::LengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint,
+                 false)
+      .get());
+  EXPECT_EQ(
+    26,
+    idf_vrf
+      .getDouble(
+        AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::EquivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint,
+        false)
+      .get());
+  EXPECT_EQ(
+    27, idf_vrf
+          .getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::HeightDifferenceBetweenOutdoorUnitandIndoorUnits, false)
+          .get());
+  EXPECT_EQ(28, idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MainPipeInsulationThickness, false).get());
+  EXPECT_EQ(
+    29,
+    idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MainPipeInsulationThermalConductivity, false).get());
+  EXPECT_EQ(
+    30, idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::CrankcaseHeaterPowerperCompressor, false).get());
+  EXPECT_EQ(31, idf_vrf.getInt(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::NumberofCompressors, false).get());
+  EXPECT_EQ(
+    32,
+    idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::RatioofCompressorSizetoTotalCompressorCapacity, false)
+      .get());
+  EXPECT_EQ(
+    33,
+    idf_vrf
+      .getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MaximumOutdoorDryBulbTemperatureforCrankcaseHeater, false)
+      .get());
+  EXPECT_EQ("ReverseCycle", idf_vrf.getString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::DefrostStrategy, false).get());
+  EXPECT_EQ("OnDemand", idf_vrf.getString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::DefrostControl, false).get());
+  EXPECT_EQ(
+    curve3.nameString(),
+    idf_vrf
+      .getString(
+        AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::DefrostEnergyInputRatioModifierFunctionofTemperatureCurveName, false)
+      .get());
+  EXPECT_EQ(34, idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::DefrostTimePeriodFraction, false).get());
+  EXPECT_EQ(35,
+            idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::ResistiveDefrostHeaterCapacity, false).get());
+  EXPECT_EQ(
+    36,
+    idf_vrf
+      .getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MaximumOutdoorDrybulbTemperatureforDefrostOperation, false)
+      .get());
+  EXPECT_EQ(
+    37, idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::InitialHeatRecoveryCoolingCapacityFraction, false)
+          .get());
+  EXPECT_EQ(
+    38,
+    idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::HeatRecoveryCoolingCapacityTimeConstant, false).get());
+  EXPECT_EQ(
+    39, idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::InitialHeatRecoveryCoolingEnergyFraction, false)
+          .get());
+  EXPECT_EQ(
+    40,
+    idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::HeatRecoveryCoolingEnergyTimeConstant, false).get());
+  EXPECT_EQ(
+    41, idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::InitialHeatRecoveryHeatingCapacityFraction, false)
+          .get());
+  EXPECT_EQ(
+    42,
+    idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::HeatRecoveryHeatingCapacityTimeConstant, false).get());
+  EXPECT_EQ(
+    43, idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::InitialHeatRecoveryHeatingEnergyFraction, false)
+          .get());
+  EXPECT_EQ(
+    44,
+    idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::HeatRecoveryHeatingEnergyTimeConstant, false).get());
+  EXPECT_EQ(45,
+            idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::CompressormaximumdeltaPressure, false).get());
+  EXPECT_EQ(0.5,
+            idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::CompressorInverterEfficiency, false).get());
+  EXPECT_EQ(
+    47,
+    idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::CompressorEvaporativeCapacityCorrectionFactor, false)
+      .get());
+  EXPECT_EQ(
+    3, idf_vrf.getInt(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::NumberofCompressorLoadingIndexEntries, false).get());
+
+  ASSERT_EQ(3u, idf_vrf.numExtensibleGroups());
+
+  auto egs = idf_vrf.extensibleGroups();
+
+  IdfExtensibleGroup eg1 = egs[0];
+  EXPECT_EQ(1, eg1.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRExtensibleFields::CompressorSpeedatLoadingIndex).get());
+  EXPECT_EQ(evaporativeCapacityMultiplierFunctionofTemperatureCurve1.nameString(),
+            eg1
+              .getString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRExtensibleFields::
+                           LoadingIndexEvaporativeCapacityMultiplierFunctionofTemperatureCurveName)
+              .get());
+  EXPECT_EQ(compressorPowerMultiplierFunctionofTemperatureCurve1.nameString(),
+            eg1
+              .getString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRExtensibleFields::
+                           LoadingIndexCompressorPowerMultiplierFunctionofTemperatureCurveName)
+              .get());
+
+  IdfExtensibleGroup eg2 = egs[1];
+  EXPECT_EQ(2, eg2.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRExtensibleFields::CompressorSpeedatLoadingIndex).get());
+  EXPECT_EQ(evaporativeCapacityMultiplierFunctionofTemperatureCurve2.nameString(),
+            eg2
+              .getString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRExtensibleFields::
+                           LoadingIndexEvaporativeCapacityMultiplierFunctionofTemperatureCurveName)
+              .get());
+  EXPECT_EQ(compressorPowerMultiplierFunctionofTemperatureCurve2.nameString(),
+            eg2
+              .getString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRExtensibleFields::
+                           LoadingIndexCompressorPowerMultiplierFunctionofTemperatureCurveName)
+              .get());
+
+  IdfExtensibleGroup eg3 = egs[2];
+  EXPECT_EQ(3, eg3.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRExtensibleFields::CompressorSpeedatLoadingIndex).get());
+  EXPECT_EQ(evaporativeCapacityMultiplierFunctionofTemperatureCurve3.nameString(),
+            eg3
+              .getString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRExtensibleFields::
+                           LoadingIndexEvaporativeCapacityMultiplierFunctionofTemperatureCurveName)
+              .get());
+  EXPECT_EQ(compressorPowerMultiplierFunctionofTemperatureCurve3.nameString(),
+            eg3
+              .getString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRExtensibleFields::
+                           LoadingIndexCompressorPowerMultiplierFunctionofTemperatureCurveName)
+              .get());
+
+  IdfObject idf_term = workspace.getObjectsByType(IddObjectType::ZoneHVAC_TerminalUnit_VariableRefrigerantFlow)[0];
+
+  EXPECT_EQ("DrawThrough", idf_term.getString(ZoneHVAC_TerminalUnit_VariableRefrigerantFlowFields::SupplyAirFanPlacement, false).get());
+  EXPECT_EQ("Fan:VariableVolume", idf_term.getString(ZoneHVAC_TerminalUnit_VariableRefrigerantFlowFields::SupplyAirFanObjectType, false).get());
+  EXPECT_EQ(fan.nameString(), idf_term.getString(ZoneHVAC_TerminalUnit_VariableRefrigerantFlowFields::SupplyAirFanObjectName, false).get());
+  EXPECT_EQ("Coil:Cooling:DX:VariableRefrigerantFlow:FluidTemperatureControl",
+            idf_term.getString(ZoneHVAC_TerminalUnit_VariableRefrigerantFlowFields::CoolingCoilObjectType, false).get());
+  EXPECT_EQ(coolingCoil.nameString(), idf_term.getString(ZoneHVAC_TerminalUnit_VariableRefrigerantFlowFields::CoolingCoilObjectName, false).get());
+  EXPECT_EQ("Coil:Heating:DX:VariableRefrigerantFlow:FluidTemperatureControl",
+            idf_term.getString(ZoneHVAC_TerminalUnit_VariableRefrigerantFlowFields::HeatingCoilObjectType, false).get());
+  EXPECT_EQ(heatingCoil.nameString(), idf_term.getString(ZoneHVAC_TerminalUnit_VariableRefrigerantFlowFields::HeatingCoilObjectName, false).get());
+
+  IdfObject idf_cool = workspace.getObjectsByType(IddObjectType::Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControl)[0];
+  EXPECT_EQ(scheduleConstant.nameString(),
+            idf_cool.getString(Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::AvailabilityScheduleName, false).get());
+  EXPECT_EQ("Zone HVAC Terminal Unit Variable Refrigerant Flow 1 Mixer Outlet Node",
+            idf_cool.getString(Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::CoilAirInletNode, false).get());
+  EXPECT_EQ("Zone HVAC Terminal Unit Variable Refrigerant Flow 1 Cooling Coil Outlet Node",
+            idf_cool.getString(Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::CoilAirOutletNode, false).get());
+  EXPECT_EQ(10, idf_cool.getDouble(Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::RatedTotalCoolingCapacity, false).get());
+  EXPECT_EQ(20, idf_cool.getDouble(Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::RatedSensibleHeatRatio, false).get());
+  EXPECT_EQ(30,
+            idf_cool.getDouble(Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::IndoorUnitReferenceSuperheating, false).get());
+  EXPECT_EQ(
+    curve4.nameString(),
+    idf_cool
+      .getString(
+        Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::IndoorUnitEvaporatingTemperatureFunctionofSuperheatingCurveName, false)
+      .get());
+
+  IdfObject idf_heat = workspace.getObjectsByType(IddObjectType::Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControl)[0];
+  EXPECT_EQ(scheduleConstant.nameString(),
+            idf_heat.getString(Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::AvailabilitySchedule, false).get());
+  EXPECT_EQ("Zone HVAC Terminal Unit Variable Refrigerant Flow 1 Cooling Coil Outlet Node",
+            idf_heat.getString(Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::CoilAirInletNode, false).get());
+  EXPECT_EQ("Zone HVAC Terminal Unit Variable Refrigerant Flow 1 Heating Coil Outlet Node",
+            idf_heat.getString(Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::CoilAirOutletNode, false).get());
+  EXPECT_EQ(40, idf_heat.getDouble(Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::RatedTotalHeatingCapacity, false).get());
+  EXPECT_EQ(50,
+            idf_heat.getDouble(Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::IndoorUnitReferenceSubcooling, false).get());
+  EXPECT_EQ(
+    curve5.nameString(),
+    idf_heat
+      .getString(Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::IndoorUnitCondensingTemperatureFunctionofSubcoolingCurveName,
+                 false)
+      .get());
+}
+
+TEST_F(EnergyPlusFixture, ForwardTranslator_AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_NoTerminals) {
+  Model model;
+  AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR vrf(model);
+
+  ForwardTranslator ft;
+  Workspace workspace = ft.translateModel(model);
+
+  EXPECT_EQ(0u, workspace.getObjectsByType(IddObjectType::AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HR).size());
+  EXPECT_EQ(0u, workspace.getObjectsByType(IddObjectType::ZoneHVAC_TerminalUnit_VariableRefrigerantFlow).size());
+  EXPECT_EQ(6u, workspace.getObjectsByType(IddObjectType::Curve_Biquadratic).size());
+  EXPECT_EQ(0u, workspace.getObjectsByType(IddObjectType::Curve_Cubic).size());
+  EXPECT_EQ(0u, workspace.getObjectsByType(IddObjectType::Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControl).size());
+  EXPECT_EQ(0u, workspace.getObjectsByType(IddObjectType::Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControl).size());
+  EXPECT_EQ(0u, workspace.getObjectsByType(IddObjectType::Fan_VariableVolume).size());
+
+  ASSERT_EQ(1, ft.warnings().size());
+  EXPECT_NE(std::string::npos, ft.warnings().front().logMessage().find("will not be translated as it has no terminals"));
+  EXPECT_EQ(0, workspace.getObjectsByType(IddObjectType::AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HR).size());
+
+  ZoneHVACTerminalUnitVariableRefrigerantFlow term(model, true);
+  EXPECT_TRUE(vrf.addTerminal(term));
+  workspace = ft.translateModel(model);
+
+  EXPECT_EQ(0, ft.errors().size());
+  EXPECT_EQ(1, workspace.getObjectsByType(IddObjectType::AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HR).size());
+}
diff --git a/src/energyplus/Test/AirConditionerVariableRefrigerantFlowFluidTemperatureControl_GTest.cpp b/src/energyplus/Test/AirConditionerVariableRefrigerantFlowFluidTemperatureControl_GTest.cpp
new file mode 100644
index 00000000000..95d4a1d2516
--- /dev/null
+++ b/src/energyplus/Test/AirConditionerVariableRefrigerantFlowFluidTemperatureControl_GTest.cpp
@@ -0,0 +1,418 @@
+/***********************************************************************************************************************
+*  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/AirConditionerVariableRefrigerantFlowFluidTemperatureControl.hpp"
+#include "../../model/LoadingIndex.hpp"
+#include "../../model/PlantLoop.hpp"
+#include "../../model/Node.hpp"
+#include "../../model/ScheduleConstant.hpp"
+#include "../../model/ScheduleConstant_Impl.hpp"
+#include "../../model/CurveBiquadratic.hpp"
+#include "../../model/CurveBiquadratic_Impl.hpp"
+#include "../../model/CurveCubic.hpp"
+#include "../../model/CurveCubic_Impl.hpp"
+#include "../../model/ZoneHVACTerminalUnitVariableRefrigerantFlow.hpp"
+#include "../../model/ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl.hpp"
+#include "../../model/CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl.hpp"
+#include "../../model/CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl.hpp"
+#include "../../model/CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl.hpp"
+#include "../../model/CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl.hpp"
+#include "../../model/FanVariableVolume.hpp"
+#include "../../model/FanVariableVolume_Impl.hpp"
+
+#include "../../utilities/idf/IdfObject.hpp"
+#include "../../utilities/idf/IdfExtensibleGroup.hpp"
+#include "../../utilities/idf/WorkspaceObject.hpp"
+#include "../../utilities/idf/WorkspaceExtensibleGroup.hpp"
+
+#include <utilities/idd/IddEnums.hxx>
+#include <utilities/idd/AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_FieldEnums.hxx>
+#include <utilities/idd/ZoneHVAC_TerminalUnit_VariableRefrigerantFlow_FieldEnums.hxx>
+#include <utilities/idd/Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControl_FieldEnums.hxx>
+#include <utilities/idd/Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControl_FieldEnums.hxx>
+
+#include <resources.hxx>
+
+#include <sstream>
+
+using namespace openstudio::energyplus;
+using namespace openstudio::model;
+using namespace openstudio;
+
+TEST_F(EnergyPlusFixture, ForwardTranslator_AirConditionerVariableRefrigerantFlowFluidTemperatureControl) {
+  Model model;
+  AirConditionerVariableRefrigerantFlowFluidTemperatureControl vrf(model);
+
+  ScheduleConstant scheduleConstant(model);
+  scheduleConstant.setValue(0.5);
+  EXPECT_TRUE(vrf.setAvailabilitySchedule(scheduleConstant));
+  EXPECT_TRUE(vrf.setRefrigerantType("R11"));
+  EXPECT_TRUE(vrf.setRatedEvaporativeCapacity(1));
+  EXPECT_TRUE(vrf.setRatedCompressorPowerPerUnitofRatedEvaporativeCapacity(2));
+  EXPECT_TRUE(vrf.setMinimumOutdoorAirTemperatureinCoolingMode(3));
+  EXPECT_TRUE(vrf.setMaximumOutdoorAirTemperatureinCoolingMode(4));
+  EXPECT_TRUE(vrf.setMinimumOutdoorAirTemperatureinHeatingMode(5));
+  EXPECT_TRUE(vrf.setMaximumOutdoorAirTemperatureinHeatingMode(6));
+  EXPECT_TRUE(vrf.setReferenceOutdoorUnitSuperheating(7));
+  EXPECT_TRUE(vrf.setReferenceOutdoorUnitSubcooling(8));
+  EXPECT_TRUE(vrf.setRefrigerantTemperatureControlAlgorithmforIndoorUnit("ConstantTemp"));
+  EXPECT_TRUE(vrf.setReferenceEvaporatingTemperatureforIndoorUnit(9));
+  EXPECT_TRUE(vrf.setReferenceCondensingTemperatureforIndoorUnit(10));
+  EXPECT_TRUE(vrf.setVariableEvaporatingTemperatureMinimumforIndoorUnit(11));
+  EXPECT_TRUE(vrf.setVariableEvaporatingTemperatureMaximumforIndoorUnit(12));
+  EXPECT_TRUE(vrf.setVariableCondensingTemperatureMinimumforIndoorUnit(13));
+  EXPECT_TRUE(vrf.setVariableCondensingTemperatureMaximumforIndoorUnit(14));
+  EXPECT_TRUE(vrf.setOutdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity(15));
+  EXPECT_TRUE(vrf.setOutdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity(16));
+  CurveCubic curve1(model);
+  EXPECT_TRUE(vrf.setOutdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve(curve1));
+  CurveCubic curve2(model);
+  EXPECT_TRUE(vrf.setOutdoorUnitCondensingTemperatureFunctionofSubcoolingCurve(curve2));
+  EXPECT_TRUE(vrf.setDiameterofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(17));
+  EXPECT_TRUE(vrf.setLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(18));
+  EXPECT_TRUE(vrf.setEquivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(19));
+  EXPECT_TRUE(vrf.setHeightDifferenceBetweenOutdoorUnitandIndoorUnits(20));
+  EXPECT_TRUE(vrf.setMainPipeInsulationThickness(21));
+  EXPECT_TRUE(vrf.setMainPipeInsulationThermalConductivity(22));
+  EXPECT_TRUE(vrf.setCrankcaseHeaterPowerperCompressor(23));
+  EXPECT_TRUE(vrf.setNumberofCompressors(24));
+  EXPECT_TRUE(vrf.setRatioofCompressorSizetoTotalCompressorCapacity(25));
+  EXPECT_TRUE(vrf.setMaximumOutdoorDryBulbTemperatureforCrankcaseHeater(26));
+  EXPECT_TRUE(vrf.setDefrostStrategy("ReverseCycle"));
+  EXPECT_TRUE(vrf.setDefrostControl("OnDemand"));
+  CurveBiquadratic curve3(model);
+  EXPECT_TRUE(vrf.setDefrostEnergyInputRatioModifierFunctionofTemperatureCurve(curve3));
+  EXPECT_TRUE(vrf.setDefrostTimePeriodFraction(27));
+  EXPECT_TRUE(vrf.setResistiveDefrostHeaterCapacity(28));
+  EXPECT_TRUE(vrf.setMaximumOutdoorDrybulbTemperatureforDefrostOperation(29));
+  EXPECT_TRUE(vrf.setCompressorMaximumDeltaPressure(30));
+
+  CurveBiquadratic evaporativeCapacityMultiplierFunctionofTemperatureCurve1(model);
+  CurveBiquadratic compressorPowerMultiplierFunctionofTemperatureCurve1(model);
+
+  CurveBiquadratic evaporativeCapacityMultiplierFunctionofTemperatureCurve2(model);
+  CurveBiquadratic compressorPowerMultiplierFunctionofTemperatureCurve2(model);
+
+  CurveBiquadratic evaporativeCapacityMultiplierFunctionofTemperatureCurve3(model);
+  CurveBiquadratic compressorPowerMultiplierFunctionofTemperatureCurve3(model);
+
+  vrf.removeAllLoadingIndexes();
+  LoadingIndex loadingIndex1(model, 1, evaporativeCapacityMultiplierFunctionofTemperatureCurve1,
+                             compressorPowerMultiplierFunctionofTemperatureCurve1);
+  EXPECT_TRUE(vrf.addLoadingIndex(loadingIndex1));
+  LoadingIndex loadingIndex2(model, 2, evaporativeCapacityMultiplierFunctionofTemperatureCurve2,
+                             compressorPowerMultiplierFunctionofTemperatureCurve2);
+  EXPECT_TRUE(vrf.addLoadingIndex(loadingIndex2));
+  LoadingIndex loadingIndex3(model, 3, evaporativeCapacityMultiplierFunctionofTemperatureCurve3,
+                             compressorPowerMultiplierFunctionofTemperatureCurve3);
+  EXPECT_TRUE(vrf.addLoadingIndex(loadingIndex3));
+
+  CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl coolingCoil(model);
+  EXPECT_TRUE(coolingCoil.setAvailabilitySchedule(scheduleConstant));
+  EXPECT_TRUE(coolingCoil.setRatedTotalCoolingCapacity(10));
+  EXPECT_TRUE(coolingCoil.setRatedSensibleHeatRatio(20));
+  EXPECT_TRUE(coolingCoil.setIndoorUnitReferenceSuperheating(30));
+  CurveCubic curve4(model);
+  EXPECT_TRUE(coolingCoil.setIndoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve(curve4));
+
+  CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl heatingCoil(model);
+  EXPECT_TRUE(heatingCoil.setAvailabilitySchedule(scheduleConstant));
+  EXPECT_TRUE(heatingCoil.setRatedTotalHeatingCapacity(40));
+  EXPECT_TRUE(heatingCoil.setIndoorUnitReferenceSubcooling(50));
+  CurveCubic curve5(model);
+  EXPECT_TRUE(heatingCoil.setIndoorUnitCondensingTemperatureFunctionofSubcoolingCurve(curve5));
+
+  FanVariableVolume fan(model);
+  ZoneHVACTerminalUnitVariableRefrigerantFlow term(model, coolingCoil, heatingCoil, fan);
+
+  EXPECT_TRUE(vrf.addTerminal(term));
+
+  ForwardTranslator ft;
+  Workspace workspace = ft.translateModel(model);
+
+  EXPECT_EQ(1u, workspace.getObjectsByType(IddObjectType::AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl).size());
+  EXPECT_EQ(1u, workspace.getObjectsByType(IddObjectType::ZoneHVAC_TerminalUnit_VariableRefrigerantFlow).size());
+  EXPECT_EQ(13u, workspace.getObjectsByType(IddObjectType::Curve_Biquadratic).size());
+  EXPECT_EQ(4u, workspace.getObjectsByType(IddObjectType::Curve_Cubic).size());
+  EXPECT_EQ(1u, workspace.getObjectsByType(IddObjectType::Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControl).size());
+  EXPECT_EQ(1u, workspace.getObjectsByType(IddObjectType::Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControl).size());
+  EXPECT_EQ(1u, workspace.getObjectsByType(IddObjectType::Fan_VariableVolume).size());
+
+  IdfObject idf_vrf = workspace.getObjectsByType(IddObjectType::AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl)[0];
+
+  EXPECT_EQ(vrf.nameString(), idf_vrf.getString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::Name, false).get());
+  EXPECT_EQ(scheduleConstant.nameString(),
+            idf_vrf.getString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::AvailabilityScheduleName, false).get());
+  EXPECT_EQ(vrf.nameString() + " Terminal List",
+            idf_vrf.getString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::ZoneTerminalUnitListName, false).get());
+  EXPECT_EQ("R11", idf_vrf.getString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::RefrigerantType, false).get());
+  EXPECT_EQ(1, idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::RatedEvaporativeCapacity, false).get());
+  EXPECT_EQ(2, idf_vrf
+                 .getDouble(
+                   AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::RatedCompressorPowerPerUnitofRatedEvaporativeCapacity, false)
+                 .get());
+  EXPECT_EQ(
+    3,
+    idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::MinimumOutdoorAirTemperatureinCoolingMode, false).get());
+  EXPECT_EQ(
+    4,
+    idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::MaximumOutdoorAirTemperatureinCoolingMode, false).get());
+  EXPECT_EQ(
+    5,
+    idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::MinimumOutdoorAirTemperatureinHeatingMode, false).get());
+  EXPECT_EQ(
+    6,
+    idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::MaximumOutdoorAirTemperatureinHeatingMode, false).get());
+  EXPECT_EQ(7,
+            idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::ReferenceOutdoorUnitSuperheating, false).get());
+  EXPECT_EQ(8, idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::ReferenceOutdoorUnitSubcooling, false).get());
+  EXPECT_EQ(
+    "ConstantTemp",
+    idf_vrf
+      .getString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::RefrigerantTemperatureControlAlgorithmforIndoorUnit, false)
+      .get());
+  EXPECT_EQ(
+    9, idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::ReferenceEvaporatingTemperatureforIndoorUnit, false)
+         .get());
+  EXPECT_EQ(
+    10, idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::ReferenceCondensingTemperatureforIndoorUnit, false)
+          .get());
+  EXPECT_EQ(
+    11,
+    idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::VariableEvaporatingTemperatureMinimumforIndoorUnit, false)
+      .get());
+  EXPECT_EQ(
+    12,
+    idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::VariableEvaporatingTemperatureMaximumforIndoorUnit, false)
+      .get());
+  EXPECT_EQ(
+    13,
+    idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::VariableCondensingTemperatureMinimumforIndoorUnit, false)
+      .get());
+  EXPECT_EQ(
+    14,
+    idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::VariableCondensingTemperatureMaximumforIndoorUnit, false)
+      .get());
+  EXPECT_EQ(15, idf_vrf
+                  .getDouble(
+                    AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::OutdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity, false)
+                  .get());
+  EXPECT_EQ(
+    16,
+    idf_vrf
+      .getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::OutdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity, false)
+      .get());
+  EXPECT_EQ(
+    curve1.nameString(),
+    idf_vrf
+      .getString(
+        AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::OutdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurveName, false)
+      .get());
+  EXPECT_EQ(
+    curve2.nameString(),
+    idf_vrf
+      .getString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::OutdoorUnitCondensingTemperatureFunctionofSubcoolingCurveName,
+                 false)
+      .get());
+  EXPECT_EQ(
+    17, idf_vrf
+          .getDouble(
+            AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::DiameterofMainPipeConnectingOutdoorUnittotheFirstBranchJoint, false)
+          .get());
+  EXPECT_EQ(
+    18, idf_vrf
+          .getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::LengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint,
+                     false)
+          .get());
+  EXPECT_EQ(
+    19,
+    idf_vrf
+      .getDouble(
+        AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::EquivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint,
+        false)
+      .get());
+  EXPECT_EQ(
+    20,
+    idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::HeightDifferenceBetweenOutdoorUnitandIndoorUnits, false)
+      .get());
+  EXPECT_EQ(21, idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::MainPipeInsulationThickness, false).get());
+  EXPECT_EQ(
+    22, idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::MainPipeInsulationThermalConductivity, false).get());
+  EXPECT_EQ(23,
+            idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::CrankcaseHeaterPowerperCompressor, false).get());
+  EXPECT_EQ(24, idf_vrf.getInt(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::NumberofCompressors, false).get());
+  EXPECT_EQ(
+    25, idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::RatioofCompressorSizetoTotalCompressorCapacity, false)
+          .get());
+  EXPECT_EQ(
+    26,
+    idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::MaximumOutdoorDryBulbTemperatureforCrankcaseHeater, false)
+      .get());
+  EXPECT_EQ("ReverseCycle", idf_vrf.getString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::DefrostStrategy, false).get());
+  EXPECT_EQ("OnDemand", idf_vrf.getString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::DefrostControl, false).get());
+  EXPECT_EQ(
+    curve3.nameString(),
+    idf_vrf
+      .getString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::DefrostEnergyInputRatioModifierFunctionofTemperatureCurveName,
+                 false)
+      .get());
+  EXPECT_EQ(27, idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::DefrostTimePeriodFraction, false).get());
+  EXPECT_EQ(28, idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::ResistiveDefrostHeaterCapacity, false).get());
+  EXPECT_EQ(
+    29, idf_vrf
+          .getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::MaximumOutdoorDrybulbTemperatureforDefrostOperation, false)
+          .get());
+  EXPECT_EQ(30, idf_vrf.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::CompressormaximumdeltaPressure, false).get());
+  EXPECT_EQ(3,
+            idf_vrf.getInt(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::NumberofCompressorLoadingIndexEntries, false).get());
+
+  ASSERT_EQ(3u, idf_vrf.numExtensibleGroups());
+
+  auto egs = idf_vrf.extensibleGroups();
+
+  IdfExtensibleGroup eg1 = egs[0];
+  EXPECT_EQ(1, eg1.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlExtensibleFields::CompressorSpeedatLoadingIndex).get());
+  EXPECT_EQ(evaporativeCapacityMultiplierFunctionofTemperatureCurve1.nameString(),
+            eg1
+              .getString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlExtensibleFields::
+                           LoadingIndexEvaporativeCapacityMultiplierFunctionofTemperatureCurveName)
+              .get());
+  EXPECT_EQ(compressorPowerMultiplierFunctionofTemperatureCurve1.nameString(),
+            eg1
+              .getString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlExtensibleFields::
+                           LoadingIndexCompressorPowerMultiplierFunctionofTemperatureCurveName)
+              .get());
+
+  IdfExtensibleGroup eg2 = egs[1];
+  EXPECT_EQ(2, eg2.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlExtensibleFields::CompressorSpeedatLoadingIndex).get());
+  EXPECT_EQ(evaporativeCapacityMultiplierFunctionofTemperatureCurve2.nameString(),
+            eg2
+              .getString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlExtensibleFields::
+                           LoadingIndexEvaporativeCapacityMultiplierFunctionofTemperatureCurveName)
+              .get());
+  EXPECT_EQ(compressorPowerMultiplierFunctionofTemperatureCurve2.nameString(),
+            eg2
+              .getString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlExtensibleFields::
+                           LoadingIndexCompressorPowerMultiplierFunctionofTemperatureCurveName)
+              .get());
+
+  IdfExtensibleGroup eg3 = egs[2];
+  EXPECT_EQ(3, eg3.getDouble(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlExtensibleFields::CompressorSpeedatLoadingIndex).get());
+  EXPECT_EQ(evaporativeCapacityMultiplierFunctionofTemperatureCurve3.nameString(),
+            eg3
+              .getString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlExtensibleFields::
+                           LoadingIndexEvaporativeCapacityMultiplierFunctionofTemperatureCurveName)
+              .get());
+  EXPECT_EQ(compressorPowerMultiplierFunctionofTemperatureCurve3.nameString(),
+            eg3
+              .getString(AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlExtensibleFields::
+                           LoadingIndexCompressorPowerMultiplierFunctionofTemperatureCurveName)
+              .get());
+
+  IdfObject idf_term = workspace.getObjectsByType(IddObjectType::ZoneHVAC_TerminalUnit_VariableRefrigerantFlow)[0];
+
+  EXPECT_EQ("DrawThrough", idf_term.getString(ZoneHVAC_TerminalUnit_VariableRefrigerantFlowFields::SupplyAirFanPlacement, false).get());
+  EXPECT_EQ("Fan:VariableVolume", idf_term.getString(ZoneHVAC_TerminalUnit_VariableRefrigerantFlowFields::SupplyAirFanObjectType, false).get());
+  EXPECT_EQ(fan.nameString(), idf_term.getString(ZoneHVAC_TerminalUnit_VariableRefrigerantFlowFields::SupplyAirFanObjectName, false).get());
+  EXPECT_EQ("Coil:Cooling:DX:VariableRefrigerantFlow:FluidTemperatureControl",
+            idf_term.getString(ZoneHVAC_TerminalUnit_VariableRefrigerantFlowFields::CoolingCoilObjectType, false).get());
+  EXPECT_EQ(coolingCoil.nameString(), idf_term.getString(ZoneHVAC_TerminalUnit_VariableRefrigerantFlowFields::CoolingCoilObjectName, false).get());
+  EXPECT_EQ("Coil:Heating:DX:VariableRefrigerantFlow:FluidTemperatureControl",
+            idf_term.getString(ZoneHVAC_TerminalUnit_VariableRefrigerantFlowFields::HeatingCoilObjectType, false).get());
+  EXPECT_EQ(heatingCoil.nameString(), idf_term.getString(ZoneHVAC_TerminalUnit_VariableRefrigerantFlowFields::HeatingCoilObjectName, false).get());
+
+  IdfObject idf_cool = workspace.getObjectsByType(IddObjectType::Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControl)[0];
+  EXPECT_EQ(scheduleConstant.nameString(),
+            idf_cool.getString(Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::AvailabilityScheduleName, false).get());
+  EXPECT_EQ("Zone HVAC Terminal Unit Variable Refrigerant Flow 1 Mixer Outlet Node",
+            idf_cool.getString(Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::CoilAirInletNode, false).get());
+  EXPECT_EQ("Zone HVAC Terminal Unit Variable Refrigerant Flow 1 Cooling Coil Outlet Node",
+            idf_cool.getString(Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::CoilAirOutletNode, false).get());
+  EXPECT_EQ(10, idf_cool.getDouble(Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::RatedTotalCoolingCapacity, false).get());
+  EXPECT_EQ(20, idf_cool.getDouble(Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::RatedSensibleHeatRatio, false).get());
+  EXPECT_EQ(30,
+            idf_cool.getDouble(Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::IndoorUnitReferenceSuperheating, false).get());
+  EXPECT_EQ(
+    curve4.nameString(),
+    idf_cool
+      .getString(
+        Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::IndoorUnitEvaporatingTemperatureFunctionofSuperheatingCurveName, false)
+      .get());
+
+  IdfObject idf_heat = workspace.getObjectsByType(IddObjectType::Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControl)[0];
+  EXPECT_EQ(scheduleConstant.nameString(),
+            idf_heat.getString(Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::AvailabilitySchedule, false).get());
+  EXPECT_EQ("Zone HVAC Terminal Unit Variable Refrigerant Flow 1 Cooling Coil Outlet Node",
+            idf_heat.getString(Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::CoilAirInletNode, false).get());
+  EXPECT_EQ("Zone HVAC Terminal Unit Variable Refrigerant Flow 1 Heating Coil Outlet Node",
+            idf_heat.getString(Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::CoilAirOutletNode, false).get());
+  EXPECT_EQ(40, idf_heat.getDouble(Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::RatedTotalHeatingCapacity, false).get());
+  EXPECT_EQ(50,
+            idf_heat.getDouble(Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::IndoorUnitReferenceSubcooling, false).get());
+  EXPECT_EQ(
+    curve5.nameString(),
+    idf_heat
+      .getString(Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::IndoorUnitCondensingTemperatureFunctionofSubcoolingCurveName,
+                 false)
+      .get());
+}
+
+TEST_F(EnergyPlusFixture, ForwardTranslator_AirConditionerVariableRefrigerantFlowFluidTemperatureControl_NoTerminals) {
+  Model model;
+  AirConditionerVariableRefrigerantFlowFluidTemperatureControl vrf(model);
+
+  ForwardTranslator ft;
+  Workspace workspace = ft.translateModel(model);
+
+  EXPECT_EQ(0u, workspace.getObjectsByType(IddObjectType::AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl).size());
+  EXPECT_EQ(0u, workspace.getObjectsByType(IddObjectType::ZoneHVAC_TerminalUnit_VariableRefrigerantFlow).size());
+  EXPECT_EQ(6u, workspace.getObjectsByType(IddObjectType::Curve_Biquadratic).size());
+  EXPECT_EQ(0u, workspace.getObjectsByType(IddObjectType::Curve_Cubic).size());
+  EXPECT_EQ(0u, workspace.getObjectsByType(IddObjectType::Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControl).size());
+  EXPECT_EQ(0u, workspace.getObjectsByType(IddObjectType::Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControl).size());
+  EXPECT_EQ(0u, workspace.getObjectsByType(IddObjectType::Fan_VariableVolume).size());
+
+  ASSERT_EQ(1, ft.warnings().size());
+  EXPECT_NE(std::string::npos, ft.warnings().front().logMessage().find("will not be translated as it has no terminals"));
+  EXPECT_EQ(0, workspace.getObjectsByType(IddObjectType::AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl).size());
+
+  ZoneHVACTerminalUnitVariableRefrigerantFlow term(model, true);
+  EXPECT_TRUE(vrf.addTerminal(term));
+  workspace = ft.translateModel(model);
+
+  EXPECT_EQ(0, ft.errors().size());
+  EXPECT_EQ(1, workspace.getObjectsByType(IddObjectType::AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl).size());
+}
diff --git a/src/energyplus/Test/AirConditionerVariableRefrigerantFlow_GTest.cpp b/src/energyplus/Test/AirConditionerVariableRefrigerantFlow_GTest.cpp
index 745376cd458..ba5cd8b7973 100644
--- a/src/energyplus/Test/AirConditionerVariableRefrigerantFlow_GTest.cpp
+++ b/src/energyplus/Test/AirConditionerVariableRefrigerantFlow_GTest.cpp
@@ -35,6 +35,7 @@
 
 #include "../../model/Model.hpp"
 #include "../../model/AirConditionerVariableRefrigerantFlow.hpp"
+#include "../../model/ZoneHVACTerminalUnitVariableRefrigerantFlow.hpp"
 #include "../../model/PlantLoop.hpp"
 #include "../../model/Node.hpp"
 
@@ -49,7 +50,7 @@ using namespace openstudio::energyplus;
 using namespace openstudio::model;
 using namespace openstudio;
 
-TEST_F(EnergyPlusFixture, ForwardTranslatorAirConditionerVariableRefrigerantFlow_harcodedCondenserType) {
+TEST_F(EnergyPlusFixture, ForwardTranslator_AirConditionerVariableRefrigerantFlow_harcodedCondenserType) {
 
   // Lambda to dry up code
   auto translateAndCheckOneVRFAndCondenserType = [](const Model& m, const std::string& expectedCondenserType, unsigned expectedNumberOfErrors) {
@@ -78,6 +79,10 @@ TEST_F(EnergyPlusFixture, ForwardTranslatorAirConditionerVariableRefrigerantFlow
       AirConditionerVariableRefrigerantFlow vrf(m);
       vrf.setCondenserType(condenserType);
 
+      // need at least one terminal
+      auto vrfTerminal = ZoneHVACTerminalUnitVariableRefrigerantFlow(m, false);
+      EXPECT_TRUE(vrf.addTerminal(vrfTerminal));
+
       if (hasPlantLoop) {
         PlantLoop p(m);
         EXPECT_TRUE(p.addDemandBranchForComponent(vrf));
@@ -101,6 +106,9 @@ TEST_F(EnergyPlusFixture, ForwardTranslatorAirConditionerVariableRefrigerantFlow
     AirConditionerVariableRefrigerantFlow vrf(m);
     vrf.setCondenserType(condenserType);
 
+    auto vrfTerminal = ZoneHVACTerminalUnitVariableRefrigerantFlow(m, false);
+    EXPECT_TRUE(vrf.addTerminal(vrfTerminal));
+
     if (hasPlantLoop) {
       PlantLoop p(m);
       EXPECT_TRUE(p.addDemandBranchForComponent(vrf));
@@ -115,7 +123,7 @@ TEST_F(EnergyPlusFixture, ForwardTranslatorAirConditionerVariableRefrigerantFlow
   }
 }
 
-TEST_F(EnergyPlusFixture, ForwardTranslatorAirConditionerVariableRefrigerantFlow_defaultedCondenserType) {
+TEST_F(EnergyPlusFixture, ForwardTranslator_AirConditionerVariableRefrigerantFlow_defaultedCondenserType) {
 
   ForwardTranslator ft;
 
@@ -128,6 +136,9 @@ TEST_F(EnergyPlusFixture, ForwardTranslatorAirConditionerVariableRefrigerantFlow
     EXPECT_TRUE(vrf.isCondenserTypeDefaulted());
     EXPECT_EQ("AirCooled", vrf.condenserType());
 
+    auto vrfTerminal = ZoneHVACTerminalUnitVariableRefrigerantFlow(m, false);
+    EXPECT_TRUE(vrf.addTerminal(vrfTerminal));
+
     // Translate
     Workspace w = ft.translateModel(m);
 
@@ -147,6 +158,10 @@ TEST_F(EnergyPlusFixture, ForwardTranslatorAirConditionerVariableRefrigerantFlow
     Model m;
     AirConditionerVariableRefrigerantFlow vrf(m);
     vrf.resetCondenserType();
+
+    auto vrfTerminal = ZoneHVACTerminalUnitVariableRefrigerantFlow(m, false);
+    EXPECT_TRUE(vrf.addTerminal(vrfTerminal));
+
     PlantLoop p(m);
     EXPECT_TRUE(p.addDemandBranchForComponent(vrf));
 
@@ -167,3 +182,30 @@ TEST_F(EnergyPlusFixture, ForwardTranslatorAirConditionerVariableRefrigerantFlow
     EXPECT_EQ(i_vrf.getString(AirConditioner_VariableRefrigerantFlowFields::CondenserType).get(), "WaterCooled");
   }
 }
+
+TEST_F(EnergyPlusFixture, ForwardTranslator_AirConditionerVariableRefrigerantFlow_NoTerminals) {
+  Model model;
+  AirConditionerVariableRefrigerantFlow vrf(model);
+
+  ForwardTranslator ft;
+  Workspace workspace = ft.translateModel(model);
+
+  EXPECT_EQ(0u, workspace.getObjectsByType(IddObjectType::AirConditioner_VariableRefrigerantFlow).size());
+  EXPECT_EQ(0u, workspace.getObjectsByType(IddObjectType::ZoneHVAC_TerminalUnit_VariableRefrigerantFlow).size());
+  EXPECT_EQ(9u, workspace.getObjectsByType(IddObjectType::Curve_Biquadratic).size());
+  EXPECT_EQ(11u, workspace.getObjectsByType(IddObjectType::Curve_Cubic).size());
+  EXPECT_EQ(0u, workspace.getObjectsByType(IddObjectType::Coil_Cooling_DX_VariableRefrigerantFlow).size());
+  EXPECT_EQ(0u, workspace.getObjectsByType(IddObjectType::Coil_Heating_DX_VariableRefrigerantFlow).size());
+  EXPECT_EQ(0u, workspace.getObjectsByType(IddObjectType::Fan_VariableVolume).size());
+
+  ASSERT_EQ(1, ft.warnings().size());
+  EXPECT_NE(std::string::npos, ft.warnings().front().logMessage().find("will not be translated as it has no terminals"));
+  EXPECT_EQ(0, workspace.getObjectsByType(IddObjectType::AirConditioner_VariableRefrigerantFlow).size());
+
+  ZoneHVACTerminalUnitVariableRefrigerantFlow term(model);
+  EXPECT_TRUE(vrf.addTerminal(term));
+  workspace = ft.translateModel(model);
+
+  EXPECT_EQ(0, ft.errors().size());
+  EXPECT_EQ(1, workspace.getObjectsByType(IddObjectType::AirConditioner_VariableRefrigerantFlow).size());
+}
diff --git a/src/model/AirConditionerVariableRefrigerantFlow.cpp b/src/model/AirConditionerVariableRefrigerantFlow.cpp
index 1cffc65e843..ed31f4b2fa6 100644
--- a/src/model/AirConditionerVariableRefrigerantFlow.cpp
+++ b/src/model/AirConditionerVariableRefrigerantFlow.cpp
@@ -1479,8 +1479,12 @@ namespace model {
       return setPointer(OS_AirConditioner_VariableRefrigerantFlowFields::ZoneTerminalUnitList, modelObjectList.handle());
     }
 
-    void AirConditionerVariableRefrigerantFlow_Impl::addTerminal(ZoneHVACTerminalUnitVariableRefrigerantFlow& vrf) {
-      vrfModelObjectList().addModelObject(vrf);
+    bool AirConditionerVariableRefrigerantFlow_Impl::addTerminal(ZoneHVACTerminalUnitVariableRefrigerantFlow& vrf) {
+      if (vrf.isFluidTemperatureControl()) {
+        LOG(Warn, "For " << briefDescription() << ", cannot add a terminal that uses FluidTemperatureControl coils: " << vrf.briefDescription());
+        return false;
+      }
+      return vrfModelObjectList().addModelObject(vrf);
     }
 
     void AirConditionerVariableRefrigerantFlow_Impl::removeTerminal(ZoneHVACTerminalUnitVariableRefrigerantFlow& vrf) {
@@ -1639,274 +1643,12 @@ namespace model {
       ModelObjectList modelObjectList(model);
       airConditionerClone.getImpl<detail::AirConditionerVariableRefrigerantFlow_Impl>()->setVRFModelObjectList(modelObjectList);
 
-      if (auto curve = coolingCapacityRatioModifierFunctionofLowTemperatureCurve()) {
-        auto clone = curve->clone(model).cast<Curve>();
-        airConditionerClone.setCoolingCapacityRatioModifierFunctionofLowTemperatureCurve(clone);
-      }
-
-      if (auto curve = coolingCapacityRatioBoundaryCurve()) {
-        auto clone = curve->clone(model).cast<Curve>();
-        airConditionerClone.setCoolingCapacityRatioBoundaryCurve(clone);
-      }
-
-      if (auto curve = coolingCapacityRatioModifierFunctionofHighTemperatureCurve()) {
-        auto clone = curve->clone(model).cast<Curve>();
-        airConditionerClone.setCoolingCapacityRatioModifierFunctionofHighTemperatureCurve(clone);
-      }
-
-      if (auto curve = coolingEnergyInputRatioModifierFunctionofLowTemperatureCurve()) {
-        auto clone = curve->clone(model).cast<Curve>();
-        airConditionerClone.setCoolingEnergyInputRatioModifierFunctionofLowTemperatureCurve(clone);
-      }
-
-      if (auto curve = coolingEnergyInputRatioBoundaryCurve()) {
-        auto clone = curve->clone(model).cast<Curve>();
-        airConditionerClone.setCoolingEnergyInputRatioBoundaryCurve(clone);
-      }
-
-      if (auto curve = coolingEnergyInputRatioModifierFunctionofHighTemperatureCurve()) {
-        auto clone = curve->clone(model).cast<Curve>();
-        airConditionerClone.setCoolingEnergyInputRatioModifierFunctionofHighTemperatureCurve(clone);
-      }
-
-      if (auto curve = coolingEnergyInputRatioModifierFunctionofLowPartLoadRatioCurve()) {
-        auto clone = curve->clone(model).cast<Curve>();
-        airConditionerClone.setCoolingEnergyInputRatioModifierFunctionofLowPartLoadRatioCurve(clone);
-      }
-
-      if (auto curve = coolingEnergyInputRatioModifierFunctionofHighPartLoadRatioCurve()) {
-        auto clone = curve->clone(model).cast<Curve>();
-        airConditionerClone.setCoolingEnergyInputRatioModifierFunctionofHighPartLoadRatioCurve(clone);
-      }
-
-      if (auto curve = coolingCombinationRatioCorrectionFactorCurve()) {
-        auto clone = curve->clone(model).cast<Curve>();
-        airConditionerClone.setCoolingCombinationRatioCorrectionFactorCurve(clone);
-      }
-
-      if (auto curve = coolingPartLoadFractionCorrelationCurve()) {
-        auto clone = curve->clone(model).cast<Curve>();
-        airConditionerClone.setCoolingPartLoadFractionCorrelationCurve(clone);
-      }
-
-      if (auto curve = heatingCapacityRatioModifierFunctionofLowTemperatureCurve()) {
-        auto clone = curve->clone(model).cast<Curve>();
-        airConditionerClone.setHeatingCapacityRatioModifierFunctionofLowTemperatureCurve(clone);
-      }
-
-      if (auto curve = heatingCapacityRatioBoundaryCurve()) {
-        auto clone = curve->clone(model).cast<Curve>();
-        airConditionerClone.setHeatingCapacityRatioBoundaryCurve(clone);
-      }
-
-      if (auto curve = heatingCapacityRatioModifierFunctionofHighTemperatureCurve()) {
-        auto clone = curve->clone(model).cast<Curve>();
-        airConditionerClone.setHeatingCapacityRatioModifierFunctionofHighTemperatureCurve(clone);
-      }
-
-      if (auto curve = heatingEnergyInputRatioModifierFunctionofLowTemperatureCurve()) {
-        auto clone = curve->clone(model).cast<Curve>();
-        airConditionerClone.setHeatingEnergyInputRatioModifierFunctionofLowTemperatureCurve(clone);
-      }
-
-      if (auto curve = heatingEnergyInputRatioBoundaryCurve()) {
-        auto clone = curve->clone(model).cast<Curve>();
-        airConditionerClone.setHeatingEnergyInputRatioBoundaryCurve(clone);
-      }
-
-      if (auto curve = heatingEnergyInputRatioModifierFunctionofHighTemperatureCurve()) {
-        auto clone = curve->clone(model).cast<Curve>();
-        airConditionerClone.setHeatingEnergyInputRatioModifierFunctionofHighTemperatureCurve(clone);
-      }
-
-      if (auto curve = heatingEnergyInputRatioModifierFunctionofLowPartLoadRatioCurve()) {
-        auto clone = curve->clone(model).cast<Curve>();
-        airConditionerClone.setHeatingEnergyInputRatioModifierFunctionofLowPartLoadRatioCurve(clone);
-      }
-
-      if (auto curve = heatingEnergyInputRatioModifierFunctionofHighPartLoadRatioCurve()) {
-        auto clone = curve->clone(model).cast<Curve>();
-        airConditionerClone.setHeatingEnergyInputRatioModifierFunctionofHighPartLoadRatioCurve(clone);
-      }
-
-      if (auto curve = heatingCombinationRatioCorrectionFactorCurve()) {
-        auto clone = curve->clone(model).cast<Curve>();
-        airConditionerClone.setHeatingCombinationRatioCorrectionFactorCurve(clone);
-      }
-
-      if (auto curve = heatingPartLoadFractionCorrelationCurve()) {
-        auto clone = curve->clone(model).cast<Curve>();
-        airConditionerClone.setHeatingPartLoadFractionCorrelationCurve(clone);
-      }
-
-      if (auto curve = pipingCorrectionFactorforLengthinCoolingModeCurve()) {
-        auto clone = curve->clone(model).cast<Curve>();
-        airConditionerClone.setPipingCorrectionFactorforLengthinCoolingModeCurve(clone);
-      }
-
-      if (auto curve = pipingCorrectionFactorforLengthinHeatingModeCurve()) {
-        auto clone = curve->clone(model).cast<Curve>();
-        airConditionerClone.setPipingCorrectionFactorforLengthinHeatingModeCurve(clone);
-      }
-
-      if (auto curve = heatRecoveryCoolingCapacityModifierCurve()) {
-        auto clone = curve->clone(model).cast<Curve>();
-        airConditionerClone.setHeatRecoveryCoolingCapacityModifierCurve(clone);
-      }
-
-      if (auto curve = heatRecoveryCoolingEnergyModifierCurve()) {
-        auto clone = curve->clone(model).cast<Curve>();
-        airConditionerClone.setHeatRecoveryCoolingEnergyModifierCurve(clone);
-      }
-
-      if (auto curve = heatRecoveryHeatingCapacityModifierCurve()) {
-        auto clone = curve->clone(model).cast<Curve>();
-        airConditionerClone.setHeatRecoveryHeatingCapacityModifierCurve(clone);
-      }
-
-      if (auto curve = heatRecoveryHeatingEnergyModifierCurve()) {
-        auto clone = curve->clone(model).cast<Curve>();
-        airConditionerClone.setHeatRecoveryHeatingEnergyModifierCurve(clone);
-      }
-
       return airConditionerClone;
     }
 
     std::vector<openstudio::IdfObject> AirConditionerVariableRefrigerantFlow_Impl::remove() {
       vrfModelObjectList().remove();
 
-      boost::optional<Curve> curve;
-
-      curve = coolingCapacityRatioModifierFunctionofLowTemperatureCurve();
-      if (curve) {
-        curve->remove();
-      }
-
-      curve = coolingCapacityRatioBoundaryCurve();
-      if (curve) {
-        curve->remove();
-      }
-
-      curve = coolingCapacityRatioModifierFunctionofHighTemperatureCurve();
-      if (curve) {
-        curve->remove();
-      }
-
-      curve = coolingEnergyInputRatioModifierFunctionofLowTemperatureCurve();
-      if (curve) {
-        curve->remove();
-      }
-
-      curve = coolingEnergyInputRatioBoundaryCurve();
-      if (curve) {
-        curve->remove();
-      }
-
-      curve = coolingEnergyInputRatioModifierFunctionofHighTemperatureCurve();
-      if (curve) {
-        curve->remove();
-      }
-
-      curve = coolingEnergyInputRatioModifierFunctionofLowPartLoadRatioCurve();
-      if (curve) {
-        curve->remove();
-      }
-
-      curve = coolingEnergyInputRatioModifierFunctionofHighPartLoadRatioCurve();
-      if (curve) {
-        curve->remove();
-      }
-
-      curve = coolingCombinationRatioCorrectionFactorCurve();
-      if (curve) {
-        curve->remove();
-      }
-
-      curve = coolingPartLoadFractionCorrelationCurve();
-      if (curve) {
-        curve->remove();
-      }
-
-      curve = heatingCapacityRatioModifierFunctionofLowTemperatureCurve();
-      if (curve) {
-        curve->remove();
-      }
-
-      curve = heatingCapacityRatioBoundaryCurve();
-      if (curve) {
-        curve->remove();
-      }
-
-      curve = heatingCapacityRatioModifierFunctionofHighTemperatureCurve();
-      if (curve) {
-        curve->remove();
-      }
-
-      curve = heatingEnergyInputRatioModifierFunctionofLowTemperatureCurve();
-      if (curve) {
-        curve->remove();
-      }
-
-      curve = heatingEnergyInputRatioBoundaryCurve();
-      if (curve) {
-        curve->remove();
-      }
-
-      curve = heatingEnergyInputRatioModifierFunctionofHighTemperatureCurve();
-      if (curve) {
-        curve->remove();
-      }
-
-      curve = heatingEnergyInputRatioModifierFunctionofLowPartLoadRatioCurve();
-      if (curve) {
-        curve->remove();
-      }
-
-      curve = heatingEnergyInputRatioModifierFunctionofHighPartLoadRatioCurve();
-      if (curve) {
-        curve->remove();
-      }
-
-      curve = heatingCombinationRatioCorrectionFactorCurve();
-      if (curve) {
-        curve->remove();
-      }
-
-      curve = heatingPartLoadFractionCorrelationCurve();
-      if (curve) {
-        curve->remove();
-      }
-
-      curve = pipingCorrectionFactorforLengthinCoolingModeCurve();
-      if (curve) {
-        curve->remove();
-      }
-
-      curve = pipingCorrectionFactorforLengthinCoolingModeCurve();
-      if (curve) {
-        curve->remove();
-      }
-
-      curve = heatRecoveryCoolingCapacityModifierCurve();
-      if (curve) {
-        curve->remove();
-      }
-
-      curve = heatRecoveryCoolingEnergyModifierCurve();
-      if (curve) {
-        curve->remove();
-      }
-
-      curve = heatRecoveryHeatingCapacityModifierCurve();
-      if (curve) {
-        curve->remove();
-      }
-
-      curve = heatRecoveryHeatingEnergyModifierCurve();
-      if (curve) {
-        curve->remove();
-      }
-
       return StraightComponent_Impl::remove();
     }
 
@@ -3175,8 +2917,8 @@ namespace model {
       heatRecoveryHeatingEnergyTimeConstant);
   }
 
-  void AirConditionerVariableRefrigerantFlow::addTerminal(ZoneHVACTerminalUnitVariableRefrigerantFlow& vrf) {
-    getImpl<detail::AirConditionerVariableRefrigerantFlow_Impl>()->addTerminal(vrf);
+  bool AirConditionerVariableRefrigerantFlow::addTerminal(ZoneHVACTerminalUnitVariableRefrigerantFlow& vrf) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlow_Impl>()->addTerminal(vrf);
   }
 
   void AirConditionerVariableRefrigerantFlow::removeTerminal(ZoneHVACTerminalUnitVariableRefrigerantFlow& vrf) {
diff --git a/src/model/AirConditionerVariableRefrigerantFlow.hpp b/src/model/AirConditionerVariableRefrigerantFlow.hpp
index 17d28bc8532..488a458e16e 100644
--- a/src/model/AirConditionerVariableRefrigerantFlow.hpp
+++ b/src/model/AirConditionerVariableRefrigerantFlow.hpp
@@ -477,7 +477,7 @@ namespace model {
 
     bool setHeatRecoveryHeatingEnergyTimeConstant(double heatRecoveryHeatingEnergyTimeConstant);
 
-    void addTerminal(ZoneHVACTerminalUnitVariableRefrigerantFlow& vrf);
+    bool addTerminal(ZoneHVACTerminalUnitVariableRefrigerantFlow& vrf);
 
     void removeTerminal(ZoneHVACTerminalUnitVariableRefrigerantFlow& vrf);
 
diff --git a/src/model/AirConditionerVariableRefrigerantFlowFluidTemperatureControl.cpp b/src/model/AirConditionerVariableRefrigerantFlowFluidTemperatureControl.cpp
new file mode 100644
index 00000000000..b1f7b7a93ac
--- /dev/null
+++ b/src/model/AirConditionerVariableRefrigerantFlowFluidTemperatureControl.cpp
@@ -0,0 +1,1621 @@
+/***********************************************************************************************************************
+*  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 "AirConditionerVariableRefrigerantFlowFluidTemperatureControl.hpp"
+#include "AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl.hpp"
+#include "LoadingIndex.hpp"
+#include "LoadingIndex_Impl.hpp"
+#include "ModelObjectList.hpp"
+#include "ModelObjectList_Impl.hpp"
+
+#include "ZoneHVACTerminalUnitVariableRefrigerantFlow.hpp"
+#include "ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl.hpp"
+#include "Schedule.hpp"
+#include "Schedule_Impl.hpp"
+#include "Curve.hpp"
+#include "Curve_Impl.hpp"
+#include "CurveBiquadratic.hpp"
+#include "CurveBiquadratic_Impl.hpp"
+#include "CurveCubic.hpp"
+#include "CurveCubic_Impl.hpp"
+#include "CurveQuadratic.hpp"
+#include "CurveQuadratic_Impl.hpp"
+#include "ThermalZone.hpp"
+#include "ThermalZone_Impl.hpp"
+#include "Connection.hpp"
+#include "Connection_Impl.hpp"
+#include "Model.hpp"
+#include "Model_Impl.hpp"
+#include "Node.hpp"
+#include "Node_Impl.hpp"
+#include "PlantLoop.hpp"
+#include "PlantLoop_Impl.hpp"
+#include "ScheduleTypeLimits.hpp"
+#include "ScheduleTypeRegistry.hpp"
+
+#include "../utilities/core/Assert.hpp"
+
+#include <utilities/idd/IddFactory.hxx>
+#include <utilities/idd/IddEnums.hxx>
+#include <utilities/idd/OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_FieldEnums.hxx>
+
+#include <algorithm>
+#include <vector>
+
+namespace openstudio {
+namespace model {
+
+  namespace detail {
+
+    AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl(
+      const IdfObject& idfObject, Model_Impl* model, bool keepHandle)
+      : HVACComponent_Impl(idfObject, model, keepHandle) {
+      OS_ASSERT(idfObject.iddObject().type() == AirConditionerVariableRefrigerantFlowFluidTemperatureControl::iddObjectType());
+    }
+
+    AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl(
+      const openstudio::detail::WorkspaceObject_Impl& other, Model_Impl* model, bool keepHandle)
+      : HVACComponent_Impl(other, model, keepHandle) {
+      OS_ASSERT(other.iddObject().type() == AirConditionerVariableRefrigerantFlowFluidTemperatureControl::iddObjectType());
+    }
+
+    AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl(
+      const AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl& other, Model_Impl* model, bool keepHandle)
+      : HVACComponent_Impl(other, model, keepHandle) {}
+
+    const std::vector<std::string>& AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::outputVariableNames() const {
+      static const std::vector<std::string> result{"VRF Heat Pump Total Cooling Rate",
+                                                   "VRF Heat Pump Total Heating Rate",
+                                                   "VRF Heat Pump Cooling Electricity Rate",
+                                                   "VRF Heat Pump Cooling Electricity Energy",
+                                                   "VRF Heat Pump Heating Electricity Rate",
+                                                   "VRF Heat Pump Heating Electricity Energy",
+                                                   "VRF Heat Pump Cooling COP",
+                                                   "VRF Heat Pump Heating COP",
+                                                   "VRF Heat Pump COP",
+                                                   "VRF Heat Pump Compressor Electricity Rate",
+                                                   "VRF Heat Pump Outdoor Unit Fan Power",
+                                                   "VRF Heat Pump Compressor Rotating Speed",
+                                                   "VRF Heat Pump Indoor Unit Evaporating Temperature",
+                                                   "VRF Heat Pump Outdoor Unit Condensing Temperature",
+                                                   "VRF Heat Pump Indoor Unit Condensing Temperature",
+                                                   "VRF Heat Pump Outdoor Unit Evaporating Temperature",
+                                                   "VRF Heat Pump Cooling Capacity at Max Compressor Speed",
+                                                   "VRF Heat Pump Heating Capacity at Max Compressor Speed",
+                                                   "VRF Heat Pump Indoor Unit Piping Correction for Cooling",
+                                                   "VRF Heat Pump Indoor Unit Piping Correction for Heating",
+                                                   "VRF Heat Pump Outdoor Unit Evaporator Heat Extract Rate",
+                                                   "VRF Heat Pump Outdoor Unit Condenser Heat Release Rate",
+                                                   "VRF Heat Pump Defrost Electricity Rate",
+                                                   "VRF Heat Pump Defrost Electricity Energy",
+                                                   "VRF Heat Pump Part Load Ratio",
+                                                   "VRF Heat Pump Runtime Fraction",
+                                                   "VRF Heat Pump Cycling Ratio",
+                                                   "VRF Heat Pump Operating Mode",
+                                                   "VRF Heat Pump Condenser Inlet Temperature",
+                                                   "VRF Heat Pump Crankcase Heater Electricity Rate",
+                                                   "VRF Heat Pump Crankcase Heater Electricity Energy",
+                                                   "VRF Heat Pump Terminal Unit Cooling Load Rate",
+                                                   "VRF Heat Pump Terminal Unit Heating Load Rate"};
+      return result;
+    }
+
+    IddObjectType AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::iddObjectType() const {
+      return AirConditionerVariableRefrigerantFlowFluidTemperatureControl::iddObjectType();
+    }
+
+    std::vector<ScheduleTypeKey>
+      AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::getScheduleTypeKeys(const Schedule& schedule) const {
+      std::vector<ScheduleTypeKey> result;
+      UnsignedVector fieldIndices = getSourceIndices(schedule.handle());
+      if (std::find(fieldIndices.cbegin(), fieldIndices.cend(),
+                    OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::AvailabilitySchedule)
+          != fieldIndices.cend()) {
+        result.emplace_back("AirConditionerVariableRefrigerantFlowFluidTemperatureControl", "Availability Schedule");
+      }
+      return result;
+    }
+
+    ModelObject AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::clone(Model model) const {
+      auto airConditionerClone = HVACComponent_Impl::clone(model).cast<AirConditionerVariableRefrigerantFlowFluidTemperatureControl>();
+
+      ModelObjectList vrfModelObjectList(model);
+      airConditionerClone.getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->setVRFModelObjectList(
+        vrfModelObjectList);
+
+      // This will clone each LoadingIndex too
+      ModelObjectList loadingIndexListClone = this->loadingIndexList().clone(model).cast<ModelObjectList>();
+      airConditionerClone.getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->setLoadingIndexList(
+        loadingIndexListClone);
+
+      return airConditionerClone;
+    }
+
+    std::vector<openstudio::IdfObject> AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::remove() {
+      vrfModelObjectList().remove();
+      loadingIndexList().remove();
+
+      return HVACComponent_Impl::remove();
+    }
+
+    std::vector<ModelObject> AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::children() const {
+      std::vector<ModelObject> result;
+
+      std::vector<ModelObject> loadings;
+      // children() is called during remove(), except we already trashed the moList...
+      if (auto moList_ = optionalLoadingIndexList()) {
+        loadings = moList_->modelObjects();
+      }
+      result.reserve(loadings.size() + 3);
+
+      result.push_back(outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve());
+      result.push_back(outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve());
+
+      boost::optional<ModelObject> curve;
+      curve = defrostEnergyInputRatioModifierFunctionofTemperatureCurve();
+      if (curve) {
+        result.push_back(curve.get());
+      }
+
+      for (auto&& loadingIndex : loadings) {
+        result.emplace_back(std::move(loadingIndex));
+      }
+
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::addToNode(Node& node) {
+      // Only accept the demand side of a PlantLoop
+      if (boost::optional<PlantLoop> plant = node.plantLoop()) {
+        if (plant->demandComponent(node.handle())) {
+          return HVACComponent_Impl::addToNode(node);
+        }
+      }
+
+      return false;
+    }
+
+    void AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::autosize() {
+      autosizeRatedEvaporativeCapacity();
+      autosizeResistiveDefrostHeaterCapacity();
+    }
+
+    void AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::applySizingValues() {
+      boost::optional<double> val;
+      val = autosizedRatedEvaporativeCapacity();
+      if (val) {
+        setRatedEvaporativeCapacity(val.get());
+      }
+
+      val = autosizedResistiveDefrostHeaterCapacity();
+      if (val) {
+        setResistiveDefrostHeaterCapacity(val.get());
+      }
+    }
+
+    std::vector<EMSActuatorNames> AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::emsActuatorNames() const {
+      std::vector<EMSActuatorNames> actuators{{"Variable Refrigerant Flow Heat Pump", "Operating Mode"}};
+      return actuators;
+    }
+
+    std::vector<std::string> AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::emsInternalVariableNames() const {
+      std::vector<std::string> types;
+      return types;
+    }
+
+    Schedule AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::availabilitySchedule() const {
+      boost::optional<Schedule> value = optionalAvailabilitySchedule();
+      if (!value) {
+        LOG_AND_THROW(briefDescription() << " does not have an Availability Schedule attached.");
+      }
+      return value.get();
+    }
+
+    std::string AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::refrigerantType() const {
+      boost::optional<std::string> value = getString(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::RefrigerantType, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    boost::optional<double> AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::ratedEvaporativeCapacity() const {
+      return getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::RatedEvaporativeCapacity, true);
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::isRatedEvaporativeCapacityAutosized() const {
+      bool result = false;
+      boost::optional<std::string> value =
+        getString(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::RatedEvaporativeCapacity, true);
+      if (value) {
+        result = openstudio::istringEqual(value.get(), "autosize");
+      }
+      return result;
+    }
+
+    boost::optional<double> AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::autosizedRatedEvaporativeCapacity() {
+      return getAutosizedValue("Design Size Rated Evaporative Capacity", "W");
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::ratedCompressorPowerPerUnitofRatedEvaporativeCapacity() const {
+      boost::optional<double> value = getDouble(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::RatedCompressorPowerPerUnitofRatedEvaporativeCapacity, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::minimumOutdoorAirTemperatureinCoolingMode() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::MinimumOutdoorAirTemperatureinCoolingMode, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::maximumOutdoorAirTemperatureinCoolingMode() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::MaximumOutdoorAirTemperatureinCoolingMode, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::minimumOutdoorAirTemperatureinHeatingMode() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::MinimumOutdoorAirTemperatureinHeatingMode, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::maximumOutdoorAirTemperatureinHeatingMode() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::MaximumOutdoorAirTemperatureinHeatingMode, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::referenceOutdoorUnitSuperheating() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::ReferenceOutdoorUnitSuperheating, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::referenceOutdoorUnitSubcooling() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::ReferenceOutdoorUnitSubcooling, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    std::string AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::refrigerantTemperatureControlAlgorithmforIndoorUnit() const {
+      boost::optional<std::string> value =
+        getString(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::RefrigerantTemperatureControlAlgorithmforIndoorUnit, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::referenceEvaporatingTemperatureforIndoorUnit() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::ReferenceEvaporatingTemperatureforIndoorUnit, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::referenceCondensingTemperatureforIndoorUnit() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::ReferenceCondensingTemperatureforIndoorUnit, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::variableEvaporatingTemperatureMinimumforIndoorUnit() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::VariableEvaporatingTemperatureMinimumforIndoorUnit, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::variableEvaporatingTemperatureMaximumforIndoorUnit() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::VariableEvaporatingTemperatureMaximumforIndoorUnit, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::variableCondensingTemperatureMinimumforIndoorUnit() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::VariableCondensingTemperatureMinimumforIndoorUnit, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::variableCondensingTemperatureMaximumforIndoorUnit() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::VariableCondensingTemperatureMaximumforIndoorUnit, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::outdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity() const {
+      boost::optional<double> value = getDouble(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::OutdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::outdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity() const {
+      boost::optional<double> value = getDouble(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::OutdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    Curve AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve() const {
+      boost::optional<Curve> value = optionalOutdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve();
+      if (!value) {
+        LOG_AND_THROW(briefDescription() << " does not have an Outdoor Unit Evaporating Temperature Function of Superheating Curve attached.");
+      }
+      return value.get();
+    }
+
+    Curve AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve() const {
+      boost::optional<Curve> value = optionalOutdoorUnitCondensingTemperatureFunctionofSubcoolingCurve();
+      if (!value) {
+        LOG_AND_THROW(briefDescription() << " does not have an Outdoor Unit Condensing Temperature Function of Subcooling Curve attached.");
+      }
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::diameterofMainPipeConnectingOutdoorUnittotheFirstBranchJoint() const {
+      boost::optional<double> value = getDouble(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::DiameterofMainPipeConnectingOutdoorUnittotheFirstBranchJoint, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::lengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint() const {
+      boost::optional<double> value = getDouble(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::LengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::equivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint()
+      const {
+      boost::optional<double> value = getDouble(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::EquivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint,
+        true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::heightDifferenceBetweenOutdoorUnitandIndoorUnits() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::HeightDifferenceBetweenOutdoorUnitandIndoorUnits, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::mainPipeInsulationThickness() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::MainPipeInsulationThickness, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::mainPipeInsulationThermalConductivity() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::MainPipeInsulationThermalConductivity, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::crankcaseHeaterPowerperCompressor() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::CrankcaseHeaterPowerperCompressor, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    int AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::numberofCompressors() const {
+      boost::optional<int> value = getInt(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::NumberofCompressors, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::ratioofCompressorSizetoTotalCompressorCapacity() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::RatioofCompressorSizetoTotalCompressorCapacity, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::maximumOutdoorDryBulbTemperatureforCrankcaseHeater() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::MaximumOutdoorDryBulbTemperatureforCrankcaseHeater, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    std::string AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::defrostStrategy() const {
+      boost::optional<std::string> value = getString(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::DefrostStrategy, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    std::string AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::defrostControl() const {
+      boost::optional<std::string> value = getString(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::DefrostControl, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    boost::optional<Curve>
+      AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::defrostEnergyInputRatioModifierFunctionofTemperatureCurve() const {
+      return getObject<ModelObject>().getModelObjectTarget<Curve>(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::DefrostEnergyInputRatioModifierFunctionofTemperatureCurveName);
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::defrostTimePeriodFraction() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::DefrostTimePeriodFraction, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    boost::optional<double> AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::resistiveDefrostHeaterCapacity() const {
+      return getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::ResistiveDefrostHeaterCapacity, true);
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::isResistiveDefrostHeaterCapacityAutosized() const {
+      bool result = false;
+      boost::optional<std::string> value =
+        getString(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::ResistiveDefrostHeaterCapacity, true);
+      if (value) {
+        result = openstudio::istringEqual(value.get(), "autosize");
+      }
+      return result;
+    }
+
+    boost::optional<double> AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::autosizedResistiveDefrostHeaterCapacity() {
+      return getAutosizedValue("Design Size Resistive Defrost Heater Capacity", "");
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::maximumOutdoorDrybulbTemperatureforDefrostOperation() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::MaximumOutdoorDrybulbTemperatureforDefrostOperation, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::compressorMaximumDeltaPressure() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::CompressorMaximumDeltaPressure, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    boost::optional<ModelObjectList> AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::optionalLoadingIndexList() const {
+      return getObject<ModelObject>().getModelObjectTarget<ModelObjectList>(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::LoadingIndexList);
+    }
+
+    ModelObjectList AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::loadingIndexList() const {
+      boost::optional<ModelObjectList> moList_ = optionalLoadingIndexList();
+
+      OS_ASSERT(moList_);
+
+      return moList_.get();
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::addLoadingIndex(LoadingIndex& loadingIndex) {
+      return loadingIndexList().addModelObject(loadingIndex);
+    }
+
+    void AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::removeLoadingIndex(LoadingIndex& loadingIndex) {
+      loadingIndexList().removeModelObject(loadingIndex);
+    }
+
+    void AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::removeAllLoadingIndexes() {
+      loadingIndexList().removeAllModelObjects();
+    }
+
+    std::vector<LoadingIndex> AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::loadingIndexes() const {
+      return subsetCastVector<LoadingIndex>(loadingIndexList().modelObjects());
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setLoadingIndexList(const ModelObjectList& modelObjectList) {
+      return setPointer(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::LoadingIndexList, modelObjectList.handle());
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setAvailabilitySchedule(Schedule& schedule) {
+      bool result = setSchedule(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::AvailabilitySchedule,
+                                "AirConditionerVariableRefrigerantFlowFluidTemperatureControl", "Availability Schedule", schedule);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setRefrigerantType(const std::string& refrigerantType) {
+      bool result = setString(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::RefrigerantType, refrigerantType);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setRatedEvaporativeCapacity(double ratedEvaporativeCapacity) {
+      bool result =
+        setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::RatedEvaporativeCapacity, ratedEvaporativeCapacity);
+      return result;
+    }
+
+    void AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::autosizeRatedEvaporativeCapacity() {
+      bool result = setString(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::RatedEvaporativeCapacity, "autosize");
+      OS_ASSERT(result);
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setRatedCompressorPowerPerUnitofRatedEvaporativeCapacity(
+      double ratedCompressorPowerPerUnitofRatedEvaporativeCapacity) {
+      bool result =
+        setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::RatedCompressorPowerPerUnitofRatedEvaporativeCapacity,
+                  ratedCompressorPowerPerUnitofRatedEvaporativeCapacity);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setMinimumOutdoorAirTemperatureinCoolingMode(
+      double minimumOutdoorAirTemperatureinCoolingMode) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::MinimumOutdoorAirTemperatureinCoolingMode,
+                              minimumOutdoorAirTemperatureinCoolingMode);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setMaximumOutdoorAirTemperatureinCoolingMode(
+      double maximumOutdoorAirTemperatureinCoolingMode) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::MaximumOutdoorAirTemperatureinCoolingMode,
+                              maximumOutdoorAirTemperatureinCoolingMode);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setMinimumOutdoorAirTemperatureinHeatingMode(
+      double minimumOutdoorAirTemperatureinHeatingMode) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::MinimumOutdoorAirTemperatureinHeatingMode,
+                              minimumOutdoorAirTemperatureinHeatingMode);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setMaximumOutdoorAirTemperatureinHeatingMode(
+      double maximumOutdoorAirTemperatureinHeatingMode) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::MaximumOutdoorAirTemperatureinHeatingMode,
+                              maximumOutdoorAirTemperatureinHeatingMode);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setReferenceOutdoorUnitSuperheating(
+      double referenceOutdoorUnitSuperheating) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::ReferenceOutdoorUnitSuperheating,
+                              referenceOutdoorUnitSuperheating);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setReferenceOutdoorUnitSubcooling(double referenceOutdoorUnitSubcooling) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::ReferenceOutdoorUnitSubcooling,
+                              referenceOutdoorUnitSubcooling);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setRefrigerantTemperatureControlAlgorithmforIndoorUnit(
+      const std::string& refrigerantTemperatureControlAlgorithmforIndoorUnit) {
+      bool result =
+        setString(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::RefrigerantTemperatureControlAlgorithmforIndoorUnit,
+                  refrigerantTemperatureControlAlgorithmforIndoorUnit);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setReferenceEvaporatingTemperatureforIndoorUnit(
+      double referenceEvaporatingTemperatureforIndoorUnit) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::ReferenceEvaporatingTemperatureforIndoorUnit,
+                              referenceEvaporatingTemperatureforIndoorUnit);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setReferenceCondensingTemperatureforIndoorUnit(
+      double referenceCondensingTemperatureforIndoorUnit) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::ReferenceCondensingTemperatureforIndoorUnit,
+                              referenceCondensingTemperatureforIndoorUnit);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setVariableEvaporatingTemperatureMinimumforIndoorUnit(
+      double variableEvaporatingTemperatureMinimumforIndoorUnit) {
+      bool result =
+        setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::VariableEvaporatingTemperatureMinimumforIndoorUnit,
+                  variableEvaporatingTemperatureMinimumforIndoorUnit);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setVariableEvaporatingTemperatureMaximumforIndoorUnit(
+      double variableEvaporatingTemperatureMaximumforIndoorUnit) {
+      bool result =
+        setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::VariableEvaporatingTemperatureMaximumforIndoorUnit,
+                  variableEvaporatingTemperatureMaximumforIndoorUnit);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setVariableCondensingTemperatureMinimumforIndoorUnit(
+      double variableCondensingTemperatureMinimumforIndoorUnit) {
+      bool result =
+        setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::VariableCondensingTemperatureMinimumforIndoorUnit,
+                  variableCondensingTemperatureMinimumforIndoorUnit);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setVariableCondensingTemperatureMaximumforIndoorUnit(
+      double variableCondensingTemperatureMaximumforIndoorUnit) {
+      bool result =
+        setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::VariableCondensingTemperatureMaximumforIndoorUnit,
+                  variableCondensingTemperatureMaximumforIndoorUnit);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setOutdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity(
+      double outdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity) {
+      bool result =
+        setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::OutdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity,
+                  outdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setOutdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity(
+      double outdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity) {
+      bool result =
+        setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::OutdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity,
+                  outdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setOutdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve(
+      const Curve& curve) {
+      bool result = setPointer(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::OutdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurveName,
+        curve.handle());
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setOutdoorUnitCondensingTemperatureFunctionofSubcoolingCurve(
+      const Curve& curve) {
+      bool result = setPointer(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::OutdoorUnitCondensingTemperatureFunctionofSubcoolingCurveName,
+        curve.handle());
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setDiameterofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(
+      double diameterofMainPipeConnectingOutdoorUnittotheFirstBranchJoint) {
+      bool result = setDouble(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::DiameterofMainPipeConnectingOutdoorUnittotheFirstBranchJoint,
+        diameterofMainPipeConnectingOutdoorUnittotheFirstBranchJoint);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(
+      double lengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint) {
+      bool result =
+        setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::LengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint,
+                  lengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setEquivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(
+      double equivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint) {
+      bool result = setDouble(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::EquivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint,
+        equivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setHeightDifferenceBetweenOutdoorUnitandIndoorUnits(
+      double heightDifferenceBetweenOutdoorUnitandIndoorUnits) {
+      bool result =
+        setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::HeightDifferenceBetweenOutdoorUnitandIndoorUnits,
+                  heightDifferenceBetweenOutdoorUnitandIndoorUnits);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setMainPipeInsulationThickness(double mainPipeInsulationThickness) {
+      bool result =
+        setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::MainPipeInsulationThickness, mainPipeInsulationThickness);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setMainPipeInsulationThermalConductivity(
+      double mainPipeInsulationThermalConductivity) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::MainPipeInsulationThermalConductivity,
+                              mainPipeInsulationThermalConductivity);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setCrankcaseHeaterPowerperCompressor(
+      double crankcaseHeaterPowerperCompressor) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::CrankcaseHeaterPowerperCompressor,
+                              crankcaseHeaterPowerperCompressor);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setNumberofCompressors(int numberofCompressors) {
+      bool result = setInt(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::NumberofCompressors, numberofCompressors);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setRatioofCompressorSizetoTotalCompressorCapacity(
+      double ratioofCompressorSizetoTotalCompressorCapacity) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::RatioofCompressorSizetoTotalCompressorCapacity,
+                              ratioofCompressorSizetoTotalCompressorCapacity);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setMaximumOutdoorDryBulbTemperatureforCrankcaseHeater(
+      double maximumOutdoorDryBulbTemperatureforCrankcaseHeater) {
+      bool result =
+        setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::MaximumOutdoorDryBulbTemperatureforCrankcaseHeater,
+                  maximumOutdoorDryBulbTemperatureforCrankcaseHeater);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setDefrostStrategy(const std::string& defrostStrategy) {
+      bool result = setString(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::DefrostStrategy, defrostStrategy);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setDefrostControl(const std::string& defrostControl) {
+      bool result = setString(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::DefrostControl, defrostControl);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setDefrostEnergyInputRatioModifierFunctionofTemperatureCurve(
+      const Curve& curve) {
+      bool result = setPointer(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::DefrostEnergyInputRatioModifierFunctionofTemperatureCurveName,
+        curve.handle());
+      return result;
+    }
+
+    void AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::resetDefrostEnergyInputRatioModifierFunctionofTemperatureCurve() {
+      bool result = setString(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::DefrostEnergyInputRatioModifierFunctionofTemperatureCurveName, "");
+      OS_ASSERT(result);
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setDefrostTimePeriodFraction(double defrostTimePeriodFraction) {
+      bool result =
+        setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::DefrostTimePeriodFraction, defrostTimePeriodFraction);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setResistiveDefrostHeaterCapacity(double resistiveDefrostHeaterCapacity) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::ResistiveDefrostHeaterCapacity,
+                              resistiveDefrostHeaterCapacity);
+      return result;
+    }
+
+    void AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::autosizeResistiveDefrostHeaterCapacity() {
+      bool result = setString(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::ResistiveDefrostHeaterCapacity, "autosize");
+      OS_ASSERT(result);
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setMaximumOutdoorDrybulbTemperatureforDefrostOperation(
+      double maximumOutdoorDrybulbTemperatureforDefrostOperation) {
+      bool result =
+        setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::MaximumOutdoorDrybulbTemperatureforDefrostOperation,
+                  maximumOutdoorDrybulbTemperatureforDefrostOperation);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setCompressorMaximumDeltaPressure(double compressorMaximumDeltaPressure) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::CompressorMaximumDeltaPressure,
+                              compressorMaximumDeltaPressure);
+      return result;
+    }
+
+    boost::optional<Curve>
+      AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::optionalOutdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve()
+        const {
+      return getObject<ModelObject>().getModelObjectTarget<Curve>(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::OutdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurveName);
+    }
+
+    boost::optional<Curve>
+      AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::optionalOutdoorUnitCondensingTemperatureFunctionofSubcoolingCurve() const {
+      return getObject<ModelObject>().getModelObjectTarget<Curve>(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::OutdoorUnitCondensingTemperatureFunctionofSubcoolingCurveName);
+    }
+
+    boost::optional<Schedule> AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::optionalAvailabilitySchedule() const {
+      return getObject<ModelObject>().getModelObjectTarget<Schedule>(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::AvailabilitySchedule);
+    }
+
+    ModelObjectList AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::vrfModelObjectList() const {
+      boost::optional<ModelObjectList> mo = getObject<ModelObject>().getModelObjectTarget<ModelObjectList>(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::ZoneTerminalUnitList);
+
+      OS_ASSERT(mo);
+
+      return mo.get();
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::setVRFModelObjectList(const ModelObjectList& modelObjectList) {
+      return setPointer(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::ZoneTerminalUnitList, modelObjectList.handle());
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::addTerminal(ZoneHVACTerminalUnitVariableRefrigerantFlow& vrf) {
+      if (!vrf.isFluidTemperatureControl()) {
+        LOG(Warn, "For " << briefDescription() << ", cannot add a terminal that uses non-FluidTemperatureControl coils: " << vrf.briefDescription());
+        return false;
+      }
+      return vrfModelObjectList().addModelObject(vrf);
+    }
+
+    void AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::removeTerminal(ZoneHVACTerminalUnitVariableRefrigerantFlow& vrf) {
+      vrfModelObjectList().removeModelObject(vrf);
+    }
+
+    void AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::removeAllTerminals() {
+      vrfModelObjectList().removeAllModelObjects();
+    }
+
+    std::vector<ZoneHVACTerminalUnitVariableRefrigerantFlow> AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::terminals() const {
+      return subsetCastVector<ZoneHVACTerminalUnitVariableRefrigerantFlow>(vrfModelObjectList().modelObjects());
+    }
+
+    boost::optional<double> AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::autosizedGrossRatedTotalCoolingCapacity() const {
+      return getAutosizedValue("Design Size Rated Total Cooling Capacity (gross)", "W");
+    }
+
+    boost::optional<double> AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl::autosizedGrossRatedHeatingCapacity() const {
+      return getAutosizedValue("Design Size Rated Total Heating Capacity", "W");
+    }
+
+  }  // namespace detail
+
+  AirConditionerVariableRefrigerantFlowFluidTemperatureControl::AirConditionerVariableRefrigerantFlowFluidTemperatureControl(const Model& model)
+    : HVACComponent(AirConditionerVariableRefrigerantFlowFluidTemperatureControl::iddObjectType(), model) {
+    OS_ASSERT(getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>());
+
+    bool ok = true;
+    Schedule schedule = model.alwaysOnDiscreteSchedule();
+    ok = setAvailabilitySchedule(schedule);
+    OS_ASSERT(ok);
+    ok = setRefrigerantType("R410a");
+    OS_ASSERT(ok);
+    ok = setRatedEvaporativeCapacity(40000);
+    OS_ASSERT(ok);
+    ok = setRatedCompressorPowerPerUnitofRatedEvaporativeCapacity(0.35);
+    OS_ASSERT(ok);
+    ok = setMinimumOutdoorAirTemperatureinCoolingMode(-6.0);
+    OS_ASSERT(ok);
+    ok = setMaximumOutdoorAirTemperatureinCoolingMode(43.0);
+    OS_ASSERT(ok);
+    ok = setMinimumOutdoorAirTemperatureinHeatingMode(-20.0);
+    OS_ASSERT(ok);
+    ok = setMaximumOutdoorAirTemperatureinHeatingMode(16.0);
+    OS_ASSERT(ok);
+    ok = setReferenceOutdoorUnitSuperheating(3);
+    OS_ASSERT(ok);
+    ok = setReferenceOutdoorUnitSubcooling(5);
+    OS_ASSERT(ok);
+    ok = setRefrigerantTemperatureControlAlgorithmforIndoorUnit("VariableTemp");
+    OS_ASSERT(ok);
+    ok = setReferenceEvaporatingTemperatureforIndoorUnit(6.0);
+    OS_ASSERT(ok);
+    ok = setReferenceCondensingTemperatureforIndoorUnit(44.0);
+    OS_ASSERT(ok);
+    ok = setVariableEvaporatingTemperatureMinimumforIndoorUnit(4.0);
+    OS_ASSERT(ok);
+    ok = setVariableEvaporatingTemperatureMaximumforIndoorUnit(13.0);
+    OS_ASSERT(ok);
+    ok = setVariableCondensingTemperatureMinimumforIndoorUnit(42.0);
+    OS_ASSERT(ok);
+    ok = setVariableCondensingTemperatureMaximumforIndoorUnit(46.0);
+    OS_ASSERT(ok);
+    ok = setOutdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity(4.25E-3);
+    OS_ASSERT(ok);
+    ok = setOutdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity(7.50E-5);
+    OS_ASSERT(ok);
+    ok = setDiameterofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(0.0762);
+    OS_ASSERT(ok);
+    ok = setLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(30.0);
+    OS_ASSERT(ok);
+    ok = setEquivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(36.0);
+    OS_ASSERT(ok);
+    ok = setHeightDifferenceBetweenOutdoorUnitandIndoorUnits(5.0);
+    OS_ASSERT(ok);
+    ok = setMainPipeInsulationThickness(0.02);
+    OS_ASSERT(ok);
+    ok = setMainPipeInsulationThermalConductivity(0.032);
+    OS_ASSERT(ok);
+    ok = setCrankcaseHeaterPowerperCompressor(33.0);
+    OS_ASSERT(ok);
+    ok = setNumberofCompressors(2);
+    OS_ASSERT(ok);
+    ok = setRatioofCompressorSizetoTotalCompressorCapacity(0.5);
+    OS_ASSERT(ok);
+    ok = setMaximumOutdoorDryBulbTemperatureforCrankcaseHeater(5.0);
+    OS_ASSERT(ok);
+    ok = setDefrostStrategy("Resistive");
+    OS_ASSERT(ok);
+    ok = setDefrostControl("Timed");
+    OS_ASSERT(ok);
+    ok = setDefrostTimePeriodFraction(0.058333);
+    OS_ASSERT(ok);
+    ok = setResistiveDefrostHeaterCapacity(0.0);
+    OS_ASSERT(ok);
+    ok = setMaximumOutdoorDrybulbTemperatureforDefrostOperation(5.0);
+    OS_ASSERT(ok);
+    ok = setCompressorMaximumDeltaPressure(4500000.0);
+    OS_ASSERT(ok);
+
+    {
+      CurveQuadratic outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve(model);
+      outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve.setName(name().get() + " OUEvapTempCurve");
+      outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve.setCoefficient1Constant(0);
+      outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve.setCoefficient2x(6.05E-1);
+      outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve.setCoefficient3xPOW2(2.50E-2);
+      outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve.setMinimumValueofx(0);
+      outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve.setMaximumValueofx(15);
+      ok = setOutdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve(outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve);
+      OS_ASSERT(ok);
+    }
+
+    {
+      CurveQuadratic outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve(model);
+      outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve.setName(name().get() + " OUCondTempCurve");
+      outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve.setCoefficient1Constant(0);
+      outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve.setCoefficient2x(-2.91);
+      outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve.setCoefficient3xPOW2(1.180);
+      outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve.setMinimumValueofx(0);
+      outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve.setMaximumValueofx(5);
+      ok = setOutdoorUnitCondensingTemperatureFunctionofSubcoolingCurve(outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve);
+      OS_ASSERT(ok);
+    }
+
+    //ok = setDefrostEnergyInputRatioModifierFunctionofTemperatureCurve();
+    //OS_ASSERT(ok);
+
+    {
+      ModelObjectList vrfModelObjectList(model);
+      ok = getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->setVRFModelObjectList(vrfModelObjectList);
+      OS_ASSERT(ok);
+    }
+
+    {
+      ModelObjectList loadingIndexList(model);
+      ok = getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->setLoadingIndexList(loadingIndexList);
+      OS_ASSERT(ok);
+    }
+
+    {
+      CurveBiquadratic evaporativeCapacityMultiplierFunctionofTemperatureCurve1(model);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve1.setName(name().get() + " MinSpdCooling");
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve1.setCoefficient1Constant(3.19E-01);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve1.setCoefficient2x(-1.26E-03);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve1.setCoefficient3xPOW2(-2.15E-05);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve1.setCoefficient4y(1.20E-02);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve1.setCoefficient5yPOW2(1.05E-04);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve1.setCoefficient6xTIMESY(-8.66E-05);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve1.setMinimumValueofx(15);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve1.setMaximumValueofx(65);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve1.setMinimumValueofy(-30);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve1.setMaximumValueofy(15);
+
+      CurveBiquadratic compressorPowerMultiplierFunctionofTemperatureCurve1(model);
+      compressorPowerMultiplierFunctionofTemperatureCurve1.setName(name().get() + " MinSpdPower");
+      compressorPowerMultiplierFunctionofTemperatureCurve1.setCoefficient1Constant(8.79E-02);
+      compressorPowerMultiplierFunctionofTemperatureCurve1.setCoefficient2x(-1.72E-04);
+      compressorPowerMultiplierFunctionofTemperatureCurve1.setCoefficient3xPOW2(6.93E-05);
+      compressorPowerMultiplierFunctionofTemperatureCurve1.setCoefficient4y(-3.38E-05);
+      compressorPowerMultiplierFunctionofTemperatureCurve1.setCoefficient5yPOW2(-8.10E-06);
+      compressorPowerMultiplierFunctionofTemperatureCurve1.setCoefficient6xTIMESY(-1.04E-05);
+      compressorPowerMultiplierFunctionofTemperatureCurve1.setMinimumValueofx(15);
+      compressorPowerMultiplierFunctionofTemperatureCurve1.setMaximumValueofx(65);
+      compressorPowerMultiplierFunctionofTemperatureCurve1.setMinimumValueofy(-30);
+      compressorPowerMultiplierFunctionofTemperatureCurve1.setMaximumValueofy(15);
+
+      LoadingIndex loadingIndex1(model, 1500, evaporativeCapacityMultiplierFunctionofTemperatureCurve1,
+                                 compressorPowerMultiplierFunctionofTemperatureCurve1);
+      OS_ASSERT(addLoadingIndex(loadingIndex1));
+    }
+
+    {
+      CurveBiquadratic evaporativeCapacityMultiplierFunctionofTemperatureCurve2(model);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve2.setName(name().get() + " Spd1Cooling");
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve2.setCoefficient1Constant(8.12E-01);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve2.setCoefficient2x(-4.23E-03);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve2.setCoefficient3xPOW2(-4.11E-05);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve2.setCoefficient4y(2.97E-02);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve2.setCoefficient5yPOW2(2.67E-04);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve2.setCoefficient6xTIMESY(-2.23E-04);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve2.setMinimumValueofx(15);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve2.setMaximumValueofx(65);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve2.setMinimumValueofy(-30);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve2.setMaximumValueofy(15);
+
+      CurveBiquadratic compressorPowerMultiplierFunctionofTemperatureCurve2(model);
+      compressorPowerMultiplierFunctionofTemperatureCurve2.setName(name().get() + " Spd1Power");
+      compressorPowerMultiplierFunctionofTemperatureCurve2.setCoefficient1Constant(3.26E-01);
+      compressorPowerMultiplierFunctionofTemperatureCurve2.setCoefficient2x(-2.20E-03);
+      compressorPowerMultiplierFunctionofTemperatureCurve2.setCoefficient3xPOW2(1.42E-04);
+      compressorPowerMultiplierFunctionofTemperatureCurve2.setCoefficient4y(2.82E-03);
+      compressorPowerMultiplierFunctionofTemperatureCurve2.setCoefficient5yPOW2(2.86E-05);
+      compressorPowerMultiplierFunctionofTemperatureCurve2.setCoefficient6xTIMESY(-3.50E-05);
+      compressorPowerMultiplierFunctionofTemperatureCurve2.setMinimumValueofx(15);
+      compressorPowerMultiplierFunctionofTemperatureCurve2.setMaximumValueofx(65);
+      compressorPowerMultiplierFunctionofTemperatureCurve2.setMinimumValueofy(-30);
+      compressorPowerMultiplierFunctionofTemperatureCurve2.setMaximumValueofy(15);
+
+      LoadingIndex loadingIndex2(model, 3600, evaporativeCapacityMultiplierFunctionofTemperatureCurve2,
+                                 compressorPowerMultiplierFunctionofTemperatureCurve2);
+      OS_ASSERT(addLoadingIndex(loadingIndex2));
+    }
+
+    {
+      CurveBiquadratic evaporativeCapacityMultiplierFunctionofTemperatureCurve3(model);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve3.setName(name().get() + " Spd2Cooling");
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve3.setCoefficient1Constant(1.32E+00);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve3.setCoefficient2x(-6.20E-03);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve3.setCoefficient3xPOW2(-7.10E-05);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve3.setCoefficient4y(4.89E-02);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve3.setCoefficient5yPOW2(4.59E-04);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve3.setCoefficient6xTIMESY(-3.67E-04);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve3.setMinimumValueofx(15);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve3.setMaximumValueofx(65);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve3.setMinimumValueofy(-30);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve3.setMaximumValueofy(15);
+
+      CurveBiquadratic compressorPowerMultiplierFunctionofTemperatureCurve3(model);
+      compressorPowerMultiplierFunctionofTemperatureCurve3.setName(name().get() + " Spd2Power");
+      compressorPowerMultiplierFunctionofTemperatureCurve3.setCoefficient1Constant(6.56E-01);
+      compressorPowerMultiplierFunctionofTemperatureCurve3.setCoefficient2x(-3.71E-03);
+      compressorPowerMultiplierFunctionofTemperatureCurve3.setCoefficient3xPOW2(2.07E-04);
+      compressorPowerMultiplierFunctionofTemperatureCurve3.setCoefficient4y(1.05E-02);
+      compressorPowerMultiplierFunctionofTemperatureCurve3.setCoefficient5yPOW2(7.36E-05);
+      compressorPowerMultiplierFunctionofTemperatureCurve3.setCoefficient6xTIMESY(-1.57E-04);
+      compressorPowerMultiplierFunctionofTemperatureCurve3.setMinimumValueofx(15);
+      compressorPowerMultiplierFunctionofTemperatureCurve3.setMaximumValueofx(65);
+      compressorPowerMultiplierFunctionofTemperatureCurve3.setMinimumValueofy(-30);
+      compressorPowerMultiplierFunctionofTemperatureCurve3.setMaximumValueofy(15);
+
+      LoadingIndex loadingIndex3(model, 6000, evaporativeCapacityMultiplierFunctionofTemperatureCurve3,
+                                 compressorPowerMultiplierFunctionofTemperatureCurve3);
+      OS_ASSERT(addLoadingIndex(loadingIndex3));
+    }
+  }
+
+  IddObjectType AirConditionerVariableRefrigerantFlowFluidTemperatureControl::iddObjectType() {
+    return IddObjectType(IddObjectType::OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl);
+  }
+
+  std::vector<std::string> AirConditionerVariableRefrigerantFlowFluidTemperatureControl::refrigerantTypeValues() {
+    return getIddKeyNames(IddFactory::instance().getObject(iddObjectType()).get(),
+                          OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::RefrigerantType);
+  }
+
+  std::vector<std::string> AirConditionerVariableRefrigerantFlowFluidTemperatureControl::validRefrigerantTypeValues() {
+    return refrigerantTypeValues();
+  }
+
+  std::vector<std::string> AirConditionerVariableRefrigerantFlowFluidTemperatureControl::refrigerantTemperatureControlAlgorithmforIndoorUnitValues() {
+    return getIddKeyNames(
+      IddFactory::instance().getObject(iddObjectType()).get(),
+      OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::RefrigerantTemperatureControlAlgorithmforIndoorUnit);
+  }
+
+  std::vector<std::string>
+    AirConditionerVariableRefrigerantFlowFluidTemperatureControl::validRefrigerantTemperatureControlAlgorithmforIndoorUnitValues() {
+    return refrigerantTemperatureControlAlgorithmforIndoorUnitValues();
+  }
+
+  std::vector<std::string> AirConditionerVariableRefrigerantFlowFluidTemperatureControl::defrostStrategyValues() {
+    return getIddKeyNames(IddFactory::instance().getObject(iddObjectType()).get(),
+                          OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::DefrostStrategy);
+  }
+
+  std::vector<std::string> AirConditionerVariableRefrigerantFlowFluidTemperatureControl::validDefrostStrategyValues() {
+    return defrostStrategyValues();
+  }
+
+  std::vector<std::string> AirConditionerVariableRefrigerantFlowFluidTemperatureControl::defrostControlValues() {
+    return getIddKeyNames(IddFactory::instance().getObject(iddObjectType()).get(),
+                          OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControlFields::DefrostControl);
+  }
+
+  std::vector<std::string> AirConditionerVariableRefrigerantFlowFluidTemperatureControl::validDefrostControlValues() {
+    return defrostControlValues();
+  }
+
+  Schedule AirConditionerVariableRefrigerantFlowFluidTemperatureControl::availabilitySchedule() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->availabilitySchedule();
+  }
+
+  std::string AirConditionerVariableRefrigerantFlowFluidTemperatureControl::refrigerantType() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->refrigerantType();
+  }
+
+  boost::optional<double> AirConditionerVariableRefrigerantFlowFluidTemperatureControl::ratedEvaporativeCapacity() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->ratedEvaporativeCapacity();
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::isRatedEvaporativeCapacityAutosized() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->isRatedEvaporativeCapacityAutosized();
+  }
+
+  boost::optional<double> AirConditionerVariableRefrigerantFlowFluidTemperatureControl::autosizedRatedEvaporativeCapacity() {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->autosizedRatedEvaporativeCapacity();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControl::ratedCompressorPowerPerUnitofRatedEvaporativeCapacity() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()
+      ->ratedCompressorPowerPerUnitofRatedEvaporativeCapacity();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControl::minimumOutdoorAirTemperatureinCoolingMode() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->minimumOutdoorAirTemperatureinCoolingMode();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControl::maximumOutdoorAirTemperatureinCoolingMode() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->maximumOutdoorAirTemperatureinCoolingMode();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControl::minimumOutdoorAirTemperatureinHeatingMode() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->minimumOutdoorAirTemperatureinHeatingMode();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControl::maximumOutdoorAirTemperatureinHeatingMode() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->maximumOutdoorAirTemperatureinHeatingMode();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControl::referenceOutdoorUnitSuperheating() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->referenceOutdoorUnitSuperheating();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControl::referenceOutdoorUnitSubcooling() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->referenceOutdoorUnitSubcooling();
+  }
+
+  std::string AirConditionerVariableRefrigerantFlowFluidTemperatureControl::refrigerantTemperatureControlAlgorithmforIndoorUnit() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()
+      ->refrigerantTemperatureControlAlgorithmforIndoorUnit();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControl::referenceEvaporatingTemperatureforIndoorUnit() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->referenceEvaporatingTemperatureforIndoorUnit();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControl::referenceCondensingTemperatureforIndoorUnit() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->referenceCondensingTemperatureforIndoorUnit();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControl::variableEvaporatingTemperatureMinimumforIndoorUnit() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->variableEvaporatingTemperatureMinimumforIndoorUnit();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControl::variableEvaporatingTemperatureMaximumforIndoorUnit() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->variableEvaporatingTemperatureMaximumforIndoorUnit();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControl::variableCondensingTemperatureMinimumforIndoorUnit() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->variableCondensingTemperatureMinimumforIndoorUnit();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControl::variableCondensingTemperatureMaximumforIndoorUnit() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->variableCondensingTemperatureMaximumforIndoorUnit();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControl::outdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()
+      ->outdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControl::outdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()
+      ->outdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity();
+  }
+
+  Curve AirConditionerVariableRefrigerantFlowFluidTemperatureControl::outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()
+      ->outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve();
+  }
+
+  Curve AirConditionerVariableRefrigerantFlowFluidTemperatureControl::outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()
+      ->outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControl::diameterofMainPipeConnectingOutdoorUnittotheFirstBranchJoint() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()
+      ->diameterofMainPipeConnectingOutdoorUnittotheFirstBranchJoint();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControl::lengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()
+      ->lengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControl::equivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()
+      ->equivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControl::heightDifferenceBetweenOutdoorUnitandIndoorUnits() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->heightDifferenceBetweenOutdoorUnitandIndoorUnits();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControl::mainPipeInsulationThickness() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->mainPipeInsulationThickness();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControl::mainPipeInsulationThermalConductivity() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->mainPipeInsulationThermalConductivity();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControl::crankcaseHeaterPowerperCompressor() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->crankcaseHeaterPowerperCompressor();
+  }
+
+  int AirConditionerVariableRefrigerantFlowFluidTemperatureControl::numberofCompressors() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->numberofCompressors();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControl::ratioofCompressorSizetoTotalCompressorCapacity() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->ratioofCompressorSizetoTotalCompressorCapacity();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControl::maximumOutdoorDryBulbTemperatureforCrankcaseHeater() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->maximumOutdoorDryBulbTemperatureforCrankcaseHeater();
+  }
+
+  std::string AirConditionerVariableRefrigerantFlowFluidTemperatureControl::defrostStrategy() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->defrostStrategy();
+  }
+
+  std::string AirConditionerVariableRefrigerantFlowFluidTemperatureControl::defrostControl() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->defrostControl();
+  }
+
+  boost::optional<Curve>
+    AirConditionerVariableRefrigerantFlowFluidTemperatureControl::defrostEnergyInputRatioModifierFunctionofTemperatureCurve() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()
+      ->defrostEnergyInputRatioModifierFunctionofTemperatureCurve();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControl::defrostTimePeriodFraction() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->defrostTimePeriodFraction();
+  }
+
+  boost::optional<double> AirConditionerVariableRefrigerantFlowFluidTemperatureControl::resistiveDefrostHeaterCapacity() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->resistiveDefrostHeaterCapacity();
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::isResistiveDefrostHeaterCapacityAutosized() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->isResistiveDefrostHeaterCapacityAutosized();
+  }
+
+  boost::optional<double> AirConditionerVariableRefrigerantFlowFluidTemperatureControl::autosizedResistiveDefrostHeaterCapacity() {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->autosizedResistiveDefrostHeaterCapacity();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControl::maximumOutdoorDrybulbTemperatureforDefrostOperation() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()
+      ->maximumOutdoorDrybulbTemperatureforDefrostOperation();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControl::compressorMaximumDeltaPressure() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->compressorMaximumDeltaPressure();
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::setAvailabilitySchedule(Schedule& schedule) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->setAvailabilitySchedule(schedule);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::setRefrigerantType(const std::string& refrigerantType) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->setRefrigerantType(refrigerantType);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::setRatedEvaporativeCapacity(double ratedEvaporativeCapacity) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->setRatedEvaporativeCapacity(
+      ratedEvaporativeCapacity);
+  }
+
+  void AirConditionerVariableRefrigerantFlowFluidTemperatureControl::autosizeRatedEvaporativeCapacity() {
+    getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->autosizeRatedEvaporativeCapacity();
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::setRatedCompressorPowerPerUnitofRatedEvaporativeCapacity(
+    double ratedCompressorPowerPerUnitofRatedEvaporativeCapacity) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()
+      ->setRatedCompressorPowerPerUnitofRatedEvaporativeCapacity(ratedCompressorPowerPerUnitofRatedEvaporativeCapacity);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::setMinimumOutdoorAirTemperatureinCoolingMode(
+    double minimumOutdoorAirTemperatureinCoolingMode) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->setMinimumOutdoorAirTemperatureinCoolingMode(
+      minimumOutdoorAirTemperatureinCoolingMode);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::setMaximumOutdoorAirTemperatureinCoolingMode(
+    double maximumOutdoorAirTemperatureinCoolingMode) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->setMaximumOutdoorAirTemperatureinCoolingMode(
+      maximumOutdoorAirTemperatureinCoolingMode);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::setMinimumOutdoorAirTemperatureinHeatingMode(
+    double minimumOutdoorAirTemperatureinHeatingMode) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->setMinimumOutdoorAirTemperatureinHeatingMode(
+      minimumOutdoorAirTemperatureinHeatingMode);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::setMaximumOutdoorAirTemperatureinHeatingMode(
+    double maximumOutdoorAirTemperatureinHeatingMode) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->setMaximumOutdoorAirTemperatureinHeatingMode(
+      maximumOutdoorAirTemperatureinHeatingMode);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::setReferenceOutdoorUnitSuperheating(double referenceOutdoorUnitSuperheating) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->setReferenceOutdoorUnitSuperheating(
+      referenceOutdoorUnitSuperheating);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::setReferenceOutdoorUnitSubcooling(double referenceOutdoorUnitSubcooling) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->setReferenceOutdoorUnitSubcooling(
+      referenceOutdoorUnitSubcooling);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::setRefrigerantTemperatureControlAlgorithmforIndoorUnit(
+    const std::string& refrigerantTemperatureControlAlgorithmforIndoorUnit) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()
+      ->setRefrigerantTemperatureControlAlgorithmforIndoorUnit(refrigerantTemperatureControlAlgorithmforIndoorUnit);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::setReferenceEvaporatingTemperatureforIndoorUnit(
+    double referenceEvaporatingTemperatureforIndoorUnit) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->setReferenceEvaporatingTemperatureforIndoorUnit(
+      referenceEvaporatingTemperatureforIndoorUnit);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::setReferenceCondensingTemperatureforIndoorUnit(
+    double referenceCondensingTemperatureforIndoorUnit) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->setReferenceCondensingTemperatureforIndoorUnit(
+      referenceCondensingTemperatureforIndoorUnit);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::setVariableEvaporatingTemperatureMinimumforIndoorUnit(
+    double variableEvaporatingTemperatureMinimumforIndoorUnit) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()
+      ->setVariableEvaporatingTemperatureMinimumforIndoorUnit(variableEvaporatingTemperatureMinimumforIndoorUnit);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::setVariableEvaporatingTemperatureMaximumforIndoorUnit(
+    double variableEvaporatingTemperatureMaximumforIndoorUnit) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()
+      ->setVariableEvaporatingTemperatureMaximumforIndoorUnit(variableEvaporatingTemperatureMaximumforIndoorUnit);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::setVariableCondensingTemperatureMinimumforIndoorUnit(
+    double variableCondensingTemperatureMinimumforIndoorUnit) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->setVariableCondensingTemperatureMinimumforIndoorUnit(
+      variableCondensingTemperatureMinimumforIndoorUnit);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::setVariableCondensingTemperatureMaximumforIndoorUnit(
+    double variableCondensingTemperatureMaximumforIndoorUnit) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->setVariableCondensingTemperatureMaximumforIndoorUnit(
+      variableCondensingTemperatureMaximumforIndoorUnit);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::setOutdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity(
+    double outdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()
+      ->setOutdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity(outdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::setOutdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity(
+    double outdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()
+      ->setOutdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity(outdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::setOutdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve(
+    const Curve& curve) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()
+      ->setOutdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve(curve);
+  }
+
+  bool
+    AirConditionerVariableRefrigerantFlowFluidTemperatureControl::setOutdoorUnitCondensingTemperatureFunctionofSubcoolingCurve(const Curve& curve) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()
+      ->setOutdoorUnitCondensingTemperatureFunctionofSubcoolingCurve(curve);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::setDiameterofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(
+    double diameterofMainPipeConnectingOutdoorUnittotheFirstBranchJoint) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()
+      ->setDiameterofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(diameterofMainPipeConnectingOutdoorUnittotheFirstBranchJoint);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::setLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(
+    double lengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()
+      ->setLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(lengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::setEquivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(
+    double equivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()
+      ->setEquivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(equivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::setHeightDifferenceBetweenOutdoorUnitandIndoorUnits(
+    double heightDifferenceBetweenOutdoorUnitandIndoorUnits) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->setHeightDifferenceBetweenOutdoorUnitandIndoorUnits(
+      heightDifferenceBetweenOutdoorUnitandIndoorUnits);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::setMainPipeInsulationThickness(double mainPipeInsulationThickness) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->setMainPipeInsulationThickness(
+      mainPipeInsulationThickness);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::setMainPipeInsulationThermalConductivity(
+    double mainPipeInsulationThermalConductivity) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->setMainPipeInsulationThermalConductivity(
+      mainPipeInsulationThermalConductivity);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::setCrankcaseHeaterPowerperCompressor(double crankcaseHeaterPowerperCompressor) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->setCrankcaseHeaterPowerperCompressor(
+      crankcaseHeaterPowerperCompressor);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::setNumberofCompressors(int numberofCompressors) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->setNumberofCompressors(numberofCompressors);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::setRatioofCompressorSizetoTotalCompressorCapacity(
+    double ratioofCompressorSizetoTotalCompressorCapacity) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->setRatioofCompressorSizetoTotalCompressorCapacity(
+      ratioofCompressorSizetoTotalCompressorCapacity);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::setMaximumOutdoorDryBulbTemperatureforCrankcaseHeater(
+    double maximumOutdoorDryBulbTemperatureforCrankcaseHeater) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()
+      ->setMaximumOutdoorDryBulbTemperatureforCrankcaseHeater(maximumOutdoorDryBulbTemperatureforCrankcaseHeater);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::setDefrostStrategy(const std::string& defrostStrategy) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->setDefrostStrategy(defrostStrategy);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::setDefrostControl(const std::string& defrostControl) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->setDefrostControl(defrostControl);
+  }
+
+  bool
+    AirConditionerVariableRefrigerantFlowFluidTemperatureControl::setDefrostEnergyInputRatioModifierFunctionofTemperatureCurve(const Curve& curve) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()
+      ->setDefrostEnergyInputRatioModifierFunctionofTemperatureCurve(curve);
+  }
+
+  void AirConditionerVariableRefrigerantFlowFluidTemperatureControl::resetDefrostEnergyInputRatioModifierFunctionofTemperatureCurve() {
+    getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()
+      ->resetDefrostEnergyInputRatioModifierFunctionofTemperatureCurve();
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::setDefrostTimePeriodFraction(double defrostTimePeriodFraction) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->setDefrostTimePeriodFraction(
+      defrostTimePeriodFraction);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::setResistiveDefrostHeaterCapacity(double resistiveDefrostHeaterCapacity) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->setResistiveDefrostHeaterCapacity(
+      resistiveDefrostHeaterCapacity);
+  }
+
+  void AirConditionerVariableRefrigerantFlowFluidTemperatureControl::autosizeResistiveDefrostHeaterCapacity() {
+    getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->autosizeResistiveDefrostHeaterCapacity();
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::setMaximumOutdoorDrybulbTemperatureforDefrostOperation(
+    double maximumOutdoorDrybulbTemperatureforDefrostOperation) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()
+      ->setMaximumOutdoorDrybulbTemperatureforDefrostOperation(maximumOutdoorDrybulbTemperatureforDefrostOperation);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::setCompressorMaximumDeltaPressure(double compressorMaximumDeltaPressure) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->setCompressorMaximumDeltaPressure(
+      compressorMaximumDeltaPressure);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::addTerminal(ZoneHVACTerminalUnitVariableRefrigerantFlow& vrf) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->addTerminal(vrf);
+  }
+
+  void AirConditionerVariableRefrigerantFlowFluidTemperatureControl::removeTerminal(ZoneHVACTerminalUnitVariableRefrigerantFlow& vrf) {
+    getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->removeTerminal(vrf);
+  }
+
+  void AirConditionerVariableRefrigerantFlowFluidTemperatureControl::removeAllTerminals() {
+    getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->removeAllTerminals();
+  }
+
+  std::vector<ZoneHVACTerminalUnitVariableRefrigerantFlow> AirConditionerVariableRefrigerantFlowFluidTemperatureControl::terminals() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->terminals();
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControl::addLoadingIndex(LoadingIndex& loadingIndex) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->addLoadingIndex(loadingIndex);
+  }
+
+  void AirConditionerVariableRefrigerantFlowFluidTemperatureControl::removeLoadingIndex(LoadingIndex& loadingIndex) {
+    getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->removeLoadingIndex(loadingIndex);
+  }
+
+  void AirConditionerVariableRefrigerantFlowFluidTemperatureControl::removeAllLoadingIndexes() {
+    getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->removeAllLoadingIndexes();
+  }
+
+  std::vector<LoadingIndex> AirConditionerVariableRefrigerantFlowFluidTemperatureControl::loadingIndexes() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->loadingIndexes();
+  }
+
+  boost::optional<double> AirConditionerVariableRefrigerantFlowFluidTemperatureControl::autosizedGrossRatedTotalCoolingCapacity() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->autosizedGrossRatedTotalCoolingCapacity();
+  }
+
+  boost::optional<double> AirConditionerVariableRefrigerantFlowFluidTemperatureControl::autosizedGrossRatedHeatingCapacity() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl>()->autosizedGrossRatedHeatingCapacity();
+  }
+
+  /// @cond
+  AirConditionerVariableRefrigerantFlowFluidTemperatureControl::AirConditionerVariableRefrigerantFlowFluidTemperatureControl(
+    std::shared_ptr<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl> impl)
+    : HVACComponent(std::move(impl)) {}
+  /// @endcond
+
+}  // namespace model
+}  // namespace openstudio
diff --git a/src/model/AirConditionerVariableRefrigerantFlowFluidTemperatureControl.hpp b/src/model/AirConditionerVariableRefrigerantFlowFluidTemperatureControl.hpp
new file mode 100644
index 00000000000..6297a807905
--- /dev/null
+++ b/src/model/AirConditionerVariableRefrigerantFlowFluidTemperatureControl.hpp
@@ -0,0 +1,306 @@
+/***********************************************************************************************************************
+*  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_AIRCONDITIONERVARIABLEREFRIGERANTFLOWFLUIDTEMPERATURECONTROL_HPP
+#define MODEL_AIRCONDITIONERVARIABLEREFRIGERANTFLOWFLUIDTEMPERATURECONTROL_HPP
+
+#include <vector>
+#include <model/ModelAPI.hpp>
+#include "HVACComponent.hpp"
+
+namespace openstudio {
+
+namespace model {
+
+  class Schedule;
+  class Curve;
+  class ThermalZone;
+  class ZoneHVACTerminalUnitVariableRefrigerantFlow;
+  class LoadingIndex;
+
+  namespace detail {
+
+    class AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl;
+
+  }  // namespace detail
+
+  /** AirConditionerVariableRefrigerantFlowFluidTemperatureControl is a HVACComponent that wraps the OpenStudio IDD object 'OS:AirConditioner:VariableRefrigerantFlow:FluidTemperatureControl'. */
+  class MODEL_API AirConditionerVariableRefrigerantFlowFluidTemperatureControl : public HVACComponent
+  {
+   public:
+    /** @name Constructors and Destructors */
+    //@{
+
+    explicit AirConditionerVariableRefrigerantFlowFluidTemperatureControl(const Model& model);
+
+    virtual ~AirConditionerVariableRefrigerantFlowFluidTemperatureControl() = default;
+
+    //@}
+
+    static IddObjectType iddObjectType();
+
+    static std::vector<std::string> refrigerantTypeValues();
+    static std::vector<std::string> validRefrigerantTypeValues();
+
+    static std::vector<std::string> refrigerantTemperatureControlAlgorithmforIndoorUnitValues();
+    static std::vector<std::string> validRefrigerantTemperatureControlAlgorithmforIndoorUnitValues();
+
+    static std::vector<std::string> defrostStrategyValues();
+    static std::vector<std::string> validDefrostStrategyValues();
+
+    static std::vector<std::string> defrostControlValues();
+    static std::vector<std::string> validDefrostControlValues();
+
+    /** @name Getters */
+    //@{
+
+    Schedule availabilitySchedule() const;
+
+    std::string refrigerantType() const;
+
+    boost::optional<double> ratedEvaporativeCapacity() const;
+
+    bool isRatedEvaporativeCapacityAutosized() const;
+
+    double ratedCompressorPowerPerUnitofRatedEvaporativeCapacity() const;
+
+    double minimumOutdoorAirTemperatureinCoolingMode() const;
+
+    double maximumOutdoorAirTemperatureinCoolingMode() const;
+
+    double minimumOutdoorAirTemperatureinHeatingMode() const;
+
+    double maximumOutdoorAirTemperatureinHeatingMode() const;
+
+    double referenceOutdoorUnitSuperheating() const;
+
+    double referenceOutdoorUnitSubcooling() const;
+
+    std::string refrigerantTemperatureControlAlgorithmforIndoorUnit() const;
+
+    double referenceEvaporatingTemperatureforIndoorUnit() const;
+
+    double referenceCondensingTemperatureforIndoorUnit() const;
+
+    double variableEvaporatingTemperatureMinimumforIndoorUnit() const;
+
+    double variableEvaporatingTemperatureMaximumforIndoorUnit() const;
+
+    double variableCondensingTemperatureMinimumforIndoorUnit() const;
+
+    double variableCondensingTemperatureMaximumforIndoorUnit() const;
+
+    double outdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity() const;
+
+    double outdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity() const;
+
+    Curve outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve() const;
+
+    Curve outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve() const;
+
+    double diameterofMainPipeConnectingOutdoorUnittotheFirstBranchJoint() const;
+
+    double lengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint() const;
+
+    double equivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint() const;
+
+    double heightDifferenceBetweenOutdoorUnitandIndoorUnits() const;
+
+    double mainPipeInsulationThickness() const;
+
+    double mainPipeInsulationThermalConductivity() const;
+
+    double crankcaseHeaterPowerperCompressor() const;
+
+    int numberofCompressors() const;
+
+    double ratioofCompressorSizetoTotalCompressorCapacity() const;
+
+    double maximumOutdoorDryBulbTemperatureforCrankcaseHeater() const;
+
+    std::string defrostStrategy() const;
+
+    std::string defrostControl() const;
+
+    boost::optional<Curve> defrostEnergyInputRatioModifierFunctionofTemperatureCurve() const;
+
+    double defrostTimePeriodFraction() const;
+
+    boost::optional<double> resistiveDefrostHeaterCapacity() const;
+
+    bool isResistiveDefrostHeaterCapacityAutosized() const;
+
+    double maximumOutdoorDrybulbTemperatureforDefrostOperation() const;
+
+    double compressorMaximumDeltaPressure() const;
+
+    //@}
+    /** @name Setters */
+    //@{
+
+    bool setAvailabilitySchedule(Schedule& schedule);
+
+    bool setRefrigerantType(const std::string& refrigerantType);
+
+    bool setRatedEvaporativeCapacity(double ratedEvaporativeCapacity);
+
+    void autosizeRatedEvaporativeCapacity();
+
+    bool setRatedCompressorPowerPerUnitofRatedEvaporativeCapacity(double ratedCompressorPowerPerUnitofRatedEvaporativeCapacity);
+
+    bool setMinimumOutdoorAirTemperatureinCoolingMode(double minimumOutdoorAirTemperatureinCoolingMode);
+
+    bool setMaximumOutdoorAirTemperatureinCoolingMode(double maximumOutdoorAirTemperatureinCoolingMode);
+
+    bool setMinimumOutdoorAirTemperatureinHeatingMode(double minimumOutdoorAirTemperatureinHeatingMode);
+
+    bool setMaximumOutdoorAirTemperatureinHeatingMode(double maximumOutdoorAirTemperatureinHeatingMode);
+
+    bool setReferenceOutdoorUnitSuperheating(double referenceOutdoorUnitSuperheating);
+
+    bool setReferenceOutdoorUnitSubcooling(double referenceOutdoorUnitSubcooling);
+
+    bool setRefrigerantTemperatureControlAlgorithmforIndoorUnit(const std::string& refrigerantTemperatureControlAlgorithmforIndoorUnit);
+
+    bool setReferenceEvaporatingTemperatureforIndoorUnit(double referenceEvaporatingTemperatureforIndoorUnit);
+
+    bool setReferenceCondensingTemperatureforIndoorUnit(double referenceCondensingTemperatureforIndoorUnit);
+
+    bool setVariableEvaporatingTemperatureMinimumforIndoorUnit(double variableEvaporatingTemperatureMinimumforIndoorUnit);
+
+    bool setVariableEvaporatingTemperatureMaximumforIndoorUnit(double variableEvaporatingTemperatureMaximumforIndoorUnit);
+
+    bool setVariableCondensingTemperatureMinimumforIndoorUnit(double variableCondensingTemperatureMinimumforIndoorUnit);
+
+    bool setVariableCondensingTemperatureMaximumforIndoorUnit(double variableCondensingTemperatureMaximumforIndoorUnit);
+
+    bool setOutdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity(double outdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity);
+
+    bool setOutdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity(double outdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity);
+
+    bool setOutdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve(const Curve& curve);
+
+    bool setOutdoorUnitCondensingTemperatureFunctionofSubcoolingCurve(const Curve& curve);
+
+    bool setDiameterofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(double diameterofMainPipeConnectingOutdoorUnittotheFirstBranchJoint);
+
+    bool setLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(double lengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint);
+
+    bool setEquivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(
+      double equivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint);
+
+    bool setHeightDifferenceBetweenOutdoorUnitandIndoorUnits(double heightDifferenceBetweenOutdoorUnitandIndoorUnits);
+
+    bool setMainPipeInsulationThickness(double mainPipeInsulationThickness);
+
+    bool setMainPipeInsulationThermalConductivity(double mainPipeInsulationThermalConductivity);
+
+    bool setCrankcaseHeaterPowerperCompressor(double crankcaseHeaterPowerperCompressor);
+
+    bool setNumberofCompressors(int numberofCompressors);
+
+    bool setRatioofCompressorSizetoTotalCompressorCapacity(double ratioofCompressorSizetoTotalCompressorCapacity);
+
+    bool setMaximumOutdoorDryBulbTemperatureforCrankcaseHeater(double maximumOutdoorDryBulbTemperatureforCrankcaseHeater);
+
+    bool setDefrostStrategy(const std::string& defrostStrategy);
+
+    bool setDefrostControl(const std::string& defrostControl);
+
+    bool setDefrostEnergyInputRatioModifierFunctionofTemperatureCurve(const Curve& curve);
+
+    void resetDefrostEnergyInputRatioModifierFunctionofTemperatureCurve();
+
+    bool setDefrostTimePeriodFraction(double defrostTimePeriodFraction);
+
+    bool setResistiveDefrostHeaterCapacity(double resistiveDefrostHeaterCapacity);
+
+    void autosizeResistiveDefrostHeaterCapacity();
+
+    bool setMaximumOutdoorDrybulbTemperatureforDefrostOperation(double maximumOutdoorDrybulbTemperatureforDefrostOperation);
+
+    bool setCompressorMaximumDeltaPressure(double compressorMaximumDeltaPressure);
+
+    //@}
+    /** @name Other */
+    //@{
+
+    bool addTerminal(ZoneHVACTerminalUnitVariableRefrigerantFlow& vrf);
+
+    void removeTerminal(ZoneHVACTerminalUnitVariableRefrigerantFlow& vrf);
+
+    void removeAllTerminals();
+
+    std::vector<ZoneHVACTerminalUnitVariableRefrigerantFlow> terminals() const;
+
+    bool addLoadingIndex(LoadingIndex& loadingIndex);
+
+    void removeLoadingIndex(LoadingIndex& loadingIndex);
+
+    void removeAllLoadingIndexes();
+
+    std::vector<LoadingIndex> loadingIndexes() const;
+
+    boost::optional<double> autosizedRatedEvaporativeCapacity();
+
+    boost::optional<double> autosizedResistiveDefrostHeaterCapacity();
+
+    boost::optional<double> autosizedGrossRatedTotalCoolingCapacity() const;
+
+    boost::optional<double> autosizedGrossRatedHeatingCapacity() const;
+
+    //@}
+   protected:
+    /// @cond
+    using ImplType = detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl;
+
+    explicit AirConditionerVariableRefrigerantFlowFluidTemperatureControl(
+      std::shared_ptr<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl> impl);
+
+    friend class detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl;
+    friend class Model;
+    friend class IdfObject;
+    friend class openstudio::detail::IdfObject_Impl;
+    /// @endcond
+   private:
+    REGISTER_LOGGER("openstudio.model.AirConditionerVariableRefrigerantFlowFluidTemperatureControl");
+  };
+
+  /** \relates AirConditionerVariableRefrigerantFlowFluidTemperatureControl*/
+  using OptionalAirConditionerVariableRefrigerantFlowFluidTemperatureControl =
+    boost::optional<AirConditionerVariableRefrigerantFlowFluidTemperatureControl>;
+
+  /** \relates AirConditionerVariableRefrigerantFlowFluidTemperatureControl*/
+  using AirConditionerVariableRefrigerantFlowFluidTemperatureControlVector =
+    std::vector<AirConditionerVariableRefrigerantFlowFluidTemperatureControl>;
+
+}  // namespace model
+}  // namespace openstudio
+
+#endif  // MODEL_AIRCONDITIONERVARIABLEREFRIGERANTFLOWFLUIDTEMPERATURECONTROL_HPP
diff --git a/src/model/AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR.cpp b/src/model/AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR.cpp
new file mode 100644
index 00000000000..bfb67158490
--- /dev/null
+++ b/src/model/AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR.cpp
@@ -0,0 +1,2106 @@
+/***********************************************************************************************************************
+*  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 "AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR.hpp"
+#include "AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl.hpp"
+#include "LoadingIndex.hpp"
+#include "LoadingIndex_Impl.hpp"
+#include "ModelObjectList.hpp"
+#include "ModelObjectList_Impl.hpp"
+#include "ZoneHVACTerminalUnitVariableRefrigerantFlow.hpp"
+#include "ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl.hpp"
+#include "Schedule.hpp"
+#include "Schedule_Impl.hpp"
+#include "Curve.hpp"
+#include "Curve_Impl.hpp"
+#include "CurveBiquadratic.hpp"
+#include "CurveBiquadratic_Impl.hpp"
+#include "CurveCubic.hpp"
+#include "CurveCubic_Impl.hpp"
+#include "CurveQuadratic.hpp"
+#include "CurveQuadratic_Impl.hpp"
+#include "ThermalZone.hpp"
+#include "ThermalZone_Impl.hpp"
+#include "Connection.hpp"
+#include "Connection_Impl.hpp"
+#include "Model.hpp"
+#include "Model_Impl.hpp"
+#include "Node.hpp"
+#include "Node_Impl.hpp"
+#include "PlantLoop.hpp"
+#include "PlantLoop_Impl.hpp"
+#include "ScheduleTypeLimits.hpp"
+#include "ScheduleTypeRegistry.hpp"
+
+#include "../utilities/core/Assert.hpp"
+
+#include <utilities/idd/IddFactory.hxx>
+#include <utilities/idd/IddEnums.hxx>
+#include <utilities/idd/OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HR_FieldEnums.hxx>
+
+#include <algorithm>
+#include <vector>
+
+namespace openstudio {
+namespace model {
+
+  namespace detail {
+
+    AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl(
+      const IdfObject& idfObject, Model_Impl* model, bool keepHandle)
+      : HVACComponent_Impl(idfObject, model, keepHandle) {
+      OS_ASSERT(idfObject.iddObject().type() == AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::iddObjectType());
+    }
+
+    AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl(
+      const openstudio::detail::WorkspaceObject_Impl& other, Model_Impl* model, bool keepHandle)
+      : HVACComponent_Impl(other, model, keepHandle) {
+      OS_ASSERT(other.iddObject().type() == AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::iddObjectType());
+    }
+
+    AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl(
+      const AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl& other, Model_Impl* model, bool keepHandle)
+      : HVACComponent_Impl(other, model, keepHandle) {}
+
+    const std::vector<std::string>& AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::outputVariableNames() const {
+      static const std::vector<std::string> result{"VRF Heat Pump Total Cooling Rate",
+                                                   "VRF Heat Pump Total Heating Rate",
+                                                   "VRF Heat Pump Cooling Electricity Rate",
+                                                   "VRF Heat Pump Cooling Electricity Energy",
+                                                   "VRF Heat Pump Heating Electricity Rate",
+                                                   "VRF Heat Pump Heating Electricity Energy",
+                                                   "VRF Heat Pump Cooling COP",
+                                                   "VRF Heat Pump Heating COP",
+                                                   "VRF Heat Pump COP",
+                                                   "VRF Heat Pump Compressor Electricity Rate",
+                                                   "VRF Heat Pump Outdoor Unit Fan Power",
+                                                   "VRF Heat Pump Compressor Rotating Speed",
+                                                   "VRF Heat Pump Indoor Unit Evaporating Temperature",
+                                                   "VRF Heat Pump Outdoor Unit Condensing Temperature",
+                                                   "VRF Heat Pump Indoor Unit Condensing Temperature",
+                                                   "VRF Heat Pump Outdoor Unit Evaporating Temperature",
+                                                   "VRF Heat Pump Cooling Capacity at Max Compressor Speed",
+                                                   "VRF Heat Pump Heating Capacity at Max Compressor Speed",
+                                                   "VRF Heat Pump Indoor Unit Piping Correction for Cooling",
+                                                   "VRF Heat Pump Indoor Unit Piping Correction for Heating",
+                                                   "VRF Heat Pump Outdoor Unit Evaporator Heat Extract Rate",
+                                                   "VRF Heat Pump Outdoor Unit Condenser Heat Release Rate",
+                                                   "VRF Heat Pump Defrost Electricity Rate",
+                                                   "VRF Heat Pump Defrost Electricity Energy",
+                                                   "VRF Heat Pump Part Load Ratio",
+                                                   "VRF Heat Pump Runtime Fraction",
+                                                   "VRF Heat Pump Cycling Ratio",
+                                                   "VRF Heat Pump Operating Mode",
+                                                   "VRF Heat Pump Condenser Inlet Temperature",
+                                                   "VRF Heat Pump Crankcase Heater Electricity Rate",
+                                                   "VRF Heat Pump Crankcase Heater Electricity Energy",
+                                                   "VRF Heat Pump Terminal Unit Cooling Load Rate",
+                                                   "VRF Heat Pump Terminal Unit Heating Load Rate",
+                                                   "VRF Heat Pump Heat Recovery Status Change Multiplier",
+                                                   "VRF Heat Pump Simultaneous Cooling and Heating Efficiency",
+                                                   "VRF Heat Pump Heat Recovery Rate",
+                                                   "VRF Heat Pump Heat Recovery Energy"};
+      return result;
+    }
+
+    IddObjectType AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::iddObjectType() const {
+      return AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::iddObjectType();
+    }
+
+    std::vector<ScheduleTypeKey>
+      AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::getScheduleTypeKeys(const Schedule& schedule) const {
+      std::vector<ScheduleTypeKey> result;
+      UnsignedVector fieldIndices = getSourceIndices(schedule.handle());
+      if (std::find(fieldIndices.cbegin(), fieldIndices.cend(),
+                    OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::AvailabilitySchedule)
+          != fieldIndices.cend()) {
+        result.emplace_back("AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR", "Availability Schedule");
+      }
+      return result;
+    }
+
+    ModelObject AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::clone(Model model) const {
+      AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR airConditionerClone =
+        HVACComponent_Impl::clone(model).cast<AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR>();
+
+      ModelObjectList modelObjectList(model);
+      airConditionerClone.getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setVRFModelObjectList(
+        modelObjectList);
+
+      // This will clone each LoadingIndex too
+      ModelObjectList loadingIndexList = this->loadingIndexList();
+      ModelObjectList loadingIndexListClone = loadingIndexList.clone(model).cast<ModelObjectList>();
+      airConditionerClone.getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setLoadingIndexList(
+        loadingIndexListClone);
+
+      return airConditionerClone;
+    }
+
+    std::vector<openstudio::IdfObject> AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::remove() {
+      vrfModelObjectList().remove();
+      loadingIndexList().remove();
+
+      return HVACComponent_Impl::remove();
+    }
+
+    std::vector<ModelObject> AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::children() const {
+      std::vector<ModelObject> result;
+
+      std::vector<ModelObject> loadings;
+      // children() is called during remove(), except we already trashed the moList...
+      if (auto moList_ = optionalLoadingIndexList()) {
+        loadings = moList_->modelObjects();
+      }
+      result.reserve(loadings.size() + 3);
+
+      result.push_back(outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve());
+      result.push_back(outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve());
+
+      boost::optional<ModelObject> curve;
+      curve = defrostEnergyInputRatioModifierFunctionofTemperatureCurve();
+      if (curve) {
+        result.push_back(curve.get());
+      }
+
+      for (auto&& loadIndex : loadings) {
+        result.emplace_back(std::move(loadIndex));
+      }
+
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::addToNode(Node& node) {
+      // Only accept the demand side of a PlantLoop
+      if (boost::optional<PlantLoop> plant = node.plantLoop()) {
+        if (plant->demandComponent(node.handle())) {
+          return HVACComponent_Impl::addToNode(node);
+        }
+      }
+
+      return false;
+    }
+
+    void AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::autosize() {
+      autosizeRatedEvaporativeCapacity();
+      autosizeResistiveDefrostHeaterCapacity();
+    }
+
+    void AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::applySizingValues() {
+      boost::optional<double> val;
+      val = autosizedRatedEvaporativeCapacity();
+      if (val) {
+        setRatedEvaporativeCapacity(val.get());
+      }
+
+      val = autosizedResistiveDefrostHeaterCapacity();
+      if (val) {
+        setResistiveDefrostHeaterCapacity(val.get());
+      }
+    }
+
+    std::vector<EMSActuatorNames> AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::emsActuatorNames() const {
+      std::vector<EMSActuatorNames> actuators{{"Variable Refrigerant Flow Heat Pump", "Operating Mode"}};
+      return actuators;
+    }
+
+    std::vector<std::string> AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::emsInternalVariableNames() const {
+      std::vector<std::string> types;
+      return types;
+    }
+
+    Schedule AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::availabilitySchedule() const {
+      boost::optional<Schedule> value = optionalAvailabilitySchedule();
+      if (!value) {
+        LOG_AND_THROW(briefDescription() << " does not have an Availability Schedule attached.");
+      }
+      return value.get();
+    }
+
+    std::string AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::refrigerantType() const {
+      boost::optional<std::string> value =
+        getString(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::RefrigerantType, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    boost::optional<double> AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::ratedEvaporativeCapacity() const {
+      return getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::RatedEvaporativeCapacity, true);
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::isRatedEvaporativeCapacityAutosized() const {
+      bool result = false;
+      boost::optional<std::string> value =
+        getString(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::RatedEvaporativeCapacity, true);
+      if (value) {
+        result = openstudio::istringEqual(value.get(), "autosize");
+      }
+      return result;
+    }
+
+    boost::optional<double> AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::autosizedRatedEvaporativeCapacity() {
+      return getAutosizedValue("Design Size Rated Evaporative Capacity", "W");
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::ratedCompressorPowerPerUnitofRatedEvaporativeCapacity() const {
+      boost::optional<double> value = getDouble(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::RatedCompressorPowerPerUnitofRatedEvaporativeCapacity, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::minimumOutdoorAirTemperatureinCoolingOnlyMode() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MinimumOutdoorAirTemperatureinCoolingOnlyMode, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::maximumOutdoorAirTemperatureinCoolingOnlyMode() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MaximumOutdoorAirTemperatureinCoolingOnlyMode, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::minimumOutdoorAirTemperatureinHeatingOnlyMode() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MinimumOutdoorAirTemperatureinHeatingOnlyMode, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::maximumOutdoorAirTemperatureinHeatingOnlyMode() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MaximumOutdoorAirTemperatureinHeatingOnlyMode, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::minimumOutdoorTemperatureinHeatRecoveryMode() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MinimumOutdoorTemperatureinHeatRecoveryMode, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::maximumOutdoorTemperatureinHeatRecoveryMode() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MaximumOutdoorTemperatureinHeatRecoveryMode, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    std::string AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::refrigerantTemperatureControlAlgorithmforIndoorUnit() const {
+      boost::optional<std::string> value = getString(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::RefrigerantTemperatureControlAlgorithmforIndoorUnit, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::referenceEvaporatingTemperatureforIndoorUnit() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::ReferenceEvaporatingTemperatureforIndoorUnit, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::referenceCondensingTemperatureforIndoorUnit() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::ReferenceCondensingTemperatureforIndoorUnit, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::variableEvaporatingTemperatureMinimumforIndoorUnit() const {
+      boost::optional<double> value = getDouble(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::VariableEvaporatingTemperatureMinimumforIndoorUnit, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::variableEvaporatingTemperatureMaximumforIndoorUnit() const {
+      boost::optional<double> value = getDouble(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::VariableEvaporatingTemperatureMaximumforIndoorUnit, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::variableCondensingTemperatureMinimumforIndoorUnit() const {
+      boost::optional<double> value = getDouble(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::VariableCondensingTemperatureMinimumforIndoorUnit, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::variableCondensingTemperatureMaximumforIndoorUnit() const {
+      boost::optional<double> value = getDouble(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::VariableCondensingTemperatureMaximumforIndoorUnit, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::outdoorUnitEvaporatorReferenceSuperheating() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::OutdoorUnitEvaporatorReferenceSuperheating, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::outdoorUnitCondenserReferenceSubcooling() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::OutdoorUnitCondenserReferenceSubcooling, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::outdoorUnitEvaporatorRatedBypassFactor() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::OutdoorUnitEvaporatorRatedBypassFactor, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::outdoorUnitCondenserRatedBypassFactor() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::OutdoorUnitCondenserRatedBypassFactor, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::
+      differencebetweenOutdoorUnitEvaporatingTemperatureandOutdoorAirTemperatureinHeatRecoveryMode() const {
+      boost::optional<double> value = getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::
+                                                  DifferencebetweenOutdoorUnitEvaporatingTemperatureandOutdoorAirTemperatureinHeatRecoveryMode,
+                                                true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::outdoorUnitHeatExchangerCapacityRatio() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::OutdoorUnitHeatExchangerCapacityRatio, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::outdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity() const {
+      boost::optional<double> value = getDouble(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::OutdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::outdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity() const {
+      boost::optional<double> value = getDouble(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::OutdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    Curve AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve() const {
+      boost::optional<Curve> value = optionalOutdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve();
+      if (!value) {
+        LOG_AND_THROW(briefDescription() << " does not have an Outdoor Unit Evaporating Temperature Functionof Superheating Curve attached.");
+      }
+      return value.get();
+    }
+
+    Curve AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve() const {
+      boost::optional<Curve> value = optionalOutdoorUnitCondensingTemperatureFunctionofSubcoolingCurve();
+      if (!value) {
+        LOG_AND_THROW(briefDescription() << " does not have an Outdoor Unit Condensing Temperature Functionof Subcooling Curve attached.");
+      }
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::diameterofMainPipeforSuctionGas() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::DiameterofMainPipeforSuctionGas, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::diameterofMainPipeforDischargeGas() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::DiameterofMainPipeforDischargeGas, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::lengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint() const {
+      boost::optional<double> value = getDouble(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::LengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::equivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint()
+      const {
+      boost::optional<double> value = getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::
+                                                  EquivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint,
+                                                true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::heightDifferenceBetweenOutdoorUnitandIndoorUnits() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::HeightDifferenceBetweenOutdoorUnitandIndoorUnits, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::mainPipeInsulationThickness() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MainPipeInsulationThickness, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::mainPipeInsulationThermalConductivity() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MainPipeInsulationThermalConductivity, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::crankcaseHeaterPowerperCompressor() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::CrankcaseHeaterPowerperCompressor, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    int AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::numberofCompressors() const {
+      boost::optional<int> value = getInt(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::NumberofCompressors, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::ratioofCompressorSizetoTotalCompressorCapacity() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::RatioofCompressorSizetoTotalCompressorCapacity, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::maximumOutdoorDryBulbTemperatureforCrankcaseHeater() const {
+      boost::optional<double> value = getDouble(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MaximumOutdoorDryBulbTemperatureforCrankcaseHeater, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    std::string AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::defrostStrategy() const {
+      boost::optional<std::string> value =
+        getString(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::DefrostStrategy, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    std::string AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::defrostControl() const {
+      boost::optional<std::string> value =
+        getString(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::DefrostControl, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    boost::optional<Curve>
+      AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::defrostEnergyInputRatioModifierFunctionofTemperatureCurve() const {
+      return getObject<ModelObject>().getModelObjectTarget<Curve>(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::DefrostEnergyInputRatioModifierFunctionofTemperatureCurveName);
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::defrostTimePeriodFraction() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::DefrostTimePeriodFraction, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    boost::optional<double> AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::resistiveDefrostHeaterCapacity() const {
+      return getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::ResistiveDefrostHeaterCapacity, true);
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::isResistiveDefrostHeaterCapacityAutosized() const {
+      bool result = false;
+      boost::optional<std::string> value =
+        getString(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::ResistiveDefrostHeaterCapacity, true);
+      if (value) {
+        result = openstudio::istringEqual(value.get(), "autosize");
+      }
+      return result;
+    }
+
+    boost::optional<double> AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::autosizedResistiveDefrostHeaterCapacity() {
+      return getAutosizedValue("Design Size Resistive Defrost Heater Capacity", "");
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::maximumOutdoorDrybulbTemperatureforDefrostOperation() const {
+      boost::optional<double> value = getDouble(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MaximumOutdoorDrybulbTemperatureforDefrostOperation, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::initialHeatRecoveryCoolingCapacityFraction() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::InitialHeatRecoveryCoolingCapacityFraction, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::heatRecoveryCoolingCapacityTimeConstant() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::HeatRecoveryCoolingCapacityTimeConstant, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::initialHeatRecoveryCoolingEnergyFraction() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::InitialHeatRecoveryCoolingEnergyFraction, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::heatRecoveryCoolingEnergyTimeConstant() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::HeatRecoveryCoolingEnergyTimeConstant, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::initialHeatRecoveryHeatingCapacityFraction() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::InitialHeatRecoveryHeatingCapacityFraction, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::heatRecoveryHeatingCapacityTimeConstant() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::HeatRecoveryHeatingCapacityTimeConstant, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::initialHeatRecoveryHeatingEnergyFraction() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::InitialHeatRecoveryHeatingEnergyFraction, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::heatRecoveryHeatingEnergyTimeConstant() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::HeatRecoveryHeatingEnergyTimeConstant, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::compressorMaximumDeltaPressure() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::CompressorMaximumDeltaPressure, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::compressorInverterEfficiency() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::CompressorInverterEfficiency, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::compressorEvaporativeCapacityCorrectionFactor() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::CompressorEvaporativeCapacityCorrectionFactor, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    boost::optional<ModelObjectList> AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::optionalLoadingIndexList() const {
+      return getObject<ModelObject>().getModelObjectTarget<ModelObjectList>(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::LoadingIndexList);
+    }
+
+    ModelObjectList AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::loadingIndexList() const {
+      boost::optional<ModelObjectList> moList_ = optionalLoadingIndexList();
+
+      OS_ASSERT(moList_);
+
+      return moList_.get();
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::addLoadingIndex(LoadingIndex& loadingIndex) {
+      return loadingIndexList().addModelObject(loadingIndex);
+    }
+
+    void AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::removeLoadingIndex(LoadingIndex& loadingIndex) {
+      loadingIndexList().removeModelObject(loadingIndex);
+    }
+
+    void AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::removeAllLoadingIndexes() {
+      loadingIndexList().removeAllModelObjects();
+    }
+
+    std::vector<LoadingIndex> AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::loadingIndexes() const {
+      return subsetCastVector<LoadingIndex>(loadingIndexList().modelObjects());
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setLoadingIndexList(const ModelObjectList& modelObjectList) {
+      return setPointer(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::LoadingIndexList, modelObjectList.handle());
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setAvailabilitySchedule(Schedule& schedule) {
+      bool result = setSchedule(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::AvailabilitySchedule,
+                                "AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR", "Availability Schedule", schedule);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setRefrigerantType(const std::string& refrigerantType) {
+      bool result = setString(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::RefrigerantType, refrigerantType);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setRatedEvaporativeCapacity(double ratedEvaporativeCapacity) {
+      bool result =
+        setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::RatedEvaporativeCapacity, ratedEvaporativeCapacity);
+      return result;
+    }
+
+    void AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::autosizeRatedEvaporativeCapacity() {
+      bool result = setString(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::RatedEvaporativeCapacity, "autosize");
+      OS_ASSERT(result);
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setRatedCompressorPowerPerUnitofRatedEvaporativeCapacity(
+      double ratedCompressorPowerPerUnitofRatedEvaporativeCapacity) {
+      bool result =
+        setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::RatedCompressorPowerPerUnitofRatedEvaporativeCapacity,
+                  ratedCompressorPowerPerUnitofRatedEvaporativeCapacity);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setMinimumOutdoorAirTemperatureinCoolingOnlyMode(
+      double minimumOutdoorAirTemperatureinCoolingOnlyMode) {
+      bool result =
+        setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MinimumOutdoorAirTemperatureinCoolingOnlyMode,
+                  minimumOutdoorAirTemperatureinCoolingOnlyMode);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setMaximumOutdoorAirTemperatureinCoolingOnlyMode(
+      double maximumOutdoorAirTemperatureinCoolingOnlyMode) {
+      bool result =
+        setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MaximumOutdoorAirTemperatureinCoolingOnlyMode,
+                  maximumOutdoorAirTemperatureinCoolingOnlyMode);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setMinimumOutdoorAirTemperatureinHeatingOnlyMode(
+      double minimumOutdoorAirTemperatureinHeatingOnlyMode) {
+      bool result =
+        setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MinimumOutdoorAirTemperatureinHeatingOnlyMode,
+                  minimumOutdoorAirTemperatureinHeatingOnlyMode);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setMaximumOutdoorAirTemperatureinHeatingOnlyMode(
+      double maximumOutdoorAirTemperatureinHeatingOnlyMode) {
+      bool result =
+        setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MaximumOutdoorAirTemperatureinHeatingOnlyMode,
+                  maximumOutdoorAirTemperatureinHeatingOnlyMode);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setMinimumOutdoorTemperatureinHeatRecoveryMode(
+      double minimumOutdoorTemperatureinHeatRecoveryMode) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MinimumOutdoorTemperatureinHeatRecoveryMode,
+                              minimumOutdoorTemperatureinHeatRecoveryMode);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setMaximumOutdoorTemperatureinHeatRecoveryMode(
+      double maximumOutdoorTemperatureinHeatRecoveryMode) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MaximumOutdoorTemperatureinHeatRecoveryMode,
+                              maximumOutdoorTemperatureinHeatRecoveryMode);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setRefrigerantTemperatureControlAlgorithmforIndoorUnit(
+      const std::string& refrigerantTemperatureControlAlgorithmforIndoorUnit) {
+      bool result =
+        setString(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::RefrigerantTemperatureControlAlgorithmforIndoorUnit,
+                  refrigerantTemperatureControlAlgorithmforIndoorUnit);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setReferenceEvaporatingTemperatureforIndoorUnit(
+      double referenceEvaporatingTemperatureforIndoorUnit) {
+      bool result =
+        setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::ReferenceEvaporatingTemperatureforIndoorUnit,
+                  referenceEvaporatingTemperatureforIndoorUnit);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setReferenceCondensingTemperatureforIndoorUnit(
+      double referenceCondensingTemperatureforIndoorUnit) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::ReferenceCondensingTemperatureforIndoorUnit,
+                              referenceCondensingTemperatureforIndoorUnit);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setVariableEvaporatingTemperatureMinimumforIndoorUnit(
+      double variableEvaporatingTemperatureMinimumforIndoorUnit) {
+      bool result =
+        setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::VariableEvaporatingTemperatureMinimumforIndoorUnit,
+                  variableEvaporatingTemperatureMinimumforIndoorUnit);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setVariableEvaporatingTemperatureMaximumforIndoorUnit(
+      double variableEvaporatingTemperatureMaximumforIndoorUnit) {
+      bool result =
+        setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::VariableEvaporatingTemperatureMaximumforIndoorUnit,
+                  variableEvaporatingTemperatureMaximumforIndoorUnit);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setVariableCondensingTemperatureMinimumforIndoorUnit(
+      double variableCondensingTemperatureMinimumforIndoorUnit) {
+      bool result =
+        setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::VariableCondensingTemperatureMinimumforIndoorUnit,
+                  variableCondensingTemperatureMinimumforIndoorUnit);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setVariableCondensingTemperatureMaximumforIndoorUnit(
+      double variableCondensingTemperatureMaximumforIndoorUnit) {
+      bool result =
+        setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::VariableCondensingTemperatureMaximumforIndoorUnit,
+                  variableCondensingTemperatureMaximumforIndoorUnit);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setOutdoorUnitEvaporatorReferenceSuperheating(
+      double outdoorUnitEvaporatorReferenceSuperheating) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::OutdoorUnitEvaporatorReferenceSuperheating,
+                              outdoorUnitEvaporatorReferenceSuperheating);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setOutdoorUnitCondenserReferenceSubcooling(
+      double outdoorUnitCondenserReferenceSubcooling) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::OutdoorUnitCondenserReferenceSubcooling,
+                              outdoorUnitCondenserReferenceSubcooling);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setOutdoorUnitEvaporatorRatedBypassFactor(
+      double outdoorUnitEvaporatorRatedBypassFactor) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::OutdoorUnitEvaporatorRatedBypassFactor,
+                              outdoorUnitEvaporatorRatedBypassFactor);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setOutdoorUnitCondenserRatedBypassFactor(
+      double outdoorUnitCondenserRatedBypassFactor) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::OutdoorUnitCondenserRatedBypassFactor,
+                              outdoorUnitCondenserRatedBypassFactor);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::
+      setDifferencebetweenOutdoorUnitEvaporatingTemperatureandOutdoorAirTemperatureinHeatRecoveryMode(
+        double differencebetweenOutdoorUnitEvaporatingTemperatureandOutdoorAirTemperatureinHeatRecoveryMode) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::
+                                DifferencebetweenOutdoorUnitEvaporatingTemperatureandOutdoorAirTemperatureinHeatRecoveryMode,
+                              differencebetweenOutdoorUnitEvaporatingTemperatureandOutdoorAirTemperatureinHeatRecoveryMode);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setOutdoorUnitHeatExchangerCapacityRatio(
+      double outdoorUnitHeatExchangerCapacityRatio) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::OutdoorUnitHeatExchangerCapacityRatio,
+                              outdoorUnitHeatExchangerCapacityRatio);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setOutdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity(
+      double outdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity) {
+      bool result =
+        setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::OutdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity,
+                  outdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setOutdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity(
+      double outdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity) {
+      bool result =
+        setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::OutdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity,
+                  outdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setOutdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve(
+      const Curve& curve) {
+      bool result = setPointer(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::OutdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurveName,
+        curve.handle());
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setOutdoorUnitCondensingTemperatureFunctionofSubcoolingCurve(
+      const Curve& curve) {
+      bool result = setPointer(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::OutdoorUnitCondensingTemperatureFunctionofSubcoolingCurveName,
+        curve.handle());
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setDiameterofMainPipeforSuctionGas(
+      double diameterofMainPipeforSuctionGas) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::DiameterofMainPipeforSuctionGas,
+                              diameterofMainPipeforSuctionGas);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setDiameterofMainPipeforDischargeGas(
+      double diameterofMainPipeforDischargeGas) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::DiameterofMainPipeforDischargeGas,
+                              diameterofMainPipeforDischargeGas);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(
+      double lengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint) {
+      bool result = setDouble(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::LengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint,
+        lengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setEquivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(
+      double equivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::
+                                EquivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint,
+                              equivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setHeightDifferenceBetweenOutdoorUnitandIndoorUnits(
+      double heightDifferenceBetweenOutdoorUnitandIndoorUnits) {
+      bool result =
+        setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::HeightDifferenceBetweenOutdoorUnitandIndoorUnits,
+                  heightDifferenceBetweenOutdoorUnitandIndoorUnits);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setMainPipeInsulationThickness(double mainPipeInsulationThickness) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MainPipeInsulationThickness,
+                              mainPipeInsulationThickness);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setMainPipeInsulationThermalConductivity(
+      double mainPipeInsulationThermalConductivity) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MainPipeInsulationThermalConductivity,
+                              mainPipeInsulationThermalConductivity);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setCrankcaseHeaterPowerperCompressor(
+      double crankcaseHeaterPowerperCompressor) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::CrankcaseHeaterPowerperCompressor,
+                              crankcaseHeaterPowerperCompressor);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setNumberofCompressors(int numberofCompressors) {
+      bool result = setInt(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::NumberofCompressors, numberofCompressors);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setRatioofCompressorSizetoTotalCompressorCapacity(
+      double ratioofCompressorSizetoTotalCompressorCapacity) {
+      bool result =
+        setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::RatioofCompressorSizetoTotalCompressorCapacity,
+                  ratioofCompressorSizetoTotalCompressorCapacity);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setMaximumOutdoorDryBulbTemperatureforCrankcaseHeater(
+      double maximumOutdoorDryBulbTemperatureforCrankcaseHeater) {
+      bool result =
+        setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MaximumOutdoorDryBulbTemperatureforCrankcaseHeater,
+                  maximumOutdoorDryBulbTemperatureforCrankcaseHeater);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setDefrostStrategy(const std::string& defrostStrategy) {
+      bool result = setString(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::DefrostStrategy, defrostStrategy);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setDefrostControl(const std::string& defrostControl) {
+      bool result = setString(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::DefrostControl, defrostControl);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setDefrostEnergyInputRatioModifierFunctionofTemperatureCurve(
+      const Curve& curve) {
+      bool result = setPointer(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::DefrostEnergyInputRatioModifierFunctionofTemperatureCurveName,
+        curve.handle());
+      return result;
+    }
+
+    void AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::resetDefrostEnergyInputRatioModifierFunctionofTemperatureCurve() {
+      bool result = setString(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::DefrostEnergyInputRatioModifierFunctionofTemperatureCurveName,
+        "");
+      OS_ASSERT(result);
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setDefrostTimePeriodFraction(double defrostTimePeriodFraction) {
+      bool result =
+        setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::DefrostTimePeriodFraction, defrostTimePeriodFraction);
+      return result;
+    }
+
+    bool
+      AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setResistiveDefrostHeaterCapacity(double resistiveDefrostHeaterCapacity) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::ResistiveDefrostHeaterCapacity,
+                              resistiveDefrostHeaterCapacity);
+      return result;
+    }
+
+    void AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::autosizeResistiveDefrostHeaterCapacity() {
+      bool result = setString(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::ResistiveDefrostHeaterCapacity, "autosize");
+      OS_ASSERT(result);
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setMaximumOutdoorDrybulbTemperatureforDefrostOperation(
+      double maximumOutdoorDrybulbTemperatureforDefrostOperation) {
+      bool result =
+        setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::MaximumOutdoorDrybulbTemperatureforDefrostOperation,
+                  maximumOutdoorDrybulbTemperatureforDefrostOperation);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setInitialHeatRecoveryCoolingCapacityFraction(
+      double initialHeatRecoveryCoolingCapacityFraction) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::InitialHeatRecoveryCoolingCapacityFraction,
+                              initialHeatRecoveryCoolingCapacityFraction);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setHeatRecoveryCoolingCapacityTimeConstant(
+      double heatRecoveryCoolingCapacityTimeConstant) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::HeatRecoveryCoolingCapacityTimeConstant,
+                              heatRecoveryCoolingCapacityTimeConstant);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setInitialHeatRecoveryCoolingEnergyFraction(
+      double initialHeatRecoveryCoolingEnergyFraction) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::InitialHeatRecoveryCoolingEnergyFraction,
+                              initialHeatRecoveryCoolingEnergyFraction);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setHeatRecoveryCoolingEnergyTimeConstant(
+      double heatRecoveryCoolingEnergyTimeConstant) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::HeatRecoveryCoolingEnergyTimeConstant,
+                              heatRecoveryCoolingEnergyTimeConstant);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setInitialHeatRecoveryHeatingCapacityFraction(
+      double initialHeatRecoveryHeatingCapacityFraction) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::InitialHeatRecoveryHeatingCapacityFraction,
+                              initialHeatRecoveryHeatingCapacityFraction);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setHeatRecoveryHeatingCapacityTimeConstant(
+      double heatRecoveryHeatingCapacityTimeConstant) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::HeatRecoveryHeatingCapacityTimeConstant,
+                              heatRecoveryHeatingCapacityTimeConstant);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setInitialHeatRecoveryHeatingEnergyFraction(
+      double initialHeatRecoveryHeatingEnergyFraction) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::InitialHeatRecoveryHeatingEnergyFraction,
+                              initialHeatRecoveryHeatingEnergyFraction);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setHeatRecoveryHeatingEnergyTimeConstant(
+      double heatRecoveryHeatingEnergyTimeConstant) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::HeatRecoveryHeatingEnergyTimeConstant,
+                              heatRecoveryHeatingEnergyTimeConstant);
+      OS_ASSERT(result);
+      return result;
+    }
+
+    bool
+      AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setCompressorMaximumDeltaPressure(double compressorMaximumDeltaPressure) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::CompressorMaximumDeltaPressure,
+                              compressorMaximumDeltaPressure);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setCompressorInverterEfficiency(double compressorInverterEfficiency) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::CompressorInverterEfficiency,
+                              compressorInverterEfficiency);
+      return result;
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setCompressorEvaporativeCapacityCorrectionFactor(
+      double compressorEvaporativeCapacityCorrectionFactor) {
+      bool result =
+        setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::CompressorEvaporativeCapacityCorrectionFactor,
+                  compressorEvaporativeCapacityCorrectionFactor);
+      return result;
+    }
+
+    boost::optional<Curve>
+      AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::optionalOutdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve()
+        const {
+      return getObject<ModelObject>().getModelObjectTarget<Curve>(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::OutdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurveName);
+    }
+
+    boost::optional<Curve>
+      AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::optionalOutdoorUnitCondensingTemperatureFunctionofSubcoolingCurve() const {
+      return getObject<ModelObject>().getModelObjectTarget<Curve>(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::OutdoorUnitCondensingTemperatureFunctionofSubcoolingCurveName);
+    }
+
+    boost::optional<Schedule> AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::optionalAvailabilitySchedule() const {
+      return getObject<ModelObject>().getModelObjectTarget<Schedule>(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::AvailabilitySchedule);
+    }
+
+    ModelObjectList AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::vrfModelObjectList() const {
+      boost::optional<ModelObjectList> mo = getObject<ModelObject>().getModelObjectTarget<ModelObjectList>(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::ZoneTerminalUnitList);
+
+      OS_ASSERT(mo);
+
+      return mo.get();
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::setVRFModelObjectList(const ModelObjectList& modelObjectList) {
+      return setPointer(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::ZoneTerminalUnitList, modelObjectList.handle());
+    }
+
+    bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::addTerminal(ZoneHVACTerminalUnitVariableRefrigerantFlow& vrf) {
+      if (!vrf.isFluidTemperatureControl()) {
+        LOG(Warn, "For " << briefDescription() << ", cannot add a terminal that uses non-FluidTemperatureControl coils: " << vrf.briefDescription());
+        return false;
+      }
+      return vrfModelObjectList().addModelObject(vrf);
+    }
+
+    void AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::removeTerminal(ZoneHVACTerminalUnitVariableRefrigerantFlow& vrf) {
+      vrfModelObjectList().removeModelObject(vrf);
+    }
+
+    void AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::removeAllTerminals() {
+      vrfModelObjectList().removeAllModelObjects();
+    }
+
+    std::vector<ZoneHVACTerminalUnitVariableRefrigerantFlow> AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::terminals() const {
+      return subsetCastVector<ZoneHVACTerminalUnitVariableRefrigerantFlow>(vrfModelObjectList().modelObjects());
+    }
+
+    boost::optional<double> AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::autosizedGrossRatedTotalCoolingCapacity() const {
+      return getAutosizedValue("Design Size Rated Total Cooling Capacity (gross)", "W");
+    }
+
+    boost::optional<double> AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl::autosizedGrossRatedHeatingCapacity() const {
+      return getAutosizedValue("Design Size Rated Total Heating Capacity", "W");
+    }
+
+  }  // namespace detail
+
+  AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR(const Model& model)
+    : HVACComponent(AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::iddObjectType(), model) {
+    OS_ASSERT(getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>());
+
+    bool ok = true;
+    Schedule schedule = model.alwaysOnDiscreteSchedule();
+    ok = setAvailabilitySchedule(schedule);
+    OS_ASSERT(ok);
+    ok = setRefrigerantType("R410a");
+    OS_ASSERT(ok);
+    ok = setRatedEvaporativeCapacity(40000);
+    OS_ASSERT(ok);
+    ok = setRatedCompressorPowerPerUnitofRatedEvaporativeCapacity(0.35);
+    OS_ASSERT(ok);
+    ok = setMinimumOutdoorAirTemperatureinCoolingOnlyMode(-6.0);
+    OS_ASSERT(ok);
+    ok = setMaximumOutdoorAirTemperatureinCoolingOnlyMode(43.0);
+    OS_ASSERT(ok);
+    ok = setMinimumOutdoorAirTemperatureinHeatingOnlyMode(-20.0);
+    OS_ASSERT(ok);
+    ok = setMaximumOutdoorAirTemperatureinHeatingOnlyMode(16.0);
+    OS_ASSERT(ok);
+    ok = setMinimumOutdoorTemperatureinHeatRecoveryMode(-20.0);
+    OS_ASSERT(ok);
+    ok = setMaximumOutdoorTemperatureinHeatRecoveryMode(43.0);
+    OS_ASSERT(ok);
+    ok = setRefrigerantTemperatureControlAlgorithmforIndoorUnit("VariableTemp");
+    OS_ASSERT(ok);
+    ok = setReferenceEvaporatingTemperatureforIndoorUnit(6.0);
+    OS_ASSERT(ok);
+    ok = setReferenceCondensingTemperatureforIndoorUnit(44.0);
+    OS_ASSERT(ok);
+    ok = setVariableEvaporatingTemperatureMinimumforIndoorUnit(4.0);
+    OS_ASSERT(ok);
+    ok = setVariableEvaporatingTemperatureMaximumforIndoorUnit(13.0);
+    OS_ASSERT(ok);
+    ok = setVariableCondensingTemperatureMinimumforIndoorUnit(42.0);
+    OS_ASSERT(ok);
+    ok = setVariableCondensingTemperatureMaximumforIndoorUnit(46.0);
+    OS_ASSERT(ok);
+    ok = setOutdoorUnitEvaporatorReferenceSuperheating(3);
+    OS_ASSERT(ok);
+    ok = setOutdoorUnitCondenserReferenceSubcooling(5);
+    OS_ASSERT(ok);
+    ok = setOutdoorUnitEvaporatorRatedBypassFactor(0.4);
+    OS_ASSERT(ok);
+    ok = setOutdoorUnitCondenserRatedBypassFactor(0.2);
+    OS_ASSERT(ok);
+    ok = setDifferencebetweenOutdoorUnitEvaporatingTemperatureandOutdoorAirTemperatureinHeatRecoveryMode(5);
+    OS_ASSERT(ok);
+    ok = setOutdoorUnitHeatExchangerCapacityRatio(0.3);
+    OS_ASSERT(ok);
+    ok = setOutdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity(4.25E-3);
+    OS_ASSERT(ok);
+    ok = setOutdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity(7.50E-5);
+    OS_ASSERT(ok);
+    ok = setDiameterofMainPipeforSuctionGas(0.0762);
+    OS_ASSERT(ok);
+    ok = setDiameterofMainPipeforDischargeGas(0.0762);
+    OS_ASSERT(ok);
+    ok = setLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(30.0);
+    OS_ASSERT(ok);
+    ok = setEquivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(36.0);
+    OS_ASSERT(ok);
+    ok = setHeightDifferenceBetweenOutdoorUnitandIndoorUnits(5.0);
+    OS_ASSERT(ok);
+    ok = setMainPipeInsulationThickness(0.02);
+    OS_ASSERT(ok);
+    ok = setMainPipeInsulationThermalConductivity(0.032);
+    OS_ASSERT(ok);
+    ok = setCrankcaseHeaterPowerperCompressor(33.0);
+    OS_ASSERT(ok);
+    ok = setNumberofCompressors(2);
+    OS_ASSERT(ok);
+    ok = setRatioofCompressorSizetoTotalCompressorCapacity(0.5);
+    OS_ASSERT(ok);
+    ok = setMaximumOutdoorDryBulbTemperatureforCrankcaseHeater(5.0);
+    OS_ASSERT(ok);
+    ok = setDefrostStrategy("Resistive");
+    OS_ASSERT(ok);
+    ok = setDefrostControl("Timed");
+    OS_ASSERT(ok);
+    ok = setDefrostTimePeriodFraction(0.058333);
+    OS_ASSERT(ok);
+    ok = setResistiveDefrostHeaterCapacity(0.0);
+    OS_ASSERT(ok);
+    ok = setMaximumOutdoorDrybulbTemperatureforDefrostOperation(5.0);
+    OS_ASSERT(ok);
+    ok = setInitialHeatRecoveryCoolingCapacityFraction(1);
+    OS_ASSERT(ok);
+    ok = setHeatRecoveryCoolingCapacityTimeConstant(0);
+    OS_ASSERT(ok);
+    ok = setInitialHeatRecoveryCoolingEnergyFraction(1);
+    OS_ASSERT(ok);
+    ok = setHeatRecoveryCoolingEnergyTimeConstant(0);
+    OS_ASSERT(ok);
+    ok = setInitialHeatRecoveryHeatingCapacityFraction(1);
+    OS_ASSERT(ok);
+    ok = setHeatRecoveryHeatingCapacityTimeConstant(0);
+    OS_ASSERT(ok);
+    ok = setInitialHeatRecoveryHeatingEnergyFraction(1);
+    OS_ASSERT(ok);
+    ok = setHeatRecoveryHeatingEnergyTimeConstant(0);
+    OS_ASSERT(ok);
+    ok = setCompressorMaximumDeltaPressure(4500000.0);
+    OS_ASSERT(ok);
+    ok = setCompressorInverterEfficiency(0.95);
+    OS_ASSERT(ok);
+    ok = setCompressorEvaporativeCapacityCorrectionFactor(1.0);
+    OS_ASSERT(ok);
+
+    {
+      CurveQuadratic outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve(model);
+      outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve.setName(name().get() + " OUEvapTempCurve");
+      outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve.setCoefficient1Constant(0);
+      outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve.setCoefficient2x(6.05E-1);
+      outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve.setCoefficient3xPOW2(2.50E-2);
+      outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve.setMinimumValueofx(0);
+      outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve.setMaximumValueofx(15);
+      ok = setOutdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve(outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve);
+      OS_ASSERT(ok);
+    }
+
+    {
+      CurveQuadratic outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve(model);
+      outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve.setName(name().get() + " OUCondTempCurve");
+      outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve.setCoefficient1Constant(0);
+      outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve.setCoefficient2x(-2.91);
+      outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve.setCoefficient3xPOW2(1.180);
+      outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve.setMinimumValueofx(0);
+      outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve.setMaximumValueofx(5);
+      ok = setOutdoorUnitCondensingTemperatureFunctionofSubcoolingCurve(outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve);
+      OS_ASSERT(ok);
+    }
+
+    //ok = setDefrostEnergyInputRatioModifierFunctionofTemperatureCurve();
+    //OS_ASSERT(ok);
+
+    {
+      ModelObjectList vrfModelObjectList(model);
+      getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setVRFModelObjectList(vrfModelObjectList);
+      OS_ASSERT(ok);
+    }
+
+    {
+      ModelObjectList loadingIndexList(model);
+      ok = getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setLoadingIndexList(loadingIndexList);
+      OS_ASSERT(ok);
+    }
+
+    {
+      CurveBiquadratic evaporativeCapacityMultiplierFunctionofTemperatureCurve1(model);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve1.setName(name().get() + " MinSpdCooling");
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve1.setCoefficient1Constant(3.19E-01);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve1.setCoefficient2x(-1.26E-03);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve1.setCoefficient3xPOW2(-2.15E-05);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve1.setCoefficient4y(1.20E-02);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve1.setCoefficient5yPOW2(1.05E-04);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve1.setCoefficient6xTIMESY(-8.66E-05);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve1.setMinimumValueofx(15);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve1.setMaximumValueofx(65);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve1.setMinimumValueofy(-30);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve1.setMaximumValueofy(15);
+
+      CurveBiquadratic compressorPowerMultiplierFunctionofTemperatureCurve1(model);
+      compressorPowerMultiplierFunctionofTemperatureCurve1.setName(name().get() + " MinSpdPower");
+      compressorPowerMultiplierFunctionofTemperatureCurve1.setCoefficient1Constant(8.79E-02);
+      compressorPowerMultiplierFunctionofTemperatureCurve1.setCoefficient2x(-1.72E-04);
+      compressorPowerMultiplierFunctionofTemperatureCurve1.setCoefficient3xPOW2(6.93E-05);
+      compressorPowerMultiplierFunctionofTemperatureCurve1.setCoefficient4y(-3.38E-05);
+      compressorPowerMultiplierFunctionofTemperatureCurve1.setCoefficient5yPOW2(-8.10E-06);
+      compressorPowerMultiplierFunctionofTemperatureCurve1.setCoefficient6xTIMESY(-1.04E-05);
+      compressorPowerMultiplierFunctionofTemperatureCurve1.setMinimumValueofx(15);
+      compressorPowerMultiplierFunctionofTemperatureCurve1.setMaximumValueofx(65);
+      compressorPowerMultiplierFunctionofTemperatureCurve1.setMinimumValueofy(-30);
+      compressorPowerMultiplierFunctionofTemperatureCurve1.setMaximumValueofy(15);
+
+      LoadingIndex loadingIndex1(model, 1500, evaporativeCapacityMultiplierFunctionofTemperatureCurve1,
+                                 compressorPowerMultiplierFunctionofTemperatureCurve1);
+      OS_ASSERT(addLoadingIndex(loadingIndex1));
+    }
+
+    {
+      CurveBiquadratic evaporativeCapacityMultiplierFunctionofTemperatureCurve2(model);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve2.setName(name().get() + " Spd1Cooling");
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve2.setCoefficient1Constant(8.12E-01);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve2.setCoefficient2x(-4.23E-03);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve2.setCoefficient3xPOW2(-4.11E-05);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve2.setCoefficient4y(2.97E-02);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve2.setCoefficient5yPOW2(2.67E-04);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve2.setCoefficient6xTIMESY(-2.23E-04);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve2.setMinimumValueofx(15);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve2.setMaximumValueofx(65);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve2.setMinimumValueofy(-30);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve2.setMaximumValueofy(15);
+
+      CurveBiquadratic compressorPowerMultiplierFunctionofTemperatureCurve2(model);
+      compressorPowerMultiplierFunctionofTemperatureCurve2.setName(name().get() + " Spd1Power");
+      compressorPowerMultiplierFunctionofTemperatureCurve2.setCoefficient1Constant(3.26E-01);
+      compressorPowerMultiplierFunctionofTemperatureCurve2.setCoefficient2x(-2.20E-03);
+      compressorPowerMultiplierFunctionofTemperatureCurve2.setCoefficient3xPOW2(1.42E-04);
+      compressorPowerMultiplierFunctionofTemperatureCurve2.setCoefficient4y(2.82E-03);
+      compressorPowerMultiplierFunctionofTemperatureCurve2.setCoefficient5yPOW2(2.86E-05);
+      compressorPowerMultiplierFunctionofTemperatureCurve2.setCoefficient6xTIMESY(-3.50E-05);
+      compressorPowerMultiplierFunctionofTemperatureCurve2.setMinimumValueofx(15);
+      compressorPowerMultiplierFunctionofTemperatureCurve2.setMaximumValueofx(65);
+      compressorPowerMultiplierFunctionofTemperatureCurve2.setMinimumValueofy(-30);
+      compressorPowerMultiplierFunctionofTemperatureCurve2.setMaximumValueofy(15);
+
+      LoadingIndex loadingIndex2(model, 3600, evaporativeCapacityMultiplierFunctionofTemperatureCurve2,
+                                 compressorPowerMultiplierFunctionofTemperatureCurve2);
+      OS_ASSERT(addLoadingIndex(loadingIndex2));
+    }
+
+    {
+      CurveBiquadratic evaporativeCapacityMultiplierFunctionofTemperatureCurve3(model);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve3.setName(name().get() + " Spd2Cooling");
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve3.setCoefficient1Constant(1.32E+00);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve3.setCoefficient2x(-6.20E-03);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve3.setCoefficient3xPOW2(-7.10E-05);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve3.setCoefficient4y(4.89E-02);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve3.setCoefficient5yPOW2(4.59E-04);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve3.setCoefficient6xTIMESY(-3.67E-04);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve3.setMinimumValueofx(15);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve3.setMaximumValueofx(65);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve3.setMinimumValueofy(-30);
+      evaporativeCapacityMultiplierFunctionofTemperatureCurve3.setMaximumValueofy(15);
+
+      CurveBiquadratic compressorPowerMultiplierFunctionofTemperatureCurve3(model);
+      compressorPowerMultiplierFunctionofTemperatureCurve3.setName(name().get() + " Spd2Power");
+      compressorPowerMultiplierFunctionofTemperatureCurve3.setCoefficient1Constant(6.56E-01);
+      compressorPowerMultiplierFunctionofTemperatureCurve3.setCoefficient2x(-3.71E-03);
+      compressorPowerMultiplierFunctionofTemperatureCurve3.setCoefficient3xPOW2(2.07E-04);
+      compressorPowerMultiplierFunctionofTemperatureCurve3.setCoefficient4y(1.05E-02);
+      compressorPowerMultiplierFunctionofTemperatureCurve3.setCoefficient5yPOW2(7.36E-05);
+      compressorPowerMultiplierFunctionofTemperatureCurve3.setCoefficient6xTIMESY(-1.57E-04);
+      compressorPowerMultiplierFunctionofTemperatureCurve3.setMinimumValueofx(15);
+      compressorPowerMultiplierFunctionofTemperatureCurve3.setMaximumValueofx(65);
+      compressorPowerMultiplierFunctionofTemperatureCurve3.setMinimumValueofy(-30);
+      compressorPowerMultiplierFunctionofTemperatureCurve3.setMaximumValueofy(15);
+
+      LoadingIndex loadingIndex3(model, 6000, evaporativeCapacityMultiplierFunctionofTemperatureCurve3,
+                                 compressorPowerMultiplierFunctionofTemperatureCurve3);
+      OS_ASSERT(addLoadingIndex(loadingIndex3));
+    }
+  }
+
+  IddObjectType AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::iddObjectType() {
+    return IddObjectType(IddObjectType::OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HR);
+  }
+
+  std::vector<std::string> AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::refrigerantTypeValues() {
+    return getIddKeyNames(IddFactory::instance().getObject(iddObjectType()).get(),
+                          OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::RefrigerantType);
+  }
+
+  std::vector<std::string> AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::validRefrigerantTypeValues() {
+    return refrigerantTypeValues();
+  }
+
+  std::vector<std::string>
+    AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::refrigerantTemperatureControlAlgorithmforIndoorUnitValues() {
+    return getIddKeyNames(
+      IddFactory::instance().getObject(iddObjectType()).get(),
+      OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::RefrigerantTemperatureControlAlgorithmforIndoorUnit);
+  }
+
+  std::vector<std::string>
+    AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::validRefrigerantTemperatureControlAlgorithmforIndoorUnitValues() {
+    return refrigerantTemperatureControlAlgorithmforIndoorUnitValues();
+  }
+
+  std::vector<std::string> AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::defrostStrategyValues() {
+    return getIddKeyNames(IddFactory::instance().getObject(iddObjectType()).get(),
+                          OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::DefrostStrategy);
+  }
+
+  std::vector<std::string> AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::validDefrostStrategyValues() {
+    return defrostStrategyValues();
+  }
+
+  std::vector<std::string> AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::defrostControlValues() {
+    return getIddKeyNames(IddFactory::instance().getObject(iddObjectType()).get(),
+                          OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_HRFields::DefrostControl);
+  }
+
+  std::vector<std::string> AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::validDefrostControlValues() {
+    return defrostControlValues();
+  }
+
+  Schedule AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::availabilitySchedule() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->availabilitySchedule();
+  }
+
+  std::string AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::refrigerantType() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->refrigerantType();
+  }
+
+  boost::optional<double> AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::ratedEvaporativeCapacity() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->ratedEvaporativeCapacity();
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::isRatedEvaporativeCapacityAutosized() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->isRatedEvaporativeCapacityAutosized();
+  }
+
+  boost::optional<double> AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::autosizedRatedEvaporativeCapacity() {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->autosizedRatedEvaporativeCapacity();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::ratedCompressorPowerPerUnitofRatedEvaporativeCapacity() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()
+      ->ratedCompressorPowerPerUnitofRatedEvaporativeCapacity();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::minimumOutdoorAirTemperatureinCoolingOnlyMode() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->minimumOutdoorAirTemperatureinCoolingOnlyMode();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::maximumOutdoorAirTemperatureinCoolingOnlyMode() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->maximumOutdoorAirTemperatureinCoolingOnlyMode();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::minimumOutdoorAirTemperatureinHeatingOnlyMode() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->minimumOutdoorAirTemperatureinHeatingOnlyMode();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::maximumOutdoorAirTemperatureinHeatingOnlyMode() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->maximumOutdoorAirTemperatureinHeatingOnlyMode();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::minimumOutdoorTemperatureinHeatRecoveryMode() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->minimumOutdoorTemperatureinHeatRecoveryMode();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::maximumOutdoorTemperatureinHeatRecoveryMode() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->maximumOutdoorTemperatureinHeatRecoveryMode();
+  }
+
+  std::string AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::refrigerantTemperatureControlAlgorithmforIndoorUnit() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()
+      ->refrigerantTemperatureControlAlgorithmforIndoorUnit();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::referenceEvaporatingTemperatureforIndoorUnit() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->referenceEvaporatingTemperatureforIndoorUnit();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::referenceCondensingTemperatureforIndoorUnit() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->referenceCondensingTemperatureforIndoorUnit();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::variableEvaporatingTemperatureMinimumforIndoorUnit() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()
+      ->variableEvaporatingTemperatureMinimumforIndoorUnit();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::variableEvaporatingTemperatureMaximumforIndoorUnit() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()
+      ->variableEvaporatingTemperatureMaximumforIndoorUnit();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::variableCondensingTemperatureMinimumforIndoorUnit() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()
+      ->variableCondensingTemperatureMinimumforIndoorUnit();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::variableCondensingTemperatureMaximumforIndoorUnit() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()
+      ->variableCondensingTemperatureMaximumforIndoorUnit();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::outdoorUnitEvaporatorReferenceSuperheating() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->outdoorUnitEvaporatorReferenceSuperheating();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::outdoorUnitCondenserReferenceSubcooling() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->outdoorUnitCondenserReferenceSubcooling();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::outdoorUnitEvaporatorRatedBypassFactor() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->outdoorUnitEvaporatorRatedBypassFactor();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::outdoorUnitCondenserRatedBypassFactor() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->outdoorUnitCondenserRatedBypassFactor();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::
+    differencebetweenOutdoorUnitEvaporatingTemperatureandOutdoorAirTemperatureinHeatRecoveryMode() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()
+      ->differencebetweenOutdoorUnitEvaporatingTemperatureandOutdoorAirTemperatureinHeatRecoveryMode();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::outdoorUnitHeatExchangerCapacityRatio() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->outdoorUnitHeatExchangerCapacityRatio();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::outdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()
+      ->outdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::outdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()
+      ->outdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity();
+  }
+
+  Curve AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()
+      ->outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve();
+  }
+
+  Curve AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()
+      ->outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::diameterofMainPipeforSuctionGas() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->diameterofMainPipeforSuctionGas();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::diameterofMainPipeforDischargeGas() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->diameterofMainPipeforDischargeGas();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::lengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()
+      ->lengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint();
+  }
+
+  double
+    AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::equivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()
+      ->equivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::heightDifferenceBetweenOutdoorUnitandIndoorUnits() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->heightDifferenceBetweenOutdoorUnitandIndoorUnits();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::mainPipeInsulationThickness() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->mainPipeInsulationThickness();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::mainPipeInsulationThermalConductivity() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->mainPipeInsulationThermalConductivity();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::crankcaseHeaterPowerperCompressor() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->crankcaseHeaterPowerperCompressor();
+  }
+
+  int AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::numberofCompressors() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->numberofCompressors();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::ratioofCompressorSizetoTotalCompressorCapacity() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->ratioofCompressorSizetoTotalCompressorCapacity();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::maximumOutdoorDryBulbTemperatureforCrankcaseHeater() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()
+      ->maximumOutdoorDryBulbTemperatureforCrankcaseHeater();
+  }
+
+  std::string AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::defrostStrategy() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->defrostStrategy();
+  }
+
+  std::string AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::defrostControl() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->defrostControl();
+  }
+
+  boost::optional<Curve>
+    AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::defrostEnergyInputRatioModifierFunctionofTemperatureCurve() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()
+      ->defrostEnergyInputRatioModifierFunctionofTemperatureCurve();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::defrostTimePeriodFraction() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->defrostTimePeriodFraction();
+  }
+
+  boost::optional<double> AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::resistiveDefrostHeaterCapacity() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->resistiveDefrostHeaterCapacity();
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::isResistiveDefrostHeaterCapacityAutosized() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->isResistiveDefrostHeaterCapacityAutosized();
+  }
+
+  boost::optional<double> AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::autosizedResistiveDefrostHeaterCapacity() {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->autosizedResistiveDefrostHeaterCapacity();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::maximumOutdoorDrybulbTemperatureforDefrostOperation() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()
+      ->maximumOutdoorDrybulbTemperatureforDefrostOperation();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::initialHeatRecoveryCoolingCapacityFraction() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->initialHeatRecoveryCoolingCapacityFraction();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::heatRecoveryCoolingCapacityTimeConstant() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->heatRecoveryCoolingCapacityTimeConstant();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::initialHeatRecoveryCoolingEnergyFraction() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->initialHeatRecoveryCoolingEnergyFraction();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::heatRecoveryCoolingEnergyTimeConstant() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->heatRecoveryCoolingEnergyTimeConstant();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::initialHeatRecoveryHeatingCapacityFraction() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->initialHeatRecoveryHeatingCapacityFraction();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::heatRecoveryHeatingCapacityTimeConstant() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->heatRecoveryHeatingCapacityTimeConstant();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::initialHeatRecoveryHeatingEnergyFraction() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->initialHeatRecoveryHeatingEnergyFraction();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::heatRecoveryHeatingEnergyTimeConstant() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->heatRecoveryHeatingEnergyTimeConstant();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::compressorMaximumDeltaPressure() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->compressorMaximumDeltaPressure();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::compressorInverterEfficiency() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->compressorInverterEfficiency();
+  }
+
+  double AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::compressorEvaporativeCapacityCorrectionFactor() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->compressorEvaporativeCapacityCorrectionFactor();
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setAvailabilitySchedule(Schedule& schedule) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setAvailabilitySchedule(schedule);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setRefrigerantType(const std::string& refrigerantType) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setRefrigerantType(refrigerantType);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setRatedEvaporativeCapacity(double ratedEvaporativeCapacity) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setRatedEvaporativeCapacity(
+      ratedEvaporativeCapacity);
+  }
+
+  void AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::autosizeRatedEvaporativeCapacity() {
+    getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->autosizeRatedEvaporativeCapacity();
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setRatedCompressorPowerPerUnitofRatedEvaporativeCapacity(
+    double ratedCompressorPowerPerUnitofRatedEvaporativeCapacity) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()
+      ->setRatedCompressorPowerPerUnitofRatedEvaporativeCapacity(ratedCompressorPowerPerUnitofRatedEvaporativeCapacity);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setMinimumOutdoorAirTemperatureinCoolingOnlyMode(
+    double minimumOutdoorAirTemperatureinCoolingOnlyMode) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setMinimumOutdoorAirTemperatureinCoolingOnlyMode(
+      minimumOutdoorAirTemperatureinCoolingOnlyMode);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setMaximumOutdoorAirTemperatureinCoolingOnlyMode(
+    double maximumOutdoorAirTemperatureinCoolingOnlyMode) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setMaximumOutdoorAirTemperatureinCoolingOnlyMode(
+      maximumOutdoorAirTemperatureinCoolingOnlyMode);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setMinimumOutdoorAirTemperatureinHeatingOnlyMode(
+    double minimumOutdoorAirTemperatureinHeatingOnlyMode) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setMinimumOutdoorAirTemperatureinHeatingOnlyMode(
+      minimumOutdoorAirTemperatureinHeatingOnlyMode);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setMaximumOutdoorAirTemperatureinHeatingOnlyMode(
+    double maximumOutdoorAirTemperatureinHeatingOnlyMode) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setMaximumOutdoorAirTemperatureinHeatingOnlyMode(
+      maximumOutdoorAirTemperatureinHeatingOnlyMode);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setMinimumOutdoorTemperatureinHeatRecoveryMode(
+    double minimumOutdoorTemperatureinHeatRecoveryMode) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setMinimumOutdoorTemperatureinHeatRecoveryMode(
+      minimumOutdoorTemperatureinHeatRecoveryMode);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setMaximumOutdoorTemperatureinHeatRecoveryMode(
+    double maximumOutdoorTemperatureinHeatRecoveryMode) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setMaximumOutdoorTemperatureinHeatRecoveryMode(
+      maximumOutdoorTemperatureinHeatRecoveryMode);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setRefrigerantTemperatureControlAlgorithmforIndoorUnit(
+    const std::string& refrigerantTemperatureControlAlgorithmforIndoorUnit) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()
+      ->setRefrigerantTemperatureControlAlgorithmforIndoorUnit(refrigerantTemperatureControlAlgorithmforIndoorUnit);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setReferenceEvaporatingTemperatureforIndoorUnit(
+    double referenceEvaporatingTemperatureforIndoorUnit) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setReferenceEvaporatingTemperatureforIndoorUnit(
+      referenceEvaporatingTemperatureforIndoorUnit);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setReferenceCondensingTemperatureforIndoorUnit(
+    double referenceCondensingTemperatureforIndoorUnit) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setReferenceCondensingTemperatureforIndoorUnit(
+      referenceCondensingTemperatureforIndoorUnit);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setVariableEvaporatingTemperatureMinimumforIndoorUnit(
+    double variableEvaporatingTemperatureMinimumforIndoorUnit) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()
+      ->setVariableEvaporatingTemperatureMinimumforIndoorUnit(variableEvaporatingTemperatureMinimumforIndoorUnit);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setVariableEvaporatingTemperatureMaximumforIndoorUnit(
+    double variableEvaporatingTemperatureMaximumforIndoorUnit) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()
+      ->setVariableEvaporatingTemperatureMaximumforIndoorUnit(variableEvaporatingTemperatureMaximumforIndoorUnit);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setVariableCondensingTemperatureMinimumforIndoorUnit(
+    double variableCondensingTemperatureMinimumforIndoorUnit) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()
+      ->setVariableCondensingTemperatureMinimumforIndoorUnit(variableCondensingTemperatureMinimumforIndoorUnit);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setVariableCondensingTemperatureMaximumforIndoorUnit(
+    double variableCondensingTemperatureMaximumforIndoorUnit) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()
+      ->setVariableCondensingTemperatureMaximumforIndoorUnit(variableCondensingTemperatureMaximumforIndoorUnit);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setOutdoorUnitEvaporatorReferenceSuperheating(
+    double outdoorUnitEvaporatorReferenceSuperheating) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setOutdoorUnitEvaporatorReferenceSuperheating(
+      outdoorUnitEvaporatorReferenceSuperheating);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setOutdoorUnitCondenserReferenceSubcooling(
+    double outdoorUnitCondenserReferenceSubcooling) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setOutdoorUnitCondenserReferenceSubcooling(
+      outdoorUnitCondenserReferenceSubcooling);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setOutdoorUnitEvaporatorRatedBypassFactor(
+    double outdoorUnitEvaporatorRatedBypassFactor) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setOutdoorUnitEvaporatorRatedBypassFactor(
+      outdoorUnitEvaporatorRatedBypassFactor);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setOutdoorUnitCondenserRatedBypassFactor(
+    double outdoorUnitCondenserRatedBypassFactor) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setOutdoorUnitCondenserRatedBypassFactor(
+      outdoorUnitCondenserRatedBypassFactor);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::
+    setDifferencebetweenOutdoorUnitEvaporatingTemperatureandOutdoorAirTemperatureinHeatRecoveryMode(
+      double differencebetweenOutdoorUnitEvaporatingTemperatureandOutdoorAirTemperatureinHeatRecoveryMode) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()
+      ->setDifferencebetweenOutdoorUnitEvaporatingTemperatureandOutdoorAirTemperatureinHeatRecoveryMode(
+        differencebetweenOutdoorUnitEvaporatingTemperatureandOutdoorAirTemperatureinHeatRecoveryMode);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setOutdoorUnitHeatExchangerCapacityRatio(
+    double outdoorUnitHeatExchangerCapacityRatio) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setOutdoorUnitHeatExchangerCapacityRatio(
+      outdoorUnitHeatExchangerCapacityRatio);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setOutdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity(
+    double outdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()
+      ->setOutdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity(outdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setOutdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity(
+    double outdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()
+      ->setOutdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity(outdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setOutdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve(
+    const Curve& curve) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()
+      ->setOutdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve(curve);
+  }
+
+  bool
+    AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setOutdoorUnitCondensingTemperatureFunctionofSubcoolingCurve(const Curve& curve) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()
+      ->setOutdoorUnitCondensingTemperatureFunctionofSubcoolingCurve(curve);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setDiameterofMainPipeforSuctionGas(double diameterofMainPipeforSuctionGas) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setDiameterofMainPipeforSuctionGas(
+      diameterofMainPipeforSuctionGas);
+  }
+
+  bool
+    AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setDiameterofMainPipeforDischargeGas(double diameterofMainPipeforDischargeGas) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setDiameterofMainPipeforDischargeGas(
+      diameterofMainPipeforDischargeGas);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(
+    double lengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()
+      ->setLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(lengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setEquivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(
+    double equivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()
+      ->setEquivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(equivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setHeightDifferenceBetweenOutdoorUnitandIndoorUnits(
+    double heightDifferenceBetweenOutdoorUnitandIndoorUnits) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()
+      ->setHeightDifferenceBetweenOutdoorUnitandIndoorUnits(heightDifferenceBetweenOutdoorUnitandIndoorUnits);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setMainPipeInsulationThickness(double mainPipeInsulationThickness) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setMainPipeInsulationThickness(
+      mainPipeInsulationThickness);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setMainPipeInsulationThermalConductivity(
+    double mainPipeInsulationThermalConductivity) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setMainPipeInsulationThermalConductivity(
+      mainPipeInsulationThermalConductivity);
+  }
+
+  bool
+    AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setCrankcaseHeaterPowerperCompressor(double crankcaseHeaterPowerperCompressor) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setCrankcaseHeaterPowerperCompressor(
+      crankcaseHeaterPowerperCompressor);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setNumberofCompressors(int numberofCompressors) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setNumberofCompressors(numberofCompressors);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setRatioofCompressorSizetoTotalCompressorCapacity(
+    double ratioofCompressorSizetoTotalCompressorCapacity) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setRatioofCompressorSizetoTotalCompressorCapacity(
+      ratioofCompressorSizetoTotalCompressorCapacity);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setMaximumOutdoorDryBulbTemperatureforCrankcaseHeater(
+    double maximumOutdoorDryBulbTemperatureforCrankcaseHeater) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()
+      ->setMaximumOutdoorDryBulbTemperatureforCrankcaseHeater(maximumOutdoorDryBulbTemperatureforCrankcaseHeater);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setDefrostStrategy(const std::string& defrostStrategy) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setDefrostStrategy(defrostStrategy);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setDefrostControl(const std::string& defrostControl) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setDefrostControl(defrostControl);
+  }
+
+  bool
+    AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setDefrostEnergyInputRatioModifierFunctionofTemperatureCurve(const Curve& curve) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()
+      ->setDefrostEnergyInputRatioModifierFunctionofTemperatureCurve(curve);
+  }
+
+  void AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::resetDefrostEnergyInputRatioModifierFunctionofTemperatureCurve() {
+    getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()
+      ->resetDefrostEnergyInputRatioModifierFunctionofTemperatureCurve();
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setDefrostTimePeriodFraction(double defrostTimePeriodFraction) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setDefrostTimePeriodFraction(
+      defrostTimePeriodFraction);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setResistiveDefrostHeaterCapacity(double resistiveDefrostHeaterCapacity) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setResistiveDefrostHeaterCapacity(
+      resistiveDefrostHeaterCapacity);
+  }
+
+  void AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::autosizeResistiveDefrostHeaterCapacity() {
+    getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->autosizeResistiveDefrostHeaterCapacity();
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setMaximumOutdoorDrybulbTemperatureforDefrostOperation(
+    double maximumOutdoorDrybulbTemperatureforDefrostOperation) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()
+      ->setMaximumOutdoorDrybulbTemperatureforDefrostOperation(maximumOutdoorDrybulbTemperatureforDefrostOperation);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setInitialHeatRecoveryCoolingCapacityFraction(
+    double initialHeatRecoveryCoolingCapacityFraction) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setInitialHeatRecoveryCoolingCapacityFraction(
+      initialHeatRecoveryCoolingCapacityFraction);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setHeatRecoveryCoolingCapacityTimeConstant(
+    double heatRecoveryCoolingCapacityTimeConstant) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setHeatRecoveryCoolingCapacityTimeConstant(
+      heatRecoveryCoolingCapacityTimeConstant);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setInitialHeatRecoveryCoolingEnergyFraction(
+    double initialHeatRecoveryCoolingEnergyFraction) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setInitialHeatRecoveryCoolingEnergyFraction(
+      initialHeatRecoveryCoolingEnergyFraction);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setHeatRecoveryCoolingEnergyTimeConstant(
+    double heatRecoveryCoolingEnergyTimeConstant) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setHeatRecoveryCoolingEnergyTimeConstant(
+      heatRecoveryCoolingEnergyTimeConstant);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setInitialHeatRecoveryHeatingCapacityFraction(
+    double initialHeatRecoveryHeatingCapacityFraction) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setInitialHeatRecoveryHeatingCapacityFraction(
+      initialHeatRecoveryHeatingCapacityFraction);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setHeatRecoveryHeatingCapacityTimeConstant(
+    double heatRecoveryHeatingCapacityTimeConstant) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setHeatRecoveryHeatingCapacityTimeConstant(
+      heatRecoveryHeatingCapacityTimeConstant);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setInitialHeatRecoveryHeatingEnergyFraction(
+    double initialHeatRecoveryHeatingEnergyFraction) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setInitialHeatRecoveryHeatingEnergyFraction(
+      initialHeatRecoveryHeatingEnergyFraction);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setHeatRecoveryHeatingEnergyTimeConstant(
+    double heatRecoveryHeatingEnergyTimeConstant) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setHeatRecoveryHeatingEnergyTimeConstant(
+      heatRecoveryHeatingEnergyTimeConstant);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setCompressorMaximumDeltaPressure(double compressorMaximumDeltaPressure) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setCompressorMaximumDeltaPressure(
+      compressorMaximumDeltaPressure);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setCompressorInverterEfficiency(double compressorInverterEfficiency) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setCompressorInverterEfficiency(
+      compressorInverterEfficiency);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::setCompressorEvaporativeCapacityCorrectionFactor(
+    double compressorEvaporativeCapacityCorrectionFactor) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->setCompressorEvaporativeCapacityCorrectionFactor(
+      compressorEvaporativeCapacityCorrectionFactor);
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::addTerminal(ZoneHVACTerminalUnitVariableRefrigerantFlow& vrf) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->addTerminal(vrf);
+  }
+
+  void AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::removeTerminal(ZoneHVACTerminalUnitVariableRefrigerantFlow& vrf) {
+    getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->removeTerminal(vrf);
+  }
+
+  void AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::removeAllTerminals() {
+    getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->removeAllTerminals();
+  }
+
+  std::vector<ZoneHVACTerminalUnitVariableRefrigerantFlow> AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::terminals() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->terminals();
+  }
+
+  bool AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::addLoadingIndex(LoadingIndex& loadingIndex) {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->addLoadingIndex(loadingIndex);
+  }
+
+  void AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::removeLoadingIndex(LoadingIndex& loadingIndex) {
+    getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->removeLoadingIndex(loadingIndex);
+  }
+
+  void AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::removeAllLoadingIndexes() {
+    getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->removeAllLoadingIndexes();
+  }
+
+  std::vector<LoadingIndex> AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::loadingIndexes() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->loadingIndexes();
+  }
+
+  boost::optional<double> AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::autosizedGrossRatedTotalCoolingCapacity() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->autosizedGrossRatedTotalCoolingCapacity();
+  }
+
+  boost::optional<double> AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::autosizedGrossRatedHeatingCapacity() const {
+    return getImpl<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl>()->autosizedGrossRatedHeatingCapacity();
+  }
+
+  /// @cond
+  AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR(
+    std::shared_ptr<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl> impl)
+    : HVACComponent(std::move(impl)) {}
+  /// @endcond
+
+}  // namespace model
+}  // namespace openstudio
diff --git a/src/model/AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR.hpp b/src/model/AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR.hpp
new file mode 100644
index 00000000000..48e5306431c
--- /dev/null
+++ b/src/model/AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR.hpp
@@ -0,0 +1,375 @@
+/***********************************************************************************************************************
+*  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_AIRCONDITIONERVARIABLEREFRIGERANTFLOWFLUIDTEMPERATURECONTROLHR_HPP
+#define MODEL_AIRCONDITIONERVARIABLEREFRIGERANTFLOWFLUIDTEMPERATURECONTROLHR_HPP
+
+#include <vector>
+#include <model/ModelAPI.hpp>
+#include "HVACComponent.hpp"
+
+namespace openstudio {
+
+namespace model {
+
+  class Schedule;
+  class Curve;
+  class ThermalZone;
+  class ZoneHVACTerminalUnitVariableRefrigerantFlow;
+  class LoadingIndex;
+
+  namespace detail {
+
+    class AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl;
+
+  }  // namespace detail
+
+  /** AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR is a HVACComponent that wraps the OpenStudio IDD object 'OS:AirConditioner:VariableRefrigerantFlow:FluidTemperatureControl:HR'. */
+  class MODEL_API AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR : public HVACComponent
+  {
+   public:
+    /** @name Constructors and Destructors */
+    //@{
+
+    explicit AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR(const Model& model);
+
+    virtual ~AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR() = default;
+
+    //@}
+
+    static IddObjectType iddObjectType();
+
+    static std::vector<std::string> refrigerantTypeValues();
+    static std::vector<std::string> validRefrigerantTypeValues();
+
+    static std::vector<std::string> refrigerantTemperatureControlAlgorithmforIndoorUnitValues();
+    static std::vector<std::string> validRefrigerantTemperatureControlAlgorithmforIndoorUnitValues();
+
+    static std::vector<std::string> defrostStrategyValues();
+    static std::vector<std::string> validDefrostStrategyValues();
+
+    static std::vector<std::string> defrostControlValues();
+    static std::vector<std::string> validDefrostControlValues();
+
+    /** @name Getters */
+    //@{
+
+    Schedule availabilitySchedule() const;
+
+    std::string refrigerantType() const;
+
+    boost::optional<double> ratedEvaporativeCapacity() const;
+
+    bool isRatedEvaporativeCapacityAutosized() const;
+
+    double ratedCompressorPowerPerUnitofRatedEvaporativeCapacity() const;
+
+    double minimumOutdoorAirTemperatureinCoolingOnlyMode() const;
+
+    double maximumOutdoorAirTemperatureinCoolingOnlyMode() const;
+
+    double minimumOutdoorAirTemperatureinHeatingOnlyMode() const;
+
+    double maximumOutdoorAirTemperatureinHeatingOnlyMode() const;
+
+    double minimumOutdoorTemperatureinHeatRecoveryMode() const;
+
+    double maximumOutdoorTemperatureinHeatRecoveryMode() const;
+
+    std::string refrigerantTemperatureControlAlgorithmforIndoorUnit() const;
+
+    double referenceEvaporatingTemperatureforIndoorUnit() const;
+
+    double referenceCondensingTemperatureforIndoorUnit() const;
+
+    double variableEvaporatingTemperatureMinimumforIndoorUnit() const;
+
+    double variableEvaporatingTemperatureMaximumforIndoorUnit() const;
+
+    double variableCondensingTemperatureMinimumforIndoorUnit() const;
+
+    double variableCondensingTemperatureMaximumforIndoorUnit() const;
+
+    double outdoorUnitEvaporatorReferenceSuperheating() const;
+
+    double outdoorUnitCondenserReferenceSubcooling() const;
+
+    double outdoorUnitEvaporatorRatedBypassFactor() const;
+
+    double outdoorUnitCondenserRatedBypassFactor() const;
+
+    double differencebetweenOutdoorUnitEvaporatingTemperatureandOutdoorAirTemperatureinHeatRecoveryMode() const;
+
+    double outdoorUnitHeatExchangerCapacityRatio() const;
+
+    double outdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity() const;
+
+    double outdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity() const;
+
+    Curve outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve() const;
+
+    Curve outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve() const;
+
+    double diameterofMainPipeforSuctionGas() const;
+
+    double diameterofMainPipeforDischargeGas() const;
+
+    double lengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint() const;
+
+    double equivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint() const;
+
+    double heightDifferenceBetweenOutdoorUnitandIndoorUnits() const;
+
+    double mainPipeInsulationThickness() const;
+
+    double mainPipeInsulationThermalConductivity() const;
+
+    double crankcaseHeaterPowerperCompressor() const;
+
+    int numberofCompressors() const;
+
+    double ratioofCompressorSizetoTotalCompressorCapacity() const;
+
+    double maximumOutdoorDryBulbTemperatureforCrankcaseHeater() const;
+
+    std::string defrostStrategy() const;
+
+    std::string defrostControl() const;
+
+    boost::optional<Curve> defrostEnergyInputRatioModifierFunctionofTemperatureCurve() const;
+
+    double defrostTimePeriodFraction() const;
+
+    boost::optional<double> resistiveDefrostHeaterCapacity() const;
+
+    bool isResistiveDefrostHeaterCapacityAutosized() const;
+
+    double maximumOutdoorDrybulbTemperatureforDefrostOperation() const;
+
+    double initialHeatRecoveryCoolingCapacityFraction() const;
+
+    double heatRecoveryCoolingCapacityTimeConstant() const;
+
+    double initialHeatRecoveryCoolingEnergyFraction() const;
+
+    double heatRecoveryCoolingEnergyTimeConstant() const;
+
+    double initialHeatRecoveryHeatingCapacityFraction() const;
+
+    double heatRecoveryHeatingCapacityTimeConstant() const;
+
+    double initialHeatRecoveryHeatingEnergyFraction() const;
+
+    double heatRecoveryHeatingEnergyTimeConstant() const;
+
+    double compressorMaximumDeltaPressure() const;
+
+    double compressorInverterEfficiency() const;
+
+    double compressorEvaporativeCapacityCorrectionFactor() const;
+
+    //@}
+    /** @name Setters */
+    //@{
+
+    bool setAvailabilitySchedule(Schedule& schedule);
+
+    bool setRefrigerantType(const std::string& refrigerantType);
+
+    bool setRatedEvaporativeCapacity(double ratedEvaporativeCapacity);
+
+    void autosizeRatedEvaporativeCapacity();
+
+    bool setRatedCompressorPowerPerUnitofRatedEvaporativeCapacity(double ratedCompressorPowerPerUnitofRatedEvaporativeCapacity);
+
+    bool setMinimumOutdoorAirTemperatureinCoolingOnlyMode(double minimumOutdoorAirTemperatureinCoolingOnlyMode);
+
+    bool setMaximumOutdoorAirTemperatureinCoolingOnlyMode(double maximumOutdoorAirTemperatureinCoolingOnlyMode);
+
+    bool setMinimumOutdoorAirTemperatureinHeatingOnlyMode(double minimumOutdoorAirTemperatureinHeatingOnlyMode);
+
+    bool setMaximumOutdoorAirTemperatureinHeatingOnlyMode(double maximumOutdoorAirTemperatureinHeatingOnlyMode);
+
+    bool setMinimumOutdoorTemperatureinHeatRecoveryMode(double minimumOutdoorTemperatureinHeatRecoveryMode);
+
+    bool setMaximumOutdoorTemperatureinHeatRecoveryMode(double maximumOutdoorTemperatureinHeatRecoveryMode);
+
+    bool setRefrigerantTemperatureControlAlgorithmforIndoorUnit(const std::string& refrigerantTemperatureControlAlgorithmforIndoorUnit);
+
+    bool setReferenceEvaporatingTemperatureforIndoorUnit(double referenceEvaporatingTemperatureforIndoorUnit);
+
+    bool setReferenceCondensingTemperatureforIndoorUnit(double referenceCondensingTemperatureforIndoorUnit);
+
+    bool setVariableEvaporatingTemperatureMinimumforIndoorUnit(double variableEvaporatingTemperatureMinimumforIndoorUnit);
+
+    bool setVariableEvaporatingTemperatureMaximumforIndoorUnit(double variableEvaporatingTemperatureMaximumforIndoorUnit);
+
+    bool setVariableCondensingTemperatureMinimumforIndoorUnit(double variableCondensingTemperatureMinimumforIndoorUnit);
+
+    bool setVariableCondensingTemperatureMaximumforIndoorUnit(double variableCondensingTemperatureMaximumforIndoorUnit);
+
+    bool setOutdoorUnitEvaporatorReferenceSuperheating(double outdoorUnitEvaporatorReferenceSuperheating);
+
+    bool setOutdoorUnitCondenserReferenceSubcooling(double outdoorUnitCondenserReferenceSubcooling);
+
+    bool setOutdoorUnitEvaporatorRatedBypassFactor(double outdoorUnitEvaporatorRatedBypassFactor);
+
+    bool setOutdoorUnitCondenserRatedBypassFactor(double outdoorUnitCondenserRatedBypassFactor);
+
+    bool setDifferencebetweenOutdoorUnitEvaporatingTemperatureandOutdoorAirTemperatureinHeatRecoveryMode(
+      double differencebetweenOutdoorUnitEvaporatingTemperatureandOutdoorAirTemperatureinHeatRecoveryMode);
+
+    bool setOutdoorUnitHeatExchangerCapacityRatio(double outdoorUnitHeatExchangerCapacityRatio);
+
+    bool setOutdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity(double outdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity);
+
+    bool setOutdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity(double outdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity);
+
+    bool setOutdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve(const Curve& curve);
+
+    bool setOutdoorUnitCondensingTemperatureFunctionofSubcoolingCurve(const Curve& curve);
+
+    bool setDiameterofMainPipeforSuctionGas(double diameterofMainPipeforSuctionGas);
+
+    bool setDiameterofMainPipeforDischargeGas(double diameterofMainPipeforDischargeGas);
+
+    bool setLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(double lengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint);
+
+    bool setEquivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(
+      double equivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint);
+
+    bool setHeightDifferenceBetweenOutdoorUnitandIndoorUnits(double heightDifferenceBetweenOutdoorUnitandIndoorUnits);
+
+    bool setMainPipeInsulationThickness(double mainPipeInsulationThickness);
+
+    bool setMainPipeInsulationThermalConductivity(double mainPipeInsulationThermalConductivity);
+
+    bool setCrankcaseHeaterPowerperCompressor(double crankcaseHeaterPowerperCompressor);
+
+    bool setNumberofCompressors(int numberofCompressors);
+
+    bool setRatioofCompressorSizetoTotalCompressorCapacity(double ratioofCompressorSizetoTotalCompressorCapacity);
+
+    bool setMaximumOutdoorDryBulbTemperatureforCrankcaseHeater(double maximumOutdoorDryBulbTemperatureforCrankcaseHeater);
+
+    bool setDefrostStrategy(const std::string& defrostStrategy);
+
+    bool setDefrostControl(const std::string& defrostControl);
+
+    bool setDefrostEnergyInputRatioModifierFunctionofTemperatureCurve(const Curve& curve);
+
+    void resetDefrostEnergyInputRatioModifierFunctionofTemperatureCurve();
+
+    bool setDefrostTimePeriodFraction(double defrostTimePeriodFraction);
+
+    bool setResistiveDefrostHeaterCapacity(double resistiveDefrostHeaterCapacity);
+
+    void autosizeResistiveDefrostHeaterCapacity();
+
+    bool setMaximumOutdoorDrybulbTemperatureforDefrostOperation(double maximumOutdoorDrybulbTemperatureforDefrostOperation);
+
+    bool setInitialHeatRecoveryCoolingCapacityFraction(double initialHeatRecoveryCoolingCapacityFraction);
+
+    bool setHeatRecoveryCoolingCapacityTimeConstant(double heatRecoveryCoolingCapacityTimeConstant);
+
+    bool setInitialHeatRecoveryCoolingEnergyFraction(double initialHeatRecoveryCoolingEnergyFraction);
+
+    bool setHeatRecoveryCoolingEnergyTimeConstant(double heatRecoveryCoolingEnergyTimeConstant);
+
+    bool setInitialHeatRecoveryHeatingCapacityFraction(double initialHeatRecoveryHeatingCapacityFraction);
+
+    bool setHeatRecoveryHeatingCapacityTimeConstant(double heatRecoveryHeatingCapacityTimeConstant);
+
+    bool setInitialHeatRecoveryHeatingEnergyFraction(double initialHeatRecoveryHeatingEnergyFraction);
+
+    bool setHeatRecoveryHeatingEnergyTimeConstant(double heatRecoveryHeatingEnergyTimeConstant);
+
+    bool setCompressorMaximumDeltaPressure(double compressorMaximumDeltaPressure);
+
+    bool setCompressorInverterEfficiency(double compressorInverterEfficiency);
+
+    bool setCompressorEvaporativeCapacityCorrectionFactor(double compressorEvaporativeCapacityCorrectionFactor);
+
+    //@}
+    /** @name Other */
+    //@{
+
+    bool addTerminal(ZoneHVACTerminalUnitVariableRefrigerantFlow& vrf);
+
+    void removeTerminal(ZoneHVACTerminalUnitVariableRefrigerantFlow& vrf);
+
+    void removeAllTerminals();
+
+    std::vector<ZoneHVACTerminalUnitVariableRefrigerantFlow> terminals() const;
+
+    bool addLoadingIndex(LoadingIndex& loadingIndex);
+
+    void removeLoadingIndex(LoadingIndex& loadingIndex);
+
+    void removeAllLoadingIndexes();
+
+    std::vector<LoadingIndex> loadingIndexes() const;
+
+    boost::optional<double> autosizedRatedEvaporativeCapacity();
+
+    boost::optional<double> autosizedResistiveDefrostHeaterCapacity();
+
+    boost::optional<double> autosizedGrossRatedTotalCoolingCapacity() const;
+
+    boost::optional<double> autosizedGrossRatedHeatingCapacity() const;
+
+    //@}
+   protected:
+    /// @cond
+    using ImplType = detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl;
+
+    explicit AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR(
+      std::shared_ptr<detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl> impl);
+
+    friend class detail::AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl;
+    friend class Model;
+    friend class IdfObject;
+    friend class openstudio::detail::IdfObject_Impl;
+    /// @endcond
+   private:
+    REGISTER_LOGGER("openstudio.model.AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR");
+  };
+
+  /** \relates AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR*/
+  using OptionalAirConditionerVariableRefrigerantFlowFluidTemperatureControlHR =
+    boost::optional<AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR>;
+
+  /** \relates AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR*/
+  using AirConditionerVariableRefrigerantFlowFluidTemperatureControlHRVector =
+    std::vector<AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR>;
+
+}  // namespace model
+}  // namespace openstudio
+
+#endif  // MODEL_AIRCONDITIONERVARIABLEREFRIGERANTFLOWFLUIDTEMPERATURECONTROLHR_HPP
diff --git a/src/model/AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl.hpp b/src/model/AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl.hpp
new file mode 100644
index 00000000000..c3e997ee8e5
--- /dev/null
+++ b/src/model/AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl.hpp
@@ -0,0 +1,382 @@
+/***********************************************************************************************************************
+*  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_AIRCONDITIONERVARIABLEREFRIGERANTFLOWFLUIDTEMPERATURECONTROLHR_IMPL_HPP
+#define MODEL_AIRCONDITIONERVARIABLEREFRIGERANTFLOWFLUIDTEMPERATURECONTROLHR_IMPL_HPP
+
+#include <model/ModelAPI.hpp>
+#include "HVACComponent_Impl.hpp"
+
+namespace openstudio {
+namespace model {
+
+  class Schedule;
+  class Curve;
+  class ThermalZone;
+  class ModelObjectList;
+  class ZoneHVACTerminalUnitVariableRefrigerantFlow;
+  class LoadingIndex;
+
+  namespace detail {
+
+    /** AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl is a HVACComponent_Impl that is the implementation class for AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR.*/
+    class MODEL_API AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl : public HVACComponent_Impl
+    {
+     public:
+      /** @name Constructors and Destructors */
+      //@{
+
+      AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl(const IdfObject& idfObject, Model_Impl* model, bool keepHandle);
+
+      AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl(const openstudio::detail::WorkspaceObject_Impl& other, Model_Impl* model,
+                                                                          bool keepHandle);
+
+      AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl(
+        const AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl& other, Model_Impl* model, bool keepHandle);
+
+      virtual ~AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl() {}
+
+      //@}
+      /** @name Virtual Methods */
+      //@{
+
+      virtual const std::vector<std::string>& outputVariableNames() const override;
+
+      virtual IddObjectType iddObjectType() const override;
+
+      virtual std::vector<ScheduleTypeKey> getScheduleTypeKeys(const Schedule& schedule) const override;
+
+      virtual ModelObject clone(Model model) const override;
+
+      virtual std::vector<openstudio::IdfObject> remove() override;
+
+      virtual bool addToNode(Node& node) override;
+
+      virtual std::vector<ModelObject> children() const override;
+
+      virtual void autosize() override;
+
+      virtual void applySizingValues() override;
+
+      virtual std::vector<EMSActuatorNames> emsActuatorNames() const override;
+
+      virtual std::vector<std::string> emsInternalVariableNames() const override;
+
+      //@}
+      /** @name Getters */
+      //@{
+
+      Schedule availabilitySchedule() const;
+
+      std::string refrigerantType() const;
+
+      boost::optional<double> ratedEvaporativeCapacity() const;
+
+      bool isRatedEvaporativeCapacityAutosized() const;
+
+      boost::optional<double> autosizedRatedEvaporativeCapacity();
+
+      double ratedCompressorPowerPerUnitofRatedEvaporativeCapacity() const;
+
+      double minimumOutdoorAirTemperatureinCoolingOnlyMode() const;
+
+      double maximumOutdoorAirTemperatureinCoolingOnlyMode() const;
+
+      double minimumOutdoorAirTemperatureinHeatingOnlyMode() const;
+
+      double maximumOutdoorAirTemperatureinHeatingOnlyMode() const;
+
+      double minimumOutdoorTemperatureinHeatRecoveryMode() const;
+
+      double maximumOutdoorTemperatureinHeatRecoveryMode() const;
+
+      std::string refrigerantTemperatureControlAlgorithmforIndoorUnit() const;
+
+      double referenceEvaporatingTemperatureforIndoorUnit() const;
+
+      double referenceCondensingTemperatureforIndoorUnit() const;
+
+      double variableEvaporatingTemperatureMinimumforIndoorUnit() const;
+
+      double variableEvaporatingTemperatureMaximumforIndoorUnit() const;
+
+      double variableCondensingTemperatureMinimumforIndoorUnit() const;
+
+      double variableCondensingTemperatureMaximumforIndoorUnit() const;
+
+      double outdoorUnitEvaporatorReferenceSuperheating() const;
+
+      double outdoorUnitCondenserReferenceSubcooling() const;
+
+      double outdoorUnitEvaporatorRatedBypassFactor() const;
+
+      double outdoorUnitCondenserRatedBypassFactor() const;
+
+      double differencebetweenOutdoorUnitEvaporatingTemperatureandOutdoorAirTemperatureinHeatRecoveryMode() const;
+
+      double outdoorUnitHeatExchangerCapacityRatio() const;
+
+      double outdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity() const;
+
+      double outdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity() const;
+
+      Curve outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve() const;
+
+      Curve outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve() const;
+
+      double diameterofMainPipeforSuctionGas() const;
+
+      double diameterofMainPipeforDischargeGas() const;
+
+      double lengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint() const;
+
+      double equivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint() const;
+
+      double heightDifferenceBetweenOutdoorUnitandIndoorUnits() const;
+
+      double mainPipeInsulationThickness() const;
+
+      double mainPipeInsulationThermalConductivity() const;
+
+      double crankcaseHeaterPowerperCompressor() const;
+
+      int numberofCompressors() const;
+
+      double ratioofCompressorSizetoTotalCompressorCapacity() const;
+
+      double maximumOutdoorDryBulbTemperatureforCrankcaseHeater() const;
+
+      std::string defrostStrategy() const;
+
+      std::string defrostControl() const;
+
+      boost::optional<Curve> defrostEnergyInputRatioModifierFunctionofTemperatureCurve() const;
+
+      double defrostTimePeriodFraction() const;
+
+      boost::optional<double> resistiveDefrostHeaterCapacity() const;
+
+      bool isResistiveDefrostHeaterCapacityAutosized() const;
+
+      boost::optional<double> autosizedResistiveDefrostHeaterCapacity();
+
+      double maximumOutdoorDrybulbTemperatureforDefrostOperation() const;
+
+      double initialHeatRecoveryCoolingCapacityFraction() const;
+
+      double heatRecoveryCoolingCapacityTimeConstant() const;
+
+      double initialHeatRecoveryCoolingEnergyFraction() const;
+
+      double heatRecoveryCoolingEnergyTimeConstant() const;
+
+      double initialHeatRecoveryHeatingCapacityFraction() const;
+
+      double heatRecoveryHeatingCapacityTimeConstant() const;
+
+      double initialHeatRecoveryHeatingEnergyFraction() const;
+
+      double heatRecoveryHeatingEnergyTimeConstant() const;
+
+      double compressorMaximumDeltaPressure() const;
+
+      double compressorInverterEfficiency() const;
+
+      double compressorEvaporativeCapacityCorrectionFactor() const;
+
+      //@}
+      /** @name Setters */
+      //@{
+
+      bool setAvailabilitySchedule(Schedule& schedule);
+
+      bool setRefrigerantType(const std::string& refrigerantType);
+
+      bool setRatedEvaporativeCapacity(double ratedEvaporativeCapacity);
+
+      void autosizeRatedEvaporativeCapacity();
+
+      bool setRatedCompressorPowerPerUnitofRatedEvaporativeCapacity(double ratedCompressorPowerPerUnitofRatedEvaporativeCapacity);
+
+      bool setMinimumOutdoorAirTemperatureinCoolingOnlyMode(double minimumOutdoorAirTemperatureinCoolingOnlyMode);
+
+      bool setMaximumOutdoorAirTemperatureinCoolingOnlyMode(double maximumOutdoorAirTemperatureinCoolingOnlyMode);
+
+      bool setMinimumOutdoorAirTemperatureinHeatingOnlyMode(double minimumOutdoorAirTemperatureinHeatingOnlyMode);
+
+      bool setMaximumOutdoorAirTemperatureinHeatingOnlyMode(double maximumOutdoorAirTemperatureinHeatingOnlyMode);
+
+      bool setMinimumOutdoorTemperatureinHeatRecoveryMode(double minimumOutdoorTemperatureinHeatRecoveryMode);
+
+      bool setMaximumOutdoorTemperatureinHeatRecoveryMode(double maximumOutdoorTemperatureinHeatRecoveryMode);
+
+      bool setRefrigerantTemperatureControlAlgorithmforIndoorUnit(const std::string& refrigerantTemperatureControlAlgorithmforIndoorUnit);
+
+      bool setReferenceEvaporatingTemperatureforIndoorUnit(double referenceEvaporatingTemperatureforIndoorUnit);
+
+      bool setReferenceCondensingTemperatureforIndoorUnit(double referenceCondensingTemperatureforIndoorUnit);
+
+      bool setVariableEvaporatingTemperatureMinimumforIndoorUnit(double variableEvaporatingTemperatureMinimumforIndoorUnit);
+
+      bool setVariableEvaporatingTemperatureMaximumforIndoorUnit(double variableEvaporatingTemperatureMaximumforIndoorUnit);
+
+      bool setVariableCondensingTemperatureMinimumforIndoorUnit(double variableCondensingTemperatureMinimumforIndoorUnit);
+
+      bool setVariableCondensingTemperatureMaximumforIndoorUnit(double variableCondensingTemperatureMaximumforIndoorUnit);
+
+      bool setOutdoorUnitEvaporatorReferenceSuperheating(double outdoorUnitEvaporatorReferenceSuperheating);
+
+      bool setOutdoorUnitCondenserReferenceSubcooling(double outdoorUnitCondenserReferenceSubcooling);
+
+      bool setOutdoorUnitEvaporatorRatedBypassFactor(double outdoorUnitEvaporatorRatedBypassFactor);
+
+      bool setOutdoorUnitCondenserRatedBypassFactor(double outdoorUnitCondenserRatedBypassFactor);
+
+      bool setDifferencebetweenOutdoorUnitEvaporatingTemperatureandOutdoorAirTemperatureinHeatRecoveryMode(
+        double differencebetweenOutdoorUnitEvaporatingTemperatureandOutdoorAirTemperatureinHeatRecoveryMode);
+
+      bool setOutdoorUnitHeatExchangerCapacityRatio(double outdoorUnitHeatExchangerCapacityRatio);
+
+      bool setOutdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity(double outdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity);
+
+      bool setOutdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity(double outdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity);
+
+      bool setOutdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve(const Curve& curve);
+
+      bool setOutdoorUnitCondensingTemperatureFunctionofSubcoolingCurve(const Curve& curve);
+
+      bool setDiameterofMainPipeforSuctionGas(double diameterofMainPipeforSuctionGas);
+
+      bool setDiameterofMainPipeforDischargeGas(double diameterofMainPipeforDischargeGas);
+
+      bool setLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(double lengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint);
+
+      bool setEquivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(
+        double equivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint);
+
+      bool setHeightDifferenceBetweenOutdoorUnitandIndoorUnits(double heightDifferenceBetweenOutdoorUnitandIndoorUnits);
+
+      bool setMainPipeInsulationThickness(double mainPipeInsulationThickness);
+
+      bool setMainPipeInsulationThermalConductivity(double mainPipeInsulationThermalConductivity);
+
+      bool setCrankcaseHeaterPowerperCompressor(double crankcaseHeaterPowerperCompressor);
+
+      bool setNumberofCompressors(int numberofCompressors);
+
+      bool setRatioofCompressorSizetoTotalCompressorCapacity(double ratioofCompressorSizetoTotalCompressorCapacity);
+
+      bool setMaximumOutdoorDryBulbTemperatureforCrankcaseHeater(double maximumOutdoorDryBulbTemperatureforCrankcaseHeater);
+
+      bool setDefrostStrategy(const std::string& defrostStrategy);
+
+      bool setDefrostControl(const std::string& defrostControl);
+
+      bool setDefrostEnergyInputRatioModifierFunctionofTemperatureCurve(const Curve& curve);
+
+      void resetDefrostEnergyInputRatioModifierFunctionofTemperatureCurve();
+
+      bool setDefrostTimePeriodFraction(double defrostTimePeriodFraction);
+
+      bool setResistiveDefrostHeaterCapacity(double resistiveDefrostHeaterCapacity);
+
+      void autosizeResistiveDefrostHeaterCapacity();
+
+      bool setMaximumOutdoorDrybulbTemperatureforDefrostOperation(double maximumOutdoorDrybulbTemperatureforDefrostOperation);
+
+      bool setInitialHeatRecoveryCoolingCapacityFraction(double initialHeatRecoveryCoolingCapacityFraction);
+
+      bool setHeatRecoveryCoolingCapacityTimeConstant(double heatRecoveryCoolingCapacityTimeConstant);
+
+      bool setInitialHeatRecoveryCoolingEnergyFraction(double initialHeatRecoveryCoolingEnergyFraction);
+
+      bool setHeatRecoveryCoolingEnergyTimeConstant(double heatRecoveryCoolingEnergyTimeConstant);
+
+      bool setInitialHeatRecoveryHeatingCapacityFraction(double initialHeatRecoveryHeatingCapacityFraction);
+
+      bool setHeatRecoveryHeatingCapacityTimeConstant(double heatRecoveryHeatingCapacityTimeConstant);
+
+      bool setInitialHeatRecoveryHeatingEnergyFraction(double initialHeatRecoveryHeatingEnergyFraction);
+
+      bool setHeatRecoveryHeatingEnergyTimeConstant(double heatRecoveryHeatingEnergyTimeConstant);
+
+      bool setCompressorMaximumDeltaPressure(double compressorMaximumDeltaPressure);
+
+      bool setCompressorInverterEfficiency(double compressorInverterEfficiency);
+
+      bool setCompressorEvaporativeCapacityCorrectionFactor(double compressorEvaporativeCapacityCorrectionFactor);
+
+      //@}
+      /** @name Other */
+      //@{
+
+      ModelObjectList vrfModelObjectList() const;
+
+      bool setVRFModelObjectList(const ModelObjectList& modelObjectList);
+
+      bool addTerminal(ZoneHVACTerminalUnitVariableRefrigerantFlow& vrf);
+
+      void removeTerminal(ZoneHVACTerminalUnitVariableRefrigerantFlow& vrf);
+
+      void removeAllTerminals();
+
+      std::vector<ZoneHVACTerminalUnitVariableRefrigerantFlow> terminals() const;
+
+      ModelObjectList loadingIndexList() const;
+
+      bool setLoadingIndexList(const ModelObjectList& modelObjectList);
+
+      bool addLoadingIndex(LoadingIndex& loadingIndex);
+
+      void removeLoadingIndex(LoadingIndex& loadingIndex);
+
+      void removeAllLoadingIndexes();
+
+      std::vector<LoadingIndex> loadingIndexes() const;
+
+      boost::optional<double> autosizedGrossRatedTotalCoolingCapacity() const;
+
+      boost::optional<double> autosizedGrossRatedHeatingCapacity() const;
+
+      //@}
+     private:
+      REGISTER_LOGGER("openstudio.model.AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR");
+
+      boost::optional<ModelObjectList> optionalLoadingIndexList() const;  // For children()
+      boost::optional<Schedule> optionalAvailabilitySchedule() const;
+      boost::optional<Curve> optionalOutdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve() const;
+      boost::optional<Curve> optionalOutdoorUnitCondensingTemperatureFunctionofSubcoolingCurve() const;
+    };
+
+  }  // namespace detail
+
+}  // namespace model
+}  // namespace openstudio
+
+#endif  // MODEL_AIRCONDITIONERVARIABLEREFRIGERANTFLOWFLUIDTEMPERATURECONTROLHR_IMPL_HPP
diff --git a/src/model/AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl.hpp b/src/model/AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl.hpp
new file mode 100644
index 00000000000..6cc37da4d1a
--- /dev/null
+++ b/src/model/AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl.hpp
@@ -0,0 +1,313 @@
+/***********************************************************************************************************************
+*  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_AIRCONDITIONERVARIABLEREFRIGERANTFLOWFLUIDTEMPERATURECONTROL_IMPL_HPP
+#define MODEL_AIRCONDITIONERVARIABLEREFRIGERANTFLOWFLUIDTEMPERATURECONTROL_IMPL_HPP
+
+#include <model/ModelAPI.hpp>
+#include "HVACComponent_Impl.hpp"
+
+namespace openstudio {
+namespace model {
+
+  class Schedule;
+  class Curve;
+  class ThermalZone;
+  class ModelObjectList;
+  class ZoneHVACTerminalUnitVariableRefrigerantFlow;
+  class LoadingIndex;
+
+  namespace detail {
+
+    /** AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl is a HVACComponent_Impl that is the implementation class for AirConditionerVariableRefrigerantFlowFluidTemperatureControl.*/
+    class MODEL_API AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl : public HVACComponent_Impl
+    {
+     public:
+      /** @name Constructors and Destructors */
+      //@{
+
+      AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl(const IdfObject& idfObject, Model_Impl* model, bool keepHandle);
+
+      AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl(const openstudio::detail::WorkspaceObject_Impl& other, Model_Impl* model,
+                                                                        bool keepHandle);
+
+      AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl(
+        const AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl& other, Model_Impl* model, bool keepHandle);
+
+      virtual ~AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl() {}
+
+      //@}
+      /** @name Virtual Methods */
+      //@{
+
+      virtual const std::vector<std::string>& outputVariableNames() const override;
+
+      virtual IddObjectType iddObjectType() const override;
+
+      virtual std::vector<ScheduleTypeKey> getScheduleTypeKeys(const Schedule& schedule) const override;
+
+      virtual ModelObject clone(Model model) const override;
+
+      virtual std::vector<openstudio::IdfObject> remove() override;
+
+      virtual bool addToNode(Node& node) override;
+
+      virtual std::vector<ModelObject> children() const override;
+
+      virtual void autosize() override;
+
+      virtual void applySizingValues() override;
+
+      virtual std::vector<EMSActuatorNames> emsActuatorNames() const override;
+
+      virtual std::vector<std::string> emsInternalVariableNames() const override;
+
+      //@}
+      /** @name Getters */
+      //@{
+
+      Schedule availabilitySchedule() const;
+
+      std::string refrigerantType() const;
+
+      boost::optional<double> ratedEvaporativeCapacity() const;
+
+      bool isRatedEvaporativeCapacityAutosized() const;
+
+      boost::optional<double> autosizedRatedEvaporativeCapacity();
+
+      double ratedCompressorPowerPerUnitofRatedEvaporativeCapacity() const;
+
+      double minimumOutdoorAirTemperatureinCoolingMode() const;
+
+      double maximumOutdoorAirTemperatureinCoolingMode() const;
+
+      double minimumOutdoorAirTemperatureinHeatingMode() const;
+
+      double maximumOutdoorAirTemperatureinHeatingMode() const;
+
+      double referenceOutdoorUnitSuperheating() const;
+
+      double referenceOutdoorUnitSubcooling() const;
+
+      std::string refrigerantTemperatureControlAlgorithmforIndoorUnit() const;
+
+      double referenceEvaporatingTemperatureforIndoorUnit() const;
+
+      double referenceCondensingTemperatureforIndoorUnit() const;
+
+      double variableEvaporatingTemperatureMinimumforIndoorUnit() const;
+
+      double variableEvaporatingTemperatureMaximumforIndoorUnit() const;
+
+      double variableCondensingTemperatureMinimumforIndoorUnit() const;
+
+      double variableCondensingTemperatureMaximumforIndoorUnit() const;
+
+      double outdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity() const;
+
+      double outdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity() const;
+
+      Curve outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve() const;
+
+      Curve outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve() const;
+
+      double diameterofMainPipeConnectingOutdoorUnittotheFirstBranchJoint() const;
+
+      double lengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint() const;
+
+      double equivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint() const;
+
+      double heightDifferenceBetweenOutdoorUnitandIndoorUnits() const;
+
+      double mainPipeInsulationThickness() const;
+
+      double mainPipeInsulationThermalConductivity() const;
+
+      double crankcaseHeaterPowerperCompressor() const;
+
+      int numberofCompressors() const;
+
+      double ratioofCompressorSizetoTotalCompressorCapacity() const;
+
+      double maximumOutdoorDryBulbTemperatureforCrankcaseHeater() const;
+
+      std::string defrostStrategy() const;
+
+      std::string defrostControl() const;
+
+      boost::optional<Curve> defrostEnergyInputRatioModifierFunctionofTemperatureCurve() const;
+
+      double defrostTimePeriodFraction() const;
+
+      boost::optional<double> resistiveDefrostHeaterCapacity() const;
+
+      bool isResistiveDefrostHeaterCapacityAutosized() const;
+
+      boost::optional<double> autosizedResistiveDefrostHeaterCapacity();
+
+      double maximumOutdoorDrybulbTemperatureforDefrostOperation() const;
+
+      double compressorMaximumDeltaPressure() const;
+
+      //@}
+      /** @name Setters */
+      //@{
+
+      bool setAvailabilitySchedule(Schedule& schedule);
+
+      bool setRefrigerantType(const std::string& refrigerantType);
+
+      bool setRatedEvaporativeCapacity(double ratedEvaporativeCapacity);
+
+      void autosizeRatedEvaporativeCapacity();
+
+      bool setRatedCompressorPowerPerUnitofRatedEvaporativeCapacity(double ratedCompressorPowerPerUnitofRatedEvaporativeCapacity);
+
+      bool setMinimumOutdoorAirTemperatureinCoolingMode(double minimumOutdoorAirTemperatureinCoolingMode);
+
+      bool setMaximumOutdoorAirTemperatureinCoolingMode(double maximumOutdoorAirTemperatureinCoolingMode);
+
+      bool setMinimumOutdoorAirTemperatureinHeatingMode(double minimumOutdoorAirTemperatureinHeatingMode);
+
+      bool setMaximumOutdoorAirTemperatureinHeatingMode(double maximumOutdoorAirTemperatureinHeatingMode);
+
+      bool setReferenceOutdoorUnitSuperheating(double referenceOutdoorUnitSuperheating);
+
+      bool setReferenceOutdoorUnitSubcooling(double referenceOutdoorUnitSubcooling);
+
+      bool setRefrigerantTemperatureControlAlgorithmforIndoorUnit(const std::string& refrigerantTemperatureControlAlgorithmforIndoorUnit);
+
+      bool setReferenceEvaporatingTemperatureforIndoorUnit(double referenceEvaporatingTemperatureforIndoorUnit);
+
+      bool setReferenceCondensingTemperatureforIndoorUnit(double referenceCondensingTemperatureforIndoorUnit);
+
+      bool setVariableEvaporatingTemperatureMinimumforIndoorUnit(double variableEvaporatingTemperatureMinimumforIndoorUnit);
+
+      bool setVariableEvaporatingTemperatureMaximumforIndoorUnit(double variableEvaporatingTemperatureMaximumforIndoorUnit);
+
+      bool setVariableCondensingTemperatureMinimumforIndoorUnit(double variableCondensingTemperatureMinimumforIndoorUnit);
+
+      bool setVariableCondensingTemperatureMaximumforIndoorUnit(double variableCondensingTemperatureMaximumforIndoorUnit);
+
+      bool setOutdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity(double outdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity);
+
+      bool setOutdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity(double outdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity);
+
+      bool setOutdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve(const Curve& curve);
+
+      bool setOutdoorUnitCondensingTemperatureFunctionofSubcoolingCurve(const Curve& curve);
+
+      bool setDiameterofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(double diameterofMainPipeConnectingOutdoorUnittotheFirstBranchJoint);
+
+      bool setLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(double lengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint);
+
+      bool setEquivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(
+        double equivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint);
+
+      bool setHeightDifferenceBetweenOutdoorUnitandIndoorUnits(double heightDifferenceBetweenOutdoorUnitandIndoorUnits);
+
+      bool setMainPipeInsulationThickness(double mainPipeInsulationThickness);
+
+      bool setMainPipeInsulationThermalConductivity(double mainPipeInsulationThermalConductivity);
+
+      bool setCrankcaseHeaterPowerperCompressor(double crankcaseHeaterPowerperCompressor);
+
+      bool setNumberofCompressors(int numberofCompressors);
+
+      bool setRatioofCompressorSizetoTotalCompressorCapacity(double ratioofCompressorSizetoTotalCompressorCapacity);
+
+      bool setMaximumOutdoorDryBulbTemperatureforCrankcaseHeater(double maximumOutdoorDryBulbTemperatureforCrankcaseHeater);
+
+      bool setDefrostStrategy(const std::string& defrostStrategy);
+
+      bool setDefrostControl(const std::string& defrostControl);
+
+      bool setDefrostEnergyInputRatioModifierFunctionofTemperatureCurve(const Curve& curve);
+
+      void resetDefrostEnergyInputRatioModifierFunctionofTemperatureCurve();
+
+      bool setDefrostTimePeriodFraction(double defrostTimePeriodFraction);
+
+      bool setResistiveDefrostHeaterCapacity(double resistiveDefrostHeaterCapacity);
+
+      void autosizeResistiveDefrostHeaterCapacity();
+
+      bool setMaximumOutdoorDrybulbTemperatureforDefrostOperation(double maximumOutdoorDrybulbTemperatureforDefrostOperation);
+
+      bool setCompressorMaximumDeltaPressure(double compressorMaximumDeltaPressure);
+
+      //@}
+      /** @name Other */
+      //@{
+
+      ModelObjectList vrfModelObjectList() const;
+
+      bool setVRFModelObjectList(const ModelObjectList& modelObjectList);
+
+      bool addTerminal(ZoneHVACTerminalUnitVariableRefrigerantFlow& vrf);
+
+      void removeTerminal(ZoneHVACTerminalUnitVariableRefrigerantFlow& vrf);
+
+      void removeAllTerminals();
+
+      std::vector<ZoneHVACTerminalUnitVariableRefrigerantFlow> terminals() const;
+
+      ModelObjectList loadingIndexList() const;
+
+      bool setLoadingIndexList(const ModelObjectList& modelObjectList);
+
+      bool addLoadingIndex(LoadingIndex& loadingIndex);
+
+      void removeLoadingIndex(LoadingIndex& loadingIndex);
+
+      void removeAllLoadingIndexes();
+
+      std::vector<LoadingIndex> loadingIndexes() const;
+
+      boost::optional<double> autosizedGrossRatedTotalCoolingCapacity() const;
+
+      boost::optional<double> autosizedGrossRatedHeatingCapacity() const;
+
+      //@}
+     private:
+      REGISTER_LOGGER("openstudio.model.AirConditionerVariableRefrigerantFlowFluidTemperatureControl");
+
+      boost::optional<ModelObjectList> optionalLoadingIndexList() const;  // For children()
+      boost::optional<Schedule> optionalAvailabilitySchedule() const;
+      boost::optional<Curve> optionalOutdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve() const;
+      boost::optional<Curve> optionalOutdoorUnitCondensingTemperatureFunctionofSubcoolingCurve() const;
+    };
+
+  }  // namespace detail
+
+}  // namespace model
+}  // namespace openstudio
+
+#endif  // MODEL_AIRCONDITIONERVARIABLEREFRIGERANTFLOWFLUIDTEMPERATURECONTROL_IMPL_HPP
diff --git a/src/model/AirConditionerVariableRefrigerantFlow_Impl.hpp b/src/model/AirConditionerVariableRefrigerantFlow_Impl.hpp
index b5720737f46..ea2e8915d4a 100644
--- a/src/model/AirConditionerVariableRefrigerantFlow_Impl.hpp
+++ b/src/model/AirConditionerVariableRefrigerantFlow_Impl.hpp
@@ -486,7 +486,7 @@ namespace model {
 
       bool setVRFModelObjectList(const ModelObjectList& modelObjectList);
 
-      void addTerminal(ZoneHVACTerminalUnitVariableRefrigerantFlow& vrf);
+      bool addTerminal(ZoneHVACTerminalUnitVariableRefrigerantFlow& vrf);
 
       void removeTerminal(ZoneHVACTerminalUnitVariableRefrigerantFlow& vrf);
 
diff --git a/src/model/CMakeLists.txt b/src/model/CMakeLists.txt
index 9f9c6dea088..674109abf86 100644
--- a/src/model/CMakeLists.txt
+++ b/src/model/CMakeLists.txt
@@ -46,6 +46,12 @@ set(${target_name}_src
   AirConditionerVariableRefrigerantFlow.hpp
   AirConditionerVariableRefrigerantFlow_Impl.hpp
   AirConditionerVariableRefrigerantFlow.cpp
+  AirConditionerVariableRefrigerantFlowFluidTemperatureControl.hpp
+  AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl.hpp
+  AirConditionerVariableRefrigerantFlowFluidTemperatureControl.cpp
+  AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR.hpp
+  AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl.hpp
+  AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR.cpp
   AirflowNetworkComponent.hpp
   AirflowNetworkComponent_Impl.hpp
   AirflowNetworkComponent.cpp
@@ -329,6 +335,9 @@ set(${target_name}_src
   CoilCoolingDXVariableRefrigerantFlow.hpp
   CoilCoolingDXVariableRefrigerantFlow_Impl.hpp
   CoilCoolingDXVariableRefrigerantFlow.cpp
+  CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl.hpp
+  CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl.hpp
+  CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl.cpp
   CoilCoolingDXVariableSpeed.hpp
   CoilCoolingDXVariableSpeed_Impl.hpp
   CoilCoolingDXVariableSpeed.cpp
@@ -374,6 +383,9 @@ set(${target_name}_src
   CoilHeatingDXVariableRefrigerantFlow.hpp
   CoilHeatingDXVariableRefrigerantFlow_Impl.hpp
   CoilHeatingDXVariableRefrigerantFlow.cpp
+  CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl.hpp
+  CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl.hpp
+  CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl.cpp
   CoilHeatingElectric.hpp
   CoilHeatingElectric_Impl.hpp
   CoilHeatingElectric.cpp
@@ -985,6 +997,9 @@ set(${target_name}_src
   LightsDefinition.hpp
   LightsDefinition_Impl.hpp
   LightsDefinition.cpp
+  LoadingIndex.hpp
+  LoadingIndex_Impl.hpp
+  LoadingIndex.cpp
   LoadProfilePlant.hpp
   LoadProfilePlant_Impl.hpp
   LoadProfilePlant.cpp
@@ -1845,6 +1860,8 @@ endif()
 set(${target_name}_test_src
   test/AdditionalProperties_GTest.cpp
   test/AirConditionerVariableRefrigerantFlow_GTest.cpp
+  test/AirConditionerVariableRefrigerantFlowFluidTemperatureControl_GTest.cpp
+  test/AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_GTest.cpp
   test/AirflowNetworkCrack_GTest.cpp
   test/AirflowNetworkDetailedOpening_GTest.cpp
   test/AirflowNetworkDistributionNode_GTest.cpp
@@ -1922,6 +1939,7 @@ set(${target_name}_test_src
   test/CoilCoolingDXTwoStageWithHumidityControlMode_GTest.cpp
   test/CoilCoolingDXVariableSpeed_GTest.cpp
   test/CoilCoolingDXVariableSpeedSpeedData_GTest.cpp
+  test/CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_GTest.cpp
   test/CoilCoolingFourPipeBeam_GTest.cpp
   test/CoilCoolingLowTempRadiantConstFlow_GTest.cpp
   test/CoilCoolingLowTempRadiantVarFlow_GTest.cpp
@@ -1936,6 +1954,7 @@ set(${target_name}_test_src
   test/CoilHeatingDXSingleSpeed_GTest.cpp
   test/CoilHeatingDXVariableSpeed_GTest.cpp
   test/CoilHeatingDXVariableSpeedSpeedData_GTest.cpp
+  test/CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_GTest.cpp
   test/CoilHeatingElectric_GTest.cpp
   test/CoilHeatingElectricMultiStage_GTest.cpp
   test/CoilHeatingElectricMultiStageStageData_GTest.cpp
diff --git a/src/model/CoilCoolingDXVariableRefrigerantFlow.cpp b/src/model/CoilCoolingDXVariableRefrigerantFlow.cpp
index 1f3806f40a4..de3dfcc1b80 100644
--- a/src/model/CoilCoolingDXVariableRefrigerantFlow.cpp
+++ b/src/model/CoilCoolingDXVariableRefrigerantFlow.cpp
@@ -147,7 +147,7 @@ namespace model {
     Curve CoilCoolingDXVariableRefrigerantFlow_Impl::coolingCapacityRatioModifierFunctionofTemperatureCurve() const {
       boost::optional<Curve> value = optionalCoolingCapacityRatioModifierFunctionofTemperatureCurve();
       if (!value) {
-        LOG_AND_THROW(briefDescription() << " does not have an Cooling Capacity Ratio Modifier Functionof Temperature Curve attached.");
+        LOG_AND_THROW(briefDescription() << " does not have an Cooling Capacity Ratio Modifier Function of Temperature Curve attached.");
       }
       return value.get();
     }
@@ -155,7 +155,7 @@ namespace model {
     Curve CoilCoolingDXVariableRefrigerantFlow_Impl::coolingCapacityModifierCurveFunctionofFlowFraction() const {
       boost::optional<Curve> value = optionalCoolingCapacityModifierCurveFunctionofFlowFraction();
       if (!value) {
-        LOG_AND_THROW(briefDescription() << " does not have an Cooling Capacity Modifier Curve Functionof Flow Fraction attached.");
+        LOG_AND_THROW(briefDescription() << " does not have an Cooling Capacity Modifier Curve Function of Flow Fraction attached.");
       }
       return value.get();
     }
diff --git a/src/model/CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl.cpp b/src/model/CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl.cpp
new file mode 100644
index 00000000000..180893c2dc9
--- /dev/null
+++ b/src/model/CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl.cpp
@@ -0,0 +1,356 @@
+/***********************************************************************************************************************
+*  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 "CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl.hpp"
+#include "CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl.hpp"
+
+#include "Model.hpp"
+#include "Model_Impl.hpp"
+#include "Schedule.hpp"
+#include "Schedule_Impl.hpp"
+#include "Connection.hpp"
+#include "Connection_Impl.hpp"
+#include "Curve.hpp"
+#include "Curve_Impl.hpp"
+#include "CurveQuadratic.hpp"
+#include "CurveQuadratic_Impl.hpp"
+#include "ScheduleTypeLimits.hpp"
+#include "ScheduleTypeRegistry.hpp"
+
+#include <utilities/idd/IddEnums.hxx>
+#include <utilities/idd/OS_Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControl_FieldEnums.hxx>
+
+#include "../utilities/units/Unit.hpp"
+
+#include "../utilities/core/Assert.hpp"
+
+namespace openstudio {
+namespace model {
+
+  namespace detail {
+
+    CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl(
+      const IdfObject& idfObject, Model_Impl* model, bool keepHandle)
+      : HVACComponent_Impl(idfObject, model, keepHandle) {
+      OS_ASSERT(idfObject.iddObject().type() == CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl::iddObjectType());
+    }
+
+    CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl(
+      const openstudio::detail::WorkspaceObject_Impl& other, Model_Impl* model, bool keepHandle)
+      : HVACComponent_Impl(other, model, keepHandle) {
+      OS_ASSERT(other.iddObject().type() == CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl::iddObjectType());
+    }
+
+    CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl(
+      const CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl& other, Model_Impl* model, bool keepHandle)
+      : HVACComponent_Impl(other, model, keepHandle) {}
+
+    const std::vector<std::string>& CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::outputVariableNames() const {
+      static const std::vector<std::string> result{
+        "Cooling Coil Total Cooling Rate",      "Cooling Coil Total Cooling Energy",        "Cooling Coil Sensible Cooling Rate",
+        "Cooling Coil Sensible Cooling Energy", "Cooling Coil Latent Cooling Rate",         "Cooling Coil Latent Cooling Energy",
+        "Cooling Coil Runtime Fraction",        "Cooling Coil VRF Evaporating Temperature", "Cooling Coil VRF Super Heating Degrees"};
+      return result;
+    }
+
+    IddObjectType CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::iddObjectType() const {
+      return CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl::iddObjectType();
+    }
+
+    std::vector<ScheduleTypeKey>
+      CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::getScheduleTypeKeys(const Schedule& schedule) const {
+      std::vector<ScheduleTypeKey> result;
+      UnsignedVector fieldIndices = getSourceIndices(schedule.handle());
+      UnsignedVector::const_iterator b(fieldIndices.begin()), e(fieldIndices.end());
+      if (std::find(b, e, OS_Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::AvailabilitySchedule) != e) {
+        result.push_back(ScheduleTypeKey("CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl", "Availability Schedule"));
+      }
+      return result;
+    }
+
+    Schedule CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::availabilitySchedule() const {
+      boost::optional<Schedule> value = optionalAvailabilitySchedule();
+      if (!value) {
+        LOG_AND_THROW(briefDescription() << " does not have an Availability Schedule attached.");
+      }
+      return value.get();
+    }
+
+    boost::optional<double> CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::ratedTotalCoolingCapacity() const {
+      return getDouble(OS_Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::RatedTotalCoolingCapacity, true);
+    }
+
+    bool CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::isRatedTotalCoolingCapacityAutosized() const {
+      bool result = false;
+      boost::optional<std::string> value =
+        getString(OS_Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::RatedTotalCoolingCapacity, true);
+      if (value) {
+        result = openstudio::istringEqual(value.get(), "autosize");
+      }
+      return result;
+    }
+
+    boost::optional<double> CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::autosizedRatedTotalCoolingCapacity() {
+      return getAutosizedValue("Design Size Rated Total Cooling Capacity", "W");
+    }
+
+    boost::optional<double> CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::ratedSensibleHeatRatio() const {
+      return getDouble(OS_Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::RatedSensibleHeatRatio, true);
+    }
+
+    bool CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::isRatedSensibleHeatRatioAutosized() const {
+      bool result = false;
+      boost::optional<std::string> value =
+        getString(OS_Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::RatedSensibleHeatRatio, true);
+      if (value) {
+        result = openstudio::istringEqual(value.get(), "autosize");
+      }
+      return result;
+    }
+
+    boost::optional<double> CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::autosizedRatedSensibleHeatRatio() {
+      return getAutosizedValue("Design Size Rated Sensible Heat Ratio", "");
+    }
+
+    double CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::indoorUnitReferenceSuperheating() const {
+      boost::optional<double> value =
+        getDouble(OS_Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::IndoorUnitReferenceSuperheating, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    Curve CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::indoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve() const {
+      boost::optional<Curve> value = optionalIndoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve();
+      if (!value) {
+        LOG_AND_THROW(briefDescription() << " does not have an Indoor Unit Evaporating Temperature Function of Superheating Curve attached.");
+      }
+      return value.get();
+    }
+
+    bool CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::setAvailabilitySchedule(Schedule& schedule) {
+      bool result = setSchedule(OS_Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::AvailabilitySchedule,
+                                "CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl", "Availability Schedule", schedule);
+      return result;
+    }
+
+    bool CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::setRatedTotalCoolingCapacity(double ratedTotalCoolingCapacity) {
+      bool result =
+        setDouble(OS_Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::RatedTotalCoolingCapacity, ratedTotalCoolingCapacity);
+      return result;
+    }
+
+    void CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::autosizeRatedTotalCoolingCapacity() {
+      bool result = setString(OS_Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::RatedTotalCoolingCapacity, "autosize");
+      OS_ASSERT(result);
+    }
+
+    bool CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::setRatedSensibleHeatRatio(double ratedSensibleHeatRatio) {
+      bool result =
+        setDouble(OS_Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::RatedSensibleHeatRatio, ratedSensibleHeatRatio);
+      return result;
+    }
+
+    void CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::autosizeRatedSensibleHeatRatio() {
+      bool result = setString(OS_Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::RatedSensibleHeatRatio, "autosize");
+      OS_ASSERT(result);
+    }
+
+    bool
+      CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::setIndoorUnitReferenceSuperheating(double indoorUnitReferenceSuperheating) {
+      bool result = setDouble(OS_Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::IndoorUnitReferenceSuperheating,
+                              indoorUnitReferenceSuperheating);
+      return result;
+    }
+
+    bool CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::setIndoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve(
+      const Curve& curve) {
+      bool result = setPointer(
+        OS_Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::IndoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve,
+        curve.handle());
+      return result;
+    }
+
+    void CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::autosize() {
+      autosizeRatedTotalCoolingCapacity();
+      autosizeRatedSensibleHeatRatio();
+    }
+
+    void CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::applySizingValues() {
+      boost::optional<double> val;
+      val = autosizedRatedTotalCoolingCapacity();
+      if (val) {
+        setRatedTotalCoolingCapacity(val.get());
+      }
+
+      val = autosizedRatedSensibleHeatRatio();
+      if (val) {
+        setRatedSensibleHeatRatio(val.get());
+      }
+    }
+
+    boost::optional<Schedule> CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::optionalAvailabilitySchedule() const {
+      return getObject<ModelObject>().getModelObjectTarget<Schedule>(
+        OS_Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::AvailabilitySchedule);
+    }
+
+    boost::optional<Curve>
+      CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::optionalIndoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve() const {
+      return getObject<ModelObject>().getModelObjectTarget<Curve>(
+        OS_Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::IndoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve);
+    }
+
+    ModelObject CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::clone(Model model) const {
+      CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl objectClone =
+        HVACComponent_Impl::clone(model).cast<CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl>();
+
+      return objectClone;
+    }
+
+    std::vector<ModelObject> CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::children() const {
+      std::vector<ModelObject> result;
+
+      result.push_back(indoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve());
+
+      return result;
+    }
+
+    boost::optional<double> CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::autosizedRatedAirFlowRate() const {
+      return getAutosizedValue("Design Size Rated Air Flow Rate", "m3/s");
+    }
+
+  }  // namespace detail
+
+  CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl::CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl(const Model& model)
+    : HVACComponent(CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl::iddObjectType(), model) {
+    OS_ASSERT(getImpl<detail::CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl>());
+
+    bool ok = true;
+    Schedule schedule = model.alwaysOnDiscreteSchedule();
+    ok = setAvailabilitySchedule(schedule);
+    OS_ASSERT(ok);
+    autosizeRatedTotalCoolingCapacity();
+    autosizeRatedSensibleHeatRatio();
+    ok = setIndoorUnitReferenceSuperheating(5.0);
+    OS_ASSERT(ok);
+    CurveQuadratic indoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve(model);
+    indoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve.setName("VRFIUEvapTempCurve");
+    indoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve.setCoefficient1Constant(0);
+    indoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve.setCoefficient2x(0.843);
+    indoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve.setCoefficient3xPOW2(0);
+    indoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve.setMinimumValueofx(0);
+    indoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve.setMaximumValueofx(15);
+    ok = setIndoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve(indoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve);
+    OS_ASSERT(ok);
+  }
+
+  IddObjectType CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl::iddObjectType() {
+    return IddObjectType(IddObjectType::OS_Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControl);
+  }
+
+  Schedule CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl::availabilitySchedule() const {
+    return getImpl<detail::CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl>()->availabilitySchedule();
+  }
+
+  boost::optional<double> CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl::ratedTotalCoolingCapacity() const {
+    return getImpl<detail::CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl>()->ratedTotalCoolingCapacity();
+  }
+
+  bool CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl::isRatedTotalCoolingCapacityAutosized() const {
+    return getImpl<detail::CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl>()->isRatedTotalCoolingCapacityAutosized();
+  }
+
+  boost::optional<double> CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl::autosizedRatedTotalCoolingCapacity() {
+    return getImpl<detail::CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl>()->autosizedRatedTotalCoolingCapacity();
+  }
+
+  boost::optional<double> CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl::ratedSensibleHeatRatio() const {
+    return getImpl<detail::CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl>()->ratedSensibleHeatRatio();
+  }
+
+  bool CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl::isRatedSensibleHeatRatioAutosized() const {
+    return getImpl<detail::CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl>()->isRatedSensibleHeatRatioAutosized();
+  }
+
+  boost::optional<double> CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl::autosizedRatedSensibleHeatRatio() {
+    return getImpl<detail::CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl>()->autosizedRatedSensibleHeatRatio();
+  }
+
+  double CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl::indoorUnitReferenceSuperheating() const {
+    return getImpl<detail::CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl>()->indoorUnitReferenceSuperheating();
+  }
+
+  Curve CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl::indoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve() const {
+    return getImpl<detail::CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl>()
+      ->indoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve();
+  }
+
+  bool CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl::setAvailabilitySchedule(Schedule& schedule) {
+    return getImpl<detail::CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl>()->setAvailabilitySchedule(schedule);
+  }
+
+  bool CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl::setRatedTotalCoolingCapacity(double ratedTotalCoolingCapacity) {
+    return getImpl<detail::CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl>()->setRatedTotalCoolingCapacity(
+      ratedTotalCoolingCapacity);
+  }
+
+  void CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl::autosizeRatedTotalCoolingCapacity() {
+    getImpl<detail::CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl>()->autosizeRatedTotalCoolingCapacity();
+  }
+
+  bool CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl::setRatedSensibleHeatRatio(double ratedSensibleHeatRatio) {
+    return getImpl<detail::CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl>()->setRatedSensibleHeatRatio(ratedSensibleHeatRatio);
+  }
+
+  void CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl::autosizeRatedSensibleHeatRatio() {
+    getImpl<detail::CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl>()->autosizeRatedSensibleHeatRatio();
+  }
+
+  bool CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl::setIndoorUnitReferenceSuperheating(double indoorUnitReferenceSuperheating) {
+    return getImpl<detail::CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl>()->setIndoorUnitReferenceSuperheating(
+      indoorUnitReferenceSuperheating);
+  }
+
+  bool
+    CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl::setIndoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve(const Curve& curve) {
+    return getImpl<detail::CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl>()
+      ->setIndoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve(curve);
+  }
+
+  boost::optional<double> CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl::autosizedRatedAirFlowRate() const {
+    return getImpl<detail::CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl>()->autosizedRatedAirFlowRate();
+  }
+
+  /// @cond
+  CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl::CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl(
+    std::shared_ptr<detail::CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl> impl)
+    : HVACComponent(std::move(impl)) {}
+  /// @endcond
+
+}  // namespace model
+}  // namespace openstudio
diff --git a/src/model/CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl.hpp b/src/model/CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl.hpp
new file mode 100644
index 00000000000..ffe7e45ee4a
--- /dev/null
+++ b/src/model/CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl.hpp
@@ -0,0 +1,136 @@
+/***********************************************************************************************************************
+*  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_COILCOOLINGDXVARIABLEREFRIGERANTFLOWFLUIDTEMPERATURECONTROL_HPP
+#define MODEL_COILCOOLINGDXVARIABLEREFRIGERANTFLOWFLUIDTEMPERATURECONTROL_HPP
+
+#include <model/ModelAPI.hpp>
+#include "HVACComponent.hpp"
+
+namespace openstudio {
+
+namespace model {
+
+  class Schedule;
+  class Curve;
+
+  namespace detail {
+
+    class CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl;
+
+  }  // namespace detail
+
+  /** CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl is a HVACComponent that wraps the OpenStudio IDD object 'OS:Coil:Cooling:DX:VariableRefrigerantFlow:FluidTemperatureControl'. */
+  class MODEL_API CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl : public HVACComponent
+  {
+   public:
+    /** @name Constructors and Destructors */
+    //@{
+
+    explicit CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl(const Model& model);
+
+    virtual ~CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl() = default;
+
+    //@}
+
+    static IddObjectType iddObjectType();
+
+    /** @name Getters */
+    //@{
+
+    Schedule availabilitySchedule() const;
+
+    boost::optional<double> ratedTotalCoolingCapacity() const;
+
+    bool isRatedTotalCoolingCapacityAutosized() const;
+
+    boost::optional<double> autosizedRatedTotalCoolingCapacity();
+
+    boost::optional<double> ratedSensibleHeatRatio() const;
+
+    bool isRatedSensibleHeatRatioAutosized() const;
+
+    boost::optional<double> autosizedRatedSensibleHeatRatio();
+
+    double indoorUnitReferenceSuperheating() const;
+
+    Curve indoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve() const;
+
+    //@}
+    /** @name Setters */
+    //@{
+
+    bool setAvailabilitySchedule(Schedule& schedule);
+
+    bool setRatedTotalCoolingCapacity(double ratedTotalCoolingCapacity);
+
+    void autosizeRatedTotalCoolingCapacity();
+
+    bool setRatedSensibleHeatRatio(double ratedSensibleHeatRatio);
+
+    void autosizeRatedSensibleHeatRatio();
+
+    bool setIndoorUnitReferenceSuperheating(double indoorUnitReferenceSuperheating);
+
+    bool setIndoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve(const Curve& curve);
+
+    //@}
+    /** @name Other */
+    //@{
+
+    boost::optional<double> autosizedRatedAirFlowRate() const;
+
+    //@}
+   protected:
+    /// @cond
+    using ImplType = detail::CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl;
+
+    explicit CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl(
+      std::shared_ptr<detail::CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl> impl);
+
+    friend class detail::CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl;
+    friend class Model;
+    friend class IdfObject;
+    friend class openstudio::detail::IdfObject_Impl;
+    /// @endcond
+   private:
+    REGISTER_LOGGER("openstudio.model.CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl");
+  };
+
+  /** \relates CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl*/
+  using OptionalCoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl =
+    boost::optional<CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl>;
+
+  /** \relates CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl*/
+  using CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControlVector = std::vector<CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl>;
+
+}  // namespace model
+}  // namespace openstudio
+
+#endif  // MODEL_COILCOOLINGDXVARIABLEREFRIGERANTFLOWFLUIDTEMPERATURECONTROL_HPP
diff --git a/src/model/CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl.hpp b/src/model/CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl.hpp
new file mode 100644
index 00000000000..f71c3124599
--- /dev/null
+++ b/src/model/CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl.hpp
@@ -0,0 +1,139 @@
+/***********************************************************************************************************************
+*  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_COILCOOLINGDXVARIABLEREFRIGERANTFLOWFLUIDTEMPERATURECONTROL_IMPL_HPP
+#define MODEL_COILCOOLINGDXVARIABLEREFRIGERANTFLOWFLUIDTEMPERATURECONTROL_IMPL_HPP
+
+#include <model/ModelAPI.hpp>
+#include "HVACComponent_Impl.hpp"
+
+namespace openstudio {
+namespace model {
+
+  class Schedule;
+  class Curve;
+
+  namespace detail {
+
+    /** CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl is a HVACComponent_Impl that is the implementation class for CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl.*/
+    class MODEL_API CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl : public HVACComponent_Impl
+    {
+     public:
+      /** @name Constructors and Destructors */
+      //@{
+
+      CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl(const IdfObject& idfObject, Model_Impl* model, bool keepHandle);
+
+      CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl(const openstudio::detail::WorkspaceObject_Impl& other, Model_Impl* model,
+                                                                       bool keepHandle);
+
+      CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl(const CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl& other,
+                                                                       Model_Impl* model, bool keepHandle);
+
+      virtual ~CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl() {}
+
+      //@}
+      /** @name Virtual Methods */
+      //@{
+
+      virtual const std::vector<std::string>& outputVariableNames() const override;
+
+      virtual IddObjectType iddObjectType() const override;
+
+      virtual std::vector<ScheduleTypeKey> getScheduleTypeKeys(const Schedule& schedule) const override;
+
+      //@}
+      /** @name Getters */
+      //@{
+
+      Schedule availabilitySchedule() const;
+
+      boost::optional<double> ratedTotalCoolingCapacity() const;
+
+      bool isRatedTotalCoolingCapacityAutosized() const;
+
+      boost::optional<double> autosizedRatedTotalCoolingCapacity();
+
+      boost::optional<double> ratedSensibleHeatRatio() const;
+
+      bool isRatedSensibleHeatRatioAutosized() const;
+
+      boost::optional<double> autosizedRatedSensibleHeatRatio();
+
+      double indoorUnitReferenceSuperheating() const;
+
+      Curve indoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve() const;
+
+      //@}
+      /** @name Setters */
+      //@{
+
+      bool setAvailabilitySchedule(Schedule& schedule);
+
+      bool setRatedTotalCoolingCapacity(double ratedTotalCoolingCapacity);
+
+      void autosizeRatedTotalCoolingCapacity();
+
+      bool setRatedSensibleHeatRatio(double ratedSensibleHeatRatio);
+
+      void autosizeRatedSensibleHeatRatio();
+
+      bool setIndoorUnitReferenceSuperheating(double indoorUnitReferenceSuperheating);
+
+      bool setIndoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve(const Curve& curve);
+
+      virtual void autosize() override;
+
+      virtual void applySizingValues() override;
+
+      //@}
+      /** @name Other */
+      //@{
+
+      ModelObject clone(Model model) const override;
+
+      std::vector<ModelObject> children() const override;
+
+      boost::optional<double> autosizedRatedAirFlowRate() const;
+
+      //@}
+     protected:
+     private:
+      REGISTER_LOGGER("openstudio.model.CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl");
+
+      boost::optional<Schedule> optionalAvailabilitySchedule() const;
+      boost::optional<Curve> optionalIndoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve() const;
+    };
+
+  }  // namespace detail
+
+}  // namespace model
+}  // namespace openstudio
+
+#endif  // MODEL_COILCOOLINGDXVARIABLEREFRIGERANTFLOWFLUIDTEMPERATURECONTROL_IMPL_HPP
diff --git a/src/model/CoilHeatingDXVariableRefrigerantFlow.cpp b/src/model/CoilHeatingDXVariableRefrigerantFlow.cpp
index 516e765fdbf..a50988d6c1f 100644
--- a/src/model/CoilHeatingDXVariableRefrigerantFlow.cpp
+++ b/src/model/CoilHeatingDXVariableRefrigerantFlow.cpp
@@ -126,7 +126,7 @@ namespace model {
     Curve CoilHeatingDXVariableRefrigerantFlow_Impl::heatingCapacityRatioModifierFunctionofTemperatureCurve() const {
       boost::optional<Curve> value = optionalHeatingCapacityRatioModifierFunctionofTemperatureCurve();
       if (!value) {
-        LOG_AND_THROW(briefDescription() << " does not have an Heating Capacity Ratio Modifier Functionof Temperature Curve attached.");
+        LOG_AND_THROW(briefDescription() << " does not have an Heating Capacity Ratio Modifier Function of Temperature Curve attached.");
       }
       return value.get();
     }
@@ -134,7 +134,7 @@ namespace model {
     Curve CoilHeatingDXVariableRefrigerantFlow_Impl::heatingCapacityModifierFunctionofFlowFractionCurve() const {
       boost::optional<Curve> value = optionalHeatingCapacityModifierFunctionofFlowFractionCurve();
       if (!value) {
-        LOG_AND_THROW(briefDescription() << " does not have an Heating Capacity Modifier Functionof Flow Fraction Curve attached.");
+        LOG_AND_THROW(briefDescription() << " does not have an Heating Capacity Modifier Function of Flow Fraction Curve attached.");
       }
       return value.get();
     }
diff --git a/src/model/CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl.cpp b/src/model/CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl.cpp
new file mode 100644
index 00000000000..cc6df4eaed3
--- /dev/null
+++ b/src/model/CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl.cpp
@@ -0,0 +1,296 @@
+/***********************************************************************************************************************
+*  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 "CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl.hpp"
+#include "CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl.hpp"
+
+#include "Model.hpp"
+#include "Model_Impl.hpp"
+#include "Schedule.hpp"
+#include "Schedule_Impl.hpp"
+#include "Connection.hpp"
+#include "Connection_Impl.hpp"
+#include "Curve.hpp"
+#include "Curve_Impl.hpp"
+#include "CurveQuadratic.hpp"
+#include "CurveQuadratic_Impl.hpp"
+#include "ScheduleTypeLimits.hpp"
+#include "ScheduleTypeRegistry.hpp"
+
+#include <utilities/idd/IddEnums.hxx>
+#include <utilities/idd/OS_Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControl_FieldEnums.hxx>
+
+#include "../utilities/units/Unit.hpp"
+
+#include "../utilities/core/Assert.hpp"
+
+namespace openstudio {
+namespace model {
+
+  namespace detail {
+
+    CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl(
+      const IdfObject& idfObject, Model_Impl* model, bool keepHandle)
+      : HVACComponent_Impl(idfObject, model, keepHandle) {
+      OS_ASSERT(idfObject.iddObject().type() == CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl::iddObjectType());
+    }
+
+    CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl(
+      const openstudio::detail::WorkspaceObject_Impl& other, Model_Impl* model, bool keepHandle)
+      : HVACComponent_Impl(other, model, keepHandle) {
+      OS_ASSERT(other.iddObject().type() == CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl::iddObjectType());
+    }
+
+    CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl(
+      const CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl& other, Model_Impl* model, bool keepHandle)
+      : HVACComponent_Impl(other, model, keepHandle) {}
+
+    const std::vector<std::string>& CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::outputVariableNames() const {
+      static const std::vector<std::string> result{"Heating Coil Heating Rate", "Heating Coil Heating Energy", "Heating Coil Runtime Fraction",
+                                                   "Heating Coil VRF Condensing Temperature", "Heating Coil VRF Subcooling Degrees"};
+      return result;
+    }
+
+    IddObjectType CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::iddObjectType() const {
+      return CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl::iddObjectType();
+    }
+
+    std::vector<ScheduleTypeKey>
+      CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::getScheduleTypeKeys(const Schedule& schedule) const {
+      std::vector<ScheduleTypeKey> result;
+      UnsignedVector fieldIndices = getSourceIndices(schedule.handle());
+      UnsignedVector::const_iterator b(fieldIndices.begin()), e(fieldIndices.end());
+      if (std::find(b, e, OS_Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::AvailabilitySchedule) != e) {
+        result.push_back(ScheduleTypeKey("CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl", "Availability Schedule"));
+      }
+      return result;
+    }
+
+    Schedule CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::availabilitySchedule() const {
+      boost::optional<Schedule> value = optionalAvailabilitySchedule();
+      if (!value) {
+        LOG_AND_THROW(briefDescription() << " does not have an Availability Schedule attached.");
+      }
+      return value.get();
+    }
+
+    boost::optional<double> CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::ratedTotalHeatingCapacity() const {
+      return getDouble(OS_Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::RatedTotalHeatingCapacity, true);
+    }
+
+    bool CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::isRatedTotalHeatingCapacityAutosized() const {
+      bool result = false;
+      boost::optional<std::string> value =
+        getString(OS_Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::RatedTotalHeatingCapacity, true);
+      if (value) {
+        result = openstudio::istringEqual(value.get(), "autosize");
+      }
+      return result;
+    }
+
+    boost::optional<double> CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::autosizedRatedTotalHeatingCapacity() {
+      return getAutosizedValue("Design Size Rated Total Heating Capacity", "W");
+    }
+
+    double CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::indoorUnitReferenceSubcooling() const {
+      boost::optional<double> value =
+        getDouble(OS_Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::IndoorUnitReferenceSubcooling, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    Curve CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::indoorUnitCondensingTemperatureFunctionofSubcoolingCurve() const {
+      boost::optional<Curve> value = optionalIndoorUnitCondensingTemperatureFunctionofSubcoolingCurve();
+      if (!value) {
+        LOG_AND_THROW(briefDescription() << " does not have an Indoor Unit Condensing Temperature Function of Subcooling Curve attached.");
+      }
+      return value.get();
+    }
+
+    bool CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::setAvailabilitySchedule(Schedule& schedule) {
+      bool result = setSchedule(OS_Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::AvailabilitySchedule,
+                                "CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl", "Availability Schedule", schedule);
+      return result;
+    }
+
+    bool CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::setRatedTotalHeatingCapacity(double ratedTotalHeatingCapacity) {
+      bool result =
+        setDouble(OS_Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::RatedTotalHeatingCapacity, ratedTotalHeatingCapacity);
+      return result;
+    }
+
+    void CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::autosizeRatedTotalHeatingCapacity() {
+      bool result = setString(OS_Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::RatedTotalHeatingCapacity, "autosize");
+      OS_ASSERT(result);
+    }
+
+    bool CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::setIndoorUnitReferenceSubcooling(double indoorUnitReferenceSubcooling) {
+      bool result = setDouble(OS_Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::IndoorUnitReferenceSubcooling,
+                              indoorUnitReferenceSubcooling);
+      return result;
+    }
+
+    bool CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::setIndoorUnitCondensingTemperatureFunctionofSubcoolingCurve(
+      const Curve& curve) {
+      bool result =
+        setPointer(OS_Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::IndoorUnitCondensingTemperatureFunctionofSubcoolingCurve,
+                   curve.handle());
+      return result;
+    }
+
+    void CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::autosize() {
+      autosizeRatedTotalHeatingCapacity();
+    }
+
+    void CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::applySizingValues() {
+      boost::optional<double> val;
+      val = autosizedRatedTotalHeatingCapacity();
+      if (val) {
+        setRatedTotalHeatingCapacity(val.get());
+      }
+    }
+
+    boost::optional<Schedule> CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::optionalAvailabilitySchedule() const {
+      return getObject<ModelObject>().getModelObjectTarget<Schedule>(
+        OS_Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::AvailabilitySchedule);
+    }
+
+    boost::optional<Curve>
+      CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::optionalIndoorUnitCondensingTemperatureFunctionofSubcoolingCurve() const {
+      return getObject<ModelObject>().getModelObjectTarget<Curve>(
+        OS_Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControlFields::IndoorUnitCondensingTemperatureFunctionofSubcoolingCurve);
+    }
+
+    ModelObject CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::clone(Model model) const {
+      CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl objectClone =
+        HVACComponent_Impl::clone(model).cast<CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl>();
+
+      return objectClone;
+    }
+
+    std::vector<ModelObject> CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::children() const {
+      std::vector<ModelObject> result;
+
+      result.push_back(indoorUnitCondensingTemperatureFunctionofSubcoolingCurve());
+
+      return result;
+    }
+
+    boost::optional<double> CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl::autosizedRatedAirFlowRate() const {
+      return getAutosizedValue("Design Size Rated Air Flow Rate", "m3/s");
+    }
+
+  }  // namespace detail
+
+  CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl::CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl(const Model& model)
+    : HVACComponent(CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl::iddObjectType(), model) {
+    OS_ASSERT(getImpl<detail::CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl>());
+
+    bool ok = true;
+    Schedule schedule = model.alwaysOnDiscreteSchedule();
+    ok = setAvailabilitySchedule(schedule);
+    OS_ASSERT(ok);
+    autosizeRatedTotalHeatingCapacity();
+    ok = setIndoorUnitReferenceSubcooling(5.0);
+    OS_ASSERT(ok);
+    CurveQuadratic indoorUnitCondensingTemperatureFunctionofSubcoolingCurve(model);
+    indoorUnitCondensingTemperatureFunctionofSubcoolingCurve.setName("VRFIUCondTempCurve");
+    indoorUnitCondensingTemperatureFunctionofSubcoolingCurve.setCoefficient1Constant(-1.85);
+    indoorUnitCondensingTemperatureFunctionofSubcoolingCurve.setCoefficient2x(0.411);
+    indoorUnitCondensingTemperatureFunctionofSubcoolingCurve.setCoefficient3xPOW2(0.0196);
+    indoorUnitCondensingTemperatureFunctionofSubcoolingCurve.setMinimumValueofx(0);
+    indoorUnitCondensingTemperatureFunctionofSubcoolingCurve.setMaximumValueofx(20);
+    ok = setIndoorUnitCondensingTemperatureFunctionofSubcoolingCurve(indoorUnitCondensingTemperatureFunctionofSubcoolingCurve);
+    OS_ASSERT(ok);
+  }
+
+  IddObjectType CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl::iddObjectType() {
+    return IddObjectType(IddObjectType::OS_Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControl);
+  }
+
+  Schedule CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl::availabilitySchedule() const {
+    return getImpl<detail::CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl>()->availabilitySchedule();
+  }
+
+  boost::optional<double> CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl::ratedTotalHeatingCapacity() const {
+    return getImpl<detail::CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl>()->ratedTotalHeatingCapacity();
+  }
+
+  bool CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl::isRatedTotalHeatingCapacityAutosized() const {
+    return getImpl<detail::CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl>()->isRatedTotalHeatingCapacityAutosized();
+  }
+
+  boost::optional<double> CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl::autosizedRatedTotalHeatingCapacity() {
+    return getImpl<detail::CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl>()->autosizedRatedTotalHeatingCapacity();
+  }
+
+  double CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl::indoorUnitReferenceSubcooling() const {
+    return getImpl<detail::CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl>()->indoorUnitReferenceSubcooling();
+  }
+
+  Curve CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl::indoorUnitCondensingTemperatureFunctionofSubcoolingCurve() const {
+    return getImpl<detail::CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl>()
+      ->indoorUnitCondensingTemperatureFunctionofSubcoolingCurve();
+  }
+
+  bool CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl::setAvailabilitySchedule(Schedule& schedule) {
+    return getImpl<detail::CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl>()->setAvailabilitySchedule(schedule);
+  }
+
+  bool CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl::setRatedTotalHeatingCapacity(double ratedTotalHeatingCapacity) {
+    return getImpl<detail::CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl>()->setRatedTotalHeatingCapacity(
+      ratedTotalHeatingCapacity);
+  }
+
+  void CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl::autosizeRatedTotalHeatingCapacity() {
+    getImpl<detail::CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl>()->autosizeRatedTotalHeatingCapacity();
+  }
+
+  bool CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl::setIndoorUnitReferenceSubcooling(double indoorUnitReferenceSubcooling) {
+    return getImpl<detail::CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl>()->setIndoorUnitReferenceSubcooling(
+      indoorUnitReferenceSubcooling);
+  }
+
+  bool CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl::setIndoorUnitCondensingTemperatureFunctionofSubcoolingCurve(const Curve& curve) {
+    return getImpl<detail::CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl>()
+      ->setIndoorUnitCondensingTemperatureFunctionofSubcoolingCurve(curve);
+  }
+
+  boost::optional<double> CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl::autosizedRatedAirFlowRate() const {
+    return getImpl<detail::CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl>()->autosizedRatedAirFlowRate();
+  }
+
+  /// @cond
+  CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl::CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl(
+    std::shared_ptr<detail::CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl> impl)
+    : HVACComponent(std::move(impl)) {}
+  /// @endcond
+
+}  // namespace model
+}  // namespace openstudio
diff --git a/src/model/CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl.hpp b/src/model/CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl.hpp
new file mode 100644
index 00000000000..05407ffb1c5
--- /dev/null
+++ b/src/model/CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl.hpp
@@ -0,0 +1,126 @@
+/***********************************************************************************************************************
+*  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_COILHEATINGDXVARIABLEREFRIGERANTFLOWFLUIDTEMPERATURECONTROL_HPP
+#define MODEL_COILHEATINGDXVARIABLEREFRIGERANTFLOWFLUIDTEMPERATURECONTROL_HPP
+
+#include <model/ModelAPI.hpp>
+#include "HVACComponent.hpp"
+
+namespace openstudio {
+
+namespace model {
+
+  class Schedule;
+  class Curve;
+
+  namespace detail {
+
+    class CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl;
+
+  }  // namespace detail
+
+  /** CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl is a HVACComponent that wraps the OpenStudio IDD object 'OS:Coil:Heating:DX:VariableRefrigerantFlow:FluidTemperatureControl'. */
+  class MODEL_API CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl : public HVACComponent
+  {
+   public:
+    /** @name Constructors and Destructors */
+    //@{
+
+    explicit CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl(const Model& model);
+
+    virtual ~CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl() = default;
+
+    //@}
+
+    static IddObjectType iddObjectType();
+
+    /** @name Getters */
+    //@{
+
+    Schedule availabilitySchedule() const;
+
+    boost::optional<double> ratedTotalHeatingCapacity() const;
+
+    bool isRatedTotalHeatingCapacityAutosized() const;
+
+    boost::optional<double> autosizedRatedTotalHeatingCapacity();
+
+    double indoorUnitReferenceSubcooling() const;
+
+    Curve indoorUnitCondensingTemperatureFunctionofSubcoolingCurve() const;
+
+    //@}
+    /** @name Setters */
+    //@{
+
+    bool setAvailabilitySchedule(Schedule& schedule);
+
+    bool setRatedTotalHeatingCapacity(double ratedTotalHeatingCapacity);
+
+    void autosizeRatedTotalHeatingCapacity();
+
+    bool setIndoorUnitReferenceSubcooling(double indoorUnitReferenceSubcooling);
+
+    bool setIndoorUnitCondensingTemperatureFunctionofSubcoolingCurve(const Curve& curve);
+
+    //@}
+    /** @name Other */
+    //@{
+
+    boost::optional<double> autosizedRatedAirFlowRate() const;
+
+    //@}
+   protected:
+    /// @cond
+    using ImplType = detail::CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl;
+
+    explicit CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl(
+      std::shared_ptr<detail::CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl> impl);
+
+    friend class detail::CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl;
+    friend class Model;
+    friend class IdfObject;
+    friend class openstudio::detail::IdfObject_Impl;
+    /// @endcond
+   private:
+    REGISTER_LOGGER("openstudio.model.CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl");
+  };
+
+  /** \relates CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl*/
+  using OptionalCoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl =
+    boost::optional<CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl>;
+
+  /** \relates CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl*/
+  using CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControlVector = std::vector<CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl>;
+
+}  // namespace model
+}  // namespace openstudio
+
+#endif  // MODEL_COILHEATINGDXVARIABLEREFRIGERANTFLOWFLUIDTEMPERATURECONTROL_HPP
diff --git a/src/model/CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl.hpp b/src/model/CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl.hpp
new file mode 100644
index 00000000000..6e8e95a1db2
--- /dev/null
+++ b/src/model/CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl.hpp
@@ -0,0 +1,129 @@
+/***********************************************************************************************************************
+*  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_COILHEATINGDXVARIABLEREFRIGERANTFLOWFLUIDTEMPERATURECONTROL_IMPL_HPP
+#define MODEL_COILHEATINGDXVARIABLEREFRIGERANTFLOWFLUIDTEMPERATURECONTROL_IMPL_HPP
+
+#include <model/ModelAPI.hpp>
+#include "HVACComponent_Impl.hpp"
+
+namespace openstudio {
+namespace model {
+
+  class Schedule;
+  class Curve;
+
+  namespace detail {
+
+    /** CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl is a HVACComponent_Impl that is the implementation class for CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl.*/
+    class MODEL_API CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl : public HVACComponent_Impl
+    {
+     public:
+      /** @name Constructors and Destructors */
+      //@{
+
+      CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl(const IdfObject& idfObject, Model_Impl* model, bool keepHandle);
+
+      CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl(const openstudio::detail::WorkspaceObject_Impl& other, Model_Impl* model,
+                                                                       bool keepHandle);
+
+      CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl(const CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl& other,
+                                                                       Model_Impl* model, bool keepHandle);
+
+      virtual ~CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl() {}
+
+      //@}
+      /** @name Virtual Methods */
+      //@{
+
+      virtual const std::vector<std::string>& outputVariableNames() const override;
+
+      virtual IddObjectType iddObjectType() const override;
+
+      virtual std::vector<ScheduleTypeKey> getScheduleTypeKeys(const Schedule& schedule) const override;
+
+      //@}
+      /** @name Getters */
+      //@{
+
+      Schedule availabilitySchedule() const;
+
+      boost::optional<double> ratedTotalHeatingCapacity() const;
+
+      bool isRatedTotalHeatingCapacityAutosized() const;
+
+      boost::optional<double> autosizedRatedTotalHeatingCapacity();
+
+      double indoorUnitReferenceSubcooling() const;
+
+      Curve indoorUnitCondensingTemperatureFunctionofSubcoolingCurve() const;
+
+      //@}
+      /** @name Setters */
+      //@{
+
+      bool setAvailabilitySchedule(Schedule& schedule);
+
+      bool setRatedTotalHeatingCapacity(double ratedTotalHeatingCapacity);
+
+      void autosizeRatedTotalHeatingCapacity();
+
+      bool setIndoorUnitReferenceSubcooling(double indoorUnitReferenceSubcooling);
+
+      bool setIndoorUnitCondensingTemperatureFunctionofSubcoolingCurve(const Curve& curve);
+
+      virtual void autosize() override;
+
+      virtual void applySizingValues() override;
+
+      //@}
+      /** @name Other */
+      //@{
+
+      ModelObject clone(Model model) const override;
+
+      std::vector<ModelObject> children() const override;
+
+      boost::optional<double> autosizedRatedAirFlowRate() const;
+
+      //@}
+     protected:
+     private:
+      REGISTER_LOGGER("openstudio.model.CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl");
+
+      boost::optional<Schedule> optionalAvailabilitySchedule() const;
+      boost::optional<Curve> optionalIndoorUnitCondensingTemperatureFunctionofSubcoolingCurve() const;
+    };
+
+  }  // namespace detail
+
+}  // namespace model
+}  // namespace openstudio
+
+#endif  // MODEL_COILHEATINGDXVARIABLEREFRIGERANTFLOWFLUIDTEMPERATURECONTROL_IMPL_HPP
diff --git a/src/model/ConcreteModelObjects.hpp b/src/model/ConcreteModelObjects.hpp
index e3bcb229226..22541cda144 100644
--- a/src/model/ConcreteModelObjects.hpp
+++ b/src/model/ConcreteModelObjects.hpp
@@ -32,6 +32,8 @@
 
 #include "AdditionalProperties.hpp"
 #include "AirConditionerVariableRefrigerantFlow.hpp"
+#include "AirConditionerVariableRefrigerantFlowFluidTemperatureControl.hpp"
+#include "AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR.hpp"
 #include "AirflowNetworkConstantPressureDrop.hpp"
 #include "AirflowNetworkCrack.hpp"
 #include "AirflowNetworkDetailedOpening.hpp"
@@ -121,6 +123,7 @@
 #include "CoilCoolingDXTwoSpeed.hpp"
 #include "CoilCoolingDXTwoStageWithHumidityControlMode.hpp"
 #include "CoilCoolingDXVariableRefrigerantFlow.hpp"
+#include "CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl.hpp"
 #include "CoilCoolingLowTempRadiantConstFlow.hpp"
 #include "CoilCoolingLowTempRadiantVarFlow.hpp"
 #include "CoilCoolingDXVariableSpeed.hpp"
@@ -136,6 +139,7 @@
 #include "CoilHeatingDXMultiSpeedStageData.hpp"
 #include "CoilHeatingDXSingleSpeed.hpp"
 #include "CoilHeatingDXVariableRefrigerantFlow.hpp"
+#include "CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl.hpp"
 #include "CoilHeatingElectric.hpp"
 #include "CoilHeatingElectricMultiStage.hpp"
 #include "CoilHeatingElectricMultiStageStageData.hpp"
@@ -328,6 +332,7 @@
 #include "LightingSimulationZone.hpp"
 #include "Lights.hpp"
 #include "LightsDefinition.hpp"
+#include "LoadingIndex.hpp"
 #include "Luminaire.hpp"
 #include "LuminaireDefinition.hpp"
 #include "MaterialPropertyGlazingSpectralData.hpp"
@@ -571,6 +576,8 @@
 // include all concrete ModelObject Impls too
 #include "AdditionalProperties_Impl.hpp"
 #include "AirConditionerVariableRefrigerantFlow_Impl.hpp"
+#include "AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl.hpp"
+#include "AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl.hpp"
 #include "AirflowNetworkConstantPressureDrop_Impl.hpp"
 #include "AirflowNetworkCrack_Impl.hpp"
 #include "AirflowNetworkDetailedOpening_Impl.hpp"
@@ -660,6 +667,7 @@
 #include "CoilCoolingDXTwoSpeed_Impl.hpp"
 #include "CoilCoolingDXTwoStageWithHumidityControlMode_Impl.hpp"
 #include "CoilCoolingDXVariableRefrigerantFlow_Impl.hpp"
+#include "CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl.hpp"
 #include "CoilCoolingLowTempRadiantConstFlow_Impl.hpp"
 #include "CoilCoolingLowTempRadiantVarFlow_Impl.hpp"
 #include "CoilCoolingDXVariableSpeed_Impl.hpp"
@@ -675,6 +683,7 @@
 #include "CoilHeatingDXMultiSpeedStageData_Impl.hpp"
 #include "CoilHeatingDXSingleSpeed_Impl.hpp"
 #include "CoilHeatingDXVariableRefrigerantFlow_Impl.hpp"
+#include "CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl.hpp"
 #include "CoilHeatingElectric_Impl.hpp"
 #include "CoilHeatingElectricMultiStage_Impl.hpp"
 #include "CoilHeatingElectricMultiStageStageData_Impl.hpp"
@@ -867,6 +876,7 @@
 #include "LightingSimulationZone_Impl.hpp"
 #include "Lights_Impl.hpp"
 #include "LightsDefinition_Impl.hpp"
+#include "LoadingIndex_Impl.hpp"
 #include "Luminaire_Impl.hpp"
 #include "LuminaireDefinition_Impl.hpp"
 #include "MaterialPropertyGlazingSpectralData_Impl.hpp"
diff --git a/src/model/LoadingIndex.cpp b/src/model/LoadingIndex.cpp
new file mode 100644
index 00000000000..2d39b9699a9
--- /dev/null
+++ b/src/model/LoadingIndex.cpp
@@ -0,0 +1,192 @@
+/***********************************************************************************************************************
+*  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 "LoadingIndex.hpp"
+#include "LoadingIndex_Impl.hpp"
+
+#include "Curve.hpp"
+#include "Curve_Impl.hpp"
+#include "Model.hpp"
+#include "Model_Impl.hpp"
+
+#include <utilities/idd/IddEnums.hxx>
+#include <utilities/idd/OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_LoadingIndex_FieldEnums.hxx>
+
+#include "../utilities/units/Unit.hpp"
+
+#include "../utilities/core/Assert.hpp"
+
+namespace openstudio {
+namespace model {
+
+  namespace detail {
+
+    LoadingIndex_Impl::LoadingIndex_Impl(const IdfObject& idfObject, Model_Impl* model, bool keepHandle)
+      : ParentObject_Impl(idfObject, model, keepHandle) {
+      OS_ASSERT(idfObject.iddObject().type() == LoadingIndex::iddObjectType());
+    }
+
+    LoadingIndex_Impl::LoadingIndex_Impl(const openstudio::detail::WorkspaceObject_Impl& other, Model_Impl* model, bool keepHandle)
+      : ParentObject_Impl(other, model, keepHandle) {
+      OS_ASSERT(other.iddObject().type() == LoadingIndex::iddObjectType());
+    }
+
+    LoadingIndex_Impl::LoadingIndex_Impl(const LoadingIndex_Impl& other, Model_Impl* model, bool keepHandle)
+      : ParentObject_Impl(other, model, keepHandle) {}
+
+    const std::vector<std::string>& LoadingIndex_Impl::outputVariableNames() const {
+      static std::vector<std::string> result;
+      return result;
+    }
+
+    IddObjectType LoadingIndex_Impl::iddObjectType() const {
+      return LoadingIndex::iddObjectType();
+    }
+
+    ModelObject LoadingIndex_Impl::clone(Model model) const {
+      // Don't clone the curves (listed as children)
+      return ModelObject_Impl::clone(model).cast<LoadingIndex>();  // NOLINT(bugprone-parent-virtual-call)
+    }
+
+    std::vector<ModelObject> LoadingIndex_Impl::children() const {
+      return {evaporativeCapacityMultiplierFunctionofTemperatureCurve(), compressorPowerMultiplierFunctionofTemperatureCurve()};
+    }
+
+    double LoadingIndex_Impl::compressorSpeed() const {
+      boost::optional<double> value =
+        getDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_LoadingIndexFields::CompressorSpeed, true);
+      OS_ASSERT(value);
+      return value.get();
+    }
+
+    Curve LoadingIndex_Impl::evaporativeCapacityMultiplierFunctionofTemperatureCurve() const {
+      boost::optional<Curve> value = optionalEvaporativeCapacityMultiplierFunctionofTemperatureCurve();
+      if (!value) {
+        LOG_AND_THROW(briefDescription() << " does not have an Evaporative Capacity Multiplier Function of Temperature Curve attached.");
+      }
+      return value.get();
+    }
+
+    Curve LoadingIndex_Impl::compressorPowerMultiplierFunctionofTemperatureCurve() const {
+      boost::optional<Curve> value = optionalCompressorPowerMultiplierFunctionofTemperatureCurve();
+      if (!value) {
+        LOG_AND_THROW(briefDescription() << " does not have an Compressor Power Multiplier Function of Temperature Curve attached.");
+      }
+      return value.get();
+    }
+
+    bool LoadingIndex_Impl::setCompressorSpeed(double compressorSpeed) {
+      bool result = setDouble(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_LoadingIndexFields::CompressorSpeed, compressorSpeed);
+      return result;
+    }
+
+    bool LoadingIndex_Impl::setEvaporativeCapacityMultiplierFunctionofTemperatureCurve(const Curve& curve) {
+      bool result = setPointer(OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_LoadingIndexFields::
+                                 EvaporativeCapacityMultiplierFunctionofTemperatureCurveName,
+                               curve.handle());
+      return result;
+    }
+
+    bool LoadingIndex_Impl::setCompressorPowerMultiplierFunctionofTemperatureCurve(const Curve& curve) {
+      bool result = setPointer(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_LoadingIndexFields::CompressorPowerMultiplierFunctionofTemperatureCurveName,
+        curve.handle());
+      return result;
+    }
+
+    boost::optional<Curve> LoadingIndex_Impl::optionalEvaporativeCapacityMultiplierFunctionofTemperatureCurve() const {
+      return getObject<ModelObject>().getModelObjectTarget<Curve>(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_LoadingIndexFields::
+          EvaporativeCapacityMultiplierFunctionofTemperatureCurveName);
+    }
+
+    boost::optional<Curve> LoadingIndex_Impl::optionalCompressorPowerMultiplierFunctionofTemperatureCurve() const {
+      return getObject<ModelObject>().getModelObjectTarget<Curve>(
+        OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_LoadingIndexFields::
+          CompressorPowerMultiplierFunctionofTemperatureCurveName);
+    }
+
+  }  // namespace detail
+
+  LoadingIndex::LoadingIndex(const Model& model, double compressorSpeed, const Curve& evaporativeCapacityMultiplierFunctionofTemperatureCurve,
+                             const Curve& compressorPowerMultiplierFunctionofTemperatureCurve)
+    : ParentObject(LoadingIndex::iddObjectType(), model) {
+    OS_ASSERT(getImpl<detail::LoadingIndex_Impl>());
+
+    bool ok = true;
+    ok = setCompressorSpeed(compressorSpeed);
+    OS_ASSERT(ok);
+    ok = setEvaporativeCapacityMultiplierFunctionofTemperatureCurve(evaporativeCapacityMultiplierFunctionofTemperatureCurve);
+    if (!ok) {
+      remove();
+      LOG_AND_THROW("Unable to set " << briefDescription() << "'s Evaporative Capacity Multiplier Function of Temperature Curve to "
+                                     << evaporativeCapacityMultiplierFunctionofTemperatureCurve.briefDescription() << ".");
+    }
+    ok = setCompressorPowerMultiplierFunctionofTemperatureCurve(compressorPowerMultiplierFunctionofTemperatureCurve);
+    if (!ok) {
+      remove();
+      LOG_AND_THROW("Unable to set " << briefDescription() << "'s Compressor Power Multiplier Function of Temperature Curve to "
+                                     << compressorPowerMultiplierFunctionofTemperatureCurve.briefDescription() << ".");
+    }
+  }
+
+  IddObjectType LoadingIndex::iddObjectType() {
+    return IddObjectType(IddObjectType::OS_AirConditioner_VariableRefrigerantFlow_FluidTemperatureControl_LoadingIndex);
+  }
+
+  double LoadingIndex::compressorSpeed() const {
+    return getImpl<detail::LoadingIndex_Impl>()->compressorSpeed();
+  }
+
+  Curve LoadingIndex::evaporativeCapacityMultiplierFunctionofTemperatureCurve() const {
+    return getImpl<detail::LoadingIndex_Impl>()->evaporativeCapacityMultiplierFunctionofTemperatureCurve();
+  }
+
+  Curve LoadingIndex::compressorPowerMultiplierFunctionofTemperatureCurve() const {
+    return getImpl<detail::LoadingIndex_Impl>()->compressorPowerMultiplierFunctionofTemperatureCurve();
+  }
+
+  bool LoadingIndex::setCompressorSpeed(double compressorSpeed) {
+    return getImpl<detail::LoadingIndex_Impl>()->setCompressorSpeed(compressorSpeed);
+  }
+
+  bool LoadingIndex::setEvaporativeCapacityMultiplierFunctionofTemperatureCurve(const Curve& curve) {
+    return getImpl<detail::LoadingIndex_Impl>()->setEvaporativeCapacityMultiplierFunctionofTemperatureCurve(curve);
+  }
+
+  bool LoadingIndex::setCompressorPowerMultiplierFunctionofTemperatureCurve(const Curve& curve) {
+    return getImpl<detail::LoadingIndex_Impl>()->setCompressorPowerMultiplierFunctionofTemperatureCurve(curve);
+  }
+
+  /// @cond
+  LoadingIndex::LoadingIndex(std::shared_ptr<detail::LoadingIndex_Impl> impl) : ParentObject(std::move(impl)) {}
+  /// @endcond
+
+}  // namespace model
+}  // namespace openstudio
diff --git a/src/model/LoadingIndex.hpp b/src/model/LoadingIndex.hpp
new file mode 100644
index 00000000000..78d236bf0f3
--- /dev/null
+++ b/src/model/LoadingIndex.hpp
@@ -0,0 +1,112 @@
+/***********************************************************************************************************************
+*  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_LOADINGINDEX_HPP
+#define MODEL_LOADINGINDEX_HPP
+
+#include <model/ModelAPI.hpp>
+#include "ParentObject.hpp"
+
+namespace openstudio {
+
+namespace model {
+
+  class Curve;
+
+  namespace detail {
+
+    class LoadingIndex_Impl;
+
+  }  // namespace detail
+
+  /** LoadingIndex is a ParentObject that wraps the OpenStudio IDD object 'OS:AirConditioner:VariableRefrigerantFlow:FluidTemperatureControl:LoadingIndex'. */
+  class MODEL_API LoadingIndex : public ParentObject
+  {
+   public:
+    /** @name Constructors and Destructors */
+    //@{
+
+    explicit LoadingIndex(const Model& model, double compressorSpeed, const Curve& evaporativeCapacityMultiplierFunctionofTemperatureCurve,
+                          const Curve& compressorPowerMultiplierFunctionofTemperatureCurve);
+
+    virtual ~LoadingIndex() = default;
+
+    //@}
+
+    static IddObjectType iddObjectType();
+
+    /** @name Getters */
+    //@{
+
+    double compressorSpeed() const;
+
+    Curve evaporativeCapacityMultiplierFunctionofTemperatureCurve() const;
+
+    Curve compressorPowerMultiplierFunctionofTemperatureCurve() const;
+
+    //@}
+    /** @name Setters */
+    //@{
+
+    bool setCompressorSpeed(double compressorSpeed);
+
+    bool setEvaporativeCapacityMultiplierFunctionofTemperatureCurve(const Curve& curve);
+
+    bool setCompressorPowerMultiplierFunctionofTemperatureCurve(const Curve& curve);
+
+    //@}
+    /** @name Other */
+    //@{
+
+    //@}
+   protected:
+    /// @cond
+    using ImplType = detail::LoadingIndex_Impl;
+
+    explicit LoadingIndex(std::shared_ptr<detail::LoadingIndex_Impl> impl);
+
+    friend class detail::LoadingIndex_Impl;
+    friend class Model;
+    friend class IdfObject;
+    friend class openstudio::detail::IdfObject_Impl;
+    /// @endcond
+   private:
+    REGISTER_LOGGER("openstudio.model.LoadingIndex");
+  };
+
+  /** \relates LoadingIndex*/
+  using OptionalLoadingIndex = boost::optional<LoadingIndex>;
+
+  /** \relates LoadingIndex*/
+  using LoadingIndexVector = std::vector<LoadingIndex>;
+
+}  // namespace model
+}  // namespace openstudio
+
+#endif  // MODEL_LOADINGINDEX_HPP
diff --git a/src/model/LoadingIndex_Impl.hpp b/src/model/LoadingIndex_Impl.hpp
new file mode 100644
index 00000000000..6d9d86c9e01
--- /dev/null
+++ b/src/model/LoadingIndex_Impl.hpp
@@ -0,0 +1,113 @@
+/***********************************************************************************************************************
+*  OpenStudio(R), Copyright (c) 2008-2022, Alliance for Sustainable Energy, LLC, and other contributors. All rights reserved.
+*
+*  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
+*  following conditions are met:
+*
+*  (1) Redistributions of source code must retain the above copyright notice, this list of conditions and the following
+*  disclaimer.
+*
+*  (2) Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
+*  disclaimer in the documentation and/or other materials provided with the distribution.
+*
+*  (3) Neither the name of the copyright holder nor the names of any contributors may be used to endorse or promote products
+*  derived from this software without specific prior written permission from the respective party.
+*
+*  (4) Other than as required in clauses (1) and (2), distributions in any form of modifications or other derivative works
+*  may not use the "OpenStudio" trademark, "OS", "os", or any other confusingly similar designation without specific prior
+*  written permission from Alliance for Sustainable Energy, LLC.
+*
+*  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+*  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+*  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE UNITED STATES GOVERNMENT, OR THE UNITED
+*  STATES DEPARTMENT OF ENERGY, NOR ANY OF THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+*  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+*  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+*  STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+*  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+***********************************************************************************************************************/
+
+#ifndef MODEL_LOADINGINDEX_IMPL_HPP
+#define MODEL_LOADINGINDEX_IMPL_HPP
+
+#include <model/ModelAPI.hpp>
+#include "ParentObject_Impl.hpp"
+
+namespace openstudio {
+namespace model {
+
+  class Curve;
+
+  namespace detail {
+
+    /** LoadingIndex_Impl is a ParentObject_Impl that is the implementation class for LoadingIndex.*/
+    class MODEL_API LoadingIndex_Impl : public ParentObject_Impl
+    {
+     public:
+      /** @name Constructors and Destructors */
+      //@{
+
+      LoadingIndex_Impl(const IdfObject& idfObject, Model_Impl* model, bool keepHandle);
+
+      LoadingIndex_Impl(const openstudio::detail::WorkspaceObject_Impl& other, Model_Impl* model, bool keepHandle);
+
+      LoadingIndex_Impl(const LoadingIndex_Impl& other, Model_Impl* model, bool keepHandle);
+
+      virtual ~LoadingIndex_Impl() = default;
+
+      //@}
+      /** @name Virtual Methods */
+      //@{
+
+      virtual const std::vector<std::string>& outputVariableNames() const override;
+
+      virtual IddObjectType iddObjectType() const override;
+
+      // Overriding clone and children here because we want to try to remove the Curves (if they aren't used by something else)
+      // So we list them as children. But ParentObject_Impl::clone would also clone them, so we override clone to call ModelObject_Impl::clone
+      virtual ModelObject clone(Model model) const override;
+
+      virtual std::vector<ModelObject> children() const override;
+
+      // No need to override, it bears only ResourceObjects
+      // virtual std::vector<IddObjectType> allowableChildTypes() const override;
+
+      //@}
+      /** @name Getters */
+      //@{
+
+      double compressorSpeed() const;
+
+      Curve evaporativeCapacityMultiplierFunctionofTemperatureCurve() const;
+
+      Curve compressorPowerMultiplierFunctionofTemperatureCurve() const;
+
+      //@}
+      /** @name Setters */
+      //@{
+
+      bool setCompressorSpeed(double compressorSpeed);
+
+      bool setEvaporativeCapacityMultiplierFunctionofTemperatureCurve(const Curve& curve);
+
+      bool setCompressorPowerMultiplierFunctionofTemperatureCurve(const Curve& curve);
+
+      //@}
+      /** @name Other */
+      //@{
+
+      //@}
+     protected:
+     private:
+      REGISTER_LOGGER("openstudio.model.LoadingIndex");
+
+      boost::optional<Curve> optionalEvaporativeCapacityMultiplierFunctionofTemperatureCurve() const;
+      boost::optional<Curve> optionalCompressorPowerMultiplierFunctionofTemperatureCurve() const;
+    };
+
+  }  // namespace detail
+
+}  // namespace model
+}  // namespace openstudio
+
+#endif  // MODEL_LOADINGINDEX_IMPL_HPP
diff --git a/src/model/Model.cpp b/src/model/Model.cpp
index 04ff91e759f..96a68cf9ac4 100644
--- a/src/model/Model.cpp
+++ b/src/model/Model.cpp
@@ -3874,6 +3874,8 @@ namespace model {
 
     REGISTER_CONSTRUCTOR(AdditionalProperties);
     REGISTER_CONSTRUCTOR(AirConditionerVariableRefrigerantFlow);
+    REGISTER_CONSTRUCTOR(AirConditionerVariableRefrigerantFlowFluidTemperatureControl);
+    REGISTER_CONSTRUCTOR(AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR);
     REGISTER_CONSTRUCTOR(AirflowNetworkConstantPressureDrop);
     REGISTER_CONSTRUCTOR(AirflowNetworkCrack);
     REGISTER_CONSTRUCTOR(AirflowNetworkDetailedOpening);
@@ -3963,6 +3965,7 @@ namespace model {
     REGISTER_CONSTRUCTOR(CoilCoolingDXTwoSpeed);
     REGISTER_CONSTRUCTOR(CoilCoolingDXTwoStageWithHumidityControlMode);
     REGISTER_CONSTRUCTOR(CoilCoolingDXVariableRefrigerantFlow);
+    REGISTER_CONSTRUCTOR(CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl);
     REGISTER_CONSTRUCTOR(CoilCoolingLowTempRadiantConstFlow);
     REGISTER_CONSTRUCTOR(CoilCoolingLowTempRadiantVarFlow);
     REGISTER_CONSTRUCTOR(CoilCoolingDXVariableSpeed);
@@ -3978,6 +3981,7 @@ namespace model {
     REGISTER_CONSTRUCTOR(CoilHeatingDXMultiSpeedStageData);
     REGISTER_CONSTRUCTOR(CoilHeatingDXSingleSpeed);
     REGISTER_CONSTRUCTOR(CoilHeatingDXVariableRefrigerantFlow);
+    REGISTER_CONSTRUCTOR(CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl);
     REGISTER_CONSTRUCTOR(CoilHeatingElectric);
     REGISTER_CONSTRUCTOR(CoilHeatingElectricMultiStage);
     REGISTER_CONSTRUCTOR(CoilHeatingElectricMultiStageStageData);
@@ -4168,7 +4172,8 @@ namespace model {
     REGISTER_CONSTRUCTOR(LightingSimulationControl);
     REGISTER_CONSTRUCTOR(LightingSimulationZone);
     REGISTER_CONSTRUCTOR(Lights);
-    REGISTER_CONSTRUCTOR(LightsDefinition)
+    REGISTER_CONSTRUCTOR(LightsDefinition);
+    REGISTER_CONSTRUCTOR(LoadingIndex);
     REGISTER_CONSTRUCTOR(Luminaire);
     REGISTER_CONSTRUCTOR(LuminaireDefinition);
     REGISTER_CONSTRUCTOR(MaterialPropertyGlazingSpectralData);
@@ -4433,6 +4438,8 @@ namespace model {
   };
     REGISTER_COPYCONSTRUCTORS(AdditionalProperties);
     REGISTER_COPYCONSTRUCTORS(AirConditionerVariableRefrigerantFlow);
+    REGISTER_COPYCONSTRUCTORS(AirConditionerVariableRefrigerantFlowFluidTemperatureControl);
+    REGISTER_COPYCONSTRUCTORS(AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR);
     REGISTER_COPYCONSTRUCTORS(AirflowNetworkConstantPressureDrop);
     REGISTER_COPYCONSTRUCTORS(AirflowNetworkCrack);
     REGISTER_COPYCONSTRUCTORS(AirflowNetworkDetailedOpening);
@@ -4522,6 +4529,7 @@ namespace model {
     REGISTER_COPYCONSTRUCTORS(CoilCoolingDXTwoSpeed);
     REGISTER_COPYCONSTRUCTORS(CoilCoolingDXTwoStageWithHumidityControlMode);
     REGISTER_COPYCONSTRUCTORS(CoilCoolingDXVariableRefrigerantFlow);
+    REGISTER_COPYCONSTRUCTORS(CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl);
     REGISTER_COPYCONSTRUCTORS(CoilCoolingLowTempRadiantConstFlow);
     REGISTER_COPYCONSTRUCTORS(CoilCoolingLowTempRadiantVarFlow);
     REGISTER_COPYCONSTRUCTORS(CoilCoolingDXVariableSpeed);
@@ -4537,6 +4545,7 @@ namespace model {
     REGISTER_COPYCONSTRUCTORS(CoilHeatingDXMultiSpeedStageData);
     REGISTER_COPYCONSTRUCTORS(CoilHeatingDXSingleSpeed);
     REGISTER_COPYCONSTRUCTORS(CoilHeatingDXVariableRefrigerantFlow);
+    REGISTER_COPYCONSTRUCTORS(CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl);
     REGISTER_COPYCONSTRUCTORS(CoilHeatingElectric);
     REGISTER_COPYCONSTRUCTORS(CoilHeatingElectricMultiStage);
     REGISTER_COPYCONSTRUCTORS(CoilHeatingElectricMultiStageStageData);
@@ -4728,6 +4737,7 @@ namespace model {
     REGISTER_COPYCONSTRUCTORS(LightingSimulationZone);
     REGISTER_COPYCONSTRUCTORS(Lights);
     REGISTER_COPYCONSTRUCTORS(LightsDefinition);
+    REGISTER_COPYCONSTRUCTORS(LoadingIndex);
     REGISTER_COPYCONSTRUCTORS(Luminaire);
     REGISTER_COPYCONSTRUCTORS(LuminaireDefinition);
     REGISTER_COPYCONSTRUCTORS(MaterialPropertyGlazingSpectralData);
diff --git a/src/model/ModelHVAC.i b/src/model/ModelHVAC.i
index a6ba74d2c64..8d932a5967e 100644
--- a/src/model/ModelHVAC.i
+++ b/src/model/ModelHVAC.i
@@ -164,6 +164,8 @@ MODELOBJECT_TEMPLATES(Splitter);
 MODELOBJECT_TEMPLATES(AirLoopHVACSupplyPlenum);
 MODELOBJECT_TEMPLATES(AirLoopHVACZoneSplitter);
 MODELOBJECT_TEMPLATES(ConnectorSplitter);
+MODELOBJECT_TEMPLATES(AirConditionerVariableRefrigerantFlowFluidTemperatureControl);
+MODELOBJECT_TEMPLATES(AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR);
 MODELOBJECT_TEMPLATES(AirTerminalDualDuctConstantVolume);
 MODELOBJECT_TEMPLATES(AirTerminalDualDuctVAV);
 MODELOBJECT_TEMPLATES(AirTerminalDualDuctVAVOutdoorAir);
@@ -175,6 +177,7 @@ MODELOBJECT_TEMPLATES(ChillerElectricEIR);
 MODELOBJECT_TEMPLATES(ChillerElectricReformulatedEIR);
 MODELOBJECT_TEMPLATES(CoilCoolingDXMultiSpeedStageData);
 MODELOBJECT_TEMPLATES(CoilCoolingDXVariableRefrigerantFlow);
+MODELOBJECT_TEMPLATES(CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl);
 MODELOBJECT_TEMPLATES(CoilCoolingDXVariableSpeedSpeedData);
 MODELOBJECT_TEMPLATES(CoilCoolingWater);
 MODELOBJECT_TEMPLATES(CoilCoolingWaterToAirHeatPumpEquationFit);
@@ -182,6 +185,7 @@ MODELOBJECT_TEMPLATES(CoilCoolingWaterToAirHeatPumpVariableSpeedEquationFit);
 MODELOBJECT_TEMPLATES(CoilCoolingWaterToAirHeatPumpVariableSpeedEquationFitSpeedData);
 MODELOBJECT_TEMPLATES(CoilHeatingDXMultiSpeedStageData);
 MODELOBJECT_TEMPLATES(CoilHeatingDXVariableRefrigerantFlow);
+MODELOBJECT_TEMPLATES(CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl);
 MODELOBJECT_TEMPLATES(CoilHeatingGasMultiStageStageData);
 MODELOBJECT_TEMPLATES(CoilHeatingElectricMultiStageStageData);
 MODELOBJECT_TEMPLATES(CoilHeatingDXVariableSpeedSpeedData);
@@ -246,6 +250,7 @@ MODELOBJECT_TEMPLATES(SetpointManagerColdest);
 MODELOBJECT_TEMPLATES(SetpointManagerFollowGroundTemperature);
 MODELOBJECT_TEMPLATES(SetpointManagerSystemNodeResetHumidity);
 MODELOBJECT_TEMPLATES(SetpointManagerSystemNodeResetTemperature);
+MODELOBJECT_TEMPLATES(LoadingIndex);
 
 SWIG_MODELOBJECT(PortList, 1);
 SWIG_MODELOBJECT(Loop, 0);
@@ -287,6 +292,8 @@ SWIG_MODELOBJECT(Splitter, 0);
 SWIG_MODELOBJECT(AirLoopHVACSupplyPlenum, 1);
 SWIG_MODELOBJECT(AirLoopHVACZoneSplitter, 1);
 SWIG_MODELOBJECT(ConnectorSplitter, 1);
+SWIG_MODELOBJECT(AirConditionerVariableRefrigerantFlowFluidTemperatureControl,1);
+SWIG_MODELOBJECT(AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR,1);
 SWIG_MODELOBJECT(AirTerminalDualDuctConstantVolume, 1);
 SWIG_MODELOBJECT(AirTerminalDualDuctVAV, 1);
 SWIG_MODELOBJECT(AirTerminalDualDuctVAVOutdoorAir, 1);
@@ -298,6 +305,7 @@ SWIG_MODELOBJECT(ChillerElectricEIR, 1);
 SWIG_MODELOBJECT(ChillerElectricReformulatedEIR, 1);
 SWIG_MODELOBJECT(CoilCoolingDXMultiSpeedStageData, 1);
 SWIG_MODELOBJECT(CoilCoolingDXVariableRefrigerantFlow, 1);
+SWIG_MODELOBJECT(CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl, 1);
 SWIG_MODELOBJECT(CoilCoolingDXVariableSpeedSpeedData, 1);
 SWIG_MODELOBJECT(CoilCoolingWater, 1);
 SWIG_MODELOBJECT(CoilCoolingWaterToAirHeatPumpEquationFit, 1);
@@ -305,6 +313,7 @@ SWIG_MODELOBJECT(CoilCoolingWaterToAirHeatPumpVariableSpeedEquationFit, 1);
 SWIG_MODELOBJECT(CoilCoolingWaterToAirHeatPumpVariableSpeedEquationFitSpeedData, 1);
 SWIG_MODELOBJECT(CoilHeatingDXMultiSpeedStageData, 1);
 SWIG_MODELOBJECT(CoilHeatingDXVariableRefrigerantFlow, 1);
+SWIG_MODELOBJECT(CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl, 1);
 SWIG_MODELOBJECT(CoilHeatingGasMultiStageStageData, 1);
 SWIG_MODELOBJECT(CoilHeatingElectricMultiStageStageData, 1);
 SWIG_MODELOBJECT(CoilHeatingDXVariableSpeedSpeedData, 1);
@@ -369,6 +378,7 @@ SWIG_MODELOBJECT(SetpointManagerColdest,1);
 SWIG_MODELOBJECT(SetpointManagerFollowGroundTemperature,1);
 SWIG_MODELOBJECT(SetpointManagerSystemNodeResetHumidity,1);
 SWIG_MODELOBJECT(SetpointManagerSystemNodeResetTemperature,1);
+SWIG_MODELOBJECT(LoadingIndex, 1);
 
 #if defined(SWIGCSHARP) || defined(SWIGJAVA)
   %inline {
diff --git a/src/model/ScheduleTypeRegistry.cpp b/src/model/ScheduleTypeRegistry.cpp
index 728022862c7..8c80d9b8b23 100644
--- a/src/model/ScheduleTypeRegistry.cpp
+++ b/src/model/ScheduleTypeRegistry.cpp
@@ -112,6 +112,10 @@ namespace model {
 
     const ScheduleType scheduleTypes[] = {
       {"AirConditionerVariableRefrigerantFlow", "Availability Schedule", "availabilitySchedule", false, "Availability", 0.0, 1.0},
+      {"AirConditionerVariableRefrigerantFlowFluidTemperatureControl", "Availability Schedule", "availabilitySchedule", false, "Availability", 0.0,
+       1.0},
+      {"AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR", "Availability Schedule", "availabilitySchedule", false, "Availability", 0.0,
+       1.0},
       {"AirConditionerVariableRefrigerantFlow", "Thermostat Priority Schedule", "thermostatPrioritySchedule", false, "ControlMode", 0.0, 1.0},
       {"AirConditionerVariableRefrigerantFlow", "Basin Heater Operating Schedule", "basinHeaterOperatingSchedule", false, "Availability", 0.0, 1.0},
       {"AirLoopHVAC", "Return Air Bypass Flow Temperature Setpoint", "returnAirBypassFlowTemperatureSetpointSchedule", true, "Temperature",
@@ -191,6 +195,8 @@ namespace model {
       {"CoilCoolingDXMultiSpeed", "Availability Schedule", "availabilitySchedule", false, "Availability", 0.0, 1.0},
       {"CoilCoolingDXMultiSpeed", "Basin Heater Operating Schedule", "basinHeaterOperatingSchedule", false, "Availability", 0.0, 1.0},
       {"CoilCoolingDXVariableRefrigerantFlow", "Availability Schedule", "availabilitySchedule", false, "Availability", 0.0, 1.0},
+      {"CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl", "Availability Schedule", "availabilitySchedule", false, "Availability", 0.0,
+       1.0},
       {"CoilCoolingDXVariableSpeed", "Basin Heater Operating", "basinHeaterOperatingSchedule", false, "Availability", 0.0, 1.0},
       {"CoilCoolingLowTempRadiantConstFlow", "Cooling High Water Temperature", "coolingHighWaterTemperatureSchedule", true, "Temperature",
        OptionalDouble(), OptionalDouble()},
@@ -208,6 +214,8 @@ namespace model {
       {"CoilHeatingDXMultiSpeed", "Availability", "availabilitySchedule", false, "Availability", 0.0, 1.0},
       {"CoilHeatingDXSingleSpeed", "Availability", "availabilitySchedule", false, "Availability", 0.0, 1.0},
       {"CoilHeatingDXVariableRefrigerantFlow", "Availability Schedule", "availabilitySchedule", false, "Availability", 0.0, 1.0},
+      {"CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl", "Availability Schedule", "availabilitySchedule", false, "Availability", 0.0,
+       1.0},
       {"CoilHeatingElectric", "Availability", "availabilitySchedule", false, "Availability", 0.0, 1.0},
       {"CoilHeatingElectricMultiStage", "Availability Schedule", "availabilitySchedule", false, "Availability", 0.0, 1.0},
       {"CoilHeatingGas", "Availability", "availabilitySchedule", false, "Availability", 0.0, 1.0},
diff --git a/src/model/ZoneHVACTerminalUnitVariableRefrigerantFlow.cpp b/src/model/ZoneHVACTerminalUnitVariableRefrigerantFlow.cpp
index 437855e4fd1..5ff9e7d37be 100644
--- a/src/model/ZoneHVACTerminalUnitVariableRefrigerantFlow.cpp
+++ b/src/model/ZoneHVACTerminalUnitVariableRefrigerantFlow.cpp
@@ -31,6 +31,7 @@
 #include "Model_Impl.hpp"
 #include "FanOnOff.hpp"
 #include "FanOnOff_Impl.hpp"
+#include "FanSystemModel.hpp"
 #include "CurveCubic.hpp"
 #include "CurveCubic_Impl.hpp"
 #include "ZoneHVACTerminalUnitVariableRefrigerantFlow.hpp"
@@ -41,6 +42,10 @@
 #include "CoilHeatingDXVariableRefrigerantFlow_Impl.hpp"
 #include "CoilCoolingDXVariableRefrigerantFlow.hpp"
 #include "CoilCoolingDXVariableRefrigerantFlow_Impl.hpp"
+#include "CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl.hpp"
+#include "CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl.hpp"
+#include "CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl.hpp"
+#include "CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl.hpp"
 #include "ScheduleTypeLimits.hpp"
 #include "ScheduleTypeRegistry.hpp"
 #include "ThermalZone.hpp"
@@ -49,6 +54,8 @@
 #include "Node_Impl.hpp"
 #include "AirLoopHVAC.hpp"
 #include "AirLoopHVACOutdoorAirSystem.hpp"
+#include "HVACComponent.hpp"
+#include "HVACComponent_Impl.hpp"
 
 #include <utilities/idd/IddFactory.hxx>
 
@@ -229,14 +236,12 @@ namespace model {
       return getObject<ModelObject>().getModelObjectTarget<HVACComponent>(OS_ZoneHVAC_TerminalUnit_VariableRefrigerantFlowFields::SupplyAirFan);
     }
 
-    boost::optional<CoilCoolingDXVariableRefrigerantFlow> ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl::coolingCoil() const {
-      return getObject<ModelObject>().getModelObjectTarget<CoilCoolingDXVariableRefrigerantFlow>(
-        OS_ZoneHVAC_TerminalUnit_VariableRefrigerantFlowFields::CoolingCoil);
+    boost::optional<HVACComponent> ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl::coolingCoil() const {
+      return getObject<ModelObject>().getModelObjectTarget<HVACComponent>(OS_ZoneHVAC_TerminalUnit_VariableRefrigerantFlowFields::CoolingCoil);
     }
 
-    boost::optional<CoilHeatingDXVariableRefrigerantFlow> ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl::heatingCoil() const {
-      return getObject<ModelObject>().getModelObjectTarget<CoilHeatingDXVariableRefrigerantFlow>(
-        OS_ZoneHVAC_TerminalUnit_VariableRefrigerantFlowFields::HeatingCoil);
+    boost::optional<HVACComponent> ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl::heatingCoil() const {
+      return getObject<ModelObject>().getModelObjectTarget<HVACComponent>(OS_ZoneHVAC_TerminalUnit_VariableRefrigerantFlowFields::HeatingCoil);
     }
 
     double ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl::zoneTerminalUnitOnParasiticElectricEnergyUse() const {
@@ -415,6 +420,24 @@ namespace model {
     }
 
     bool ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl::setSupplyAirFan(const HVACComponent& component) {
+      auto fanType = component.iddObjectType();
+      if (isFluidTemperatureControl()) {
+        if ((fanType != IddObjectType::OS_Fan_SystemModel) && (fanType != IddObjectType::OS_Fan_VariableVolume)) {
+          LOG(Warn, "For " << briefDescription()
+                           << ", since it is a FluidTemperatureControl unit, fan type must be FanSystemModel or FanVariableVolume, not "
+                           << component.briefDescription());
+          return false;
+        }
+      } else {
+        if ((fanType != IddObjectType::OS_Fan_SystemModel) && (fanType != IddObjectType::OS_Fan_OnOff)
+            && (fanType != IddObjectType::OS_Fan_ConstantVolume)) {
+          LOG(Warn,
+              "For " << briefDescription()
+                     << ", since it is a non-FluidTemperatureControl unit, fan type must be FanSystemModel, FanOnOff, or FanConstantVolume, not "
+                     << component.briefDescription());
+          return false;
+        }
+      }
       return setPointer(OS_ZoneHVAC_TerminalUnit_VariableRefrigerantFlowFields::SupplyAirFan, component.handle());
     }
 
@@ -423,14 +446,52 @@ namespace model {
       OS_ASSERT(result);
     }
 
-    bool ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl::setCoolingCoil(const CoilCoolingDXVariableRefrigerantFlow& component) {
+    bool ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl::setCoolingCoil(const HVACComponent& component) {
+      if (auto hc_ = heatingCoil()) {
+        if (hc_->iddObjectType() == IddObjectType::OS_Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControl) {
+          if (component.iddObjectType() != IddObjectType::OS_Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControl) {
+            LOG(Warn, "For " << briefDescription() << ", cannot add a Non FluidTemperatureControl coil since existing heating coil does not match.");
+            return false;
+          }
+        } else if (component.iddObjectType() == IddObjectType::OS_Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControl) {
+          LOG(Warn, "For " << briefDescription() << ", cannot add a FluidTemperatureControl coil since existing heating coil does not match.");
+          return false;
+        }
+      }
       return setPointer(OS_ZoneHVAC_TerminalUnit_VariableRefrigerantFlowFields::CoolingCoil, component.handle());
     }
 
-    bool ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl::setHeatingCoil(const CoilHeatingDXVariableRefrigerantFlow& component) {
+    bool ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl::setHeatingCoil(const HVACComponent& component) {
+      if (auto cc_ = coolingCoil()) {
+        if (cc_->iddObjectType() == IddObjectType::OS_Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControl) {
+          if (component.iddObjectType() != IddObjectType::OS_Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControl) {
+            LOG(Warn, "For " << briefDescription() << ", cannot add a Non FluidTemperatureControl coil since existing cooling coil does not match.");
+            return false;
+          }
+        } else if (component.iddObjectType() == IddObjectType::OS_Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControl) {
+          LOG(Warn, "For " << briefDescription() << ", cannot add a FluidTemperatureControl coil since existing cooling coil does not match.");
+          return false;
+        }
+      }
       return setPointer(OS_ZoneHVAC_TerminalUnit_VariableRefrigerantFlowFields::HeatingCoil, component.handle());
     }
 
+    bool ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl::isFluidTemperatureControl() const {
+      bool isFluidCtrl = false;
+      // We enforce matching types in setCoolingCoil / setHeatingCoil, so no need to check both (if we have an issue, it's because the user used
+      // setString/setPointer manually and it's is fault, let's aim for efficiency here)
+      if (auto hc_ = heatingCoil()) {
+        if (hc_->iddObjectType() == IddObjectType::OS_Coil_Heating_DX_VariableRefrigerantFlow_FluidTemperatureControl) {
+          isFluidCtrl = true;
+        }
+      } else if (auto cc_ = coolingCoil()) {
+        if (cc_->iddObjectType() == IddObjectType::OS_Coil_Cooling_DX_VariableRefrigerantFlow_FluidTemperatureControl) {
+          isFluidCtrl = true;
+        }
+      }
+      return isFluidCtrl;
+    }
+
     boost::optional<HVACComponent> ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl::supplementalHeatingCoil() const {
       return getObject<ModelObject>().getModelObjectTarget<HVACComponent>(
         OS_ZoneHVAC_TerminalUnit_VariableRefrigerantFlowFields::SupplementalHeatingCoilName);
@@ -546,12 +607,12 @@ namespace model {
       }
 
       if (auto coil = coolingCoil()) {
-        auto coilClone = coil->clone(model).cast<CoilCoolingDXVariableRefrigerantFlow>();
+        auto coilClone = coil->clone(model).cast<HVACComponent>();
         terminalClone.getImpl<detail::ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl>()->setCoolingCoil(coilClone);
       }
 
       if (auto coil = heatingCoil()) {
-        auto coilClone = coil->clone(model).cast<CoilHeatingDXVariableRefrigerantFlow>();
+        auto coilClone = coil->clone(model).cast<HVACComponent>();
         terminalClone.getImpl<detail::ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl>()->setHeatingCoil(coilClone);
       }
 
@@ -750,7 +811,7 @@ namespace model {
 
   }  // namespace detail
 
-  ZoneHVACTerminalUnitVariableRefrigerantFlow::ZoneHVACTerminalUnitVariableRefrigerantFlow(const Model& model)
+  ZoneHVACTerminalUnitVariableRefrigerantFlow::ZoneHVACTerminalUnitVariableRefrigerantFlow(const Model& model, bool isFluidTemperatureControl)
     : ZoneHVACComponent(ZoneHVACTerminalUnitVariableRefrigerantFlow::iddObjectType(), model) {
     OS_ASSERT(getImpl<detail::ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl>());
 
@@ -784,17 +845,31 @@ namespace model {
 
     setSupplyAirFanPlacement("DrawThrough");
 
-    CoilCoolingDXVariableRefrigerantFlow coolingCoil(model);
-    coolingCoil.setName(name().get() + " Cooling Coil");
-    getImpl<detail::ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl>()->setCoolingCoil(coolingCoil);
+    if (isFluidTemperatureControl) {
+      CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl coolingCoil(model);
+      coolingCoil.setName(name().get() + " Cooling Coil");
+      getImpl<detail::ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl>()->setCoolingCoil(coolingCoil);
+
+      CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl heatingCoil(model);
+      heatingCoil.setName(name().get() + " Heating Coil");
+      getImpl<detail::ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl>()->setHeatingCoil(heatingCoil);
 
-    CoilHeatingDXVariableRefrigerantFlow heatingCoil(model);
-    heatingCoil.setName(name().get() + " Heating Coil");
-    getImpl<detail::ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl>()->setHeatingCoil(heatingCoil);
+      FanSystemModel fan(model);
+      fan.setName(name().get() + " Fan");
+      getImpl<detail::ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl>()->setSupplyAirFan(fan);
+    } else {
+      CoilCoolingDXVariableRefrigerantFlow coolingCoil(model);
+      coolingCoil.setName(name().get() + " Cooling Coil");
+      getImpl<detail::ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl>()->setCoolingCoil(coolingCoil);
 
-    FanOnOff fan(model, alwaysOnSchedule);
-    fan.setName(name().get() + " Fan");
-    getImpl<detail::ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl>()->setSupplyAirFan(fan);
+      CoilHeatingDXVariableRefrigerantFlow heatingCoil(model);
+      heatingCoil.setName(name().get() + " Heating Coil");
+      getImpl<detail::ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl>()->setHeatingCoil(heatingCoil);
+
+      FanOnOff fan(model, alwaysOnSchedule);
+      fan.setName(name().get() + " Fan");
+      getImpl<detail::ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl>()->setSupplyAirFan(fan);
+    }
   }
 
   ZoneHVACTerminalUnitVariableRefrigerantFlow::ZoneHVACTerminalUnitVariableRefrigerantFlow(const Model& model,
@@ -853,6 +928,62 @@ namespace model {
     }
   }
 
+  ZoneHVACTerminalUnitVariableRefrigerantFlow::ZoneHVACTerminalUnitVariableRefrigerantFlow(
+    const Model& model, const CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl& coolingCoil,
+    const CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl& heatingCoil, const HVACComponent& fan)
+    : ZoneHVACComponent(ZoneHVACTerminalUnitVariableRefrigerantFlow::iddObjectType(), model) {
+    OS_ASSERT(getImpl<detail::ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl>());
+
+    Schedule alwaysOnSchedule = model.alwaysOnDiscreteSchedule();
+    setTerminalUnitAvailabilityschedule(alwaysOnSchedule);
+
+    autosizeSupplyAirFlowRateDuringCoolingOperation();
+
+    autosizeSupplyAirFlowRateWhenNoCoolingisNeeded();
+
+    autosizeSupplyAirFlowRateDuringHeatingOperation();
+
+    autosizeSupplyAirFlowRateWhenNoHeatingisNeeded();
+
+    autosizeOutdoorAirFlowRateDuringCoolingOperation();
+
+    autosizeOutdoorAirFlowRateDuringHeatingOperation();
+
+    autosizeOutdoorAirFlowRateWhenNoCoolingorHeatingisNeeded();
+
+    setSupplyAirFanOperatingModeSchedule(alwaysOnSchedule);
+
+    setZoneTerminalUnitOnParasiticElectricEnergyUse(30);
+
+    setZoneTerminalUnitOffParasiticElectricEnergyUse(20);
+
+    setRatedTotalHeatingCapacitySizingRatio(1.0);
+
+    autosizeMaximumSupplyAirTemperaturefromSupplementalHeater();
+    setMaximumOutdoorDryBulbTemperatureforSupplementalHeaterOperation(21.0);
+
+    setSupplyAirFanPlacement("DrawThrough");
+
+    bool ok = setCoolingCoil(coolingCoil);
+    if (!ok) {
+      remove();
+      LOG_AND_THROW("Unable to set " << briefDescription() << "'s Cooling Coil to " << coolingCoil.briefDescription() << ".");
+    }
+    OS_ASSERT(this->coolingCoil());
+
+    ok = setHeatingCoil(heatingCoil);
+    if (!ok) {
+      remove();
+      LOG_AND_THROW("Unable to set " << briefDescription() << "'s Heating Coil to " << fan.briefDescription() << ".");
+    }
+
+    ok = getImpl<detail::ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl>()->setSupplyAirFan(fan);
+    if (!ok) {
+      remove();
+      LOG_AND_THROW("Unable to set " << briefDescription() << "'s Supply Air Fan to " << fan.briefDescription() << ".");
+    }
+  }
+
   IddObjectType ZoneHVACTerminalUnitVariableRefrigerantFlow::iddObjectType() {
     return IddObjectType(IddObjectType::OS_ZoneHVAC_TerminalUnit_VariableRefrigerantFlow);
   }
@@ -934,11 +1065,11 @@ namespace model {
     return fan_.get();
   }
 
-  boost::optional<CoilCoolingDXVariableRefrigerantFlow> ZoneHVACTerminalUnitVariableRefrigerantFlow::coolingCoil() const {
+  boost::optional<HVACComponent> ZoneHVACTerminalUnitVariableRefrigerantFlow::coolingCoil() const {
     return getImpl<detail::ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl>()->coolingCoil();
   }
 
-  boost::optional<CoilHeatingDXVariableRefrigerantFlow> ZoneHVACTerminalUnitVariableRefrigerantFlow::heatingCoil() const {
+  boost::optional<HVACComponent> ZoneHVACTerminalUnitVariableRefrigerantFlow::heatingCoil() const {
     return getImpl<detail::ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl>()->heatingCoil();
   }
 
@@ -1043,14 +1174,18 @@ namespace model {
       ratedTotalHeatingCapacitySizingRatio);
   }
 
-  bool ZoneHVACTerminalUnitVariableRefrigerantFlow::setCoolingCoil(const CoilCoolingDXVariableRefrigerantFlow& coil) {
+  bool ZoneHVACTerminalUnitVariableRefrigerantFlow::setCoolingCoil(const HVACComponent& coil) {
     return getImpl<detail::ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl>()->setCoolingCoil(coil);
   }
 
-  bool ZoneHVACTerminalUnitVariableRefrigerantFlow::setHeatingCoil(const CoilHeatingDXVariableRefrigerantFlow& coil) {
+  bool ZoneHVACTerminalUnitVariableRefrigerantFlow::setHeatingCoil(const HVACComponent& coil) {
     return getImpl<detail::ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl>()->setHeatingCoil(coil);
   }
 
+  bool ZoneHVACTerminalUnitVariableRefrigerantFlow::isFluidTemperatureControl() const {
+    return getImpl<detail::ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl>()->isFluidTemperatureControl();
+  }
+
   boost::optional<HVACComponent> ZoneHVACTerminalUnitVariableRefrigerantFlow::supplementalHeatingCoil() const {
     return getImpl<detail::ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl>()->supplementalHeatingCoil();
   }
diff --git a/src/model/ZoneHVACTerminalUnitVariableRefrigerantFlow.hpp b/src/model/ZoneHVACTerminalUnitVariableRefrigerantFlow.hpp
index 9739da14e32..972d93040e4 100644
--- a/src/model/ZoneHVACTerminalUnitVariableRefrigerantFlow.hpp
+++ b/src/model/ZoneHVACTerminalUnitVariableRefrigerantFlow.hpp
@@ -41,6 +41,8 @@ namespace model {
   class Schedule;
   class CoilHeatingDXVariableRefrigerantFlow;
   class CoilCoolingDXVariableRefrigerantFlow;
+  class CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl;
+  class CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl;
   class ThermalZone;
 
   namespace detail {
@@ -54,11 +56,16 @@ namespace model {
   {
 
    public:
-    explicit ZoneHVACTerminalUnitVariableRefrigerantFlow(const Model& model);
+    explicit ZoneHVACTerminalUnitVariableRefrigerantFlow(const Model& model, bool isFluidTemperatureControl = false);
 
     explicit ZoneHVACTerminalUnitVariableRefrigerantFlow(const Model& model, const CoilCoolingDXVariableRefrigerantFlow& coolingCoil,
                                                          const CoilHeatingDXVariableRefrigerantFlow& heatingCoil, const HVACComponent& fan);
 
+    explicit ZoneHVACTerminalUnitVariableRefrigerantFlow(const Model& model,
+                                                         const CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl& coolingCoil,
+                                                         const CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl& heatingCoil,
+                                                         const HVACComponent& fan);
+
     virtual ~ZoneHVACTerminalUnitVariableRefrigerantFlow() {}
 
     static IddObjectType iddObjectType();
@@ -143,13 +150,18 @@ namespace model {
     // bool setSupplyAirFan(const HVACComponent& fan);
     // void resetSupplyAirFan();
 
-    boost::optional<CoilCoolingDXVariableRefrigerantFlow> coolingCoil() const;
+    boost::optional<HVACComponent> coolingCoil() const;
+
+    // Using a single type of coils is enforced: both must be FluidTemperatureControl or Non-FluidCtrl
+    bool setCoolingCoil(const HVACComponent& coil);
 
-    bool setCoolingCoil(const CoilCoolingDXVariableRefrigerantFlow& coil);
+    boost::optional<HVACComponent> heatingCoil() const;
 
-    boost::optional<CoilHeatingDXVariableRefrigerantFlow> heatingCoil() const;
+    // Using a single type of coils is enforced: both must be FluidTemperatureControl or Non-FluidCtrl
+    bool setHeatingCoil(const HVACComponent& coil);
 
-    bool setHeatingCoil(const CoilHeatingDXVariableRefrigerantFlow& coil);
+    // Returns true if the Cooling and Heating Coils are of the FluidTemperatureControl type
+    bool isFluidTemperatureControl() const;
 
     double zoneTerminalUnitOnParasiticElectricEnergyUse() const;
 
diff --git a/src/model/ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl.hpp b/src/model/ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl.hpp
index c56c3f152d2..1bc0839012d 100644
--- a/src/model/ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl.hpp
+++ b/src/model/ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl.hpp
@@ -39,8 +39,6 @@ namespace model {
 
   class HVACComponent;
   class Schedule;
-  class CoilHeatingDXVariableRefrigerantFlow;
-  class CoilCoolingDXVariableRefrigerantFlow;
   class ThermalZone;
 
   namespace detail {
@@ -128,9 +126,9 @@ namespace model {
 
       boost::optional<HVACComponent> supplyAirFan() const;
 
-      boost::optional<CoilCoolingDXVariableRefrigerantFlow> coolingCoil() const;
+      boost::optional<HVACComponent> coolingCoil() const;
 
-      boost::optional<CoilHeatingDXVariableRefrigerantFlow> heatingCoil() const;
+      boost::optional<HVACComponent> heatingCoil() const;
 
       double zoneTerminalUnitOnParasiticElectricEnergyUse() const;
 
@@ -227,9 +225,12 @@ namespace model {
       bool setSupplyAirFan(const HVACComponent& component);
       void resetSupplyAirFan();
 
-      bool setCoolingCoil(const CoilCoolingDXVariableRefrigerantFlow& component);
+      bool setCoolingCoil(const HVACComponent& component);
 
-      bool setHeatingCoil(const CoilHeatingDXVariableRefrigerantFlow& component);
+      bool setHeatingCoil(const HVACComponent& component);
+
+      // Returns true if the Cooling and Heating Coils are of the FluidTemperatureControl type
+      bool isFluidTemperatureControl() const;
 
       //@}
      protected:
diff --git a/src/utilities/filetypes/RunOptions_Impl.hpp b/src/utilities/filetypes/RunOptions_Impl.hpp
index 586164a7c21..ef6f2a3bf8c 100644
--- a/src/utilities/filetypes/RunOptions_Impl.hpp
+++ b/src/utilities/filetypes/RunOptions_Impl.hpp
@@ -87,7 +87,7 @@ namespace detail {
     void resetCustomOutputAdapter();
 
     ForwardTranslatorOptions forwardTranslatorOptions() const;
-    bool setForwardTranslatorOptions(const ForwardTranslatorOptions& options);
+    bool setForwardTranslatorOptions(const ForwardTranslatorOptions& forwardTranslatorOptions);
     void resetForwardTranslatorOptions();
 
     // Emitted on any change


Test patch:
diff --git a/src/model/test/AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_GTest.cpp b/src/model/test/AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_GTest.cpp
new file mode 100644
index 00000000000..046c5b4abda
--- /dev/null
+++ b/src/model/test/AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_GTest.cpp
@@ -0,0 +1,637 @@
+/***********************************************************************************************************************
+*  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 "../AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR.hpp"
+#include "../AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Impl.hpp"
+#include "../LoadingIndex.hpp"
+#include "../LoadingIndex_Impl.hpp"
+#include "../ModelObjectList.hpp"
+#include "../ModelObjectList_Impl.hpp"
+#include "../ThermalZone.hpp"
+#include "../ZoneHVACTerminalUnitVariableRefrigerantFlow.hpp"
+#include "../ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl.hpp"
+#include "../AirLoopHVAC.hpp"
+#include "../PlantLoop.hpp"
+#include "../Node.hpp"
+#include "../Node_Impl.hpp"
+#include "../AirLoopHVACZoneSplitter.hpp"
+#include "../Schedule.hpp"
+#include "../Schedule_Impl.hpp"
+#include "../ScheduleConstant.hpp"
+#include "../ScheduleConstant_Impl.hpp"
+#include "../Curve.hpp"
+#include "../Curve_Impl.hpp"
+#include "../CurveBiquadratic.hpp"
+#include "../CurveBiquadratic_Impl.hpp"
+#include "../CurveCubic.hpp"
+#include "../CurveCubic_Impl.hpp"
+#include "../CurveQuadratic.hpp"
+#include "../CurveQuadratic_Impl.hpp"
+#include "../CurveExponent.hpp"
+#include "../CurveExponent_Impl.hpp"
+#include "../FanVariableVolume.hpp"
+#include "../FanVariableVolume_Impl.hpp"
+#include "../FanOnOff.hpp"
+#include "../FanSystemModel.hpp"
+#include "../CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl.hpp"
+#include "../CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl.hpp"
+#include "../CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl.hpp"
+#include "../CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl.hpp"
+#include "../CoilCoolingDXVariableRefrigerantFlow.hpp"
+#include "../CoilHeatingDXVariableRefrigerantFlow.hpp"
+
+using namespace openstudio;
+using namespace openstudio::model;
+
+TEST_F(ModelFixture, AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+
+  ASSERT_EXIT(
+    {
+      Model model;
+
+      AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR vrf(model);
+
+      exit(0);
+    },
+    ::testing::ExitedWithCode(0), "");
+
+  Model model;
+
+  AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR vrf(model);
+
+  auto alwaysOn = model.alwaysOnDiscreteSchedule();
+
+  EXPECT_EQ(alwaysOn, vrf.availabilitySchedule());
+  EXPECT_EQ(0u, vrf.terminals().size());
+  EXPECT_EQ("R410a", vrf.refrigerantType());
+  ASSERT_TRUE(vrf.ratedEvaporativeCapacity());
+  EXPECT_EQ(40000, vrf.ratedEvaporativeCapacity().get());
+  EXPECT_FALSE(vrf.isRatedEvaporativeCapacityAutosized());
+  EXPECT_FALSE(vrf.autosizedRatedEvaporativeCapacity());
+  EXPECT_EQ(0.35, vrf.ratedCompressorPowerPerUnitofRatedEvaporativeCapacity());
+  EXPECT_EQ(-6.0, vrf.minimumOutdoorAirTemperatureinCoolingOnlyMode());
+  EXPECT_EQ(43.0, vrf.maximumOutdoorAirTemperatureinCoolingOnlyMode());
+  EXPECT_EQ(-20.0, vrf.minimumOutdoorAirTemperatureinHeatingOnlyMode());
+  EXPECT_EQ(16.0, vrf.maximumOutdoorAirTemperatureinHeatingOnlyMode());
+  EXPECT_EQ(-20.0, vrf.minimumOutdoorTemperatureinHeatRecoveryMode());
+  EXPECT_EQ(43.0, vrf.maximumOutdoorTemperatureinHeatRecoveryMode());
+  EXPECT_EQ("VariableTemp", vrf.refrigerantTemperatureControlAlgorithmforIndoorUnit());
+  EXPECT_EQ(6.0, vrf.referenceEvaporatingTemperatureforIndoorUnit());
+  EXPECT_EQ(44.0, vrf.referenceCondensingTemperatureforIndoorUnit());
+  EXPECT_EQ(4.0, vrf.variableEvaporatingTemperatureMinimumforIndoorUnit());
+  EXPECT_EQ(13.0, vrf.variableEvaporatingTemperatureMaximumforIndoorUnit());
+  EXPECT_EQ(42.0, vrf.variableCondensingTemperatureMinimumforIndoorUnit());
+  EXPECT_EQ(46.0, vrf.variableCondensingTemperatureMaximumforIndoorUnit());
+  EXPECT_EQ(3, vrf.outdoorUnitEvaporatorReferenceSuperheating());
+  EXPECT_EQ(5, vrf.outdoorUnitCondenserReferenceSubcooling());
+  EXPECT_EQ(0.4, vrf.outdoorUnitEvaporatorRatedBypassFactor());
+  EXPECT_EQ(0.2, vrf.outdoorUnitCondenserRatedBypassFactor());
+  EXPECT_EQ(5, vrf.differencebetweenOutdoorUnitEvaporatingTemperatureandOutdoorAirTemperatureinHeatRecoveryMode());
+  EXPECT_EQ(0.3, vrf.outdoorUnitHeatExchangerCapacityRatio());
+  EXPECT_EQ(0.00425, vrf.outdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity());
+  EXPECT_EQ(0.000075, vrf.outdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity());
+  Curve curve1 = vrf.outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve();
+  boost::optional<CurveQuadratic> outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve = curve1.optionalCast<CurveQuadratic>();
+  EXPECT_TRUE(outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve);
+  Curve curve2 = vrf.outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve();
+  boost::optional<CurveQuadratic> outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve = curve2.optionalCast<CurveQuadratic>();
+  EXPECT_TRUE(outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve);
+  EXPECT_EQ(0.0762, vrf.diameterofMainPipeforSuctionGas());
+  EXPECT_EQ(0.0762, vrf.diameterofMainPipeforDischargeGas());
+  EXPECT_EQ(30.0, vrf.lengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint());
+  EXPECT_EQ(36.0, vrf.equivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint());
+  EXPECT_EQ(5.0, vrf.heightDifferenceBetweenOutdoorUnitandIndoorUnits());
+  EXPECT_EQ(0.02, vrf.mainPipeInsulationThickness());
+  EXPECT_EQ(0.032, vrf.mainPipeInsulationThermalConductivity());
+  EXPECT_EQ(33.0, vrf.crankcaseHeaterPowerperCompressor());
+  EXPECT_EQ(2, vrf.numberofCompressors());
+  EXPECT_EQ(0.5, vrf.ratioofCompressorSizetoTotalCompressorCapacity());
+  EXPECT_EQ(5.0, vrf.maximumOutdoorDryBulbTemperatureforCrankcaseHeater());
+  EXPECT_EQ("Resistive", vrf.defrostStrategy());
+  EXPECT_EQ("Timed", vrf.defrostControl());
+  EXPECT_FALSE(vrf.defrostEnergyInputRatioModifierFunctionofTemperatureCurve());
+  EXPECT_EQ(0.058333, vrf.defrostTimePeriodFraction());
+  ASSERT_TRUE(vrf.resistiveDefrostHeaterCapacity());
+  EXPECT_EQ(0.0, vrf.resistiveDefrostHeaterCapacity().get());
+  EXPECT_FALSE(vrf.isResistiveDefrostHeaterCapacityAutosized());
+  EXPECT_FALSE(vrf.autosizedResistiveDefrostHeaterCapacity());
+  EXPECT_EQ(5.0, vrf.maximumOutdoorDrybulbTemperatureforDefrostOperation());
+  EXPECT_EQ(1, vrf.initialHeatRecoveryCoolingCapacityFraction());
+  EXPECT_EQ(0, vrf.heatRecoveryCoolingCapacityTimeConstant());
+  EXPECT_EQ(1, vrf.initialHeatRecoveryCoolingEnergyFraction());
+  EXPECT_EQ(0, vrf.heatRecoveryCoolingEnergyTimeConstant());
+  EXPECT_EQ(1, vrf.initialHeatRecoveryHeatingCapacityFraction());
+  EXPECT_EQ(0, vrf.heatRecoveryHeatingCapacityTimeConstant());
+  EXPECT_EQ(1, vrf.initialHeatRecoveryHeatingEnergyFraction());
+  EXPECT_EQ(0, vrf.heatRecoveryHeatingEnergyTimeConstant());
+  EXPECT_EQ(4500000.0, vrf.compressorMaximumDeltaPressure());
+  EXPECT_EQ(0.95, vrf.compressorInverterEfficiency());
+  EXPECT_EQ(1.0, vrf.compressorEvaporativeCapacityCorrectionFactor());
+}
+
+TEST_F(ModelFixture, AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_SetGetFields) {
+  Model model;
+
+  AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR vrf(model);
+
+  ScheduleConstant scheduleConstant(model);
+  scheduleConstant.setValue(0.5);
+  EXPECT_TRUE(vrf.setAvailabilitySchedule(scheduleConstant));
+  EXPECT_TRUE(vrf.setRefrigerantType("R11"));
+  EXPECT_TRUE(vrf.setRatedEvaporativeCapacity(1));
+  EXPECT_TRUE(vrf.setRatedCompressorPowerPerUnitofRatedEvaporativeCapacity(2));
+  EXPECT_TRUE(vrf.setMinimumOutdoorAirTemperatureinCoolingOnlyMode(3));
+  EXPECT_TRUE(vrf.setMaximumOutdoorAirTemperatureinCoolingOnlyMode(4));
+  EXPECT_TRUE(vrf.setMinimumOutdoorAirTemperatureinHeatingOnlyMode(5));
+  EXPECT_TRUE(vrf.setMaximumOutdoorAirTemperatureinHeatingOnlyMode(6));
+  EXPECT_TRUE(vrf.setMinimumOutdoorTemperatureinHeatRecoveryMode(7));
+  EXPECT_TRUE(vrf.setMaximumOutdoorTemperatureinHeatRecoveryMode(8));
+  EXPECT_TRUE(vrf.setRefrigerantTemperatureControlAlgorithmforIndoorUnit("ConstantTemp"));
+  EXPECT_TRUE(vrf.setReferenceEvaporatingTemperatureforIndoorUnit(9));
+  EXPECT_TRUE(vrf.setReferenceCondensingTemperatureforIndoorUnit(10));
+  EXPECT_TRUE(vrf.setVariableEvaporatingTemperatureMinimumforIndoorUnit(11));
+  EXPECT_TRUE(vrf.setVariableEvaporatingTemperatureMaximumforIndoorUnit(12));
+  EXPECT_TRUE(vrf.setVariableCondensingTemperatureMinimumforIndoorUnit(13));
+  EXPECT_TRUE(vrf.setVariableCondensingTemperatureMaximumforIndoorUnit(14));
+  EXPECT_TRUE(vrf.setOutdoorUnitEvaporatorReferenceSuperheating(15));
+  EXPECT_TRUE(vrf.setOutdoorUnitCondenserReferenceSubcooling(16));
+  EXPECT_TRUE(vrf.setOutdoorUnitEvaporatorRatedBypassFactor(17));
+  EXPECT_TRUE(vrf.setOutdoorUnitCondenserRatedBypassFactor(18));
+  EXPECT_TRUE(vrf.setDifferencebetweenOutdoorUnitEvaporatingTemperatureandOutdoorAirTemperatureinHeatRecoveryMode(19));
+  EXPECT_TRUE(vrf.setOutdoorUnitHeatExchangerCapacityRatio(20));
+  EXPECT_TRUE(vrf.setOutdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity(21));
+  EXPECT_TRUE(vrf.setOutdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity(22));
+  CurveCubic curve1(model);
+  EXPECT_TRUE(vrf.setOutdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve(curve1));
+  CurveCubic curve2(model);
+  EXPECT_TRUE(vrf.setOutdoorUnitCondensingTemperatureFunctionofSubcoolingCurve(curve2));
+  EXPECT_TRUE(vrf.setDiameterofMainPipeforSuctionGas(23));
+  EXPECT_TRUE(vrf.setDiameterofMainPipeforDischargeGas(24));
+  EXPECT_TRUE(vrf.setLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(25));
+  EXPECT_TRUE(vrf.setEquivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(26));
+  EXPECT_TRUE(vrf.setHeightDifferenceBetweenOutdoorUnitandIndoorUnits(27));
+  EXPECT_TRUE(vrf.setMainPipeInsulationThickness(28));
+  EXPECT_TRUE(vrf.setMainPipeInsulationThermalConductivity(29));
+  EXPECT_TRUE(vrf.setCrankcaseHeaterPowerperCompressor(30));
+  EXPECT_TRUE(vrf.setNumberofCompressors(31));
+  EXPECT_TRUE(vrf.setRatioofCompressorSizetoTotalCompressorCapacity(32));
+  EXPECT_TRUE(vrf.setMaximumOutdoorDryBulbTemperatureforCrankcaseHeater(33));
+  EXPECT_TRUE(vrf.setDefrostStrategy("ReverseCycle"));
+  EXPECT_TRUE(vrf.setDefrostControl("OnDemand"));
+  CurveBiquadratic curve3(model);
+  EXPECT_TRUE(vrf.setDefrostEnergyInputRatioModifierFunctionofTemperatureCurve(curve3));
+  EXPECT_TRUE(vrf.setDefrostTimePeriodFraction(34));
+  EXPECT_TRUE(vrf.setResistiveDefrostHeaterCapacity(35));
+  EXPECT_TRUE(vrf.setMaximumOutdoorDrybulbTemperatureforDefrostOperation(36));
+  EXPECT_TRUE(vrf.setInitialHeatRecoveryCoolingCapacityFraction(37));
+  EXPECT_TRUE(vrf.setHeatRecoveryCoolingCapacityTimeConstant(38));
+  EXPECT_TRUE(vrf.setInitialHeatRecoveryCoolingEnergyFraction(39));
+  EXPECT_TRUE(vrf.setHeatRecoveryCoolingEnergyTimeConstant(40));
+  EXPECT_TRUE(vrf.setInitialHeatRecoveryHeatingCapacityFraction(41));
+  EXPECT_TRUE(vrf.setHeatRecoveryHeatingCapacityTimeConstant(42));
+  EXPECT_TRUE(vrf.setInitialHeatRecoveryHeatingEnergyFraction(43));
+  EXPECT_TRUE(vrf.setHeatRecoveryHeatingEnergyTimeConstant(44));
+  EXPECT_TRUE(vrf.setCompressorMaximumDeltaPressure(45));
+  EXPECT_TRUE(vrf.setCompressorInverterEfficiency(0.5));
+  EXPECT_TRUE(vrf.setCompressorEvaporativeCapacityCorrectionFactor(47));
+
+  Schedule schedule = vrf.availabilitySchedule();
+  boost::optional<ScheduleConstant> _scheduleConstant = schedule.optionalCast<ScheduleConstant>();
+  ASSERT_TRUE(_scheduleConstant);
+  EXPECT_EQ((*_scheduleConstant).value(), 0.5);
+  EXPECT_EQ(0u, vrf.terminals().size());
+  EXPECT_EQ("R11", vrf.refrigerantType());
+  ASSERT_TRUE(vrf.ratedEvaporativeCapacity());
+  EXPECT_EQ(1, vrf.ratedEvaporativeCapacity().get());
+  EXPECT_FALSE(vrf.isRatedEvaporativeCapacityAutosized());
+  EXPECT_FALSE(vrf.autosizedRatedEvaporativeCapacity());
+  EXPECT_EQ(2, vrf.ratedCompressorPowerPerUnitofRatedEvaporativeCapacity());
+  EXPECT_EQ(3, vrf.minimumOutdoorAirTemperatureinCoolingOnlyMode());
+  EXPECT_EQ(4, vrf.maximumOutdoorAirTemperatureinCoolingOnlyMode());
+  EXPECT_EQ(5, vrf.minimumOutdoorAirTemperatureinHeatingOnlyMode());
+  EXPECT_EQ(6, vrf.maximumOutdoorAirTemperatureinHeatingOnlyMode());
+  EXPECT_EQ(7, vrf.minimumOutdoorTemperatureinHeatRecoveryMode());
+  EXPECT_EQ(8, vrf.maximumOutdoorTemperatureinHeatRecoveryMode());
+  EXPECT_EQ("ConstantTemp", vrf.refrigerantTemperatureControlAlgorithmforIndoorUnit());
+  EXPECT_EQ(9, vrf.referenceEvaporatingTemperatureforIndoorUnit());
+  EXPECT_EQ(10, vrf.referenceCondensingTemperatureforIndoorUnit());
+  EXPECT_EQ(11, vrf.variableEvaporatingTemperatureMinimumforIndoorUnit());
+  EXPECT_EQ(12, vrf.variableEvaporatingTemperatureMaximumforIndoorUnit());
+  EXPECT_EQ(13, vrf.variableCondensingTemperatureMinimumforIndoorUnit());
+  EXPECT_EQ(14, vrf.variableCondensingTemperatureMaximumforIndoorUnit());
+  EXPECT_EQ(15, vrf.outdoorUnitEvaporatorReferenceSuperheating());
+  EXPECT_EQ(16, vrf.outdoorUnitCondenserReferenceSubcooling());
+  EXPECT_EQ(17, vrf.outdoorUnitEvaporatorRatedBypassFactor());
+  EXPECT_EQ(18, vrf.outdoorUnitCondenserRatedBypassFactor());
+  EXPECT_EQ(19, vrf.differencebetweenOutdoorUnitEvaporatingTemperatureandOutdoorAirTemperatureinHeatRecoveryMode());
+  EXPECT_EQ(20, vrf.outdoorUnitHeatExchangerCapacityRatio());
+  EXPECT_EQ(21, vrf.outdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity());
+  EXPECT_EQ(22, vrf.outdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity());
+  Curve _curve1 = vrf.outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve();
+  boost::optional<CurveCubic> outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve = _curve1.optionalCast<CurveCubic>();
+  EXPECT_TRUE(outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve);
+  Curve _curve2 = vrf.outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve();
+  boost::optional<CurveCubic> outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve = _curve2.optionalCast<CurveCubic>();
+  EXPECT_TRUE(outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve);
+  EXPECT_EQ(23, vrf.diameterofMainPipeforSuctionGas());
+  EXPECT_EQ(24, vrf.diameterofMainPipeforDischargeGas());
+  EXPECT_EQ(25, vrf.lengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint());
+  EXPECT_EQ(26, vrf.equivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint());
+  EXPECT_EQ(27, vrf.heightDifferenceBetweenOutdoorUnitandIndoorUnits());
+  EXPECT_EQ(28, vrf.mainPipeInsulationThickness());
+  EXPECT_EQ(29, vrf.mainPipeInsulationThermalConductivity());
+  EXPECT_EQ(30, vrf.crankcaseHeaterPowerperCompressor());
+  EXPECT_EQ(31, vrf.numberofCompressors());
+  EXPECT_EQ(32, vrf.ratioofCompressorSizetoTotalCompressorCapacity());
+  EXPECT_EQ(33, vrf.maximumOutdoorDryBulbTemperatureforCrankcaseHeater());
+  EXPECT_EQ("ReverseCycle", vrf.defrostStrategy());
+  EXPECT_EQ("OnDemand", vrf.defrostControl());
+  boost::optional<Curve> _curve3 = vrf.defrostEnergyInputRatioModifierFunctionofTemperatureCurve();
+  ASSERT_TRUE(_curve3);
+  boost::optional<CurveBiquadratic> defrostEnergyInputRatioModifierFunctionofTemperatureCurve = _curve3->optionalCast<CurveBiquadratic>();
+  EXPECT_TRUE(defrostEnergyInputRatioModifierFunctionofTemperatureCurve);
+  EXPECT_EQ(34, vrf.defrostTimePeriodFraction());
+  ASSERT_TRUE(vrf.resistiveDefrostHeaterCapacity());
+  EXPECT_EQ(35, vrf.resistiveDefrostHeaterCapacity().get());
+  EXPECT_FALSE(vrf.isResistiveDefrostHeaterCapacityAutosized());
+  EXPECT_FALSE(vrf.autosizedResistiveDefrostHeaterCapacity());
+  EXPECT_EQ(36, vrf.maximumOutdoorDrybulbTemperatureforDefrostOperation());
+  EXPECT_EQ(37, vrf.initialHeatRecoveryCoolingCapacityFraction());
+  EXPECT_EQ(38, vrf.heatRecoveryCoolingCapacityTimeConstant());
+  EXPECT_EQ(39, vrf.initialHeatRecoveryCoolingEnergyFraction());
+  EXPECT_EQ(40, vrf.heatRecoveryCoolingEnergyTimeConstant());
+  EXPECT_EQ(41, vrf.initialHeatRecoveryHeatingCapacityFraction());
+  EXPECT_EQ(42, vrf.heatRecoveryHeatingCapacityTimeConstant());
+  EXPECT_EQ(43, vrf.initialHeatRecoveryHeatingEnergyFraction());
+  EXPECT_EQ(44, vrf.heatRecoveryHeatingEnergyTimeConstant());
+  EXPECT_EQ(45, vrf.compressorMaximumDeltaPressure());
+  EXPECT_EQ(0.5, vrf.compressorInverterEfficiency());
+  EXPECT_EQ(47, vrf.compressorEvaporativeCapacityCorrectionFactor());
+
+  vrf.autosizeRatedEvaporativeCapacity();
+  vrf.resetDefrostEnergyInputRatioModifierFunctionofTemperatureCurve();
+  vrf.autosizeResistiveDefrostHeaterCapacity();
+
+  EXPECT_FALSE(vrf.ratedEvaporativeCapacity());
+  EXPECT_TRUE(vrf.isRatedEvaporativeCapacityAutosized());
+  EXPECT_FALSE(vrf.autosizedRatedEvaporativeCapacity());
+  EXPECT_FALSE(vrf.defrostEnergyInputRatioModifierFunctionofTemperatureCurve());
+  EXPECT_FALSE(vrf.resistiveDefrostHeaterCapacity());
+  EXPECT_TRUE(vrf.isResistiveDefrostHeaterCapacityAutosized());
+  EXPECT_FALSE(vrf.autosizedResistiveDefrostHeaterCapacity());
+}
+
+TEST_F(ModelFixture, AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_LoadingIndexes) {
+  Model model;
+
+  AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR vrf(model);
+
+  EXPECT_EQ(3u, vrf.loadingIndexes().size());
+  vrf.removeAllLoadingIndexes();
+
+  CurveBiquadratic evaporativeCapacityMultiplierFunctionofTemperatureCurve1(model);
+  CurveBiquadratic compressorPowerMultiplierFunctionofTemperatureCurve1(model);
+
+  CurveBiquadratic evaporativeCapacityMultiplierFunctionofTemperatureCurve2(model);
+  CurveBiquadratic compressorPowerMultiplierFunctionofTemperatureCurve2(model);
+
+  CurveBiquadratic evaporativeCapacityMultiplierFunctionofTemperatureCurve3(model);
+  CurveBiquadratic compressorPowerMultiplierFunctionofTemperatureCurve3(model);
+
+  EXPECT_EQ(0u, vrf.loadingIndexes().size());
+  LoadingIndex loadingIndex1(model, 1, evaporativeCapacityMultiplierFunctionofTemperatureCurve1,
+                             compressorPowerMultiplierFunctionofTemperatureCurve1);
+  EXPECT_TRUE(vrf.addLoadingIndex(loadingIndex1));
+  EXPECT_EQ(1u, vrf.loadingIndexes().size());
+  LoadingIndex loadingIndex2(model, 2, evaporativeCapacityMultiplierFunctionofTemperatureCurve2,
+                             compressorPowerMultiplierFunctionofTemperatureCurve2);
+  EXPECT_TRUE(vrf.addLoadingIndex(loadingIndex2));
+  EXPECT_EQ(2u, vrf.loadingIndexes().size());
+  LoadingIndex loadingIndex3(model, 3, evaporativeCapacityMultiplierFunctionofTemperatureCurve3,
+                             compressorPowerMultiplierFunctionofTemperatureCurve3);
+  EXPECT_TRUE(vrf.addLoadingIndex(loadingIndex3));
+  EXPECT_EQ(3u, vrf.loadingIndexes().size());
+
+  std::vector<LoadingIndex> loadingIndexes = vrf.loadingIndexes();
+  EXPECT_EQ(3u, loadingIndexes.size());
+  EXPECT_EQ(1, loadingIndexes[0].compressorSpeed());
+  EXPECT_EQ(evaporativeCapacityMultiplierFunctionofTemperatureCurve1, loadingIndexes[0].evaporativeCapacityMultiplierFunctionofTemperatureCurve());
+  EXPECT_EQ(compressorPowerMultiplierFunctionofTemperatureCurve1, loadingIndexes[0].compressorPowerMultiplierFunctionofTemperatureCurve());
+  EXPECT_EQ(2, loadingIndexes[1].compressorSpeed());
+  EXPECT_EQ(evaporativeCapacityMultiplierFunctionofTemperatureCurve2, loadingIndexes[1].evaporativeCapacityMultiplierFunctionofTemperatureCurve());
+  EXPECT_EQ(compressorPowerMultiplierFunctionofTemperatureCurve2, loadingIndexes[1].compressorPowerMultiplierFunctionofTemperatureCurve());
+  EXPECT_EQ(3, loadingIndexes[2].compressorSpeed());
+  EXPECT_EQ(evaporativeCapacityMultiplierFunctionofTemperatureCurve3, loadingIndexes[2].evaporativeCapacityMultiplierFunctionofTemperatureCurve());
+  EXPECT_EQ(compressorPowerMultiplierFunctionofTemperatureCurve3, loadingIndexes[2].compressorPowerMultiplierFunctionofTemperatureCurve());
+
+  LoadingIndex loadingIndex4(model, 4, evaporativeCapacityMultiplierFunctionofTemperatureCurve1,
+                             compressorPowerMultiplierFunctionofTemperatureCurve2);
+  EXPECT_TRUE(vrf.addLoadingIndex(loadingIndex4));
+  EXPECT_EQ(4u, vrf.loadingIndexes().size());
+
+  vrf.removeLoadingIndex(loadingIndex3);
+  std::vector<LoadingIndex> loadingIndexes2 = vrf.loadingIndexes();
+  EXPECT_EQ(3u, loadingIndexes2.size());
+  EXPECT_EQ(2, loadingIndexes2[1].compressorSpeed());
+  EXPECT_EQ(evaporativeCapacityMultiplierFunctionofTemperatureCurve2, loadingIndexes2[1].evaporativeCapacityMultiplierFunctionofTemperatureCurve());
+  EXPECT_EQ(compressorPowerMultiplierFunctionofTemperatureCurve2, loadingIndexes2[1].compressorPowerMultiplierFunctionofTemperatureCurve());
+  EXPECT_EQ(4, loadingIndexes2[2].compressorSpeed());
+  EXPECT_EQ(evaporativeCapacityMultiplierFunctionofTemperatureCurve1, loadingIndexes2[2].evaporativeCapacityMultiplierFunctionofTemperatureCurve());
+  EXPECT_EQ(compressorPowerMultiplierFunctionofTemperatureCurve2, loadingIndexes2[2].compressorPowerMultiplierFunctionofTemperatureCurve());
+}
+
+TEST_F(ModelFixture, AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Terminals) {
+  Model model;
+
+  AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR vrf(model);
+
+  CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl coolingCoil1(model);
+  CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl heatingCoil1(model);
+  FanVariableVolume fan1(model);
+  ZoneHVACTerminalUnitVariableRefrigerantFlow term1(model, coolingCoil1, heatingCoil1, fan1);
+
+  CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl coolingCoil2(model);
+  CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl heatingCoil2(model);
+  FanVariableVolume fan2(model);
+  ZoneHVACTerminalUnitVariableRefrigerantFlow term2(model, coolingCoil2, heatingCoil2, fan2);
+
+  CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl coolingCoil3(model);
+  CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl heatingCoil3(model);
+  FanVariableVolume fan3(model);
+  ZoneHVACTerminalUnitVariableRefrigerantFlow term3(model, coolingCoil3, heatingCoil3, fan3);
+
+  EXPECT_EQ(0u, vrf.terminals().size());
+
+  EXPECT_TRUE(vrf.addTerminal(term1));
+  EXPECT_TRUE(vrf.addTerminal(term2));
+  EXPECT_TRUE(vrf.addTerminal(term3));
+
+  EXPECT_EQ(3u, vrf.terminals().size());
+
+  vrf.removeTerminal(term2);
+
+  EXPECT_EQ(2u, vrf.terminals().size());
+  EXPECT_EQ(term1, vrf.terminals()[0]);
+  EXPECT_EQ(term3, vrf.terminals()[1]);
+
+  vrf.removeAllTerminals();
+
+  EXPECT_EQ(0u, vrf.terminals().size());
+}
+
+TEST_F(ModelFixture, AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Clone) {
+  Model model;
+
+  EXPECT_EQ(0, model.getModelObjects<Curve>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<CurveQuadratic>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<CurveBiquadratic>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<CurveCubic>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<CurveExponent>().size());
+
+  EXPECT_EQ(0, model.getConcreteModelObjects<AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<ModelObjectList>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<LoadingIndex>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<ZoneHVACTerminalUnitVariableRefrigerantFlow>().size());
+
+  AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR vrf(model);
+  EXPECT_TRUE(vrf.setRefrigerantType("R12"));
+  {
+    EXPECT_EQ(8, model.getModelObjects<Curve>().size());
+    EXPECT_EQ(2, model.getConcreteModelObjects<CurveQuadratic>().size());
+    EXPECT_EQ(6, model.getConcreteModelObjects<CurveBiquadratic>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<CurveCubic>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<CurveExponent>().size());
+
+    EXPECT_EQ(1, model.getConcreteModelObjects<AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR>().size());
+    EXPECT_EQ(2, model.getConcreteModelObjects<ModelObjectList>().size());  // 1 terminals + 1 loading indexes
+    EXPECT_EQ(3, model.getConcreteModelObjects<LoadingIndex>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<ZoneHVACTerminalUnitVariableRefrigerantFlow>().size());
+
+    // VRFTU has no curves, but its Cooling Coil (FluidTempCtrl) and Heating Coil each add a Quadratic, the FanSystemModel adds none
+    ZoneHVACTerminalUnitVariableRefrigerantFlow term1(model, true);
+    EXPECT_TRUE(vrf.addTerminal(term1));
+    EXPECT_EQ(10, model.getModelObjects<Curve>().size());
+    EXPECT_EQ(4, model.getConcreteModelObjects<CurveQuadratic>().size());
+    EXPECT_EQ(6, model.getConcreteModelObjects<CurveBiquadratic>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<CurveCubic>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<CurveExponent>().size());
+
+    EXPECT_EQ(1, model.getConcreteModelObjects<AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR>().size());
+    EXPECT_EQ(2, model.getConcreteModelObjects<ModelObjectList>().size());  // 1 terminals + 1 loading indexes
+    EXPECT_EQ(3, model.getConcreteModelObjects<LoadingIndex>().size());
+    EXPECT_EQ(1, model.getConcreteModelObjects<ZoneHVACTerminalUnitVariableRefrigerantFlow>().size());
+
+    ZoneHVACTerminalUnitVariableRefrigerantFlow term2(model, true);
+    EXPECT_TRUE(vrf.addTerminal(term2));
+    EXPECT_EQ(12, model.getModelObjects<Curve>().size());
+    EXPECT_EQ(6, model.getConcreteModelObjects<CurveQuadratic>().size());
+    EXPECT_EQ(6, model.getConcreteModelObjects<CurveBiquadratic>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<CurveCubic>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<CurveExponent>().size());
+
+    EXPECT_EQ(1, model.getConcreteModelObjects<AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR>().size());
+    EXPECT_EQ(2, model.getConcreteModelObjects<ModelObjectList>().size());  // 1 terminals + 1 loading indexes
+    EXPECT_EQ(3, model.getConcreteModelObjects<LoadingIndex>().size());
+    EXPECT_EQ(2, model.getConcreteModelObjects<ZoneHVACTerminalUnitVariableRefrigerantFlow>().size());
+
+    EXPECT_EQ(2u, vrf.terminals().size());
+    EXPECT_EQ(3u, vrf.loadingIndexes().size());
+  }
+
+  // Cloning the VRF will clone the Loading Indexes, but not the underlying Curves (these are ResourceObjects after all!)
+  // The Terminals aren't cloned
+  auto vrfClone = vrf.clone(model).cast<AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR>();
+  {
+    EXPECT_EQ("R12", vrfClone.refrigerantType());
+    EXPECT_EQ(0, vrfClone.terminals().size());
+    EXPECT_EQ(3, vrfClone.loadingIndexes().size());
+
+    EXPECT_EQ(12, model.getModelObjects<Curve>().size());
+    EXPECT_EQ(6, model.getConcreteModelObjects<CurveQuadratic>().size());
+    EXPECT_EQ(6, model.getConcreteModelObjects<CurveBiquadratic>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<CurveCubic>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<CurveExponent>().size());
+
+    EXPECT_EQ(2, model.getConcreteModelObjects<AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR>().size());
+    EXPECT_EQ(4, model.getConcreteModelObjects<ModelObjectList>().size());  // 1 terminals + 1 loading indexes times 2
+    EXPECT_EQ(6, model.getConcreteModelObjects<LoadingIndex>().size());     // 3 for each AirCondVRF
+    EXPECT_EQ(2, model.getConcreteModelObjects<ZoneHVACTerminalUnitVariableRefrigerantFlow>().size());
+  }
+
+  {
+    Model model2;
+
+    EXPECT_EQ(0, model2.getModelObjects<Curve>().size());
+    EXPECT_EQ(0, model2.getConcreteModelObjects<CurveQuadratic>().size());
+    EXPECT_EQ(0, model2.getConcreteModelObjects<CurveBiquadratic>().size());
+    EXPECT_EQ(0, model2.getConcreteModelObjects<CurveCubic>().size());
+    EXPECT_EQ(0, model2.getConcreteModelObjects<CurveExponent>().size());
+
+    EXPECT_EQ(0, model2.getConcreteModelObjects<AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR>().size());
+    EXPECT_EQ(0, model2.getConcreteModelObjects<ModelObjectList>().size());
+    EXPECT_EQ(0, model2.getConcreteModelObjects<LoadingIndex>().size());  // 3 for each AirCondVRF
+    EXPECT_EQ(0, model2.getConcreteModelObjects<ZoneHVACTerminalUnitVariableRefrigerantFlow>().size());
+
+    auto vrfClone2 = vrf.clone(model2).cast<AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR>();
+    EXPECT_EQ("R12", vrfClone2.refrigerantType());
+    EXPECT_EQ(0, vrfClone2.terminals().size());
+    EXPECT_EQ(3, vrfClone2.loadingIndexes().size());
+
+    EXPECT_EQ(8, model2.getModelObjects<Curve>().size());
+    EXPECT_EQ(2, model2.getConcreteModelObjects<CurveQuadratic>().size());
+    EXPECT_EQ(6, model2.getConcreteModelObjects<CurveBiquadratic>().size());
+    EXPECT_EQ(0, model2.getConcreteModelObjects<CurveCubic>().size());
+    EXPECT_EQ(0, model2.getConcreteModelObjects<CurveExponent>().size());
+
+    EXPECT_EQ(1, model2.getConcreteModelObjects<AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR>().size());
+    EXPECT_EQ(2, model2.getConcreteModelObjects<ModelObjectList>().size());  // 1 terminals + 1 loading indexes
+    EXPECT_EQ(3, model2.getConcreteModelObjects<LoadingIndex>().size());     // 3 for each AirCondVRF
+    EXPECT_EQ(0, model2.getConcreteModelObjects<ZoneHVACTerminalUnitVariableRefrigerantFlow>().size());
+  }
+
+  {
+    // VRF + its terminals are gone, but the cloned one should be left intact (its curves and co are still there)
+    vrf.remove();
+    EXPECT_EQ(8, model.getModelObjects<Curve>().size());
+    EXPECT_EQ(2, model.getConcreteModelObjects<CurveQuadratic>().size());
+    EXPECT_EQ(6, model.getConcreteModelObjects<CurveBiquadratic>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<CurveCubic>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<CurveExponent>().size());
+
+    EXPECT_EQ(1, model.getConcreteModelObjects<AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR>().size());
+    EXPECT_EQ(2, model.getConcreteModelObjects<ModelObjectList>().size());  // 1 terminals + 1 loading indexes
+    EXPECT_EQ(3, model.getConcreteModelObjects<LoadingIndex>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<ZoneHVACTerminalUnitVariableRefrigerantFlow>().size());
+
+    // Curves are no longer used anywhere, so should be removed too
+    vrfClone.remove();
+    EXPECT_EQ(0, model.getModelObjects<Curve>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<CurveQuadratic>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<CurveBiquadratic>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<CurveCubic>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<CurveExponent>().size());
+
+    EXPECT_EQ(0, model.getConcreteModelObjects<AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<ModelObjectList>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<LoadingIndex>().size());  // 3 for each AirCondVRF
+    EXPECT_EQ(0, model.getConcreteModelObjects<ZoneHVACTerminalUnitVariableRefrigerantFlow>().size());
+  }
+}
+
+TEST_F(ModelFixture, AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_Remove) {
+  Model model;
+
+  EXPECT_EQ(0u, model.getConcreteModelObjects<CurveQuadratic>().size());
+  EXPECT_EQ(0u, model.getConcreteModelObjects<CurveBiquadratic>().size());
+  EXPECT_EQ(0u, model.getConcreteModelObjects<ZoneHVACTerminalUnitVariableRefrigerantFlow>().size());
+  EXPECT_EQ(0u, model.getConcreteModelObjects<ModelObjectList>().size());
+
+  auto size = model.modelObjects().size();
+  AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR vrf(model);
+  ZoneHVACTerminalUnitVariableRefrigerantFlow term(model, true);
+  EXPECT_TRUE(vrf.addTerminal(term));
+  EXPECT_EQ(1u, vrf.terminals().size());
+  EXPECT_EQ(3u, vrf.loadingIndexes().size());
+
+  EXPECT_EQ(4u, model.getConcreteModelObjects<CurveQuadratic>().size());    // 2 on vrf + 2 on coils
+  EXPECT_EQ(6u, model.getConcreteModelObjects<CurveBiquadratic>().size());  // 6 on vrf
+  EXPECT_EQ(1u, model.getConcreteModelObjects<ZoneHVACTerminalUnitVariableRefrigerantFlow>().size());
+  EXPECT_EQ(2u, model.getConcreteModelObjects<ModelObjectList>().size());  // 1 terminals + 1 loading indexes
+
+  EXPECT_FALSE(vrf.remove().empty());
+  EXPECT_EQ(0u, model.getConcreteModelObjects<CurveQuadratic>().size());
+  EXPECT_EQ(0u, model.getConcreteModelObjects<CurveBiquadratic>().size());
+  EXPECT_EQ(0u, model.getConcreteModelObjects<ZoneHVACTerminalUnitVariableRefrigerantFlow>().size());
+  EXPECT_EQ(0u, model.getConcreteModelObjects<ModelObjectList>().size());
+  EXPECT_EQ(size + 2, model.modelObjects().size());  // Always On Discrete, OnOff
+}
+
+TEST_F(ModelFixture, AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_addToNode) {
+  Model model;
+
+  AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR vrf(model);
+
+  AirLoopHVAC airLoop(model);
+  Node supplyOutletNode = airLoop.supplyOutletNode();
+  EXPECT_FALSE(vrf.addToNode(supplyOutletNode));
+  EXPECT_EQ((unsigned)2, airLoop.supplyComponents().size());
+
+  Node inletNode = airLoop.zoneSplitter().lastOutletModelObject()->cast<Node>();
+  EXPECT_FALSE(vrf.addToNode(inletNode));
+  EXPECT_EQ((unsigned)5, airLoop.demandComponents().size());
+
+  PlantLoop plantLoop(model);
+  supplyOutletNode = plantLoop.supplyOutletNode();
+  EXPECT_FALSE(vrf.addToNode(supplyOutletNode));
+  EXPECT_EQ((unsigned)5, plantLoop.supplyComponents().size());
+
+  EXPECT_EQ((unsigned)5, plantLoop.demandComponents().size());
+  EXPECT_FALSE(plantLoop.addDemandBranchForComponent(vrf));
+  EXPECT_EQ((unsigned)5, plantLoop.demandComponents().size());
+
+  EXPECT_FALSE(vrf.plantLoop());
+  vrf.disconnect();
+  EXPECT_FALSE(vrf.plantLoop());
+  EXPECT_EQ((unsigned)5, plantLoop.supplyComponents().size());
+}
+
+TEST_F(ModelFixture, AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR_MatchingCoilTypes) {
+
+  Model model;
+  AirConditionerVariableRefrigerantFlowFluidTemperatureControlHR vrf(model);
+
+  {
+    FanSystemModel fan(model);
+    CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl ccFluidCtrl(model);
+    CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl hcFluidCtrl(model);
+
+    ZoneHVACTerminalUnitVariableRefrigerantFlow vrfTerminal(model, ccFluidCtrl, hcFluidCtrl, fan);
+    EXPECT_TRUE(vrfTerminal.isFluidTemperatureControl());
+
+    EXPECT_EQ(0, vrf.terminals().size());
+    EXPECT_TRUE(vrf.addTerminal(vrfTerminal));
+    EXPECT_EQ(1, vrf.terminals().size());
+  }
+
+  {
+    FanSystemModel fan(model);
+    CoilCoolingDXVariableRefrigerantFlow cc(model);
+    CoilHeatingDXVariableRefrigerantFlow hc(model);
+
+    ZoneHVACTerminalUnitVariableRefrigerantFlow vrfTerminal(model, cc, hc, fan);
+    EXPECT_FALSE(vrfTerminal.isFluidTemperatureControl());
+
+    EXPECT_EQ(1, vrf.terminals().size());
+    EXPECT_FALSE(vrf.addTerminal(vrfTerminal));
+    EXPECT_EQ(1, vrf.terminals().size());
+  }
+}
diff --git a/src/model/test/AirConditionerVariableRefrigerantFlowFluidTemperatureControl_GTest.cpp b/src/model/test/AirConditionerVariableRefrigerantFlowFluidTemperatureControl_GTest.cpp
new file mode 100644
index 00000000000..ac07d7ddd67
--- /dev/null
+++ b/src/model/test/AirConditionerVariableRefrigerantFlowFluidTemperatureControl_GTest.cpp
@@ -0,0 +1,589 @@
+/***********************************************************************************************************************
+*  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 "../AirConditionerVariableRefrigerantFlowFluidTemperatureControl.hpp"
+#include "../AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Impl.hpp"
+#include "../LoadingIndex.hpp"
+#include "../LoadingIndex_Impl.hpp"
+#include "../ModelObjectList.hpp"
+#include "../ModelObjectList_Impl.hpp"
+#include "../ThermalZone.hpp"
+#include "../ZoneHVACTerminalUnitVariableRefrigerantFlow.hpp"
+#include "../ZoneHVACTerminalUnitVariableRefrigerantFlow_Impl.hpp"
+#include "../AirLoopHVAC.hpp"
+#include "../PlantLoop.hpp"
+#include "../Node.hpp"
+#include "../Node_Impl.hpp"
+#include "../Curve.hpp"
+#include "../Curve_Impl.hpp"
+#include "../AirLoopHVACZoneSplitter.hpp"
+#include "../Schedule.hpp"
+#include "../Schedule_Impl.hpp"
+#include "../ScheduleConstant.hpp"
+#include "../ScheduleConstant_Impl.hpp"
+#include "../Curve.hpp"
+#include "../Curve_Impl.hpp"
+#include "../CurveBiquadratic.hpp"
+#include "../CurveBiquadratic_Impl.hpp"
+#include "../CurveCubic.hpp"
+#include "../CurveCubic_Impl.hpp"
+#include "../CurveQuadratic.hpp"
+#include "../CurveQuadratic_Impl.hpp"
+#include "../CurveExponent.hpp"
+#include "../CurveExponent_Impl.hpp"
+#include "../FanVariableVolume.hpp"
+#include "../FanVariableVolume_Impl.hpp"
+#include "../FanOnOff.hpp"
+#include "../FanSystemModel.hpp"
+#include "../CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl.hpp"
+#include "../CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl.hpp"
+#include "../CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl.hpp"
+#include "../CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl.hpp"
+#include "../CoilCoolingDXVariableRefrigerantFlow.hpp"
+#include "../CoilHeatingDXVariableRefrigerantFlow.hpp"
+
+using namespace openstudio;
+using namespace openstudio::model;
+
+TEST_F(ModelFixture, AirConditionerVariableRefrigerantFlowFluidTemperatureControl_AirConditionerVariableRefrigerantFlowFluidTemperatureControl) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+
+  ASSERT_EXIT(
+    {
+      Model model;
+
+      AirConditionerVariableRefrigerantFlowFluidTemperatureControl vrf(model);
+
+      exit(0);
+    },
+    ::testing::ExitedWithCode(0), "");
+
+  Model model;
+
+  AirConditionerVariableRefrigerantFlowFluidTemperatureControl vrf(model);
+
+  auto alwaysOn = model.alwaysOnDiscreteSchedule();
+
+  EXPECT_EQ(alwaysOn, vrf.availabilitySchedule());
+  EXPECT_EQ(0u, vrf.terminals().size());
+  EXPECT_EQ("R410a", vrf.refrigerantType());
+  ASSERT_TRUE(vrf.ratedEvaporativeCapacity());
+  EXPECT_EQ(40000, vrf.ratedEvaporativeCapacity().get());
+  EXPECT_FALSE(vrf.isRatedEvaporativeCapacityAutosized());
+  EXPECT_FALSE(vrf.autosizedRatedEvaporativeCapacity());
+  EXPECT_EQ(0.35, vrf.ratedCompressorPowerPerUnitofRatedEvaporativeCapacity());
+  EXPECT_EQ(-6.0, vrf.minimumOutdoorAirTemperatureinCoolingMode());
+  EXPECT_EQ(43.0, vrf.maximumOutdoorAirTemperatureinCoolingMode());
+  EXPECT_EQ(-20.0, vrf.minimumOutdoorAirTemperatureinHeatingMode());
+  EXPECT_EQ(16.0, vrf.maximumOutdoorAirTemperatureinHeatingMode());
+  EXPECT_EQ(3, vrf.referenceOutdoorUnitSuperheating());
+  EXPECT_EQ(5, vrf.referenceOutdoorUnitSubcooling());
+  EXPECT_EQ("VariableTemp", vrf.refrigerantTemperatureControlAlgorithmforIndoorUnit());
+  EXPECT_EQ(6.0, vrf.referenceEvaporatingTemperatureforIndoorUnit());
+  EXPECT_EQ(44.0, vrf.referenceCondensingTemperatureforIndoorUnit());
+  EXPECT_EQ(4.0, vrf.variableEvaporatingTemperatureMinimumforIndoorUnit());
+  EXPECT_EQ(13.0, vrf.variableEvaporatingTemperatureMaximumforIndoorUnit());
+  EXPECT_EQ(42.0, vrf.variableCondensingTemperatureMinimumforIndoorUnit());
+  EXPECT_EQ(46.0, vrf.variableCondensingTemperatureMaximumforIndoorUnit());
+  EXPECT_EQ(0.00425, vrf.outdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity());
+  EXPECT_EQ(0.000075, vrf.outdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity());
+  Curve curve1 = vrf.outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve();
+  boost::optional<CurveQuadratic> outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve = curve1.optionalCast<CurveQuadratic>();
+  EXPECT_TRUE(outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve);
+  Curve curve2 = vrf.outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve();
+  boost::optional<CurveQuadratic> outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve = curve2.optionalCast<CurveQuadratic>();
+  EXPECT_TRUE(outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve);
+  EXPECT_EQ(0.0762, vrf.diameterofMainPipeConnectingOutdoorUnittotheFirstBranchJoint());
+  EXPECT_EQ(30.0, vrf.lengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint());
+  EXPECT_EQ(36.0, vrf.equivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint());
+  EXPECT_EQ(5.0, vrf.heightDifferenceBetweenOutdoorUnitandIndoorUnits());
+  EXPECT_EQ(0.02, vrf.mainPipeInsulationThickness());
+  EXPECT_EQ(0.032, vrf.mainPipeInsulationThermalConductivity());
+  EXPECT_EQ(33.0, vrf.crankcaseHeaterPowerperCompressor());
+  EXPECT_EQ(2, vrf.numberofCompressors());
+  EXPECT_EQ(0.5, vrf.ratioofCompressorSizetoTotalCompressorCapacity());
+  EXPECT_EQ(5.0, vrf.maximumOutdoorDryBulbTemperatureforCrankcaseHeater());
+  EXPECT_EQ("Resistive", vrf.defrostStrategy());
+  EXPECT_EQ("Timed", vrf.defrostControl());
+  EXPECT_FALSE(vrf.defrostEnergyInputRatioModifierFunctionofTemperatureCurve());
+  EXPECT_EQ(0.058333, vrf.defrostTimePeriodFraction());
+  ASSERT_TRUE(vrf.resistiveDefrostHeaterCapacity());
+  EXPECT_EQ(0.0, vrf.resistiveDefrostHeaterCapacity().get());
+  EXPECT_FALSE(vrf.isResistiveDefrostHeaterCapacityAutosized());
+  EXPECT_FALSE(vrf.autosizedResistiveDefrostHeaterCapacity());
+  EXPECT_EQ(5.0, vrf.maximumOutdoorDrybulbTemperatureforDefrostOperation());
+  EXPECT_EQ(4500000.0, vrf.compressorMaximumDeltaPressure());
+}
+
+TEST_F(ModelFixture, AirConditionerVariableRefrigerantFlowFluidTemperatureControl_SetGetFields) {
+  Model model;
+
+  AirConditionerVariableRefrigerantFlowFluidTemperatureControl vrf(model);
+
+  ScheduleConstant scheduleConstant(model);
+  scheduleConstant.setValue(0.5);
+  EXPECT_TRUE(vrf.setAvailabilitySchedule(scheduleConstant));
+  EXPECT_TRUE(vrf.setRefrigerantType("R11"));
+  EXPECT_TRUE(vrf.setRatedEvaporativeCapacity(1));
+  EXPECT_TRUE(vrf.setRatedCompressorPowerPerUnitofRatedEvaporativeCapacity(2));
+  EXPECT_TRUE(vrf.setMinimumOutdoorAirTemperatureinCoolingMode(3));
+  EXPECT_TRUE(vrf.setMaximumOutdoorAirTemperatureinCoolingMode(4));
+  EXPECT_TRUE(vrf.setMinimumOutdoorAirTemperatureinHeatingMode(5));
+  EXPECT_TRUE(vrf.setMaximumOutdoorAirTemperatureinHeatingMode(6));
+  EXPECT_TRUE(vrf.setReferenceOutdoorUnitSuperheating(7));
+  EXPECT_TRUE(vrf.setReferenceOutdoorUnitSubcooling(8));
+  EXPECT_TRUE(vrf.setRefrigerantTemperatureControlAlgorithmforIndoorUnit("ConstantTemp"));
+  EXPECT_TRUE(vrf.setReferenceEvaporatingTemperatureforIndoorUnit(9));
+  EXPECT_TRUE(vrf.setReferenceCondensingTemperatureforIndoorUnit(10));
+  EXPECT_TRUE(vrf.setVariableEvaporatingTemperatureMinimumforIndoorUnit(11));
+  EXPECT_TRUE(vrf.setVariableEvaporatingTemperatureMaximumforIndoorUnit(12));
+  EXPECT_TRUE(vrf.setVariableCondensingTemperatureMinimumforIndoorUnit(13));
+  EXPECT_TRUE(vrf.setVariableCondensingTemperatureMaximumforIndoorUnit(14));
+  EXPECT_TRUE(vrf.setOutdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity(15));
+  EXPECT_TRUE(vrf.setOutdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity(16));
+  CurveCubic curve1(model);
+  EXPECT_TRUE(vrf.setOutdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve(curve1));
+  CurveCubic curve2(model);
+  EXPECT_TRUE(vrf.setOutdoorUnitCondensingTemperatureFunctionofSubcoolingCurve(curve2));
+  EXPECT_TRUE(vrf.setDiameterofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(17));
+  EXPECT_TRUE(vrf.setLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(18));
+  EXPECT_TRUE(vrf.setEquivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint(19));
+  EXPECT_TRUE(vrf.setHeightDifferenceBetweenOutdoorUnitandIndoorUnits(20));
+  EXPECT_TRUE(vrf.setMainPipeInsulationThickness(21));
+  EXPECT_TRUE(vrf.setMainPipeInsulationThermalConductivity(22));
+  EXPECT_TRUE(vrf.setCrankcaseHeaterPowerperCompressor(23));
+  EXPECT_TRUE(vrf.setNumberofCompressors(24));
+  EXPECT_TRUE(vrf.setRatioofCompressorSizetoTotalCompressorCapacity(25));
+  EXPECT_TRUE(vrf.setMaximumOutdoorDryBulbTemperatureforCrankcaseHeater(26));
+  EXPECT_TRUE(vrf.setDefrostStrategy("ReverseCycle"));
+  EXPECT_TRUE(vrf.setDefrostControl("OnDemand"));
+  CurveBiquadratic curve3(model);
+  EXPECT_TRUE(vrf.setDefrostEnergyInputRatioModifierFunctionofTemperatureCurve(curve3));
+  EXPECT_TRUE(vrf.setDefrostTimePeriodFraction(27));
+  EXPECT_TRUE(vrf.setResistiveDefrostHeaterCapacity(28));
+  EXPECT_TRUE(vrf.setMaximumOutdoorDrybulbTemperatureforDefrostOperation(29));
+  EXPECT_TRUE(vrf.setCompressorMaximumDeltaPressure(30));
+
+  Schedule schedule = vrf.availabilitySchedule();
+  boost::optional<ScheduleConstant> _scheduleConstant = schedule.optionalCast<ScheduleConstant>();
+  ASSERT_TRUE(_scheduleConstant);
+  EXPECT_EQ((*_scheduleConstant).value(), 0.5);
+  EXPECT_EQ(0u, vrf.terminals().size());
+  EXPECT_EQ("R11", vrf.refrigerantType());
+  ASSERT_TRUE(vrf.ratedEvaporativeCapacity());
+  EXPECT_EQ(1, vrf.ratedEvaporativeCapacity().get());
+  EXPECT_FALSE(vrf.isRatedEvaporativeCapacityAutosized());
+  EXPECT_FALSE(vrf.autosizedRatedEvaporativeCapacity());
+  EXPECT_EQ(2, vrf.ratedCompressorPowerPerUnitofRatedEvaporativeCapacity());
+  EXPECT_EQ(3, vrf.minimumOutdoorAirTemperatureinCoolingMode());
+  EXPECT_EQ(4, vrf.maximumOutdoorAirTemperatureinCoolingMode());
+  EXPECT_EQ(5, vrf.minimumOutdoorAirTemperatureinHeatingMode());
+  EXPECT_EQ(6, vrf.maximumOutdoorAirTemperatureinHeatingMode());
+  EXPECT_EQ(7, vrf.referenceOutdoorUnitSuperheating());
+  EXPECT_EQ(8, vrf.referenceOutdoorUnitSubcooling());
+  EXPECT_EQ("ConstantTemp", vrf.refrigerantTemperatureControlAlgorithmforIndoorUnit());
+  EXPECT_EQ(9, vrf.referenceEvaporatingTemperatureforIndoorUnit());
+  EXPECT_EQ(10, vrf.referenceCondensingTemperatureforIndoorUnit());
+  EXPECT_EQ(11, vrf.variableEvaporatingTemperatureMinimumforIndoorUnit());
+  EXPECT_EQ(12, vrf.variableEvaporatingTemperatureMaximumforIndoorUnit());
+  EXPECT_EQ(13, vrf.variableCondensingTemperatureMinimumforIndoorUnit());
+  EXPECT_EQ(14, vrf.variableCondensingTemperatureMaximumforIndoorUnit());
+  EXPECT_EQ(15, vrf.outdoorUnitFanPowerPerUnitofRatedEvaporativeCapacity());
+  EXPECT_EQ(16, vrf.outdoorUnitFanFlowRatePerUnitofRatedEvaporativeCapacity());
+  Curve _curve1 = vrf.outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve();
+  boost::optional<CurveCubic> outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve = _curve1.optionalCast<CurveCubic>();
+  EXPECT_TRUE(outdoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve);
+  Curve _curve2 = vrf.outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve();
+  boost::optional<CurveCubic> outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve = _curve2.optionalCast<CurveCubic>();
+  EXPECT_TRUE(outdoorUnitCondensingTemperatureFunctionofSubcoolingCurve);
+  EXPECT_EQ(17, vrf.diameterofMainPipeConnectingOutdoorUnittotheFirstBranchJoint());
+  EXPECT_EQ(18, vrf.lengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint());
+  EXPECT_EQ(19, vrf.equivalentLengthofMainPipeConnectingOutdoorUnittotheFirstBranchJoint());
+  EXPECT_EQ(20, vrf.heightDifferenceBetweenOutdoorUnitandIndoorUnits());
+  EXPECT_EQ(21, vrf.mainPipeInsulationThickness());
+  EXPECT_EQ(22, vrf.mainPipeInsulationThermalConductivity());
+  EXPECT_EQ(23, vrf.crankcaseHeaterPowerperCompressor());
+  EXPECT_EQ(24, vrf.numberofCompressors());
+  EXPECT_EQ(25, vrf.ratioofCompressorSizetoTotalCompressorCapacity());
+  EXPECT_EQ(26, vrf.maximumOutdoorDryBulbTemperatureforCrankcaseHeater());
+  EXPECT_EQ("ReverseCycle", vrf.defrostStrategy());
+  EXPECT_EQ("OnDemand", vrf.defrostControl());
+  boost::optional<Curve> _curve3 = vrf.defrostEnergyInputRatioModifierFunctionofTemperatureCurve();
+  ASSERT_TRUE(_curve3);
+  boost::optional<CurveBiquadratic> defrostEnergyInputRatioModifierFunctionofTemperatureCurve = _curve3->optionalCast<CurveBiquadratic>();
+  EXPECT_TRUE(defrostEnergyInputRatioModifierFunctionofTemperatureCurve);
+  EXPECT_EQ(27, vrf.defrostTimePeriodFraction());
+  ASSERT_TRUE(vrf.resistiveDefrostHeaterCapacity());
+  EXPECT_EQ(28, vrf.resistiveDefrostHeaterCapacity().get());
+  EXPECT_FALSE(vrf.isResistiveDefrostHeaterCapacityAutosized());
+  EXPECT_FALSE(vrf.autosizedResistiveDefrostHeaterCapacity());
+  EXPECT_EQ(29, vrf.maximumOutdoorDrybulbTemperatureforDefrostOperation());
+  EXPECT_EQ(30, vrf.compressorMaximumDeltaPressure());
+
+  vrf.autosizeRatedEvaporativeCapacity();
+  vrf.resetDefrostEnergyInputRatioModifierFunctionofTemperatureCurve();
+  vrf.autosizeResistiveDefrostHeaterCapacity();
+
+  EXPECT_FALSE(vrf.ratedEvaporativeCapacity());
+  EXPECT_TRUE(vrf.isRatedEvaporativeCapacityAutosized());
+  EXPECT_FALSE(vrf.autosizedRatedEvaporativeCapacity());
+  EXPECT_FALSE(vrf.defrostEnergyInputRatioModifierFunctionofTemperatureCurve());
+  EXPECT_FALSE(vrf.resistiveDefrostHeaterCapacity());
+  EXPECT_TRUE(vrf.isResistiveDefrostHeaterCapacityAutosized());
+  EXPECT_FALSE(vrf.autosizedResistiveDefrostHeaterCapacity());
+}
+
+TEST_F(ModelFixture, AirConditionerVariableRefrigerantFlowFluidTemperatureControl_LoadingIndexes) {
+  Model model;
+
+  AirConditionerVariableRefrigerantFlowFluidTemperatureControl vrf(model);
+
+  EXPECT_EQ(3u, vrf.loadingIndexes().size());
+  vrf.removeAllLoadingIndexes();
+
+  CurveBiquadratic evaporativeCapacityMultiplierFunctionofTemperatureCurve1(model);
+  CurveBiquadratic compressorPowerMultiplierFunctionofTemperatureCurve1(model);
+
+  CurveBiquadratic evaporativeCapacityMultiplierFunctionofTemperatureCurve2(model);
+  CurveBiquadratic compressorPowerMultiplierFunctionofTemperatureCurve2(model);
+
+  CurveBiquadratic evaporativeCapacityMultiplierFunctionofTemperatureCurve3(model);
+  CurveBiquadratic compressorPowerMultiplierFunctionofTemperatureCurve3(model);
+
+  EXPECT_EQ(0u, vrf.loadingIndexes().size());
+  LoadingIndex loadingIndex1(model, 1, evaporativeCapacityMultiplierFunctionofTemperatureCurve1,
+                             compressorPowerMultiplierFunctionofTemperatureCurve1);
+  EXPECT_TRUE(vrf.addLoadingIndex(loadingIndex1));
+  EXPECT_EQ(1u, vrf.loadingIndexes().size());
+  LoadingIndex loadingIndex2(model, 2, evaporativeCapacityMultiplierFunctionofTemperatureCurve2,
+                             compressorPowerMultiplierFunctionofTemperatureCurve2);
+  EXPECT_TRUE(vrf.addLoadingIndex(loadingIndex2));
+  EXPECT_EQ(2u, vrf.loadingIndexes().size());
+  LoadingIndex loadingIndex3(model, 3, evaporativeCapacityMultiplierFunctionofTemperatureCurve3,
+                             compressorPowerMultiplierFunctionofTemperatureCurve3);
+  EXPECT_TRUE(vrf.addLoadingIndex(loadingIndex3));
+  EXPECT_EQ(3u, vrf.loadingIndexes().size());
+
+  std::vector<LoadingIndex> loadingIndexes = vrf.loadingIndexes();
+  EXPECT_EQ(3u, loadingIndexes.size());
+  EXPECT_EQ(1, loadingIndexes[0].compressorSpeed());
+  EXPECT_EQ(evaporativeCapacityMultiplierFunctionofTemperatureCurve1, loadingIndexes[0].evaporativeCapacityMultiplierFunctionofTemperatureCurve());
+  EXPECT_EQ(compressorPowerMultiplierFunctionofTemperatureCurve1, loadingIndexes[0].compressorPowerMultiplierFunctionofTemperatureCurve());
+  EXPECT_EQ(2, loadingIndexes[1].compressorSpeed());
+  EXPECT_EQ(evaporativeCapacityMultiplierFunctionofTemperatureCurve2, loadingIndexes[1].evaporativeCapacityMultiplierFunctionofTemperatureCurve());
+  EXPECT_EQ(compressorPowerMultiplierFunctionofTemperatureCurve2, loadingIndexes[1].compressorPowerMultiplierFunctionofTemperatureCurve());
+  EXPECT_EQ(3, loadingIndexes[2].compressorSpeed());
+  EXPECT_EQ(evaporativeCapacityMultiplierFunctionofTemperatureCurve3, loadingIndexes[2].evaporativeCapacityMultiplierFunctionofTemperatureCurve());
+  EXPECT_EQ(compressorPowerMultiplierFunctionofTemperatureCurve3, loadingIndexes[2].compressorPowerMultiplierFunctionofTemperatureCurve());
+
+  LoadingIndex loadingIndex4(model, 4, evaporativeCapacityMultiplierFunctionofTemperatureCurve1,
+                             compressorPowerMultiplierFunctionofTemperatureCurve2);
+  EXPECT_TRUE(vrf.addLoadingIndex(loadingIndex4));
+  EXPECT_EQ(4u, vrf.loadingIndexes().size());
+
+  vrf.removeLoadingIndex(loadingIndex3);
+  std::vector<LoadingIndex> loadingIndexes2 = vrf.loadingIndexes();
+  EXPECT_EQ(3u, loadingIndexes2.size());
+  EXPECT_EQ(2, loadingIndexes2[1].compressorSpeed());
+  EXPECT_EQ(evaporativeCapacityMultiplierFunctionofTemperatureCurve2, loadingIndexes2[1].evaporativeCapacityMultiplierFunctionofTemperatureCurve());
+  EXPECT_EQ(compressorPowerMultiplierFunctionofTemperatureCurve2, loadingIndexes2[1].compressorPowerMultiplierFunctionofTemperatureCurve());
+  EXPECT_EQ(4, loadingIndexes2[2].compressorSpeed());
+  EXPECT_EQ(evaporativeCapacityMultiplierFunctionofTemperatureCurve1, loadingIndexes2[2].evaporativeCapacityMultiplierFunctionofTemperatureCurve());
+  EXPECT_EQ(compressorPowerMultiplierFunctionofTemperatureCurve2, loadingIndexes2[2].compressorPowerMultiplierFunctionofTemperatureCurve());
+}
+
+TEST_F(ModelFixture, AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Terminals) {
+  Model model;
+
+  AirConditionerVariableRefrigerantFlowFluidTemperatureControl vrf(model);
+
+  CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl coolingCoil1(model);
+  CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl heatingCoil1(model);
+  FanVariableVolume fan1(model);
+  ZoneHVACTerminalUnitVariableRefrigerantFlow term1(model, coolingCoil1, heatingCoil1, fan1);
+
+  CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl coolingCoil2(model);
+  CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl heatingCoil2(model);
+  FanVariableVolume fan2(model);
+  ZoneHVACTerminalUnitVariableRefrigerantFlow term2(model, coolingCoil2, heatingCoil2, fan2);
+
+  CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl coolingCoil3(model);
+  CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl heatingCoil3(model);
+  FanVariableVolume fan3(model);
+  ZoneHVACTerminalUnitVariableRefrigerantFlow term3(model, coolingCoil3, heatingCoil3, fan3);
+
+  EXPECT_EQ(0u, vrf.terminals().size());
+
+  EXPECT_TRUE(vrf.addTerminal(term1));
+  EXPECT_TRUE(vrf.addTerminal(term2));
+  EXPECT_TRUE(vrf.addTerminal(term3));
+
+  EXPECT_EQ(3u, vrf.terminals().size());
+
+  vrf.removeTerminal(term2);
+
+  EXPECT_EQ(2u, vrf.terminals().size());
+  EXPECT_EQ(term1, vrf.terminals()[0]);
+  EXPECT_EQ(term3, vrf.terminals()[1]);
+
+  vrf.removeAllTerminals();
+
+  EXPECT_EQ(0u, vrf.terminals().size());
+}
+
+TEST_F(ModelFixture, AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Clone) {
+  Model model;
+
+  EXPECT_EQ(0, model.getModelObjects<Curve>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<CurveQuadratic>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<CurveBiquadratic>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<CurveCubic>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<CurveExponent>().size());
+
+  EXPECT_EQ(0, model.getConcreteModelObjects<AirConditionerVariableRefrigerantFlowFluidTemperatureControl>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<ModelObjectList>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<LoadingIndex>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<ZoneHVACTerminalUnitVariableRefrigerantFlow>().size());
+
+  AirConditionerVariableRefrigerantFlowFluidTemperatureControl vrf(model);
+  {
+    EXPECT_EQ(8, model.getModelObjects<Curve>().size());
+    EXPECT_EQ(2, model.getConcreteModelObjects<CurveQuadratic>().size());
+    EXPECT_EQ(6, model.getConcreteModelObjects<CurveBiquadratic>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<CurveCubic>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<CurveExponent>().size());
+
+    EXPECT_EQ(1, model.getConcreteModelObjects<AirConditionerVariableRefrigerantFlowFluidTemperatureControl>().size());
+    EXPECT_EQ(2, model.getConcreteModelObjects<ModelObjectList>().size());  // 1 terminals + 1 loading indexes
+    EXPECT_EQ(3, model.getConcreteModelObjects<LoadingIndex>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<ZoneHVACTerminalUnitVariableRefrigerantFlow>().size());
+
+    EXPECT_TRUE(vrf.setRefrigerantType("R12"));
+
+    // VRFTU has no curves, but its Cooling Coil (FluidCtrl) and Heating Coil each add a Quadratic, the FanSystemModel adds none
+    ZoneHVACTerminalUnitVariableRefrigerantFlow term1(model, true);
+    EXPECT_TRUE(vrf.addTerminal(term1));
+    EXPECT_EQ(10, model.getModelObjects<Curve>().size());
+    EXPECT_EQ(4, model.getConcreteModelObjects<CurveQuadratic>().size());
+    EXPECT_EQ(6, model.getConcreteModelObjects<CurveBiquadratic>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<CurveCubic>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<CurveExponent>().size());
+
+    EXPECT_EQ(1, model.getConcreteModelObjects<AirConditionerVariableRefrigerantFlowFluidTemperatureControl>().size());
+    EXPECT_EQ(2, model.getConcreteModelObjects<ModelObjectList>().size());  // 1 terminals + 1 loading indexes
+    EXPECT_EQ(3, model.getConcreteModelObjects<LoadingIndex>().size());
+    EXPECT_EQ(1, model.getConcreteModelObjects<ZoneHVACTerminalUnitVariableRefrigerantFlow>().size());
+
+    ZoneHVACTerminalUnitVariableRefrigerantFlow term2(model, true);
+    EXPECT_TRUE(vrf.addTerminal(term2));
+    EXPECT_EQ(12, model.getModelObjects<Curve>().size());
+    EXPECT_EQ(6, model.getConcreteModelObjects<CurveQuadratic>().size());
+    EXPECT_EQ(6, model.getConcreteModelObjects<CurveBiquadratic>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<CurveCubic>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<CurveExponent>().size());
+
+    EXPECT_EQ(1, model.getConcreteModelObjects<AirConditionerVariableRefrigerantFlowFluidTemperatureControl>().size());
+    EXPECT_EQ(2, model.getConcreteModelObjects<ModelObjectList>().size());  // 1 terminals + 1 loading indexes
+    EXPECT_EQ(3, model.getConcreteModelObjects<LoadingIndex>().size());
+    EXPECT_EQ(2, model.getConcreteModelObjects<ZoneHVACTerminalUnitVariableRefrigerantFlow>().size());
+
+    EXPECT_EQ(2, vrf.terminals().size());
+    EXPECT_EQ(3, vrf.loadingIndexes().size());
+  }
+
+  // Cloning the VRF will clone the Loading Indexes, but not the underlying Curves (these are ResourceObjects after all!)
+  // The Terminals aren't cloned
+  auto vrfClone = vrf.clone(model).cast<AirConditionerVariableRefrigerantFlowFluidTemperatureControl>();
+  {
+    EXPECT_EQ("R12", vrfClone.refrigerantType());
+    EXPECT_EQ(0, vrfClone.terminals().size());
+    EXPECT_EQ(3, vrfClone.loadingIndexes().size());
+
+    EXPECT_EQ(12, model.getModelObjects<Curve>().size());
+    EXPECT_EQ(6, model.getConcreteModelObjects<CurveQuadratic>().size());
+    EXPECT_EQ(6, model.getConcreteModelObjects<CurveBiquadratic>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<CurveCubic>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<CurveExponent>().size());
+
+    EXPECT_EQ(2, model.getConcreteModelObjects<AirConditionerVariableRefrigerantFlowFluidTemperatureControl>().size());
+    EXPECT_EQ(4, model.getConcreteModelObjects<ModelObjectList>().size());  // 1 terminals + 1 loading indexes times 2
+    EXPECT_EQ(6, model.getConcreteModelObjects<LoadingIndex>().size());     // 3 for each AirCondVRF
+    EXPECT_EQ(2, model.getConcreteModelObjects<ZoneHVACTerminalUnitVariableRefrigerantFlow>().size());
+  }
+
+  {
+    Model model2;
+
+    EXPECT_EQ(0, model2.getModelObjects<Curve>().size());
+    EXPECT_EQ(0, model2.getConcreteModelObjects<CurveQuadratic>().size());
+    EXPECT_EQ(0, model2.getConcreteModelObjects<CurveBiquadratic>().size());
+    EXPECT_EQ(0, model2.getConcreteModelObjects<CurveCubic>().size());
+    EXPECT_EQ(0, model2.getConcreteModelObjects<CurveExponent>().size());
+
+    EXPECT_EQ(0, model2.getConcreteModelObjects<AirConditionerVariableRefrigerantFlowFluidTemperatureControl>().size());
+    EXPECT_EQ(0, model2.getConcreteModelObjects<ModelObjectList>().size());
+    EXPECT_EQ(0, model2.getConcreteModelObjects<LoadingIndex>().size());  // 3 for each AirCondVRF
+    EXPECT_EQ(0, model2.getConcreteModelObjects<ZoneHVACTerminalUnitVariableRefrigerantFlow>().size());
+
+    auto vrfClone2 = vrf.clone(model2).cast<AirConditionerVariableRefrigerantFlowFluidTemperatureControl>();
+    EXPECT_EQ("R12", vrfClone2.refrigerantType());
+    EXPECT_EQ(0, vrfClone2.terminals().size());
+    EXPECT_EQ(3, vrfClone2.loadingIndexes().size());
+
+    EXPECT_EQ(8, model2.getModelObjects<Curve>().size());
+    EXPECT_EQ(2, model2.getConcreteModelObjects<CurveQuadratic>().size());
+    EXPECT_EQ(6, model2.getConcreteModelObjects<CurveBiquadratic>().size());
+    EXPECT_EQ(0, model2.getConcreteModelObjects<CurveCubic>().size());
+    EXPECT_EQ(0, model2.getConcreteModelObjects<CurveExponent>().size());
+
+    EXPECT_EQ(1, model2.getConcreteModelObjects<AirConditionerVariableRefrigerantFlowFluidTemperatureControl>().size());
+    EXPECT_EQ(2, model2.getConcreteModelObjects<ModelObjectList>().size());  // 1 terminals + 1 loading indexes
+    EXPECT_EQ(3, model2.getConcreteModelObjects<LoadingIndex>().size());     // 3 for each AirCondVRF
+    EXPECT_EQ(0, model2.getConcreteModelObjects<ZoneHVACTerminalUnitVariableRefrigerantFlow>().size());
+  }
+
+  {
+    // VRF + its terminals are gone, but the cloned one should be left intact (its curves and co are still there)
+    vrf.remove();
+    EXPECT_EQ(8, model.getModelObjects<Curve>().size());
+    EXPECT_EQ(2, model.getConcreteModelObjects<CurveQuadratic>().size());
+    EXPECT_EQ(6, model.getConcreteModelObjects<CurveBiquadratic>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<CurveCubic>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<CurveExponent>().size());
+
+    EXPECT_EQ(1, model.getConcreteModelObjects<AirConditionerVariableRefrigerantFlowFluidTemperatureControl>().size());
+    EXPECT_EQ(2, model.getConcreteModelObjects<ModelObjectList>().size());  // 1 terminals + 1 loading indexes
+    EXPECT_EQ(3, model.getConcreteModelObjects<LoadingIndex>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<ZoneHVACTerminalUnitVariableRefrigerantFlow>().size());
+
+    // Curves are no longer used anywhere, so should be removed too
+    vrfClone.remove();
+    EXPECT_EQ(0, model.getModelObjects<Curve>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<CurveQuadratic>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<CurveBiquadratic>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<CurveCubic>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<CurveExponent>().size());
+
+    EXPECT_EQ(0, model.getConcreteModelObjects<AirConditionerVariableRefrigerantFlowFluidTemperatureControl>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<ModelObjectList>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<LoadingIndex>().size());  // 3 for each AirCondVRF
+    EXPECT_EQ(0, model.getConcreteModelObjects<ZoneHVACTerminalUnitVariableRefrigerantFlow>().size());
+  }
+}
+
+TEST_F(ModelFixture, AirConditionerVariableRefrigerantFlowFluidTemperatureControl_Remove) {
+  Model model;
+
+  EXPECT_EQ(0, model.getConcreteModelObjects<CurveQuadratic>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<CurveBiquadratic>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<ZoneHVACTerminalUnitVariableRefrigerantFlow>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<ModelObjectList>().size());
+
+  auto size = model.modelObjects().size();
+  AirConditionerVariableRefrigerantFlowFluidTemperatureControl vrf(model);
+  ZoneHVACTerminalUnitVariableRefrigerantFlow term(model, true);
+  EXPECT_TRUE(vrf.addTerminal(term));
+  EXPECT_EQ(1, vrf.terminals().size());
+  EXPECT_EQ(3, vrf.loadingIndexes().size());
+
+  EXPECT_EQ(4, model.getConcreteModelObjects<CurveQuadratic>().size());    // 2 on vrf + 2 on coils
+  EXPECT_EQ(6, model.getConcreteModelObjects<CurveBiquadratic>().size());  // 6 on vrf
+  EXPECT_EQ(1, model.getConcreteModelObjects<ZoneHVACTerminalUnitVariableRefrigerantFlow>().size());
+  EXPECT_EQ(2, model.getConcreteModelObjects<ModelObjectList>().size());  // 1 terminals + 1 loading indexes
+
+  EXPECT_FALSE(vrf.remove().empty());
+  EXPECT_EQ(0, model.getConcreteModelObjects<CurveQuadratic>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<CurveBiquadratic>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<ZoneHVACTerminalUnitVariableRefrigerantFlow>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<ModelObjectList>().size());
+  EXPECT_EQ(size + 2, model.modelObjects().size());  // Always On Discrete, OnOff
+}
+
+TEST_F(ModelFixture, AirConditionerVariableRefrigerantFlowFluidTemperatureControl_addToNode) {
+  Model model;
+
+  AirConditionerVariableRefrigerantFlowFluidTemperatureControl vrf(model);
+
+  AirLoopHVAC airLoop(model);
+  Node supplyOutletNode = airLoop.supplyOutletNode();
+  EXPECT_FALSE(vrf.addToNode(supplyOutletNode));
+  EXPECT_EQ((unsigned)2, airLoop.supplyComponents().size());
+
+  Node inletNode = airLoop.zoneSplitter().lastOutletModelObject()->cast<Node>();
+  EXPECT_FALSE(vrf.addToNode(inletNode));
+  EXPECT_EQ((unsigned)5, airLoop.demandComponents().size());
+
+  PlantLoop plantLoop(model);
+  supplyOutletNode = plantLoop.supplyOutletNode();
+  EXPECT_FALSE(vrf.addToNode(supplyOutletNode));
+  EXPECT_EQ((unsigned)5, plantLoop.supplyComponents().size());
+
+  EXPECT_EQ((unsigned)5, plantLoop.demandComponents().size());
+  EXPECT_FALSE(plantLoop.addDemandBranchForComponent(vrf));
+  EXPECT_EQ((unsigned)5, plantLoop.demandComponents().size());
+
+  EXPECT_FALSE(vrf.plantLoop());
+  vrf.disconnect();
+  EXPECT_FALSE(vrf.plantLoop());
+  EXPECT_EQ((unsigned)5, plantLoop.supplyComponents().size());
+}
+
+TEST_F(ModelFixture, AirConditionerVariableRefrigerantFlowFluidTemperatureControl_MatchingCoilTypes) {
+
+  Model model;
+  AirConditionerVariableRefrigerantFlowFluidTemperatureControl vrf(model);
+
+  {
+    FanSystemModel fan(model);
+    CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl ccFluidCtrl(model);
+    CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl hcFluidCtrl(model);
+
+    ZoneHVACTerminalUnitVariableRefrigerantFlow vrfTerminal(model, ccFluidCtrl, hcFluidCtrl, fan);
+    EXPECT_TRUE(vrfTerminal.isFluidTemperatureControl());
+
+    EXPECT_EQ(0, vrf.terminals().size());
+    EXPECT_TRUE(vrf.addTerminal(vrfTerminal));
+    EXPECT_EQ(1, vrf.terminals().size());
+  }
+
+  {
+    FanSystemModel fan(model);
+    CoilCoolingDXVariableRefrigerantFlow cc(model);
+    CoilHeatingDXVariableRefrigerantFlow hc(model);
+
+    ZoneHVACTerminalUnitVariableRefrigerantFlow vrfTerminal(model, cc, hc, fan);
+    EXPECT_FALSE(vrfTerminal.isFluidTemperatureControl());
+
+    EXPECT_EQ(1, vrf.terminals().size());
+    EXPECT_FALSE(vrf.addTerminal(vrfTerminal));
+    EXPECT_EQ(1, vrf.terminals().size());
+  }
+}
diff --git a/src/model/test/AirConditionerVariableRefrigerantFlow_GTest.cpp b/src/model/test/AirConditionerVariableRefrigerantFlow_GTest.cpp
index c9c97644b51..f515aa0d460 100644
--- a/src/model/test/AirConditionerVariableRefrigerantFlow_GTest.cpp
+++ b/src/model/test/AirConditionerVariableRefrigerantFlow_GTest.cpp
@@ -38,9 +38,25 @@
 #include "../PlantLoop.hpp"
 #include "../Node.hpp"
 #include "../Node_Impl.hpp"
+#include "../AirLoopHVACZoneSplitter.hpp"
 #include "../Curve.hpp"
 #include "../Curve_Impl.hpp"
-#include "../AirLoopHVACZoneSplitter.hpp"
+#include "../CurveBiquadratic.hpp"
+#include "../CurveBiquadratic_Impl.hpp"
+#include "../CurveCubic.hpp"
+#include "../CurveCubic_Impl.hpp"
+#include "../CurveQuadratic.hpp"
+#include "../CurveQuadratic_Impl.hpp"
+#include "../CurveExponent.hpp"
+#include "../CurveExponent_Impl.hpp"
+#include "../ModelObjectList.hpp"
+#include "../ModelObjectList_Impl.hpp"
+#include "../FanOnOff.hpp"
+#include "../FanSystemModel.hpp"
+#include "../CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl.hpp"
+#include "../CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl.hpp"
+#include "../CoilCoolingDXVariableRefrigerantFlow.hpp"
+#include "../CoilHeatingDXVariableRefrigerantFlow.hpp"
 
 using namespace openstudio;
 using namespace openstudio::model;
@@ -180,3 +196,213 @@ TEST_F(ModelFixture, AirConditionerVariableRefrigerantFlow_addToNode) {
   EXPECT_TRUE(vrf.isCondenserTypeDefaulted());
   EXPECT_EQ("AirCooled", vrf.condenserType());
 }
+
+TEST_F(ModelFixture, AirConditionerVariableRefrigerantFlow_Clone) {
+  Model model;
+
+  EXPECT_EQ(0, model.getModelObjects<Curve>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<CurveQuadratic>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<CurveBiquadratic>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<CurveCubic>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<CurveExponent>().size());
+
+  EXPECT_EQ(0, model.getConcreteModelObjects<AirConditionerVariableRefrigerantFlow>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<ZoneHVACTerminalUnitVariableRefrigerantFlow>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<ModelObjectList>().size());
+
+  AirConditionerVariableRefrigerantFlow vrf(model);
+  {
+
+    EXPECT_EQ(20, model.getModelObjects<Curve>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<CurveQuadratic>().size());
+    EXPECT_EQ(9, model.getConcreteModelObjects<CurveBiquadratic>().size());
+    EXPECT_EQ(11, model.getConcreteModelObjects<CurveCubic>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<CurveExponent>().size());
+
+    EXPECT_EQ(1, model.getConcreteModelObjects<AirConditionerVariableRefrigerantFlow>().size());
+    EXPECT_EQ(1, model.getConcreteModelObjects<ModelObjectList>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<ZoneHVACTerminalUnitVariableRefrigerantFlow>().size());
+
+    // VRFTU has no curves, but its Cooling Coil and Heating Coil each add a Quadratic and a Biquadratic, the FanOnOff add a Cubic and one Exponent
+    ZoneHVACTerminalUnitVariableRefrigerantFlow term1(model);
+    vrf.addTerminal(term1);
+    EXPECT_EQ(26, model.getModelObjects<Curve>().size());
+    EXPECT_EQ(2, model.getConcreteModelObjects<CurveQuadratic>().size());
+    EXPECT_EQ(11, model.getConcreteModelObjects<CurveBiquadratic>().size());
+    EXPECT_EQ(12, model.getConcreteModelObjects<CurveCubic>().size());
+    EXPECT_EQ(1, model.getConcreteModelObjects<CurveExponent>().size());
+
+    EXPECT_EQ(1, model.getConcreteModelObjects<AirConditionerVariableRefrigerantFlow>().size());
+    EXPECT_EQ(1, model.getConcreteModelObjects<ModelObjectList>().size());
+    EXPECT_EQ(1, model.getConcreteModelObjects<ZoneHVACTerminalUnitVariableRefrigerantFlow>().size());
+
+    ZoneHVACTerminalUnitVariableRefrigerantFlow term2(model);
+    vrf.addTerminal(term2);
+    EXPECT_EQ(32, model.getModelObjects<Curve>().size());
+    EXPECT_EQ(4, model.getConcreteModelObjects<CurveQuadratic>().size());
+    EXPECT_EQ(13, model.getConcreteModelObjects<CurveBiquadratic>().size());
+    EXPECT_EQ(13, model.getConcreteModelObjects<CurveCubic>().size());
+    EXPECT_EQ(2, model.getConcreteModelObjects<CurveExponent>().size());
+
+    EXPECT_EQ(1, model.getConcreteModelObjects<AirConditionerVariableRefrigerantFlow>().size());
+    EXPECT_EQ(1, model.getConcreteModelObjects<ModelObjectList>().size());  // 1 terminals
+    EXPECT_EQ(2, model.getConcreteModelObjects<ZoneHVACTerminalUnitVariableRefrigerantFlow>().size());
+
+    EXPECT_EQ(2, vrf.terminals().size());
+  }
+
+  // Cloning the VRF will clone the Loading Indexes, but not the underlying Curves (these are ResourceObjects after all!)
+  // The Terminals aren't cloned
+  auto vrfClone = vrf.clone(model).cast<AirConditionerVariableRefrigerantFlow>();
+  {
+    EXPECT_EQ(0, vrfClone.terminals().size());
+
+    EXPECT_EQ(32, model.getModelObjects<Curve>().size());  // TODO: this is amazing, but this throws not only with 32 + 20 = 51, but 52! the
+                                                           // VRFCPLFFPLR is cloned **TWICE**
+    EXPECT_EQ(4, model.getConcreteModelObjects<CurveQuadratic>().size());
+    EXPECT_EQ(13, model.getConcreteModelObjects<CurveBiquadratic>().size());
+    EXPECT_EQ(13, model.getConcreteModelObjects<CurveCubic>().size());
+    EXPECT_EQ(2, model.getConcreteModelObjects<CurveExponent>().size());
+
+    EXPECT_EQ(2, model.getConcreteModelObjects<AirConditionerVariableRefrigerantFlow>().size());
+    EXPECT_EQ(2, model.getConcreteModelObjects<ModelObjectList>().size());  // 1 terminals times 2
+    EXPECT_EQ(2, model.getConcreteModelObjects<ZoneHVACTerminalUnitVariableRefrigerantFlow>().size());
+  }
+
+  {
+    Model model2;
+
+    EXPECT_EQ(0, model2.getModelObjects<Curve>().size());
+    EXPECT_EQ(0, model2.getConcreteModelObjects<CurveQuadratic>().size());
+    EXPECT_EQ(0, model2.getConcreteModelObjects<CurveBiquadratic>().size());
+    EXPECT_EQ(0, model2.getConcreteModelObjects<CurveCubic>().size());
+    EXPECT_EQ(0, model2.getConcreteModelObjects<CurveExponent>().size());
+
+    EXPECT_EQ(0, model2.getConcreteModelObjects<AirConditionerVariableRefrigerantFlow>().size());
+    EXPECT_EQ(0, model2.getConcreteModelObjects<ModelObjectList>().size());
+    EXPECT_EQ(0, model2.getConcreteModelObjects<ZoneHVACTerminalUnitVariableRefrigerantFlow>().size());
+
+    auto vrfClone2 = vrf.clone(model2).cast<AirConditionerVariableRefrigerantFlow>();
+    EXPECT_EQ(0, vrfClone2.terminals().size());
+
+    EXPECT_EQ(20, model2.getModelObjects<Curve>().size());
+    EXPECT_EQ(0, model2.getConcreteModelObjects<CurveQuadratic>().size());
+    EXPECT_EQ(9, model2.getConcreteModelObjects<CurveBiquadratic>().size());
+    EXPECT_EQ(11, model2.getConcreteModelObjects<CurveCubic>().size());
+    EXPECT_EQ(0, model2.getConcreteModelObjects<CurveExponent>().size());
+
+    EXPECT_EQ(1, model2.getConcreteModelObjects<AirConditionerVariableRefrigerantFlow>().size());
+    EXPECT_EQ(1, model2.getConcreteModelObjects<ModelObjectList>().size());
+    EXPECT_EQ(0, model2.getConcreteModelObjects<ZoneHVACTerminalUnitVariableRefrigerantFlow>().size());
+  }
+
+  {
+    // VRF + its terminals are gone, but the cloned one should be left intact (its curves and co are still there)
+    vrf.remove();
+    EXPECT_EQ(20, model.getModelObjects<Curve>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<CurveQuadratic>().size());
+    EXPECT_EQ(9, model.getConcreteModelObjects<CurveBiquadratic>().size());
+    EXPECT_EQ(11, model.getConcreteModelObjects<CurveCubic>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<CurveExponent>().size());
+
+    EXPECT_EQ(1, model.getConcreteModelObjects<AirConditionerVariableRefrigerantFlow>().size());
+    EXPECT_EQ(1, model.getConcreteModelObjects<ModelObjectList>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<ZoneHVACTerminalUnitVariableRefrigerantFlow>().size());
+
+    // Curves are no longer used anywhere, so should be removed too
+    vrfClone.remove();
+    EXPECT_EQ(0, model.getModelObjects<Curve>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<CurveQuadratic>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<CurveBiquadratic>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<CurveCubic>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<CurveExponent>().size());
+
+    EXPECT_EQ(0, model.getConcreteModelObjects<AirConditionerVariableRefrigerantFlow>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<ModelObjectList>().size());
+    EXPECT_EQ(0, model.getConcreteModelObjects<ZoneHVACTerminalUnitVariableRefrigerantFlow>().size());
+  }
+}
+
+TEST_F(ModelFixture, AirConditionerVariableRefrigerantFlow_Remove) {
+  Model model;
+
+  EXPECT_EQ(0, model.getModelObjects<Curve>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<CurveQuadratic>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<CurveBiquadratic>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<CurveCubic>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<CurveExponent>().size());
+
+  EXPECT_EQ(0, model.getConcreteModelObjects<AirConditionerVariableRefrigerantFlow>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<ZoneHVACTerminalUnitVariableRefrigerantFlow>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<ModelObjectList>().size());
+
+  auto size = model.modelObjects().size();
+  AirConditionerVariableRefrigerantFlow vrf(model);
+  EXPECT_EQ(20, model.getModelObjects<Curve>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<CurveQuadratic>().size());
+  EXPECT_EQ(9, model.getConcreteModelObjects<CurveBiquadratic>().size());
+  EXPECT_EQ(11, model.getConcreteModelObjects<CurveCubic>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<CurveExponent>().size());
+
+  EXPECT_EQ(1, model.getConcreteModelObjects<AirConditionerVariableRefrigerantFlow>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<ZoneHVACTerminalUnitVariableRefrigerantFlow>().size());
+  EXPECT_EQ(1, model.getConcreteModelObjects<ModelObjectList>().size());
+
+  // VRFTU has no curves, but its Cooling Coil and Heating Coil each add a Quadratic and a Biquadratic, the FanOnOff add a Cubic and one Exponent
+  ZoneHVACTerminalUnitVariableRefrigerantFlow term(model);
+  vrf.addTerminal(term);
+  EXPECT_EQ(1, vrf.terminals().size());
+
+  EXPECT_EQ(26, model.getModelObjects<Curve>().size());
+  EXPECT_EQ(2, model.getConcreteModelObjects<CurveQuadratic>().size());
+  EXPECT_EQ(11, model.getConcreteModelObjects<CurveBiquadratic>().size());
+  EXPECT_EQ(12, model.getConcreteModelObjects<CurveCubic>().size());
+  EXPECT_EQ(1, model.getConcreteModelObjects<CurveExponent>().size());
+
+  EXPECT_EQ(1, model.getConcreteModelObjects<AirConditionerVariableRefrigerantFlow>().size());
+  EXPECT_EQ(1, model.getConcreteModelObjects<ZoneHVACTerminalUnitVariableRefrigerantFlow>().size());
+  EXPECT_EQ(1, model.getConcreteModelObjects<ModelObjectList>().size());
+
+  EXPECT_FALSE(vrf.remove().empty());
+  EXPECT_EQ(0, model.getConcreteModelObjects<CurveQuadratic>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<CurveBiquadratic>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<CurveCubic>().size());
+
+  EXPECT_EQ(0, model.getConcreteModelObjects<AirConditionerVariableRefrigerantFlow>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<ZoneHVACTerminalUnitVariableRefrigerantFlow>().size());
+  EXPECT_EQ(0, model.getConcreteModelObjects<ModelObjectList>().size());
+
+  EXPECT_EQ(size + 2, model.modelObjects().size());  // Always On Discrete, OnOff
+}
+
+TEST_F(ModelFixture, AirConditionerVariableRefrigerantFlow_MatchingCoilTypes) {
+
+  Model model;
+  AirConditionerVariableRefrigerantFlow vrf(model);
+
+  {
+    FanOnOff fan(model);
+    CoilCoolingDXVariableRefrigerantFlow cc(model);
+    CoilHeatingDXVariableRefrigerantFlow hc(model);
+
+    ZoneHVACTerminalUnitVariableRefrigerantFlow vrfTerminal(model, cc, hc, fan);
+    EXPECT_FALSE(vrfTerminal.isFluidTemperatureControl());
+
+    EXPECT_EQ(0, vrf.terminals().size());
+    EXPECT_TRUE(vrf.addTerminal(vrfTerminal));
+    EXPECT_EQ(1, vrf.terminals().size());
+  }
+
+  {
+    FanSystemModel fan(model);
+    CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl ccFluidCtrl(model);
+    CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl hcFluidCtrl(model);
+
+    ZoneHVACTerminalUnitVariableRefrigerantFlow vrfTerminal(model, ccFluidCtrl, hcFluidCtrl, fan);
+    EXPECT_TRUE(vrfTerminal.isFluidTemperatureControl());
+
+    EXPECT_EQ(1, vrf.terminals().size());
+    EXPECT_FALSE(vrf.addTerminal(vrfTerminal));
+    EXPECT_EQ(1, vrf.terminals().size());
+  }
+}
diff --git a/src/model/test/CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_GTest.cpp b/src/model/test/CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_GTest.cpp
new file mode 100644
index 00000000000..40f42765710
--- /dev/null
+++ b/src/model/test/CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_GTest.cpp
@@ -0,0 +1,150 @@
+/***********************************************************************************************************************
+*  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 "../CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl.hpp"
+#include "../CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Impl.hpp"
+
+#include "../Schedule.hpp"
+#include "../Schedule_Impl.hpp"
+#include "../ScheduleConstant.hpp"
+#include "../ScheduleConstant_Impl.hpp"
+#include "../Curve.hpp"
+#include "../Curve_Impl.hpp"
+#include "../CurveQuadratic.hpp"
+#include "../CurveQuadratic_Impl.hpp"
+#include "../CurveCubic.hpp"
+#include "../CurveCubic_Impl.hpp"
+
+using namespace openstudio;
+using namespace openstudio::model;
+
+TEST_F(ModelFixture, CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+
+  ASSERT_EXIT(
+    {
+      Model model;
+
+      CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl coil(model);
+
+      exit(0);
+    },
+    ::testing::ExitedWithCode(0), "");
+
+  Model model;
+
+  CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl coil(model);
+
+  auto alwaysOn = model.alwaysOnDiscreteSchedule();
+
+  EXPECT_EQ(alwaysOn, coil.availabilitySchedule());
+  EXPECT_FALSE(coil.ratedTotalCoolingCapacity());
+  EXPECT_TRUE(coil.isRatedTotalCoolingCapacityAutosized());
+  EXPECT_FALSE(coil.autosizedRatedTotalCoolingCapacity());
+  EXPECT_FALSE(coil.ratedSensibleHeatRatio());
+  EXPECT_TRUE(coil.isRatedSensibleHeatRatioAutosized());
+  EXPECT_FALSE(coil.autosizedRatedSensibleHeatRatio());
+  EXPECT_EQ(5.0, coil.indoorUnitReferenceSuperheating());
+  Curve curve = coil.indoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve();
+  boost::optional<CurveQuadratic> indoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve = curve.optionalCast<CurveQuadratic>();
+  EXPECT_TRUE(indoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve);
+}
+
+TEST_F(ModelFixture, CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_SetGetFields) {
+  Model model;
+
+  CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl coil(model);
+
+  ScheduleConstant scheduleConstant(model);
+  scheduleConstant.setValue(0.5);
+  EXPECT_TRUE(coil.setAvailabilitySchedule(scheduleConstant));
+  EXPECT_TRUE(coil.setRatedTotalCoolingCapacity(1));
+  EXPECT_TRUE(coil.setRatedSensibleHeatRatio(2));
+  EXPECT_TRUE(coil.setIndoorUnitReferenceSuperheating(3));
+  CurveCubic curve(model);
+  EXPECT_TRUE(coil.setIndoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve(curve));
+
+  Schedule schedule = coil.availabilitySchedule();
+  boost::optional<ScheduleConstant> _scheduleConstant = schedule.optionalCast<ScheduleConstant>();
+  ASSERT_TRUE(_scheduleConstant);
+  EXPECT_EQ((*_scheduleConstant).value(), 0.5);
+  ASSERT_TRUE(coil.ratedTotalCoolingCapacity());
+  EXPECT_EQ(1, coil.ratedTotalCoolingCapacity().get());
+  EXPECT_FALSE(coil.isRatedTotalCoolingCapacityAutosized());
+  EXPECT_FALSE(coil.autosizedRatedTotalCoolingCapacity());
+  ASSERT_TRUE(coil.ratedSensibleHeatRatio());
+  EXPECT_EQ(2, coil.ratedSensibleHeatRatio().get());
+  EXPECT_FALSE(coil.autosizedRatedSensibleHeatRatio());
+  EXPECT_EQ(3, coil.indoorUnitReferenceSuperheating());
+  Curve _curve = coil.indoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve();
+  boost::optional<CurveCubic> indoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve = _curve.optionalCast<CurveCubic>();
+  EXPECT_TRUE(indoorUnitEvaporatingTemperatureFunctionofSuperheatingCurve);
+
+  coil.autosizeRatedTotalCoolingCapacity();
+  coil.autosizeRatedSensibleHeatRatio();
+
+  EXPECT_FALSE(coil.ratedTotalCoolingCapacity());
+  EXPECT_TRUE(coil.isRatedTotalCoolingCapacityAutosized());
+  EXPECT_FALSE(coil.autosizedRatedTotalCoolingCapacity());
+  EXPECT_FALSE(coil.ratedSensibleHeatRatio());
+  EXPECT_TRUE(coil.isRatedSensibleHeatRatioAutosized());
+  EXPECT_FALSE(coil.autosizedRatedSensibleHeatRatio());
+}
+
+TEST_F(ModelFixture, CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Clone) {
+  Model model;
+
+  CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl coil(model);
+
+  EXPECT_TRUE(coil.setRatedTotalCoolingCapacity(10));
+
+  CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl coilClone =
+    coil.clone(model).cast<CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl>();
+  ASSERT_TRUE(coilClone.ratedTotalCoolingCapacity());
+  EXPECT_EQ(10, coilClone.ratedTotalCoolingCapacity().get());
+
+  Model model2;
+  CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl coilClone2 =
+    coil.clone(model2).cast<CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl>();
+  ASSERT_TRUE(coilClone2.ratedTotalCoolingCapacity());
+  EXPECT_EQ(10, coilClone2.ratedTotalCoolingCapacity().get());
+}
+
+TEST_F(ModelFixture, CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl_Remove) {
+  Model model;
+  auto size = model.modelObjects().size();
+  CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl coil(model);
+  EXPECT_EQ(1u, model.getObjectsByType(CurveQuadratic::iddObjectType()).size());
+  EXPECT_FALSE(coil.remove().empty());
+  EXPECT_EQ(0u, model.getObjectsByType(CurveQuadratic::iddObjectType()).size());
+  EXPECT_EQ(0u, model.getObjectsByType(CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl::iddObjectType()).size());
+  EXPECT_EQ(size + 2, model.modelObjects().size());  // Always On Discrete, OnOff
+}
\ No newline at end of file
diff --git a/src/model/test/CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_GTest.cpp b/src/model/test/CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_GTest.cpp
new file mode 100644
index 00000000000..f26998c9a83
--- /dev/null
+++ b/src/model/test/CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_GTest.cpp
@@ -0,0 +1,139 @@
+/***********************************************************************************************************************
+*  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 "../CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl.hpp"
+#include "../CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Impl.hpp"
+
+#include "../Schedule.hpp"
+#include "../Schedule_Impl.hpp"
+#include "../ScheduleConstant.hpp"
+#include "../ScheduleConstant_Impl.hpp"
+#include "../Curve.hpp"
+#include "../Curve_Impl.hpp"
+#include "../CurveQuadratic.hpp"
+#include "../CurveQuadratic_Impl.hpp"
+#include "../CurveCubic.hpp"
+#include "../CurveCubic_Impl.hpp"
+
+using namespace openstudio;
+using namespace openstudio::model;
+
+TEST_F(ModelFixture, CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl) {
+  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+
+  ASSERT_EXIT(
+    {
+      Model model;
+
+      CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl coil(model);
+
+      exit(0);
+    },
+    ::testing::ExitedWithCode(0), "");
+
+  Model model;
+
+  CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl coil(model);
+
+  auto alwaysOn = model.alwaysOnDiscreteSchedule();
+
+  EXPECT_EQ(alwaysOn, coil.availabilitySchedule());
+  EXPECT_FALSE(coil.ratedTotalHeatingCapacity());
+  EXPECT_TRUE(coil.isRatedTotalHeatingCapacityAutosized());
+  EXPECT_FALSE(coil.autosizedRatedTotalHeatingCapacity());
+  EXPECT_EQ(5.0, coil.indoorUnitReferenceSubcooling());
+  Curve curve = coil.indoorUnitCondensingTemperatureFunctionofSubcoolingCurve();
+  boost::optional<CurveQuadratic> indoorUnitCondensingTemperatureFunctionofSubcoolingCurve = curve.optionalCast<CurveQuadratic>();
+  EXPECT_TRUE(indoorUnitCondensingTemperatureFunctionofSubcoolingCurve);
+}
+
+TEST_F(ModelFixture, CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_SetGetFields) {
+  Model model;
+
+  CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl coil(model);
+
+  ScheduleConstant scheduleConstant(model);
+  scheduleConstant.setValue(0.5);
+  EXPECT_TRUE(coil.setAvailabilitySchedule(scheduleConstant));
+  EXPECT_TRUE(coil.setRatedTotalHeatingCapacity(1));
+  EXPECT_TRUE(coil.setIndoorUnitReferenceSubcooling(2));
+  CurveCubic curve(model);
+  EXPECT_TRUE(coil.setIndoorUnitCondensingTemperatureFunctionofSubcoolingCurve(curve));
+
+  Schedule schedule = coil.availabilitySchedule();
+  boost::optional<ScheduleConstant> _scheduleConstant = schedule.optionalCast<ScheduleConstant>();
+  ASSERT_TRUE(_scheduleConstant);
+  EXPECT_EQ((*_scheduleConstant).value(), 0.5);
+  ASSERT_TRUE(coil.ratedTotalHeatingCapacity());
+  EXPECT_EQ(1, coil.ratedTotalHeatingCapacity().get());
+  EXPECT_FALSE(coil.isRatedTotalHeatingCapacityAutosized());
+  EXPECT_FALSE(coil.autosizedRatedTotalHeatingCapacity());
+  EXPECT_EQ(2, coil.indoorUnitReferenceSubcooling());
+  Curve _curve = coil.indoorUnitCondensingTemperatureFunctionofSubcoolingCurve();
+  boost::optional<CurveCubic> indoorUnitCondensingTemperatureFunctionofSubcoolingCurve = _curve.optionalCast<CurveCubic>();
+  EXPECT_TRUE(indoorUnitCondensingTemperatureFunctionofSubcoolingCurve);
+
+  coil.autosizeRatedTotalHeatingCapacity();
+
+  EXPECT_FALSE(coil.ratedTotalHeatingCapacity());
+  EXPECT_TRUE(coil.isRatedTotalHeatingCapacityAutosized());
+  EXPECT_FALSE(coil.autosizedRatedTotalHeatingCapacity());
+}
+
+TEST_F(ModelFixture, CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Clone) {
+  Model model;
+
+  CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl coil(model);
+
+  EXPECT_TRUE(coil.setRatedTotalHeatingCapacity(10));
+
+  CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl coilClone =
+    coil.clone(model).cast<CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl>();
+  ASSERT_TRUE(coilClone.ratedTotalHeatingCapacity());
+  EXPECT_EQ(10, coilClone.ratedTotalHeatingCapacity().get());
+
+  Model model2;
+  CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl coilClone2 =
+    coil.clone(model2).cast<CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl>();
+  ASSERT_TRUE(coilClone2.ratedTotalHeatingCapacity());
+  EXPECT_EQ(10, coilClone2.ratedTotalHeatingCapacity().get());
+}
+
+TEST_F(ModelFixture, CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl_Remove) {
+  Model model;
+  auto size = model.modelObjects().size();
+  CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl coil(model);
+  EXPECT_EQ(1u, model.getObjectsByType(CurveQuadratic::iddObjectType()).size());
+  EXPECT_FALSE(coil.remove().empty());
+  EXPECT_EQ(0u, model.getObjectsByType(CurveQuadratic::iddObjectType()).size());
+  EXPECT_EQ(0u, model.getObjectsByType(CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl::iddObjectType()).size());
+  EXPECT_EQ(size + 2, model.modelObjects().size());  // Always On Discrete, OnOff
+}
diff --git a/src/model/test/ZoneHVACTerminalUnitVariableRefrigerantFlow_GTest.cpp b/src/model/test/ZoneHVACTerminalUnitVariableRefrigerantFlow_GTest.cpp
index 5ef7b9f1838..5c5d7596424 100644
--- a/src/model/test/ZoneHVACTerminalUnitVariableRefrigerantFlow_GTest.cpp
+++ b/src/model/test/ZoneHVACTerminalUnitVariableRefrigerantFlow_GTest.cpp
@@ -35,6 +35,8 @@
 #include "../ZoneHVACTerminalUnitVariableRefrigerantFlow.hpp"
 #include "../CoilCoolingDXVariableRefrigerantFlow.hpp"
 #include "../CoilHeatingDXVariableRefrigerantFlow.hpp"
+#include "../CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl.hpp"
+#include "../CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl.hpp"
 #include "../CoilHeatingElectric.hpp"
 
 #include "../Node.hpp"
@@ -43,7 +45,10 @@
 #include "../PlantLoop.hpp"
 #include "../AirLoopHVACOutdoorAirSystem.hpp"
 #include "../ControllerOutdoorAir.hpp"
+#include "../FanConstantVolume.hpp"
 #include "../FanOnOff.hpp"
+#include "../FanVariableVolume.hpp"
+#include "../FanSystemModel.hpp"
 #include "../HVACComponent.hpp"
 #include "../HVACComponent_Impl.hpp"
 #include "../AirLoopHVACZoneSplitter.hpp"
@@ -312,3 +317,114 @@ TEST_F(ModelFixture, ZoneHVACTerminalUnitVariableRefrigerantFlow_SupplyAirFanPla
     EXPECT_EQ("BlowThrough", testObject.supplyAirFanPlacement());
   }
 }
+
+TEST_F(ModelFixture, ZoneHVACTerminalUnitVariableRefrigerantFlow_MatchingCoilTypes) {
+
+  Model model;
+  {
+    FanOnOff fan(model);
+    CoilCoolingDXVariableRefrigerantFlow cc(model);
+    CoilHeatingDXVariableRefrigerantFlow hc(model);
+
+    ZoneHVACTerminalUnitVariableRefrigerantFlow vrfTerminal(model, cc, hc, fan);
+    EXPECT_FALSE(vrfTerminal.isFluidTemperatureControl());
+    EXPECT_EQ(cc, vrfTerminal.coolingCoil().get());
+    EXPECT_EQ(hc, vrfTerminal.heatingCoil().get());
+    EXPECT_EQ(fan, vrfTerminal.supplyAirFan());
+
+    CoilCoolingDXVariableRefrigerantFlow cc2(model);
+    CoilHeatingDXVariableRefrigerantFlow hc2(model);
+    EXPECT_TRUE(vrfTerminal.setCoolingCoil(cc2));
+    EXPECT_TRUE(vrfTerminal.setHeatingCoil(hc2));
+    EXPECT_EQ(cc2, vrfTerminal.coolingCoil().get());
+    EXPECT_EQ(hc2, vrfTerminal.heatingCoil().get());
+
+    CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl ccFluidCtrl(model);
+    CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl hcFluidCtrl(model);
+    EXPECT_FALSE(vrfTerminal.setCoolingCoil(ccFluidCtrl));
+    EXPECT_FALSE(vrfTerminal.setHeatingCoil(hcFluidCtrl));
+    EXPECT_EQ(cc2, vrfTerminal.coolingCoil().get());
+    EXPECT_EQ(hc2, vrfTerminal.heatingCoil().get());
+  }
+
+  // Check Fan Type correctness for Non-FluidCtrl one
+  {
+    CoilCoolingDXVariableRefrigerantFlow cc(model);
+    CoilHeatingDXVariableRefrigerantFlow hc(model);
+    FanSystemModel fanSys(model);
+    EXPECT_NO_THROW(ZoneHVACTerminalUnitVariableRefrigerantFlow(model, cc, hc, fanSys));
+  }
+
+  {
+    CoilCoolingDXVariableRefrigerantFlow cc(model);
+    CoilHeatingDXVariableRefrigerantFlow hc(model);
+    FanOnOff fanOnOff(model);
+    EXPECT_NO_THROW(ZoneHVACTerminalUnitVariableRefrigerantFlow(model, cc, hc, fanOnOff));
+  }
+
+  {
+    CoilCoolingDXVariableRefrigerantFlow cc(model);
+    CoilHeatingDXVariableRefrigerantFlow hc(model);
+    FanConstantVolume fanCV(model);
+    EXPECT_NO_THROW(ZoneHVACTerminalUnitVariableRefrigerantFlow(model, cc, hc, fanCV));
+  }
+
+  {
+    CoilCoolingDXVariableRefrigerantFlow cc(model);
+    CoilHeatingDXVariableRefrigerantFlow hc(model);
+    FanVariableVolume fanVV(model);
+    EXPECT_ANY_THROW(ZoneHVACTerminalUnitVariableRefrigerantFlow(model, cc, hc, fanVV));
+  }
+
+  {
+    FanSystemModel fan(model);
+    CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl ccFluidCtrl(model);
+    CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl hcFluidCtrl(model);
+
+    ZoneHVACTerminalUnitVariableRefrigerantFlow vrfTerminal(model, ccFluidCtrl, hcFluidCtrl, fan);
+    EXPECT_TRUE(vrfTerminal.isFluidTemperatureControl());
+    EXPECT_EQ(ccFluidCtrl, vrfTerminal.coolingCoil().get());
+    EXPECT_EQ(hcFluidCtrl, vrfTerminal.heatingCoil().get());
+    EXPECT_EQ(fan, vrfTerminal.supplyAirFan());
+
+    CoilCoolingDXVariableRefrigerantFlow cc(model);
+    CoilHeatingDXVariableRefrigerantFlow hc(model);
+    EXPECT_FALSE(vrfTerminal.setCoolingCoil(cc));
+    EXPECT_FALSE(vrfTerminal.setHeatingCoil(hc));
+    EXPECT_EQ(ccFluidCtrl, vrfTerminal.coolingCoil().get());
+    EXPECT_EQ(hcFluidCtrl, vrfTerminal.heatingCoil().get());
+
+    CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl ccFluidCtrl2(model);
+    CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl hcFluidCtrl2(model);
+    EXPECT_TRUE(vrfTerminal.setCoolingCoil(ccFluidCtrl2));
+    EXPECT_TRUE(vrfTerminal.setHeatingCoil(hcFluidCtrl2));
+    EXPECT_EQ(ccFluidCtrl2, vrfTerminal.coolingCoil().get());
+    EXPECT_EQ(hcFluidCtrl2, vrfTerminal.heatingCoil().get());
+  }
+
+  // Check Fan Type correctness for FluidCtrl one
+  {
+    CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl ccFluidCtrl(model);
+    CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl hcFluidCtrl(model);
+    FanSystemModel fanSys(model);
+    EXPECT_NO_THROW(ZoneHVACTerminalUnitVariableRefrigerantFlow(model, ccFluidCtrl, hcFluidCtrl, fanSys));
+  }
+  {
+    CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl ccFluidCtrl(model);
+    CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl hcFluidCtrl(model);
+    FanVariableVolume fanVV(model);
+    EXPECT_NO_THROW(ZoneHVACTerminalUnitVariableRefrigerantFlow(model, ccFluidCtrl, hcFluidCtrl, fanVV));
+  }
+  {
+    CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl ccFluidCtrl(model);
+    CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl hcFluidCtrl(model);
+    FanOnOff fanOnOff(model);
+    EXPECT_ANY_THROW(ZoneHVACTerminalUnitVariableRefrigerantFlow(model, ccFluidCtrl, hcFluidCtrl, fanOnOff));
+  }
+  {
+    CoilCoolingDXVariableRefrigerantFlowFluidTemperatureControl ccFluidCtrl(model);
+    CoilHeatingDXVariableRefrigerantFlowFluidTemperatureControl hcFluidCtrl(model);
+    FanConstantVolume fanCV(model);
+    EXPECT_ANY_THROW(ZoneHVACTerminalUnitVariableRefrigerantFlow(model, ccFluidCtrl, hcFluidCtrl, fanCV));
+  }
+}