Repository: NREL/hescore-hpxml

Issue:
Handle Assembly R-values
Walls and Roof R-values in OpenStudio-HPXML are specified as assembly R-values, but hescore-hpxml expects layers with nominal R-values. So, most surfaces are coming through with R-0.

Discussion:

Patch:
diff --git a/MANIFEST.in b/MANIFEST.in
index cce75a54..227a495e 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,2 +1,4 @@
-recursive-include hescorehpxml/schemas *.xsd
+recursive-include hescorehpxml/schemas *.xsd *.json
+
+recursive-include hescorehpxml/lookups *.csv
 
diff --git a/docs/source/translation/zone_floor.rst b/docs/source/translation/zone_floor.rst
index 732802f8..79c99ef4 100644
--- a/docs/source/translation/zone_floor.rst
+++ b/docs/source/translation/zone_floor.rst
@@ -139,27 +139,25 @@ Floor insulation above basement or crawlspace
 
 If the foundation type is a basement or crawlspace, for each frame floor above
 the foundation, a weighted average using the floor area and R-value are
-calculated. The area is obtained from the ``Area`` element. The R-value is the
-sum of the ``FrameFloor/Insulation/Layer/NominalRValue`` element values for
-each frame floor. The effective R-value is looked up in the following table.
+calculated. The area is obtained from the ``Area`` element.
 
-.. table:: Floor center-of-cavity effective R-value
+The floor R-value can be described by using ``NominalRValue`` or ``AssemblyRValue``.
+If a user wishes to use a nominal R-value, ``NominalRValue`` elements for all layers need to be provided.
+Otherwise, ``AssemblyRValue`` elements for each layer need to be provided.
 
-   =================  ==================
-   Insulation Level   Effective R-value   
-   =================  ==================
-   R-0                4                   
-   R-11               15.8                
-   R-13               17.8                
-   R-15               19.8                
-   R-19               23.8                
-   R-21               25.8                
-   R-25               31.8                
-   R-30               37.8                
-   R-38               42.8                
-   =================  ==================
+If nominal R-value is used, the R-value is the sum of the ``FrameFloor/Insulation/Layer/NominalRValue`` element values 
+for each frame floor. The nearest discrete R-value from the list of possible R-values for that floor type
+is used to determine an assembly code. 
+Then, the assembly R-value of the corresponding assembly code from the lookup table is used. 
+The lookup table can be found at `hescorehpxml\\lookups\\lu_floor_eff_rvalue.csv
+<https://github.com/NREL/hescore-hpxml/blob/assembly_eff_r_values/hescorehpxml/lookups/lu_floor_eff_rvalue.csv>`_.
 
-Then a weighted average R-value is calculated by weighting the U-values by area.
+If assembly R-value is used, the discrete R-value nearest to assembly R-value
+from the lookup table is used. The lookup table can be found at `hescorehpxml\\lookups\\lu_floor_eff_rvalue.csv
+<https://github.com/NREL/hescore-hpxml/blob/assembly_eff_r_values/hescorehpxml/lookups/lu_floor_eff_rvalue.csv>`_.
+
+When more than one HPXML ``FrameFloor`` element must be combined into one floor
+construction for HEScore, a weighted average assembly R-value is determined by weighting the U-values by area.
 
 .. math::
    :nowrap:
@@ -170,15 +168,5 @@ Then a weighted average R-value is calculated by weighting the U-values by area.
    R_{eff,avg} &= \frac{1}{U_{eff,avg}} \\
    \end{align*}
 
-The effective R-value of the R-0 insulation level is then subtracted.
-
-.. math::
-
-   R = R_{eff,avg} - 4.0
-   
-Finally, the nearest insulation level is selected from the enumeration list.
-
-
-
-
+Then the discrete R-value nearest to the weighted average assembly R-value from the lookup table is used.
 
diff --git a/docs/source/translation/zone_roof.rst b/docs/source/translation/zone_roof.rst
index 82bfcfae..1dec7b4f 100644
--- a/docs/source/translation/zone_roof.rst
+++ b/docs/source/translation/zone_roof.rst
@@ -209,72 +209,42 @@ HPXML v3
 Radiant Barrier
 ***************
 
-If the ``Roof/RadiantBarrier`` element exists and has a "true" value, the attic
-is assumed to have a radiant barrier and no roof deck insulation is assumed
-according to the construction codes available in HEScore.
+If the ``Roof/RadiantBarrier`` element exists and has a "true" value and roof deck insulation R-value is 0,
+the attic is assumed to have a radiant barrier according to the construction codes available in HEScore.
+If the ``Roof/RadiantBarrier`` element exists and has a "true" value but roof deck insulation R-value greater than 0,
+the roof will be modeled as a roof with no radiant barrier.
 
 .. _roof-rvalues:
 
 Roof R-value
 ************
 
-R-values for the roof deck are added up by summing the values of the
-``Layer/NominalRValue``. If the roof construction was determined to have
-:ref:`rigid-sheathing`, an R-value of 5 is subtracted from the roof R-value sum
-to account for the R-value of the sheathing in the HEScore construction.
+The roof R-value can be described by using ``NominalRValue`` or ``AssemblyRValue``.
+If a user wishes to use a nominal R-value, ``NominalRValue`` elements for all layers need to be provided.
+Otherwise, ``AssemblyRValue`` elements for each layer need to be provided.
 
-Starting from HPXML v3, multiple roofs are allowed to be attached to the same
-attic, if the attic has more than one ``Roof`` element with roof insulation, the
-insulation values are combined by first selecting the nearest roof
-center-of-cavity R-value for each roof area from the table below.
-
-.. table:: Roof Center-of-Cavity Effective R-values
-
-   +-------------------+---------------------+------------+----------+--------------+---------------+
-   |Exterior           |Composition or Metal |Wood Shakes |Clay Tile |Concrete Tile |Tar and Gravel |
-   +-------------------+---------------------+------------+----------+--------------+---------------+
-   |R-value            |Effective R-value                                                           |
-   +===================+=====================+============+==========+==============+===============+
-   | **Standard**                                                                                   |
-   +-------------------+---------------------+------------+----------+--------------+---------------+
-   |R-0                |2.7                  |3.2         |2.2       |2.3           |2.3            |
-   +-------------------+---------------------+------------+----------+--------------+---------------+
-   |R-11               |13.6                 |14.1        |13.2      |13.2          |13.2           |
-   +-------------------+---------------------+------------+----------+--------------+---------------+
-   |R-13               |15.6                 |16.1        |15.2      |15.2          |15.2           |
-   +-------------------+---------------------+------------+----------+--------------+---------------+
-   |R-15               |17.6                 |18.1        |17.2      |17.2          |17.2           |
-   +-------------------+---------------------+------------+----------+--------------+---------------+
-   |R-19               |21.6                 |22.1        |21.2      |21.2          |21.2           |
-   +-------------------+---------------------+------------+----------+--------------+---------------+
-   |R-21               |23.6                 |24.1        |23.2      |23.2          |23.2           |
-   +-------------------+---------------------+------------+----------+--------------+---------------+
-   |R-27               |29.6                 |30.1        |29.2      |29.2          |29.2           |
-   +-------------------+---------------------+------------+----------+--------------+---------------+
-   |R-30               |32.6                 |33.1        |32.2      |32.2          |32.2           |
-   +-------------------+---------------------+------------+----------+--------------+---------------+
-   | **w/ Radiant Barrier**                                                                         |
-   +-------------------+---------------------+------------+----------+--------------+---------------+
-   |R-0                |5                    |5.5         |4.5       |4.6           |4.6            |
-   +-------------------+---------------------+------------+----------+--------------+---------------+
-   | **w/ foam sheeting**                                                                           |
-   +-------------------+---------------------+------------+----------+--------------+---------------+
-   |R-0                |6.8                  |7.3         |6.4       |6.4           |6.4            |
-   +-------------------+---------------------+------------+----------+--------------+---------------+
-   |R-11               |17.8                 |18.3        |17.4      |17.4          |17.4           |
-   +-------------------+---------------------+------------+----------+--------------+---------------+
-   |R-13               |19.8                 |20.3        |19.4      |19.4          |19.4           |
-   +-------------------+---------------------+------------+----------+--------------+---------------+
-   |R-15               |21.8                 |22.3        |21.4      |21.4          |21.4           |
-   +-------------------+---------------------+------------+----------+--------------+---------------+
-   |R-19               |25.8                 |26.3        |25.4      |25.4          |25.4           |
-   +-------------------+---------------------+------------+----------+--------------+---------------+
-   |R-21               |27.8                 |28.3        |27.4      |27.4          |27.4           |
-   +-------------------+---------------------+------------+----------+--------------+---------------+
-
-Then a weighted average is calculated by weighting the U-values by area. This averaged Center-of-Cavity Effective
-R value is combined from all roofs attached to the same attic. The highest weighted roof construction type is selected
-to represent properties of the attic.
+If nominal R-value is used, the R-value is summed for all insulation layers. If the roof construction 
+was determined to have :ref:`rigid-sheathing`, an R-value of 5 is subtracted from the roof R-value sum
+to account for the R-value of the sheathing in the HEScore construction.
+The nearest discrete R-value from the list of possible R-values for that roof type
+is used to determine an assembly code. 
+Then, the assembly R-value of the corresponding 
+assembly code from the lookup table is used. The lookup table can be found 
+at `hescorehpxml\\lookups\\lu_roof_eff_rvalue.csv
+<https://github.com/NREL/hescore-hpxml/blob/assembly_eff_r_values/hescorehpxml/lookups/lu_roof_eff_rvalue.csv>`_.
+
+If assembly R-value is used, the discrete R-value nearest to assembly R-value
+from the lookup table is used. The lookup table can be found at `hescorehpxml\\lookups\\lu_roof_eff_rvalue.csv
+<https://github.com/NREL/hescore-hpxml/blob/assembly_eff_r_values/hescorehpxml/lookups/lu_roof_eff_rvalue.csv>`_.
+If the attic has more than one ``Roof`` element, a weighted average assembly R-value is determined
+by weighting the U-values by area.
+Then the discrete R-value nearest to the weighted average assembly R-value from the lookup table is used.
+
+Starting from HPXML v3, multiple roofs are allowed to be attached to the same attic. 
+If the attic has more than one ``Roof`` element with roof insulation,
+a weighted average R-value is calculated using assembly R-value for each ``Roof``, 
+whether nominal R-value or assembly R-value is used. 
+The weighted average is calculated by weighting the U-values by area.
 
 .. math::
    :nowrap:
@@ -285,30 +255,22 @@ to represent properties of the attic.
    R_{eff,avg} &= \frac{1}{U_{eff,avg}} \\
    \end{align*}
 
-If the house has more than two attics specified, the attics of the same roof
-types are combined. Therefore, the same weighted average calculation is
-performed (taking roof-level averaged R as :math:`R_{i}` and attic area
-determined in `attic area`_ as :math:`A_{i}`) to combine multiple attics.
-
-Then the R-0 effective center-of-cavity R-value (:math:`R_{offset}`) is selected
-for highest weighted roof construction type for the attic represented in the
-calculation and is subtracted from :math:`R_{eff,avg}`. 
-
-.. math::
-
-   R = R_{eff,avg} - R_{offset}
-
-Finally the R-value is rounded to the nearest insulation level in the
-enumeration choices for the highest weighted roof construction type for the
-attic is included in the calculation.
+Then the nearest discrete R-value to the weighted average R-value from the lookup table is used.
+The lookup table can be found at `hescorehpxml\\lookups\\lu_roof_eff_rvalue.csv
+<https://github.com/NREL/hescore-hpxml/blob/assembly_eff_r_values/hescorehpxml/lookups/lu_roof_eff_rvalue.csv>`_.
 
 Attic R-value
 *************
- 
+
 Determining the attic floor insulation levels uses the same procedure as
-:ref:`roof-rvalues` except the lookup table is different. The attic floor
-center-of-cavity R-values are each R-0.5 greater than the nominal R-values in
-the enumeration list. 
+:ref:`roof-rvalues` except the lookup table is different. 
+
+If nominal R-value is used, the attic floor center-of-cavity R-values are each R-0.5 greater
+than the nominal R-values in the enumeration list.
+
+If assembly R-value is used, the lookup table at `hescorehpxml\\lookups\\lu_ceiling_eff_rvalue.csv
+<https://github.com/NREL/hescore-hpxml/blob/assembly_eff_r_values/hescorehpxml/lookups/lu_ceiling_eff_rvalue.csv>`_
+is used. 
 
 If the primary roof type is determined to be a cathedral ceiling, then an attic
 R-value is not calculated.
@@ -360,9 +322,18 @@ wall". See below an example:
    <Walls>
 
 If an attic has knee walls specified, the area of the knee walls will be added
-to the attic floor area. The knee walls center-of-cavity R-value is R-1.8 greater 
-than the nominal R-value. The knee walls center-of-cavity R-value will be reflected 
+to the attic floor area.
+
+The knee walls R-value can be described by nominal R-value or assembly R-value.
+
+If nominal R-value is used, the knee walls center-of-cavity R-value will be reflected 
 in the area weighted center-of-cavity effective R-value of the attic floor. 
-This averaged center-of-cavity effective R value is combined from all knee walls 
+The knee walls center-of-cavity R-value is R-1.8 greater than the nominal R-value.
+
+If assembly R-value is used, the knee walls assembly R-value will be reflected in
+the area weighted assembly effective R-value of the attic floor.
+
+The averaged center-of-cavity or assembly effective R value is combined from all knee walls 
 and attic floors attached to the same attic. The highest weighted attic floor 
-construction type is selected.
\ No newline at end of file
+construction type is selected.
+
diff --git a/docs/source/translation/zone_wall.rst b/docs/source/translation/zone_wall.rst
index 1d4ebe80..cc76fddb 100644
--- a/docs/source/translation/zone_wall.rst
+++ b/docs/source/translation/zone_wall.rst
@@ -60,6 +60,24 @@ inputs in HPXML to discrete inputs required for HEScore.
 
 .. _construction codes: https://docs.google.com/spreadsheet/pub?key=0Avk3IqpWXaRkdGR6cXFwdVJ4ZVdYX25keDVEX1pPYXc&output=html
 
+The wall R-value can be described by using nominal R-value or assembly R-value.
+If a user wishes to use a nominal R-value, nominal R-value for all layers need to be provided.
+Otherwise, assembly R-values for each layer need to be provided.
+
+If nominal R-value is used, the R-value is summed for all insulation layers. If the wall construction 
+was determined to have :ref:`rigid-sheathing`, an R-value of 5 is subtracted from the wall R-value sum
+to account for the R-value of the sheathing in the HEScore construction. 
+The nearest discrete R-value from the list of possible R-values for that wall type
+is used to determine an assembly code. Then, the assembly R-value of the corresponding 
+assembly code from the lookup table is used. The lookup table can be found 
+at `hescorehpxml\\lookups\\lu_wall_eff_rvalue.csv
+<https://github.com/NREL/hescore-hpxml/blob/assembly_eff_r_values/hescorehpxml/lookups/lu_wall_eff_rvalue.csv>`_.
+
+If assembly R-value is used, the discrete R-value nearest to assembly R-value
+from the lookup table for that wall type is used. The lookup table can be found
+at `hescorehpxml\\lookups\\lu_wall_eff_rvalue.csv
+<https://github.com/NREL/hescore-hpxml/blob/assembly_eff_r_values/hescorehpxml/lookups/lu_wall_eff_rvalue.csv>`_.
+
 Wood Frame Walls
 ================
 
@@ -118,20 +136,13 @@ is selected.
 Finally, if neither of the above conditions are met, the wall is specified as
 simply "Wood Frame" in HEScore. 
 
-In all cases the R-value is summed for all insulation layers and the
-nearest discrete R-value from the list of possible R-values for that wall type
-is used. For walls with rigid foam sheathing, R-5 is subtracted from the
-nominal R-value sum to account for the R-value of the sheathing in the HEScore
-construction assembly.
-
 Siding is selected according to the :ref:`siding map <sidingmap>`.
 
 Structural Brick
 ================
 
 If ``WallType/StructuralBrick`` is found in HPXML, one of the structural brick
-codes in HEScore is specified. The nearest R-value to the sum of all the
-insulation layer nominal R-values is selected.
+codes in HEScore is specified.
 
 .. code-block:: xml
    :emphasize-lines: 4,9,12
@@ -158,8 +169,7 @@ Concrete Block or Stone
 =======================
 
 If ``WallType/ConcreteMasonryUnit`` or ``WallType/Stone`` is found, one of the
-concrete block construction codes is used in HEScore. The nearest R-value to
-the sum of all the insulation layer nominal R-values is selected. The siding is
+concrete block construction codes is used in HEScore. The siding is
 translated using the :ref:`same assumptions as wood stud walls <sidingmap>`
 with the exception that vinyl, wood, or aluminum siding is not available and if
 those are specified in the HPXML an error will result.
@@ -212,88 +222,9 @@ HPXMl ``Wall`` as described in :ref:`wall-construction`. The wall construction
 and exterior finish that represent the largest combined area are used to
 represent the side of the house. 
 
-A weighted R-value is calculated by looking up the center-of-cavity
-R-value for the wall construction, exterior finish, and nominal R-value for
-each ``Wall`` from the following table.
-
-.. table:: Wall center-of-cavity R-values
-
-   +---------+------------------+-------+------+---------+-------------+-----+
-   |Exterior |Wood Siding       |Stucco |Vinyl |Aluminum |Brick Veneer |None |
-   +---------+------------------+-------+------+---------+-------------+-----+
-   |R-value  |Effective R-value                                              |
-   +=========+==================+=======+======+=========+=============+=====+
-   |**Wood Frame**                                                           |
-   +---------+------------------+-------+------+---------+-------------+-----+
-   |R-0      |3.6               |2.3    |2.2   |2.1      |2.9          |     |
-   +---------+------------------+-------+------+---------+-------------+-----+
-   |R-3      |5.7               |4.4    |4.3   |4.2      |5.0          |     |
-   +---------+------------------+-------+------+---------+-------------+-----+
-   |R-7      |9.7               |8.4    |8.3   |8.2      |9.0          |     |
-   +---------+------------------+-------+------+---------+-------------+-----+
-   |R-11     |13.7              |12.4   |12.3  |12.2     |13.0         |     |
-   +---------+------------------+-------+------+---------+-------------+-----+
-   |R-13     |15.7              |14.4   |14.3  |14.2     |15.0         |     |
-   +---------+------------------+-------+------+---------+-------------+-----+
-   |R-15     |17.7              |16.4   |16.3  |16.2     |17.0         |     |
-   +---------+------------------+-------+------+---------+-------------+-----+
-   |R-19     |21.7              |20.4   |20.3  |20.2     |21.0         |     |
-   +---------+------------------+-------+------+---------+-------------+-----+
-   |R-21     |23.7              |22.4   |22.3  |22.2     |23.0         |     |
-   +---------+------------------+-------+------+---------+-------------+-----+
-   |**Wood Frame w/insulated sheathing**                                     |
-   +---------+------------------+-------+------+---------+-------------+-----+
-   |R-0      |6.1               |5.4    |5.3   |5.2      |6.0          |     |
-   +---------+------------------+-------+------+---------+-------------+-----+
-   |R-3      |9.1               |8.4    |8.3   |8.2      |9.0          |     |
-   +---------+------------------+-------+------+---------+-------------+-----+
-   |R-7      |13.1              |12.4   |12.3  |12.2     |13.0         |     |
-   +---------+------------------+-------+------+---------+-------------+-----+
-   |R-11     |17.1              |16.4   |16.3  |16.2     |17.0         |     |
-   +---------+------------------+-------+------+---------+-------------+-----+
-   |R-13     |19.1              |18.4   |18.3  |18.2     |19.0         |     |
-   +---------+------------------+-------+------+---------+-------------+-----+
-   |R-15     |21.1              |20.4   |20.3  |20.2     |21.0         |     |
-   +---------+------------------+-------+------+---------+-------------+-----+
-   |R-19     |25.1              |24.4   |24.3  |24.2     |25.0         |     |
-   +---------+------------------+-------+------+---------+-------------+-----+
-   |R-21     |27.1              |26.4   |26.3  |26.2     |27.0         |     |
-   +---------+------------------+-------+------+---------+-------------+-----+
-   |**Optimum Value Engineering**                                            |
-   +---------+------------------+-------+------+---------+-------------+-----+
-   |R-19     |21.0              |20.3   |20.1  |20.1     |20.9         |     |
-   +---------+------------------+-------+------+---------+-------------+-----+
-   |R-21     |23.0              |22.3   |22.1  |22.1     |22.9         |     |
-   +---------+------------------+-------+------+---------+-------------+-----+
-   |R-27     |29.0              |28.3   |28.1  |28.1     |28.9         |     |
-   +---------+------------------+-------+------+---------+-------------+-----+
-   |R-33     |35.0              |34.3   |34.1  |34.1     |34.9         |     |
-   +---------+------------------+-------+------+---------+-------------+-----+
-   |R-38     |40.0              |39.3   |39.1  |39.1     |39.9         |     |
-   +---------+------------------+-------+------+---------+-------------+-----+
-   |**Structural Brick**                                                     |
-   +---------+------------------+-------+------+---------+-------------+-----+
-   |R-0      |                  |       |      |         |             |2.9  |
-   +---------+------------------+-------+------+---------+-------------+-----+
-   |R-5      |                  |       |      |         |             |7.9  |
-   +---------+------------------+-------+------+---------+-------------+-----+
-   |R-10     |                  |       |      |         |             |12.8 |
-   +---------+------------------+-------+------+---------+-------------+-----+
-   |**Concrete Block**                                                       |
-   +---------+------------------+-------+------+---------+-------------+-----+
-   |R-0      |                  |4.1    |      |         |5.6          |4.0  |
-   +---------+------------------+-------+------+---------+-------------+-----+
-   |R-3      |                  |5.7    |      |         |7.2          |5.6  |
-   +---------+------------------+-------+------+---------+-------------+-----+
-   |R-6      |                  |8.5    |      |         |10.0         |8.3  |
-   +---------+------------------+-------+------+---------+-------------+-----+
-   |**Straw Bale**                                                           |
-   +---------+------------------+-------+------+---------+-------------+-----+
-   |R-0      |                  |58.8   |      |         |             |     |
-   +---------+------------------+-------+------+---------+-------------+-----+
-
-
-Then a weighted average is calculated by weighting the U-values values by area.
+Whether nominal R-value or assembly R-value is used, a weighted average R-value is calculated
+using assembly R-value for each ``Wall``. 
+The weighted average is calculated by weighting the U-values by area.
 
 .. math::
    :nowrap:
@@ -304,18 +235,7 @@ Then a weighted average is calculated by weighting the U-values values by area.
    R_{eff,avg} &= \frac{1}{U_{eff,avg}} \\
    \end{align*}
 
-The R-0 center-of-cavity R-value (:math:`R_{offset}`) is selected for
-the highest weighted wall construction type represented in the calculation and
-is subtracted from :math:`R_{eff,avg}`. For construction types where there is
-no R-0 nominal value, the lowest nominal R-value is subtracted from the
-corresponding effective R-value.
-
-.. math::
-
-   R = R_{eff,avg} - R_{offset}
-
-Finally the R-value is rounded to the nearest insulation level in the
-enumeration choices for the highest weighted roof construction type included in
-the calculation.
-
+Then the nearest discrete R-value to the weighted average R-value from the lookup table is used.
+The lookup table can be found at `hescorehpxml\\lookups\\lu_wall_eff_rvalue.csv
+<https://github.com/NREL/hescore-hpxml/blob/assembly_eff_r_values/hescorehpxml/lookups/lu_wall_eff_rvalue.csv>`_.
 
diff --git a/examples/hescore_min_assembly_rvalue.json b/examples/hescore_min_assembly_rvalue.json
new file mode 100644
index 00000000..b632fa41
--- /dev/null
+++ b/examples/hescore_min_assembly_rvalue.json
@@ -0,0 +1,133 @@
+{
+  "building_address": {
+    "address": "123 Main Street",
+    "city": "Golden",
+    "state": "CO",
+    "zip_code": "80401",
+    "assessment_type": "initial"
+  },
+  "building": {
+    "about": {
+      "assessment_date": "2014-12-02",
+      "shape": "rectangle",
+      "year_built": 1961,
+      "number_bedrooms": 4,
+      "num_floor_above_grade": 1,
+      "floor_to_ceiling_height": 7,
+      "conditioned_floor_area": 2400,
+      "orientation": "north",
+      "blower_door_test": true,
+      "envelope_leakage": 1204
+    },
+    "zone": {
+      "zone_roof": [
+        {
+          "roof_name": "roof1",
+          "roof_area": 1200.0,
+          "roof_assembly_code": "rfwf00co",
+          "roof_color": "medium",
+          "roof_type": "vented_attic",
+          "ceiling_assembly_code": "ecwf38",
+          "zone_skylight": {
+            "skylight_area": 11.0,
+            "skylight_method": "code",
+            "skylight_code": "dcab",
+            "solar_screen": false
+          }
+        }
+      ],
+      "zone_floor": [
+        {
+          "floor_name": "floor1",
+          "floor_area": 1200.0,
+          "foundation_type": "vented_crawl",
+          "foundation_insulation_level": 0,
+          "floor_assembly_code": "efwf15ca"
+        }
+      ],
+      "wall_construction_same": false,
+      "window_construction_same": false,
+      "zone_wall": [
+        {
+          "side": "front",
+          "wall_assembly_code": "ewwf11br",
+          "zone_window": {
+            "window_area": 1.0,
+            "window_method": "custom",
+            "window_u_value": 1.0,
+            "window_shgc": 0.75,
+            "solar_screen": false
+          }
+        },
+        {
+          "side": "left",
+          "wall_assembly_code": "ewwf11br",
+          "zone_window": {
+            "window_area": 2.0,
+            "window_method": "code",
+            "window_code": "dcaw",
+            "solar_screen": false
+          }
+        },
+        {
+          "side": "back",
+          "wall_assembly_code": "ewwf11br",
+          "zone_window": {
+            "window_area": 3.0,
+            "window_method": "code",
+            "window_code": "dcaw",
+            "solar_screen": false
+          }
+        },
+        {
+          "side": "right",
+          "wall_assembly_code": "ewwf11br",
+          "zone_window": {
+            "window_area": 4.0,
+            "window_method": "code",
+            "window_code": "dcaw",
+            "solar_screen": false
+          }
+        }
+      ]
+    },
+    "systems": {
+      "hvac": [
+        {
+          "hvac_name": "hvac1",
+          "hvac_fraction": 1.0,
+          "heating": {
+            "fuel_primary": "natural_gas",
+            "type": "central_furnace",
+            "efficiency_method": "user",
+            "efficiency": 0.95
+          },
+          "cooling": {
+            "type": "split_dx",
+            "efficiency_method": "user",
+            "efficiency": 13.0
+          },
+          "hvac_distribution": {
+            "leakage_method": "qualitative",
+            "sealed": false,
+            "duct": [
+              {
+                "name": "duct1",
+                "location": "cond_space",
+                "fraction": 1.0,
+                "insulated": false
+              }
+            ]
+          }
+        }
+      ],
+      "domestic_hot_water": {
+        "category": "unit",
+        "type": "storage",
+        "fuel_primary": "natural_gas",
+        "efficiency_method": "shipment_weighted",
+        "year": 2010
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/examples/hescore_min_assembly_rvalue.xml b/examples/hescore_min_assembly_rvalue.xml
new file mode 100644
index 00000000..f7072434
--- /dev/null
+++ b/examples/hescore_min_assembly_rvalue.xml
@@ -0,0 +1,218 @@
+<HPXML xmlns="http://hpxmlonline.com/2019/10" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" schemaVersion="3.0">
+    <XMLTransactionHeaderInformation>
+        <XMLType/>
+        <XMLGeneratedBy/>
+        <CreatedDateAndTime>2014-08-21T11:41:49.968796</CreatedDateAndTime>
+        <Transaction>create</Transaction>
+    </XMLTransactionHeaderInformation>
+    <SoftwareInfo>
+        <SoftwareProgramUsed>Oxygen XML</SoftwareProgramUsed>
+        <SoftwareProgramVersion>16</SoftwareProgramVersion>
+    </SoftwareInfo>
+    <Building>
+        <BuildingID id="bldg1"/>
+        <Site>
+            <SiteID id="bldg1site"/>
+            <Address>
+                <AddressType>street</AddressType>
+                <Address1>123 Main Street</Address1>
+                <CityMunicipality>Golden</CityMunicipality>
+                <StateCode>CO</StateCode>
+                <ZipCode>80401</ZipCode>
+            </Address>
+        </Site>
+        <ProjectStatus>
+            <EventType>audit</EventType>
+            <Date>2014-12-02</Date>
+        </ProjectStatus>
+        <BuildingDetails>
+            <BuildingSummary>
+                <Site>
+                    <Surroundings>stand-alone</Surroundings>
+                    <OrientationOfFrontOfHome>north</OrientationOfFrontOfHome>
+                </Site>
+                <BuildingConstruction>
+                    <YearBuilt>1961</YearBuilt>
+                    <ResidentialFacilityType>single-family detached</ResidentialFacilityType>
+                    <NumberofConditionedFloorsAboveGrade>1</NumberofConditionedFloorsAboveGrade>
+                    <AverageCeilingHeight>7</AverageCeilingHeight>
+                    <NumberofBedrooms>4</NumberofBedrooms>
+                    <ConditionedFloorArea>2400</ConditionedFloorArea>
+                </BuildingConstruction>
+            </BuildingSummary>
+            <Enclosure>
+                <AirInfiltration>
+                    <AirInfiltrationMeasurement>
+                        <SystemIdentifier id="infilt1"/>
+                        <TypeOfInfiltrationMeasurement>blower door</TypeOfInfiltrationMeasurement>
+                        <HousePressure>50</HousePressure>
+                        <BuildingAirLeakage>
+                            <UnitofMeasure>ACH</UnitofMeasure>
+                            <AirLeakage>4.3</AirLeakage>
+                        </BuildingAirLeakage>
+                    </AirInfiltrationMeasurement>
+                </AirInfiltration>
+                <Attics>
+                    <Attic>
+                        <SystemIdentifier id="attic1"/>
+                        <AtticType>
+                            <Attic>
+                                <Vented>true</Vented>
+                            </Attic>
+                        </AtticType>
+                        <AttachedToRoof idref="roof1"/>
+                        <AttachedToFrameFloor idref="framefloor1"/>
+                    </Attic>
+                </Attics>
+                <Foundations>
+                    <Foundation>
+                        <SystemIdentifier id="crawlspace1"/>
+                        <FoundationType>
+                            <Crawlspace>
+                                <Vented>true</Vented>
+                            </Crawlspace>
+                        </FoundationType>
+                        <AttachedToFrameFloor idref='framefloor2'/>
+                    </Foundation>
+                </Foundations>
+                <Roofs>
+                    <Roof>
+                        <SystemIdentifier id="roof1"/>
+                        <RoofType>asphalt or fiberglass shingles</RoofType>
+                        <RoofColor>medium</RoofColor>
+                        <RadiantBarrier>false</RadiantBarrier>
+                        <Insulation>
+                            <SystemIdentifier id="attic1roofins"/>
+                            <AssemblyEffectiveRValue>2.3</AssemblyEffectiveRValue>
+                        </Insulation>
+                    </Roof>
+                </Roofs>
+                <Walls>
+                    <Wall>
+                        <SystemIdentifier id="wall1"/>
+                        <WallType>
+                            <WoodStud/>
+                        </WallType>
+                        <Siding>brick veneer</Siding>
+                        <Insulation>
+                            <SystemIdentifier id="wall1ins"/>
+                            <AssemblyEffectiveRValue>12.0</AssemblyEffectiveRValue>
+                        </Insulation>
+                    </Wall>
+                </Walls>
+                <FrameFloors>
+                    <FrameFloor>
+                        <SystemIdentifier id="framefloor1"/>
+                        <Area>1200</Area>
+                        <Insulation>
+                            <SystemIdentifier id="attic1flrins"/>
+                            <AssemblyEffectiveRValue>39.3</AssemblyEffectiveRValue>
+                        </Insulation>
+                    </FrameFloor>
+                    <FrameFloor>
+                        <SystemIdentifier id="framefloor2"/>
+                        <Area>1200</Area>
+                        <Insulation>
+                            <SystemIdentifier id="frmflr2ins"/>
+                            <AssemblyEffectiveRValue>18.7</AssemblyEffectiveRValue>
+                        </Insulation>
+                    </FrameFloor>
+                </FrameFloors>
+                <Windows>
+                    <Window>
+                        <SystemIdentifier id="window1"/>
+                        <Area>1</Area>
+                        <Orientation>north</Orientation>
+                        <UFactor>1</UFactor>
+                        <SHGC>.75</SHGC>
+                    </Window>
+                    <Window>
+                        <SystemIdentifier id="window2"/>
+                        <Area>2</Area>
+                        <Orientation>east</Orientation>
+                        <FrameType>
+                            <Vinyl/>
+                        </FrameType>
+                        <GlassLayers>double-pane</GlassLayers>
+                    </Window>
+                    <Window>
+                        <SystemIdentifier id="window3"/>
+                        <Area>3</Area>
+                        <Orientation>south</Orientation>
+                        <FrameType>
+                            <Vinyl/>
+                        </FrameType>
+                        <GlassLayers>double-pane</GlassLayers>
+                    </Window>
+                    <Window>
+                        <SystemIdentifier id="window4"/>
+                        <Area>4</Area>
+                        <Orientation>west</Orientation>
+                        <FrameType>
+                            <Vinyl/>
+                        </FrameType>
+                        <GlassLayers>double-pane</GlassLayers>
+                    </Window>
+                </Windows>
+                <Skylights>
+                    <Skylight>
+                        <SystemIdentifier id="sky1"/>
+                        <Area>11</Area>
+                        <FrameType>
+                            <Aluminum>
+                                <ThermalBreak>true</ThermalBreak>
+                            </Aluminum>
+                        </FrameType>
+                        <GlassLayers>double-pane</GlassLayers>
+                    </Skylight>
+                </Skylights>
+            </Enclosure>
+            <Systems>
+                <HVAC>
+                    <HVACPlant>
+                        <HeatingSystem>
+                            <SystemIdentifier id="furnace1"/>
+                            <DistributionSystem idref="hvacd1"/>
+                            <HeatingSystemType>
+                                <Furnace/>
+                            </HeatingSystemType>
+                            <HeatingSystemFuel>natural gas</HeatingSystemFuel>
+                            <AnnualHeatingEfficiency>
+                                <Units>AFUE</Units>
+                                <Value>0.95</Value>
+                            </AnnualHeatingEfficiency>
+                        </HeatingSystem>
+                        <CoolingSystem>
+                            <SystemIdentifier id="centralair1"/>
+                            <DistributionSystem idref="hvacd1"/>
+                            <CoolingSystemType>central air conditioner</CoolingSystemType>
+                            <AnnualCoolingEfficiency>
+                                <Units>SEER</Units>
+                                <Value>13</Value>
+                            </AnnualCoolingEfficiency>
+                        </CoolingSystem>
+                    </HVACPlant>
+                    <HVACDistribution>
+                        <SystemIdentifier id="hvacd1"/>
+                        <DistributionSystemType>
+                            <AirDistribution>
+                                <Ducts>
+                                    <DuctLocation>living space</DuctLocation>
+                                    <FractionDuctArea>1</FractionDuctArea>
+                                </Ducts>
+                            </AirDistribution>
+                        </DistributionSystemType>
+                    </HVACDistribution>
+                </HVAC>
+                <WaterHeating>
+                    <WaterHeatingSystem>
+                        <SystemIdentifier id="dhw1"/>
+                        <FuelType>natural gas</FuelType>
+                        <WaterHeaterType>storage water heater</WaterHeaterType>
+                        <YearInstalled>2010</YearInstalled>
+                    </WaterHeatingSystem>
+                </WaterHeating>
+            </Systems>
+        </BuildingDetails>
+    </Building>
+</HPXML>
\ No newline at end of file
diff --git a/examples/house4.json b/examples/house4.json
index dc330e06..99a6eaf8 100644
--- a/examples/house4.json
+++ b/examples/house4.json
@@ -86,7 +86,7 @@
         },
         {
           "side": "back",
-          "wall_assembly_code": "ewwf11st",
+          "wall_assembly_code": "ewwf13st",
           "zone_window": {
             "window_area": 165.333,
             "window_method": "code",
@@ -96,7 +96,7 @@
         },
         {
           "side": "right",
-          "wall_assembly_code": "ewwf07st",
+          "wall_assembly_code": "ewwf11st",
           "zone_window": {
             "window_area": 153.0,
             "window_method": "code",
diff --git a/examples/house6.json b/examples/house6.json
index da9ce970..3e99cca5 100644
--- a/examples/house6.json
+++ b/examples/house6.json
@@ -76,7 +76,7 @@
         },
         {
           "side": "left",
-          "wall_assembly_code": "ewwf03wo",
+          "wall_assembly_code": "ewwf00wo",
           "zone_window": {
             "window_area": 70.0,
             "window_method": "code",
@@ -86,7 +86,7 @@
         },
         {
           "side": "back",
-          "wall_assembly_code": "ewwf03wo",
+          "wall_assembly_code": "ewwf00wo",
           "zone_window": {
             "window_area": 220.0,
             "window_method": "code",
diff --git a/examples/house8.json b/examples/house8.json
index 559836f9..353ccfdd 100644
--- a/examples/house8.json
+++ b/examples/house8.json
@@ -27,7 +27,7 @@
           "roof_assembly_code": "rfwf00tg",
           "roof_color": "medium",
           "roof_type": "vented_attic",
-          "ceiling_assembly_code": "ecwf38",
+          "ceiling_assembly_code": "ecwf21",
           "zone_skylight": {
             "skylight_area": 0
           }
diff --git a/examples/house9.json b/examples/house9.json
new file mode 100644
index 00000000..ff7ffd1e
--- /dev/null
+++ b/examples/house9.json
@@ -0,0 +1,138 @@
+{
+  "building_address": {
+    "address": "resstock test house",
+    "city": "resstock test city",
+    "state": "WA",
+    "zip_code": "98052",
+    "assessment_type": "alternative"
+  },
+  "building": {
+    "about": {
+      "assessment_date": "2021-12-28",
+      "shape": "rectangle",
+      "year_built": 1950,
+      "number_bedrooms": 4,
+      "num_floor_above_grade": 2,
+      "floor_to_ceiling_height": 8,
+      "conditioned_floor_area": 2600,
+      "orientation": "south",
+      "blower_door_test": false,
+      "air_sealing_present": false
+    },
+    "zone": {
+      "zone_roof": [
+        {
+          "roof_name": "roof1",
+          "roof_area": 2176.0,
+          "roof_assembly_code": "rfwf00wo",
+          "roof_color": "cool_color",
+          "roof_absorptance": 0.85,
+          "roof_type": "vented_attic",
+          "ceiling_assembly_code": "ecwf25",
+          "zone_skylight": {
+            "skylight_area": 0
+          }
+        }
+      ],
+      "zone_floor": [
+        {
+          "floor_name": "floor1",
+          "floor_area": 2176.0,
+          "foundation_type": "unvented_crawl",
+          "foundation_insulation_level": 0,
+          "floor_assembly_code": "efwf30ca"
+        }
+      ],
+      "wall_construction_same": false,
+      "window_construction_same": false,
+      "zone_wall": [
+        {
+          "side": "front",
+          "wall_assembly_code": "ewwf15wo",
+          "zone_window": {
+            "window_area": 30.03,
+            "window_method": "custom",
+            "window_u_value": 0.47,
+            "window_shgc": 0.54,
+            "solar_screen": false
+          }
+        },
+        {
+          "side": "left",
+          "wall_assembly_code": "ewwf13wo",
+          "zone_window": {
+            "window_area": 16.68,
+            "window_method": "custom",
+            "window_u_value": 0.47,
+            "window_shgc": 0.54,
+            "solar_screen": false
+          }
+        },
+        {
+          "side": "back",
+          "wall_assembly_code": "ewwf13wo",
+          "zone_window": {
+            "window_area": 30.03,
+            "window_method": "custom",
+            "window_u_value": 0.47,
+            "window_shgc": 0.54,
+            "solar_screen": false
+          }
+        },
+        {
+          "side": "right",
+          "wall_assembly_code": "ewwf13wo",
+          "zone_window": {
+            "window_area": 16.68,
+            "window_method": "custom",
+            "window_u_value": 0.47,
+            "window_shgc": 0.54,
+            "solar_screen": false
+          }
+        }
+      ]
+    },
+    "systems": {
+      "hvac": [
+        {
+          "hvac_name": "hvac1",
+          "hvac_fraction": 1.0,
+          "heating": {
+            "fuel_primary": "electric",
+            "type": "central_furnace"
+          },
+          "cooling": {
+            "type": "split_dx",
+            "efficiency_method": "user",
+            "efficiency": 13.0
+          },
+          "hvac_distribution": {
+            "leakage_method": "quantitative",
+            "leakage_to_outside": 338.0,
+            "duct": [
+              {
+                "name": "duct1",
+                "location": "uncond_attic",
+                "fraction": 0.75,
+                "insulated": true
+              },
+              {
+                "name": "duct2",
+                "location": "cond_space",
+                "fraction": 0.25,
+                "insulated": true
+              }
+            ]
+          }
+        }
+      ],
+      "domestic_hot_water": {
+        "category": "unit",
+        "type": "storage",
+        "fuel_primary": "electric",
+        "efficiency_method": "user",
+        "energy_factor": 0.92
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/examples/house9.xml b/examples/house9.xml
new file mode 100644
index 00000000..005f3b24
--- /dev/null
+++ b/examples/house9.xml
@@ -0,0 +1,785 @@
+<HPXML xmlns='http://hpxmlonline.com/2019/10' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' schemaVersion='3.0'>
+  <XMLTransactionHeaderInformation>
+    <XMLType>HPXML</XMLType>
+    <XMLGeneratedBy>BuildResidentialHPXML</XMLGeneratedBy>
+    <CreatedDateAndTime>2021-08-31T11:57:28-06:00</CreatedDateAndTime>
+    <Transaction>create</Transaction>
+  </XMLTransactionHeaderInformation>
+  <SoftwareInfo>
+    <SoftwareProgramUsed>ResStock</SoftwareProgramUsed>
+    <SoftwareProgramVersion>2.4.0</SoftwareProgramVersion>
+    <extension>
+      <SimulationControl>
+        <Timestep>60</Timestep>
+        <BeginMonth>1</BeginMonth>
+        <BeginDayOfMonth>1</BeginDayOfMonth>
+        <EndMonth>12</EndMonth>
+        <EndDayOfMonth>31</EndDayOfMonth>
+        <CalendarYear>2007</CalendarYear>
+        <DaylightSaving>
+          <Enabled>true</Enabled>
+          <BeginMonth dataSource='software'>3</BeginMonth>
+          <BeginDayOfMonth dataSource='software'>12</BeginDayOfMonth>
+          <EndMonth dataSource='software'>11</EndMonth>
+          <EndDayOfMonth dataSource='software'>5</EndDayOfMonth>
+        </DaylightSaving>
+      </SimulationControl>
+      <HVACSizingControl>
+        <UseMaxLoadForHeatPumps dataSource='software'>true</UseMaxLoadForHeatPumps>
+        <AllowIncreasedFixedCapacities dataSource='software'>false</AllowIncreasedFixedCapacities>
+      </HVACSizingControl>
+    </extension>
+  </SoftwareInfo>
+  <Building>
+    <BuildingID id='MyBuilding'/>
+    <Site>
+      <SiteID id='SiteID'/>
+      <Address>
+        <AddressType>street</AddressType>
+        <Address1>resstock test house</Address1>
+        <CityMunicipality>resstock test city</CityMunicipality>
+        <StateCode>WA</StateCode>
+        <ZipCode>98052</ZipCode>
+    </Address>
+    </Site>
+    <ProjectStatus>
+      <EventType>proposed workscope</EventType>
+    </ProjectStatus>
+    <BuildingDetails>
+      <BuildingSummary>
+        <Site>
+          <OrientationOfFrontOfHome>south</OrientationOfFrontOfHome>
+        </Site>
+        <BuildingConstruction>
+          <YearBuilt>1950</YearBuilt>
+          <ResidentialFacilityType>single-family detached</ResidentialFacilityType>
+          <NumberofConditionedFloorsAboveGrade>2</NumberofConditionedFloorsAboveGrade>
+          <AverageCeilingHeight>8</AverageCeilingHeight>
+          <NumberofBedrooms>4</NumberofBedrooms>
+          <ConditionedFloorArea>2600</ConditionedFloorArea>
+        </BuildingConstruction>
+      </BuildingSummary>
+      <Enclosure>
+        <AirInfiltration>
+          <AirInfiltrationMeasurement>
+            <SystemIdentifier id='InfiltrationMeasurement'/>
+            <HousePressure>50.0</HousePressure>
+            <BuildingAirLeakage>
+              <UnitofMeasure>ACH</UnitofMeasure>
+              <AirLeakage>7.5</AirLeakage>
+            </BuildingAirLeakage>
+            <InfiltrationVolume>17408.0</InfiltrationVolume>
+          </AirInfiltrationMeasurement>
+        </AirInfiltration>
+        <Attics>
+          <Attic>
+            <SystemIdentifier id='VentedAttic'/>
+            <AtticType>
+              <Attic>
+                <Vented>true</Vented>
+              </Attic>
+            </AtticType>
+            <VentilationRate>
+              <UnitofMeasure>SLA</UnitofMeasure>
+              <Value dataSource='software'>0.003333</Value>
+            </VentilationRate>
+            <AttachedToRoof idref='Surface_8'/>
+            <AttachedToRoof idref='Surface_9'/>
+            <AttachedToWall idref='Surface_10'/>
+            <AttachedToWall idref='Surface_11'/>
+            <AttachedToWall idref='Surface_19'/>
+            <AttachedToFrameFloor idref='Surface_6'/>
+          </Attic>
+          <Attic>
+            <SystemIdentifier id='UnventedAttic'/>
+            <AtticType>
+              <Attic>
+                <Vented>false</Vented>
+              </Attic>
+            </AtticType>
+            <VentilationRate>
+              <UnitofMeasure>SLA</UnitofMeasure>
+              <Value dataSource='software'>0.003333</Value>
+            </VentilationRate>
+            <AttachedToRoof idref='Surface_21'/>
+            <AttachedToRoof idref='Surface_22'/>
+            <AttachedToWall idref='Surface_23'/>
+            <AttachedToFrameFloor idref='Surface_24'/>
+          </Attic>
+          <Attic>
+            <SystemIdentifier id='UnventedAttic2'/>
+            <AtticType>
+              <Attic>
+                <Vented>false</Vented>
+              </Attic>
+            </AtticType>
+            <VentilationRate>
+              <UnitofMeasure>SLA</UnitofMeasure>
+              <Value dataSource='software'>0.003333</Value>
+            </VentilationRate>
+            <AttachedToRoof idref='Surface_25'/>
+            <AttachedToRoof idref='Surface_26'/>
+            <AttachedToFrameFloor idref='Surface_27'/>
+          </Attic>
+        </Attics>
+        <Foundations>
+          <Foundation>
+            <SystemIdentifier id='UnventedCrawlspace'/>
+            <FoundationType>
+              <Crawlspace>
+                <Vented>false</Vented>
+              </Crawlspace>
+            </FoundationType>
+            <AttachedToFoundationWall idref='Surface_13'/>
+            <AttachedToFrameFloor idref='Surface_1'/>
+            <AttachedToSlab idref='Surface_12'/>
+          </Foundation>
+        </Foundations>
+        <Roofs>
+          <Roof>
+            <SystemIdentifier id='Surface_8'/>
+            <InteriorAdjacentTo>attic - vented</InteriorAdjacentTo>
+            <Area>608.21</Area>
+            <Orientation dataSource='software'>south</Orientation>
+            <Azimuth>180</Azimuth>
+            <RoofType>wood shingles or shakes</RoofType>
+            <RoofColor>medium</RoofColor>
+            <SolarAbsorptance dataSource='software'>0.85</SolarAbsorptance>
+            <Emittance dataSource='software'>0.9</Emittance>
+            <Pitch>6.0</Pitch>
+            <RadiantBarrier>false</RadiantBarrier>
+            <Insulation>
+              <SystemIdentifier id='Surface_8Insulation'/>
+              <AssemblyEffectiveRValue>2.3</AssemblyEffectiveRValue>
+            </Insulation>
+          </Roof>
+          <Roof>
+            <SystemIdentifier id='Surface_9'/>
+            <InteriorAdjacentTo>attic - vented</InteriorAdjacentTo>
+            <Area>608.21</Area>
+            <Orientation dataSource='software'>north</Orientation>
+            <Azimuth>0</Azimuth>
+            <RoofType>wood shingles or shakes</RoofType>
+            <RoofColor>medium</RoofColor>
+            <SolarAbsorptance dataSource='software'>0.85</SolarAbsorptance>
+            <Emittance dataSource='software'>0.9</Emittance>
+            <Pitch>6.0</Pitch>
+            <RadiantBarrier>false</RadiantBarrier>
+            <Insulation>
+              <SystemIdentifier id='Surface_9Insulation'/>
+              <AssemblyEffectiveRValue>2.3</AssemblyEffectiveRValue>
+            </Insulation>
+          </Roof>
+          <Roof>
+            <SystemIdentifier id='Surface_21'/>
+            <InteriorAdjacentTo>attic - unvented</InteriorAdjacentTo>
+            <Area>608.21</Area>
+            <Orientation dataSource='software'>south</Orientation>
+            <Azimuth>180</Azimuth>
+            <RoofType>wood shingles or shakes</RoofType>
+            <RoofColor>medium</RoofColor>
+            <SolarAbsorptance dataSource='software'>0.85</SolarAbsorptance>
+            <Emittance dataSource='software'>0.9</Emittance>
+            <Pitch>6.0</Pitch>
+            <RadiantBarrier>false</RadiantBarrier>
+            <Insulation>
+              <SystemIdentifier id='Surface_21Insulation'/>
+              <AssemblyEffectiveRValue>10.2</AssemblyEffectiveRValue>
+            </Insulation>
+          </Roof>
+          <Roof>
+            <SystemIdentifier id='Surface_22'/>
+            <InteriorAdjacentTo>attic - unvented</InteriorAdjacentTo>
+            <Area>608.21</Area>
+            <Orientation dataSource='software'>north</Orientation>
+            <Azimuth>0</Azimuth>
+            <RoofType>wood shingles or shakes</RoofType>
+            <RoofColor>medium</RoofColor>
+            <SolarAbsorptance dataSource='software'>0.85</SolarAbsorptance>
+            <Emittance dataSource='software'>0.9</Emittance>
+            <Pitch>6.0</Pitch>
+            <RadiantBarrier>false</RadiantBarrier>
+            <Insulation>
+              <SystemIdentifier id='Surface_22Insulation'/>
+              <AssemblyEffectiveRValue>10.2</AssemblyEffectiveRValue>
+            </Insulation>
+          </Roof>
+          <Roof>
+            <SystemIdentifier id='Surface_25'/>
+            <InteriorAdjacentTo>attic - unvented</InteriorAdjacentTo>
+            <Area>608.21</Area>
+            <Orientation dataSource='software'>south</Orientation>
+            <Azimuth>180</Azimuth>
+            <RoofType>wood shingles or shakes</RoofType>
+            <RoofColor>medium</RoofColor>
+            <SolarAbsorptance dataSource='software'>0.85</SolarAbsorptance>
+            <Emittance dataSource='software'>0.9</Emittance>
+            <Pitch>6.0</Pitch>
+            <RadiantBarrier>false</RadiantBarrier>
+            <Insulation>
+              <SystemIdentifier id='Surface_25Insulation'/>
+              <AssemblyEffectiveRValue>10.2</AssemblyEffectiveRValue>
+            </Insulation>
+          </Roof>
+          <Roof>
+            <SystemIdentifier id='Surface_26'/>
+            <InteriorAdjacentTo>attic - unvented</InteriorAdjacentTo>
+            <Area>608.21</Area>
+            <Orientation dataSource='software'>north</Orientation>
+            <Azimuth>0</Azimuth>
+            <RoofType>wood shingles or shakes</RoofType>
+            <RoofColor>medium</RoofColor>
+            <SolarAbsorptance dataSource='software'>0.85</SolarAbsorptance>
+            <Emittance dataSource='software'>0.9</Emittance>
+            <Pitch>6.0</Pitch>
+            <RadiantBarrier>false</RadiantBarrier>
+            <Insulation>
+              <SystemIdentifier id='Surface_26Insulation'/>
+              <AssemblyEffectiveRValue>10.2</AssemblyEffectiveRValue>
+            </Insulation>
+          </Roof>
+        </Roofs>
+        <Walls>
+          <Wall>
+            <SystemIdentifier id='Surface_10'/>
+            <ExteriorAdjacentTo>outside</ExteriorAdjacentTo>
+            <InteriorAdjacentTo>attic - vented</InteriorAdjacentTo>
+            <AtticWallType>gable</AtticWallType>
+            <WallType>
+              <WoodStud/>
+            </WallType>
+            <Area>151.11</Area>
+            <Orientation dataSource='software'>west</Orientation>
+            <Azimuth>270</Azimuth>
+            <Siding>wood siding</Siding>
+            <Color>light</Color>
+            <SolarAbsorptance dataSource='software'>0.5</SolarAbsorptance>
+            <Emittance dataSource='software'>0.9</Emittance>
+            <Insulation>
+              <SystemIdentifier id='Surface_10Insulation'/>
+              <AssemblyEffectiveRValue>4.0</AssemblyEffectiveRValue>
+            </Insulation>
+          </Wall>
+          <Wall>
+            <SystemIdentifier id='Surface_11'/>
+            <ExteriorAdjacentTo>outside</ExteriorAdjacentTo>
+            <InteriorAdjacentTo>attic - vented</InteriorAdjacentTo>
+            <AtticWallType>gable</AtticWallType>
+            <WallType>
+              <WoodStud/>
+            </WallType>
+            <Area>151.11</Area>
+            <Orientation dataSource='software'>east</Orientation>
+            <Azimuth>90</Azimuth>
+            <Siding>wood siding</Siding>
+            <Color>light</Color>
+            <SolarAbsorptance dataSource='software'>0.5</SolarAbsorptance>
+            <Emittance dataSource='software'>0.9</Emittance>
+            <Insulation>
+              <SystemIdentifier id='Surface_11Insulation'/>
+              <AssemblyEffectiveRValue>4.0</AssemblyEffectiveRValue>
+            </Insulation>
+          </Wall>
+          <Wall>
+            <SystemIdentifier id='Surface_18'/>
+            <ExteriorAdjacentTo>outside</ExteriorAdjacentTo>
+            <InteriorAdjacentTo>living space</InteriorAdjacentTo>
+            <WallType>
+              <WoodStud/>
+            </WallType>
+            <Area>500.66999999999996</Area>
+            <Orientation dataSource='software'>south</Orientation>
+            <Azimuth>180</Azimuth>
+            <Siding>wood siding</Siding>
+            <Color>light</Color>
+            <SolarAbsorptance dataSource='software'>0.5</SolarAbsorptance>
+            <Emittance dataSource='software'>0.9</Emittance>
+            <Insulation>
+              <SystemIdentifier id='Surface_18Insulation'/>
+              <AssemblyEffectiveRValue>12.7</AssemblyEffectiveRValue>
+            </Insulation>
+          </Wall>
+          <Wall>
+            <SystemIdentifier id='Surface_20'/>
+            <ExteriorAdjacentTo>outside</ExteriorAdjacentTo>
+            <InteriorAdjacentTo>living space</InteriorAdjacentTo>
+            <WallType>
+              <WoodStud/>
+            </WallType>
+            <Area>150</Area>
+            <Orientation dataSource='software'>south</Orientation>
+            <Azimuth>180</Azimuth>
+            <Siding>wood siding</Siding>
+            <Color>light</Color>
+            <SolarAbsorptance dataSource='software'>0.5</SolarAbsorptance>
+            <Emittance dataSource='software'>0.9</Emittance>
+            <Insulation>
+              <SystemIdentifier id='Surface_20Insulation'/>
+              <AssemblyEffectiveRValue>19.6</AssemblyEffectiveRValue>
+            </Insulation>
+          </Wall>
+          <Wall>
+            <SystemIdentifier id='Surface_2'/>
+            <ExteriorAdjacentTo>outside</ExteriorAdjacentTo>
+            <InteriorAdjacentTo>living space</InteriorAdjacentTo>
+            <WallType>
+              <WoodStud/>
+            </WallType>
+            <Area>278.15</Area>
+            <Orientation dataSource='software'>west</Orientation>
+            <Azimuth>270</Azimuth>
+            <Siding>wood siding</Siding>
+            <Color>light</Color>
+            <SolarAbsorptance dataSource='software'>0.5</SolarAbsorptance>
+            <Emittance dataSource='software'>0.9</Emittance>
+            <Insulation>
+              <SystemIdentifier id='Surface_2Insulation'/>
+              <AssemblyEffectiveRValue>12.7</AssemblyEffectiveRValue>
+            </Insulation>
+          </Wall>
+          <Wall>
+            <SystemIdentifier id='Surface_3'/>
+            <ExteriorAdjacentTo>outside</ExteriorAdjacentTo>
+            <InteriorAdjacentTo>living space</InteriorAdjacentTo>
+            <WallType>
+              <WoodStud/>
+            </WallType>
+            <Area>500.67</Area>
+            <Orientation dataSource='software'>north</Orientation>
+            <Azimuth>0</Azimuth>
+            <Siding>wood siding</Siding>
+            <Color>light</Color>
+            <SolarAbsorptance dataSource='software'>0.5</SolarAbsorptance>
+            <Emittance dataSource='software'>0.9</Emittance>
+            <Insulation>
+              <SystemIdentifier id='Surface_3Insulation'/>
+              <AssemblyEffectiveRValue>12.7</AssemblyEffectiveRValue>
+            </Insulation>
+          </Wall>
+          <Wall>
+            <SystemIdentifier id='Surface_4'/>
+            <ExteriorAdjacentTo>outside</ExteriorAdjacentTo>
+            <InteriorAdjacentTo>living space</InteriorAdjacentTo>
+            <WallType>
+              <WoodStud/>
+            </WallType>
+            <Area>278.15</Area>
+            <Orientation dataSource='software'>east</Orientation>
+            <Azimuth>90</Azimuth>
+            <Siding>wood siding</Siding>
+            <Color>light</Color>
+            <SolarAbsorptance dataSource='software'>0.5</SolarAbsorptance>
+            <Emittance dataSource='software'>0.9</Emittance>
+            <Insulation>
+              <SystemIdentifier id='Surface_4Insulation'/>
+              <AssemblyEffectiveRValue>12.7</AssemblyEffectiveRValue>
+            </Insulation>
+          </Wall>
+          <Wall>
+            <SystemIdentifier id='Surface_19'/>
+            <ExteriorAdjacentTo>attic - vented</ExteriorAdjacentTo>
+            <AtticWallType>knee wall</AtticWallType>
+            <WallType>
+              <WoodStud/>
+            </WallType>
+            <Area>500</Area>
+            <Insulation>
+              <SystemIdentifier id='Surface_19Insulation'/>
+              <AssemblyEffectiveRValue>5.0</AssemblyEffectiveRValue>
+            </Insulation>
+          </Wall>
+          <Wall>
+            <SystemIdentifier id='Surface_23'/>
+            <ExteriorAdjacentTo>attic - unvented</ExteriorAdjacentTo>
+            <AtticWallType>knee wall</AtticWallType>
+            <WallType>
+              <WoodStud/>
+            </WallType>
+            <Area>500</Area>
+            <Insulation>
+              <SystemIdentifier id='Surface_23Insulation'/>
+              <AssemblyEffectiveRValue>5.0</AssemblyEffectiveRValue>
+            </Insulation>
+          </Wall>
+        </Walls>
+        <FoundationWalls>
+          <FoundationWall>
+            <SystemIdentifier id='Surface_13'/>
+            <ExteriorAdjacentTo>ground</ExteriorAdjacentTo>
+            <InteriorAdjacentTo>crawlspace - unvented</InteriorAdjacentTo>
+            <Height>4.0</Height>
+            <Area>778.84</Area>
+            <Thickness dataSource='software'>8.0</Thickness>
+            <DepthBelowGrade>3.0</DepthBelowGrade>
+            <Insulation>
+              <SystemIdentifier id='Surface_13Insulation'/>
+              <Layer>
+                <InstallationType>continuous - exterior</InstallationType>
+                <NominalRValue>5.0</NominalRValue>
+                <extension>
+                  <DistanceToTopOfInsulation>0.0</DistanceToTopOfInsulation>
+                  <DistanceToBottomOfInsulation dataSource='software'>4.0</DistanceToBottomOfInsulation>
+                </extension>
+              </Layer>
+              <Layer>
+                <InstallationType>continuous - interior</InstallationType>
+                <NominalRValue>0.0</NominalRValue>
+                <extension>
+                  <DistanceToTopOfInsulation dataSource='software'>0.0</DistanceToTopOfInsulation>
+                  <DistanceToBottomOfInsulation dataSource='software'>4.0</DistanceToBottomOfInsulation>
+                </extension>
+              </Layer>
+            </Insulation>
+          </FoundationWall>
+        </FoundationWalls>
+        <FrameFloors>
+          <FrameFloor>
+            <SystemIdentifier id='Surface_1'/>
+            <ExteriorAdjacentTo>crawlspace - unvented</ExteriorAdjacentTo>
+            <InteriorAdjacentTo>living space</InteriorAdjacentTo>
+            <Area>2176.0</Area>
+            <Insulation>
+              <SystemIdentifier id='Surface_1Insulation'/>
+              <AssemblyEffectiveRValue>32.9</AssemblyEffectiveRValue>
+            </Insulation>
+          </FrameFloor>
+          <FrameFloor>
+            <SystemIdentifier id='Surface_6'/>
+            <ExteriorAdjacentTo>attic - vented</ExteriorAdjacentTo>
+            <InteriorAdjacentTo>living space</InteriorAdjacentTo>
+            <Area>725</Area>
+            <Insulation>
+              <SystemIdentifier id='Surface_6Insulation'/>
+              <AssemblyEffectiveRValue>39.6</AssemblyEffectiveRValue>
+            </Insulation>
+          </FrameFloor>
+          <FrameFloor>
+            <SystemIdentifier id='Surface_24'/>
+            <ExteriorAdjacentTo>attic - unvented</ExteriorAdjacentTo>
+            <InteriorAdjacentTo>living space</InteriorAdjacentTo>
+            <Area>725</Area>
+            <Insulation>
+              <SystemIdentifier id='Surface_24Insulation'/>
+              <AssemblyEffectiveRValue>19.6</AssemblyEffectiveRValue>
+            </Insulation>
+          </FrameFloor>
+          <FrameFloor>
+            <SystemIdentifier id='Surface_27'/>
+            <ExteriorAdjacentTo>attic - unvented</ExteriorAdjacentTo>
+            <InteriorAdjacentTo>living space</InteriorAdjacentTo>
+            <Area>726</Area>
+            <Insulation>
+              <SystemIdentifier id='Surface_27Insulation'/>
+              <AssemblyEffectiveRValue>29.6</AssemblyEffectiveRValue>
+            </Insulation>
+          </FrameFloor>
+        </FrameFloors>
+        <Slabs>
+          <Slab>
+            <SystemIdentifier id='Surface_12'/>
+            <InteriorAdjacentTo>crawlspace - unvented</InteriorAdjacentTo>
+            <Area>2176.0</Area>
+            <Thickness>0.0</Thickness>
+            <ExposedPerimeter>194.7</ExposedPerimeter>
+            <PerimeterInsulationDepth>0.0</PerimeterInsulationDepth>
+            <UnderSlabInsulationWidth>0.0</UnderSlabInsulationWidth>
+            <PerimeterInsulation>
+              <SystemIdentifier id='Surface_12PerimeterInsulation'/>
+              <Layer>
+                <NominalRValue>0.0</NominalRValue>
+              </Layer>
+            </PerimeterInsulation>
+            <UnderSlabInsulation>
+              <SystemIdentifier id='Surface_12UnderSlabInsulation'/>
+              <Layer>
+                <NominalRValue>0.0</NominalRValue>
+              </Layer>
+            </UnderSlabInsulation>
+            <extension>
+              <CarpetFraction dataSource='software'>0.0</CarpetFraction>
+              <CarpetRValue dataSource='software'>0.0</CarpetRValue>
+            </extension>
+          </Slab>
+        </Slabs>
+        <Windows>
+          <Window>
+            <SystemIdentifier id='Surface_2_-_Window_1_left'/>
+            <Area>16.68</Area>
+            <Azimuth>270</Azimuth>
+            <Orientation dataSource='software'>west</Orientation>
+            <UFactor>0.47</UFactor>
+            <SHGC>0.54</SHGC>
+            <ExteriorShading>
+              <SystemIdentifier id='Surface_2_-_Window_1_leftExteriorShading'/>
+              <SummerShadingCoefficient dataSource='software'>1.0</SummerShadingCoefficient>
+              <WinterShadingCoefficient dataSource='software'>1.0</WinterShadingCoefficient>
+            </ExteriorShading>
+            <InteriorShading>
+              <SystemIdentifier id='Surface_2_-_Window_1_leftInteriorShading'/>
+              <SummerShadingCoefficient>0.5</SummerShadingCoefficient>
+              <WinterShadingCoefficient>0.7</WinterShadingCoefficient>
+            </InteriorShading>
+            <Overhangs>
+              <Depth>2.0</Depth>
+              <DistanceToTopOfWindow>1.0</DistanceToTopOfWindow>
+              <DistanceToBottomOfWindow>4.3</DistanceToBottomOfWindow>
+            </Overhangs>
+            <AttachedToWall idref='Surface_2'/>
+          </Window>
+          <Window>
+            <SystemIdentifier id='Surface_3_-_Window_1_back'/>
+            <Area>30.03</Area>
+            <Azimuth>0</Azimuth>
+            <Orientation dataSource='software'>north</Orientation>
+            <UFactor>0.47</UFactor>
+            <SHGC>0.54</SHGC>
+            <ExteriorShading>
+              <SystemIdentifier id='Surface_3_-_Window_1_backExteriorShading'/>
+              <SummerShadingCoefficient dataSource='software'>1.0</SummerShadingCoefficient>
+              <WinterShadingCoefficient dataSource='software'>1.0</WinterShadingCoefficient>
+            </ExteriorShading>
+            <InteriorShading>
+              <SystemIdentifier id='Surface_3_-_Window_1_backInteriorShading'/>
+              <SummerShadingCoefficient>0.5</SummerShadingCoefficient>
+              <WinterShadingCoefficient>0.7</WinterShadingCoefficient>
+            </InteriorShading>
+            <Overhangs>
+              <Depth>2.0</Depth>
+              <DistanceToTopOfWindow>1.0</DistanceToTopOfWindow>
+              <DistanceToBottomOfWindow>4.7</DistanceToBottomOfWindow>
+            </Overhangs>
+            <AttachedToWall idref='Surface_3'/>
+          </Window>
+          <Window>
+            <SystemIdentifier id='Surface_4_-_Window_1_right'/>
+            <Area>16.68</Area>
+            <Azimuth>90</Azimuth>
+            <Orientation dataSource='software'>east</Orientation>
+            <UFactor>0.47</UFactor>
+            <SHGC>0.54</SHGC>
+            <ExteriorShading>
+              <SystemIdentifier id='Surface_4_-_Window_1_rightExteriorShading'/>
+              <SummerShadingCoefficient dataSource='software'>1.0</SummerShadingCoefficient>
+              <WinterShadingCoefficient dataSource='software'>1.0</WinterShadingCoefficient>
+            </ExteriorShading>
+            <InteriorShading>
+              <SystemIdentifier id='Surface_4_-_Window_1_rightInteriorShading'/>
+              <SummerShadingCoefficient>0.5</SummerShadingCoefficient>
+              <WinterShadingCoefficient>0.7</WinterShadingCoefficient>
+            </InteriorShading>
+            <Overhangs>
+              <Depth>2.0</Depth>
+              <DistanceToTopOfWindow>1.0</DistanceToTopOfWindow>
+              <DistanceToBottomOfWindow>4.3</DistanceToBottomOfWindow>
+            </Overhangs>
+            <AttachedToWall idref='Surface_4'/>
+          </Window>
+          <Window>
+            <SystemIdentifier id='Surface_5_-_Window_1_front'/>
+            <Area>30.03</Area>
+            <Azimuth>180</Azimuth>
+            <Orientation dataSource='software'>south</Orientation>
+            <UFactor>0.47</UFactor>
+            <SHGC>0.54</SHGC>
+            <ExteriorShading>
+              <SystemIdentifier id='Surface_5_-_Window_1_frontExteriorShading'/>
+              <SummerShadingCoefficient dataSource='software'>1.0</SummerShadingCoefficient>
+              <WinterShadingCoefficient dataSource='software'>1.0</WinterShadingCoefficient>
+            </ExteriorShading>
+            <InteriorShading>
+              <SystemIdentifier id='Surface_5_-_Window_1_frontInteriorShading'/>
+              <SummerShadingCoefficient>0.5</SummerShadingCoefficient>
+              <WinterShadingCoefficient>0.7</WinterShadingCoefficient>
+            </InteriorShading>
+            <Overhangs>
+              <Depth>2.0</Depth>
+              <DistanceToTopOfWindow>0.0</DistanceToTopOfWindow>
+              <DistanceToBottomOfWindow>3.7</DistanceToBottomOfWindow>
+            </Overhangs>
+            <AttachedToWall idref='Surface_18'/>
+          </Window>
+        </Windows>
+        <Doors>
+          <Door>
+            <SystemIdentifier id='Surface_5_-_Door_front'/>
+            <AttachedToWall idref='Surface_18'/>
+            <Area>20.0</Area>
+            <Azimuth>180</Azimuth>
+            <Orientation dataSource='software'>south</Orientation>
+            <RValue>5.0</RValue>
+          </Door>
+        </Doors>
+      </Enclosure>
+      <Systems>
+        <HVAC>
+          <HVACPlant>
+            <HeatingSystem>
+              <SystemIdentifier id='HeatingSystem'/>
+              <DistributionSystem idref='AirDistribution'/>
+              <HeatingSystemType>
+                <Furnace/>
+              </HeatingSystemType>
+              <HeatingSystemFuel>electricity</HeatingSystemFuel>
+              <HeatingCapacity dataSource='software'>33698.0</HeatingCapacity>
+              <AnnualHeatingEfficiency>
+                <Units>AFUE</Units>
+                <Value>1.0</Value>
+              </AnnualHeatingEfficiency>
+              <FractionHeatLoadServed>1.0</FractionHeatLoadServed>
+              <extension>
+                <FanPowerWattsPerCFM dataSource='software'>0.375</FanPowerWattsPerCFM>
+                <AirflowDefectRatio dataSource='software'>0.0</AirflowDefectRatio>
+                <HeatingAirflowCFM dataSource='software'>634.0</HeatingAirflowCFM>
+              </extension>
+            </HeatingSystem>
+            <CoolingSystem>
+              <SystemIdentifier id='CoolingSystem'/>
+              <DistributionSystem idref='AirDistribution'/>
+              <CoolingSystemType>central air conditioner</CoolingSystemType>
+              <CoolingSystemFuel>electricity</CoolingSystemFuel>
+              <CoolingCapacity dataSource='software'>55235.0</CoolingCapacity>
+              <FractionCoolLoadServed>1.0</FractionCoolLoadServed>
+              <AnnualCoolingEfficiency>
+                <Units>SEER</Units>
+                <Value>13.0</Value>
+              </AnnualCoolingEfficiency>
+              <SensibleHeatFraction dataSource='software'>0.73</SensibleHeatFraction>
+              <extension>
+                <AirflowDefectRatio dataSource='software'>0.0</AirflowDefectRatio>
+                <ChargeDefectRatio dataSource='software'>0.0</ChargeDefectRatio>
+                <FanPowerWattsPerCFM dataSource='software'>0.375</FanPowerWattsPerCFM>
+                <CoolingAirflowCFM dataSource='software'>2297.0</CoolingAirflowCFM>
+              </extension>
+            </CoolingSystem>
+            <extension>
+              <DesignLoads dataSource='software'>
+                <Heating>
+                  <Total>33698.0</Total>
+                  <Ducts>10004.0</Ducts>
+                  <Windows>5338.0</Windows>
+                  <Skylights>0.0</Skylights>
+                  <Doors>115.0</Doors>
+                  <Walls>5422.0</Walls>
+                  <Roofs>0.0</Roofs>
+                  <Floors>285.0</Floors>
+                  <Slabs>3465.0</Slabs>
+                  <Ceilings>1027.0</Ceilings>
+                  <InfilVent>8042.0</InfilVent>
+                </Heating>
+                <CoolingSensible>
+                  <Total>47004.0</Total>
+                  <Ducts>14650.0</Ducts>
+                  <Windows>11402.0</Windows>
+                  <Skylights>0.0</Skylights>
+                  <Doors>177.0</Doors>
+                  <Walls>8587.0</Walls>
+                  <Roofs>0.0</Roofs>
+                  <Floors>713.0</Floors>
+                  <Slabs>0.0</Slabs>
+                  <Ceilings>1547.0</Ceilings>
+                  <InfilVent>7407.0</InfilVent>
+                  <InternalGains>2520.0</InternalGains>
+                </CoolingSensible>
+                <CoolingLatent>
+                  <Total>0.0</Total>
+                  <Ducts>0.0</Ducts>
+                  <InfilVent>0.0</InfilVent>
+                  <InternalGains>0.0</InternalGains>
+                </CoolingLatent>
+              </DesignLoads>
+            </extension>
+          </HVACPlant>
+          <HVACDistribution>
+            <SystemIdentifier id='AirDistribution'/>
+            <DistributionSystemType>
+              <AirDistribution>
+                <AirDistributionType>regular velocity</AirDistributionType>
+                <DuctLeakageMeasurement>
+                  <DuctType>supply</DuctType>
+                  <DuctLeakage>
+                    <Units>CFM25</Units>
+                    <Value>224.77</Value>
+                    <TotalOrToOutside>to outside</TotalOrToOutside>
+                  </DuctLeakage>
+                </DuctLeakageMeasurement>
+                <DuctLeakageMeasurement>
+                  <DuctType>return</DuctType>
+                  <DuctLeakage>
+                    <Units>CFM25</Units>
+                    <Value>113.23</Value>
+                    <TotalOrToOutside>to outside</TotalOrToOutside>
+                  </DuctLeakage>
+                </DuctLeakageMeasurement>
+                <Ducts>
+                  <DuctType>supply</DuctType>
+                  <DuctInsulationRValue>4.0</DuctInsulationRValue>
+                  <DuctLocation dataSource='software'>attic - vented</DuctLocation>
+                  <FractionDuctArea dataSource='software'>0.75</FractionDuctArea>
+                  <DuctSurfaceArea dataSource='software'>342.225</DuctSurfaceArea>
+                </Ducts>
+                <Ducts>
+                  <DuctType>return</DuctType>
+                  <DuctInsulationRValue>4.0</DuctInsulationRValue>
+                  <DuctLocation dataSource='software'>attic - vented</DuctLocation>
+                  <FractionDuctArea dataSource='software'>0.75</FractionDuctArea>
+                  <DuctSurfaceArea dataSource='software'>126.75</DuctSurfaceArea>
+                </Ducts>
+                <Ducts>
+                  <DuctType>supply</DuctType>
+                  <DuctInsulationRValue>4.0</DuctInsulationRValue>
+                  <DuctLocation dataSource='software'>living space</DuctLocation>
+                  <FractionDuctArea dataSource='software'>0.25</FractionDuctArea>
+                  <DuctSurfaceArea dataSource='software'>114.075</DuctSurfaceArea>
+                </Ducts>
+                <Ducts>
+                  <DuctType>return</DuctType>
+                  <DuctInsulationRValue>4.0</DuctInsulationRValue>
+                  <DuctLocation dataSource='software'>living space</DuctLocation>
+                  <FractionDuctArea dataSource='software'>0.25</FractionDuctArea>
+                  <DuctSurfaceArea dataSource='software'>42.25</DuctSurfaceArea>
+                </Ducts>
+                <NumberofReturnRegisters dataSource='software'>2</NumberofReturnRegisters>
+              </AirDistribution>
+            </DistributionSystemType>
+            <ConditionedFloorAreaServed>1690.0</ConditionedFloorAreaServed>
+          </HVACDistribution>
+        </HVAC>
+        <WaterHeating>
+          <WaterHeatingSystem>
+            <SystemIdentifier id='WaterHeater'/>
+            <FuelType>electricity</FuelType>
+            <WaterHeaterType>storage water heater</WaterHeaterType>
+            <Location dataSource='software'>garage</Location>
+            <TankVolume dataSource='software'>50.0</TankVolume>
+            <FractionDHWLoadServed>1.0</FractionDHWLoadServed>
+            <HeatingCapacity dataSource='software'>18767.0</HeatingCapacity>
+            <EnergyFactor>0.92</EnergyFactor>
+            <RecoveryEfficiency dataSource='software'>0.98</RecoveryEfficiency>
+            <HotWaterTemperature>125.0</HotWaterTemperature>
+          </WaterHeatingSystem>
+          <HotWaterDistribution>
+            <SystemIdentifier id='HotWaterDistribution'/>
+            <SystemType>
+              <Standard>
+                <PipingLength dataSource='software'>78.13776741499453</PipingLength>
+              </Standard>
+            </SystemType>
+            <PipeInsulation>
+              <PipeRValue>0.0</PipeRValue>
+            </PipeInsulation>
+          </HotWaterDistribution>
+          <WaterFixture>
+            <SystemIdentifier id='ShowerFixture'/>
+            <WaterFixtureType>shower head</WaterFixtureType>
+            <LowFlow>false</LowFlow>
+          </WaterFixture>
+          <WaterFixture>
+            <SystemIdentifier id='SinkFixture'/>
+            <WaterFixtureType>faucet</WaterFixtureType>
+            <LowFlow>false</LowFlow>
+          </WaterFixture>
+        </WaterHeating>
+      </Systems>
+    </BuildingDetails>
+  </Building>
+</HPXML>
\ No newline at end of file
diff --git a/hescorehpxml/base.py b/hescorehpxml/base.py
index e0740c30..80825b0d 100644
--- a/hescorehpxml/base.py
+++ b/hescorehpxml/base.py
@@ -2,7 +2,7 @@ from __future__ import division
 from builtins import map
 from builtins import zip
 from builtins import object
-from past.utils import old_div
+import csv
 import datetime as dt
 import json
 import math
@@ -91,6 +91,10 @@ class HPXMLtoHEScoreTranslatorBase(object):
             )
         self.ns = {'xs': 'http://www.w3.org/2001/XMLSchema'}
         self.ns['h'] = schematree.xpath('//xs:schema/@targetNamespace', namespaces=self.ns)[0]
+        self._wall_assembly_eff_rvalues = None
+        self._roof_assembly_eff_rvalues = None
+        self._ceiling_assembly_eff_rvalues = None
+        self._floor_assembly_eff_rvalues = None
 
     def xpath(self, el, xpathquery, aslist=False, raise_err=False, **kwargs):
         if isinstance(el, etree._ElementTree):
@@ -153,9 +157,8 @@ class HPXMLtoHEScoreTranslatorBase(object):
         # Write out the scrubbed doc
         etree.ElementTree(root).write(outfile_obj, pretty_print=True)
 
-    def get_wall_assembly_code(self, hpxmlwall):
+    def get_wall_assembly_code_and_rvalue(self, hpxmlwall):
         xpath = self.xpath
-        ns = self.ns
         wallid = xpath(hpxmlwall, 'h:SystemIdentifier/@id', raise_err=True)
 
         # siding
@@ -179,49 +182,26 @@ class HPXMLtoHEScoreTranslatorBase(object):
 
         # construction type
         wall_type = xpath(hpxmlwall, 'name(h:WallType/*)', raise_err=True)
-        for layer in xpath(hpxmlwall, 'h:Insulation/h:Layer', aslist=True):
-            if xpath(layer, 'h:NominalRValue') is None:
-                raise TranslationError('Every wall insulation layer needs a NominalRValue, (wallid = "%s")' % wallid)
+        assembly_eff_rvalue = None
+
+        # Assembly effective R-value or None if element not present
+        assembly_eff_rvalue = self.get_wall_assembly_rvalue(hpxmlwall, hpxmlwall)
+
+        # Siding
         if wall_type == 'WoodStud':
-            wall_rvalue = xpath(hpxmlwall, 'sum(h:Insulation/h:Layer/h:NominalRValue)', raise_err=True)
-            has_rigid_ins = xpath(
-                hpxmlwall,
-                'boolean(h:Insulation/h:Layer[h:NominalRValue > 0][h:InstallationType="continuous"])'
-            )
-            if tobool(xpath(hpxmlwall, 'h:WallType/h:WoodStud/h:ExpandedPolystyreneSheathing/text()')) or has_rigid_ins:
-                wallconstype = 'ps'
-                # account for the rigid foam sheathing in the construction code
-                wall_rvalue -= 5
-                rvalue = wall_round_to_nearest(wall_rvalue, (0, 3, 7, 11, 13, 15, 19, 21))
-            elif tobool(xpath(hpxmlwall, 'h:WallType/h:WoodStud/h:OptimumValueEngineering/text()')):
-                wallconstype = 'ov'
-                rvalue = wall_round_to_nearest(wall_rvalue, (19, 21, 27, 33, 38))
-            else:
-                wallconstype = 'wf'
-                rvalue = wall_round_to_nearest(wall_rvalue, (0, 3, 7, 11, 13, 15, 19, 21))
             hpxmlsiding = xpath(hpxmlwall, 'h:Siding/text()')
             try:
                 sidingtype = sidingmap[hpxmlsiding]
             except KeyError:
-                raise TranslationError('Wall %s: Exterior finish information is missing' % wallid)
+                raise TranslationError(f'Wall {wallid}: Exterior finish information is missing')
             else:
                 if sidingtype is None:
                     raise TranslationError(
-                        'Wall %s: There is no HEScore wall siding equivalent for the HPXML option: %s' %
-                        (wallid, hpxmlsiding))
+                        f'Wall {wallid}: There is no HEScore wall siding equivalent for the HPXML option: {hpxmlsiding}'
+                    )
         elif wall_type == 'StructuralBrick':
-            wallconstype = 'br'
             sidingtype = 'nn'
-            rvalue = 0
-            for lyr in hpxmlwall.xpath('h:Insulation/h:Layer', namespaces=ns):
-                rvalue += float(xpath(lyr, 'h:NominalRValue/text()', raise_err=True))
-            rvalue = wall_round_to_nearest(rvalue, (0, 5, 10))
         elif wall_type in ('ConcreteMasonryUnit', 'Stone'):
-            wallconstype = 'cb'
-            rvalue = 0
-            for lyr in hpxmlwall.xpath('h:Insulation/h:Layer', namespaces=ns):
-                rvalue += float(xpath(lyr, 'h:NominalRValue/text()'))
-            rvalue = wall_round_to_nearest(rvalue, (0, 3, 6))
             hpxmlsiding = xpath(hpxmlwall, 'h:Siding/text()')
             if hpxmlsiding is None:
                 sidingtype = 'nn'
@@ -229,17 +209,76 @@ class HPXMLtoHEScoreTranslatorBase(object):
                 sidingtype = sidingmap[hpxmlsiding]
                 if sidingtype not in ('st', 'br'):
                     raise TranslationError(
-                        'Wall {}: is a CMU and needs a siding of stucco, brick, or none to translate to HEScore. '
-                        'It has a siding type of {}'.format(wallid, hpxmlsiding)
+                        f'Wall {wallid}: is a CMU and needs a siding of stucco, brick, or none to translate '
+                        f'to HEScore. It has a siding type of {hpxmlsiding}'
                     )
         elif wall_type == 'StrawBale':
-            wallconstype = 'sb'
-            rvalue = 0
             sidingtype = 'st'
         else:
-            raise TranslationError('Wall type %s not supported, wall id: %s' % (wall_type, wallid))
+            raise TranslationError(f'Wall type {wall_type} not supported, wall id: {wallid}')
 
-        return 'ew%s%02d%s' % (wallconstype, rvalue, sidingtype)
+        # R-value and construction code
+        if assembly_eff_rvalue is not None:
+            # If there's an AssemblyEffectiveRValue element
+            try:
+                doe2walltypes = {
+                    'WoodStud': ('ps', 'ov', 'wf'),
+                    'StructuralBrick': ('br',),
+                    'ConcreteMasonryUnit': ('cb',),
+                    'Stone': ('cb',),
+                    'StrawBale': ('st',)
+                }[wall_type]
+            except KeyError:
+                raise TranslationError(f'Wall type {wall_type} not supported, wall id: {wallid}')
+            closest_wall_code, closest_code_rvalue = min(
+                [(doe2code, code_rvalue)
+                 for doe2code, code_rvalue in self.wall_assembly_eff_rvalues.items()
+                 if doe2code[2:4] in doe2walltypes and doe2code[6:8] == sidingtype],
+                key=lambda x: abs(x[1] - assembly_eff_rvalue)
+            )
+            return closest_wall_code, assembly_eff_rvalue
+
+        elif self.every_wall_layer_has_nominal_rvalue(hpxmlwall, hpxmlwall):
+            # If the wall as a NominalRValue element for every layer (or there are no layers)
+            # and there isn't an AssemblyEffectiveRValue element
+            wall_rvalue = xpath(hpxmlwall, 'sum(h:Insulation/h:Layer/h:NominalRValue)', raise_err=True)
+            if wall_type == 'WoodStud':
+                has_rigid_ins = xpath(
+                    hpxmlwall,
+                    'boolean(h:Insulation/h:Layer[h:NominalRValue > 0][h:InstallationType="continuous"][boolean('
+                    'h:InsulationMaterial/h:Rigid)])'
+                )
+                if has_rigid_ins or\
+                        tobool(xpath(hpxmlwall, 'h:WallType/h:WoodStud/h:ExpandedPolystyreneSheathing/text()')):
+                    wallconstype = 'ps'
+                    # account for the rigid foam sheathing in the construction code
+                    wall_rvalue = max(0, wall_rvalue - 5)
+                    rvalue = wall_round_to_nearest(wall_rvalue, (0, 3, 7, 11, 13, 15, 19, 21))
+                elif tobool(xpath(hpxmlwall, 'h:WallType/h:WoodStud/h:OptimumValueEngineering/text()')):
+                    wallconstype = 'ov'
+                    rvalue = wall_round_to_nearest(wall_rvalue, (19, 21, 27, 33, 38))
+                else:
+                    wallconstype = 'wf'
+                    rvalue = wall_round_to_nearest(wall_rvalue, (0, 3, 7, 11, 13, 15, 19, 21))
+            elif wall_type == 'StructuralBrick':
+                wallconstype = 'br'
+                rvalue = wall_round_to_nearest(wall_rvalue, (0, 5, 10))
+            elif wall_type in ('ConcreteMasonryUnit', 'Stone'):
+                wallconstype = 'cb'
+                rvalue = wall_round_to_nearest(wall_rvalue, (0, 3, 6))
+            else:
+                # We will have already thrown an error above if this is another wall type.
+                assert wall_type == 'StrawBale'
+                wallconstype = 'sb'
+                rvalue = 0
+
+            wall_code = f'ew{wallconstype}{rvalue:02d}{sidingtype}'
+            assembly_eff_rvalue = self.wall_assembly_eff_rvalues[wall_code]
+            return wall_code, assembly_eff_rvalue
+
+        else:
+            raise TranslationError('Every wall insulation layer needs a NominalRValue or '
+                                   f'AssemblyEffectiveRValue needs to be defined, (wallid = "{wallid}")')
 
     def get_window_code(self, window):
         # Please review the refactoring for this function
@@ -381,21 +420,17 @@ class HPXMLtoHEScoreTranslatorBase(object):
                           'ground-to-air': 'gchp',
                           'ground-to-water': 'gchp'}
 
-    def get_attic_knee_wall_rvalue_and_area(self, attic, b):
-        knee_walls = self.get_attic_knee_walls(attic, b)
-        if len(knee_walls) == 0:
-            return 0, 0
-        if len(knee_walls) == 1:
-            knee_wall_r = convert_to_type(float, self.xpath(knee_walls[0], 'sum(h:Insulation/h:Layer/h:NominalRValue)'))
-            knee_wall_area = convert_to_type(float, self.xpath(knee_walls[0], 'h:Area/text()'))
-            return knee_wall_r, knee_wall_area
-
+    def get_attic_knee_wall_rvalue_and_area(self, attic, b, knee_walls):
         knee_wall_dict_ls = []
         for knee_wall in knee_walls:
+            assembly_eff_rvalue = self.get_wall_assembly_rvalue(knee_wall, knee_wall)
+            if assembly_eff_rvalue is not None:
+                rvalue = assembly_eff_rvalue
+            elif self.every_wall_layer_has_nominal_rvalue(knee_wall, knee_wall):
+                rvalue = self.xpath(knee_wall, 'sum(h:Insulation/h:Layer/h:NominalRValue)')
             wall_area = convert_to_type(float, self.xpath(knee_wall, 'h:Area/text()'))
             if wall_area is None:
                 raise TranslationError('All attic knee walls need an Area specified')
-            rvalue = self.xpath(knee_wall, 'sum(h:Insulation/h:Layer/h:NominalRValue)')
             knee_wall_dict_ls.append({'area': wall_area, 'rvalue': rvalue})
         # Average
         knee_wall_area = sum(x['area'] for x in knee_wall_dict_ls)
@@ -613,7 +648,7 @@ class HPXMLtoHEScoreTranslatorBase(object):
 
         # Renormalize duct fractions so they add up to one (handles supply/return method if both are specified)
         total_duct_frac = sum(duct_fracs_by_hescore_duct_loc.values())
-        duct_fracs_by_hescore_duct_loc = dict([(key, old_div(value, total_duct_frac))
+        duct_fracs_by_hescore_duct_loc = dict([(key, value / total_duct_frac)
                                                for key, value
                                                in list(duct_fracs_by_hescore_duct_loc.items())])
 
@@ -832,7 +867,7 @@ class HPXMLtoHEScoreTranslatorBase(object):
         for zone_floor in bldg['zone']['zone_floor']:
             if zone_floor['foundation_type'] == 'cond_basement':
                 cond_basement_floor_area += zone_floor['floor_area']
-        return int(python2round(old_div((floor_area - cond_basement_floor_area), stories)))
+        return math.floor((floor_area - cond_basement_floor_area) / stories)
 
     @classmethod
     def remove_hidden_keys(cls, d):
@@ -1051,29 +1086,62 @@ class HPXMLtoHEScoreTranslatorBase(object):
             bldg_about['comments'] = xpath(p, 'h:ProjectDetails/h:Notes/text()')
         return bldg_about
 
+    def get_assembly_eff_rvalues_dict(self, construction):
+        assert construction in ['wall', 'roof', 'ceiling', 'floor']
+        with open(os.path.join(thisdir, 'lookups', f'lu_{construction}_eff_rvalue.csv'), newline='') as f:
+            reader = csv.DictReader(f)
+            assembly_eff_rvalues = {}
+            for row in reader:
+                assembly_eff_rvalues[row['doe2code']] = float(row['Eff-R-value'])
+        return assembly_eff_rvalues
+
+    @property
+    def wall_assembly_eff_rvalues(self):
+        if self._wall_assembly_eff_rvalues is None:
+            self._wall_assembly_eff_rvalues = self.get_assembly_eff_rvalues_dict('wall')
+        return self._wall_assembly_eff_rvalues
+
+    @property
+    def roof_assembly_eff_rvalues(self):
+        if self._roof_assembly_eff_rvalues is None:
+            self._roof_assembly_eff_rvalues = self.get_assembly_eff_rvalues_dict('roof')
+        return self._roof_assembly_eff_rvalues
+
+    @property
+    def ceiling_assembly_eff_rvalues(self):
+        if self._ceiling_assembly_eff_rvalues is None:
+            self._ceiling_assembly_eff_rvalues = self.get_assembly_eff_rvalues_dict('ceiling')
+        return self._ceiling_assembly_eff_rvalues
+
+    @property
+    def floor_assembly_eff_rvalues(self):
+        if self._floor_assembly_eff_rvalues is None:
+            self._floor_assembly_eff_rvalues = self.get_assembly_eff_rvalues_dict('floor')
+        return self._floor_assembly_eff_rvalues
+
     def get_building_zone_roof(self, b, footprint_area):
+
+        def get_predominant_roof_property(atticd, attic_key):
+            roof_area_by_cat = {}
+            for atticd in atticds:
+                try:
+                    roof_area_by_cat[atticd[attic_key]] += atticd['roof_area']
+                except KeyError:
+                    roof_area_by_cat[atticd[attic_key]] = atticd['roof_area']
+
+            return max(roof_area_by_cat, key=lambda x: roof_area_by_cat[x])
+
+        def roof_round_to_nearest(roofid, *args):
+            try:
+                return round_to_nearest(*args, tails_tolerance=3)
+            except RoundOutOfBounds:
+                raise TranslationError('Roof R-value outside HEScore bounds, roof id: %s' % roofid)
+
         xpath = self.xpath
 
         # building.zone.zone_roof--------------------------------------------------
         attics = xpath(b, 'descendant::h:Attics/h:Attic', aslist=True, raise_err=True)
         roofs = xpath(b, 'descendant::h:Roof', aslist=True, raise_err=True)
-        attic_floor_rvalues = (0, 3, 6, 9, 11, 19, 21, 25, 30, 38, 44, 49, 60)
-        roof_center_of_cavity_rvalues = \
-            {'wf': {'co': dict(zip((0, 11, 13, 15, 19, 21, 27, 30), (2.7, 13.6, 15.6, 17.6, 21.6, 23.6, 29.6, 32.6))),
-                    'wo': dict(zip((0, 11, 13, 15, 19, 21, 27, 30), (3.2, 14.1, 16.1, 18.1, 22.1, 24.1, 30.1, 33.1))),
-                    'rc': dict(zip((0, 11, 13, 15, 19, 21, 27, 30), (2.2, 13.2, 15.2, 17.2, 21.2, 23.2, 29.2, 32.2))),
-                    'lc': dict(zip((0, 11, 13, 15, 19, 21, 27, 30), (2.3, 13.2, 15.2, 17.2, 21.2, 23.2, 29.2, 32.2))),
-                    'tg': dict(zip((0, 11, 13, 15, 19, 21, 27, 30), (2.3, 13.2, 15.2, 17.2, 21.2, 23.2, 29.2, 32.2)))},
-             'rb': {'co': {0: 5},
-                    'wo': {0: 5.5},
-                    'rc': {0: 4.5},
-                    'lc': {0: 4.6},
-                    'tg': {0: 4.6}},
-             'ps': {'co': dict(zip((0, 11, 13, 15, 19, 21), (6.8, 17.8, 19.8, 21.8, 25.8, 27.8))),
-                    'wo': dict(zip((0, 11, 13, 15, 19, 21), (7.3, 18.3, 20.3, 22.3, 26.3, 28.3))),
-                    'rc': dict(zip((0, 11, 13, 15, 19, 21), (6.4, 17.4, 19.4, 21.4, 25.4, 27.4))),
-                    'lc': dict(zip((0, 11, 13, 15, 19, 21), (6.4, 17.4, 19.4, 21.4, 25.4, 27.4))),
-                    'tg': dict(zip((0, 11, 13, 15, 19, 21), (6.4, 17.4, 19.4, 21.4, 25.4, 27.4)))}}
 
         atticds = []
         for attic in attics:
@@ -1094,12 +1162,6 @@ class HPXMLtoHEScoreTranslatorBase(object):
             atticds.append(atticd)
 
             # Attic area
-            # Discussion need here: We are using is_one_roof to say, when there's no area specified in HPXML,
-            # we can use footprint area.Should we judge is_one_roof here by looking at element amounts of both
-            # Attic and Roof elements (to be 1)?
-            # I changed it to only look at attic element here because the current logic is more like Attic is
-            # on top of Roof, is it allowed to have roofs undefined in attic? I think those roofs not referred by
-            # attics should be ignored in our translation, right?
             is_one_roof = (len(attics) == 1)
             atticd['roof_area'] = self.get_attic_area(attic, is_one_roof, footprint_area, attic_roofs, b)
 
@@ -1112,7 +1174,8 @@ class HPXMLtoHEScoreTranslatorBase(object):
             for roof in attic_roofs:
                 attic_roofs_d = {}
                 attic_roof_ls.append(attic_roofs_d)
-                attic_roofs_d['roof_id'] = xpath(roof, 'h:SystemIdentifier/@id', raise_err=True)
+                roofid = xpath(roof, 'h:SystemIdentifier/@id', raise_err=True)
+                attic_roofs_d['roof_id'] = roofid
                 # Roof area
                 attic_roofs_d['roof_area'] = self.get_attic_roof_area(roof)
                 if attic_roofs_d['roof_area'] is None:
@@ -1173,18 +1236,52 @@ class HPXMLtoHEScoreTranslatorBase(object):
                 else:
                     attic_roofs_d['roofconstype'] = 'wf'
 
-                # roof center of cavity R-value
-                roof_rvalue = self.get_attic_roof_rvalue(attic, roof)
-                # subtract the R-value of the rigid sheating in the HEScore construction.
-                if attic_roofs_d['roofconstype'] == 'ps':
-                    roof_rvalue -= 5
-                roof_rvalue, attic_roofs_d['roof_coc_rvalue'] = \
-                    min(list(roof_center_of_cavity_rvalues[attic_roofs_d['roofconstype']][
-                                 attic_roofs_d['extfinish']].items()),
-                        key=lambda x: abs(x[0] - roof_rvalue))
-
-            # Please review this, it is combining properties of multiple roofs attached into one for each attic
-            # Determine predominant roof characteristics for attic.
+                roof_assembly_rvalue = self.get_attic_roof_assembly_rvalue(attic, roof)
+                if roof_assembly_rvalue is not None:
+                    if has_radiant_barrier:
+                        # Use effective R-value for wood frame roof without radiant barrier.
+                        # The actual radiant barrier model in OS will handle the radiant barrier.
+                        constype_for_lookup = 'wf'
+                    else:
+                        constype_for_lookup = attic_roofs_d['roofconstype']
+                    closest_roof_code, closest_code_rvalue = \
+                        min([(doe2code, code_rvalue)
+                             for doe2code, code_rvalue in self.roof_assembly_eff_rvalues.items()
+                             if doe2code[2:4] in constype_for_lookup and
+                             doe2code[6:8] == attic_roofs_d['extfinish']],
+                            key=lambda x: abs(x[1] - float(roof_assembly_rvalue)))
+                    attic_roofs_d['roof_assembly_rvalue'] = closest_code_rvalue
+                    # Model as a roof without radiant barrier if R-value is > 0 and the radiant barrier is present
+                    # in the HPXML. Only model with radiant barrier code if R-value = 0 and radiant barrier.
+                    if attic_roofs_d['roofconstype'] == 'rb' and int(closest_roof_code[4:6]) > 0:
+                        attic_roofs_d['roofconstype'] = 'wf'  # overwrite the roofconstype
+                elif self.every_attic_roof_layer_has_nominal_rvalue(attic, roof):
+                    # roof center of cavity R-value
+                    roof_rvalue = self.get_attic_roof_rvalue(attic, roof)
+                    if attic_roofs_d['roofconstype'] == 'rb':
+                        # Use effective R-value for wood frame roof without radiant barrier.
+                        # The actual radiant barrier model in OS will handle the radiant barrier.
+                        roof_rvalue = roof_round_to_nearest(roofid, roof_rvalue, (0, 11, 13, 15, 19, 21, 27, 30))
+                        lookup_code = f"rfwf{roof_rvalue:02d}{attic_roofs_d['extfinish']}"
+                        # Model as a roof without radiant barrier if R-value is > 0 and the radiant barrier is present
+                        # in the HPXML. Only model with radiant barrier code if R-value = 0 and radiant barrier.
+                        if roof_rvalue > 0:
+                            attic_roofs_d['roofconstype'] = 'wf'  # overwrite the roofconstype
+                    elif attic_roofs_d['roofconstype'] == 'wf':
+                        roof_rvalue = roof_round_to_nearest(roofid, roof_rvalue, (0, 11, 13, 15, 19, 21, 27, 30))
+                        lookup_code = f"rf{attic_roofs_d['roofconstype']}{roof_rvalue:02d}{attic_roofs_d['extfinish']}"
+                    elif attic_roofs_d['roofconstype'] == 'ps':
+                        # subtract the R-value of the rigid sheating in the HEScore construction.
+                        if attic_roofs_d['roofconstype'] == 'ps':
+                            roof_rvalue = max(roof_rvalue - 5, 0)
+                        roof_rvalue = roof_round_to_nearest(roofid, roof_rvalue, (0, 11, 13, 15, 19, 21))
+                        lookup_code = f"rf{attic_roofs_d['roofconstype']}{roof_rvalue:02d}{attic_roofs_d['extfinish']}"
+                    attic_roofs_d['roof_assembly_rvalue'] = self.roof_assembly_eff_rvalues[lookup_code]
+                else:
+                    raise TranslationError(
+                        'Every roof insulation layer needs a NominalRValue or '
+                        f"AssemblyEffectiveRValue needs to be defined, roof_id = {attic_roofs_d['roof_id']}")
+
             # Sum of Roof Areas in the same Attic
             attic_roof_area_sum = sum([attic_roofs_dict['roof_area'] for attic_roofs_dict in attic_roof_ls])
 
@@ -1204,37 +1301,33 @@ class HPXMLtoHEScoreTranslatorBase(object):
             # ids of hpxml roofs along for the ride
             atticd['_roofid'] = set([attic_roofs_dict['roof_id'] for attic_roofs_dict in attic_roof_ls])
 
-            # Calculate roof area weighted center of cavity R-value for attic,
+            # Calculate roof area weighted assembly R-value or center of cavity R-value for attic,
             # might be combined later by averaging again
-            # Please review this, it is taking average of coc r values (already looked up with construction type of
-            # each roof) of roofs attached to the same attic.
-            # An alternative can be: averaging the roof nominal R value first then look up the table with dominated
-            # construction type for coc effective R value at attic level.
-            atticd['roof_coc_rvalue'] = \
-                attic_roof_area_sum / \
-                sum([old_div(attic_roofs_dict['roof_area'], attic_roofs_dict['roof_coc_rvalue']) for attic_roofs_dict in
-                     attic_roof_ls])
-
-            # knee walls
-            knee_walls = self.get_attic_knee_walls(attic, b)
+            atticd['roof_assembly_rvalue'] = attic_roof_area_sum / \
+                sum([attic_roofs_dict['roof_area'] / attic_roofs_dict['roof_assembly_rvalue']
+                    for attic_roofs_dict in attic_roof_ls])
 
             # Questions: here we didn't have any input validation of floor attachment based on attic type, should we
             # enhance it? Currently, a building with attic can skip specifying attic floors (0 rvalue passed) while
             # one with cathedral ceiling can have floor specified (though it will be silently ignored in output).
-            # attic floor center of cavity R-value
-            attic_floor_rvalue = self.get_attic_floor_rvalue(attic, b)
-            if knee_walls:
-                knee_wall_rvalue, knee_wall_area = self.get_attic_knee_wall_rvalue_and_area(attic, b)
-                knee_wall_coc_rvalue = knee_wall_rvalue + 1.8
-                knee_wall_ua = knee_wall_area / knee_wall_coc_rvalue
-
-                attic_floor_coc_rvalue = attic_floor_rvalue + 0.5
-                attic_floor_adj_ua = knee_wall_ua + atticd['roof_area'] / attic_floor_coc_rvalue
-                attic_floor_adj_area = knee_wall_area + atticd['roof_area']
-                attic_floor_rvalue = (attic_floor_adj_area / attic_floor_adj_ua) - 0.5
-                atticd['roof_area'] = attic_floor_adj_area
-            atticd['attic_floor_coc_rvalue'] = attic_floor_rvalue + 0.5
-
+            # attic floor center of cavity R-value or assembly R-value
+            attic_floor_rvalue = self.get_attic_floor_assembly_rvalue(attic, b)
+            if attic_floor_rvalue is not None:
+                closest_attic_floor_code, closest_code_rvalue = \
+                    min([(doe2code, code_rvalue)
+                         for doe2code, code_rvalue in self.ceiling_assembly_eff_rvalues.items()],
+                        key=lambda x: abs(x[1] - attic_floor_rvalue))
+                atticd['attic_floor_assembly_rvalue'] = closest_code_rvalue
+            elif self.every_attic_floor_layer_has_nominal_rvalue(attic, b):
+                attic_floor_rvalue = self.get_attic_floor_rvalue(attic, b)
+                closest_attic_floor_rvalue = roof_round_to_nearest(
+                    roofid, attic_floor_rvalue, (0, 3, 6, 9, 11, 19, 21, 25, 30, 38, 44, 49, 60))
+                lookup_code = f"ecwf{closest_attic_floor_rvalue:02d}"
+                atticd['attic_floor_assembly_rvalue'] = self.ceiling_assembly_eff_rvalues[lookup_code]
+            else:
+                raise TranslationError(
+                    'Every attic floor insulation layer needs a NominalRValue or '
+                    f"AssemblyEffectiveRValue needs to be defined, attic_id = {atticid}")
         if len(atticds) == 0:
             raise TranslationError('There are no Attic elements in this building.')
         elif len(atticds) <= 2:
@@ -1260,26 +1353,21 @@ class HPXMLtoHEScoreTranslatorBase(object):
 
                 # Roof type, roof color, exterior finish, construction type
                 for attic_key in ('roofconstype', 'extfinish', 'roofcolor', 'rooftype'):
-                    roof_area_by_cat = {}
-                    for atticd in atticds:
-                        try:
-                            roof_area_by_cat[atticd[attic_key]] += atticd['roof_area']
-                        except KeyError:
-                            roof_area_by_cat[atticd[attic_key]] = atticd['roof_area']
-                    combined_atticd[attic_key] = max(roof_area_by_cat, key=lambda x: roof_area_by_cat[x])
+                    combined_atticd[attic_key] = get_predominant_roof_property(atticd, attic_key)
+                if combined_atticd['roofcolor'] == 'cool_color':
+                    combined_atticd['roof_absorptance'] = get_predominant_roof_property(atticd, 'roof_absorptance')
 
                 # ids of hpxml roofs along for the ride
                 combined_atticd['_roofids'] = set().union(*[atticd['_roofid'] for atticd in atticds])
 
-                # Calculate roof area weighted center of cavity R-value
-                combined_atticd['roof_coc_rvalue'] = \
-                    combined_atticd['roof_area'] / \
-                    sum([old_div(atticd['roof_area'], atticd['roof_coc_rvalue']) for atticd in atticds])
+                # Calculate roof area weighted assembly R-value or center of cavity R-value
+                combined_atticd['roof_assembly_rvalue'] = combined_atticd['roof_area'] / \
+                    sum([atticd['roof_area'] / atticd['roof_assembly_rvalue'] for atticd in atticds])
 
                 # Calculate attic floor weighted average center-of-cavity R-value
-                combined_atticd['attic_floor_coc_rvalue'] = \
-                    sum([atticd['attic_floor_coc_rvalue'] * atticd['roof_area'] for atticd in atticds]) / \
-                    combined_atticd['roof_area']
+                combined_atticd['attic_floor_assembly_rvalue'] = combined_atticd['roof_area'] / \
+                    sum([atticd['roof_area'] / atticd['attic_floor_assembly_rvalue'] for atticd in atticds])
+
                 combined_atticds.append(combined_atticd)
 
             atticds = combined_atticds
@@ -1293,28 +1381,37 @@ class HPXMLtoHEScoreTranslatorBase(object):
         zone_roof = []
         for i, atticd in enumerate(atticds[0:2], 1):
 
-            # Get Roof R-value
-            roffset = roof_center_of_cavity_rvalues[atticd['roofconstype']][atticd['extfinish']][0]
-            roof_rvalue = min(list(roof_center_of_cavity_rvalues[atticd['roofconstype']][atticd['extfinish']].keys()),
-                              key=lambda x: abs(atticd['roof_coc_rvalue'] - roffset - x))
+            # Get Roof Code
+            if atticd['roofconstype'] == 'rb':
+                # Since there is no lookup key for roof_code "rfrb**", this step is required separately
+                roof_code = f"rfrb00{atticd['extfinish']}"
+            else:
+                closest_roof_code, closest_code_rvalue = \
+                    min([(doe2code, code_rvalue)
+                        for doe2code, code_rvalue in self.roof_assembly_eff_rvalues.items()
+                        if doe2code[2:4] in atticd['roofconstype'] and doe2code[6:8] == atticd['extfinish']],
+                        key=lambda x: abs(x[1] - atticd['roof_assembly_rvalue']))
+                roof_code = closest_roof_code
 
             # Get Attic Floor R-value
-            attic_floor_rvalue = min(attic_floor_rvalues,
-                                     key=lambda x: abs(atticd['attic_floor_coc_rvalue'] - 0.5 - x))
+            closest_floor_code, closest_code_rvalue = \
+                min([(doe2code, code_rvalue)
+                     for doe2code, code_rvalue in self.ceiling_assembly_eff_rvalues.items()],
+                    key=lambda x: abs(x[1] - atticd['attic_floor_assembly_rvalue']))
+            attic_floor_code = closest_floor_code
 
             # store it all
             zone_roof_item = OrderedDict()
             zone_roof_item['roof_name'] = 'roof%d' % i
             zone_roof_item['roof_area'] = atticd['roof_area']
-            zone_roof_item['roof_assembly_code'] = 'rf%s%02d%s' % (
-                atticd['roofconstype'], roof_rvalue, atticd['extfinish'])
+            zone_roof_item['roof_assembly_code'] = roof_code
             zone_roof_item['roof_color'] = atticd['roofcolor']
             if 'roof_absorptance' in atticd:
                 zone_roof_item['roof_absorptance'] = atticd['roof_absorptance']
             zone_roof_item['roof_type'] = atticd['rooftype']
             zone_roof_item['_roofids'] = atticd['_roofids']
             if atticd['rooftype'] != 'cath_ceiling':
-                zone_roof_item['ceiling_assembly_code'] = 'ecwf%02d' % attic_floor_rvalue
+                zone_roof_item['ceiling_assembly_code'] = attic_floor_code
             zone_roof.append(zone_roof_item)
 
         return zone_roof
@@ -1390,8 +1487,8 @@ class HPXMLtoHEScoreTranslatorBase(object):
             if len(uvalues) > 0:
                 # Use an area weighted average of the uvalues, shgcs
                 skylight_d['skylight_method'] = 'custom'
-                skylight_d['skylight_u_value'] = old_div(sum(
-                    [uvalue * area for (uvalue, area) in zip(uvalues, areas)]), sum(areas))
+                skylight_d['skylight_u_value'] = sum(
+                    [uvalue * area for (uvalue, area) in zip(uvalues, areas)]) / sum(areas)
                 skylight_d['skylight_shgc'] = sum([shgc * area for (shgc, area) in zip(shgcs, areas)]) / sum(areas)
             else:
                 # use a construction code
@@ -1419,6 +1516,13 @@ class HPXMLtoHEScoreTranslatorBase(object):
         return zone_skylight
 
     def get_building_zone_floor(self, b, bldg_about):
+
+        def floor_round_to_nearest(floorid, *args):
+            try:
+                return round_to_nearest(*args, tails_tolerance=3)
+            except RoundOutOfBounds:
+                raise TranslationError('Floor R-value outside HEScore bounds, floor id: %s' % floorid)
+
         ns = self.ns
         xpath = self.xpath
         smallnum = 0.01
@@ -1440,7 +1544,7 @@ class HPXMLtoHEScoreTranslatorBase(object):
         sum_area_largest_two = sum(areas[0:2])
         sum_area = sum(areas)
         try:
-            area_mult = old_div(sum_area, sum_area_largest_two)
+            area_mult = sum_area / sum_area_largest_two
         except ZeroDivisionError:
             area_mult = 0
 
@@ -1488,7 +1592,7 @@ class HPXMLtoHEScoreTranslatorBase(object):
                 nstories = bldg_about['num_floor_above_grade']
                 if zone_floor['foundation_type'] == 'cond_basement':
                     nstories += 1
-                zone_floor['floor_area'] = old_div(bldg_about['conditioned_floor_area'], nstories)
+                zone_floor['floor_area'] = math.floor(bldg_about['conditioned_floor_area'] / nstories)
 
             # Foundation Wall insulation R-value
             fwua = 0
@@ -1500,6 +1604,7 @@ class HPXMLtoHEScoreTranslatorBase(object):
                     raise TranslationError('The house is a slab on grade foundation, but has foundation walls.')
                 del fw_eff_rvalues[5]  # remove the value for slab insulation
                 for fwall in foundationwalls:
+                    fwallid = xpath(fwall, 'h:SystemIdentifier/@id', raise_err=True)
                     fwarea, fwlength, fwheight = \
                         [convert_to_type(float, xpath(fwall, 'h:%s/text()' % x)) for x in ('Area', 'Length', 'Height')]
                     if fwarea is None:
@@ -1511,11 +1616,16 @@ class HPXMLtoHEScoreTranslatorBase(object):
                             else:
                                 raise TranslationError(
                                     'If there is more than one FoundationWall, an Area is required for each.')
-                    fwrvalue = xpath(fwall, 'sum(h:Insulation/h:Layer/h:NominalRValue)')
-                    fweffrvalue = fw_eff_rvalues[min(list(fw_eff_rvalues.keys()), key=lambda x: abs(fwrvalue - x))]
-                    fwua += old_div(fwarea, fweffrvalue)
-                    fwtotalarea += fwarea
-                zone_floor['foundation_insulation_level'] = old_div(fwtotalarea, fwua) - 4.0
+                    fwall_assembly_rvalue = self.get_foundation_wall_assembly_rvalue(fwall, fwall)
+                    if fwall_assembly_rvalue is not None:  # TODO: Allow for AssemblyEffectiveRValue
+                        raise TranslationError(
+                            f'Every foundation wall insulation layer needs a NominalRValue, fwall_id = {fwallid}')
+                    else:
+                        fwrvalue = xpath(fwall, 'sum(h:Insulation/h:Layer/h:NominalRValue)')
+                        fweffrvalue = fw_eff_rvalues[min(list(fw_eff_rvalues.keys()), key=lambda x: abs(fwrvalue - x))]
+                        fwua += fwarea / fweffrvalue
+                        fwtotalarea += fwarea
+                zone_floor['foundation_insulation_level'] = (fwtotalarea / fwua) - 4.0
             elif zone_floor['foundation_type'] == 'slab_on_grade':
                 del fw_eff_rvalues[11]  # remove unused values
                 del fw_eff_rvalues[19]
@@ -1523,6 +1633,7 @@ class HPXMLtoHEScoreTranslatorBase(object):
                 slabua = 0
                 slabtotalperimeter = 0
                 for slab in slabs:
+                    slabid = xpath(slab, 'h:SystemIdentifier/@id', raise_err=True)
                     exp_perimeter = convert_to_type(float, xpath(slab, 'h:ExposedPerimeter/text()'))
                     if exp_perimeter is None:
                         if len(slabs) == 1:
@@ -1530,11 +1641,17 @@ class HPXMLtoHEScoreTranslatorBase(object):
                         else:
                             raise TranslationError(
                                 'If there is more than one Slab, an ExposedPerimeter is required for each.')
-                    slabrvalue = xpath(slab, 'sum(h:PerimeterInsulation/h:Layer/h:NominalRValue)')
-                    slabeffrvalue = fw_eff_rvalues[min(list(fw_eff_rvalues.keys()), key=lambda x: abs(slabrvalue - x))]
-                    slabua += old_div(exp_perimeter, slabeffrvalue)
-                    slabtotalperimeter += exp_perimeter
-                zone_floor['foundation_insulation_level'] = old_div(slabtotalperimeter, slabua) - 4.0
+                    slab_assembly_rvalue = self.get_slab_assembly_rvalue(slab, slab)
+                    if slab_assembly_rvalue is not None:  # TODO: Allow for AssemblyEffectiveRValue
+                        raise TranslationError(
+                            f"Every slab insulation layer needs a NominalRValue, slab_id = {slabid}")
+                    else:
+                        slabrvalue = xpath(slab, 'sum(h:PerimeterInsulation/h:Layer/h:NominalRValue)')
+                        slabeffrvalue = fw_eff_rvalues[
+                            min(list(fw_eff_rvalues.keys()), key=lambda x: abs(slabrvalue - x))]
+                        slabua += exp_perimeter / slabeffrvalue
+                        slabtotalperimeter += exp_perimeter
+                zone_floor['foundation_insulation_level'] = (slabtotalperimeter / slabua) - 4.0
             else:
                 zone_floor['foundation_insulation_level'] = 0
             zone_floor['foundation_insulation_level'] = min(list(fw_eff_rvalues.keys()), key=lambda x: abs(
@@ -1545,10 +1662,10 @@ class HPXMLtoHEScoreTranslatorBase(object):
                 ffua = 0
                 fftotalarea = 0
                 framefloors = self.get_foundation_frame_floors(foundation, b)
-                floor_eff_rvalues = dict(zip((0, 11, 13, 15, 19, 21, 25, 30, 38),
-                                             (4.0, 15.8, 17.8, 19.8, 23.8, 25.8, 31.8, 37.8, 42.8)))
+                doe2_floor_rvalues = (0, 11, 13, 15, 19, 21, 25, 30, 38)
                 if len(framefloors) > 0:
                     for framefloor in framefloors:
+                        ffid = xpath(framefloor, 'h:SystemIdentifier/@id', raise_err=True)
                         ffarea = convert_to_type(float, xpath(framefloor, 'h:Area/text()'))
                         if ffarea is None:
                             if len(framefloors) == 1:
@@ -1556,19 +1673,29 @@ class HPXMLtoHEScoreTranslatorBase(object):
                             else:
                                 raise TranslationError(
                                     'If there is more than one FrameFloor, an Area is required for each.')
-                        ffrvalue = xpath(framefloor, 'sum(h:Insulation/h:Layer/h:NominalRValue)')
-                        ffeffrvalue = floor_eff_rvalues[min(
-                            list(floor_eff_rvalues.keys()),
-                            key=lambda x: abs(ffrvalue - x)
-                        )]
-                        ffua += old_div(ffarea, ffeffrvalue)
+                        framefloor_assembly_rvalue = self.get_framefloor_assembly_rvalue(framefloor, framefloor)
+                        if framefloor_assembly_rvalue is not None:
+                            ffeffrvalue = framefloor_assembly_rvalue
+                        elif self.every_framefloor_layer_has_nominal_rvalue(framefloor, framefloor):
+                            ffrvalue = xpath(framefloor, 'sum(h:Insulation/h:Layer/h:NominalRValue)')
+                            closest_floor_rvalue = floor_round_to_nearest(ffid, ffrvalue, doe2_floor_rvalues)
+                            lookup_code = f"efwf{closest_floor_rvalue:02d}ca"
+                            ffeffrvalue = self.floor_assembly_eff_rvalues[lookup_code]
+                        else:
+                            ffid = xpath(framefloor, 'h:SystemIdentifier/@id', raise_err=True)
+                            raise TranslationError(
+                                'Every frame floor insulation layer needs a NominalRValue or AssemblyEffectiveRValue '
+                                f"needs to be defined, framefloor_id = {ffid}")
+                        ffua += ffarea / ffeffrvalue
                         fftotalarea += ffarea
-                    ffrvalue = old_div(fftotalarea, ffua) - 4.0
-                    zone_floor['floor_assembly_code'] = 'efwf%02dca' % min(list(floor_eff_rvalues.keys()),
-                                                                           key=lambda x: abs(ffrvalue - x))
+                    ffrvalue = fftotalarea / ffua
+                    comb_ff_code, comb_rvalue = \
+                        min([(doe2code, code_rvalue)
+                            for doe2code, code_rvalue in self.floor_assembly_eff_rvalues.items()],
+                            key=lambda x: abs(x[1] - float(ffrvalue)))
+                    zone_floor['floor_assembly_code'] = comb_ff_code
                 else:
                     zone_floor['floor_assembly_code'] = 'efwf00ca'
-
             zone_floors.append(zone_floor)
 
         return zone_floors
@@ -1584,7 +1711,9 @@ class HPXMLtoHEScoreTranslatorBase(object):
         hpxmlwalls = dict([(side, []) for side in list(sidemap.values())])
         hpxmlwalls['noside'] = []
         for wall in self.get_hescore_walls(b):
-            walld = {'assembly_code': self.get_wall_assembly_code(wall),
+            assembly_code, assembly_eff_rvalue = self.get_wall_assembly_code_and_rvalue(wall)
+            walld = {'assembly_code': assembly_code,
+                     'assembly_eff_rvalue': assembly_eff_rvalue,
                      'area': convert_to_type(float, xpath(wall, 'h:Area/text()')),
                      'id': xpath(wall, 'h:SystemIdentifier/@id', raise_err=True)}
 
@@ -1620,39 +1749,6 @@ class HPXMLtoHEScoreTranslatorBase(object):
             if len(hpxmlwalls['noside']) > 0:
                 raise TranslationError('Some of the HPXML walls have orientation information and others do not.')
 
-        # Wall effective R-value map
-        wall_ext_finish_types = ('wo', 'st', 'vi', 'al', 'br', 'nn')
-        wall_eff_rvalues = {}
-        wall_eff_rvalues['wf'] = dict(
-            list(zip(wall_ext_finish_types[:-1], [dict(list(zip((0, 3, 7, 11, 13, 15, 19, 21), x)))  # noqa: E501
-                                                  for x in
-                                                  [(3.6, 5.7, 9.7, 13.7, 15.7, 17.7, 21.7, 23.7),
-                                                   (2.3, 4.4, 8.4, 12.4, 14.4, 16.4, 20.4, 22.4),
-                                                   (2.2, 4.3, 8.3, 12.3, 14.3, 16.3, 20.3, 22.3),
-                                                   (2.1, 4.2, 8.2, 12.2, 14.2, 16.2, 20.2, 22.2),
-                                                   (2.9, 5.0, 9.0, 13.0, 15.0, 17.0, 21.0, 23.0)]])))  # noqa: E501
-        wall_eff_rvalues['ps'] = dict(
-            list(zip(wall_ext_finish_types[:-1], [dict(list(zip((0, 3, 7, 11, 13, 15, 19, 21), x)))  # noqa: E501
-                                                  for x in
-                                                  [(6.1, 9.1, 13.1, 17.1, 19.1, 21.1, 25.1, 27.1),  # noqa: E501
-                                                   (5.4, 8.4, 12.4, 16.4, 18.4, 20.4, 24.4, 26.4),  # noqa: E501
-                                                   (5.3, 8.3, 12.3, 16.3, 18.3, 20.3, 24.3, 26.3),  # noqa: E501
-                                                   (5.2, 8.2, 12.2, 16.2, 18.2, 20.2, 24.2, 26.2),  # noqa: E501
-                                                   (6.0, 9.0, 13.0, 17.0, 19.0, 21.0, 25.0, 27.0)]])))  # noqa: E501
-        wall_eff_rvalues['ov'] = dict(list(zip(wall_ext_finish_types[:-1], [dict(list(zip((19, 21, 27, 33, 38), x)))
-                                                                            for x in [(21.0, 23.0, 29.0, 35.0, 40.0),
-                                                                                      (20.3, 22.3, 28.3, 34.3, 39.3),
-                                                                                      (20.1, 22.1, 28.1, 34.1, 39.1),
-                                                                                      (20.1, 22.1, 28.1, 34.1, 39.1),
-                                                                                      (20.9, 22.9, 28.9, 34.9,
-                                                                                       39.9)]])))  # noqa: E501
-        wall_eff_rvalues['br'] = {'nn': dict(list(zip((0, 5, 10), (2.9, 7.9, 12.8))))}
-        wall_eff_rvalues['cb'] = dict(list(zip(('st', 'br', 'nn'), [dict(list(zip((0, 3, 6), x)))
-                                                                    for x in [(4.1, 5.7, 8.5),
-                                                                              (5.6, 7.2, 10),
-                                                                              (4, 5.6, 8.3)]])))
-        wall_eff_rvalues['sb'] = {'st': {0: 58.8}}
-
         # build HEScore walls
         for side in list(sidemap.values()):
             if len(hpxmlwalls[side]) == 0:
@@ -1664,32 +1760,26 @@ class HPXMLtoHEScoreTranslatorBase(object):
             elif len(hpxmlwalls[side]) > 1 and None in [x['area'] for x in hpxmlwalls[side]]:
                 raise TranslationError('The %s side of the house has %d walls and they do not all have areas.' % (
                     side, len(hpxmlwalls[side])))
-            if len(hpxmlwalls[side]) == 1:
-                heswall['wall_assembly_code'] = hpxmlwalls[side][0]['assembly_code']
-            else:
-                wall_const_type_ext_finish_areas = defaultdict(float)
-                wallua = 0
-                walltotalarea = 0
-                for walld in hpxmlwalls[side]:
-                    const_type = walld['assembly_code'][2:4]
-                    ext_finish = walld['assembly_code'][6:8]
-                    rvalue = int(walld['assembly_code'][4:6])
-                    eff_rvalue = wall_eff_rvalues[const_type][ext_finish][rvalue]
-                    wallua += old_div(walld['area'], eff_rvalue)
-                    walltotalarea += walld['area']
-                    wall_const_type_ext_finish_areas[(const_type, ext_finish)] += walld['area']
-                const_type, ext_finish = max(list(wall_const_type_ext_finish_areas.keys()),
-                                             key=lambda x: wall_const_type_ext_finish_areas[x])
-                try:
-                    roffset = wall_eff_rvalues[const_type][ext_finish][0]
-                except KeyError:
-                    rvalue, eff_rvalue = min(list(wall_eff_rvalues[const_type][ext_finish].items()), key=lambda x: x[0])
-                    roffset = eff_rvalue - rvalue
-                rvalueavgeff = old_div(walltotalarea, wallua)
-                rvalueavgnom = rvalueavgeff - roffset
-                comb_rvalue = min(list(wall_eff_rvalues[const_type][ext_finish].keys()),
-                                  key=lambda x: abs(rvalueavgnom - x))
-                heswall['wall_assembly_code'] = 'ew%s%02d%s' % (const_type, comb_rvalue, ext_finish)
+            wall_const_type_ext_finish_areas = defaultdict(float)
+            wallua = 0
+            walltotalarea = 0
+            for walld in hpxmlwalls[side]:
+                const_type = walld['assembly_code'][2:4]
+                ext_finish = walld['assembly_code'][6:8]
+                assembly_eff_rvalue = walld['assembly_eff_rvalue']
+                wallua += walld['area'] / assembly_eff_rvalue
+                walltotalarea += walld['area']
+                wall_const_type_ext_finish_areas[(const_type, ext_finish)] += walld['area']
+            const_type, ext_finish = max(list(wall_const_type_ext_finish_areas.keys()),
+                                         key=lambda x: wall_const_type_ext_finish_areas[x])
+            rvalueavgeff = walltotalarea / wallua
+            comb_wall_code, comb_rvalue = min(
+                [(doe2code, code_rvalue)
+                    for doe2code, code_rvalue in self.wall_assembly_eff_rvalues.items()
+                    if doe2code[2:4] == const_type and doe2code[6:8] == ext_finish],
+                key=lambda x: abs(x[1] - rvalueavgeff)
+            )
+            heswall['wall_assembly_code'] = comb_wall_code
             zone_wall.append(heswall)
 
         # building.zone.zone_wall.zone_window--------------------------------------
@@ -2007,8 +2097,8 @@ class HPXMLtoHEScoreTranslatorBase(object):
         # in terms of fraction of the load served.
         for duct_id, (htg_id, clg_id) in list(dist_heating_cooling_map.items()):
             try:
-                htg_weight = old_div(heating_systems[htg_id][weighting_factor], weight_sum)
-                clg_weight = old_div(cooling_systems[clg_id][weighting_factor], weight_sum)
+                htg_weight = heating_systems[htg_id][weighting_factor] / weight_sum
+                clg_weight = cooling_systems[clg_id][weighting_factor] / weight_sum
             except KeyError:
                 continue
             if abs(htg_weight - clg_weight) > 0.051:
@@ -2055,10 +2145,10 @@ class HPXMLtoHEScoreTranslatorBase(object):
         for dist_sys_id, (htg_sys_id, clg_sys_id) in list(dist_heating_cooling_map.items()):
             weights_to_average = []
             if htg_sys_id is not None:
-                weights_to_average.append(old_div(heating_systems[htg_sys_id][weighting_factor], weight_sum))
+                weights_to_average.append(heating_systems[htg_sys_id][weighting_factor] / weight_sum)
             if clg_sys_id is not None:
-                weights_to_average.append(old_div(cooling_systems[clg_sys_id][weighting_factor], weight_sum))
-            avg_sys_weight = old_div(sum(weights_to_average), len(weights_to_average))
+                weights_to_average.append(cooling_systems[clg_sys_id][weighting_factor] / weight_sum)
+            avg_sys_weight = sum(weights_to_average) / len(weights_to_average)
             hvac_systems_ids.add(IDsAndWeights(htg_sys_id, clg_sys_id, dist_sys_id, avg_sys_weight))
 
         singletons_to_combine = singleton_cooling_systems.intersection(singleton_heating_systems)
@@ -2072,7 +2162,7 @@ class HPXMLtoHEScoreTranslatorBase(object):
                 heatpump_id,
                 heatpump_id,
                 None,
-                old_div(heating_systems[heatpump_id][weighting_factor], weight_sum)))
+                heating_systems[heatpump_id][weighting_factor] / weight_sum))
 
         # Add the singletons to the list
         for htg_sys_id in singleton_heating_systems:
@@ -2080,13 +2170,13 @@ class HPXMLtoHEScoreTranslatorBase(object):
                 htg_sys_id,
                 None,
                 None,
-                old_div(heating_systems[htg_sys_id][weighting_factor], weight_sum)))
+                heating_systems[htg_sys_id][weighting_factor] / weight_sum))
         for clg_sys_id in singleton_cooling_systems:
             hvac_systems_ids.add(IDsAndWeights(
                 None,
                 clg_sys_id,
                 None,
-                old_div(cooling_systems[clg_sys_id][weighting_factor], weight_sum)))
+                cooling_systems[clg_sys_id][weighting_factor] / weight_sum))
 
         # Split and combine systems by fraction as needed #45
         singleton_heating_systems = []
@@ -2171,7 +2261,7 @@ class HPXMLtoHEScoreTranslatorBase(object):
         for i, hvac_ids in enumerate(hvac_systems_ids[0:2], 1):
             hvac_sys = OrderedDict()
             hvac_sys['hvac_name'] = 'hvac%d' % i
-            hvac_sys['hvac_fraction'] = round(old_div(hvac_ids.weight, hvac_sys_weight_sum), 6)
+            hvac_sys['hvac_fraction'] = round(hvac_ids.weight / hvac_sys_weight_sum, 6)
             if hvac_ids.htg_id is not None:
                 hvac_sys['heating'] = heating_systems[hvac_ids.htg_id]
             else:
@@ -2434,7 +2524,7 @@ class HPXMLtoHEScoreTranslatorBase(object):
                         do_bounds_check('heating_year', sys_heating['year'], 1970, this_year)
                 else:
                     if not ((sys_heating['type'] in ('central_furnace', 'baseboard') and
-                            sys_heating['fuel_primary'] == 'electric') or sys_heating['type'] == 'wood_stove'):
+                             sys_heating['fuel_primary'] == 'electric') or sys_heating['type'] == 'wood_stove'):
                         raise TranslationError(
                             'Heating system %(fuel_primary)s %(type)s needs an efficiency value.' %
                             sys_heating)
diff --git a/hescorehpxml/hpxml2.py b/hescorehpxml/hpxml2.py
index e9ebb231..c7c67095 100644
--- a/hescorehpxml/hpxml2.py
+++ b/hescorehpxml/hpxml2.py
@@ -41,9 +41,44 @@ class HPXML2toHEScoreTranslator(HPXMLtoHEScoreTranslatorBase):
                           'boolean(h:AtticRoofInsulation/h:Layer[h:NominalRValue > 0][h:InstallationType="continuous"][boolean(h:InsulationMaterial/h:Rigid)])'  # noqa: E501
                           )
 
+    def get_wall_assembly_rvalue(self, wall, v3_wall):
+        return convert_to_type(float, self.xpath(wall, 'h:Insulation/h:AssemblyEffectiveRValue/text()'))
+
+    def every_wall_layer_has_nominal_rvalue(self, wall, v3_wall):
+        # This variable will be true if every wall layer has a NominalRValue *or*
+        # if there are no insulation layers
+        wall_layers = self.xpath(wall, 'h:Insulation/h:Layer', aslist=True)
+        every_layer_has_nominal_rvalue = True  # Considered to have nominal R-value unless assembly R-value is used
+        if wall_layers:
+            for layer in wall_layers:
+                if self.xpath(layer, 'h:NominalRValue') is None:
+                    every_layer_has_nominal_rvalue = False
+                    break
+        elif self.xpath(wall, 'h:Insulation/h:AssemblyEffectiveRValue/text()') is not None:
+            every_layer_has_nominal_rvalue = False
+
+        return every_layer_has_nominal_rvalue
+
     def get_attic_roof_rvalue(self, attic, v3_roof):
-        return self.xpath(attic,
-                          'sum(h:AtticRoofInsulation/h:Layer/h:NominalRValue)')
+        # if there is no nominal R-value, it will return 0
+        return self.xpath(attic, 'sum(h:AtticRoofInsulation/h:Layer/h:NominalRValue)')
+
+    def get_attic_roof_assembly_rvalue(self, attic, v3_roof):
+        # if there is no assembly effective R-value, it will return None
+        return convert_to_type(float, self.xpath(attic, 'h:AtticRoofInsulation/h:AssemblyEffectiveRValue/text()'))
+
+    def every_attic_roof_layer_has_nominal_rvalue(self, attic, v3_roof):
+        roof_layers = self.xpath(attic, 'h:AtticRoofInsulation/h:Layer', aslist=True)
+        every_layer_has_nominal_rvalue = True  # Considered to have nominal R-value unless assembly R-value is used
+        if roof_layers:
+            for layer in roof_layers:
+                if self.xpath(layer, 'h:NominalRValue') is None:
+                    every_layer_has_nominal_rvalue = False
+                    break
+        elif self.xpath(attic, 'h:AtticRoofInsulation/h:AssemblyEffectiveRValue/text()') is not None:
+            every_layer_has_nominal_rvalue = False
+
+        return every_layer_has_nominal_rvalue
 
     def get_attic_knee_walls(self, attic, b):
         knee_walls = []
@@ -81,6 +116,22 @@ class HPXML2toHEScoreTranslator(HPXMLtoHEScoreTranslatorBase):
     def get_attic_floor_rvalue(self, attic, v3_b):
         return self.xpath(attic, 'sum(h:AtticFloorInsulation/h:Layer/h:NominalRValue)')
 
+    def get_attic_floor_assembly_rvalue(self, attic, v3_b):
+        return convert_to_type(float, self.xpath(attic, 'h:AtticFloorInsulation/h:AssemblyEffectiveRValue/text()'))
+
+    def every_attic_floor_layer_has_nominal_rvalue(self, attic, v3_b):
+        frame_floor_layers = self.xpath(attic, 'h:AtticFloorInsulation/h:Layer', aslist=True)
+        every_layer_has_nominal_rvalue = True  # Considered to have nominal R-value unless assembly R-value is used
+        if frame_floor_layers:
+            for layer in frame_floor_layers:
+                if self.xpath(layer, 'h:NominalRValue') is None:
+                    every_layer_has_nominal_rvalue = False
+                    break
+        elif self.xpath(attic, 'h:AtticFloorInsulation/h:AssemblyEffectiveRValue/text()') is not None:
+            every_layer_has_nominal_rvalue = False
+
+        return every_layer_has_nominal_rvalue
+
     def get_attic_area(self, attic, is_one_roof, footprint_area, v3_roofs, v3_b):
         attic_area = convert_to_type(float, self.xpath(attic, 'h:Area/text()'))
         if attic_area is None:
@@ -94,14 +145,38 @@ class HPXML2toHEScoreTranslator(HPXMLtoHEScoreTranslatorBase):
     def get_attic_roof_area(self, roof):
         return self.xpath(roof, 'h:RoofArea/text()')
 
+    def get_framefloor_assembly_rvalue(self, framefloor, v3_framefloor):
+        return convert_to_type(float, self.xpath(framefloor, 'h:Insulation/h:AssemblyEffectiveRValue/text()'))
+
+    def get_foundation_wall_assembly_rvalue(self, fwall, v3_fwall):
+        return convert_to_type(float, self.xpath(fwall, 'h:Insulation/h:AssemblyEffectiveRValue/text()'))
+
+    def get_slab_assembly_rvalue(self, slab, v3_slab):
+        return convert_to_type(float, self.xpath(slab, 'h:PerimeterInsulation/h:AssemblyEffectiveRValue/text()'))
+
+    def every_framefloor_layer_has_nominal_rvalue(self, framefloor, v3_framefloor):
+        framefloor_layers = self.xpath(framefloor, 'h:Insulation/h:Layer', aslist=True)
+        every_layer_has_nominal_rvalue = True  # Considered to have nominal R-value unless assembly R-value is used
+        if framefloor_layers:
+            for layer in framefloor_layers:
+                if self.xpath(layer, 'h:NominalRValue') is None:
+                    every_layer_has_nominal_rvalue = False
+                    break
+        elif self.xpath(framefloor, 'h:Insulation/h:AssemblyEffectiveRValue/text()') is not None:
+            every_layer_has_nominal_rvalue = False
+
+        return every_layer_has_nominal_rvalue
+
     def get_solarscreen(self, wndw_skylight):
         return bool(self.xpath(wndw_skylight, 'h:Treatments/text()') == 'solar screen'
                     or self.xpath(wndw_skylight, 'h:ExteriorShading/text()') == 'solar screens')
 
     def get_hescore_walls(self, b):
-        return self.xpath(b,
-                          'h:BuildingDetails/h:Enclosure/h:Walls/h:Wall[h:ExteriorAdjacentTo="ambient" or not(h:ExteriorAdjacentTo)]',  # noqa: E501
-                          aslist=True)
+        return self.xpath(
+            b, 'h:BuildingDetails/h:Enclosure/h:Walls/h:Wall\
+                [((h:ExteriorAdjacentTo="ambient" and not(contains(h:ExteriorAdjacentTo, "garage"))) or\
+                    not(h:ExteriorAdjacentTo)) and not(contains(h:InteriorAdjacentTo, "attic"))]',  # noqa: E501
+            aslist=True)
 
     def check_is_doublepane(self, v3_window, glass_layers):
         return glass_layers in ('double-pane', 'single-paned with storms', 'single-paned with low-e storms')
diff --git a/hescorehpxml/hpxml3.py b/hescorehpxml/hpxml3.py
index 0a690ed3..a6dd20c5 100644
--- a/hescorehpxml/hpxml3.py
+++ b/hescorehpxml/hpxml3.py
@@ -56,9 +56,44 @@ class HPXML3toHEScoreTranslator(HPXMLtoHEScoreTranslatorBase):
                           # noqa: E501
                           )
 
+    def get_wall_assembly_rvalue(self, v2_wall, wall):
+        return convert_to_type(float, self.xpath(wall, 'h:Insulation/h:AssemblyEffectiveRValue/text()'))
+
+    def every_wall_layer_has_nominal_rvalue(self, v2_wall, wall):
+        # This variable will be true if every wall layer has a NominalRValue *or*
+        # if there are no insulation layers
+        wall_layers = self.xpath(wall, 'h:Insulation/h:Layer', aslist=True)
+        every_layer_has_nominal_rvalue = True  # Considered to have nominal R-value unless assembly R-value is used
+        if wall_layers:
+            for layer in wall_layers:
+                if self.xpath(layer, 'h:NominalRValue') is None:
+                    every_layer_has_nominal_rvalue = False
+                    break
+        elif self.xpath(wall, 'h:Insulation/h:AssemblyEffectiveRValue/text()') is not None:
+            every_layer_has_nominal_rvalue = False
+
+        return every_layer_has_nominal_rvalue
+
     def get_attic_roof_rvalue(self, v2_attic, roof):
-        return self.xpath(roof,
-                          'sum(h:Insulation/h:Layer/h:NominalRValue)')
+        # if there is no nominal R-value, it will return 0
+        return self.xpath(roof, 'sum(h:Insulation/h:Layer/h:NominalRValue)')
+
+    def get_attic_roof_assembly_rvalue(self, v2_attic, roof):
+        # if there is no assembly effective R-value, it will return None
+        return convert_to_type(float, self.xpath(roof, 'h:Insulation/h:AssemblyEffectiveRValue/text()'))
+
+    def every_attic_roof_layer_has_nominal_rvalue(self, v2_attic, roof):
+        roof_layers = self.xpath(roof, 'h:Insulation/h:Layer', aslist=True)
+        every_layer_has_nominal_rvalue = True  # Considered to have nominal R-value unless assembly R-value is used
+        if roof_layers:
+            for layer in roof_layers:
+                if self.xpath(layer, 'h:NominalRValue') is None:
+                    every_layer_has_nominal_rvalue = False
+                    break
+        elif self.xpath(roof, 'h:Insulation/h:AssemblyEffectiveRValue/text()') is not None:
+            every_layer_has_nominal_rvalue = False
+
+        return every_layer_has_nominal_rvalue
 
     def get_attic_knee_walls(self, attic, b):
         knee_walls = []
@@ -109,6 +144,42 @@ class HPXML3toHEScoreTranslator(HPXMLtoHEScoreTranslatorBase):
 
         return floor_r
 
+    def get_attic_floor_assembly_rvalue(self, attic, b):
+        frame_floors = self.get_attic_floors(attic, b)
+        if len(frame_floors) == 0:
+            return None
+
+        frame_floor_dict_ls = []
+        for frame_floor in frame_floors:
+            floor_area = convert_to_type(float, self.xpath(frame_floor, 'h:Area/text()'))
+            assembly_rvalue = convert_to_type(
+                float, self.xpath(frame_floor, 'h:Insulation/h:AssemblyEffectiveRValue/text()'))
+            if assembly_rvalue is None:
+                return
+            frame_floor_dict_ls.append({'area': floor_area, 'rvalue': assembly_rvalue})
+        # Average
+        try:
+            floor_r = sum(x['area'] for x in frame_floor_dict_ls) / \
+                      sum(x['area'] / x['rvalue'] for x in frame_floor_dict_ls)
+        except ZeroDivisionError:
+            floor_r = None
+
+        return convert_to_type(float, floor_r)
+
+    def every_attic_floor_layer_has_nominal_rvalue(self, attic, b):
+        frame_floors = self.get_attic_floors(attic, b)
+        every_layer_has_nominal_rvalue = True  # Considered to have nominal R-value unless assembly R-value is used
+        for frame_floor in frame_floors:
+            for layer in self.xpath(frame_floor, 'h:Insulation/h:Layer', aslist=True):
+                if self.xpath(layer, 'h:NominalRValue') is None:
+                    every_layer_has_nominal_rvalue = False
+                    break
+            if self.xpath(frame_floor, 'h:Insulation/h:AssemblyEffectiveRValue/text()') is not None:
+                every_layer_has_nominal_rvalue = False
+                break
+
+        return every_layer_has_nominal_rvalue
+
     def get_attic_floors(self, attic, b):
         floor_idref = self.xpath(attic, 'h:AttachedToFrameFloor/@idref')
         # No frame floor attached
@@ -160,15 +231,37 @@ class HPXML3toHEScoreTranslator(HPXMLtoHEScoreTranslatorBase):
     def get_attic_roof_area(self, roof):
         return self.xpath(roof, 'h:Area/text()')
 
+    def get_framefloor_assembly_rvalue(self, v2_framefloor, framefloor):
+        return convert_to_type(float, self.xpath(framefloor, 'h:Insulation/h:AssemblyEffectiveRValue/text()'))
+
+    def get_foundation_wall_assembly_rvalue(self, v2_fwall, fwall):
+        return convert_to_type(float, self.xpath(fwall, 'h:Insulation/h:AssemblyEffectiveRValue/text()'))
+
+    def get_slab_assembly_rvalue(self, v2_slab, slab):
+        return convert_to_type(float, self.xpath(slab, 'h:PerimeterInsulation/h:AssemblyEffectiveRValue/text()'))
+
+    def every_framefloor_layer_has_nominal_rvalue(self, v2_framefloor, framefloor):
+        framefloor_layers = self.xpath(framefloor, 'h:Insulation/h:Layer', aslist=True)
+        every_layer_has_nominal_rvalue = True  # Considered to have nominal R-value unless assembly R-value is used
+        if framefloor_layers:
+            for layer in framefloor_layers:
+                if self.xpath(layer, 'h:NominalRValue') is None:
+                    every_layer_has_nominal_rvalue = False
+                    break
+        elif self.xpath(framefloor, 'h:Insulation/h:AssemblyEffectiveRValue/text()') is not None:
+            every_layer_has_nominal_rvalue = False
+
+        return every_layer_has_nominal_rvalue
+
     def get_solarscreen(self, wndw_skylight):
         return bool(self.xpath(wndw_skylight, 'h:ExteriorShading/h:Type/text()') == 'solar screens')
 
     def get_hescore_walls(self, b):
-        return self.xpath(b,
-                          'h:BuildingDetails/h:Enclosure/h:Walls/h:Wall[h:ExteriorAdjacentTo="outside" or not('
-                          'h:ExteriorAdjacentTo)]',
-                          # noqa: E501
-                          aslist=True)
+        return self.xpath(
+            b, 'h:BuildingDetails/h:Enclosure/h:Walls/h:Wall\
+                [((h:ExteriorAdjacentTo="outside" and not(contains(h:ExteriorAdjacentTo, "garage"))) or\
+                    not(h:ExteriorAdjacentTo)) and not(contains(h:InteriorAdjacentTo, "attic"))]',  # noqa: E501
+            aslist=True)
 
     def check_is_doublepane(self, window, glass_layers):
         return (self.xpath(window, 'h:StormWindow') is not None and glass_layers == 'single-pane') or \
@@ -181,7 +274,12 @@ class HPXML3toHEScoreTranslator(HPXMLtoHEScoreTranslatorBase):
         return False
 
     def get_duct_location(self, hpxml_duct_location, bldg):
-        loc_hierarchy = self.duct_location_map[hpxml_duct_location]
+        try:
+            loc_hierarchy = self.duct_location_map[hpxml_duct_location]
+            if loc_hierarchy is None:
+                return
+        except TypeError:
+            raise TranslationError('Invalid duct location specified')
         if loc_hierarchy is None:
             return
         for loc in loc_hierarchy:
diff --git a/hescorehpxml/lookups/lu_ceiling_eff_rvalue.csv b/hescorehpxml/lookups/lu_ceiling_eff_rvalue.csv
new file mode 100644
index 00000000..e538309d
--- /dev/null
+++ b/hescorehpxml/lookups/lu_ceiling_eff_rvalue.csv
@@ -0,0 +1,14 @@
+doe2code,U-value,Eff-R-value
+ecwf00,0.455,2.2
+ecwf03,0.200,5
+ecwf06,0.132,7.6
+ecwf09,0.100,10
+ecwf11,0.092,10.9
+ecwf19,0.052,19.2
+ecwf21,0.047,21.3
+ecwf25,0.039,25.6
+ecwf30,0.033,30.3
+ecwf38,0.026,38.5
+ecwf44,0.023,43.5
+ecwf49,0.020,50
+ecwf60,0.017,58.8
diff --git a/hescorehpxml/lookups/lu_floor_eff_rvalue.csv b/hescorehpxml/lookups/lu_floor_eff_rvalue.csv
new file mode 100644
index 00000000..20295326
--- /dev/null
+++ b/hescorehpxml/lookups/lu_floor_eff_rvalue.csv
@@ -0,0 +1,10 @@
+doe2code,U-value,Eff-R-value
+efwf00ca,0.169,5.9
+efwf11ca,0.064,15.6
+efwf13ca,0.058,17.2
+efwf15ca,0.054,18.5
+efwf19ca,0.045,22.2
+efwf21ca,0.042,23.8
+efwf25ca,0.037,27
+efwf30ca,0.032,31.3
+efwf38ca,0.027,37
diff --git a/hescorehpxml/lookups/lu_roof_eff_rvalue.csv b/hescorehpxml/lookups/lu_roof_eff_rvalue.csv
new file mode 100644
index 00000000..6394a09e
--- /dev/null
+++ b/hescorehpxml/lookups/lu_roof_eff_rvalue.csv
@@ -0,0 +1,71 @@
+doe2code,U-value,Eff-R-value
+rfps00co,0.115,8.7
+rfps00lc,0.114,8.8
+rfps00rc,0.113,8.8
+rfps00tg,0.11,9.1
+rfps00wo,0.106,9.4
+rfps11co,0.053,18.9
+rfps11lc,0.053,18.9
+rfps11rc,0.053,18.9
+rfps11tg,0.052,19.2
+rfps11wo,0.051,19.6
+rfps13co,0.049,20.4
+rfps13lc,0.049,20.4
+rfps13rc,0.049,20.4
+rfps13tg,0.048,20.8
+rfps13wo,0.047,21.3
+rfps15co,0.046,21.7
+rfps15lc,0.046,21.7
+rfps15rc,0.046,21.7
+rfps15tg,0.045,22.2
+rfps15wo,0.045,22.2
+rfps19lc,0.039,25.6
+rfps19rc,0.039,25.6
+rfps19tg,0.039,25.6
+rfps19wo,0.038,26.3
+rfps21lc,0.038,26.3
+rfps21rc,0.037,27.0
+rfps21tg,0.037,27.0
+rfps21wo,0.036,27.8
+rfwf00co,0.273,3.7
+rfwf00lc,0.266,3.8
+rfwf00rc,0.262,3.8
+rfwf00tg,0.246,4.1
+rfwf00wo,0.227,4.4
+rfwf11co,0.072,13.9
+rfwf11lc,0.072,13.9
+rfwf11rc,0.071,14.1
+rfwf11tg,0.07,14.3
+rfwf11wo,0.068,14.7
+rfwf13co,0.065,15.4
+rfwf13lc,0.065,15.4
+rfwf13rc,0.065,15.4
+rfwf13tg,0.064,15.6
+rfwf13wo,0.062,16.1
+rfwf15co,0.06,16.7
+rfwf15lc,0.06,16.7
+rfwf15rc,0.059,16.9
+rfwf15tg,0.058,17.2
+rfwf15wo,0.057,17.5
+rfwf19lc,0.048,20.8
+rfwf19rc,0.048,20.8
+rfwf19tg,0.048,20.8
+rfwf19wo,0.047,21.3
+rfwf21lc,0.046,21.7
+rfwf21rc,0.045,22.2
+rfwf21tg,0.045,22.2
+rfwf21wo,0.044,22.7
+rfwf27lc,0.037,27.0
+rfwf27rc,0.037,27.0
+rfwf27tg,0.036,27.8
+rfwf27wo,0.036,27.8
+rfwf19co,0.047,21.3
+rfwf21co,0.044,22.7
+rfwf27co,0.035,28.6
+rfwf30co,0.032,31.3
+rfwf30wo,0.031,32.3
+rfwf30rc,0.032,31.3
+rfwf30lc,0.032,31.3
+rfwf30tg,0.032,31.3
+rfps19co,0.038,26.3
+rfps21co,0.036,27.8
\ No newline at end of file
diff --git a/hescorehpxml/lookups/lu_wall_eff_rvalue.csv b/hescorehpxml/lookups/lu_wall_eff_rvalue.csv
new file mode 100644
index 00000000..7683d5a1
--- /dev/null
+++ b/hescorehpxml/lookups/lu_wall_eff_rvalue.csv
@@ -0,0 +1,178 @@
+doe2code,U-value,Eff-R-value
+ewbr00nn,0.304,3.3
+ewbr05nn,0.121,8.3
+ewbr10nn,0.075,13.3
+ewcb00br,0.167,6.0
+ewcb00nn,0.229,4.4
+ewcb00st,0.222,4.5
+ewcb03br,0.132,7.6
+ewcb03nn,0.168,6.0
+ewcb03st,0.164,6.1
+ewcb06br,0.096,10.4
+ewcb06nn,0.115,8.7
+ewcb06st,0.113,8.8
+ewih11al,0.089,11.2
+ewih11br,0.082,12.2
+ewih11st,0.092,10.9
+ewih11vi,0.088,11.4
+ewih11wo,0.082,12.2
+ewih13al,0.082,12.2
+ewih13br,0.076,13.2
+ewih13st,0.085,11.8
+ewih13vi,0.081,12.3
+ewih13wo,0.076,13.2
+ewih15al,0.076,13.2
+ewih15br,0.071,14.1
+ewih15st,0.079,12.7
+ewih15vi,0.076,13.2
+ewih15wo,0.071,14.1
+ewih19al,0.06,16.7
+ewih19br,0.056,17.9
+ewih19st,0.061,16.4
+ewih19vi,0.059,16.9
+ewih19wo,0.057,17.5
+ewih21br,0.054,18.5
+ewih21st,0.058,17.2
+ewih21vi,0.056,17.9
+ewih21wo,0.054,18.5
+ewop19al,0.042,23.8
+ewop19br,0.04,25.0
+ewop19st,0.043,23.3
+ewop19vi,0.042,23.8
+ewop19wo,0.04,25.0
+ewop21al,0.04,25.0
+ewop21br,0.038,26.3
+ewop21st,0.04,25.0
+ewop21vi,0.039,25.6
+ewop21wo,0.038,26.3
+ewov19al,0.054,18.5
+ewov19br,0.051,19.6
+ewov19st,0.055,18.2
+ewov19vi,0.053,18.9
+ewov19wo,0.051,19.6
+ewov21al,0.05,20.0
+ewov21br,0.048,20.8
+ewov21st,0.051,19.6
+ewov21vi,0.05,20.0
+ewov21wo,0.048,20.8
+ewov27al,0.04,25.0
+ewov27br,0.039,25.6
+ewov27st,0.041,24.4
+ewov27vi,0.04,25.0
+ewov27wo,0.039,25.6
+ewov33al,0.033,30.3
+ewov33br,0.032,31.3
+ewov33st,0.034,29.4
+ewov33vi,0.033,30.3
+ewov33wo,0.032,31.3
+ewov38al,0.029,34.5
+ewov38br,0.028,35.7
+ewov38st,0.029,34.5
+ewov38vi,0.029,34.5
+ewov38wo,0.028,35.7
+ewph11al,0.061,16.4
+ewph11br,0.057,17.5
+ewph11st,0.062,16.1
+ewph11vi,0.06,16.7
+ewph11wo,0.058,17.2
+ewph13al,0.057,17.5
+ewph13br,0.054,18.5
+ewph13st,0.058,17.2
+ewph13vi,0.057,17.5
+ewph13wo,0.054,18.5
+ewph15al,0.054,18.5
+ewph15br,0.051,19.6
+ewph15st,0.055,18.2
+ewph15vi,0.054,18.5
+ewph15wo,0.052,19.2
+ewph19al,0.045,22.2
+ewph19br,0.043,23.3
+ewph19st,0.046,21.7
+ewph19vi,0.045,22.2
+ewph19wo,0.044,22.7
+ewph21al,0.044,22.7
+ewph21br,0.042,23.8
+ewph21st,0.044,22.7
+ewph21vi,0.043,23.3
+ewph21wo,0.042,23.8
+ewps11al,0.061,16.4
+ewps11br,0.058,17.2
+ewps11st,0.063,15.9
+ewps11vi,0.061,16.4
+ewps11wo,0.058,17.2
+ewps13al,0.058,17.2
+ewps13br,0.055,18.2
+ewps13st,0.059,16.9
+ewps13vi,0.058,17.2
+ewps13wo,0.055,18.2
+ewps15al,0.055,18.2
+ewps15br,0.052,19.2
+ewps15st,0.056,17.9
+ewps15vi,0.055,18.2
+ewps15wo,0.053,18.9
+ewps19al,0.046,21.7
+ewps19br,0.044,22.7
+ewps19st,0.047,21.3
+ewps19vi,0.046,21.7
+ewps19wo,0.044,22.7
+ewps21al,0.044,22.7
+ewps21br,0.043,23.3
+ewps21st,0.045,22.2
+ewps21vi,0.044,22.7
+ewps21wo,0.043,23.3
+ewsb00st,0.017,58.8
+ewwf00al,0.242,4.1
+ewwf00br,0.196,5.1
+ewwf00st,0.28,3.6
+ewwf00vi,0.235,4.3
+ewwf00wo,0.201,5.0
+ewwf03al,0.151,6.6
+ewwf03br,0.132,7.6
+ewwf03st,0.161,6.2
+ewwf03vi,0.149,6.7
+ewwf03wo,0.135,7.4
+ewwf07al,0.108,9.3
+ewwf07br,0.098,10.2
+ewwf07st,0.113,8.8
+ewwf07vi,0.107,9.3
+ewwf07wo,0.099,10.1
+ewwf11al,0.09,11.1
+ewwf11br,0.083,12.0
+ewwf11st,0.094,10.6
+ewwf11vi,0.089,11.2
+ewwf11wo,0.084,11.9
+ewwf13al,0.084,11.9
+ewwf13br,0.077,13.0
+ewwf13st,0.087,11.5
+ewwf13vi,0.083,12.0
+ewwf13wo,0.078,12.8
+ewwf15al,0.079,12.7
+ewwf15br,0.073,13.7
+ewwf15st,0.082,12.2
+ewwf15vi,0.078,12.8
+ewwf15wo,0.073,13.7
+ewwf19al,0.061,16.4
+ewwf19br,0.058,17.2
+ewwf19st,0.063,15.9
+ewwf19vi,0.061,16.4
+ewwf19wo,0.058,17.2
+ewwf21al,0.058,17.2
+ewwf21br,0.055,18.2
+ewwf21st,0.06,16.7
+ewwf21vi,0.058,17.2
+ewwf21wo,0.055,18.2
+ewps00wo,0.1,10.0
+ewps00st,0.116,8.6
+ewps00vi,0.108,9.3
+ewps00al,0.109,9.2
+ewps00br,0.099,10.1
+ewps03wo,0.08,12.5
+ewps03st,0.089,11.2
+ewps03vi,0.085,11.8
+ewps03al,0.086,11.6
+ewps03br,0.08,12.5
+ewps07wo,0.066,15.2
+ewps07st,0.071,14.1
+ewps07vi,0.069,14.5
+ewps07al,0.069,14.5
+ewps07br,0.065,15.4
\ No newline at end of file


Test patch:
diff --git a/tests/test_translation.py b/tests/test_translation.py
index 1fc11025..80849f48 100644
--- a/tests/test_translation.py
+++ b/tests/test_translation.py
@@ -106,6 +106,9 @@ class TestAPIHouses(unittest.TestCase, ComparatorBase):
     def test_house8(self):
         self._do_full_compare('house8')
 
+    def test_assembly_rvalue(self):
+        self._do_full_compare('hescore_min_assembly_rvalue')
+
 
 class TestCLI(unittest.TestCase, ComparatorBase):
 
@@ -871,8 +874,8 @@ class TestOtherHouses(unittest.TestCase, ComparatorBase):
         attic_type.addprevious(etree.Element(tr.addns('h:AtticKneeWall'), {'idref': 'wall2'}))
         # run translation
         resp = tr.hpxml_to_hescore()
-        self.assertEqual(resp['building']['zone']['zone_roof'][0]['ceiling_assembly_code'], 'ecwf38')
-        self.assertAlmostEqual(resp['building']['zone']['zone_roof'][0]['roof_area'], 1400.0)
+        self.assertEqual(resp['building']['zone']['zone_roof'][0]['ceiling_assembly_code'], 'ecwf49')
+        self.assertAlmostEqual(resp['building']['zone']['zone_roof'][0]['roof_area'], 1200.0)
 
         # HPXML v3
         tr_v3 = self._load_xmlfile('hescore_min_v3')
@@ -901,6 +904,39 @@ class TestOtherHouses(unittest.TestCase, ComparatorBase):
         resp_v3 = tr_v3.hpxml_to_hescore()
         self.assertEqual(resp['building']['zone']['zone_roof'], resp_v3['building']['zone']['zone_roof'])
 
+    def test_radiant_barrier(self):
+        tr_v3 = self._load_xmlfile('house2_v3')
+        # run translation
+        resp_v3 = tr_v3.hpxml_to_hescore()
+        self.assertEqual(resp_v3['building']['zone']['zone_roof'][0]['roof_assembly_code'], 'rfrb00co')
+        # roof with radiant barrier (Nominal R-value > 0)
+        roof = self.xpath('//h:Roof[1]')
+        E = self.element_maker()
+        roof_ins = E.Insulation(
+            E.SystemIdentifier(id='roof_ins'),
+            E.Layer(
+                E.InstallationType('cavity'),
+                E.NominalRValue('11')
+            )
+        )
+        roof.append(roof_ins)
+        # run translation
+        resp_v3 = tr_v3.hpxml_to_hescore()
+        self.assertEqual(resp_v3['building']['zone']['zone_roof'][0]['roof_assembly_code'], 'rfwf11co')
+
+        tr_v3 = self._load_xmlfile('house2_v3')
+        # roof with radiant barrier (Assembly R-value > 0)
+        roof = self.xpath('//h:Roof[1]')
+        E = self.element_maker()
+        roof_ins = E.Insulation(
+            E.SystemIdentifier(id='roof_ins'),
+            E.AssemblyEffectiveRValue('11')
+        )
+        roof.append(roof_ins)
+        # run translation
+        resp_v3 = tr_v3.hpxml_to_hescore()
+        self.assertEqual(resp_v3['building']['zone']['zone_roof'][0]['roof_assembly_code'], 'rfwf11co')
+
     def test_attic_knee_wall_zero_rvalue(self):
         tr = self._load_xmlfile('hescore_min')
         # make a copy of the first wall
@@ -934,8 +970,8 @@ class TestOtherHouses(unittest.TestCase, ComparatorBase):
         kneewall_rvalue_el.text = '0'
         # run translation
         resp = tr.hpxml_to_hescore()
-        self.assertEqual(resp['building']['zone']['zone_roof'][0]['ceiling_assembly_code'], 'ecwf09')
-        self.assertAlmostEqual(resp['building']['zone']['zone_roof'][0]['roof_area'], 1400.0)
+        self.assertEqual(resp['building']['zone']['zone_roof'][0]['ceiling_assembly_code'], 'ecwf49')
+        self.assertAlmostEqual(resp['building']['zone']['zone_roof'][0]['roof_area'], 1200.0)
         # Set kneewall R-value to 11 and attic floor R-value to zero
         kneewall_rvalue_el.text = '11'
         attic_floor_rvalue_el = self.xpath('//h:Attic/h:AtticFloorInsulation/h:Layer/h:NominalRValue')
@@ -943,7 +979,7 @@ class TestOtherHouses(unittest.TestCase, ComparatorBase):
         # run translation
         resp = tr.hpxml_to_hescore()
         self.assertEqual(resp['building']['zone']['zone_roof'][0]['ceiling_assembly_code'], 'ecwf00')
-        self.assertAlmostEqual(resp['building']['zone']['zone_roof'][0]['roof_area'], 1400.0)
+        self.assertAlmostEqual(resp['building']['zone']['zone_roof'][0]['roof_area'], 1200.0)
 
     def test_gable_wall_ignore(self):
         tr = self._load_xmlfile('hescore_min_v3')
@@ -1138,6 +1174,56 @@ class TestOtherHouses(unittest.TestCase, ComparatorBase):
         el.getparent().remove(el)
         self.assertRaises(ElementNotFoundError, tr.hpxml_to_hescore)
 
+    def test_assembly_rvalues(self):
+        tr = self._load_xmlfile('hescore_min_assembly_rvalue')
+        res = tr.hpxml_to_hescore()
+        self.assertEqual(res['building']['zone']['zone_wall'][0]['wall_assembly_code'], 'ewwf11br')
+        self.assertEqual(res['building']['zone']['zone_wall'][1]['wall_assembly_code'], 'ewwf11br')
+        self.assertEqual(res['building']['zone']['zone_wall'][2]['wall_assembly_code'], 'ewwf11br')
+        self.assertEqual(res['building']['zone']['zone_wall'][3]['wall_assembly_code'], 'ewwf11br')
+        self.assertEqual(res['building']['zone']['zone_roof'][0]['roof_assembly_code'], 'rfwf00co')
+        self.assertEqual(res['building']['zone']['zone_roof'][0]['ceiling_assembly_code'], 'ecwf38')
+        self.assertEqual(res['building']['zone']['zone_floor'][0]['floor_assembly_code'], 'efwf15ca')
+
+        tr = self._load_xmlfile('house9')
+        res = tr.hpxml_to_hescore()
+        self.assertEqual(res['building']['zone']['zone_wall'][0]['wall_assembly_code'], 'ewwf15wo')
+        self.assertEqual(res['building']['zone']['zone_wall'][1]['wall_assembly_code'], 'ewwf13wo')
+        self.assertEqual(res['building']['zone']['zone_wall'][2]['wall_assembly_code'], 'ewwf13wo')
+        self.assertEqual(res['building']['zone']['zone_wall'][3]['wall_assembly_code'], 'ewwf13wo')
+        self.assertEqual(res['building']['zone']['zone_roof'][0]['roof_assembly_code'], 'rfwf00wo')
+        self.assertEqual(res['building']['zone']['zone_roof'][0]['ceiling_assembly_code'], 'ecwf25')
+        self.assertEqual(res['building']['zone']['zone_floor'][0]['floor_assembly_code'], 'efwf30ca')
+
+        tr = self._load_xmlfile('house9')
+        E = self.element_maker()
+        fwall_ins_layers = self.xpath('//h:FoundationWalls/h:FoundationWall/h:Insulation/h:Layer')
+        fwall_ins = fwall_ins_layers[0].getparent()
+        for fwall_ins_layer in fwall_ins_layers:
+            fwall_ins_layer.getparent().remove(fwall_ins_layer)
+        fwall_ins.append(
+            E.AssemblyEffectiveRValue('7.6')
+        )
+        self.assertRaisesRegex(
+            TranslationError,
+            'Every foundation wall insulation layer needs a NominalRValue, fwall_id = Surface_13',
+            tr.hpxml_to_hescore
+        )
+
+        tr = self._load_xmlfile('house3')
+        E = self.element_maker()
+        slab_perim_ins_layer = self.xpath('//h:Slab/h:PerimeterInsulation/h:Layer')
+        slab_perim_ins = slab_perim_ins_layer.getparent()
+        slab_perim_ins_layer.getparent().remove(slab_perim_ins_layer)
+        slab_perim_ins.append(
+            E.AssemblyEffectiveRValue('7.6')
+        )
+        self.assertRaisesRegex(
+            TranslationError,
+            'Every slab insulation layer needs a NominalRValue, slab_id = slab1',
+            tr.hpxml_to_hescore
+        )
+
     def test_duct_leakage_to_outside(self):
         tr = self._load_xmlfile('house1')
         E = self.element_maker()
@@ -3251,6 +3337,17 @@ class TestHEScore2021Updates(unittest.TestCase, ComparatorBase):
         self.assertEqual(res3['building']['zone']['zone_roof'][1]['zone_skylight']['skylight_code'], 'dtab')
         self.assertFalse(res3['building']['zone']['zone_roof'][1]['zone_skylight']['solar_screen'])
 
+    def test_xps_negative(self):
+        tr = self._load_xmlfile('hescore_min_v3')
+        wall = self.xpath('//h:Wall[h:SystemIdentifier/@id="wall1"]')
+        tr.xpath(wall, 'h:Insulation/h:Layer/h:NominalRValue').text = "0"
+        wood_stud = tr.xpath(wall, 'descendant::h:WoodStud')
+        xps_el = etree.Element(tr.addns('h:ExpandedPolystyreneSheathing'))
+        xps_el.text = 'true'
+        wood_stud.append(xps_el)
+        res = tr.hpxml_to_hescore()
+        self.assertEqual(res['building']['zone']['zone_wall'][0]['wall_assembly_code'], 'ewps00br')
+
     def test_zip_plus4(self):
         tr = self._load_xmlfile('hescore_min_v3')
         el = self.xpath('//h:ZipCode')