diff --git a/.gitignore b/.gitignore
index e01179313c117b378a3296f3ce387b8ab11cc6a6..14a3932859b0d3861f1f04b3b5317090ae1dc7e1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,7 +7,14 @@
 # Unignore all dirs
 !*/
 
+<<<<<<< HEAD
 !Makefile
+=======
+# Unignore Makefiles, and TestPreferences
+!Makefile
+!TestPreferences
+!*/3rdParty/Makefile
+>>>>>>> dev
 
 *.cub
 *.o
@@ -18,17 +25,22 @@ moc_*
 *.pb.*
 *.lbl
 *.img
+<<<<<<< HEAD
 
 !TestPreferences
 
 print.prt
 
+=======
+*.kate-swp
+>>>>>>> dev
 object_script.*.Release
 object_script.*.Debug
 *_plugin_import.cpp
 *.moc
 ui_*.h
 
+<<<<<<< HEAD
 */3rdParty/*
 !*/3rdParty/Makefile
 
@@ -42,3 +54,17 @@ ui_*.h
 */tsts/*/truth/*
 */tsts/*/output/*
 
+=======
+# ignore all files created by squish coco
+*csmes
+
+print.prt
+
+*/3rdParty/*
+*/inc/*
+*/bin/*
+*/lib/*
+*/tsts/*/input/*
+*/tsts/*/truth/*
+*/tsts/*/output/*
+>>>>>>> dev
diff --git a/isis/src/base/apps/automos/automos.xml b/isis/src/base/apps/automos/automos.xml
index 7bec2a92bde633a3ee508139089bf868cfd88424..395cd9141f11ddd1dc9ee202aad3e8632f6927af 100644
--- a/isis/src/base/apps/automos/automos.xml
+++ b/isis/src/base/apps/automos/automos.xml
@@ -25,15 +25,15 @@
         program will create it from the input cubes. Otherwise, the input cubes will be placed
         into the existing mosaic cube.
         <p>
-          REQUIREMENT: The listed input cubes must be map projected (<def>Level2</def>).  
+          REQUIREMENT: The listed input cubes must be map projected (<def>Level2</def>).
           The input cubes are required to be projected to the EXACT SAME ProjectionName,
           PixelResolution (or MapScale), EquatorialRadius, PolarRadius, LatitudeType,
           LongitudeDirection, as well as specific map projection keywords (e.g., CenterLatitude,
           CenterLongitude).  If these map projection requirements are not met, an error will be
           encountered.
         </p>
-        <b>Note</b>: The latitude and longitude range of the individual input cubes may vary. 
-        <p>  
+        <b>Note</b>: The latitude and longitude range of the individual input cubes may vary.
+        <p>
           By default, the input cubes are placed into the mosaic in the order in which they appear
           in the input list.   <b>Automos</b> automatically determines the size of the new output
           mosaic by examining the latitude and longitude range of each input cube. The user may
@@ -77,7 +77,7 @@
       </p>
       <p>
         <b>
-          The following table describes how the program will determine the pixel value in the output 
+          The following table describes how the program will determine the pixel value in the output
           mosaic for areas of image overlap.
         </b>
         <table border="1" >
@@ -89,7 +89,7 @@
               output mosaic. Thus in any area of overlap, the Valid pixel values for the
               current input image will appear in the output mosaic (it replaces the output mosaic
               pixel).  Invalid input <def>Special Pixels</def>
-              (<def>NULL</def>,<def>HRS</def>,<def>HIS</def>,<def>LRS</def>,<def>LIS</def>) will NOT 
+              (<def>NULL</def>,<def>HRS</def>,<def>HIS</def>,<def>LRS</def>,<def>LIS</def>) will NOT
               replace an existing Valid output mosaic pixel. Refer to parameters HIGHSATURATION,
               LOWSATURATION, and NULL to override replacement of Valid output mosaic pixels.
             </td>
@@ -97,7 +97,7 @@
           <tr>
             <td>BENEATH</td>
             <td>
-              The current input image will be placed beneath the output mosaic. Thus in 
+              The current input image will be placed beneath the output mosaic. Thus in
               any area of overlap, the Valid pixel values for the current mosaic will remain in
               the output mosaic. The Valid pixel values for the current input image will only
               replace the NULL pixels values in the output mosaic.  The HRS,HIS,LRS and LIS  special
@@ -109,8 +109,8 @@
           <tr>
             <td>BAND</td>
             <td>
-              The input image pixels will be placed in the output mosaic based on the "Lesser" or 
-              "Greater" criteria of a priority band defined by the user.  Parameters that apply to 
+              The input image pixels will be placed in the output mosaic based on the "Lesser" or
+              "Greater" criteria of a priority band defined by the user.  Parameters that apply to
               this priority feature are TYPE, NUMBER, KEYNAME, KEYVALUE, CRITERIA.
             </td>
           </tr>
@@ -119,7 +119,7 @@
             <td>
               Overlapping Valid pixel values from the current input image and output mosaic will be
               averaged for the new mosaic pixel values. A count-band is created with the output
-              mosaic file.  The count-band keeps track of the number of images involved in the 
+              mosaic file.  The count-band keeps track of the number of images involved in the
               averaging of the input dn values for each pixel in the mosaic. Invalid input pixel
               values will not be included in the average.  In the case where only one Valid pixel
               exists between the input image pixels or the current mosaic pixel, the Valid pixel is
@@ -132,14 +132,14 @@
               </p>
               <p>
                 <b>NOTE</b>: If an existing mosaic does not already contain a count-band, an error
-                will be encountered.  
+                will be encountered.
               </p>
             </td>
           </tr>
         </table>
-      </p>  
-      <p> 
-        Each of the following priority option tables indicates the resulting output pixel for a 
+      </p>
+      <p>
+        Each of the following priority option tables indicates the resulting output pixel for a
         particular input pixel, given the selected special pixel options  (parameters
         HIGHSATURATION for HRS, HIS;  LOWSATURATION for LRS, LIS; and NULL) in each table row.
 
@@ -148,8 +148,8 @@
           The graphics below are commented out because they are no longer correct.
           *******************************************************************************
         -->
-        <!--        
-        <table cellspacing="0" cellpadding="1" border="0"> 
+        <!--
+        <table cellspacing="0" cellpadding="1" border="0">
           <tr><th colspan="3" align="center"><u>  Priority OnTop</u></th></tr>
           <tr height="15"><th colspan="3"></th></tr>
           <tr><td class="td"><img src="assets/OnTop.jpg" alt="Priority OnTop" />  </td>
@@ -176,19 +176,19 @@
                       <td class="td2">False</td>
                       <td class="td2">Special</td>
                       <td class="td2">High Saturation or Low Saturation or Valid</td>
-                      <td class="td2">Mosaic</td></tr>  
+                      <td class="td2">Mosaic</td></tr>
                   <tr><td class="td2">False</td>
                       <td class="td2">False</td>
                       <td class="td2">False</td>
                       <td class="td2">Special or Valid</td>
                       <td class="td2">Null</td>
-                      <td class="td2">Input</td></tr>                    
+                      <td class="td2">Input</td></tr>
                   <tr><td class="td2">True or False</td>
                       <td class="td2">True or False</td>
                       <td class="td2">True</td>
                       <td class="td2">Valid</td>
                       <td class="td2">Special or Valid</td>
-                      <td class="td2">Input</td></tr>           
+                      <td class="td2">Input</td></tr>
                   <tr><td class="td2">True or False</td>
                       <td class="td2">True or False</td>
                       <td class="td2">True</td>
@@ -197,17 +197,17 @@
                       <td class="td2">Input</td></tr>
                 </table>
 <!--              </td>
-          </tr> 
+          </tr>
         </table>-->
         <br></br><br></br><br></br>
-<!--         
+<!--
         <table cellspacing="0" cellpadding="1" border="0">
           <tr><th colspan="3" align="center"><u>Priority Beneath</u></th></tr>
           <tr height="15"><th colspan="3"></th></tr>
           <tr><td class="td"><img src="assets/Beneath.jpg" alt="Priority Beneath" />  </td>
               <td class="td" width="30"></td>
               <td class="td">-->
-                <table cellspacing="0" cellpadding="1" border="1"> 
+                <table cellspacing="0" cellpadding="1" border="1">
                   <tr><th colspan="3" align="center">PRIORITY=BENEATH</th></tr>
                   <tr><th>Input Pixel Value Type</th>
                       <th>Current Mosaic Pixel Value Type</th>
@@ -222,12 +222,12 @@
                   </tr>
                 </table>
               <!--</td>
-          </tr> 
+          </tr>
         </table>-->
 
         <br></br><br></br><br></br>
-<!--      
-        <table cellspacing="0" cellpadding="1" border="0"> 
+<!--
+        <table cellspacing="0" cellpadding="1" border="0">
           <tr><th colspan="3" align="center"><u> Priority Band</u></th></tr>
           <tr height="15"><th colspan="3"></th></tr>
           <tr><td class="td"><img src="assets/Band.jpg" alt="Priority Band" />  </td>
@@ -240,55 +240,55 @@
                   <tr><th>High Saturation</th><th>Low Saturation</th><th>Null</th>
                       <th>Input Pixel Value Type</th><th>Current Mosaic Pixel Value Type</th>
                       <th>Output Mosaic Pixel Value Source</th></tr>
-                  <tr><td class="td2">False</td>           
-                      <td class="td2">False</td>       
+                  <tr><td class="td2">False</td>
+                      <td class="td2">False</td>
                       <td class="td2">False</td>
-                      <td class="td2">Valid</td>           
-                      <td class="td2">Valid</td>       
+                      <td class="td2">Valid</td>
+                      <td class="td2">Valid</td>
                       <td class="td2">Criteria based</td></tr>
-                  <tr><td class="td2">False</td>           
-                      <td class="td2">False</td>       
+                  <tr><td class="td2">False</td>
                       <td class="td2">False</td>
-                      <td class="td2">Valid</td>           
-                      <td class="td2">Special</td>       
+                      <td class="td2">False</td>
+                      <td class="td2">Valid</td>
+                      <td class="td2">Special</td>
                       <td class="td2">Input</td></tr>
-                  <tr><td class="td2">False</td>           
-                      <td class="td2">False</td>       
+                  <tr><td class="td2">False</td>
+                      <td class="td2">False</td>
                       <td class="td2">False</td>
-                      <td class="td2">Special</td>         
-                      <td class="td2">High Saturation or Low Saturation or Valid</td> 
+                      <td class="td2">Special</td>
+                      <td class="td2">High Saturation or Low Saturation or Valid</td>
                       <td class="td2">Mosaic</td></tr>
-                  <tr><td class="td2">False</td>           
-                      <td class="td2">False</td>       
+                  <tr><td class="td2">False</td>
+                      <td class="td2">False</td>
                       <td class="td2">False</td>
                       <td class="td2">Special or Valid</td>
-                      <td class="td2">Null</td>    
+                      <td class="td2">Null</td>
                       <td class="td2">Input</td></tr>
-                  <tr><td class="td2">True or False</td>   
-                      <td class="td2">True or False</td>  
+                  <tr><td class="td2">True or False</td>
+                      <td class="td2">True or False</td>
                       <td class="td2">True</td>
-                      <td class="td2">Special</td>         
+                      <td class="td2">Special</td>
                       <td class="td2">Special or Valid</td>
                       <td class="td2">Input</td></tr>
-                  <tr><td class="td2">True or False</td>   
-                      <td class="td2">True or False</td>  
+                  <tr><td class="td2">True or False</td>
+                      <td class="td2">True or False</td>
                       <td class="td2">True</td>
-                      <td class="td2">Valid</td>           
-                      <td class="td2">Valid</td>       
+                      <td class="td2">Valid</td>
+                      <td class="td2">Valid</td>
                       <td class="td2">Criteria based</td></tr>
-                  <tr><td class="td2">True or False</td>   
-                      <td class="td2">True or False</td>  
+                  <tr><td class="td2">True or False</td>
+                      <td class="td2">True or False</td>
                       <td class="td2">True</td>
-                      <td class="td2">Valid</td>           
-                      <td class="td2">Special</td>       
+                      <td class="td2">Valid</td>
+                      <td class="td2">Special</td>
                       <td class="td2">Input</td></tr>
                 </table>
 <!--              </td>
-          </tr> 
+          </tr>
         </table>-->
         <br></br><br></br><br></br>
-<!--       
-        <table cellspacing="0" cellpadding="1" border="0"> 
+<!--
+        <table cellspacing="0" cellpadding="1" border="0">
           <tr><th colspan="3" align="center"><u>Priority Average</u></th></tr>
           <tr height="15"><th colspan="3"></th></tr>
           <tr><td class="td"><img src="assets/Average.jpg" alt="Priority Average" /></td>
@@ -308,7 +308,7 @@
                       <td class="td2">Valid</td>
                       <td class="td2">Valid</td>
                       <td class="td2">Average</td>
-                      <td class="td2">increment count by 1</td></tr> 
+                      <td class="td2">increment count by 1</td></tr>
                   <tr><td class="td2">False</td>
                       <td class="td2">False</td>
                       <td class="td2">False</td>
@@ -322,7 +322,7 @@
                       <td class="td2">Special</td>
                       <td class="td2">Special</td>
                       <td class="td2">Mosaic</td>
-                      <td class="td2">count = 0</td></tr> 
+                      <td class="td2">count = 0</td></tr>
                   <tr><td class="td2">False</td>
                       <td class="td2">False</td>
                       <td class="td2">False</td>
@@ -352,7 +352,7 @@
                       <td class="td2">Input</td>
                       <td class="td2">count = 1</td></tr>
                 </table>
-                <!--</td></tr> 
+                <!--</td></tr>
         </table>
      -->
       </p>
@@ -373,10 +373,10 @@
 
   <history>
     <change name="Jim Mathews" date="1992-01-01">
-       Original version 
+       Original version
     </change>
     <change name="Jeff Anderson" date="2004-02-26">
-       Converted to Isis 3.0 
+       Converted to Isis 3.0
     </change>
     <change name="Jeff Anderson" date="2004-07-28">
        Fixed bug caused by PVL refactor
@@ -395,7 +395,7 @@
       cube bandbin group matches the mosaic bandbin group.  The default is true.
     </change>
     <change name="Sean Crosby" date="2007-02-28">
-      Added an exception that reports which input cube is causing a problem while mosaicking. 
+      Added an exception that reports which input cube is causing a problem while mosaicking.
     </change>
     <change name="Sean Crosby" date="2007-03-06">
       Program no longer throws an exception when an input cube does not fit into the output mosaic.
@@ -405,7 +405,7 @@
       Corrected bug in determining if an image fits into the output mosaic
     </change>
     <change name="Sean Crosby" date="2007-03-20">
-      Fixed one of the application tests 
+      Fixed one of the application tests
     </change>
     <change name="Stuart Sides" date="2007-04-16">
       Fixed bug where input cubes where incorrectly not processed.
@@ -414,35 +414,35 @@
       This program now utilizes ProcessMapMosaic
     </change>
     <change name="Sharmila Prasad" date="2009-10-19">
-      Added option "TRACK" to track pixel origin. Also added new priority called 
-      BAND where  specified input and mosaic band is compared for moving input 
-      to mosaic and to track the pixel origin. Added parameter "TYPE" to choose 
-      Band "NUMBER" or PVL "KEYWORD" from the BandBin group. If "BANDNUMBER" is 
-      chosen, then "NUMBER" is activated to enter band number. If "KEYWORD" 
-      is chosen then parameter "KEYNAME" and "KEYVALUE" are activated to enter  
-      key name and value from the BandBin group for band comparison. Band 
-      comparison "CRITERIA" are "LESSER" or "GREATER" than.  Also there are 
-      options "HIGHSATURATION", "LOWSATURATION" and "NULL", set to true will 
-      cause HS, LS and NULL input pixels to be copied to the mosaic regardless 
+      Added option "TRACK" to track pixel origin. Also added new priority called
+      BAND where  specified input and mosaic band is compared for moving input
+      to mosaic and to track the pixel origin. Added parameter "TYPE" to choose
+      Band "NUMBER" or PVL "KEYWORD" from the BandBin group. If "BANDNUMBER" is
+      chosen, then "NUMBER" is activated to enter band number. If "KEYWORD"
+      is chosen then parameter "KEYNAME" and "KEYVALUE" are activated to enter
+      key name and value from the BandBin group for band comparison. Band
+      comparison "CRITERIA" are "LESSER" or "GREATER" than.  Also there are
+      options "HIGHSATURATION", "LOWSATURATION" and "NULL", set to true will
+      cause HS, LS and NULL input pixels to be copied to the mosaic regardless
       of the priorities and criteria. These options are not supported for  "BENEATH" priority.
-      Track the origin for  multiband ONTOP priority if all the Special Pixel  flags are set. 
+      Track the origin for  multiband ONTOP priority if all the Special Pixel  flags are set.
       Store the Serial numbers of the input mosaic in the mosaic along with the  file name.
     </change>
     <change name="Sharmila Prasad" date="2011-01-19">
-      Added "AVERAGE" priority where the mosaic will be average of valid input 
+      Added "AVERAGE" priority where the mosaic will be average of valid input
       and mosaic pixels.
     </change>
     <change name="Sharmila Prasad" date="2011-01-24">
-      Option to match DEM and also added new group "mosaic" to hold ShapeModel 
+      Option to match DEM and also added new group "mosaic" to hold ShapeModel
       attributes for the mosaic
     </change>
     <change name="Sharmila Prasad" date="2011-09-07">
-      Fixed bug #0000390 - tracking should continue even if the first image does 
-      not map onto the mosaic  
+      Fixed bug #0000390 - tracking should continue even if the first image does
+      not map onto the mosaic
     </change>
     <change name="Sharmila Prasad" date="2011-10-25">
-      Fixed bug #0000464 - add optional list TOLIST containing all the files names 
-      that were added onto the mosaic. 
+      Fixed bug #0000464 - add optional list TOLIST containing all the files names
+      that were added onto the mosaic.
     </change>
     <change name="Sharmila Prasad" date="2011-11-07">
       Updated documentation for Average priority. Fixes #553
@@ -464,12 +464,16 @@
       Changed to use TProjection instead of Projection.  References #775
     </change>
     <change name="Debbie A. Cook" date="2013-04-03">
-      Fixed type in specification of TYPE default in Band Priority group discovered when creating 
+      Fixed type in specification of TYPE default in Band Priority group discovered when creating
       ringsautomos.  It was fixed here to make the applications consistent.  References #775
     </change>
     <change name="Jeannie Backer, Tammy Becker, and Kimberly Oyama" date="2014-04-07">
       Updated user documentation. Fixes #1617. Fixes #1620. References #1623. References #1550.
     </change>
+    <change name="Cole Neubauer" date="2017-11-20">
+      Added parameter checking to XML MAXLON and MAXLAT to check if they are greater than their
+      minimum counterpart. Fixes #5148
+    </change>
   </history>
 
   <groups>
@@ -482,7 +486,7 @@
         </brief>
         <description>
           A list of map projected cubes to mosaic (Level2).  Each cube in the list must have
-          the same ProjectionName, PixelResolution (or MapScale), EquatorialRadius, 
+          the same ProjectionName, PixelResolution (or MapScale), EquatorialRadius,
           PolarRadius, LatitudeType, LongitudeDirection and specific map projection keywords
           such as CenterLatitude and CenterLongitude.  This includes the output mosaic
           if it already exists.  The latitude and longtiude extents of each input file may
@@ -500,9 +504,9 @@
           Mosaic output cube
         </brief>
         <description>
-          If this mosaic cube already exists, then the cubes listed in the input list will 
-          be combined with this cube. The Mapping Group keywords must match between the 
-          existing mosaic and the input cubes.  If this output file does not exist, it will 
+          If this mosaic cube already exists, then the cubes listed in the input list will
+          be combined with this cube. The Mapping Group keywords must match between the
+          existing mosaic and the input cubes.  If this output file does not exist, it will
           be created from the input cubes in the cube list.
         </description>
         <filter>
@@ -518,16 +522,16 @@
           List of images successfully added to the mosaic
         </brief>
         <description>
-          This optional output list contains the names of the images that overlapped within the 
-          latitude and longitude boundaries of the output mosaic and were added.  <b>Automos</b> 
-          does not fail and will only display a warning for the input images that fall completely 
+          This optional output list contains the names of the images that overlapped within the
+          latitude and longitude boundaries of the output mosaic and were added.  <b>Automos</b>
+          does not fail and will only display a warning for the input images that fall completely
           outside the boundaries of the mosaic, this list will not include these images.
         </description>
         <filter>
           *.lis
         </filter>
       </parameter>
-    
+
       <parameter name="PRIORITY">
         <type>string</type>
         <default>
@@ -535,7 +539,7 @@
         </default>
         <brief>The priority of output pixel placement</brief>
         <description>
-          This parameter is used to determine the placement of the input pixels 
+          This parameter is used to determine the placement of the input pixels
           in the output mosaic.
         </description>
 
@@ -543,8 +547,8 @@
           <option value="ONTOP">
             <brief> Input cube will be placed on top of the mosaic </brief>
             <description>
-              A Valid input pixel will replace an output mosaic pixel. 
-              Special input pixels will be copied onto the mosaic only if the 
+              A Valid input pixel will replace an output mosaic pixel.
+              Special input pixels will be copied onto the mosaic only if the
               special pixel flags are set. Refer to HIGHSATURATION, LOWSATURATION and
               NULL for special pixel values.
             </description>
@@ -559,7 +563,7 @@
           <option value="BENEATH">
             <brief>Input cube will be placed beneath the mosaic </brief>
             <description>
-              If the output mosaic pixel is NULL, then the Valid input pixel 
+              If the output mosaic pixel is NULL, then the Valid input pixel
               will be written onto the mosaic, otherwise it remains unchanged.
             </description>
             <exclusions>
@@ -583,7 +587,7 @@
             <description>
               If the Input and Mosaic pixel of the priority band, specified by NUMBER or KEYNAME
               and KEYVALUE, are valid, a less than or greater than comparison is done. Depending on
-              the CRITERIA selected, the lower or higher of the two pixels is placed on top 
+              the CRITERIA selected, the lower or higher of the two pixels is placed on top
               (i.e., replaces the mosaic pixel).  This applies to all the corresponding Valid band
               pixels. Special pixels in the corresponding bands will not replace the output mosaic
               pixel unless the HIGHSATURATION, LOWSATURATION and NULL flags are set to TRUE.  Refer
@@ -600,11 +604,11 @@
           <option value="AVERAGE">
             <brief>Average of valid input and the mosaic pixels</brief>
             <description>
-              If the Input and Mosaic pixels are valid then the output will be the average of the 
-              2 values. A count-band is created in the output mosaic and holds the count of images 
+              If the Input and Mosaic pixels are valid then the output will be the average of the
+              2 values. A count-band is created in the output mosaic and holds the count of images
               corresponding to the output Average DN value of each pixel in the mosaic.
                <b>NOTE</b>: If an existing mosaic does not already contain a count-band, an error
-               will be encountered with Priority=AVERAGE.  
+               will be encountered with Priority=AVERAGE.
             </description>
             <exclusions>
               <item>TYPE</item>
@@ -618,7 +622,7 @@
         </list>
       </parameter>
     </group>
-     
+
     <group name="Band Priority">
       <parameter name="TYPE">
         <type>string</type>
@@ -630,7 +634,7 @@
         <brief>Indicate the Band Name or Number to be used for comparison</brief>
         <description>
           This option allows you to select the method to specify the band
-          to use for the pixel comparison. 
+          to use for the pixel comparison.
         </description>
         <list>
           <option value="BANDNUMBER">
@@ -640,7 +644,7 @@
               Refer to the parameter NUMBER.
             </description>
             <inclusions>
-              <item>NUMBER</item> 
+              <item>NUMBER</item>
               </inclusions>
             <exclusions>
               <item>KEYNAME</item>
@@ -654,7 +658,7 @@
               Refer to the parameters KEYNAME and KEYVALUE.
             </description>
            <exclusions>
-              <item>NUMBER</item> 
+              <item>NUMBER</item>
               </exclusions>
             <inclusions>
               <item>KEYNAME</item>
@@ -672,7 +676,7 @@
           This is the band number selected for the pixel comparison
         </description>
       </parameter>
-      
+
       <parameter name="KEYNAME">
         <type>string</type>
         <default><item>OriginalBand</item></default>
@@ -680,8 +684,8 @@
         <description>
           The keyword values can be found on the labels of the input files under
           the "BandBin" Group. For instance, KEYNAME=NAME where the KEYVALUE
-          can then be set to "Phase Angle", "Emission Angle", "Incidence Angle", 
-          "Pixel Resolution".  
+          can then be set to "Phase Angle", "Emission Angle", "Incidence Angle",
+          "Pixel Resolution".
         </description>
       </parameter>
 
@@ -692,24 +696,24 @@
         <description>
           The keyword values can be found on the labels of the input files under
           the "BandBin" Group. For instance, KEYNAME=NAME where the KEYVALUE
-          can then be set to "Phase Angle", "Emission Angle", "Incidence Angle", 
-          "Pixel Resolution".  Refer to the <b>phocube</b> application that will 
-          create these 'Named' Bands. 
+          can then be set to "Phase Angle", "Emission Angle", "Incidence Angle",
+          "Pixel Resolution".  Refer to the <b>phocube</b> application that will
+          create these 'Named' Bands.
           </description>
       </parameter>
 
       <parameter name="CRITERIA">
-        <type>string</type> 
+        <type>string</type>
          <default><item>LESSER</item></default>
         <brief>The criteria (Lesser or Greater) of pixel placement in a priority band </brief>
         <description>
-          Select which type of comparison to perform on the priority band pixels. 
-          The choice is whether the lesser or greater value between the current input 
-          priority band pixel or mosaic priority band pixel will replace or retain the output 
+          Select which type of comparison to perform on the priority band pixels.
+          The choice is whether the lesser or greater value between the current input
+          priority band pixel or mosaic priority band pixel will replace or retain the output
           mosaic pixel.  The results of this criteria will apply to all corresponding bands
           in the output mosaic.  The special pixel values in the remaining bands will be
           replaced by valid pixels of the corresponding mosaic bands.  Refer to the
-          parameters HIGHSATURATION, LOWSATURATION and NULL to override this and propagate 
+          parameters HIGHSATURATION, LOWSATURATION and NULL to override this and propagate
           input special pixel values to all bands in the output mosaic.
         </description>
 
@@ -718,22 +722,22 @@
           <brief>The lower DN value of the input priority band will replace the mosaic pixel
             </brief>
             <description>
-              If the dn value of a pixel in the priority band of the input cube 
+              If the dn value of a pixel in the priority band of the input cube
               is lesser than the corresponding pixel in the mosaic priority band,
-              then the output pixel of the mosaic will be replaced by the input 
+              then the output pixel of the mosaic will be replaced by the input
               cube pixel. This will apply to all bands at this pixel location.
             </description>
           </option>
           <option value="GREATER">
            <brief>The greater DN value of the input priority band will replace the mosaic pixel
             </brief>
-            <description> 
-              If the dn value of a pixel in the priority band of the input cube 
+            <description>
+              If the dn value of a pixel in the priority band of the input cube
               is greater than the corresponding pixel in the mosaic priority band,
-              then the output pixel of the mosaic will be retained on NOT be 
-              replaced by the input cube pixel. This will apply to all bands at 
+              then the output pixel of the mosaic will be retained on NOT be
+              replaced by the input cube pixel. This will apply to all bands at
               this pixel location.
-            </description> 
+            </description>
         </option>
       </list>
       </parameter>
@@ -745,18 +749,18 @@
       <default><item>AUTO</item></default>
       <brief>Ground Range Options</brief>
       <description>
-        AUTO is the default for this parameter. By default the ground range is 
-        calculated automatically based on the list of input cubes.  The user can 
-        override this default. If the USER option is selected, values must be 
-        entered for the MINLAT, MAXLAT, MINLON, and MAXLON parameters.  
+        AUTO is the default for this parameter. By default the ground range is
+        calculated automatically based on the list of input cubes.  The user can
+        override this default. If the USER option is selected, values must be
+        entered for the MINLAT, MAXLAT, MINLON, and MAXLON parameters.
       </description>
       <list>
         <option value="AUTO">
           <brief>Automatically Calculate Range</brief>
           <description>
             The program will automatically calculate the ground range for the
-            mosaic by examining that latitude and longitude range of all the 
-            cubes contained in the list passed to FROMLIST.  This is the 
+            mosaic by examining that latitude and longitude range of all the
+            cubes contained in the list passed to FROMLIST.  This is the
             default option.
           </description>
           <exclusions>
@@ -770,7 +774,7 @@
           <brief>User Entered Range</brief>
           <description>
             The program will apply the ground range values you entered for
-            the mosaic.  
+            the mosaic.
           </description>
           <inclusions>
             <item>MINLAT</item>
@@ -805,6 +809,9 @@
         <description>
           The maximum latitude value boundary extent for the output mosaic.
         </description>
+        <greaterThan>
+            <item>MINLAT</item>
+        </greaterThan>
       </parameter>
       <parameter name="MINLON">
         <type>double</type>
@@ -819,6 +826,9 @@
         <description>
           The maximum longitude value bounary extent for the output mosaic.
         </description>
+        <greaterThan>
+            <item>MINLON</item>
+        </greaterThan>
       </parameter>
     </group>
 
@@ -838,8 +848,8 @@
               QVIEW-AdvancedTracking will report the source cube filename that was input to
               automos. The Track-band cannot be used outside the QVIEW-AdvancedTracking tool.
               TRACK must be set to TRUE at the time of mosaic creation only and cannot be turned
-              on after the mosaic is created. When a mosaic is created with TRACK=TRUE, all 
-              subsequent runs will default to TRACK=TRUE. When a mosaic is created with 
+              on after the mosaic is created. When a mosaic is created with TRACK=TRUE, all
+              subsequent runs will default to TRACK=TRUE. When a mosaic is created with
               TRACK=FALSE, an error will be encountered if subsequent runs have TRACK=TRUE.
               <b>The file (byte) size of the mosaic is increased due to
                 the track-band.</b>
@@ -859,14 +869,14 @@
         <type>boolean</type>
         <brief>Input and mosaic BandBin Groups must match</brief>
         <description>
-          This option set to TRUE causes the application to fail if the BandBin group keywords 
+          This option set to TRUE causes the application to fail if the BandBin group keywords
           are not identical for all input cubes and the output mosaic cube.  The default
-          for this parameter is TRUE in order to preserve integrity of a multi-band 
+          for this parameter is TRUE in order to preserve integrity of a multi-band
           (multi-wavelength) mosaic product.  The order of band wavelengths of the input
-          cubes must match each other and the mosaic. If MATCHBANDIN is set to FALSE, 
+          cubes must match each other and the mosaic. If MATCHBANDIN is set to FALSE,
           then the BandBin Group keywords of the input images do not have to match the mosaic
-          BandBin Group labels.  <b>Note:</b> The output mosaic BandBin Group and number 
-          of output bands is established with the first input file into the mosaic. 
+          BandBin Group labels.  <b>Note:</b> The output mosaic BandBin Group and number
+          of output bands is established with the first input file into the mosaic.
         </description>
         <default><item>TRUE</item></default>
       </parameter>
@@ -874,19 +884,19 @@
         <type>boolean</type>
         <brief>Enforce DEM Match</brief>
         <description>
-          The default is FALSE.  If set to TRUE, this application will create a 
-          Mosaic Group in the keyword labels of the new output mosaic cube including 
+          The default is FALSE.  If set to TRUE, this application will create a
+          Mosaic Group in the keyword labels of the new output mosaic cube including
           a ShapeModel keyword.  The output mosaic is created with the first input
           cube listed in the FROMLIST file, the ShapeModel keyword and it's value
-          will be propogated to the the Mosaic Group of the output mosaic cube file. 
-          Subsequently, the ShapeModel keyword value of the remaining input cubes will 
+          will be propogated to the the Mosaic Group of the output mosaic cube file.
+          Subsequently, the ShapeModel keyword value of the remaining input cubes will
           be checked against the ShapeModel value in the mosaic cube.   This application
           will fail if the ShapeModel keywords don't match.
 
           The ShapeModel keyword can be found in the Kernels group of the individual
-          input <def>Level2</def> cubes. This keyword is established in <b>spiceinit</b> when a DEM 
+          input <def>Level2</def> cubes. This keyword is established in <b>spiceinit</b> when a DEM
           radius file is chosen for the image surface reference and orthorectification
-          in <b>cam2map</b>-Level2.  
+          in <b>cam2map</b>-Level2.
         </description>
         <default><item>FALSE</item></default>
       </parameter>
@@ -895,8 +905,8 @@
         <default><item> FALSE</item></default>
         <brief>Force input High (Instrument and Representation) values </brief>
         <description>
-          This option causes an input High Saturation special pixel value 
-          (both Instrument and Representation) to replace the output mosaic pixel 
+          This option causes an input High Saturation special pixel value
+          (both Instrument and Representation) to replace the output mosaic pixel
           irrespective of the priority set or the original value of the mosaic pixel.
         </description>
       </parameter>
@@ -905,7 +915,7 @@
         <default><item> FALSE</item></default>
         <brief>Force input Low (Instrument and Representation) values</brief>
         <description>
-          This option causes an input Low Saturation special pixel value 
+          This option causes an input Low Saturation special pixel value
           (both Instrument and Representation) to replace the output mosaic pixel
           regardless of the priority set or the original value of the mosaic pixel.
         </description>
@@ -915,7 +925,7 @@
         <default><item> FALSE</item></default>
         <brief>Force input NULL values</brief>
         <description>
-          This option causes input NULL pixel values to replace the output mosaic pixel 
+          This option causes input NULL pixel values to replace the output mosaic pixel
           irrespective of the priority set or the original value of the mosaic pixel.
         </description>
       </parameter>
@@ -971,7 +981,7 @@
             Example GUI
           </brief>
             <description>
-              An example of how to run this program using the GUI. 
+              An example of how to run this program using the GUI.
             </description>
             <thumbnail width="195" height="200" src="assets/automosGui.jpg"
                        caption="Example of GUI"/>
@@ -1001,12 +1011,12 @@
           <parameterName>FROMLIST</parameterName>
         </image>
       </inputImages>
-      
+
       <outputImages>
         <image src="assets/automosMosaic.jpg" width="1000" height="500">
           <brief> Output mosaic</brief>
           <description>
-            This is a side-by-side display of the two bands of the resulting mosaic. 
+            This is a side-by-side display of the two bands of the resulting mosaic.
           </description>
           <thumbnail caption="Output image of resulting mosaic." src="assets/automosMosaic.jpg"
                      width="400" height="200"/>
diff --git a/isis/src/base/apps/caminfo/tsts/csv/Makefile b/isis/src/base/apps/caminfo/tsts/csv/Makefile
index 9b2f8da40a6f138861692a105a20ce30e57d9701..13215661caeff9feeeebc383640c3c3796b1ff40 100644
--- a/isis/src/base/apps/caminfo/tsts/csv/Makefile
+++ b/isis/src/base/apps/caminfo/tsts/csv/Makefile
@@ -9,7 +9,7 @@ commands:
 	STATISTICS=true CAMSTATS=true GEOMETRY=true spice=true > /dev/null;
 	cat $(OUTPUT)/temp.txt | \
 	  sed 's/\([0-9]*\.[0-9]\{4\}\)\([0-9]*\)/\1/g' | \
-	  sed 's/\([a-z]*\,\)\([0-9]\.[0-9]*\.[0-9]*\.[0-9]* [a-z]* | [0-9]\{4\}\-[0-9]\{2\}\-[0-9]\{2\}\)/\1/g' \
+	  sed 's/\([a-z]*\,\)\([0-9]\.[0-9]*\.[0-9]*\.[A-Za-z0-9]* [a-z]* | [0-9]\{4\}\-[0-9]\{2\}\-[0-9]\{2\}\)/\1/g' \
 	  > $(OUTPUT)/truth.txt;
 	$(RM) $(OUTPUT)/temp.txt;
 	$(RM) $(OUTPUT)/input.cub;
diff --git a/isis/src/base/apps/isis2fits/tsts/infoAll/truth/labels.txt b/isis/src/base/apps/isis2fits/tsts/infoAll/truth/labels.txt
deleted file mode 100644
index 935828cae5f705db1f8363204a1ba9e9f2f782c1..0000000000000000000000000000000000000000
--- a/isis/src/base/apps/isis2fits/tsts/infoAll/truth/labels.txt
+++ /dev/null
@@ -1 +0,0 @@
-SIMPLE  =                    T /                                                BITPIX  =                  -32 /                                                NAXIS   =                    2 /                                                NAXIS1  =                   90 /                                                NAXIS2  =                   14 /                                                BZERO   =                  0.0 /                                                BSCALE  =                  1.0 /                                                OBJCTRA =                180.0 /                                                OBJCTDEC=     -36.553241445319 /                                                INSTRUME=             'MOC-WA' /                                                OBSERVER= 'MARS GLOBAL SURVEYOR' /                                              OBJECT  =               'Mars' /                                                DATE-OBS= '1997-10-20T10:58:37.46' /                                            TIME_END= '1997-10-20T11:03:44.66' /                                            END                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
\ No newline at end of file
diff --git a/isis/src/base/apps/isis2pds/isis2pds.cpp b/isis/src/base/apps/isis2pds/isis2pds.cpp
index 3db6011a6b6e4a85239ae870f6c778e7deb6ce72..244f843bdb70845f7ddcbc88ccc3377ef36ae2c5 100644
--- a/isis/src/base/apps/isis2pds/isis2pds.cpp
+++ b/isis/src/base/apps/isis2pds/isis2pds.cpp
@@ -1,104 +1,197 @@
 #include "Isis.h"
+
+#include <QString>
+
+#include "Application.h"
+#include "Cube.h"
+#include "ExportDescription.h"
+#include "FileName.h"
+#include "Process.h"
 #include "ProcessExportPds.h"
+#include "ProcessExportPds4.h"
+#include "Pvl.h"
+#include "PvlKeyword.h"
+#include "PvlToXmlTranslationManager.h"
 
 using namespace std;
 using namespace Isis;
 
 enum Pixtype { NONE, NEG, BOTH };
 
-void setRangeAndPixels(UserInterface &ui, ProcessExportPds &p,
+void setRangeAndPixels(UserInterface &ui, ProcessExport &p,
                        double &min, double &max, Pixtype ptype);
 void IsisMain() {
-  // Set the processing object
-  ProcessExportPds p;
-
-  // Setup the input cube
-  p.SetInputCube("FROM");
-
   UserInterface &ui = Application::GetUserInterface();
 
-  if(ui.GetString("STRETCH") == "LINEAR") {
-    if(ui.GetString("BITTYPE") != "32BIT")
-      p.SetInputRange();
+  // Check if input file is indeed, a cube
+  if (ui.GetFileName("FROM").right(3) != "cub") {
+    QString msg = "Input file [" + ui.GetFileName("FROM") +
+                "] does not appear to be a cube";
+    throw  IException(IException::User, msg, _FILEINFO_);
   }
-  if(ui.GetString("STRETCH") == "MANUAL")
-    p.SetInputRange(ui.GetDouble("MINIMUM"), ui.GetDouble("MAXIMUM"));
 
-  double min = -DBL_MAX;
-  double max = DBL_MAX;
+  if (ui.GetString("PDSVERSION") == "PDS3") {
+    // Set the processing object
+    ProcessExportPds p;
 
-  if(ui.GetString("BITTYPE") == "8BIT") {
-    p.SetOutputType(Isis::UnsignedByte);
-    min = 0.0;
-    max = 255.0;
-    setRangeAndPixels(ui, p, min, max, BOTH);
-  }
-  else if(ui.GetString("BITTYPE") == "S16BIT") {
-    p.SetOutputType(Isis::SignedWord);
-    min = -32768.0;
-    max = 32767.0;
-    setRangeAndPixels(ui, p, min, max, NEG);
-  }
-  else if(ui.GetString("BITTYPE") == "U16BIT") {
-    p.SetOutputType(Isis::UnsignedWord);
-    min = 0.0;
-    max = 65535.0;
-    setRangeAndPixels(ui, p, min, max, BOTH);
-  }
-  else {
-    p.SetOutputType(Isis::Real);
-    p.SetOutputNull(Isis::NULL4);
-    p.SetOutputLrs(Isis::LOW_REPR_SAT4);
-    p.SetOutputLis(Isis::LOW_INSTR_SAT4);
-    p.SetOutputHrs(Isis::HIGH_REPR_SAT4);
-    p.SetOutputHis(Isis::HIGH_INSTR_SAT4);
-    setRangeAndPixels(ui, p, min, max, NONE);
-  }
+    // Setup the input cube
+    p.SetInputCube("FROM");
+
+    if(ui.GetString("STRETCH") == "LINEAR") {
+      if(ui.GetString("BITTYPE") != "32BIT")
+        p.SetInputRange();
+    }
+    if(ui.GetString("STRETCH") == "MANUAL")
+      p.SetInputRange(ui.GetDouble("MINIMUM"), ui.GetDouble("MAXIMUM"));
 
-  if(ui.GetString("ENDIAN") == "MSB")
-    p.SetOutputEndian(Isis::Msb);
-  else if(ui.GetString("ENDIAN") == "LSB")
-    p.SetOutputEndian(Isis::Lsb);
+    double min = -DBL_MAX;
+    double max = DBL_MAX;
 
-  if(ui.GetString("LABTYPE") == "FIXED")
-    p.SetExportType(ProcessExportPds::Fixed);
+    if(ui.GetString("BITTYPE") == "8BIT") {
+      p.SetOutputType(Isis::UnsignedByte);
+      min = 0.0;
+      max = 255.0;
+      setRangeAndPixels(ui, p, min, max, BOTH);
+    }
+    else if(ui.GetString("BITTYPE") == "S16BIT") {
+      p.SetOutputType(Isis::SignedWord);
+      min = -32768.0;
+      max = 32767.0;
+      setRangeAndPixels(ui, p, min, max, NEG);
+    }
+    else if(ui.GetString("BITTYPE") == "U16BIT") {
+      p.SetOutputType(Isis::UnsignedWord);
+      min = 0.0;
+      max = 65535.0;
+      setRangeAndPixels(ui, p, min, max, BOTH);
+    }
+    else {
+      p.SetOutputType(Isis::Real);
+      p.SetOutputNull(Isis::NULL4);
+      p.SetOutputLrs(Isis::LOW_REPR_SAT4);
+      p.SetOutputLis(Isis::LOW_INSTR_SAT4);
+      p.SetOutputHrs(Isis::HIGH_REPR_SAT4);
+      p.SetOutputHis(Isis::HIGH_INSTR_SAT4);
+      setRangeAndPixels(ui, p, min, max, NONE);
+    }
 
-  if (ui.GetBoolean("CHECKSUM")) {
-    p.setCanGenerateChecksum(true);
+    if(ui.GetString("ENDIAN") == "MSB")
+      p.SetOutputEndian(Isis::Msb);
+    else if(ui.GetString("ENDIAN") == "LSB")
+      p.SetOutputEndian(Isis::Lsb);
+
+    if(ui.GetString("LABTYPE") == "FIXED")
+      p.SetExportType(ProcessExportPds::Fixed);
+
+    if (ui.GetBoolean("CHECKSUM")) {
+      p.setCanGenerateChecksum(true);
+    }
+
+    // Set the resolution to  Kilometers
+    p.SetPdsResolution(ProcessExportPds::Kilometer);
+
+    p.StandardPdsLabel(ProcessExportPds::Image);
+
+    FileName outFile(ui.GetFileName("TO", "img"));
+    QString outFileName(outFile.expanded());
+    ofstream oCube(outFileName.toLatin1().data());
+    p.OutputLabel(oCube);
+    p.StartProcess(oCube);
+    if (ui.GetBoolean("CHECKSUM")) {
+      p.updateChecksumInLabel(oCube);
+    }
+    oCube.close();
+    p.EndProcess();
+
+    //Records what it did to the print.prt file
+    PvlGroup results("DNs Used");
+    results += PvlKeyword("Null", toString(p.OutputNull()));
+    results += PvlKeyword("LRS", toString(p.OutputLrs()));
+    results += PvlKeyword("LIS", toString(p.OutputLis()));
+    results += PvlKeyword("HIS", toString(p.OutputHis()));
+    results += PvlKeyword("HRS", toString(p.OutputHrs()));
+    results += PvlKeyword("ValidMin", toString(min));
+    results += PvlKeyword("ValidMax", toString(max));
+    Application::Log(results);
   }
+  else {
+    // Setup the process and set the input cube
+    ProcessExportPds4 process;
+    Cube *icube = process.SetInputCube("FROM");
+
+    PvlObject *label= icube->label();
+    if (!label->hasObject("IsisCube")) {
+      QString msg = "Input file [" + ui.GetFileName("FROM") +
+                  "] does not appear to be an ISIS3 cube.";
+      throw  IException(IException::User, msg, _FILEINFO_);
+    }
+    
+    FileName outFile(ui.GetFileName("TO", "img"));
+    QString outFileName(outFile.expanded());
+    
+    if(ui.GetString("STRETCH") == "LINEAR") {
+      if(ui.GetString("BITTYPE") != "32BIT")
+        process.SetInputRange();
+    }
+    if(ui.GetString("STRETCH") == "MANUAL")
+      process.SetInputRange(ui.GetDouble("MINIMUM"), ui.GetDouble("MAXIMUM"));
 
-  //Set the resolution to  Kilometers
-  p.SetPdsResolution(ProcessExportPds::Kilometer);
+    double min = -DBL_MAX;
+    double max = DBL_MAX;
 
-  p.StandardPdsLabel(ProcessExportPds::Image);
+    if(ui.GetString("BITTYPE") == "8BIT") {
+      process.SetOutputType(Isis::UnsignedByte);
+      min = 0.0;
+      max = 255.0;
+      setRangeAndPixels(ui, process, min, max, BOTH);
+    }
+    else if(ui.GetString("BITTYPE") == "S16BIT") {
+      process.SetOutputType(Isis::SignedWord);
+      min = -32768.0;
+      max = 32767.0;
+      setRangeAndPixels(ui, process, min, max, NEG);
+    }
+    else if(ui.GetString("BITTYPE") == "U16BIT") {
+      process.SetOutputType(Isis::UnsignedWord);
+      min = 0.0;
+      max = 65535.0;
+      setRangeAndPixels(ui, process, min, max, BOTH);
+    }
+    else {
+      process.SetOutputType(Isis::Real);
+      process.SetOutputNull(Isis::NULL4);
+      process.SetOutputLrs(Isis::LOW_REPR_SAT4);
+      process.SetOutputLis(Isis::LOW_INSTR_SAT4);
+      process.SetOutputHrs(Isis::HIGH_REPR_SAT4);
+      process.SetOutputHis(Isis::HIGH_INSTR_SAT4);
+      setRangeAndPixels(ui, process, min, max, NONE);
+    }
 
-  FileName outFile(ui.GetFileName("TO", "img"));
-  QString outFileName(outFile.expanded());
-  ofstream oCube(outFileName.toLatin1().data());
-  p.OutputLabel(oCube);
-  p.StartProcess(oCube);
-  if (ui.GetBoolean("CHECKSUM")) {
-    p.updateChecksumInLabel(oCube);
+    if(ui.GetString("ENDIAN") == "MSB")
+      process.SetOutputEndian(Isis::Msb);
+    else if(ui.GetString("ENDIAN") == "LSB")
+      process.SetOutputEndian(Isis::Lsb);
+
+    // Records what it did to the print.prt file
+    PvlGroup results("DNs Used");
+    results += PvlKeyword("Null", toString(process.OutputNull()));
+    results += PvlKeyword("LRS", toString(process.OutputLrs()));
+    results += PvlKeyword("LIS", toString(process.OutputLis()));
+    results += PvlKeyword("HIS", toString(process.OutputHis()));
+    results += PvlKeyword("HRS", toString(process.OutputHrs()));
+    results += PvlKeyword("ValidMin", toString(min));
+    results += PvlKeyword("ValidMax", toString(max));
+    Application::Log(results);
+
+    process.StandardPds4Label();
+    process.WritePds4(outFileName);
   }
-  oCube.close();
-  p.EndProcess();
-
-  //Records what it did to the print.prt file
-  PvlGroup results("DNs Used");
-  results += PvlKeyword("Null", toString(p.OutputNull()));
-  results += PvlKeyword("LRS", toString(p.OutputLrs()));
-  results += PvlKeyword("LIS", toString(p.OutputLis()));
-  results += PvlKeyword("HIS", toString(p.OutputHis()));
-  results += PvlKeyword("HRS", toString(p.OutputHrs()));
-  results += PvlKeyword("ValidMin", toString(min));
-  results += PvlKeyword("ValidMax", toString(max));
-  Application::Log(results);
 
   return;
 }
 
 //Sets up special pixels and valid pixel ranges
-void setRangeAndPixels(UserInterface &ui, ProcessExportPds &p, double &min, double &max, Pixtype ptype) {
+void setRangeAndPixels(UserInterface &ui, ProcessExport &p, double &min, double &max, Pixtype ptype) {
   if(ptype == NEG) {
     if(ui.GetBoolean("NULL")) {
       p.SetOutputNull(min++);
diff --git a/isis/src/base/apps/isis2pds/isis2pds.xml b/isis/src/base/apps/isis2pds/isis2pds.xml
index 2817c09c5ae6e1f8bcbac456c2baad4d31d1747d..a3de4fd8be5b7f776172bc7a80e797799e3d908d 100644
--- a/isis/src/base/apps/isis2pds/isis2pds.xml
+++ b/isis/src/base/apps/isis2pds/isis2pds.xml
@@ -1,12 +1,32 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
 <application name="isis2pds" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://isis.astrogeology.usgs.gov/Schemas/Application/application.xsd">
+
   <brief>
-    Convert from cube to pds format
+    Convert from ISIS3 cube to PDS 3 or PDS 4 format
   </brief>
 
   <description>
-   Program to convert cubes to pds image files.
+   Program to convert cubes to PDS3 or PDS4 image files.
+
+   For PDS4, If available, Instrument and  Mapping information will be written to the detached output PDS4 formatted xml label file.   
+<p>
+   Not all values in the generated PDS4 labels can be determined automatically by ISIS3, and some must be updated by the user (by opening up the xml label output by this application and editing it with a text editor) for the generated label to be PDS4 compliant. The values UNK (unknown) and TBD (to be determined) are used as placeholders in the generated label. TBD values must be replaced by the user for the output label to be PDS4 compliant. Some of these TBDs can only be replaced with one of several specific enumerated values to meet compliancy. These possible values can be found in the <a href="https://pds.jpl.nasa.gov/pds4/doc/im/current/index_1900.html">PDS 4 Information Model Specification</a> in the Value/Class column of the table for the associated tag or in the index at the end of the document. Searching this page for the name of the field you need to determine a value for is recommended. 
+</p>
+
+<p>
+For example: For a cube with map-projected data, ISIS3 will populate planar_coordinate encoding_method with a value on its own, but if it did not and instead had "TBD", we would find at <a href="https://pds.jpl.nasa.gov/pds4/doc/im/current/index_1900.html#attribute_cart_planar_coordinate_information_cart_planar_coordinate_encoding_method">planar_coordinate_coding_method</a> that there are 3 possible values: 'Coordinate Pair', 'Distance and Bearing', 'Row and Column'.
+</p>
+
+<p>
+Not everything is in the  <a href="https://pds.jpl.nasa.gov/pds4/doc/im/current/index_1900.html">PDS 4 Information Model Specification</a> at this time, so if the information about a tag is not in there, it may be necessary to find the options in the appropriate schematron file (.sch) available at: <a href="https://pds.jpl.nasa.gov/pds4/schema/released/">PDS4 Released Schema</a>. For the previous example, the same information can be found in the <a href="https://pds.jpl.nasa.gov/pds4/cart/v1/PDS4_CART_1700.sch">PDS4 Cartography schematron file </a>.
+</p>
+
+<p>
+UNK  is used as a placeholder if any value can be used and still be a valid PDS4-formatted xml header. UNKs can, but are not required to be, replaced by the user with
+better information. 
+</p>
+
   </description>
 
   <category>
@@ -22,12 +42,22 @@
       Added the Label Type capability (param)
     </change>
     <change name="Kristin Berry" date="2014-06-06">
-      Changed to assume that radii without units in the input Isis cube are in meters, map scales without units are in meters/pixel, and map resolutions without units are in pixels/degree.
+      Changed to assume that radii without units in the input Isis cube are in meters, map scales without units are in meters/pixel, and
+       map resolutions without units are in pixels/degree.
     </change>
     <change name="Makayla Shepherd and Ian Humphrey" date="2017-05-17">
       Added CHECKSUM parameter to optionally generate and attach an MD5 checksum to the exported
       image label. This checksum is generated from the image data. Fixes #1013.
     </change>
+    <change name="Jeannie Backer, Mayayla Shepard, and Kristin Berry" date="2017-10-27">
+       Added PDS4 output option. Previously, this application converted ISIS3 cubes to PDS3 format only. 
+    </change>
+    <change name="Jeannie Backer" date="2017-11-13">
+       Updated to attach *.img extension to pds4 output data file. 
+    </change>
+    <change name="Kristin Berry" date="2017-11-26">
+       Updated with very basic documentation about the PDS4 output labels. 
+    </change>
     </history>
 
   <groups>
@@ -53,7 +83,8 @@
           Output pds image
         </brief>
         <description>
-          The resulting pds file.
+          The resulting pds file. For PDS4, a detached label of the same name with the file extension .xml 
+          will be created in the same directory.
         </description>
         <filter>
           *.img
@@ -61,8 +92,38 @@
       </parameter>
     </group>
 
+    <group name="PDS Format Version">
+      <parameter name="PDSVERSION">
+        <type>string</type>
+         <default><item>PDS3</item></default>
+	 <brief>Version of PDS to output</brief>
+	 <description>
+	     Changes which version of PDS file format
+	     to output in.
+	 </description>
+	 <list>
+	     <option value="PDS3">
+		 <brief>Convert ISIS3 cube to PDS3 format</brief>
+		 <description>
+		     Convert ISIS3 cube to PDS3 format.
+		 </description>
+	     </option>
+	     <option value="PDS4">
+		 <brief>Convert ISIS3 cube to PDS4 format</brief>
+		 <description>
+		     Convert ISIS3 cube to PDS4 format.
+		  </description>
+		  <exclusions>
+		      <item>LABTYPE</item>
+		      <item>CHECKSUM</item>
+		  </exclusions>
+	     </option>
+	 </list>
+      </parameter>
+    </group>
+
     <group name="Output Settings">
-      <parameter name="LABTYPE">
+    <parameter name="LABTYPE">
         <type>string</type>
         <default><item>STREAM</item></default>
         <brief>Label type of output file</brief>
@@ -87,6 +148,7 @@
           </option>
         </list>
       </parameter>
+
       <parameter name="BITTYPE">
         <type>string</type>
         <default>
@@ -191,7 +253,7 @@
           file as well as displayed onscreen.
         </description>
       </parameter>
-      <parameter name="CHECKSUM">
+    <parameter name="CHECKSUM">
         <type>boolean</type>
         <default><item>false</item></default>
         <brief>Generates and attaches an MD5 checksum to the labels.</brief>
@@ -199,7 +261,7 @@
           If set to true, then an MD5 checksum will be generated from the image data and
           attached to the output image labels.
         </description>
-      </parameter>
+      </parameter> 
     </group>
 
     <group name="Stretch Options">
diff --git a/isis/src/base/apps/isis2pds/tsts/pds4/Makefile b/isis/src/base/apps/isis2pds/tsts/pds4/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..1406cedd6494358d69f530ca95f62d9a6c6873db
--- /dev/null
+++ b/isis/src/base/apps/isis2pds/tsts/pds4/Makefile
@@ -0,0 +1,14 @@
+APPNAME = isis2pds
+
+include $(ISISROOT)/make/isismake.tsts
+
+commands:
+	$(APPNAME) from=$(INPUT)/dawnEqui1.cub to=$(OUTPUT)/dawnEqui.img pdsversion=pds4 > /dev/null;
+
+	# Remove parts of output that can occur in any order and convert to txt for comparison
+	$(SED) 's+\Product_Observational.*>+\Product_Observational>+' \
+	       $(OUTPUT)/dawnEqui.xml > $(OUTPUT)/dawnEqui.txt;
+
+	$(RM) $(OUTPUT)/dawnEqui.xml > /dev/null; 
+	$(RM) $(OUTPUT)/dawnEqui.img > /dev/null; 
+
diff --git a/isis/src/base/apps/isisminer/CnetReaderStrategy.cpp b/isis/src/base/apps/isisminer/CnetReaderStrategy.cpp
index 6fa3b53290542c75c5726b6b420e4b25928dd671..f0361ea492bef8b62db5c844bbbf14d19cdaf1e4 100644
--- a/isis/src/base/apps/isisminer/CnetReaderStrategy.cpp
+++ b/isis/src/base/apps/isisminer/CnetReaderStrategy.cpp
@@ -1,26 +1,26 @@
-/**                                                                       
- * @file                                                                  
+/**
+ * @file
  * $Revision: 6187 $
  * $Date: 2015-05-11 17:31:51 -0700 (Mon, 11 May 2015) $
  * $Id: CnetReaderStrategy.cpp 6187 2015-05-12 00:31:51Z kbecker@GS.DOI.NET $
- * 
- *   Unless noted otherwise, the portions of Isis written by the USGS are 
- *   public domain. See individual third-party library and package descriptions 
- *   for intellectual property information, user agreements, and related  
- *   information.                                                         
- *                                                                        
- *   Although Isis has been used by the USGS, no warranty, expressed or   
- *   implied, is made by the USGS as to the accuracy and functioning of such 
- *   software and related material nor shall the fact of distribution     
+ *
+ *   Unless noted otherwise, the portions of Isis written by the USGS are
+ *   public domain. See individual third-party library and package descriptions
+ *   for intellectual property information, user agreements, and related
+ *   information.
+ *
+ *   Although Isis has been used by the USGS, no warranty, expressed or
+ *   implied, is made by the USGS as to the accuracy and functioning of such
+ *   software and related material nor shall the fact of distribution
  *   constitute any such warranty, and no responsibility is assumed by the
- *   USGS in connection therewith.                                        
- *                                                                        
- *   For additional information, launch                                   
- *   $ISISROOT/doc//documents/Disclaimers/Disclaimers.html                
+ *   USGS in connection therewith.
+ *
+ *   For additional information, launch
+ *   $ISISROOT/doc//documents/Disclaimers/Disclaimers.html
  *   in a browser or see the Privacy &amp; Disclaimers page on the Isis website,
  *   http://isis.astrogeology.usgs.gov, and the USGS privacy and disclaimers on
- *   http://www.usgs.gov/privacy.html.                                    
- */ 
+ *   http://www.usgs.gov/privacy.html.
+ */
 #include "CnetReaderStrategy.h"
 
 // other ISIS
@@ -37,136 +37,135 @@ using namespace std;
 
 namespace Isis {
 
-  /** 
-   * Default constructor 
-   */  
-  CnetReaderStrategy::CnetReaderStrategy() : Strategy("CnetReader", "CnetReader") { 
+  /**
+   * Default constructor
+   */
+  CnetReaderStrategy::CnetReaderStrategy() : Strategy("CnetReader", "CnetReader") {
   }
 
 
-  /** 
-   *  
+  /**
+   *
    * @param definition
    * @param globals
    * @brief Constructor loads from a Strategy object CnetReader definition
-   * 
-   * This constructor loads and retains processing parameters from the CnetReader 
+   *
+   * This constructor loads and retains processing parameters from the CnetReader
    * Strategy object definition as (typically) read from the configuration file.
-   * 
-   * @author 2014-12-25 Kris Becker 
-   * 
+   *
+   * @author 2014-12-25 Kris Becker
+   *
    * @param definition CnetReader Strategy PVL object definition
    * @param globals    Global Resource of keywords
-   */  
-  CnetReaderStrategy::CnetReaderStrategy(const PvlObject &definition, 
-                                         const ResourceList &globals) : 
+   */
+  CnetReaderStrategy::CnetReaderStrategy(const PvlObject &definition,
+                                         const ResourceList &globals) :
                                          Strategy(definition, globals) {
-  
+
   }
-  
 
-  /** 
-   *  
-   */  
+
+  /**
+   *
+   */
   CnetReaderStrategy::~CnetReaderStrategy() {
   }
-  
-  
-  /** 
+
+
+  /**
    * @brief Obtains the Resources from the control network file
-   * 
+   *
    * This Strategy appends each of the Resources obtained from the ISIS control network file to a list
-   * of Resources. The return value verifies the number of Resources that were created from the 
+   * of Resources. The return value verifies the number of Resources that were created from the
    * ControlMeasures in the ISIS control network file.
-   * 
+   *
    * @author 2014-12-25 Kris Becker
-   * 
-   * @param resources ResourceList created from the control network 
+   *
+   * @param resources ResourceList created from the control network
    * @param globals   List of global keywords to use in argument substitutions
-   * 
+   *
    * @return int The number of Resources created from each ControlMeasure
-   */  
+   */
   int CnetReaderStrategy::apply(ResourceList &resources,
-                                const ResourceList &globals) { 
-  
+                                const ResourceList &globals) {
+
     ResourceList measures = cnetResource(globals);
     resources.append( measures );
-  
+
     return ( measures.size() );
   }
-  
 
-  /** 
+
+  /**
    * @brief Creates Resources from a control network
-   * 
+   *
    * Helper method for apply(). Reads a control network and creates Resources from each ControlMeasure
-   * group in the control network. Each Resource is created with a unique name (a serial number) and 
-   * the keywords in the ControlMeasure group. Specific starting name values can be 
+   * group in the control network. Each Resource is created with a unique name (a serial number) and
+   * the keywords in the ControlMeasure group. Specific starting name values can be
    * determined by the pointnum parameter. Default starting name value is 0.
-   * 
+   *
    * @author 2014-12-25 Kris Becker
-   * 
+   *
    * @param globals   List of global keywords to use in argument substitutions
    * @param pointnum - The row id number to start naming Resources with (default 0)
-   * 
+   *
    * @return ResourceList The list of Resources created
-   */  
+   */
   ResourceList CnetReaderStrategy::cnetResource(const ResourceList &globals,
-                                                const int &pointNum) const { 
-  
+                                                const int &pointNum) const {
+
     int nrows = pointNum;
-  
-    QString cfile = translateKeywordArgs("CnetFile", globals);
-    QScopedPointer<LatestControlNetFile> netFile(ControlNetVersioner::Read(FileName(cfile))); 
-    Pvl pvl(netFile->toPvl());
-    netFile.reset();
-  
+
+    FileName netfile(translateKeywordArgs("CnetFile", globals));
+    ControlNetVersioner cnetReader(netfile);
+    Pvl pvl(cnetReader.toPvl());
+
     PvlObject &network(pvl.findObject("ControlNetwork"));
     PvlFlatMap netkeys(loadkeys(network));
-  
+
     ResourceList pointlist;
     for ( int p = 0 ; p < network.objects() ; p++ ) {
       PvlObject &point = network.object(p);
-  
+
       if ( "controlpoint" == point.name().toLower() ) {
-  
-        PvlFlatMap netpoint(netkeys, loadkeys(point)); 
+
+        PvlFlatMap netpoint(netkeys, loadkeys(point));
         for (int m = 0; m < point.groups() ; m++ ) {
           PvlGroup &measure = point.group(m);
-  
+
           if ( "controlmeasure" == measure.name().toLower() ) {
             PvlFlatMap netmeasure(netpoint, loadkeys(measure));
             QString rowId = QString::number(nrows++);
-            SharedResource rowmeasure(new Resource(rowId, netmeasure)); 
-  
+            SharedResource rowmeasure(new Resource(rowId, netmeasure));
+
             // Make the unique identifier (set default identity or set to specified)
-            QString identity = translateKeywordArgs("Identity", getGlobals(rowmeasure, globals)); 
+            QString identity = translateKeywordArgs("Identity", getGlobals(rowmeasure, globals));
             if ( identity.isEmpty() ) {
               identity = rowId;
-            } 
+            }
             rowmeasure->setName(identity);
             pointlist.push_back(rowmeasure);
           }
         }
       }
     }
-  
+
     return (pointlist);
   }
-  
 
-  /** 
+
+  /**
    * @brief Returns a more accessible PVL structure from a PvlContainer object
-   * 
-   * Returns a more accessible PvlFlatMap from a passed PvlContainer. This PvlFlatMap provides a 
+   *
+   * Returns a more accessible PvlFlatMap from a passed PvlContainer. This PvlFlatMap provides a
    * more accessible interface to PVL keywords.
-   * 
+   *
    * @author 2014-12-25 Kris Becker
-   * 
+   *
    * @param keys - The PvlContainer object to convert to a PvlFlatMap
-   * 
+   *
    * @return PvlFlatMap Returns a more accessible PvlFlatMap
-   */  
+   */
   PvlFlatMap CnetReaderStrategy::loadkeys(const PvlContainer &keys) const {
     return (PvlFlatMap(keys));
   }
diff --git a/isis/src/base/apps/spiceinit/spiceinit.cpp b/isis/src/base/apps/spiceinit/spiceinit.cpp
index ba9eb8e14be5618c922beb4abff61679a3673c31..ed0db611e5c7cf6dffa13a298cf2ae1f45896bba 100644
--- a/isis/src/base/apps/spiceinit/spiceinit.cpp
+++ b/isis/src/base/apps/spiceinit/spiceinit.cpp
@@ -418,7 +418,7 @@ bool tryKernels(Cube *icube, Process &p,
 
       Application::Log(currentKernels);
       icube->putGroup(originalKernels);
-      throw;
+      throw IException(e);
     }
 
     if (ui.GetBoolean("ATTACH")) {
diff --git a/isis/src/base/apps/spiceinit/spiceinit.xml b/isis/src/base/apps/spiceinit/spiceinit.xml
index d5ad2878884daf8c4576e4903703d0632783eb08..6ec49807cf146ea3c1dac95aab243dfa4c3da39c 100644
--- a/isis/src/base/apps/spiceinit/spiceinit.xml
+++ b/isis/src/base/apps/spiceinit/spiceinit.xml
@@ -286,6 +286,10 @@
       Updated spiceinit to remove code dealing with the CubeSupported Pvl Keyword, from the ShapeModel group in the IsisPreferences file, 
       which has been removed.
     </change>
+    <change name="Christopher Combs" date="2018-01-11">
+      Made change to camera construction error throw for better reporting on uninstantiated cameras.
+      Fixes #5163.
+    </change>
   </history>
 
   <oldName>
diff --git a/isis/src/base/objs/AutoReg/unitTest.cpp b/isis/src/base/objs/AutoReg/unitTest.cpp
index 2034039f6f9bc1ebaa835dd17384f54305c339e4..3dd780a0f7375b5f44cf6bbb55c3ecf823b8cf47 100644
--- a/isis/src/base/objs/AutoReg/unitTest.cpp
+++ b/isis/src/base/objs/AutoReg/unitTest.cpp
@@ -312,11 +312,11 @@ void Doit(Isis::PvlObject &obj) {
     lab.addObject(obj);
     p_ar = AutoRegFactory::Create(lab);
     Cube c;
-    c.open("search_low.cub");
+    c.open("$base/testData/AutoReg/search_low.cub");
     p_ar->SearchChip()->TackCube(75.0, 75.0);
     p_ar->SearchChip()->Load(c);
     Cube d;
-    d.open("pattern.cub");
+    d.open("$base/testData/AutoReg/pattern.cub");
     p_ar->PatternChip()->TackCube(45.0, 45.0);
     p_ar->PatternChip()->Load(d);
   }
diff --git a/isis/src/base/objs/Camera/Camera.cpp b/isis/src/base/objs/Camera/Camera.cpp
index 0fef4fdf3f728326877ef7b4b0ce7ad117d8051c..22f021881eca1fef570b8aedf4701b8fc649f255 100644
--- a/isis/src/base/objs/Camera/Camera.cpp
+++ b/isis/src/base/objs/Camera/Camera.cpp
@@ -2347,13 +2347,13 @@ namespace Isis {
    *
    * @param *map Pointer to a CameraDistortionMap object
    */
-  void Camera::SetDistortionMap(CameraDistortionMap *map) {
-    if (p_distortionMap) {
-      delete p_distortionMap;
-    }
+ void Camera::SetDistortionMap(CameraDistortionMap *map, bool deleteExisting) {
+   if (deleteExisting && p_distortionMap) {
+     delete p_distortionMap;
+   }
 
-    p_distortionMap = map;
-  }
+   p_distortionMap = map;
+ }
 
 
   /**
diff --git a/isis/src/base/objs/Camera/Camera.h b/isis/src/base/objs/Camera/Camera.h
index 30605573e52a643fb7fed442c4004cde37ce3a94..b955731bb2aac6e88a6725ad70e61ad779cd9128 100644
--- a/isis/src/base/objs/Camera/Camera.h
+++ b/isis/src/base/objs/Camera/Camera.h
@@ -239,6 +239,8 @@ namespace Isis {
    *                           an error in the original formula, and updated the documention for this
    *                           function.  Fixes #4614.
    *   @history 2017-08-30 Summer Stapleton - Updated documentation. References #4807.
+   *   @history 2017-01-11 Christopher Combs - Added bool deleteExisting to SetDistortionMap to 
+   *                           prevent a segfault when the distortion map is incomplete. Fixes $5163.
    */
 
   class Camera : public Sensor {
@@ -332,7 +334,7 @@ namespace Isis {
       QString spacecraftNameLong() const;
       QString spacecraftNameShort() const;
 
-      void SetDistortionMap(CameraDistortionMap *map);
+      void SetDistortionMap(CameraDistortionMap *map, bool deleteExisting = true);
       void SetFocalPlaneMap(CameraFocalPlaneMap *map);
       void SetDetectorMap(CameraDetectorMap *map);
       void SetGroundMap(CameraGroundMap *map);
diff --git a/isis/src/base/objs/CameraPointInfo/unitTest.cpp b/isis/src/base/objs/CameraPointInfo/unitTest.cpp
index 122b7a8942e62c47e9196c82d1f7a62bf5908d03..ecf08f1767bd91fae5e55179e62d2ea403936c71 100644
--- a/isis/src/base/objs/CameraPointInfo/unitTest.cpp
+++ b/isis/src/base/objs/CameraPointInfo/unitTest.cpp
@@ -21,11 +21,11 @@ int main() {
   // this is because the directory it is run from may change
   // under normal usage FileName is always included
 
-  cpi.SetCube("unitTest1.cub");
+  cpi.SetCube("$base/testData/CameraPointInfo/unitTest1.cub");
   PvlGroup *grp = cpi.SetImage(1, 1);
   PrintResults(*grp);
 
-  cpi.SetCube("unitTest1.cub");
+  cpi.SetCube("$base/testData/CameraPointInfo/unitTest1.cub");
   PvlGroup *too = cpi.SetGround(-84.5, 15.0);
   PrintResults(*too);
 
diff --git a/isis/src/base/objs/Cube/Cube.cpp b/isis/src/base/objs/Cube/Cube.cpp
index 6055ae4ef6c6101f2fb0327969b8f44ec8e04994..1079e499eed3a1edd4cd8680c830d519e12da281 100644
--- a/isis/src/base/objs/Cube/Cube.cpp
+++ b/isis/src/base/objs/Cube/Cube.cpp
@@ -369,9 +369,10 @@ namespace Isis {
                "dimensions were (S,L,B) [" + toString(m_samples) + ", " +
                toString(m_lines) + ", " + toString(m_bands) + "] with [" +
                toString(SizeOf(m_pixelType)) + "] bytes per pixel. If you still "
-               "wish to create this cube, the maximum value can be changed in the"
-               " file [~/.Isis/IsisPreferences] within the group "
-               "CubeCustomization, keyword MaximumSize.";
+               "wish to create this cube, the maximum value can be changed in your personal "
+               "preference file located in [~/.Isis/IsisPreferences] within the group "
+               "CubeCustomization, keyword MaximumSize. If you do not have an ISISPreference file, "
+               "please refer to the documentation \"Environment and Preference Setup\". Error ";
         throw IException(IException::User, msg, _FILEINFO_);
       }
     }
diff --git a/isis/src/base/objs/Cube/Cube.h b/isis/src/base/objs/Cube/Cube.h
index 77ab3f124511dcc7f0fe20473eb84e22791fcda4..986836137fa26b32747d2b938a22d38289ecad47 100644
--- a/isis/src/base/objs/Cube/Cube.h
+++ b/isis/src/base/objs/Cube/Cube.h
@@ -157,6 +157,8 @@ namespace Isis {
    *   @history 2017-06-08 Chris Combs - Made "Failed to create" error messages more descriptive.
    *                           Fixes #833.
    *   @history 2017-09-22 Cole Neubauer - Fixed documentation. References #4807
+   *   @history 2018-01-18 Summer Stapleton - Updated error message in ::create() to address when
+   *                           an IsisPreference file cannot be found. Fixes #5145.
    */
   class Cube {
     public:
diff --git a/isis/src/base/objs/Cube/Cube.truth b/isis/src/base/objs/Cube/Cube.truth
index b04bb955c10b0a51e8cf43ea1d059e4b5397308f..5c1c40275726d1bffce9a2f046a6a4dcc3f21967 100644
--- a/isis/src/base/objs/Cube/Cube.truth
+++ b/isis/src/base/objs/Cube/Cube.truth
@@ -283,7 +283,7 @@ Testing errors ...
 **PROGRAMMER ERROR** Tried to write to a cube before opening/creating it.
 **PROGRAMMER ERROR** Number of samples [0], lines [0], or bands [0] cannot be less than 1.
 **I/O ERROR** Label space is full in [IsisCube_04.cub] unable to write labels.
-**USER ERROR** The cube you are attempting to create [IsisCube_05] is [33527GB]. This is larger than the current allowed size of [12GB]. The cube dimensions were (S,L,B) [1000000, 1000000, 9] with [4] bytes per pixel. If you still wish to create this cube, the maximum value can be changed in the file [~/.Isis/IsisPreferences] within the group CubeCustomization, keyword MaximumSize.
+**USER ERROR** The cube you are attempting to create [IsisCube_05] is [33527GB]. This is larger than the current allowed size of [12GB]. The cube dimensions were (S,L,B) [1000000, 1000000, 9] with [4] bytes per pixel. If you still wish to create this cube, the maximum value can be changed in your personal preference file located in [~/.Isis/IsisPreferences] within the group CubeCustomization, keyword MaximumSize. If you do not have an ISISPreference file, please refer to the documentation "Environment and Preference Setup". Error.
 **PROGRAMMER ERROR** Unknown value for access [a]. Expected 'r'  or 'rw'.
 **PROGRAMMER ERROR** SetDimensions:  Invalid number of sample, lines or bands.
 **PROGRAMMER ERROR** SetDimensions:  Invalid number of sample, lines or bands.
diff --git a/isis/src/base/objs/CubeCalculator/unitTest.cpp b/isis/src/base/objs/CubeCalculator/unitTest.cpp
index 4fc2af9db6b677f27588011c516af3be170b6a31..e2e71783000e47d64bd9adb34af0963f88416447 100644
--- a/isis/src/base/objs/CubeCalculator/unitTest.cpp
+++ b/isis/src/base/objs/CubeCalculator/unitTest.cpp
@@ -15,7 +15,7 @@ int main(int argc, char *argv[]) {
 
   Isis::CubeAttributeInput att;
 
-  Isis::Cube *icube = p.SetInputCube("unitTest.cub", att);
+  Isis::Cube *icube = p.SetInputCube("$base/testData/CubeCalculator/unitTest.cub", att);
   std::cout << "CubeCalculator unit test" << std::endl;
   std::cout << "------------------------" << std::endl << std::endl;
 
diff --git a/isis/src/base/objs/CubeDataThread/unitTest.cpp b/isis/src/base/objs/CubeDataThread/unitTest.cpp
index 7b48d84651bb32800cf66dcf39cff2a77adf28e3..c1633419006a5eaeb9942ba679ffee74ede6eeeb 100644
--- a/isis/src/base/objs/CubeDataThread/unitTest.cpp
+++ b/isis/src/base/objs/CubeDataThread/unitTest.cpp
@@ -3,6 +3,8 @@
 #include <iostream>
 #include <unistd.h>
 
+#include <QString>
+
 #include "Cube.h"
 #include "CubeDataThread.h"
 #include "CubeDataThreadTester.h"
@@ -14,8 +16,10 @@ using namespace Isis;
 using namespace std;
 
 void IsisMain() {
-  ProgramLauncher::RunSystemCommand("cp unitTest.cub unitTest2.cub");
-  ProgramLauncher::RunSystemCommand("cp unitTest.cub unitTest3.cub");
+  QString testFile = FileName("$base/testData/CubeDataThread/unitTest.cub").expanded();
+  QString sysCommand = "cp " + testFile;
+  ProgramLauncher::RunSystemCommand(sysCommand + " unitTest2.cub");
+  ProgramLauncher::RunSystemCommand(sysCommand + " unitTest3.cub");
 
   CubeDataThread *cubeData = new CubeDataThread();
 
diff --git a/isis/src/base/objs/EndianSwapper/EndianSwapper.cpp b/isis/src/base/objs/EndianSwapper/EndianSwapper.cpp
index cfca7e461eadf9829791c7be0e15543bee06c800..a60f297a937fb6efd16ee6433448612f4584d21a 100644
--- a/isis/src/base/objs/EndianSwapper/EndianSwapper.cpp
+++ b/isis/src/base/objs/EndianSwapper/EndianSwapper.cpp
@@ -138,6 +138,28 @@ namespace Isis {
     return result;
   }
 
+  /**
+   * Swaps a 32bit unsigned integer.
+   *
+   * @param buf Input uint32 integer value to swap.
+   */
+  uint32_t EndianSwapper::Uint32_t(void *buf) {
+    uint32_t result = *(uint32_t *)buf;
+
+    if(p_needSwap) {
+      char *ptr = (char *)buf + (sizeof(uint32_t) - 1) * p_needSwap;
+
+      for(unsigned int i = 0; i < sizeof(uint32_t); i++) {
+        p_swapper.p_char[i] = *ptr;
+        ptr += p_swapDirection;
+      }
+
+      result = p_swapper.p_uint32;
+    }
+
+    return result;
+  }
+
   /**
    * Swaps an 8 byte integer value.
    *
@@ -203,4 +225,3 @@ namespace Isis {
     return result;
   }
 }
-
diff --git a/isis/src/base/objs/EndianSwapper/EndianSwapper.h b/isis/src/base/objs/EndianSwapper/EndianSwapper.h
index 7f52d9a500e01c97bc752b090ca3e6e009bc0426..bd6dc89ba63c30781af207c1d41406d68845db3b 100644
--- a/isis/src/base/objs/EndianSwapper/EndianSwapper.h
+++ b/isis/src/base/objs/EndianSwapper/EndianSwapper.h
@@ -50,6 +50,7 @@ namespace Isis {
    *            not added because it is 4 bytes on 32-bit linux and 8 bytes on
    *            64-bit linux.
    *   @history 2016-04-21 Makayla Shepherd - Added UnsignedWord pixel type handling.
+   *   @history 2018-01-29 Adam Goins - Added uint32_t behavior to EndianSwapper.
    */
   class EndianSwapper {
     private:
@@ -67,6 +68,8 @@ namespace Isis {
        * byte format - all with swapped bytes.
        */
       union {
+        //! Union containing the output uint32_t value with swapped bytes.
+        uint32_t p_uint32;
         //! Union containing the output double precision value with swapped bytes.
         double p_double;
         //! Union containing the output floating point value with swapped bytes.
@@ -93,6 +96,7 @@ namespace Isis {
       float Float(void *buf);
       int ExportFloat(void *buf);
       int Int(void *buf);
+      uint32_t Uint32_t(void *buf);
       long long int LongLongInt(void *buf);
       short int ShortInt(void *buf);
       unsigned short int UnsignedShortInt(void *buf);
diff --git a/isis/src/base/objs/EndianSwapper/EndianSwapper.truth b/isis/src/base/objs/EndianSwapper/EndianSwapper.truth
index 8bac0d87579309913025df0ef5aabd14846420cf..1498b83e99ecd49a112f0ee2ea54be969a2ae8ce 100644
--- a/isis/src/base/objs/EndianSwapper/EndianSwapper.truth
+++ b/isis/src/base/objs/EndianSwapper/EndianSwapper.truth
@@ -1,5 +1,6 @@
 Size of Double:  8   Double 0x12345678 to HOST:  3.0542e+08
 Size of Float:  4   Float 0x1234 to HOST:  4660
+Size of Uint32_t:  4   Uint32_t 0x1234 to HOST:  4660
 Size of Short Int:  2   Short Int 0x1234 to HOST:  4660
 Size of Unsigned Short Int:  2   Unsigned Short Int 0x1234 to HOST:  4660
 Size of Double:  8   Double 0x12345678 to HOST:  2.55354e-312
diff --git a/isis/src/base/objs/EndianSwapper/unitTest.cpp b/isis/src/base/objs/EndianSwapper/unitTest.cpp
index 72fa45a38ee58b31781cd42b6040ea97cf1e0531..55583a7784a99305ea998f222f6d795bccd56157 100644
--- a/isis/src/base/objs/EndianSwapper/unitTest.cpp
+++ b/isis/src/base/objs/EndianSwapper/unitTest.cpp
@@ -12,6 +12,7 @@ int main(int argc, char *argv[]) {
 
   double DoubleValue;
   float FloatValue;
+  uint32_t UIntValue;
   short int ShortIntValue;
   unsigned short int UShortIntValue;
   int IntValue;
@@ -19,6 +20,7 @@ int main(int argc, char *argv[]) {
 
   DoubleValue = 0x12345678;
   FloatValue = 0x1234;
+  UIntValue = 0x1234;
   ShortIntValue = 0x1234;
   UShortIntValue = 0x1234;
   IntValue = 0x12345678;
@@ -30,6 +32,8 @@ int main(int argc, char *argv[]) {
     cout << "   Double 0x12345678 to HOST:  " << lsb.Double(&DoubleValue) << endl;
     cout << "Size of Float:  " << sizeof(float);
     cout << "   Float 0x1234 to HOST:  " << lsb.Float(&FloatValue) << endl;
+    cout << "Size of Uint32_t:  " << sizeof(uint32_t);
+    cout << "   Uint32_t 0x1234 to HOST:  " << lsb.Uint32_t(&UIntValue) << endl;
     cout << "Size of Short Int:  " << sizeof(short int);
     cout << "   Short Int 0x1234 to HOST:  " << lsb.ShortInt(&ShortIntValue) << endl;
     cout << "Size of Unsigned Short Int:  " << sizeof(unsigned short int);
@@ -74,6 +78,8 @@ int main(int argc, char *argv[]) {
     cout << "   Double 0x12345678 to HOST:  " << msb.Double(&DoubleValue) << endl;
     cout << "Size of Float:  " << sizeof(float);
     cout << "   Float 0x1234 to HOST:  " << msb.Float(&FloatValue) << endl;
+    cout << "Size of Uint32_t:  " << sizeof(uint32_t);
+    cout << "   Uint32_t 0x1234 to HOST:  " << msb.Uint32_t(&UIntValue) << endl;
     cout << "Size of Short Int:  " << sizeof(short int);
     cout << "   Short Int 0x1234 to HOST:  " << msb.ShortInt(&ShortIntValue) << endl;
     cout << "Size of Unsigned Short Int:  " << sizeof(unsigned short int);
diff --git a/isis/src/base/objs/GroundGrid/unitTest.cpp b/isis/src/base/objs/GroundGrid/unitTest.cpp
index a633f3148684722983a9fdd60cc9c024d4a3752b..3a82e212e0b3d101b44798b869663027fd69fcd8 100644
--- a/isis/src/base/objs/GroundGrid/unitTest.cpp
+++ b/isis/src/base/objs/GroundGrid/unitTest.cpp
@@ -75,7 +75,7 @@ void IsisMain() {
   cout.flush();
   try {
     Cube incompleteLabelsCube;
-    incompleteLabelsCube.open("./unitTest.cub");
+    incompleteLabelsCube.open("$base/testData/GroundGrid/unitTest.cub");
     UniversalGroundMap gmap(incompleteLabelsCube,
         UniversalGroundMap::ProjectionFirst);
     GroundGrid tmp(&gmap, false, false, someCube.sampleCount(), someCube.lineCount());
diff --git a/isis/src/base/objs/Gui/Gui.cpp b/isis/src/base/objs/Gui/Gui.cpp
index 2e1d3aa8342d79c5ccdc8e007a7c3e0b857aec36..a9436ae8a22e52bb1aeb6f55fddd6f761cd3eec4 100644
--- a/isis/src/base/objs/Gui/Gui.cpp
+++ b/isis/src/base/objs/Gui/Gui.cpp
@@ -56,7 +56,8 @@ namespace Isis {
     // needs changing...
 
     #ifdef Q_OS_LINUX
-    if (!XOpenDisplay(NULL)) {
+    Display *xDisplay = XOpenDisplay(NULL);
+    if (!xDisplay) {
       std::cerr << "cannot connect to X server...\n\n"
           "Do you have an X server running?\n\n"
           "If yes then...\n\n"
@@ -68,6 +69,9 @@ namespace Isis {
 
       abort();
     }
+    else {
+      XCloseDisplay(xDisplay);
+    }
     #endif
   }
 
diff --git a/isis/src/base/objs/Histogram/Histogram.truth b/isis/src/base/objs/Histogram/Histogram.truth
index f4de0263ca1568289ce365e87916b8a59c2165df..b23eb5192d6887a4c05443ee7504a7b19bd5e96b 100644
--- a/isis/src/base/objs/Histogram/Histogram.truth
+++ b/isis/src/base/objs/Histogram/Histogram.truth
@@ -34,7 +34,9 @@ BinCount(20):      0
 
 End old unit test.
 data/base/testData/enceladus_sp-Jig.net
-Loading Control Points...
+Reading Control Points...
+0% Processed
10% Processed
20% Processed
30% Processed
40% Processed
50% Processed
60% Processed
70% Processed
80% Processed
90% Processed
100% Processed
+Adding Control Points to Network...
 0% Processed
10% Processed
20% Processed
30% Processed
40% Processed
50% Processed
60% Processed
70% Processed
80% Processed
90% Processed
100% Processed
 
 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
diff --git a/isis/src/base/objs/LabelTranslationManager/LabelTranslationManager.cpp b/isis/src/base/objs/LabelTranslationManager/LabelTranslationManager.cpp
index 31c64848ec460db1919f35f0846d59c0ba23272a..df4273b8564b6ae3ccbd43180ccb088be532f516 100644
--- a/isis/src/base/objs/LabelTranslationManager/LabelTranslationManager.cpp
+++ b/isis/src/base/objs/LabelTranslationManager/LabelTranslationManager.cpp
@@ -93,7 +93,7 @@ namespace Isis {
         }
         catch(IException &e) {
           if(!IsOptional(g.name())) {
-            throw;
+            throw e;//??? is this needed???
           }
         }
       }
@@ -174,6 +174,7 @@ namespace Isis {
  *                          <li>the value to check for</li>
  *                        </ol>
  *
+<<<<<<< HEAD
  * @throws IException::Unknown "Malformed dependency specification."
  * @throws IException::Unknown "Specification does not have two components
  *                              separated by [@], the type of dependency and
@@ -182,6 +183,16 @@ namespace Isis {
  *                              Valid types are [att] and [tag]"
  * @throws IException::Unknown "Name-value specification does not have two
  *                              components separated by [:]."
+=======
+ * @throws IException::Programmer "Malformed dependency specification."
+ * @throws IException::Programmer "Specification does not have two components
+ *                                 separated by [@], the type of dependency and
+ *                                 the name-value pair.
+ * @throws IException::Programmer "Dependency type specification is invalid.
+ *                                 Valid types are [att] and [tag]"
+ * @throws IException::Programmer "Name-value specification does not have two
+ *                              components separated by [|]."
+>>>>>>> dev
  *
  */
 QStringList LabelTranslationManager::parseSpecification(QString specification) const {
@@ -189,19 +200,34 @@ QStringList LabelTranslationManager::parseSpecification(QString specification) c
   QStringList parsedSpecification;
 
   try {
+<<<<<<< HEAD
     QStringList typeSplit = specification.split("@", QString::SkipEmptyParts);
     QStringList colonSplit = specification.split(":", QString::SkipEmptyParts);
     if (typeSplit.size() == 2) { //handle tag@elementname:value
+=======
+    QStringList typeSplit = specification.split("@", QString::SkipEmptyParts); 
+    QStringList barSplit = specification.split("|", QString::SkipEmptyParts);
+   
+    if (typeSplit.size() == 2) { //handle tag@elementname|value
+>>>>>>> dev
       if (typeSplit[0].toLower() != "att" &&
           typeSplit[0].toLower() != "tag" &&
           typeSplit[0].toLower() != "new") {
         QString msg = "Dependency type specification [" + typeSplit[0] +
                       "] is invalid. Valid types are [att], [tag] and [new]";
+<<<<<<< HEAD
         throw IException(IException::Unknown, msg, _FILEINFO_);
       }
       parsedSpecification.append(typeSplit[0].toLower());
 
       QStringList nameValueSplit = typeSplit[1].split(":", QString::SkipEmptyParts);
+=======
+        throw IException(IException::Programmer, msg, _FILEINFO_);
+      }
+      parsedSpecification.append(typeSplit[0].toLower());
+
+      QStringList nameValueSplit = typeSplit[1].split("|", QString::SkipEmptyParts);
+>>>>>>> dev
       if (nameValueSplit.size() == 2) {
         parsedSpecification.append(nameValueSplit);
       }
@@ -210,6 +236,7 @@ QStringList LabelTranslationManager::parseSpecification(QString specification) c
       }
       else { //nameValueSplit is an unexpected value
         QString msg = "Malformed dependency specification [" + specification + "].";
+<<<<<<< HEAD
         throw IException(IException::Unknown, msg, _FILEINFO_);
       }
     }
@@ -222,12 +249,30 @@ QStringList LabelTranslationManager::parseSpecification(QString specification) c
     else { //nameValueSplit is an unexpected value
       QString msg = " [" + specification + "] has unexpected number of '@' or ':' delimiters";
       throw IException(IException::Unknown,msg, _FILEINFO_);
+=======
+        throw IException(IException::Programmer, msg, _FILEINFO_);
+      }
+    }
+    else if (barSplit.size() == 2) { //handle elementname|value
+      parsedSpecification = barSplit;
+    }
+    else if (barSplit.size() == 1 && typeSplit.size() == 1) { //handle value with no "@" or "|" characters
+      parsedSpecification = barSplit;
+    }
+    else { //nameValueSplit is an unexpected value
+      QString msg = " [" + specification + "] has unexpected number of '@' or '|' delimiters";
+      throw IException(IException::Programmer,msg, _FILEINFO_);
+>>>>>>> dev
     }
   }
 
   catch (IException &e) {
     QString msg = "Malformed dependency specification [" + specification + "].";
+<<<<<<< HEAD
     throw IException(e, IException::Unknown, msg, _FILEINFO_);
+=======
+    throw IException(e, IException::Programmer, msg, _FILEINFO_);
+>>>>>>> dev
   }
 
   return parsedSpecification;
diff --git a/isis/src/base/objs/LabelTranslationManager/LabelTranslationManager.h b/isis/src/base/objs/LabelTranslationManager/LabelTranslationManager.h
index b24feabd68ec9711f66475d86f390d72cbe10b3b..24ba8f52a27b86bf295ee13e6545ab59c287736c 100644
--- a/isis/src/base/objs/LabelTranslationManager/LabelTranslationManager.h
+++ b/isis/src/base/objs/LabelTranslationManager/LabelTranslationManager.h
@@ -51,6 +51,10 @@ namespace Isis {
    *                          Fixes #4584.
    *  @history 2017-05-26 Cole Neubauer - Moved parseDependancy from children
    *                          class. Fixes #5167.
+   *  @history 2017-10-26 Kristin Berry - Modified parseSpecification to switch
+   *                          from parsing translation table dependency specifications of the form
+   *                          name:value to strings of the form name|value. Colons are
+   *                          now used for namespaces only.
    */
   class LabelTranslationManager : public PvlTranslationTable {
     public:
diff --git a/isis/src/base/objs/LabelTranslationManager/LabelTranslationManager.truth b/isis/src/base/objs/LabelTranslationManager/LabelTranslationManager.truth
index b9ec85db64f9568cf4d06bf30de355a98ee31c08..484c5ebff4fc20bf7b092e0ebc2f2b03b4f9a2c2 100644
--- a/isis/src/base/objs/LabelTranslationManager/LabelTranslationManager.truth
+++ b/isis/src/base/objs/LabelTranslationManager/LabelTranslationManager.truth
@@ -22,14 +22,21 @@ Group = Mapping
 End_Group
 End
 
+<<<<<<< HEAD
 Testing parseSpecification method: att@name:value
 
 Testing parseSpecification method: tag@name:value
+=======
+Testing parseSpecification method: att@name|value
+
+Testing parseSpecification method: tag@name|value
+>>>>>>> dev
 
 Testing parseSpecification method: att@name
 
 Testing parseSpecification method: new@name
 
+<<<<<<< HEAD
 Testing parseSpecification method: name:value
 
 Testing parseSpecification method: value
@@ -49,3 +56,32 @@ Testing parseSpecification method: not@name:value
 Testing parseSpecification method: att@name:value1:value2
 **ERROR** Malformed dependency specification [att@name:value1:value2].
 **ERROR** Malformed dependency specification [att@name:value1:value2].
+=======
+Testing parseSpecification method: name|value
+
+Testing parseSpecification method: value
+
+Testing parseSpecification method: namespace:name
+
+Testing parseSpecification method: namespace:name|value
+
+Testing parseSpecification method: att@namespace:name|value
+
+Testing parseSpecification method: tag@name|value
+
+Testing parseSpecification method: att|name|value
+**PROGRAMMER ERROR** Malformed dependency specification [att|name|value].
+**PROGRAMMER ERROR** [att|name|value] has unexpected number of '@' or '|' delimiters.
+
+Testing parseSpecification method: att@name@value
+**PROGRAMMER ERROR** Malformed dependency specification [att@name@value].
+**PROGRAMMER ERROR** [att@name@value] has unexpected number of '@' or '|' delimiters.
+
+Testing parseSpecification method: not@name|value
+**PROGRAMMER ERROR** Malformed dependency specification [not@name|value].
+**PROGRAMMER ERROR** Dependency type specification [not] is invalid. Valid types are [att], [tag] and [new].
+
+Testing parseSpecification method: att@name|value1|value2
+**PROGRAMMER ERROR** Malformed dependency specification [att@name|value1|value2].
+**PROGRAMMER ERROR** Malformed dependency specification [att@name|value1|value2].
+>>>>>>> dev
diff --git a/isis/src/base/objs/LabelTranslationManager/unitTest.cpp b/isis/src/base/objs/LabelTranslationManager/unitTest.cpp
index 95aaf5a7597da18d99cc859250527edf325ffed9..081d6a52a0140260a6c24b4258f9b6a49e2367e4 100644
--- a/isis/src/base/objs/LabelTranslationManager/unitTest.cpp
+++ b/isis/src/base/objs/LabelTranslationManager/unitTest.cpp
@@ -14,6 +14,8 @@ using namespace std;
  *
  * @internal
  *  @history 2017-01-11 Jeannie Backer - Original Version. Fixes #4584.
+ *  @history 2017-10-16 Kristin Berry - Updated for changes to dependency specification format and
+ *                        the addition of xml namspaces. References #5202
  */
 class TestTranslationManager : public LabelTranslationManager {
   public:
@@ -118,6 +120,7 @@ int main(void) {
     e.print();
   }
   try {
+<<<<<<< HEAD
     cout << endl << "Testing parseSpecification method: att@name:value" << endl;
     transMgr.parseSpecification((QString)"att@name:value");
 
@@ -138,12 +141,70 @@ int main(void) {
 
     cout << endl << "Testing parseSpecification method: att:name:value" << endl;
     transMgr.parseSpecification((QString)"att:name:value");
+=======
+    cout << endl << "Testing parseSpecification method: att@name|value" << endl;
+    transMgr.parseSpecification((QString)"att@name:value");
+
+    cout << endl << "Testing parseSpecification method: tag@name|value" << endl;
+    transMgr.parseSpecification((QString)"tag@name|value");
+
+    cout << endl << "Testing parseSpecification method: att@name" << endl;
+    transMgr.parseSpecification((QString)"att@name");
+
+    cout << endl << "Testing parseSpecification method: new@name" << endl;
+    transMgr.parseSpecification((QString)"new@name");
+
+    cout << endl << "Testing parseSpecification method: name|value" << endl;
+    transMgr.parseSpecification((QString)"name|value");
+
+    cout << endl << "Testing parseSpecification method: value" << endl;
+    transMgr.parseSpecification((QString)"value");
+
+    cout << endl << "Testing parseSpecification method: namespace:name" << endl;
+    transMgr.parseSpecification((QString)"namespace:name");
+
+    cout << endl << "Testing parseSpecification method: namespace:name|value" << endl;
+    transMgr.parseSpecification((QString)"namespace:name|value");
+
+    cout << endl << "Testing parseSpecification method: att@namespace:name|value" << endl;
+    transMgr.parseSpecification((QString)"att@namepsace:name|value");
+
+    cout << endl << "Testing parseSpecification method: tag@name|value" << endl;
+    transMgr.parseSpecification((QString)"tag@namespace:name|value");
+  }
+  catch(IException &e) {
+    e.print();
+  }
+
+
+  try {
+    cout << endl << "Testing parseSpecification method: att|name|value" << endl;
+    transMgr.parseSpecification((QString)"att|name|value");
+  }
+  catch(IException &e) {
+    e.print();
+  }
+
+
+  try {
+    cout << endl << "Testing parseSpecification method: att@name@value" << endl;
+    transMgr.parseSpecification((QString)"att@name@value");
+  }
+  catch(IException &e) {
+    e.print();
+  }
+
+  try {
+    cout << endl << "Testing parseSpecification method: not@name|value" << endl;
+    transMgr.parseSpecification((QString)"not@name|value");
+>>>>>>> dev
   }
   catch(IException &e) {
     e.print();
   }
 
   try {
+<<<<<<< HEAD
     cout << endl << "Testing parseSpecification method: att@name@value" << endl;
     transMgr.parseSpecification((QString)"att@name@value");
   }
@@ -162,6 +223,10 @@ int main(void) {
   try {
     cout << endl << "Testing parseSpecification method: att@name:value1:value2" << endl;
     transMgr.parseSpecification((QString)"att@name:value1:value2");
+=======
+    cout << endl << "Testing parseSpecification method: att@name|value1|value2" << endl;
+    transMgr.parseSpecification((QString)"att@name|value1|value2");
+>>>>>>> dev
   }
   catch(IException &e) {
     e.print();
diff --git a/isis/src/base/objs/LinearAlgebra/LinearAlgebra.cpp b/isis/src/base/objs/LinearAlgebra/LinearAlgebra.cpp
index 76bfa6aee960143a1c92df7cb155d5ea33b9b2cc..942e296371122a7602f345748da67c1eea37553d 100644
--- a/isis/src/base/objs/LinearAlgebra/LinearAlgebra.cpp
+++ b/isis/src/base/objs/LinearAlgebra/LinearAlgebra.cpp
@@ -56,7 +56,8 @@ namespace Isis {
   /**
    * Destructor for a LinearAlgebra object.
    */
-  LinearAlgebra::~LinearAlgebra() {}
+  LinearAlgebra::~LinearAlgebra() {
+  }
 
 
   /** 
diff --git a/isis/src/base/objs/LinearAlgebra/LinearAlgebra.h b/isis/src/base/objs/LinearAlgebra/LinearAlgebra.h
index 1c83f9c53361c447ec96a6dc200b564d3cb483bb..4195065f2123d5fb3776de25c263bdf027edf1fa 100644
--- a/isis/src/base/objs/LinearAlgebra/LinearAlgebra.h
+++ b/isis/src/base/objs/LinearAlgebra/LinearAlgebra.h
@@ -44,11 +44,11 @@ namespace Isis {
   class Latitude;
   class Longitude;
   /**
-   * This class holds all static methods to perform linear algebra 
-   * operations on vectors and matrices. 
-   *  
-   * This class has 4 representations of a 3 dimensional rotation 
-   * <ul> 
+   * This class holds all static methods to perform linear algebra
+   * operations on vectors and matrices.
+   *
+   * This class has 4 representations of a 3 dimensional rotation
+   * <ul>
    *   <li> A 3 X 3 rotation matrix </li>
    *   <li> An angle/axis pair - This pair is made up of a vector (axis)
    *   and angle of rotation about that axis.</li>
@@ -60,7 +60,7 @@ namespace Isis {
    *   their corresponding axis of rotation. In this case, each axis
    *   must be one of the x, y, or z axes for the coordinate system.</li>
    * </ul>
-   *  
+   *
    * @author 2013-06-01 Jeannie Backer
    *
    * @internal
@@ -73,31 +73,32 @@ namespace Isis {
    *                           when throwing exceptions.  Fixes #2302.
    *   @history 2017-11-01 Ken Edmundson - Added support for Boost compressed matrix and vector
    *                                       types, including QDebug operators.
+   *   @history 2017-12-12 Jeannie Backer - Added SymmetricMatrix typedef.
+   *
    *
-   *  
    *   @todo document methods (a) add naif routine names to documentation where appropriate,
    *                          (b) clean up comments within methods,
    *                          (3) use naif documentation where appropriate
    *   @todo add links to naif documentation web pages???
    *   @todo add proper scopes
    *   @todo implement norm2 (L2 norm)?
-   *   @todo implement trace? 
-   *   @todo common validate errors - vector size match, 3x3 matrix, 3D vector 
+   *   @todo implement trace?
+   *   @todo common validate errors - vector size match, 3x3 matrix, 3D vector
    *   @todo what is more expensive - unitize vector and compare to 1 or isOrthogonal?
    *   @todo rename local variables m2q and q2m
    *   @todo implement qdq2av (Quaternion and quaternion derivative to angular velocity)?
    *   @todo implement qxq (Quaternion times quaternion)?
    *   @todo implement qderiv (Quadratic derivative)?
-   *   @todo When converting quaternion, axis-angle, Euler angle to rot 
+   *   @todo When converting quaternion, axis-angle, Euler angle to rot
    *         matrix, should we verify that the matrix is valid (is a rotation matrix)???
-   *   @todo isQuaternion??? 
+   *   @todo isQuaternion???
    *   @todo should we throw error in q2m if q = 0???
    *   @todo q2m - why check if sharpen when q is not unit if it is required
    *         to be a unit? throw an error?
-   *   @todo axisar - throw error if axis is origin? If we rotate about 
+   *   @todo axisar - throw error if axis is origin? If we rotate about
    *         about origin, then we get a zero matrix - not a rotation...
    *         except maybe trivially... (or do we get identity??? indicating no rotation)
-   *   @todo double check all indexing on code copied from NAIF - indices 
+   *   @todo double check all indexing on code copied from NAIF - indices
    *         should reverse col/row order and subtract 1
    */
 
@@ -112,7 +113,7 @@ namespace Isis {
        * Note: These typedefs are used so that we can add functionality to an
        * existing matrix type and/or change which third party library's matrix
        * we are using without changing all references to this type in the ISIS
-       * API. 
+       * API.
        */
       typedef boost::numeric::ublas::matrix<double> Matrix;
       typedef boost::numeric::ublas::compressed_matrix<double> MatrixCompressed;
@@ -122,13 +123,23 @@ namespace Isis {
           MatrixLowerTriangular;
 
       /**
-       * Definitions for various Isis::LinearAlgebra::Vector of doubles. These are
-       * typedefs for boost vectors.
-       *  
-       * Note: These typedefs are used so that we can add functionality to an
+       * Definition for an Isis::LinearAlgebra::SymmetrixMatrix of doubles with
+       * an upper configuration. This is a typedef for a boost symmetric_matrix.
+       *
+       * Note: This typedef is used so that we can add functionality to an
+       * existing matrix type and/or change which third party library's matrix
+       * we are using without changing all references to this type in the ISIS
+       * API.
+       */
+      typedef boost::numeric::ublas::symmetric_matrix<double, boost::numeric::ublas::upper> SymmetricMatrix;
+      /**
+       * Definition for an Isis::LinearAlgebra::Vector of doubles. This is a
+       * typedef for a boost vector.
+       *
+       * Note: This typedef is used so that we can add functionality to an
        * existing vector type and/or change which third party library's vector
        * we are using without changing all references to this type in the ISIS
-       * API. 
+       * API.
        */
       typedef boost::numeric::ublas::vector<double> Vector;
       typedef boost::numeric::ublas::compressed_vector<double> VectorCompressed;
@@ -136,15 +147,15 @@ namespace Isis {
       // define AxisAngle and EulerAngle
       /**
        * Definition for an Axis-Angle pair. This is a three dimensional rotation
-       * represented as an axis of rotation and a corresponding rotation angle. 
-       * AxisAngle is a typedef for a QPair of an Isis::LinearAlgebra::Vector 
-       * and an Isis::Angle. 
+       * represented as an axis of rotation and a corresponding rotation angle.
+       * AxisAngle is a typedef for a QPair of an Isis::LinearAlgebra::Vector
+       * and an Isis::Angle.
        */
       typedef QPair<Vector, Angle> AxisAngle;
       /**
        * Definition for an EulerAngle pair. This is a three dimensional rotation
-       * represented as an Euler angle and the number corresponding to its 
-       * rotation axis. EulerAngle is a typedef for a QPair of an Isis::Angle 
+       * represented as an Euler angle and the number corresponding to its
+       * rotation axis. EulerAngle is a typedef for a QPair of an Isis::Angle
        * and an integer (1, 2, or 3).
        */
       typedef QPair<Angle, int> EulerAngle;
@@ -165,7 +176,7 @@ namespace Isis {
       static Matrix zeroMatrix(int rows, int columns);
       static Vector zeroVector(int size);
 
-      // 
+      //
       static double determinant(const Matrix &matrix);
 
       // magnitude/norm based calculations
@@ -192,9 +203,9 @@ namespace Isis {
       static Vector project(const Vector &vector1, const Vector &vector2);
       static Vector rotate(const Vector &vector, const Vector &axis, Angle angle);
 
-      // 
+      //
       static Vector perpendicular(const Vector &vector1, const Vector &vector2);
-       
+
       // converters
       static AxisAngle toAxisAngle(const Matrix &rotationMatrix);//raxisa
       static Matrix toMatrix(const AxisAngle &axisAngle); // axisar
@@ -224,7 +235,7 @@ namespace Isis {
       // done in boost/numeric/ublas/io.hpp, which is included above
       // The print format for a size 3 vector is
       // [3] (1, 2, 3)
-      // 
+      //
       // friend ostream &operator<<(ostream &os, LinearAlgebra::Vector &vector);
 
     protected:
@@ -247,4 +258,3 @@ namespace Isis {
 };
 
 #endif
-
diff --git a/isis/src/base/objs/PlaneShape/unitTest.cpp b/isis/src/base/objs/PlaneShape/unitTest.cpp
index 48c542b20878d3a980def27b11784ddcf639bc58..550593d6693b5d6a3d55a0dfb5c25c1904b315ba 100644
--- a/isis/src/base/objs/PlaneShape/unitTest.cpp
+++ b/isis/src/base/objs/PlaneShape/unitTest.cpp
@@ -57,7 +57,7 @@ int main() {
   try {
     Preference::Preferences(true);
     //string inputFile = "$mgs/testData/ab102401.cub";
-    QString inputFile = "W1591510834_1_cal.cub";
+    QString inputFile = "$base/testData/PlaneShape/W1591510834_1_cal.cub";
     Cube cube;
     cube.open(inputFile);
     Camera *c = cube.camera();
diff --git a/isis/src/base/objs/PolygonTools/unitTest.cpp b/isis/src/base/objs/PolygonTools/unitTest.cpp
index df78bd338aa24b1ba63f0ef41594e2099847fcec..f3fc8f6f814384d50fd4b04434a3c730be136db3 100644
--- a/isis/src/base/objs/PolygonTools/unitTest.cpp
+++ b/isis/src/base/objs/PolygonTools/unitTest.cpp
@@ -109,7 +109,7 @@ int main() {
          << endl << endl;
 
     // Create a UniversalGroundMap so we can test the SampleLinePolygon stuff
-    Cube cube("unitTest.lbl", "r");
+    Cube cube(FileName("$base/testData/PolygonTools/unitTest.lbl").expanded(), "r");
     UniversalGroundMap ugm = UniversalGroundMap(cube);
 
     // Create coordinate sequence for the first of two polygons
diff --git a/isis/src/base/objs/PolygonTools/unitTest.lbl b/isis/src/base/objs/PolygonTools/unitTest.lbl
deleted file mode 100644
index c025c753e935f516697bec51f3d0a45587adf7e3..0000000000000000000000000000000000000000
--- a/isis/src/base/objs/PolygonTools/unitTest.lbl
+++ /dev/null
@@ -1,109 +0,0 @@
-Object = IsisCube
-  Object = Core
-    StartByte   = 1
-    ^Core       = unitTest.lab.cub
-    Format      = Tile
-    TileSamples = 128
-    TileLines   = 128
-
-    Group = Dimensions
-      Samples = 1204
-      Lines   = 1056
-      Bands   = 1
-    End_Group
-
-    Group = Pixels
-      Type       = UnsignedByte
-      ByteOrder  = Lsb
-      Base       = 0.0
-      Multiplier = 1.0
-    End_Group
-  End_Object
-
-  Group = Instrument
-    SpacecraftName       = VIKING_ORBITER_2
-    InstrumentId         = VISUAL_IMAGING_SUBSYSTEM_CAMERA_B
-    TargetName           = MARS
-    StartTime            = 1977-08-03T15:59:09
-    ExposureDuration     = 0.135800 <seconds>
-    SpacecraftClockCount = 53448121
-    FloodModeId          = ON
-    GainModeId           = LOW
-    OffsetModeId         = ON
-  End_Group
-
-  Group = Archive
-    DataSetId       = VO1/VO2-M-VIS-2-EDR-V2.0
-    ProductId       = 348B26
-    MissonPhaseName = EXTENDED_MISSION
-    ImageNumber     = 53448121
-    OrbitNumber     = 348
-  End_Group
-
-  Group = BandBin
-    FilterName = RED
-    FilterId   = 6
-  End_Group
-
-  Group = Kernels
-    LeapSecond          = $base/kernels/lsk/naif0008.tls
-    TargetAttitudeShape = $base/kernels/pck/pck00008.tpc
-    TargetPosition      = $base/kernels/spk/de405.bsp
-    InstrumentPointing  = $viking2/kernels/ck/vo2_sedr_ck2.bc
-    Instrument          = Null
-    SpacecraftClock     = ($viking2/kernels/sclk/vo2_fict.tsc, 
-                           $viking2/kernels/sclk/vo2_fsc.tsc)
-    InstrumentPosition  = $viking2/kernels/spk/vo2_rcon.bsp
-    Frame               = $viking2/kernels/fk/vo2_v10.tf
-    InstrumentAddendum  = $viking2/kernels/iak/vikingAddendum003.ti
-    ElevationModel      = Null
-    NaifFrameCode       = -30002
-  End_Group
-
-  Group = Reseaus
-    Line     = (5, 7, 9, 10, 11, 12, 14, 15, 17, 19, 20, 135, 136, 137, 138, 
-                139, 140, 142, 143, 144, 146, 148, 149, 265, 266, 267, 268, 
-                269, 270, 271, 272, 274, 276, 278, 395, 395, 397, 398, 398, 
-                399, 400, 401, 402, 404, 406, 407, 525, 526, 526, 527, 528, 
-                528, 529, 530, 531, 533, 535, 654, 655, 655, 656, 657, 657, 
-                658, 659, 660, 661, 663, 664, 784, 784, 785, 785, 786, 786, 
-                787, 788, 789, 790, 793, 914, 914, 914, 914, 915, 915, 916, 
-                916, 917, 918, 920, 922, 1043, 1043, 1043, 1043, 1044, 1044, 
-                1045, 1045, 1046, 1048, 1051)
-    Sample   = (23, 141, 257, 373, 489, 605, 720, 836, 952, 1068, 1185, 23, 
-                82, 199, 315, 431, 546, 662, 778, 894, 1010, 1126, 1184, 24, 
-                141, 257, 373, 489, 605, 720, 836, 952, 1068, 1184, 24, 82, 
-                199, 315, 432, 547, 663, 779, 895, 1011, 1127, 1184, 24, 141, 
-                258, 374, 490, 605, 721, 837, 953, 1070, 1185, 24, 83, 200, 
-                316, 432, 548, 664, 780, 896, 1012, 1128, 1185, 24, 142, 258, 
-                374, 490, 606, 722, 838, 954, 1070, 1186, 23, 82, 199, 316, 
-                432, 548, 664, 780, 896, 1013, 1129, 1186, 22, 140, 257, 374, 
-                489, 606, 722, 838, 954, 1071, 1187)
-    Type     = (1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 4, 5, 5, 5, 5, 5, 5, 5, 5, 
-                5, 5, 6, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 4, 5, 5, 5, 5, 5, 
-                5, 5, 5, 5, 5, 6, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 4, 5, 5, 
-                5, 5, 5, 5, 5, 5, 5, 5, 6, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 
-                4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 4, 5, 5, 5, 5, 5, 5, 5, 
-                5, 5, 6)
-    Valid    = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-                0, 0, 0)
-    Template = $viking2/reseaus/vo2.visb.template.cub
-    Status   = Nominal
-  End_Group
-End_Object
-
-Object = Label
-  Bytes = 65536
-End_Object
-
-Object = History
-  Name      = IsisCube
-  StartByte = 1
-  Bytes     = 805
-  ^History  = unitTest.IsisCube
-End_Object
-End
diff --git a/isis/src/base/objs/Process/Process.truth b/isis/src/base/objs/Process/Process.truth
index cd0c823bbc1ce2bc6bdd15242bc2974001dcb43a..3b0954f719988f685ccb9109d94cc1a108f1fa45 100644
--- a/isis/src/base/objs/Process/Process.truth
+++ b/isis/src/base/objs/Process/Process.truth
@@ -1,6 +1,6 @@
 Testing Isis::Process Class ... 
 Testing GetUserInterface ... 
-unitTest.cub
+$base/testData/Process/unitTest.cub
 
 Testing SetOutputCube without an input cube ...
 **PROGRAMMER ERROR** No input images have been selected ... thereforethe output image size can not be determined.
diff --git a/isis/src/base/objs/Process/unitTest.cpp b/isis/src/base/objs/Process/unitTest.cpp
index 5cabfd08398a273ce38af13467d86d3fdfd08b8b..b0c98922dc3475d0acf54e0ff33e5dffced7fe51 100644
--- a/isis/src/base/objs/Process/unitTest.cpp
+++ b/isis/src/base/objs/Process/unitTest.cpp
@@ -80,7 +80,7 @@ void IsisMain() {
   cout << "Testing SetInputWorkCube SizeMatch error for bands ..." << endl;
   try {
     Isis::CubeAttributeInput att("+1");
-    p.SetInputCube("unitTest.cub",
+    p.SetInputCube(FileName("$base/testData/Process/unitTest.cub").expanded(),
                    att, Isis::SizeMatch);
   }
   catch(Isis::IException &e) {
@@ -97,7 +97,7 @@ void IsisMain() {
     Isis::Process p2;
     Isis::CubeAttributeInput att;
     p2.SetInputCube(FileName("$TEMPORARY/isisprocess_01").expanded(), att);
-    p2.SetInputCube("unitTest.cub", att,
+    p2.SetInputCube(FileName("$base/testData/Process/unitTest.cub").expanded(), att,
                     Isis::SizeMatch);
   }
   catch(Isis::IException &e) {
@@ -113,7 +113,7 @@ void IsisMain() {
     Isis::Process p2;
     Isis::CubeAttributeInput att;
     p2.SetInputCube(FileName("$TEMPORARY/isisprocess_02").expanded(), att);
-    p2.SetInputCube("unitTest.cub", att,
+    p2.SetInputCube(FileName("$base/testData/Process/unitTest.cub").expanded(), att,
                     Isis::SizeMatch);
   }
   catch(Isis::IException &e) {
@@ -126,7 +126,7 @@ void IsisMain() {
     Isis::Process p2;
     Isis::CubeAttributeInput att;
     p2.SetInputCube(FileName("$TEMPORARY/isisprocess_01").expanded(), att);
-    p2.SetInputCube("unitTest.cub", att,
+    p2.SetInputCube(FileName("$base/testData/Process/unitTest.cub").expanded(), att,
                     Isis::SpatialMatch);
   }
   catch(Isis::IException &e) {
@@ -139,7 +139,7 @@ void IsisMain() {
     Isis::Process p2;
     Isis::CubeAttributeInput att;
     p2.SetInputCube(FileName("$TEMPORARY/isisprocess_02").expanded(), att);
-    p2.SetInputCube("unitTest.cub", att,
+    p2.SetInputCube(FileName("$base/testData/Process/unitTest.cub").expanded(), att,
                     Isis::SpatialMatch);
   }
   catch(Isis::IException &e) {
@@ -155,7 +155,7 @@ void IsisMain() {
     Isis::Process p2;
     Isis::CubeAttributeInput att;
     p2.SetInputCube(FileName("$TEMPORARY/isisprocess_03").expanded(), att);
-    p2.SetInputCube("unitTest.cub", att,
+    p2.SetInputCube(FileName("$base/testData/Process/unitTest.cub").expanded(), att,
                     Isis::BandMatchOrOne);
   }
   catch(Isis::IException &e) {
@@ -171,7 +171,7 @@ void IsisMain() {
     Isis::Process p2;
     Isis::CubeAttributeInput att;
     p2.SetInputCube(FileName("$TEMPORARY/isisprocess_03").expanded(), att);
-    p2.SetInputCube("unitTest.cub", att,
+    p2.SetInputCube(FileName("$base/testData/Process/unitTest.cub").expanded(), att,
                     Isis::AllMatchOrOne);
   }
   catch(Isis::IException &e) {
@@ -249,7 +249,7 @@ void IsisMain() {
   // Create the list of tables to copy from the unitTest.cub (only copy Table2)
   QList<QString> tables;
   tables << "Table2";
-  pTableNames.PropagateTables("unitTest.cub", tables);
+  pTableNames.PropagateTables(FileName("$base/testData/Process/unitTest.cub").expanded(), tables);
   cout << "Does output cube have \"Table\"  ? " << std::boolalpha
        << ocubeTableNames->hasTable("Table") << endl;
   cout << "Does output cube have \"Table2\" ? " << std::boolalpha
diff --git a/isis/src/base/objs/Process/unitTest.xml b/isis/src/base/objs/Process/unitTest.xml
index 7956dbfd81decbdb457e1ed8bf73f42c52c1a67d..024cc653c4ebdaaa65c08c72983e8fed99a271a1 100644
--- a/isis/src/base/objs/Process/unitTest.xml
+++ b/isis/src/base/objs/Process/unitTest.xml
@@ -19,6 +19,9 @@
     <change name="Stuart Sides" date="2003-05-16">
       Modified schema from astrogeology... isis.astrogeology...
     </change>
+    <change name="Ian Humphrey" date="2017-12-07">
+      Updated default FROM item
+    </change>
   </history>
 
   <groups>
@@ -35,7 +38,7 @@
         <filter>
           *.cub
         </filter>
-        <default><item>unitTest.cub</item></default>
+	<default><item>$base/testData/Process/unitTest.cub</item></default>
       </parameter>
       <parameter name="TO">
         <type>cube</type>
diff --git a/isis/src/base/objs/ProcessExportPds/ProcessExportPds.cpp b/isis/src/base/objs/ProcessExportPds/ProcessExportPds.cpp
index 94192c1494ee93cac804862af80e7dbfa21006b2..b30a1d662042cf4c8581441a0d4935fd921a2163 100644
--- a/isis/src/base/objs/ProcessExportPds/ProcessExportPds.cpp
+++ b/isis/src/base/objs/ProcessExportPds/ProcessExportPds.cpp
@@ -149,7 +149,7 @@ namespace Isis {
       }
     }
     else {
-      QString msg = "Invalid PDS export type";
+      QString msg = "Invalid PDS export type.";
       throw IException(IException::Programmer, msg, _FILEINFO_);
     }
 
@@ -263,7 +263,7 @@ namespace Isis {
       }
     }
     else {
-      QString msg = "Labels must be detached for JP2 files";
+      QString msg = "Labels must be detached for JP2 files.";
       throw IException(IException::Programmer, msg, _FILEINFO_);
     }
     FileName outFile(sImageFile);
@@ -277,7 +277,7 @@ namespace Isis {
     cmpObj += PvlKeyword("UNCOMPRESSED_FILE_NAME", infilename.name());
     int storagebytes = InputCubes[0]->sampleCount() * InputCubes[0]->lineCount();
     if(p_pixelType == Isis::Real) {
-      QString msg = "JPEG2000 does not support floating point data";
+      QString msg = "JPEG2000 does not support floating point data.";
       throw IException(IException::Programmer, msg, _FILEINFO_);
     }
     if(p_pixelType == Isis::UnsignedWord || p_pixelType == Isis::SignedWord) {
@@ -354,7 +354,7 @@ namespace Isis {
       }
     }
     else {
-      QString msg = "Labels must be detached for JP2 files";
+      QString msg = "Labels must be detached for JP2 files.";
       throw IException(IException::Programmer, msg, _FILEINFO_);
     }
     FileName outFile(sImageFile);
@@ -368,7 +368,7 @@ namespace Isis {
     cmpObj += PvlKeyword("UNCOMPRESSED_FILE_NAME", infilename.name());
     int storagebytes = InputCubes[0]->sampleCount() * InputCubes[0]->lineCount();
     if(p_pixelType == Isis::Real) {
-      QString msg = "JPEG2000 does not support floating point data";
+      QString msg = "JPEG2000 does not support floating point data.";
       throw IException(IException::Programmer, msg, _FILEINFO_);
     }
     if(p_pixelType == Isis::UnsignedWord || p_pixelType == Isis::SignedWord) {
@@ -690,10 +690,6 @@ namespace Isis {
     if(inputLabel->hasObject("IsisCube") &&
         !(inputLabel->findObject("IsisCube").hasGroup("Mapping"))) return;
     PvlGroup &inputMapping = inputLabel->findGroup("Mapping", Pvl::Traverse);
-    // Translate the common keywords for a PDS IMAGE_MAP_PROJECTION
-    PvlToPvlTranslationManager xlatGenProj(*inputLabel,
-                                      "$base/translations/pdsExportAllMapping.trn");
-    xlatGenProj.Auto(outputPvl);
 
     // Translate the projection specific keywords for a PDS IMAGE_MAP_PROJECTION
     QString projName = ProjectionName(*inputLabel);
diff --git a/isis/src/base/objs/ProcessExportPds/ProcessExportPds.h b/isis/src/base/objs/ProcessExportPds/ProcessExportPds.h
index 832b45382bbe4faa6131a2b369a5deaecae78cd6..5cc18c5affd516a9db32e92b88b03936d2f8a810 100644
--- a/isis/src/base/objs/ProcessExportPds/ProcessExportPds.h
+++ b/isis/src/base/objs/ProcessExportPds/ProcessExportPds.h
@@ -83,6 +83,8 @@ namespace Isis {
    *                           value. Modified StreamImageRoot() and FixedImageRoot() to create
    *                           CHECKSUM placeholder in the labels if we are generating a checksum.
    *                           Fixes #1013.
+   *   @history 2017-10-18 Makayla Shepard - Removed code associated with completely empty unused
+   *                           file pdsExportAllMapping.trn. References #5202. 
    */
 
   class ProcessExportPds : public Isis::ProcessExport {
diff --git a/isis/src/base/objs/ProcessExportPds4/Makefile b/isis/src/base/objs/ProcessExportPds4/Makefile
deleted file mode 100644
index f122bc88227c5c7ebd108dea5d339d1d2e074d82..0000000000000000000000000000000000000000
--- a/isis/src/base/objs/ProcessExportPds4/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-ifeq ($(ISISROOT), $(BLANK))
-.SILENT:
-error:
-	echo "Please set ISISROOT";
-else
-	include $(ISISROOT)/make/isismake.objs
-endif
\ No newline at end of file
diff --git a/isis/src/base/objs/ProcessExportPds4/ProcessExportPds4.cpp b/isis/src/base/objs/ProcessExportPds4/ProcessExportPds4.cpp
index daa689f5c6e0c27b0f891e753b8c6ea0d298ad8b..cf02c924961fb8f5041df1a6309d78d1e49fdb8e 100644
--- a/isis/src/base/objs/ProcessExportPds4/ProcessExportPds4.cpp
+++ b/isis/src/base/objs/ProcessExportPds4/ProcessExportPds4.cpp
@@ -23,9 +23,13 @@
 #include <sstream>
 
 #include <QDomDocument>
+#include <QMap>
 #include <QString>
 
 #include "FileName.h"
+#include "IException.h"
+#include "Projection.h"
+#include "ProjectionFactory.h"
 #include "Pvl.h"
 #include "PvlToXmlTranslationManager.h"
 
@@ -43,6 +47,16 @@ namespace Isis {
 
     m_domDoc = new QDomDocument("");
 
+    // base xml file 
+    // <?xml version="1.0" encoding="UTF-8"?>
+    QString xmlVersion = "version=\"1.0\" encoding=\"utf-8\"";
+    QDomProcessingInstruction xmlHeader =
+        m_domDoc->createProcessingInstruction("xml", xmlVersion);
+    m_domDoc->appendChild(xmlHeader);
+
+    // base pds4 schema location
+    m_schemaLocation = "http://pds.nasa.gov/pds4/pds/v1 http://pds.nasa.gov/pds4/pds/v1/PDS4_PDS_1800.xsd"; 
+
     QString xmlModel;
     xmlModel += "href=\"http://pds.nasa.gov/pds4/pds/v1/PDS4_PDS_1800.sch\" ";
     xmlModel += "schemetypens=\"http://purl.oclc.org/dsdl/schematron\"";
@@ -83,6 +97,7 @@ namespace Isis {
       }
 
       CreateImageLabel();
+      translateUnits(*m_domDoc);
       return *m_domDoc;
     }
   }
@@ -94,38 +109,216 @@ namespace Isis {
    */
   void ProcessExportPds4::CreateImageLabel() {
 
-    FixedImageRoot();
+    try {
+      identificationArea();
+    }
+    catch (IException &e) {
+      QString msg = "Unable to translate and export identification information.";
+      throw IException(e, IException::Programmer, msg, _FILEINFO_);
+    }
+    try {
+      standardInstrument();
+    }
+    catch (IException &e) {
+      QString msg = "Unable to translate and export instrument information.";
+      throw IException(e, IException::Programmer, msg, _FILEINFO_);
+    }
+    try {
+      displaySettings();
+    }
+    catch (IException &e) {
+      QString msg = "Unable to translate and export display settings.";
+      throw IException(e, IException::Programmer, msg, _FILEINFO_);
+    }
+// Temporarily removed spectral processing because it needs further work. 
+// 
+//    try {
+//      standardBandBin();
+//    } 
+//    catch (IException &e) {
+//      QString msg = "Unable to translate and export spectral information.";
+//      throw IException(e, IException::Programmer, msg, _FILEINFO_);
+//    }
+
+    try { 
+      // <Discipline_Area>
+      // display settings, and cartography handled in this method:
+      StandardAllMapping();
+    }
+    catch (IException &e) {
+      QString msg = "Unable to translate and export mapping group.";
+      throw IException(e, IException::Programmer, msg, _FILEINFO_);
+    }
+    try {
+      // file observation area
+      StandardImageImage();
+    }
+    catch (IException &e) {
+      QString msg = "Unable to translate and export standard image information.";
+      throw IException(e, IException::Programmer, msg, _FILEINFO_);
+    }
+  }
+
+
+  /**
+   * This method translates the information from the ISIS 
+   * Instrument group to the PDS4 labels. 
+   */
+  void ProcessExportPds4::standardInstrument() {
+    Pvl *inputLabel = InputCubes[0]->label(); 
+    FileName transfile;
 
-    StandardImageImage();
+    // Translate the Instrument group
+    transfile = "$base/translations/pds4ExportInstrument.trn";
+    PvlToXmlTranslationManager instXlator(*inputLabel, transfile.expanded());
+    instXlator.Auto(*m_domDoc);
+
+    // If instrument and spacecraft values were translated, create the combined name
+    QDomElement obsAreaNode = m_domDoc->documentElement().firstChildElement("Observation_Area");
+
+    if ( !obsAreaNode.isNull() ) {
+
+      // fix start/stop times, if needed
+      QDomElement timeNode = obsAreaNode.firstChildElement("Time_Coordinates");
+      if (!timeNode.isNull()) {
+        QDomElement startTime = timeNode.firstChildElement("start_date_time");
+        if (startTime.text() == "") {
+          startTime.setAttribute("xsi:nil", "true");
+        }
+        else {
+          QString timeValue = startTime.text();
+          PvlToXmlTranslationManager::resetElementValue(startTime, timeValue + "Z");
+        }
+        QDomElement stopTime  = timeNode.firstChildElement("stop_date_time"); 
+        if (stopTime.text() == "") {
+          stopTime.setAttribute("xsi:nil", "true");
+        }
+        else {
+          QString timeValue = stopTime.text();
+          PvlToXmlTranslationManager::resetElementValue(stopTime, timeValue + "Z");
+        }
+
+      }
+
+      QDomElement obsSysNode = obsAreaNode.firstChildElement("Observing_System");
+      if ( !obsSysNode.isNull() ) {
+        QString instrumentName;
+        QString spacecraftName;
+        QDomElement obsSysCompNode = obsSysNode.firstChildElement("Observing_System_Component");
+        while ( !obsSysCompNode.isNull()) {
+          QDomElement compTypeNode = obsSysCompNode.firstChildElement("type");
+          if ( compTypeNode.text().compare("Spacecraft") == 0 ) {
+            QString componentName = obsSysCompNode.firstChildElement("name").text();
+            if (QString::compare(componentName, "TBD", Qt::CaseInsensitive) != 0) {
+              spacecraftName = componentName; 
+            }
+          }
+          else if ( compTypeNode.text().compare("Instrument") == 0 ) {
+            QString componentName = obsSysCompNode.firstChildElement("name").text();
+            if (QString::compare(componentName, "TBD", Qt::CaseInsensitive) != 0) {
+              instrumentName = componentName;
+            }
+          }
+          obsSysCompNode = obsSysCompNode.nextSiblingElement("Observing_System_Component");
+        }
+        QDomElement combinedNode = m_domDoc->createElement("name");
+        QString combinedValue = "TBD";
+        if ( !instrumentName.isEmpty() && !spacecraftName.isEmpty() ) {
+          combinedValue = spacecraftName + " " + instrumentName;
+        }
+        combinedNode.appendChild( m_domDoc->createTextNode(combinedValue) );
+        obsSysNode.insertBefore( combinedNode, obsSysNode.firstChild() );
+      }
+    }
 
-    //StandardAllMapping(mainPvl);
+    // Translate the Target name
+    try {
+      transfile = "$base/translations/pds4ExportTargetFromInstrument.trn"; 
+      PvlToXmlTranslationManager targXlator(*inputLabel, transfile.expanded());
+      targXlator.Auto(*m_domDoc);
+    } 
+    catch (IException &e1) {
+      try {
+        transfile = "$base/translations/pds4ExportTargetFromMapping.trn"; 
+        PvlToXmlTranslationManager targXlator(*inputLabel, transfile.expanded());
+        targXlator.Auto(*m_domDoc);
+      }
+      catch (IException &e2) {
+        IException finalError(IException::Unknown, "Unable to find a target in input cube.", _FILEINFO_);
+        finalError.append(e1);
+        finalError.append(e2);
+        throw finalError;
+      }
+    }
   }
 
 
   /**
-   * This method corrects the Image Root information in a PDS4 output label.
-   * 
-   * @note This method is not implemented currently and does nothing.
+   * This method writes the identification information to the PDS4
+   * labels. 
    */
-  void ProcessExportPds4::FixedImageRoot() {
-    //Don't know what needs to go in here yet....
-    /**
-     * ProcessExportPds has Pds version, record type, record bytes, file records, label records,
-     * and md5 checksum
-     *
-     * Where does this information need to go in a Pds4 xml label?
-     */
+  void ProcessExportPds4::identificationArea() {
+    Pvl *inputLabel = InputCubes[0]->label(); 
+    FileName transfile;
+    transfile = "$base/translations/pds4ExportIdentificationArea.trn";
+    PvlToXmlTranslationManager xlator(*inputLabel, transfile.expanded());
+    xlator.Auto(*m_domDoc);
   }
 
-
+  
   /**
-   * Create and internalize a standard image output label from the input image.
+   * This method writes the display direction information to 
+   * the PDS4 labels. 
    */
-  void ProcessExportPds4::StandardImageImage() {
+  void ProcessExportPds4::displaySettings() {
 
+    Pvl *inputLabel = InputCubes[0]->label(); 
+    FileName transfile;
+    transfile = "$base/translations/pds4ExportDisplaySettings.trn";
+    PvlToXmlTranslationManager xlator(*inputLabel, transfile.expanded());
+    xlator.Auto(*m_domDoc);
+
+    // Add header info
+    addSchema("PDS4_DISP_1700.sch", 
+              "PDS4_DISP_1700.xsd",
+              "xmlns:disp", 
+              "http://pds.nasa.gov/pds4/disp/v1"); 
+  }
+
+  
+ /**
+  * Export bandbin group to sp:Spectral Characteristics 
+  * 
+  */
+  void ProcessExportPds4::standardBandBin() {
+    // Spectra
+    // Get the input Isis cube label and find the BandBin group if it has one
     Pvl *inputLabel = InputCubes[0]->label();
+    if(inputLabel->hasObject("IsisCube") &&
+        !(inputLabel->findObject("IsisCube").hasGroup("BandBin"))) return;
+
     FileName transfile;
-    transfile = "$base/translations/pds4Export.trn";
+    transfile = "$base/translations/pds4ExportBandBin.trn";
+    PvlToXmlTranslationManager xlator(*inputLabel, transfile.expanded());
+    xlator.Auto(*m_domDoc);
+
+    // Add header info
+    addSchema("PDS4_SP_1100.sch", 
+              "PDS4_SP_1100.xsd",
+              "xmlns:sp", 
+              "http://pds.nasa.gov/pds4/sp/v1"); 
+  }
+
+
+  /**
+   * Create and internalize a standard image output label from the input image. 
+   * @todo determine whether to treat single band as 2d array
+   */
+  void ProcessExportPds4::StandardImageImage() {
+    Pvl *inputLabel = InputCubes[0]->label(); 
+    FileName transfile;
+
+    transfile = "$base/translations/pds4ExportArray3DImage.trn"; 
     PvlToXmlTranslationManager xlator(*inputLabel, transfile.expanded());
     xlator.Auto(*m_domDoc);
 
@@ -133,33 +326,104 @@ namespace Isis {
     QDomElement fileAreaObservationalElement =
                     rootElement.firstChildElement("File_Area_Observational");
 
-    if (!fileAreaObservationalElement.isNull()) {
+    // Calculate the core base/mult for the output cube
+    double base = 0.0;
+    double multiplier = 1.0;
+    double outputMin, outputMax;
+
+    double inputMin = (p_inputMinimum.size()) ? p_inputMinimum[0] : 0.0;
+    double inputMax = (p_inputMaximum.size()) ? p_inputMaximum[0] : 0.0;
+
+    for(unsigned int i = 0; i < p_inputMinimum.size(); i ++) {
+      inputMin = std::min(inputMin, p_inputMinimum[i]);
+      inputMax = std::max(inputMax, p_inputMaximum[i]);
+    }
+
+    outputMin = p_outputMinimum;
+    outputMax = p_outputMaximum;
 
-      QDomElement array2DImageElement =
-                      fileAreaObservationalElement.firstChildElement("Array_2D_Image");
+    if(p_inputMinimum.size() && ( p_pixelType == Isis::UnsignedByte ||
+                                  p_pixelType == Isis::SignedWord   ||
+                                  p_pixelType == Isis::UnsignedWord ) ) {
+      multiplier = (inputMax - inputMin) / (outputMax - outputMin);
+      base = inputMin - multiplier * outputMin;
+    }
+
+    if (!fileAreaObservationalElement.isNull()) {
+      QDomElement array3DImageElement =
+                      fileAreaObservationalElement.firstChildElement("Array_3D_Image");
+
+      if (!array3DImageElement.isNull()) {
+
+        // reorder axis elements. 
+        // Translation order:  elements, axis_name, sequence_number
+        // Correct order:      axis_name, elements, sequence_number
+        QDomElement axisArrayElement = array3DImageElement.firstChildElement("Axis_Array");
+        while( !axisArrayElement.isNull() ) {
+          QDomElement axisNameElement = axisArrayElement.firstChildElement("axis_name");
+          axisArrayElement.insertBefore(axisNameElement, 
+                                        axisArrayElement.firstChildElement("elements"));
+          axisArrayElement = axisArrayElement.nextSiblingElement("Axis_Array");
+        }
 
-      if (!array2DImageElement.isNull()) {
         QDomElement elementArrayElement = m_domDoc->createElement("Element_Array");
-        array2DImageElement.appendChild(elementArrayElement);
+        array3DImageElement.insertBefore(elementArrayElement,
+                                         array3DImageElement.firstChildElement("Axis_Array"));
 
-        //The next three values are assuming that the cube is Real
         QDomElement dataTypeElement = m_domDoc->createElement("data_type");
-        xlator.setElementValue(dataTypeElement, "IEEE754LSBSingle");
+        PvlToXmlTranslationManager::setElementValue(dataTypeElement,
+                                                    PDS4PixelType(p_pixelType, p_endianType));
         elementArrayElement.appendChild(dataTypeElement);
 
         QDomElement scalingFactorElement = m_domDoc->createElement("scaling_factor");
-        xlator.setElementValue(scalingFactorElement, "1.00");
+        PvlToXmlTranslationManager::setElementValue(scalingFactorElement,
+                                                    toString(multiplier));
         elementArrayElement.appendChild(scalingFactorElement);
 
-        QDomElement offsetElement = m_domDoc->createElement("offset");
-
-        xlator.setElementValue(offsetElement, "0.00");
+        QDomElement offsetElement = m_domDoc->createElement("value_offset");
+        PvlToXmlTranslationManager::setElementValue(offsetElement,
+                                                    toString(base));
         elementArrayElement.appendChild(offsetElement);
       }
     }
   }
 
 
+  /**
+   * Adds necessary information to the xml header for a pds4 class. 
+   * 
+   * @param sch Schematron filename without path
+   * @param xsd Schema filename without path
+   * @param xmlns The xml namespace used 
+   * @param xmlnsURI Full URL to the xml namespace URI. Also used as the location of the sch and xsd
+   */
+  void ProcessExportPds4::addSchema(QString sch, QString xsd, QString xmlns, QString xmlnsURI) {
+    // Add xml-model
+    QString xmlModel;
+    xmlModel += "href=\"";
+    xmlModel +=  xmlnsURI;
+    xmlModel +=  "/";
+    xmlModel +=  sch;
+    xmlModel += "\" schemetypens=\"http://purl.oclc.org/dsdl/schematron\"";
+    QDomProcessingInstruction header =
+        m_domDoc->createProcessingInstruction("xml-model", xmlModel);
+    m_domDoc->insertAfter(header, m_domDoc->firstChild());
+
+    // Add xmlns
+    QDomElement root = m_domDoc->documentElement();
+    root.setAttribute(xmlns, xmlnsURI);
+
+    // Add to xsi:schemaLocation
+    m_schemaLocation += " "; 
+    m_schemaLocation += xmlnsURI;
+    m_schemaLocation += " ";
+    m_schemaLocation += xmlnsURI;
+    m_schemaLocation += "/";
+    m_schemaLocation += xsd;
+    root.setAttribute("xsi:schemaLocation", m_schemaLocation);
+  }
+
+
   /**
    * Write the XML label to the supplied stream.
    *
@@ -213,19 +477,401 @@ namespace Isis {
     
     FileName outputFile(outFile);
 
-    QString path(FileName(outFile).originalPath());
-    QString name(FileName(outFile).baseName());
+    QString path(outputFile.originalPath());
+    QString name(outputFile.baseName());
     QString labelName = path + "/" + name + ".xml";
+
+    QDomElement rootElement = m_domDoc->documentElement();
+    QDomElement fileAreaObservationalElement =
+                    rootElement.firstChildElement("File_Area_Observational");
+
+    QDomElement fileElement = m_domDoc->createElement("File");
+    fileAreaObservationalElement.insertBefore(fileElement, 
+                                              fileAreaObservationalElement.firstChildElement());
+
+    QDomElement fileNameElement = m_domDoc->createElement("file_name");
+    PvlToXmlTranslationManager::setElementValue(fileNameElement, outputFile.name());
+    fileElement.appendChild(fileNameElement);
+
+//    QDomElement creationElement = m_domDoc->createElement("creation_date_time");
+//    PvlToXmlTranslationManager::setElementValue(creationElement, );
+//    fileElement.appendChild(creationElement);
+
     ofstream oLabel(labelName.toLatin1().data());
-    
     OutputLabel(oLabel);
     oLabel.close();
     
     ofstream oCube(outputFile.expanded().toLatin1().data());
-
     StartProcess(oCube);
     oCube.close();
+
     EndProcess();
   }
 
+
+  /**
+   * Create the standard keywords for the IMAGE_MAP_PROJECTION group in a PDS
+   * label
+   *
+   *
+   * @throws IException::User "Unable to export projection [" + projName + "] to PDS4 product. " + 
+                              "This projection is not supported in ISIS3."
+   */
+  void ProcessExportPds4::StandardAllMapping() {
+    // Cartography
+    // Get the input Isis cube label and find the Mapping group if it has one
+    Pvl *inputLabel = InputCubes[0]->label();
+    if(inputLabel->hasObject("IsisCube") &&
+        !(inputLabel->findObject("IsisCube").hasGroup("Mapping"))) return;
+    PvlGroup &inputMapping = inputLabel->findGroup("Mapping", Pvl::Traverse);
+
+    addSchema("PDS4_CART_1700.sch", 
+              "PDS4_CART_1700.xsd",
+              "xmlns:cart", 
+              "http://pds.nasa.gov/pds4/cart/v1"); 
+
+    // Translate the projection specific keywords for a PDS IMAGE_MAP_PROJECTION
+    Projection *proj = ProjectionFactory::Create(*inputLabel); 
+    QString projName = proj->Name();
+    try {
+      PvlToXmlTranslationManager xlatorSpecProj(*inputLabel, 
+                                                "$base/translations/pds4Export" + projName + ".trn");
+      xlatorSpecProj.Auto(*m_domDoc);
+    } 
+    catch (IException &e) {
+      QString msg = "Unable to export projection [" + projName + "] to PDS4 product. " + 
+                     "This projection is not supported in ISIS3.";
+      throw IException(e, IException::User, msg, _FILEINFO_);
+    }
+
+    // convert units.
+    QStringList xmlPath;
+    xmlPath << "Product_Observational" 
+            << "Observation_Area" 
+            << "Discipline_Area" 
+            << "cart:Cartography" 
+            << "cart:Map_Projection" 
+            << "cart:Spatial_Reference_Information" 
+            << "cart:Horizontal_Coordinate_System_Definition"
+            << "cart:Geodetic_Model";
+
+    QDomElement baseElement = m_domDoc->documentElement();
+    QDomElement geodeticModelElement = getElement(xmlPath, baseElement);
+    QDomElement semiMajorRadElement = geodeticModelElement.firstChildElement("cart:semi_major_radius");
+    if (!semiMajorRadElement.isNull()) {
+
+      QString units = semiMajorRadElement.attribute("unit");
+      if( units.compare("km", Qt::CaseInsensitive) != 0 && units.compare("kilometers", Qt::CaseInsensitive) != 0) { 
+
+        //if no units, assume in meters
+        double dValue = toDouble(semiMajorRadElement.text());
+        dValue /= 1000.0;
+        PvlToXmlTranslationManager::resetElementValue(semiMajorRadElement, toString(dValue), "km");
+      }
+    }
+
+    QDomElement semiMinorRadElement = geodeticModelElement.firstChildElement("cart:semi_minor_radius");
+    if (!semiMinorRadElement.isNull()) {
+
+      QString units = semiMinorRadElement.attribute("unit");
+      if( units.compare("km", Qt::CaseInsensitive) != 0 && units.compare("kilometers", Qt::CaseInsensitive) != 0) { 
+        // If no units, assume in meters
+        double dValue = toDouble(semiMinorRadElement.text());
+        dValue /= 1000.0;
+        PvlToXmlTranslationManager::resetElementValue(semiMinorRadElement, toString(dValue), "km");
+      }
+    }
+
+    QDomElement polarRadElement = geodeticModelElement.firstChildElement("cart:polar_radius");
+    if (!polarRadElement.isNull()) {
+      QString units = polarRadElement.attribute("unit");
+      if( units.compare("km", Qt::CaseInsensitive) != 0 && units.compare("kilometers", Qt::CaseInsensitive) != 0) { 
+        // If no units, assume in meters
+        double dValue = toDouble(polarRadElement.text());
+        dValue /= 1000.0;
+        PvlToXmlTranslationManager::resetElementValue(polarRadElement, toString(dValue), "km");
+      }
+    }
+
+    // Add the EASTERNMOST AND WESTERNMOST LONGITUDE keywords
+    PvlKeyword &isisLonDir = inputMapping.findKeyword("LongitudeDirection");
+    QString lonDir = isisLonDir[0];
+    lonDir = lonDir.toUpper();
+    if (inputMapping.hasKeyword("MaximumLongitude") && inputMapping.hasKeyword("MinimumLongitude")) {
+      double maxLon = inputMapping.findKeyword("MaximumLongitude");
+      double minLon = inputMapping.findKeyword("MinimumLongitude");
+      xmlPath.clear();
+      xmlPath << "Product_Observational" 
+              << "Observation_Area" 
+              << "Discipline_Area" 
+              << "cart:Cartography" 
+              << "cart:Map_Projection" 
+              << "cart:Spatial_Domain"
+              << "cart:Bounding_Coordinates";
+      QDomElement boundingCoordElement = getElement(xmlPath, baseElement);
+      QDomElement eastElement = boundingCoordElement.firstChildElement("cart:east_bounding_coordinate");
+      QDomElement westElement = boundingCoordElement.firstChildElement("cart:west_bounding_coordinate");
+
+      // translation files currently handles Positive West case where east = min, west = max
+      // so if positive east, swap min/max
+      if(QString::compare(lonDir, "Positive East", Qt::CaseInsensitive) == 0) {
+        // west min, east max
+        PvlToXmlTranslationManager::resetElementValue(eastElement, toString(maxLon), "deg");
+        PvlToXmlTranslationManager::resetElementValue(westElement, toString(minLon), "deg");
+      }
+    }
+
+
+  }
+
+
+ /**
+  * Convenience method to get an element given a path and its parent. 
+  * 
+  * @param xmlPath The XML path to the element to retrieve, 
+  *                starting at the parent element. Note: The
+  *                first element of this path must be the same as
+  *                the parent element passed in, unless the
+  *                parent element is NULL. If the parent element
+  *                passed in is NULL, then we assume that the
+  *                parent is the root and a full path has been
+  *                given.
+  * @param parent The parent QDomElement of the given path. Defaults to
+  *               the root element of the document.
+  * 
+  * @return QDomElement 
+  */
+  QDomElement ProcessExportPds4::getElement(QStringList xmlPath, QDomElement parent) {
+    QDomElement baseElement = parent;
+    if (baseElement.isNull()) {
+      baseElement = m_domDoc->documentElement();
+    }
+    if (baseElement.isNull()) { 
+      QString msg = "Unable to get element from empty XML document."; 
+      throw IException(IException::Programmer, msg, _FILEINFO_);
+    }
+    QString parentName = xmlPath[0];
+    if (parentName != baseElement.tagName()) {
+      QString msg = "The tag name of the parent element passed in "
+                    "must be the first value in the given XML path."; 
+      throw IException(IException::Programmer, msg, _FILEINFO_);
+    }
+    for (int i = 1; i < xmlPath.size(); i++) {
+      QString elementName = xmlPath[i];
+      QDomElement nextElement = baseElement.firstChildElement(elementName);
+      baseElement = nextElement;
+    }
+    return baseElement;
+  }
+
+
+  /**
+   * Helper function for converting ISIS pixel type and byte order to a PDS4 data_type value.
+   * 
+   * @param pixelType The ISIS pixel type of the data
+   * @param endianType The byte order of the data
+   * 
+   * @return @b QString The PDS4 data_type value for the given pixel type and byte order.
+   */
+  QString ProcessExportPds4::PDS4PixelType(PixelType pixelType, ByteOrder endianType) {
+    QString pds4Type("UNK");
+    if(p_pixelType == Isis::UnsignedByte) {
+      pds4Type = "UnsignedByte";
+    }
+    else if((p_pixelType == Isis::UnsignedWord) && (p_endianType == Isis::Msb)) {
+      pds4Type = "UnsignedMSB2";
+    }
+    else if((p_pixelType == Isis::UnsignedWord) && (p_endianType == Isis::Lsb)) {
+      pds4Type = "UnsignedLSB2";
+    }
+    else if((p_pixelType == Isis::SignedWord) && (p_endianType == Isis::Msb)) {
+      pds4Type = "SignedMSB2";
+    }
+    else if((p_pixelType == Isis::SignedWord) && (p_endianType == Isis::Lsb)) {
+      pds4Type = "SignedLSB2";
+    }
+    else if((p_pixelType == Isis::Real) && (p_endianType == Isis::Msb)) {
+      pds4Type = "IEEE754MSBSingle";
+    }
+    else if((p_pixelType == Isis::Real) && (p_endianType == Isis::Lsb)) {
+      pds4Type = "IEEE754LSBSingle";
+    }
+    else {
+      QString msg = "Unsupported PDS pixel type or sample size";
+      throw IException(IException::User, msg, _FILEINFO_);
+    }
+    return pds4Type;
+  }
+
+
+  /**
+   * Add a modification history instance by adding a Modification_Detail entry
+   * to the Modification_History element. If there are no existing entries,
+   * this will create a Modification_History element also.
+   * 
+   * @param description The description of the modification.
+   * @param date The date of the modification. Expected format is "YYYY-MM-DD". Defaults to "tbd".
+   * @param version The product version. Expected format is "m.n". Defaults to "tbd".
+   */
+  void ProcessExportPds4::addHistory(QString description, QString date, QString version) {
+    // Check that at least the "Identification_Area" element exists.
+    QDomElement identificationElement;
+    QStringList identificationPath;
+    identificationPath.append("Product_Observational");
+    identificationPath.append("Identification_Area");
+    try {
+      identificationElement = getElement(identificationPath);
+      if( identificationElement.isNull() ) {
+        throw IException(IException::Unknown, "", _FILEINFO_);
+      }
+    }
+    catch(IException &e) {
+      QString msg = "Could not find Identification_Area element "
+                    "to add modification history under.";
+      throw IException(IException::Programmer, msg, _FILEINFO_);
+    }
+
+    // Check if the "Modification_History" element exists yet.
+    // If not, create one.
+    QDomElement historyElement = identificationElement.firstChildElement("Modification_History");
+    if ( historyElement.isNull() ) {
+      historyElement = m_domDoc->createElement("Modification_History");
+      identificationElement.insertAfter( historyElement,
+                                         identificationElement.lastChildElement() );
+    }
+
+    // Create the "Modification_Detail" element and add it to the end of the
+    // "Modification_History" element.
+    QDomElement detailElement = m_domDoc->createElement("Modification_Detail");
+    detailElement.setAttribute("description", description);
+    detailElement.setAttribute("modification_date", date);
+    detailElement.setAttribute("version_id", version);
+
+    historyElement.insertAfter( detailElement,
+                                historyElement.lastChildElement() );
+  }
+
+
+  /**
+   * This function will go through an XML document and attempt to convert all
+   * "units" attributes to the appropriate PDS4 units format.
+   * 
+   * This method uses a pvl config file to determine what the proper PDS4
+   * format is and what potential input formats are. The file is converted to
+   * a map which is then used to convert all of the input units. See
+   * $base/translations/pds4ExportUnits.pvl for more information on this file.
+   * 
+   * This method is automatically called in StandardPds4Label(), but may need
+   * to be called again if the label is changed afterwards.
+   * 
+   * @param[in,out] label A reference to the label that the units will be
+   *                      translated in.
+   * @param transMapFile The path to the config file that will be used to
+   *                     determine unit translations.
+   */
+  void ProcessExportPds4::translateUnits(QDomDocument &label, QString transMapFile) {
+    Pvl configPvl;
+    try {
+      configPvl.read(transMapFile);
+    }
+    catch(IException &e) {
+      QString msg = "Failed to read unit translation config file [" + transMapFile + "].";
+      throw IException(e, IException::Io, msg, _FILEINFO_);
+    }
+
+    QMap<QString, QString> transMap;
+    try {
+      transMap = createUnitMap(configPvl);
+    }
+    catch(IException &e) {
+      QString msg = "Failed to load unit translation config file [" + transMapFile + "].";
+      throw IException(e, IException::Unknown, msg, _FILEINFO_);
+    }
+
+    // Now that the map is filled, recursively search through the XML document
+    // for units and translate them.
+    try {
+      translateChildUnits( label.documentElement(), transMap );
+    }
+    catch(IException &e) {
+      QString msg = "Failed to translate units with config file [" + transMapFile + "].";
+      throw IException(e, IException::Unknown, msg, _FILEINFO_);
+    }
+  }
+
+
+  /**
+   * Helper function for creating the unit translation map from a PVL object.
+   * 
+   * @param configPvl The config PVL that defines the map.
+   * 
+   * @return @b QMap<QString,QString> The map that converts lower case ISIS
+   *                                  units to PDS4 units.
+   * 
+   * @see ProcessExportPds4::translateUnits
+   */
+  QMap<QString, QString> ProcessExportPds4::createUnitMap(Pvl configPvl) {
+    QMap<QString, QString> transMap;
+    for (int i = 0; i < configPvl.objects(); i++) {
+      PvlObject unitObject = configPvl.object(i);
+      for (int j = 0; j < unitObject.groups(); j++) {
+        PvlGroup unitGroup = unitObject.group(j);
+        if (!unitGroup.hasKeyword("PDS4_Unit")) {
+          QString msg = "No PDS4 standard specified for for [" + unitGroup.name() + "]";
+          throw IException(IException::Programmer, msg, _FILEINFO_);
+        }
+        PvlKeyword pds4Key = unitGroup["PDS4_Unit"];
+        // Add the PDS4 format for when the format is already correct.
+        // This also handles case issues such as KM instead of km.
+        transMap.insert(pds4Key[0].toLower(), pds4Key[0]);
+
+        // If there are ISIS versions with different formats then add those.
+        if (unitGroup.hasKeyword("ISIS_Units")) {
+          PvlKeyword isisKey = unitGroup["ISIS_Units"];
+          for (int k = 0; k < isisKey.size() ; k++) {
+            transMap.insert(isisKey[k].toLower(), pds4Key[0]);
+          }
+        }
+      }
+    }
+
+    return transMap;
+  }
+
+
+  /**
+   * Recursive method that will translate the "unit" attribute of any child
+   * elements of a given element. Returns void if the given element has no
+   * children.
+   * 
+   * @param parent The element whose children's units will be translated. This
+   *               method will be recursively called on all child elements.
+   * @param transMap The translation map with lowercase ISIS units as keys and
+   *                 PDS4 units as values.
+   * 
+   * @see ProcessExportPds4::translateUnits
+   */
+  void ProcessExportPds4::translateChildUnits(QDomElement parent, QMap<QString, QString> transMap) {
+    QDomElement childElement = parent.firstChildElement();
+
+    while( !childElement.isNull() ) {
+      if ( childElement.hasAttribute("unit") ) {
+        QString originalUnit = childElement.attribute("unit");
+        if ( transMap.contains( originalUnit.toLower() ) ) {
+          childElement.setAttribute("unit", transMap.value( originalUnit.toLower() ) );
+        }
+        else {
+          QString msg = "Could not translate unit [" + originalUnit + "] to PDS4 format.";
+          throw IException(IException::Unknown, msg, _FILEINFO_);
+        }
+      }
+      translateChildUnits(childElement, transMap);
+      childElement = childElement.nextSiblingElement();
+    }
+
+    // Base case: If there are no more children end return
+    return;
+  }
+
+
 } // End of Isis namespace
diff --git a/isis/src/base/objs/ProcessExportPds4/ProcessExportPds4.h b/isis/src/base/objs/ProcessExportPds4/ProcessExportPds4.h
index 4bb575abfb8ea2bd541d8a47e008a47d240b60ba..35da6988122c573a4196701394cab70a3de4a15a 100644
--- a/isis/src/base/objs/ProcessExportPds4/ProcessExportPds4.h
+++ b/isis/src/base/objs/ProcessExportPds4/ProcessExportPds4.h
@@ -21,7 +21,7 @@
 
 #include "ProcessExport.h"
 #include <vector>
-
+#include <QString>
 #include <QDomDocument>
 
 namespace Isis {
@@ -48,6 +48,26 @@ namespace Isis {
    *   @history 2017-06-08 Marjorie Hahn - Added WritePds4 method to write out the 
    *                           .img and .xml Pds4 data.
    *   @history 2017-09-26 Jesse Mapel - Improved test coverage and documentation. Fixes #5167.
+   *   @history 2017-10-18 Jeannie Backer & Makayla Shepherd - Added convenience method getElement
+   *                           and StandardAllMapping method to translate mapping information.
+   *                           See #5202.
+   *   @history 2017-10-31 Jeannie Backer - Added standardInstrument() and displaySettings()
+   *                           translations.
+   *   @history 2017-11-06 Kristin Berry - Added standardBandBin() 
+   *   @history 2017-11-07 Jeannie Backer - Added code to search for target in the Mapping group
+   *                           if no instrument group is found. Added Identification Area
+   *                           tranlations. Added sanity checks to getElement().
+   *   @history 2017-11-07 Jeannie Backer - Added code to write data file info into label file.
+   *                           Added code to translate time format and add nil tag if empty.
+   *   @history 2017-11-15 Jesse Mapel - Added translateUnits method to convert units to PDS4
+   *                           standard format.
+   *   @history 2017-11-16 Kristin Berry - Updated WritePds4 to put the File information first
+   *                           in the output File_Area_Observational.
+   *   @history 2017-11-17 Jesse Mapel - Removed empty FixedImageRoot method.
+   *   @history 2017-11-20 Jeannie Backer - Updated StandardImageImage() to re-order the
+   *                           Array_3D_Image values properly.
+   *   @history 2017-11-21 Kristin Berry - Updated the constructor to add the xml version and 
+   *                           encoding to the beginning of the XML file. 
    */
 
   class ProcessExportPds4: public Isis::ProcessExport {
@@ -57,24 +77,38 @@ namespace Isis {
       ~ProcessExportPds4();
 
       QDomDocument &StandardPds4Label();
+      void StandardAllMapping();
 
       void CreateImageLabel();
-      void FixedImageRoot();
       void StandardImageImage();
 
       void OutputLabel(std::ofstream &os);
 
-      // include this using declaration to indicate that ProcessExportPds4
+      // Include this using declaration to indicate that ProcessExportPds4
       // objects that call a StartProcess() method that has not been overridden
       // here should use the corresponding base class definitions
       using ProcessExport::StartProcess;
       void StartProcess(std::ofstream &fout);
       QDomDocument &GetLabel();
       void WritePds4(QString outFile);
+      QDomElement getElement(QStringList xmlPath, QDomElement parent=QDomElement());
+      void addHistory(QString description, QString date = "tbd", QString version = "1.0");
+
+      static void translateUnits(QDomDocument &label,
+                                 QString transMapFile = "$base/translations/pds4ExportUnits.pvl");
 
     protected:
+      void addSchema(QString sch, QString xsd, QString xmlns, QString xmlnsURI) ;
+      void identificationArea();
+      void standardInstrument();
+      void standardBandBin(); 
+      void displaySettings();
+      QString PDS4PixelType(PixelType pixelType, ByteOrder endianType);
+      static QMap<QString, QString> createUnitMap(Pvl configPvl);
+      static void translateChildUnits(QDomElement parent, QMap<QString, QString> transMap);
 
       QDomDocument *m_domDoc;               //!< XML label
+      QString m_schemaLocation;             //!< QString with all schema locations required
 
   };
 }
diff --git a/isis/src/base/objs/ProcessExportPds4/ProcessExportPds4.truth b/isis/src/base/objs/ProcessExportPds4/ProcessExportPds4.truth
index c91a2dd59f94cd6054b97b72caae2238fb6877fc..fe7f800b8da21a2160d44cccc16ef5c1cf7ab74c 100644
--- a/isis/src/base/objs/ProcessExportPds4/ProcessExportPds4.truth
+++ b/isis/src/base/objs/ProcessExportPds4/ProcessExportPds4.truth
@@ -1,50 +1,350 @@
+Testing ProcessExportPds4
+
+Testing default object
+<?xml version="1.0" encoding="utf-8"?>
 <?xml-model href="http://pds.nasa.gov/pds4/pds/v1/PDS4_PDS_1800.sch" schemetypens="http://purl.oclc.org/dsdl/schematron"?>
-<Product_Observational>
- <File_Area_Observational>
-  <Array_2D_Image>
+<Product_Observational/>
+
+Testing defaulte CaSSIS export
+<?xml version="1.0" encoding="utf-8"?>
+<?xml-model href="http://pds.nasa.gov/pds4/disp/v1/PDS4_DISP_1700.sch" schemetypens="http://purl.oclc.org/dsdl/schematron"?>
+<?xml-model href="http://pds.nasa.gov/pds4/pds/v1/PDS4_PDS_1800.sch" schemetypens="http://purl.oclc.org/dsdl/schematron"?>
+<Product_Observational>0</offset>
+   <axes>3</axes>
+   <axis_index_order>Last Index Fastest</axis_index_order>
+   <Element_Array>
+    <data_type>IEEE754LSBSingle</data_type>
+    <scaling_factor>1.0</scaling_factor>
+    <value_offset>0.0</value_offset>
+   </Element_Array>
    <Axis_Array>
-    <axis_name>Sample</axis_name>
+    <axis_name>Band</axis_name>
+    <elements>1</elements>
     <sequence_number>1</sequence_number>
-    <elements>2048</elements>
    </Axis_Array>
    <Axis_Array>
-    <axis_name>Lines</axis_name>
-    <sequence_number>2</sequence_number>
+    <axis_name>Line</axis_name>
     <elements>254</elements>
+    <sequence_number>2</sequence_number>
    </Axis_Array>
+   <Axis_Array>
+    <axis_name>Sample</axis_name>
+    <elements>2048</elements>
+    <sequence_number>3</sequence_number>
+   </Axis_Array>
+  </Array_3D_Image>
+ </File_Area_Observational>
+</Product_Observational>
+unittest: Exporting
+0% Processed
+10% Processed
+20% Processed
+30% Processed
+40% Processed
+50% Processed
+60% Processed
+70% Processed
+80% Processed
+90% Processed
+100% Processed
+<?xml version="1.0" encoding="utf-8"?>
+<?xml-model href="http://pds.nasa.gov/pds4/disp/v1/PDS4_DISP_1700.sch" schemetypens="http://purl.oclc.org/dsdl/schematron"?>
+<?xml-model href="http://pds.nasa.gov/pds4/pds/v1/PDS4_PDS_1800.sch" schemetypens="http://purl.oclc.org/dsdl/schematron"?>
+<Product_Observational>0</offset>
+   <axes>3</axes>
+   <axis_index_order>Last Index Fastest</axis_index_order>
    <Element_Array>
     <data_type>IEEE754LSBSingle</data_type>
-    <scaling_factor>1.00</scaling_factor>
-    <offset>0.00</offset>
+    <scaling_factor>1.0</scaling_factor>
+    <value_offset>0.0</value_offset>
    </Element_Array>
-  </Array_2D_Image>
+   <Axis_Array>
+    <axis_name>Band</axis_name>
+    <elements>1</elements>
+    <sequence_number>1</sequence_number>
+   </Axis_Array>
+   <Axis_Array>
+    <axis_name>Line</axis_name>
+    <elements>254</elements>
+    <sequence_number>2</sequence_number>
+   </Axis_Array>
+   <Axis_Array>
+    <axis_name>Sample</axis_name>
+    <elements>2048</elements>
+    <sequence_number>3</sequence_number>
+   </Axis_Array>
+  </Array_3D_Image>
  </File_Area_Observational>
 </Product_Observational>
 unittest: Exporting
-0% Processed
10% Processed
20% Processed
30% Processed
40% Processed
50% Processed
60% Processed
70% Processed
80% Processed
90% Processed
100% Processed
+0% Processed
+10% Processed
+20% Processed
+30% Processed
+40% Processed
+50% Processed
+60% Processed
+70% Processed
+80% Processed
+90% Processed
+100% Processed
+
+Testing export pixel types
+<?xml version="1.0" encoding="utf-8"?>
+<?xml-model href="http://pds.nasa.gov/pds4/disp/v1/PDS4_DISP_1700.sch" schemetypens="http://purl.oclc.org/dsdl/schematron"?>
+<?xml-model href="http://pds.nasa.gov/pds4/pds/v1/PDS4_PDS_1800.sch" schemetypens="http://purl.oclc.org/dsdl/schematron"?>
+<Product_Observational>0</offset>
+   <axes>3</axes>
+   <axis_index_order>Last Index Fastest</axis_index_order>
+   <Element_Array>
+    <data_type>SignedMSB2</data_type>
+    <scaling_factor>1.0</scaling_factor>
+    <value_offset>0.0</value_offset>
+   </Element_Array>
+   <Axis_Array>
+    <axis_name>Band</axis_name>
+    <elements>1</elements>
+    <sequence_number>1</sequence_number>
+   </Axis_Array>
+   <Axis_Array>
+    <axis_name>Line</axis_name>
+    <elements>254</elements>
+    <sequence_number>2</sequence_number>
+   </Axis_Array>
+   <Axis_Array>
+    <axis_name>Sample</axis_name>
+    <elements>2048</elements>
+    <sequence_number>3</sequence_number>
+   </Axis_Array>
+  </Array_3D_Image>
+ </File_Area_Observational>
+</Product_Observational>
+<?xml version="1.0" encoding="utf-8"?>
+<?xml-model href="http://pds.nasa.gov/pds4/disp/v1/PDS4_DISP_1700.sch" schemetypens="http://purl.oclc.org/dsdl/schematron"?>
+<?xml-model href="http://pds.nasa.gov/pds4/disp/v1/PDS4_DISP_1700.sch" schemetypens="http://purl.oclc.org/dsdl/schematron"?>
+<?xml-model href="http://pds.nasa.gov/pds4/pds/v1/PDS4_PDS_1800.sch" schemetypens="http://purl.oclc.org/dsdl/schematron"?>
+<Product_Observational>0</offset>
+   <axes>3</axes>
+   <axis_index_order>Last Index Fastest</axis_index_order>
+   <Axis_Array>
+    <axis_name>Band</axis_name>
+    <elements>1</elements>
+    <sequence_number>1</sequence_number>
+   </Axis_Array>
+   <Axis_Array>
+    <axis_name>Line</axis_name>
+    <elements>254</elements>
+    <sequence_number>2</sequence_number>
+   </Axis_Array>
+   <Axis_Array>
+    <axis_name>Sample</axis_name>
+    <elements>2048</elements>
+    <sequence_number>3</sequence_number>
+   </Axis_Array>
+  </Array_3D_Image>
+ </File_Area_Observational>
+</Product_Observational>
+<?xml version="1.0" encoding="utf-8"?>
+<?xml-model href="http://pds.nasa.gov/pds4/disp/v1/PDS4_DISP_1700.sch" schemetypens="http://purl.oclc.org/dsdl/schematron"?>
+<?xml-model href="http://pds.nasa.gov/pds4/disp/v1/PDS4_DISP_1700.sch" schemetypens="http://purl.oclc.org/dsdl/schematron"?>
+<?xml-model href="http://pds.nasa.gov/pds4/disp/v1/PDS4_DISP_1700.sch" schemetypens="http://purl.oclc.org/dsdl/schematron"?>
+<?xml-model href="http://pds.nasa.gov/pds4/pds/v1/PDS4_PDS_1800.sch" schemetypens="http://purl.oclc.org/dsdl/schematron"?>
+<Product_Observational>0</offset>
+   <axes>3</axes>
+   <axis_index_order>Last Index Fastest</axis_index_order>
+   <Axis_Array>
+    <axis_name>Band</axis_name>
+    <elements>1</elements>
+    <sequence_number>1</sequence_number>
+   </Axis_Array>
+   <Axis_Array>
+    <axis_name>Line</axis_name>
+    <elements>254</elements>
+    <sequence_number>2</sequence_number>
+   </Axis_Array>
+   <Axis_Array>
+    <axis_name>Sample</axis_name>
+    <elements>2048</elements>
+    <sequence_number>3</sequence_number>
+   </Axis_Array>
+  </Array_3D_Image>
+ </File_Area_Observational>
+</Product_Observational>
+<?xml version="1.0" encoding="utf-8"?>
+<?xml-model href="http://pds.nasa.gov/pds4/disp/v1/PDS4_DISP_1700.sch" schemetypens="http://purl.oclc.org/dsdl/schematron"?>
+<?xml-model href="http://pds.nasa.gov/pds4/disp/v1/PDS4_DISP_1700.sch" schemetypens="http://purl.oclc.org/dsdl/schematron"?>
+<?xml-model href="http://pds.nasa.gov/pds4/disp/v1/PDS4_DISP_1700.sch" schemetypens="http://purl.oclc.org/dsdl/schematron"?>
+<?xml-model href="http://pds.nasa.gov/pds4/disp/v1/PDS4_DISP_1700.sch" schemetypens="http://purl.oclc.org/dsdl/schematron"?>
 <?xml-model href="http://pds.nasa.gov/pds4/pds/v1/PDS4_PDS_1800.sch" schemetypens="http://purl.oclc.org/dsdl/schematron"?>
-<Product_Observational>
- <File_Area_Observational>
-  <Array_2D_Image>
+<Product_Observational>0</offset>
+   <axes>3</axes>
+   <axis_index_order>Last Index Fastest</axis_index_order>
+   <Axis_Array>
+    <axis_name>Band</axis_name>
+    <elements>1</elements>
+    <sequence_number>1</sequence_number>
+   </Axis_Array>
+   <Axis_Array>
+    <axis_name>Line</axis_name>
+    <elements>254</elements>
+    <sequence_number>2</sequence_number>
+   </Axis_Array>
    <Axis_Array>
     <axis_name>Sample</axis_name>
+    <elements>2048</elements>
+    <sequence_number>3</sequence_number>
+   </Axis_Array>
+  </Array_3D_Image>
+ </File_Area_Observational>
+</Product_Observational>
+<?xml version="1.0" encoding="utf-8"?>
+<?xml-model href="http://pds.nasa.gov/pds4/disp/v1/PDS4_DISP_1700.sch" schemetypens="http://purl.oclc.org/dsdl/schematron"?>
+<?xml-model href="http://pds.nasa.gov/pds4/disp/v1/PDS4_DISP_1700.sch" schemetypens="http://purl.oclc.org/dsdl/schematron"?>
+<?xml-model href="http://pds.nasa.gov/pds4/disp/v1/PDS4_DISP_1700.sch" schemetypens="http://purl.oclc.org/dsdl/schematron"?>
+<?xml-model href="http://pds.nasa.gov/pds4/disp/v1/PDS4_DISP_1700.sch" schemetypens="http://purl.oclc.org/dsdl/schematron"?>
+<?xml-model href="http://pds.nasa.gov/pds4/disp/v1/PDS4_DISP_1700.sch" schemetypens="http://purl.oclc.org/dsdl/schematron"?>
+<?xml-model href="http://pds.nasa.gov/pds4/pds/v1/PDS4_PDS_1800.sch" schemetypens="http://purl.oclc.org/dsdl/schematron"?>
+<Product_Observational>0</offset>
+   <axes>3</axes>
+   <axis_index_order>Last Index Fastest</axis_index_order>
+   <Axis_Array>
+    <axis_name>Band</axis_name>
+    <elements>1</elements>
     <sequence_number>1</sequence_number>
+   </Axis_Array>
+   <Axis_Array>
+    <axis_name>Line</axis_name>
+    <elements>254</elements>
+    <sequence_number>2</sequence_number>
+   </Axis_Array>
+   <Axis_Array>
+    <axis_name>Sample</axis_name>
     <elements>2048</elements>
+    <sequence_number>3</sequence_number>
+   </Axis_Array>
+  </Array_3D_Image>
+ </File_Area_Observational>
+</Product_Observational>
+<?xml version="1.0" encoding="utf-8"?>
+<?xml-model href="http://pds.nasa.gov/pds4/disp/v1/PDS4_DISP_1700.sch" schemetypens="http://purl.oclc.org/dsdl/schematron"?>
+<?xml-model href="http://pds.nasa.gov/pds4/disp/v1/PDS4_DISP_1700.sch" schemetypens="http://purl.oclc.org/dsdl/schematron"?>
+<?xml-model href="http://pds.nasa.gov/pds4/disp/v1/PDS4_DISP_1700.sch" schemetypens="http://purl.oclc.org/dsdl/schematron"?>
+<?xml-model href="http://pds.nasa.gov/pds4/disp/v1/PDS4_DISP_1700.sch" schemetypens="http://purl.oclc.org/dsdl/schematron"?>
+<?xml-model href="http://pds.nasa.gov/pds4/disp/v1/PDS4_DISP_1700.sch" schemetypens="http://purl.oclc.org/dsdl/schematron"?>
+<?xml-model href="http://pds.nasa.gov/pds4/disp/v1/PDS4_DISP_1700.sch" schemetypens="http://purl.oclc.org/dsdl/schematron"?>
+<?xml-model href="http://pds.nasa.gov/pds4/pds/v1/PDS4_PDS_1800.sch" schemetypens="http://purl.oclc.org/dsdl/schematron"?>
+<Product_Observational>0</offset>
+   <axes>3</axes>
+   <axis_index_order>Last Index Fastest</axis_index_order>
+   <Axis_Array>
+    <axis_name>Band</axis_name>
+    <elements>1</elements>
+    <sequence_number>1</sequence_number>
    </Axis_Array>
    <Axis_Array>
-    <axis_name>Lines</axis_name>
+    <axis_name>Line</axis_name>
+    <elements>254</elements>
     <sequence_number>2</sequence_number>
+   </Axis_Array>
+   <Axis_Array>
+    <axis_name>Sample</axis_name>
+    <elements>2048</elements>
+    <sequence_number>3</sequence_number>
+   </Axis_Array>
+  </Array_3D_Image>
+ </File_Area_Observational>
+</Product_Observational>
+
+Testing missing start and end times
+unittest: Exporting
+0% Processed
+10% Processed
+20% Processed
+30% Processed
+40% Processed
+50% Processed
+60% Processed
+70% Processed
+80% Processed
+90% Processed
+100% Processed
+<?xml version="1.0" encoding="utf-8"?>
+<?xml-model href="http://pds.nasa.gov/pds4/disp/v1/PDS4_DISP_1700.sch" schemetypens="http://purl.oclc.org/dsdl/schematron"?>
+<?xml-model href="http://pds.nasa.gov/pds4/pds/v1/PDS4_PDS_1800.sch" schemetypens="http://purl.oclc.org/dsdl/schematron"?>
+<Product_Observational>0</offset>
+   <axes>3</axes>
+   <axis_index_order>Last Index Fastest</axis_index_order>
+   <Element_Array>
+    <data_type>IEEE754LSBSingle</data_type>
+    <scaling_factor>1.0</scaling_factor>
+    <value_offset>0.0</value_offset>
+   </Element_Array>
+   <Axis_Array>
+    <axis_name>Band</axis_name>
+    <elements>1</elements>
+    <sequence_number>1</sequence_number>
+   </Axis_Array>
+   <Axis_Array>
+    <axis_name>Line</axis_name>
     <elements>254</elements>
+    <sequence_number>2</sequence_number>
    </Axis_Array>
+   <Axis_Array>
+    <axis_name>Sample</axis_name>
+    <elements>2048</elements>
+    <sequence_number>3</sequence_number>
+   </Axis_Array>
+  </Array_3D_Image>
+ </File_Area_Observational>
+</Product_Observational>
+
+Testing exporting a map projected product
+
+<?xml version="1.0" encoding="utf-8"?>
+<?xml-model href="http://pds.nasa.gov/pds4/cart/v1/PDS4_CART_1700.sch" schemetypens="http://purl.oclc.org/dsdl/schematron"?>
+<?xml-model href="http://pds.nasa.gov/pds4/disp/v1/PDS4_DISP_1700.sch" schemetypens="http://purl.oclc.org/dsdl/schematron"?>
+<?xml-model href="http://pds.nasa.gov/pds4/pds/v1/PDS4_PDS_1800.sch" schemetypens="http://purl.oclc.org/dsdl/schematron"?>
+<Product_Observational>0</offset>
+   <axes>3</axes>
+   <axis_index_order>Last Index Fastest</axis_index_order>
    <Element_Array>
     <data_type>IEEE754LSBSingle</data_type>
-    <scaling_factor>1.00</scaling_factor>
-    <offset>0.00</offset>
+    <scaling_factor>1.0</scaling_factor>
+    <value_offset>0.0</value_offset>
    </Element_Array>
-  </Array_2D_Image>
+   <Axis_Array>
+    <axis_name>Band</axis_name>
+    <elements>1</elements>
+    <sequence_number>1</sequence_number>
+   </Axis_Array>
+   <Axis_Array>
+    <axis_name>Line</axis_name>
+    <elements>2371</elements>
+    <sequence_number>2</sequence_number>
+   </Axis_Array>
+   <Axis_Array>
+    <axis_name>Sample</axis_name>
+    <elements>2371</elements>
+    <sequence_number>3</sequence_number>
+   </Axis_Array>
+  </Array_3D_Image>
  </File_Area_Observational>
 </Product_Observational>
-unittest: Exporting
-0% Processed
10% Processed
20% Processed
30% Processed
40% Processed
50% Processed
60% Processed
70% Processed
80% Processed
90% Processed
100% Processed
+
+Testing errors
+
 Test creating a standard Pds4Label with no input
 **PROGRAMMER ERROR** Must set an input cube before creating a PDS4 label.
+Test translating units with a non-existant config
+**I/O ERROR** Failed to read unit translation config file [not a file].
+**I/O ERROR** Unable to open [not a file].
+Test translating units with a bad config
+**ERROR** Failed to load unit translation config file [$tgo/testData/CAS-MCO-2016-11-26T22.32.39.582-BLU-03025-00.cub].
+**PROGRAMMER ERROR** No PDS4 standard specified for for [Instrument].
+Test adding a history to an empty label
+**PROGRAMMER ERROR** Could not find Identification_Area element to add modification history under.
+Test a missing target
+**PROGRAMMER ERROR** Unable to translate and export instrument information.
+**ERROR** Unable to find a target in input cube.
+**PROGRAMMER ERROR** No value or default value to translate for translation group [TargetName] in file [/usgs/cpkgs/isis3/data/base/translations/pds4ExportTargetFromMapping.trn].
+**PROGRAMMER ERROR** No value or default value to translate for translation group [TargetName] in file [/usgs/cpkgs/isis3/data/base/translations/pds4ExportTargetFromInstrument.trn].
diff --git a/isis/src/base/objs/ProcessExportPds4/unitTest.cpp b/isis/src/base/objs/ProcessExportPds4/unitTest.cpp
index 043a0086e20e6a12b659db9052d77d6f05fe3aa3..60531804475ee83937db5da46a20c0b5746fca32 100644
--- a/isis/src/base/objs/ProcessExportPds4/unitTest.cpp
+++ b/isis/src/base/objs/ProcessExportPds4/unitTest.cpp
@@ -17,6 +17,18 @@ void IsisMain() {
   Preference::Preferences(true);
   
   try {
+    std::cout << "Testing ProcessExportPds4" << std::endl << std::endl;
+
+    std::cout << "Testing default object" << std::endl;
+
+    Isis::ProcessExportPds4 defaultProcess;
+    QString defaultLabel = defaultProcess.GetLabel().toString();
+    defaultLabel.remove(QRegExp(" xmlns.*=\".*\""));
+    defaultLabel.remove(QRegExp(" xsi.*=\".*\""));
+    std::cout << defaultLabel;
+
+    std::cout << std::endl << "Testing defaulte CaSSIS export" << std::endl;
+
     Isis::ProcessExportPds4 p;
     
     QString cubeName = "$tgo/testData/CAS-MCO-2016-11-26T22.32.39.582-BLU-03025-00.cub";
@@ -38,6 +50,8 @@ void IsisMain() {
 
     p.StartProcess(ofs);
 
+    p.addHistory("Test history entry.");
+
     rawLabel = p.GetLabel().toString();
     rawLabel.remove(QRegExp(" xmlns.*=\".*\""));
     rawLabel.remove(QRegExp(" xsi.*=\".*\""));
@@ -47,6 +61,88 @@ void IsisMain() {
     remove("temp.img");
     remove("temp.xml");
 
+    std::cout << std::endl << "Testing export pixel types" << std::endl;
+
+    ProcessExportPds4 stretchProcess;
+    stretchProcess.SetOutputType(Isis::SignedWord);
+    stretchProcess.SetOutputEndian(Isis::Msb);
+    stretchProcess.SetInputCube(&cub);
+
+    QString stretchedMsbSW = stretchProcess.StandardPds4Label().toString();
+    stretchedMsbSW.remove(QRegExp(" xmlns.*=\".*\""));
+    stretchedMsbSW.remove(QRegExp(" xsi.*=\".*\""));
+    std::cout << stretchedMsbSW;
+
+    stretchProcess.SetOutputType(Isis::SignedWord);
+    stretchProcess.SetOutputEndian(Isis::Lsb);
+
+    stretchedMsbSW = stretchProcess.StandardPds4Label().toString();
+    stretchedMsbSW.remove(QRegExp(" xmlns.*=\".*\""));
+    stretchedMsbSW.remove(QRegExp(" xsi.*=\".*\""));
+    std::cout << stretchedMsbSW;
+
+    stretchProcess.SetOutputType(Isis::Real);
+    stretchProcess.SetOutputEndian(Isis::Msb);
+
+    stretchedMsbSW = stretchProcess.StandardPds4Label().toString();
+    stretchedMsbSW.remove(QRegExp(" xmlns.*=\".*\""));
+    stretchedMsbSW.remove(QRegExp(" xsi.*=\".*\""));
+    std::cout << stretchedMsbSW;
+
+    stretchProcess.SetOutputType(Isis::UnsignedWord);
+    stretchProcess.SetOutputEndian(Isis::Msb);
+
+    stretchedMsbSW = stretchProcess.StandardPds4Label().toString();
+    stretchedMsbSW.remove(QRegExp(" xmlns.*=\".*\""));
+    stretchedMsbSW.remove(QRegExp(" xsi.*=\".*\""));
+    std::cout << stretchedMsbSW;
+
+    stretchProcess.SetOutputType(Isis::UnsignedWord);
+    stretchProcess.SetOutputEndian(Isis::Lsb);
+
+    stretchedMsbSW = stretchProcess.StandardPds4Label().toString();
+    stretchedMsbSW.remove(QRegExp(" xmlns.*=\".*\""));
+    stretchedMsbSW.remove(QRegExp(" xsi.*=\".*\""));
+    std::cout << stretchedMsbSW;
+
+    stretchProcess.SetOutputType(Isis::UnsignedByte);
+    stretchProcess.SetOutputEndian(Isis::Lsb);
+
+    stretchedMsbSW = stretchProcess.StandardPds4Label().toString();
+    stretchedMsbSW.remove(QRegExp(" xmlns.*=\".*\""));
+    stretchedMsbSW.remove(QRegExp(" xsi.*=\".*\""));
+    std::cout << stretchedMsbSW;
+
+    std::cout << std::endl << "Testing missing start and end times" << std::endl;
+
+    PvlGroup &instGroup = cub.group("Instrument");
+    instGroup["StartTime"].setValue("");
+    instGroup.addKeyword( PvlKeyword("StopTime", "") );
+
+    ProcessExportPds4 badTimeProcess;
+    badTimeProcess.SetInputCube(&cub);
+    badTimeProcess.StandardPds4Label();
+    badTimeProcess.StartProcess(ofs);
+
+    QString badTimeLabel = badTimeProcess.GetLabel().toString();
+    badTimeLabel.remove(QRegExp(" xmlns.*=\".*\""));
+    badTimeLabel.remove(QRegExp(" xsi.*=\".*\""));
+    std::cout << badTimeLabel;
+
+    std::cout << std::endl << "Testing exporting a map projected product" << std::endl << std::endl;
+
+    QString projectedName("$base/testData/MarsPlanetaryRadius_45bottom.cub");
+    Cube projectedCube(projectedName);
+    ProcessExportPds4 projectedProcess;
+    projectedProcess.SetInputCube(&projectedCube);
+ 
+    QString projectedLabel = projectedProcess.StandardPds4Label().toString();
+    projectedLabel.remove(QRegExp(" xmlns.*=\".*\""));
+    projectedLabel.remove(QRegExp(" xsi.*=\".*\""));
+    std::cout << projectedLabel;
+
+    std::cout << std::endl << "Testing errors" << std::endl << std::endl;
+
     try {
       std::cout << "Test creating a standard Pds4Label with no input" << std::endl;
       ProcessExportPds4 emptyProcess;
@@ -55,6 +151,44 @@ void IsisMain() {
     catch(Isis::IException &e) {
       e.print();
     }
+
+    try {
+      std::cout << "Test translating units with a non-existant config" << std::endl;
+      ProcessExportPds4::translateUnits(stretchProcess.GetLabel(), "not a file");
+    }
+    catch(Isis::IException &e) {
+      e.print();
+    }
+
+    try {
+      std::cout << "Test translating units with a bad config" << std::endl;
+      ProcessExportPds4::translateUnits(stretchProcess.GetLabel(), cubeName);
+    }
+    catch(Isis::IException &e) {
+      e.print();
+    }
+
+    try {
+      std::cout << "Test adding a history to an empty label" << std::endl;
+      ProcessExportPds4 emptyProcess;
+      emptyProcess.addHistory("Test history");
+    }
+    catch(Isis::IException &e) {
+      e.print();
+    }
+
+    QString cassisTarget = instGroup["targetName"];
+    try {
+      std::cout << "Test a missing target" << std::endl;
+      ProcessExportPds4 testProcess;
+      instGroup.deleteKeyword("targetName");
+      testProcess.SetInputCube(&cub);
+      testProcess.StandardPds4Label();
+    }
+    catch(Isis::IException &e) {
+      e.print();
+    }
+    instGroup.addKeyword( PvlKeyword("targetName", cassisTarget) );
   }
   catch(Isis::IException &e) {
     e.print();
diff --git a/isis/src/base/objs/ProcessImportPds/ProcessImportPds.cpp b/isis/src/base/objs/ProcessImportPds/ProcessImportPds.cpp
index c80289cc5c11081ad4e3245682a4ace191a41490..1238078429c9df3aa8bd2d6154abdd9cfb1ecaa2 100644
--- a/isis/src/base/objs/ProcessImportPds/ProcessImportPds.cpp
+++ b/isis/src/base/objs/ProcessImportPds/ProcessImportPds.cpp
@@ -67,16 +67,16 @@ namespace Isis {
 
   ProcessImportPds::~ProcessImportPds() {
   }
-  
-  
+
+
   /**
-  * @deprecated. Please use Finalize. 
+  * @deprecated. Please use Finalize.
   */
   void ProcessImportPds::EndProcess() {
     ProcessImportPds::Finalize();
   }
-  
-  
+
+
   /**
    * Extract all possible PDS projection parameters from the PDS label
    *
@@ -315,15 +315,15 @@ namespace Isis {
     p_projectionOffsetGroup.addKeyword(PvlKeyword("xOffset", QString::number(xoff)));
     p_projectionOffsetGroup.addKeyword(PvlKeyword("yOffset", QString::number(yoff)));
     p_projectionOffsetGroup.addKeyword(PvlKeyword("xMultiplier", QString::number(xmult)));
-    p_projectionOffsetGroup.addKeyword(PvlKeyword("yMultiplier", QString::number(ymult))); 
+    p_projectionOffsetGroup.addKeyword(PvlKeyword("yMultiplier", QString::number(ymult)));
 
   }
-  
-  
+
+
   /**
   * End the processing sequence and cleans up by closing cubes,
   * freeing memory, etc. Adds the OriginalLabel data to the end of
-  * the cube file, unless OmitOriginalLabel() has been called. 
+  * the cube file, unless OmitOriginalLabel() has been called.
   */
   void ProcessImportPds::Finalize() {
     if (p_keepOriginalLabel) {
@@ -334,24 +334,24 @@ namespace Isis {
     }
     Process::Finalize();
   }
-  
-  
+
+
   /**
    * Return whether the projection offsets have changed.
    */
   bool ProcessImportPds::GetProjectionOffsetChange() {
     return p_projectionOffsetChange;
   }
-  
-  
+
+
   /**
    * Return the projection offsets. This will allow an app to log offset data.
    */
   PvlGroup ProcessImportPds::GetProjectionOffsetGroup() {
     return p_projectionOffsetGroup;
   }
-  
-  
+
+
   /**
    * Read mults and offsets from a def file in order to calculate the upper
    * left x/y.
@@ -396,8 +396,8 @@ namespace Isis {
       }
     }
   }
-  
-  
+
+
   /**
   * Identify the source of this file PDS or ISIS2.
   *
@@ -432,8 +432,8 @@ namespace Isis {
     }
 
   }
-  
-  
+
+
   /**
    * This method will import the PDS table with the given name into an Isis
    * Table object. The table will be added to the cube file in the call to
@@ -458,8 +458,8 @@ namespace Isis {
 
     return p_tables.at(p_tables.size() - 1);
   }
-  
-  
+
+
   /**
    * Return true if ISIS2 cube, else return false
    *
@@ -479,8 +479,8 @@ namespace Isis {
     }
 
   }
-  
-  
+
+
   /**
    * Prevents the Original Label blob from being written out to
    * the end of the cube.
@@ -488,8 +488,8 @@ namespace Isis {
   void ProcessImportPds::OmitOriginalLabel() {
     p_keepOriginalLabel = false;
   }
-  
-  
+
+
 /**
    * Handles the DataFilePointer keyword, aka ^QUBE or ^IMAGE.
    * There are two side effects of this method, those are
@@ -590,9 +590,9 @@ namespace Isis {
       QString recSize = pdsXlater.Translate("DataFileRecordBytes");
       SetFileHeaderBytes((offset - 1) * toInt(recSize));
     }
-  }  
-  
-  
+  }
+
+
 /**
    * Load the PDS labels after determining what type of data file was provided.
    * This code used to be part of the SetPdsFile method, but had to be moved to
@@ -749,19 +749,20 @@ namespace Isis {
       ProcessPdsCombinedSpectrumLabel(pdsDataFile);
     }
     else {
-      QString msg = "Unknown label type in [" + p_labelFile + "]";
+      QString msg = "Unknown label type in [" + p_labelFile + "]. It is possible the label file "
++                    "does not describe an image product (IMAGE, CUBE, or SPECTRALCUBE).";
       throw IException(IException::Io, msg, _FILEINFO_);
     }
-    
+
 
     // Find out if this is a PDS file or an ISIS2 file
     IdentifySource(p_pdsLabel);
 
-    
+
     return;
   }
-  
-  
+
+
   /**
    * Process the PDS label of type CombinedSpectrum.
    *
@@ -787,7 +788,7 @@ namespace Isis {
 
     ProcessPixelBitandType(pdsXlater);
 
-    str = pdsXlater.Translate("CoreByteOrder");    
+    str = pdsXlater.Translate("CoreByteOrder");
     SetByteOrder(Isis::ByteOrderEnumeration(str));
 
     str = pdsXlater.Translate("CoreSamples");
@@ -806,8 +807,7 @@ namespace Isis {
 
     // Use the name supplied by the application if it is there
     if (pdsDataFile.length() > 0) {
-      SetInputFile(pdsDataFile);
-      ProcessDataFilePointer(pdsXlater, true);
+      ProcessDataFilePointer(pdsXlater, false);
     }
     // If the data is in JPEG 2000 format, then use the name of the file
     // from the label
@@ -850,8 +850,8 @@ namespace Isis {
       throw IException(IException::Programmer, msg, _FILEINFO_);
     }
   }
-  
-  
+
+
   /**
    * Process the PDS label of type QUBE or SPECTRALQUBE.
    *
@@ -949,12 +949,12 @@ namespace Isis {
       str = pdsXlater.Translate("CoreSamples", samplePos);
       trailer *= toInt(str);
       trailer += suffix;
-      SetDataTrailerBytes(trailer); 
+      SetDataTrailerBytes(trailer);
     }
 
     // Save the Data Trailer if it exists
     if (DataTrailerBytes() != 0) {
-      SaveDataTrailer(); 
+      SaveDataTrailer();
     }
 
     ProcessPixelBitandType(pdsXlater);
@@ -1034,8 +1034,8 @@ namespace Isis {
       SetMultiplier(toDouble(str));
     }
   }
-  
-  
+
+
   /**
    * Process the PDS label of type IMAGE.
    *
@@ -1061,7 +1061,7 @@ namespace Isis {
 
     ProcessPixelBitandType(pdsXlater);
 
-    str = pdsXlater.Translate("CoreByteOrder");    
+    str = pdsXlater.Translate("CoreByteOrder");
     SetByteOrder(Isis::ByteOrderEnumeration(str));
 
     str = pdsXlater.Translate("CoreSamples");
@@ -1127,8 +1127,8 @@ namespace Isis {
       throw IException(IException::Programmer, msg, _FILEINFO_);
     }
   }
-  
-  
+
+
   /**
    * Handles PixelType and BitsPerPixel
    * Calls SetPixelType with the correct values
@@ -1167,15 +1167,15 @@ namespace Isis {
     else if ((str == "Natural") && (bitsPerPixel == 32)) {
       SetPixelType(Isis::UnsignedInteger);
     }
-    
+
     else {
       QString msg = "Invalid PixelType and BitsPerPixel combination [" + str +
                    ", " + toString(bitsPerPixel) + "]";
       throw IException(IException::Io, msg, _FILEINFO_);
     }
   }
-  
-  
+
+
   /**
    * Process Chandrayaan M3 PDS label
    *
@@ -1284,8 +1284,8 @@ namespace Isis {
       throw IException(IException::Programmer, msg, _FILEINFO_);
     }
   }
-  
-  
+
+
   /**
    * Handles all special pixel setting, ultimately, calls SetSpecialValues.
    */
@@ -1364,8 +1364,8 @@ namespace Isis {
 
     SetSpecialValues(pdsNull, pdsLrs, pdsLis, pdsHrs, pdsHis);
   }
-  
-  
+
+
   /**
    * Set the input label PVL and data file and initialize a Pvl with the PDS labels.
    * This method was written to allow the calling application to intercept the PDS
@@ -1373,7 +1373,7 @@ namespace Isis {
    * keywords like TARGET_NAME) before this class loads them. See the kaguyatc2isis
    * program for an example.
    *
-   * @param pdsLabelPvl The PVL containing the PDS label. 
+   * @param pdsLabelPvl The PVL containing the PDS label.
    *
    * @param pdsDataFile The name of the PDS data file where the actual image/cube
    *                    data is stored. This parameter cannot be empty.
@@ -1429,8 +1429,8 @@ namespace Isis {
     p_labelFile = pdsLabelFile;
     ProcessLabel(pdsDataFile, allowedTypes);
   }
-  
-  
+
+
   /**
    * This method will write the cube and table data to the output cube.
    */
@@ -1444,8 +1444,8 @@ namespace Isis {
 
 
   /**
-   * Process the input file and send data to a method for specialized processing. The method is 
-   * expected to write the data after it has processed it if necessary. 
+   * Process the input file and send data to a method for specialized processing. The method is
+   * expected to write the data after it has processed it if necessary.
    *
    * @param funct Method that accepts Isis::Buffer as an input
    *              parameter, processes the image, and has no
@@ -1458,8 +1458,8 @@ namespace Isis {
     return;
   }
 
-  
-  
+
+
   /**
    * Fill as many of the Isis3 BandBin labels as possible
    *
@@ -1477,8 +1477,8 @@ namespace Isis {
     // Add all the Isis2 keywords that can be translated to the requested label
     isis2Xlater.Auto(lab);
   }
-  
-  
+
+
   /**
    * Fill as many of the Isis3 instrument labels as possible
    *
@@ -1505,8 +1505,8 @@ namespace Isis {
       stkey = stime;
     }
   }
-  
-  
+
+
   /**
    * Translate as many of the ISIS2 labels as possible
    *
@@ -1518,8 +1518,8 @@ namespace Isis {
     TranslateIsis2BandBin(lab);
     TranslateIsis2Instrument(lab);
   }
-  
-  
+
+
   /**
    * Fill as many of the Isis3 BandBin labels as possible
    *
@@ -1534,8 +1534,8 @@ namespace Isis {
     // Add all the Isis2 keywords that can be translated to the requested label
     isis2Xlater.Auto(lab);
   }
-  
-  
+
+
   /**
    * Fill as many of the Isis3 BandBin labels as possible
    *
@@ -1550,8 +1550,8 @@ namespace Isis {
     // Add all the Isis2 keywords that can be translated to the requested label
     isis2Xlater.Auto(lab);
   }
-  
-  
+
+
   /**
    * Translate as many of the PDS labels as possible
    *
diff --git a/isis/src/base/objs/ProcessImportPds/ProcessImportPds.h b/isis/src/base/objs/ProcessImportPds/ProcessImportPds.h
index c256325332cee9b0c4b217716d138576a2b0f81b..9730e2b9d62ae6ea81e3b081fa33cb7532ddd5ba 100644
--- a/isis/src/base/objs/ProcessImportPds/ProcessImportPds.h
+++ b/isis/src/base/objs/ProcessImportPds/ProcessImportPds.h
@@ -212,15 +212,19 @@ namespace Isis {
    *  @history 2017-05-29 Kristin Berry - Update to the DataTrailer handling code so that its size
    *                          (DataTrailerBytes) is not inappropriately re-set if we have specified
    *                          it previously. References #3888.
-   *  
+   *
    *  @todo 2005-02-09 Finish documentation-lots of holes with variable
    *                          definitions in .h file and .cpp methods, and  insert
    *                          implementation example
    *   @history 2017-05-19 Christopher Combs - Modified unitTest.cpp: changed ReportError method to
    *                          truncate paths before data directory. Allows test to pass when not
    *                          using the default data area. Fixes #4738.
-   *   @history 2017-06-26 Summer Stapleton - Added functions to identify and report changes to 
+   *   @history 2017-06-26 Summer Stapleton - Added functions to identify and report changes to
    *                          the default projection offsets and multipliers. Fixes #4887.
+   *   @history 2017-12-20 Summer Stapleton - Modified error message in
+   *                          ProcessImportPds::ProcessLabel() to be more discriptive. Fixes #4883.
+   *   @history 2018-01-19 Christopher Combs - Changed ProcessDataFilePointer call to reflect 
+   *                          changes made to voy2isis. Fixes #4345, #4421.
    *
    */
   class ProcessImportPds : public ProcessImport {
@@ -288,7 +292,7 @@ namespace Isis {
       void ProcessPdsM3Label(const QString &pdsDataFile, PdsFileType fileType);
       void ProcessPdsCombinedSpectrumLabel(const QString &pdsDataFile);
 
-      void ExtractPdsProjection(PvlToPvlTranslationManager &pdsXlater); 
+      void ExtractPdsProjection(PvlToPvlTranslationManager &pdsXlater);
       void GetProjectionOffsetMults(double &xoff, double &yoff,
                                     double &xmult, double &ymult);
 
@@ -314,12 +318,12 @@ namespace Isis {
       // Projection info
       QString p_projection;       /**< The name of the projection found in
                                              the PDS projection labels*/
-                                             
-      bool p_projectionOffsetChange;    /**< Whether the projection offsets were updated upon 
+
+      bool p_projectionOffsetChange;    /**< Whether the projection offsets were updated upon
                                             loading*/
- 
+
       PvlGroup p_projectionOffsetGroup;      /**< Log information for projection offsets*/
-                                           
+
       QString p_targetName;       //!<
       double p_equatorialRadius;      /**< Equatorial radius found in the PDS
                                            projection labels*/
diff --git a/isis/src/base/objs/ProcessImportPds/unitTest.cpp b/isis/src/base/objs/ProcessImportPds/unitTest.cpp
index edda50c6163ffb67103384815e4598ebe2081363..7773e8c259531730c0c410e12d87d3e7f0911220 100644
--- a/isis/src/base/objs/ProcessImportPds/unitTest.cpp
+++ b/isis/src/base/objs/ProcessImportPds/unitTest.cpp
@@ -15,6 +15,8 @@ using namespace Isis;
  * @internal
  *   @history 2012-05-08 Tracie Sucharski - Moved test data to /usgs/cpks/mer/testData and
  *                         /usgs/cpkgs/clementine1/testData.  Added test for invalid label.z
+ *   @history 2018-01-25 Ian Humphrey - Moved .img file out of ISIS tree (since we are not
+ *                           storing .img's on GitHub).
  */
 void IsisMain() {
 
@@ -111,7 +113,8 @@ void IsisMain() {
     cout << "Testing PDS file containing an ^IMAGE pointer and ^TABLE pointer" << endl;
     Isis::ProcessImportPds p;
     Isis::Pvl plab;
-    p.SetPdsFile("data/pdsImageWithTables.lbl", "data/pdsImageWithTables.img", plab);
+    p.SetPdsFile("data/pdsImageWithTables.lbl",
+                 "$ISIS3TESTDATA/isis/src/base/objs/ProcessImportPds/pdsImageWithTables.img", plab);
     p.SetOutputCube("TO");
     p.ImportTable("SUN_POSITION_TABLE");
     p.StartProcess();
diff --git a/isis/src/base/objs/ProcessImportVicar/unitTest.cpp b/isis/src/base/objs/ProcessImportVicar/unitTest.cpp
index 816b6919a81d2b7e6bc430efd3184623ba03076a..909afb6c9a01e6534241d56d5b2875fe0c49fab0 100644
--- a/isis/src/base/objs/ProcessImportVicar/unitTest.cpp
+++ b/isis/src/base/objs/ProcessImportVicar/unitTest.cpp
@@ -5,6 +5,7 @@
 #include "ProcessImportVicar.h"
 #include "Application.h"
 #include "Cube.h"
+#include "FileName.h"
 #include "Statistics.h"
 
 using namespace Isis;
@@ -16,7 +17,7 @@ void IsisMain() {
 
   ProcessImportVicar p;
   Pvl vlab;
-  p.SetVicarFile("unitTest.img", vlab);
+  p.SetVicarFile(FileName("$ISIS3TESTDATA/isis/src/base/objs/ProcessImportVicar/unitTest.img").expanded(), vlab);
   p.SetOutputCube("TO");
   p.StartProcess();
   p.EndProcess();
diff --git a/isis/src/base/objs/ProcessMapMosaic/ProcessMapMosaic.truth b/isis/src/base/objs/ProcessMapMosaic/ProcessMapMosaic.truth
index 1d6a753c8a1d5fa228b11a09fba2c9bac0343846..c5143e391c1575dda66083c49e1b62b91c6f13b5 100644
--- a/isis/src/base/objs/ProcessMapMosaic/ProcessMapMosaic.truth
+++ b/isis/src/base/objs/ProcessMapMosaic/ProcessMapMosaic.truth
@@ -4,10 +4,10 @@ unittest: Initializing mosaic
 0% Processed
10% Processed
20% Processed
30% Processed
40% Processed
50% Processed
60% Processed
70% Processed
80% Processed
90% Processed
100% Processed
 unittest: Mosaicking unitTest1.cub
 0% Processed
10% Processed
20% Processed
30% Processed
40% Processed
50% Processed
60% Processed
70% Processed
80% Processed
90% Processed
100% Processed
-./unitTest1.cub is inside the mosaic
+/usgs/cpkgs/isis3/data/base/testData/ProcessMapMosaic/unitTest1.cub is inside the mosaic
 unittest: Mosaicking unitTest2.cub
 0% Processed
10% Processed
20% Processed
30% Processed
40% Processed
50% Processed
60% Processed
70% Processed
80% Processed
90% Processed
100% Processed
-./unitTest2.cub is inside the mosaic
+/usgs/cpkgs/isis3/data/base/testData/ProcessMapMosaic/unitTest2.cub is inside the mosaic
 Mosaic label: 
 Object = IsisCube
   Object = Core
@@ -58,10 +58,10 @@ unittest: Initializing mosaic
 0% Processed
10% Processed
20% Processed
30% Processed
40% Processed
50% Processed
60% Processed
70% Processed
80% Processed
90% Processed
100% Processed
 unittest: Mosaicking unitTest1.cub
 0% Processed
10% Processed
20% Processed
30% Processed
40% Processed
50% Processed
60% Processed
70% Processed
80% Processed
90% Processed
100% Processed
-./unitTest1.cub is inside the mosaic
+/usgs/cpkgs/isis3/data/base/testData/ProcessMapMosaic/unitTest1.cub is inside the mosaic
 unittest: Mosaicking unitTest2.cub
 0% Processed
10% Processed
20% Processed
30% Processed
40% Processed
50% Processed
60% Processed
70% Processed
80% Processed
90% Processed
100% Processed
-./unitTest2.cub is inside the mosaic
+/usgs/cpkgs/isis3/data/base/testData/ProcessMapMosaic/unitTest2.cub is inside the mosaic
 Mosaic label: 
 Object = IsisCube
   Object = Core
@@ -558,10 +558,10 @@ unittest: Initializing mosaic
 0% Processed
10% Processed
20% Processed
30% Processed
40% Processed
50% Processed
60% Processed
70% Processed
80% Processed
90% Processed
100% Processed
 unittest: Mosaicking unitTest_crop.cub
 0% Processed
10% Processed
20% Processed
30% Processed
40% Processed
50% Processed
60% Processed
70% Processed
80% Processed
90% Processed
100% Processed
-./unitTest_crop.cub is inside the mosaic
+/usgs/cpkgs/isis3/data/base/testData/ProcessMapMosaic/unitTest_crop.cub is inside the mosaic
 unittest: Mosaicking unitTest_nocrop.cub
 0% Processed
10% Processed
20% Processed
30% Processed
40% Processed
50% Processed
60% Processed
70% Processed
80% Processed
90% Processed
100% Processed
-./unitTest_nocrop.cub is inside the mosaic
+/usgs/cpkgs/isis3/data/base/testData/ProcessMapMosaic/unitTest_nocrop.cub is inside the mosaic
 Mosaic label: 
 Object = IsisCube
   Object = Core
diff --git a/isis/src/base/objs/ProcessMapMosaic/unitTest.cpp b/isis/src/base/objs/ProcessMapMosaic/unitTest.cpp
index c2e5a3656bd2ae6289b58e7d6cac6b7d9e2f4a07..46ea2c9cd410c216a37ed82497942531894b9b47 100644
--- a/isis/src/base/objs/ProcessMapMosaic/unitTest.cpp
+++ b/isis/src/base/objs/ProcessMapMosaic/unitTest.cpp
@@ -6,6 +6,7 @@
 #include "Application.h"
 #include "CubeAttribute.h"
 #include "FileList.h"
+#include "FileName.h"
 #include "ProcessMosaic.h"
 #include "LineManager.h"
 
@@ -91,7 +92,7 @@ void IsisMain() {
 
   cout << endl << "Testing Mosaic where the input (x, y) is negative,"
           " according to the output cube." << endl;
-  QString inputFile = "./unitTest1.cub";
+  QString inputFile = FileName("$base/testData/ProcessMapMosaic/unitTest1.cub").expanded();
   Cube inCube;
   inCube.open(inputFile);
   PvlGroup mapGroup = inCube.label()->findGroup("Mapping", Pvl::Traverse);
diff --git a/isis/src/base/objs/ProcessMapMosaic/unitTest.lis b/isis/src/base/objs/ProcessMapMosaic/unitTest.lis
index 31b241a395d885e94c6394465ce9d7b48a040c6b..6b521c857cb80b717d9da832b15d8b0b82be17bf 100644
--- a/isis/src/base/objs/ProcessMapMosaic/unitTest.lis
+++ b/isis/src/base/objs/ProcessMapMosaic/unitTest.lis
@@ -1,2 +1,2 @@
-./unitTest1.cub
-./unitTest2.cub
+$base/testData/ProcessMapMosaic/unitTest1.cub
+$base/testData/ProcessMapMosaic/unitTest2.cub
diff --git a/isis/src/base/objs/ProcessMapMosaic/unitTest_crop.lis b/isis/src/base/objs/ProcessMapMosaic/unitTest_crop.lis
index 79f1a0d74d5014a7581c4650c723d1b6bb2b32ff..2b6954da65cf4cd67f317a0bd4a7506f51c61dd8 100644
--- a/isis/src/base/objs/ProcessMapMosaic/unitTest_crop.lis
+++ b/isis/src/base/objs/ProcessMapMosaic/unitTest_crop.lis
@@ -1,2 +1,2 @@
-./unitTest_crop.cub
-./unitTest_nocrop.cub
+$base/testData/ProcessMapMosaic/unitTest_crop.cub
+$base/testData/ProcessMapMosaic/unitTest_nocrop.cub
diff --git a/isis/src/base/objs/PushFrameCameraCcdLayout/Makefile b/isis/src/base/objs/PushFrameCameraCcdLayout/Makefile
deleted file mode 100644
index f122bc88227c5c7ebd108dea5d339d1d2e074d82..0000000000000000000000000000000000000000
--- a/isis/src/base/objs/PushFrameCameraCcdLayout/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-ifeq ($(ISISROOT), $(BLANK))
-.SILENT:
-error:
-	echo "Please set ISISROOT";
-else
-	include $(ISISROOT)/make/isismake.objs
-endif
\ No newline at end of file
diff --git a/isis/src/base/objs/PvlToPvlTranslationManager/PvlToPvlTranslationManager.cpp b/isis/src/base/objs/PvlToPvlTranslationManager/PvlToPvlTranslationManager.cpp
index 311ee169018468aa16cfd2d297ff6a50464e0175..149c4fcc543389c92cd463fdd1d1ae0d7d6ffb0d 100644
--- a/isis/src/base/objs/PvlToPvlTranslationManager/PvlToPvlTranslationManager.cpp
+++ b/isis/src/base/objs/PvlToPvlTranslationManager/PvlToPvlTranslationManager.cpp
@@ -143,32 +143,43 @@ namespace Isis {
    *
    * @return PvlKeyword
    */
-  PvlKeyword PvlToPvlTranslationManager::DoTranslation(const QString nName) {
-    const PvlContainer *con = NULL;
-    PvlKeyword key;
-
-    int inst = 0;
-    PvlKeyword grp;
-
-    while((grp = InputGroup(nName, inst++)).name() != "") {
-      if((con = GetContainer(grp)) != NULL) {
-        if(con->hasKeyword(InputKeywordName(nName))) {
-          key.setName(OutputName(nName));
-
-          for(int v = 0; v < (*con)[(InputKeywordName(nName))].size(); v++) {
-            key.addValue(PvlTranslationTable::Translate(nName,
-                         (*con)[InputKeywordName(nName)][v]),
-                         (*con)[InputKeywordName(nName)].unit(v));
-          }
-
-          return key;
-        }
-      }
-    }
-
-    return PvlKeyword(OutputName(nName),
-                            PvlTranslationTable::Translate(nName, ""));
-  }
+   PvlKeyword PvlToPvlTranslationManager::DoTranslation(const QString nName) {
+     const PvlContainer *con = NULL;
+     PvlKeyword key;
+
+     int inst = 0;
+     PvlGroup transGroup;
+     PvlKeyword grp;
+
+     while((grp = InputGroup(nName, inst++)).name() != "") {
+       if((con = GetContainer(grp)) != NULL) {
+         transGroup = TranslationTable().findGroup(nName);
+         Pvl::ConstPvlKeywordIterator it = transGroup.findKeyword("InputKey",
+                                           transGroup.begin(),
+                                           transGroup.end());
+         // Loop through potential InputKeys in the translation file group currently beginning
+         // translated.
+         while(it != transGroup.end()) {
+           const PvlKeyword &result = *it;
+           if(con->hasKeyword(result[0])) {
+             key.setName(OutputName(nName));
+
+             for(int v = 0; v < (*con)[(result[0])].size(); v++) {
+               key.addValue(PvlTranslationTable::Translate(nName,
+                            (*con)[result[0]][v]),
+                            (*con)[result[0]].unit(v));
+             }
+
+             return key;
+           }
+           it = transGroup.findKeyword("InputKey", it + 1, transGroup.end());
+         }
+       }
+     }
+
+     return PvlKeyword(OutputName(nName),
+                             PvlTranslationTable::Translate(nName, ""));
+   }
 
 
   /**
@@ -209,7 +220,7 @@ namespace Isis {
 
 
   /**
-   * Returns the ith input value assiciated with the output name argument.
+   * Returns the ith input value associated with the output name argument.
    *
    * @param nName The output name used to identify the input keyword.
    *
diff --git a/isis/src/base/objs/PvlToPvlTranslationManager/PvlToPvlTranslationManager.h b/isis/src/base/objs/PvlToPvlTranslationManager/PvlToPvlTranslationManager.h
index cb074ce7a80bc70acdce27eb1474459e574babe0..f4f434321d33571b41ab1ab29993cdf44b2b2c42 100644
--- a/isis/src/base/objs/PvlToPvlTranslationManager/PvlToPvlTranslationManager.h
+++ b/isis/src/base/objs/PvlToPvlTranslationManager/PvlToPvlTranslationManager.h
@@ -75,6 +75,8 @@ namespace Isis {
    *                          parent class, LabelTranslationManager. Fixes #4584.
    *  @history 2017-06-13 Adam Paquette - Changed PvlTranslationManager file name to
    *                          PvlToPvlTranslationManager. Fixes #4901.
+   *  @history 2018-01-10 Christopher Combs - Changed ProcessDataFilePointer call to reflect 
+   *                          changes made to voy2isis. Fixes #4345, #4421.
    *  @todo 2005-02-15 Stuart Sides - add coded example and implementation example
    *                                  to class documentation, and finish
    *                                  documentation
diff --git a/isis/src/base/objs/PvlToXmlTranslationManager/PvlToXmlTranslationManager.cpp b/isis/src/base/objs/PvlToXmlTranslationManager/PvlToXmlTranslationManager.cpp
index 7799393106fae400a0413f1adc474fbbe7dc7a3f..f8692a70fcb75e14b60412820c04cfe293723868 100644
--- a/isis/src/base/objs/PvlToXmlTranslationManager/PvlToXmlTranslationManager.cpp
+++ b/isis/src/base/objs/PvlToXmlTranslationManager/PvlToXmlTranslationManager.cpp
@@ -21,6 +21,7 @@
  */
 #include "LabelTranslationManager.h"
 
+#include <QDebug>
 #include <QDomDocument>
 #include <QDomElement>
 #include <QString>
@@ -129,8 +130,7 @@ namespace Isis {
         }
       }
     }
-
-    return PvlTranslationTable::Translate(transGroupName);
+    return PvlTranslationTable::Translate(transGroupName); 
   }
 
 
@@ -148,10 +148,6 @@ namespace Isis {
   void PvlToXmlTranslationManager::doTranslation(PvlGroup transGroup,
                                                  QDomElement &parentElement) {
 
-    if (transGroup.hasKeyword("OutputSiblings")) {
-      addSiblings(transGroup.findKeyword("OutputSiblings"), parentElement);
-    }
-
     int inst = 0;
     QString transGroupName = transGroup.name();
     PvlKeyword grp = InputGroup(transGroupName, inst);
@@ -163,15 +159,15 @@ namespace Isis {
         if (con->hasKeyword(InputKeywordName(transGroupName))) {
 
           QStringList outputName = parseSpecification(OutputName(transGroupName));
-          // get the InputKey from the input label.
+          // Get the InputKey from the input label.
           PvlKeyword inputKeyword = (*con)[InputKeywordName(transGroupName)];
-          // translate input keyword value and set the qdomelement
+          // Translate input keyword value and set the qdomelement
           // NOTE: We are assuming this is a single valued keyword since
           //       xml does not allow multiple values
           QString untranslatedValue = inputKeyword[0];
-          QString translatedValue = PvlTranslationTable::Translate(transGroupName,
+          QString translatedValue = PvlTranslationTable::Translate(transGroupName, 
                                                                    untranslatedValue);
-          QString units = inputKeyword.unit();
+          QString units = inputKeyword.unit(); 
           if (outputName.size() == 2 && outputName[0] == "att") {
             parentElement.setAttribute(outputName[1], translatedValue);
             if (transGroup.hasKeyword("OutputAttributes")) {
@@ -187,6 +183,9 @@ namespace Isis {
             }
           }
 
+          if (transGroup.hasKeyword("OutputSiblings")) {
+            addSiblings(transGroup.findKeyword("OutputSiblings"), parentElement);
+          }
           return;
 
         }
@@ -194,14 +193,17 @@ namespace Isis {
       grp = InputGroup(transGroupName, ++inst);
     }
 
-    // look for default
+    // Look for default
     QString translatedValue = PvlTranslationTable::Translate(transGroupName, "");
-    QDomElement newElement = parentElement.ownerDocument().createElement(transGroupName);
+    QDomElement newElement = parentElement.ownerDocument().createElement(OutputName(transGroupName));
     setElementValue(newElement, translatedValue);
     parentElement.appendChild(newElement);
     if (transGroup.hasKeyword("OutputAttributes")) {
       addAttributes(transGroup.findKeyword("OutputAttributes"), newElement);
     }
+    if (transGroup.hasKeyword("OutputSiblings")) {
+      addSiblings(transGroup.findKeyword("OutputSiblings"), parentElement);
+    }
 
   }
 
@@ -245,7 +247,7 @@ namespace Isis {
         }
         catch(IException &e) {
           if(!IsOptional(g.name())) {
-            throw;
+            throw;//???
           }
         }
       }
@@ -286,7 +288,8 @@ namespace Isis {
 
     if(anInputGroupFound) {
       QString msg = "Unable to find input keyword [" + InputKeywordName(transGroupName) +
-                   "] for output name [" + transGroupName + "] in file [" + TranslationTable().fileName() + "]";
+                     "] for output name [" + transGroupName + "] in file [" + 
+                     TranslationTable().fileName() + "]";
       throw IException(IException::Programmer, msg, _FILEINFO_);
     }
     else {
@@ -298,8 +301,8 @@ namespace Isis {
         container += InputGroup(transGroupName)[i];
       }
 
-      QString msg = "Unable to find input group [" + container +
-                   "] for output name [" + transGroupName + "] in file [" + TranslationTable().fileName() + "]";
+      QString msg = "Unable to find input group [" + container + "] for output name [" + 
+                     transGroupName + "] in file [" + TranslationTable().fileName() + "]";
       throw IException(IException::Programmer, msg, _FILEINFO_);
     }
   }
@@ -319,8 +322,6 @@ namespace Isis {
     // by finding the input group corresponding to the output group
     const PvlContainer *con;
     int inst = 0;
-    //while ((con = GetContainer(InputGroup(transGroupName, inst++))) != NULL) {
-    //if ((con = GetContainer (InputGroup(transGroupName))) != NULL) {
 
     PvlKeyword grp;
     while((grp = InputGroup(transGroupName, inst++)).name() != "") {
@@ -447,22 +448,24 @@ namespace Isis {
    * @param outputSiblings The PvlKeyword that holds the list of siblings
    * @param parent The parent QDomElement
    *
-   * @throws IException::Programmer "OutputSibling does not have a tag name and/or value."
+   * @throws IException::Programmer "Malformed OutputSibling [" + outputSiblings[i] + "]"
    */
   void PvlToXmlTranslationManager::addSiblings(PvlKeyword outputSiblings,
                                                QDomElement &parent) {
 
     for (int i = 0; i < outputSiblings.size(); i++) {
-      QStringList parsedSibling = parseSpecification(outputSiblings[i]);
-
+      QStringList parsedSibling;
+      parsedSibling.reserve(5);
+      parsedSibling = parseSpecification(outputSiblings[i]);
       if (parsedSibling.size() != 2) {
-        //If the sibling does not have a tag name AND a tag value
-        QString msg = "OutputSibling does not have a tag name and/or value.";
+        // If the sibling does not have a tag name AND a tag value
+        QString msg = "Malformed OutputSibling [" + outputSiblings[i] + "]. OutputSiblings must" +
+                      " be in the form of tag|value";
         throw IException(IException::Programmer, msg, _FILEINFO_);
       }
 
       if (parent.namedItem(parsedSibling[0]).isNull()) {
-        //parsedSibling[0] is the tag name, parsedSibling[1] is the tag value
+        // parsedSibling[0] is the tag name, parsedSibling[1] is the tag value
         QDomElement childElement = parent.ownerDocument().createElement(parsedSibling[0]);
         setElementValue(childElement, parsedSibling[1]);
         parent.appendChild(childElement).toElement();;
@@ -489,7 +492,7 @@ namespace Isis {
 
       if (parsedAttribute.size() != 2) {
         QString msg = "Malformed output attribute [" + outputAttributes[i] +
-                        "].";
+                        "]. OutputAttributes must be in the form of att@attribute_name|value";
         throw IException(IException::Programmer,msg ,_FILEINFO_);
       }
       element.setAttribute(parsedAttribute[0], parsedAttribute[1]);
@@ -497,21 +500,61 @@ namespace Isis {
   }
 
 
+  /**
+   * Add a QDomElement to the given parent with the indicated 
+   * value and units. 
+   *
+   * @param parent The parent QDomElement of the new element.
+   * @param name The name of the new element.
+   * @param value The value of the new element.
+   * @param units A string containing the unit specification for 
+   *              the new element.
+   */
+  void PvlToXmlTranslationManager::addElement(QDomElement &parent,
+                                              QString name,
+                                              QString value,
+                                              QString units) {
+    QDomElement newElement = parent.ownerDocument().createElement(name);
+    setElementValue(newElement, value, units);
+    // append element to parent node???
+    parent.appendChild(newElement).toElement();;
+  }
+
+
   /**
    * Set the QDomElement's value, and units, if units != "".
    *
-   * @param element The QDomElement whose value needs to be set
-   * @param value The value to set
+   * @param element The QDomElement whose value needs to be set.
+   * @param value The value to set.
+   * @param units A string containing the unit specification.
    */
   void PvlToXmlTranslationManager::setElementValue(QDomElement &element,
                                                    QString value,
                                                    QString units) {
     QDomText valueText = element.ownerDocument().createTextNode(value);
+    // append value to element???
     element.appendChild(valueText);
 
     if (units != "") {
-      element.setAttribute("Unit", units);
+      element.setAttribute("unit", units);
     }
   }
 
+
+  /**
+   * Reset the QDomElement's value, and units, if units != "".
+   *
+   * @param element The QDomElement whose value needs to be reset.
+   * @param value The value to set.
+   * @param units A string containing the unit specification.
+   */
+  void PvlToXmlTranslationManager::resetElementValue(QDomElement &element,
+                                                     QString value,
+                                                     QString units) {
+    element.firstChild().setNodeValue(value);
+    if (units != "") {
+      element.setAttribute("unit", units);
+    }
+  }
 } // end namespace isis
+
diff --git a/isis/src/base/objs/PvlToXmlTranslationManager/PvlToXmlTranslationManager.h b/isis/src/base/objs/PvlToXmlTranslationManager/PvlToXmlTranslationManager.h
index 3a2cd2038bcbd9603fb1587ad8bd582d568a3c0f..b1990dfef38f39e625f0d95ebc72663c105b47ce 100644
--- a/isis/src/base/objs/PvlToXmlTranslationManager/PvlToXmlTranslationManager.h
+++ b/isis/src/base/objs/PvlToXmlTranslationManager/PvlToXmlTranslationManager.h
@@ -58,6 +58,10 @@ namespace Isis {
    *  @history 2017-05-31 Ian Humphrey & Makayla Shepherd - Fixed duplicate root xml element in
    *                          output xml file.
    *  @history 2017-06-02 Makayla Shepherd - Made setElementValue public.
+   *  @history 2017-10-18 Jeannie Backer & Makayla Shepherd - Added convenience methods, addElement
+   *                          and resetElementValue, and made setElementValue static. See #5202.
+   *  @history 2017-10-31 Jeannie Backer - Moved creation of sibling elements in doTranslation()
+   *                          so that this only happens if the translation is succesful.
    */
   class PvlToXmlTranslationManager : public LabelTranslationManager {
     public:
@@ -84,7 +88,9 @@ namespace Isis {
 
       void SetLabel(Pvl &inputLabel);
       
-      void setElementValue(QDomElement &element, QString value, QString units = "");
+      static void addElement(QDomElement &parent, QString name, QString value, QString units = "");
+      static void setElementValue(QDomElement &element, QString value, QString units = "");
+      static void resetElementValue(QDomElement &element, QString value, QString units = "");
 
 
     protected:
diff --git a/isis/src/base/objs/PvlToXmlTranslationManager/PvlToXmlTranslationManager.truth b/isis/src/base/objs/PvlToXmlTranslationManager/PvlToXmlTranslationManager.truth
index 0f02ccee0ad35b82cf8ff1304aced41d777d399f..0b587b848c183d778e7883caf5a0ea9dc4d642cc 100644
--- a/isis/src/base/objs/PvlToXmlTranslationManager/PvlToXmlTranslationManager.truth
+++ b/isis/src/base/objs/PvlToXmlTranslationManager/PvlToXmlTranslationManager.truth
@@ -31,12 +31,12 @@ ExposureDuration = 1.920e-003 <seconds>
  <File_Area_Observational>
   <Array_2D_Image>
    <Axis_Array>
-    <axis_name>Sample</axis_name>
     <elements>2048</elements>
+    <axis_name>Sample</axis_name>
    </Axis_Array>
    <Axis_Array>
-    <axis_name>Lines</axis_name>
     <elements>255</elements>
+    <axis_name>Line</axis_name>
    </Axis_Array>
   </Array_2D_Image>
  </File_Area_Observational>
@@ -44,7 +44,7 @@ ExposureDuration = 1.920e-003 <seconds>
   <PEHK_HEADER Exposure_Time="1.920e-003"/>
   <DERIVED_HEADER_DATA>
    <Filter Form="Acronym">NIR</Filter>
-   <DefaultOutput>DefaultValue</DefaultOutput>
+   <NotInLabel>DefaultValue</NotInLabel>
   </DERIVED_HEADER_DATA>
  </CaSSIS_Header>
 </Product_Observational>
diff --git a/isis/src/base/objs/PvlToXmlTranslationManager/unitTest.cpp b/isis/src/base/objs/PvlToXmlTranslationManager/unitTest.cpp
index 976dd6fb855032da064d209710795e1fa394a25e..ece66bc7325d91accfd530ce0fe6c7b97f94c3f9 100644
--- a/isis/src/base/objs/PvlToXmlTranslationManager/unitTest.cpp
+++ b/isis/src/base/objs/PvlToXmlTranslationManager/unitTest.cpp
@@ -57,7 +57,7 @@ int main(void) {
     trnsStrm << " InputKey        = Samples" <<endl;
     trnsStrm << " InputPosition   = (IsisCube, Core, Dimensions)" <<endl;
     trnsStrm << " OutputName      = elements" <<endl;
-    trnsStrm << " OutputSiblings  = axis_name:Sample" <<endl;
+    trnsStrm << " OutputSiblings  = axis_name|Sample" <<endl;
     trnsStrm << " OutputName      = elements" <<endl;
     trnsStrm << " OutputPosition  = (Product_Observational, File_Area_Observational, Array_2D_Image, new@Axis_Array)" <<endl;
     trnsStrm << " Translation = (*,*)" << endl;
@@ -68,7 +68,7 @@ int main(void) {
     trnsStrm << " InputKey        = Lines" <<endl;
     trnsStrm << " InputPosition   = (IsisCube, Core, Dimensions)" <<endl;
     trnsStrm << " OutputName      = elements" <<endl;
-    trnsStrm << " OutputSiblings  = axis_name:Lines" <<endl;
+    trnsStrm << " OutputSiblings  = axis_name|Line" <<endl;
     trnsStrm << " OutputName      = elements" <<endl;
     trnsStrm << " OutputPosition  = (Product_Observational, File_Area_Observational, Array_2D_Image, new@Axis_Array)" <<endl;
     trnsStrm << " Translation = (*,*)" << endl;
@@ -88,7 +88,7 @@ int main(void) {
     trnsStrm << "  InputKey = Filter" << endl;
     trnsStrm << "  InputPosition = (IsisCube, Instrument)" << endl;
     trnsStrm << "  OutputName = Filter" << endl;
-    trnsStrm << "  OutputAttributes = Form:Acronym" << endl;
+    trnsStrm << "  OutputAttributes = Form|Acronym" << endl;
     trnsStrm << "  OutputPosition  = (Product_Observational, CaSSIS_Header, DERIVED_HEADER_DATA)" << endl;
     trnsStrm << "  Translation = (*,*)" << endl;
     trnsStrm << "EndGroup" << endl;
diff --git a/isis/src/base/objs/PvlTranslationTable/PvlTranslationTable.cpp b/isis/src/base/objs/PvlTranslationTable/PvlTranslationTable.cpp
index 18ee84ab552e93da80872684d0bec7487ea9a07c..d67d38d21a9fc2d84457ead504c0074d1de1b5a0 100644
--- a/isis/src/base/objs/PvlTranslationTable/PvlTranslationTable.cpp
+++ b/isis/src/base/objs/PvlTranslationTable/PvlTranslationTable.cpp
@@ -193,7 +193,6 @@ namespace Isis {
    * Translates the output name and input value.
    *
    * @param nName The output name to be used to search the translation table.
-   *
    * @param fValue The input value to be translated
    *
    * @return QString The translated QString
@@ -201,7 +200,7 @@ namespace Isis {
    * @throws iException::Programmer
    */
   QString PvlTranslationTable::Translate(const QString nName,
-                                        const QString fValue) const {
+                                         const QString fValue) const {
     if(!p_trnsTbl.hasGroup(nName)) {
       QString msg = "Unable to find translation group [" +
                    nName + "] in file [" + p_trnsTbl.fileName() + "]";
@@ -233,6 +232,8 @@ namespace Isis {
 
     while(it != tgrp.end()) {
       const PvlKeyword &key = *it;
+      // compare the value from the input file to the second value of each Translation in the trans file.
+      // ignore cases for input values  
       if((QString) key[1] == tmpFValue) {
         return key[0];
       }
diff --git a/isis/src/base/objs/PvlTranslationTable/PvlTranslationTable.h b/isis/src/base/objs/PvlTranslationTable/PvlTranslationTable.h
index 1ddaf352b2c083a43f992e3bbc69a139359773f4..6eaede556bfd63e112932f6052b49a71f7cd7551 100644
--- a/isis/src/base/objs/PvlTranslationTable/PvlTranslationTable.h
+++ b/isis/src/base/objs/PvlTranslationTable/PvlTranslationTable.h
@@ -89,38 +89,33 @@ namespace Isis {
    * @author 2003-05-01 Stuart Sides
    *
    * @internal
-   *  @history 2003-09-03 Stuart Sides - Modified to work with new isis label
-   *                                     format
-   *  @history 2005-02-15 Elizabeth Ribelin - Modified file to support Doxygen
-   *                                          documentation
-   *  @history 2005-09-08 Stuart Sides - Modified Translate member to handle
-   *                                     translating any input value i.e., "*"
-   *                                     to a specific output value (Thanks Kris
-   *                                     Beckeer)
-   *
+   *  @history 2003-09-03 Stuart Sides - Modified to work with new isis label format.
+   *  @history 2005-02-15 Elizabeth Ribelin - Modified file to support Doxygen documentation.
+   *  @history 2005-09-08 Stuart Sides - Modified Translate member to handle translating any
+   *                          input value i.e., "*" to a specific output value (Thanks Kris
+   *                          Becker).
    *  @history 2006-08-09 Brendan George - Added IsOptional function as part of
-   *                                       support for Optional keyword translations
-   *  @history 2006-11-16 Brendan George - Changed instances of "Foreign" to "Input"
-   *                                       and "Native" to "Output"
-   *  @history 2007-06-22 Stuart Sides - Added instance parameter to InputGroup member
-   *  @history 2006-12-05 Brendan George - Changed OutputPosition keyword to be
-   *                                        case insensitive, and added
-   *                                        verification to the AddTable method so
-   *                                        that Translation Tables are verified
-   *                                        when read in
-   *  @history 2008-07-10 Steven Lambright - Made trnsTbl member into a
-   *           non-pointer
-   *  @history 2010-01-04 Steven Lambright - Now using files instead of streams
-   *                                      where possible to improve errors and
-   *                                      added code that checks the
-   *                                      integrity of translation files. Also
-   *                                      now looking for "InputPosition" keyword
-   *                                      instead of "InputGroup." The InputGroup
-   *                                      method (which needs renamed later) now
-   *                                      returns a PvlKeyword.
+   *                          support for Optional keyword translations
+   *  @history 2006-11-16 Brendan George - Changed instances of "Foreign" to "Input" and "Native"
+   *                          to "Output".
+   *  @history 2007-06-22 Stuart Sides - Added instance parameter to InputGroup member.
+   *  @history 2006-12-05 Brendan George - Changed OutputPosition keyword to be case insensitive,
+   *                          and added verification to the AddTable method so that
+   *                          Translation Tables are verified when read in.
+   *  @history 2008-07-10 Steven Lambright - Made trnsTbl member into a non-pointer
+   *  @history 2010-01-04 Steven Lambright - Now using files instead of streams where possible
+   *                          to improve errors and added code that checks the integrity of
+   *                          translation files. Also now looking for "InputPosition" keyword
+   *                          instead of "InputGroup." The InputGroup method (which needs
+   *                          renamed later) now returns a PvlKeyword.
+   *  @history 2017-11-04 Jeannie Backer - Modified Translation input value to make a case
+   *                          insensitive comparison.
+   *  
+   *  
+   *  
    *  @todo 2005-02-15 Stuart Sides - add coded and implementation example to
-   *                                  class documentation and finish documentation
-   *                                  for protected methods and variable
+   *                       class documentation and finish documentation
+   *                       for protected methods and variable
    */
   class PvlTranslationTable {
 
diff --git a/isis/src/base/objs/SpectralDefinition2D/unitTest.cpp b/isis/src/base/objs/SpectralDefinition2D/unitTest.cpp
index a8bf384673fb6e97b6a893eef93ff76f24ab526c..e9c24b4890a2e439d4bd072eac2258c77e0057c2 100644
--- a/isis/src/base/objs/SpectralDefinition2D/unitTest.cpp
+++ b/isis/src/base/objs/SpectralDefinition2D/unitTest.cpp
@@ -21,7 +21,7 @@ int main(int argc, char *argv[]) {
   
   try {
     cerr << "Constructor given a 5x2x20 cube" << endl;
-    SpectralDefinition2D twoD("assets/calibration-test.cub");
+    SpectralDefinition2D twoD("$base/testData/SpectralDefinition2D/calibration-test.cub");
     for (int samp=1; samp<=5; ++samp) {
       for (int band=1; band<=20; ++band) {
         Spectel spec = twoD.findSpectel(samp, 0, band);
@@ -37,7 +37,7 @@ int main(int argc, char *argv[]) {
   cerr << "----- Testing searching -----" << endl << endl;
   // TODO: Needs fixing once getSpectelByWavelength is fully implemented
   try {
-    SpectralDefinition2D twoD("assets/calibration-test-smile.cub");
+    SpectralDefinition2D twoD("$base/testData/SpectralDefinition2D/calibration-test-smile.cub");
 
     Spectel spec = twoD.findSpectel(1, 1, 1);
     cerr << "Spectel at (s,b) (" << spec.sample() << ", " << spec.band() << ") : Wavelength=" <<
@@ -53,7 +53,7 @@ int main(int argc, char *argv[]) {
   }
 
   cerr << "----- Testing sections -----" << endl << endl;
-  SpectralDefinition2D twoD("assets/calibration-test-sections.cub");
+  SpectralDefinition2D twoD("$base/testData/SpectralDefinition2D/calibration-test-sections.cub");
   cerr << "Number of section: " << twoD.sectionCount() << endl;
   for (int samp=1; samp<=5; ++samp) {
     for (int band=1; band<=20; ++band) {
@@ -72,7 +72,7 @@ int main(int argc, char *argv[]) {
   //TODO: Wait until isis exception error TODOs are done in 2D
   //try {
   //  cerr << "Constructor given a 5x2x20 cube" << endl;
-  //  SpectralDefinition2D twoD("assets/calibration-test.cub");
+  //  SpectralDefinition2D twoD("$base/testData/SpectralDefinition2D/calibration-test.cub");
   //
   //  try {
   //    Spectel spec = twoD.getSpectel(1, 0, 21);
diff --git a/isis/src/base/objs/SpicePosition/SpicePosition.cpp b/isis/src/base/objs/SpicePosition/SpicePosition.cpp
index 82ff26f6b6b7d4f6175881f2e26cd6d90521693f..51cf90d9dcd6c41a53449c799251e2c6de90fed8 100644
--- a/isis/src/base/objs/SpicePosition/SpicePosition.cpp
+++ b/isis/src/base/objs/SpicePosition/SpicePosition.cpp
@@ -1483,12 +1483,24 @@ namespace Isis {
       if( p_degree == 0) {
         p_velocity = p_cacheVelocity[0];
       }
+<<<<<<< HEAD
       else {
         std::vector<double> veloc = computeVelocityInTime(p_et);
         p_velocity[0] = veloc[0];
         p_velocity[1] = veloc[1];
         p_velocity[2] = veloc[2];
       }
+=======
+      else { 
+        p_velocity[0] = ComputeVelocityInTime(WRT_X);
+        p_velocity[1] = ComputeVelocityInTime(WRT_Y);
+        p_velocity[2] = ComputeVelocityInTime(WRT_Z);
+      }
+        
+//         p_velocity[0] = functionX.DerivativeVar(rtime);
+//         p_velocity[1] = functionY.DerivativeVar(rtime);
+//         p_velocity[2] = functionZ.DerivativeVar(rtime);
+>>>>>>> dev
     }
   }
 
diff --git a/isis/src/base/objs/SpiceRotation/SpiceRotation.cpp b/isis/src/base/objs/SpiceRotation/SpiceRotation.cpp
index f4a2a47117a8a93a7f1cd75ebc5a1471a6a6f0d7..26cdc4526b3ace06c5e1d9fd045cf448ef24c4dd 100644
--- a/isis/src/base/objs/SpiceRotation/SpiceRotation.cpp
+++ b/isis/src/base/objs/SpiceRotation/SpiceRotation.cpp
@@ -2147,7 +2147,7 @@ namespace Isis {
    * @param[in]  partialVar  Variable derivative is to be with respect to
    * @param[in]  coeffIndex  Coefficient index in the polynomial fit to the variable (angle)
    *
-   * @throws IException::Programmer "Only CK and PCK partials can be calculated"
+   * @throws IException::Programmer "Only CK, DYN, and PCK partials can be calculated"
    *
    * @return @b vector<double> Vector rotated by derivative of J2000 to reference rotation.
    */
@@ -2181,7 +2181,7 @@ namespace Isis {
        dpoly = DPckPolynomial(partialVar, coeffIndex);
        break;
      default:
-      QString msg = "Only CK and PCK partials can be calculated";
+      QString msg = "Only CK, DYN, and PCK partials can be calculated";
       throw IException(IException::Programmer, msg, _FILEINFO_);
     }
 
diff --git a/isis/src/base/objs/SpiceRotation/SpiceRotation.h b/isis/src/base/objs/SpiceRotation/SpiceRotation.h
index f4c65b0850242aad0dae7c50508e98883bfc5440..d9aceecf207334a236e192c1f534c5a75e5b7e5f 100644
--- a/isis/src/base/objs/SpiceRotation/SpiceRotation.h
+++ b/isis/src/base/objs/SpiceRotation/SpiceRotation.h
@@ -208,6 +208,9 @@ namespace Isis {
    *                           constants for a PCK type. 
    *   @history 2016-06-28 Ian Humphrey - Updated documentation and coding standards. Added new
    *                           tests to unit test. Fixes #3972.
+   *   @history 2017-12-13 Ken Edmundson - Added "case DYN:" to methods ToReferencePartial and toJ2000Partial. Fixes #5251.
+   *                           This problem was found when trying to bundle M3 images that had been spiceinited with nadir
+   *                           pointing. The nadir frame is defined as a Dynamic Frame by Naif.
    *
    *  @todo Downsize using Hermite cubic spline and allow Nadir tables to be downsized again.
    *  @todo Consider making this a base class with child classes based on frame type or 
diff --git a/isis/src/base/objs/SubArea/unitTest.xml b/isis/src/base/objs/SubArea/unitTest.xml
index 1919e139329ea577654d05dff342cfbb2e7d42cf..5171f316a4df32cef7ae356b579ec565feee2670 100644
--- a/isis/src/base/objs/SubArea/unitTest.xml
+++ b/isis/src/base/objs/SubArea/unitTest.xml
@@ -16,6 +16,9 @@
     <change name="Janet Barrett" date="2009-10-15">
       Original Version
     </change>
+    <change name="Ian Humphrey" date="2017-12-07">
+      Updated default cube locations to testData area
+    </change>
   </history>
 
   <groups>
@@ -32,7 +35,7 @@
         <filter>
           *.cub
         </filter>
-        <default><item>unitTest_nomap.cub</item></default>
+	<default><item>$base/testData/SubArea/unitTest_nomap.cub</item></default>
       </parameter>
       <parameter name="FROM2">
         <type>cube</type>
@@ -46,7 +49,7 @@
         <filter>
           *.cub
         </filter>
-        <default><item>unitTest_map.cub</item></default>
+	<default><item>$base/testData/SubArea/unitTest_map.cub</item></default>
       </parameter>
       <parameter name="FROM3">
         <type>cube</type>
@@ -60,7 +63,7 @@
         <filter>
           *.cub
         </filter>
-        <default><item>unitTest_mapsimp.cub</item></default>
+	<default><item>$base/testData/SubArea/unitTest_mapsimp.cub</item></default>
       </parameter>
       <parameter name="TO">
         <type>cube</type>
diff --git a/isis/src/base/objs/Table/unitTest.cpp b/isis/src/base/objs/Table/unitTest.cpp
index 1518638441ff455b798032f5ee8038368cb3b3ff..397ffa1d54d8451ede3e6b8a8441ebcda7401576 100644
--- a/isis/src/base/objs/Table/unitTest.cpp
+++ b/isis/src/base/objs/Table/unitTest.cpp
@@ -152,7 +152,7 @@ int main(int argc, char *argv[]) {
 
     cout << "InstrumentPointing Table..." << endl;
     QString name1 = "InstrumentPointing";
-    Table instPoint(name1, "truth.cub");
+    Table instPoint(name1, "$base/testData/Table/truth.cub");
     for(int i = 0; i < instPoint.Records(); i++) {
       for(int j = 0; j < instPoint[i].Fields(); j++) {
         if(instPoint[i][j].isText()) {
@@ -167,7 +167,7 @@ int main(int argc, char *argv[]) {
     cout << endl;
     cout << "Camera Statistics Table..." << endl;
     QString name2 = "CameraStatistics";
-    Table camStats(name2, "truth.cub");
+    Table camStats(name2, "$base/testData/Table/truth.cub");
     for(int i = 0; i < camStats.Records(); i++) {
       for(int j = 0; j < camStats[i].Fields(); j++) {
         if(camStats[i][j].isText()) {
diff --git a/isis/src/base/objs/XmlToPvlTranslationManager/XmlToPvlTranslationManager.truth b/isis/src/base/objs/XmlToPvlTranslationManager/XmlToPvlTranslationManager.truth
index ae427146787efbde71b0b2d9c2fa83e587e881bf..e16b36c1692bc420524e516311e7294d2f1838bc 100644
--- a/isis/src/base/objs/XmlToPvlTranslationManager/XmlToPvlTranslationManager.truth
+++ b/isis/src/base/objs/XmlToPvlTranslationManager/XmlToPvlTranslationManager.truth
@@ -106,7 +106,7 @@ Group = SpacecraftName
   InputPosition        = (Observation_Area, Observing_System,
                           Observing_System_Component)
   InputKey             = name
-  InputKeyDependencies = tag@type:Spacecraft
+  InputKeyDependencies = tag@type|Spacecraft
   OutputPosition       = (group, instrument)
   OutputName           = SpacecraftName
   Translation          = (*, *)
@@ -124,7 +124,7 @@ Product_Observational
 Testing dependencies:
 
 Testing dependency number 1
-  Specification:    tag@type:Spacecraft
+  Specification:    tag@type|Spacecraft
 
   Dependency type:  tag
   Dependency name:  type
@@ -146,7 +146,7 @@ Group = InstrumentId
   InputPosition        = (Observation_Area, Observing_System,
                           Observing_System_Component)
   InputKey             = name
-  InputKeyDependencies = tag@type:Instrument
+  InputKeyDependencies = tag@type|Instrument
   OutputPosition       = (group, instrument)
   OutputName           = InstrumentId
   Translation          = (*, *)
@@ -164,7 +164,7 @@ Product_Observational
 Testing dependencies:
 
 Testing dependency number 1
-  Specification:    tag@type:Instrument
+  Specification:    tag@type|Instrument
 
   Dependency type:  tag
   Dependency name:  type
@@ -178,7 +178,7 @@ Dependencies failed, checking next candidate.
 Testing dependencies:
 
 Testing dependency number 1
-  Specification:    tag@type:Instrument
+  Specification:    tag@type|Instrument
 
   Dependency type:  tag
   Dependency name:  type
@@ -192,7 +192,7 @@ Dependencies failed, checking next candidate.
 Testing dependencies:
 
 Testing dependency number 1
-  Specification:    tag@type:Instrument
+  Specification:    tag@type|Instrument
 
   Dependency type:  tag
   Dependency name:  type
@@ -213,7 +213,7 @@ Group = OnboardImageAcquisitionTimeUTC
   Debug                = Null
   InputPosition        = (CaSSIS_Header, DERIVED_HEADER_DATA)
   InputKey             = OnboardImageAcquisitionTime
-  InputKeyDependencies = att@Time_Base:UTC
+  InputKeyDependencies = att@Time_Base|UTC
   OutputPosition       = (group, instrument)
   OutputName           = OnboardImageAcquisitionTimeUTC
   Translation          = (*, *)
@@ -230,7 +230,7 @@ Product_Observational
 Testing dependencies:
 
 Testing dependency number 1
-  Specification:    att@Time_Base:UTC
+  Specification:    att@Time_Base|UTC
 
   Dependency type:  att
   Dependency name:  Time_Base
@@ -250,7 +250,7 @@ Group = OnboardImageAcquisitionTimeET
   Debug                = Null
   InputPosition        = (CaSSIS_Header, DERIVED_HEADER_DATA)
   InputKey             = OnboardImageAcquisitionTime
-  InputKeyDependencies = att@Time_Base:ET
+  InputKeyDependencies = att@Time_Base|ET
   OutputPosition       = (group, instrument)
   OutputName           = OnboardImageAcquisitionTimeET
   Translation          = (*, *)
@@ -267,7 +267,7 @@ Product_Observational
 Testing dependencies:
 
 Testing dependency number 1
-  Specification:    att@Time_Base:ET
+  Specification:    att@Time_Base|ET
 
   Dependency type:  att
   Dependency name:  Time_Base
@@ -280,7 +280,7 @@ Dependencies failed, checking next candidate.
 Testing dependencies:
 
 Testing dependency number 1
-  Specification:    att@Time_Base:ET
+  Specification:    att@Time_Base|ET
 
   Dependency type:  att
   Dependency name:  Time_Base
@@ -300,7 +300,7 @@ Group = CoreBands
   Debug                = Null
   InputPosition        = (Product_Observational, File_Area_Observational,
                           Array_2D_Image, Axis_Array)
-  InputKeyDependencies = tag@axis_name:Band
+  InputKeyDependencies = tag@axis_name|Band
   InputKey             = elements
   InputDefault         = 1
   OutputPosition       = (group, CoreCube)
@@ -325,7 +325,7 @@ Group = CoreSamples
   Debug                = Null
   InputPosition        = (Product_Observational, File_Area_Observational,
                           Array_2D_Image, Axis_Array)
-  InputKeyDependencies = tag@axis_name:Sample
+  InputKeyDependencies = tag@axis_name|Sample
   InputKey             = elements
   InputKeyAttribute    = Units
   InputDefault         = 2
@@ -475,7 +475,7 @@ Group = SpacecraftName
   InputPosition        = (Observation_Area, Observing_System,
                           Observing_System_Component)
   InputKey             = name
-  InputKeyDependencies = tag@type:Spacecraft
+  InputKeyDependencies = tag@type|Spacecraft
   OutputPosition       = (group, instrument)
   OutputName           = SpacecraftName
   Translation          = (*, *)
@@ -493,7 +493,7 @@ Product_Observational
 Testing dependencies:
 
 Testing dependency number 1
-  Specification:    tag@type:Spacecraft
+  Specification:    tag@type|Spacecraft
 
   Dependency type:  tag
   Dependency name:  type
@@ -515,7 +515,7 @@ Group = InstrumentId
   InputPosition        = (Observation_Area, Observing_System,
                           Observing_System_Component)
   InputKey             = name
-  InputKeyDependencies = tag@type:Instrument
+  InputKeyDependencies = tag@type|Instrument
   OutputPosition       = (group, instrument)
   OutputName           = InstrumentId
   Translation          = (*, *)
@@ -533,7 +533,7 @@ Product_Observational
 Testing dependencies:
 
 Testing dependency number 1
-  Specification:    tag@type:Instrument
+  Specification:    tag@type|Instrument
 
   Dependency type:  tag
   Dependency name:  type
@@ -547,7 +547,7 @@ Dependencies failed, checking next candidate.
 Testing dependencies:
 
 Testing dependency number 1
-  Specification:    tag@type:Instrument
+  Specification:    tag@type|Instrument
 
   Dependency type:  tag
   Dependency name:  type
@@ -561,7 +561,7 @@ Dependencies failed, checking next candidate.
 Testing dependencies:
 
 Testing dependency number 1
-  Specification:    tag@type:Instrument
+  Specification:    tag@type|Instrument
 
   Dependency type:  tag
   Dependency name:  type
@@ -582,7 +582,7 @@ Group = OnboardImageAcquisitionTimeUTC
   Debug                = Null
   InputPosition        = (CaSSIS_Header, DERIVED_HEADER_DATA)
   InputKey             = OnboardImageAcquisitionTime
-  InputKeyDependencies = att@Time_Base:UTC
+  InputKeyDependencies = att@Time_Base|UTC
   OutputPosition       = (group, instrument)
   OutputName           = OnboardImageAcquisitionTimeUTC
   Translation          = (*, *)
@@ -599,7 +599,7 @@ Product_Observational
 Testing dependencies:
 
 Testing dependency number 1
-  Specification:    att@Time_Base:UTC
+  Specification:    att@Time_Base|UTC
 
   Dependency type:  att
   Dependency name:  Time_Base
@@ -619,7 +619,7 @@ Group = OnboardImageAcquisitionTimeET
   Debug                = Null
   InputPosition        = (CaSSIS_Header, DERIVED_HEADER_DATA)
   InputKey             = OnboardImageAcquisitionTime
-  InputKeyDependencies = att@Time_Base:ET
+  InputKeyDependencies = att@Time_Base|ET
   OutputPosition       = (group, instrument)
   OutputName           = OnboardImageAcquisitionTimeET
   Translation          = (*, *)
@@ -636,7 +636,7 @@ Product_Observational
 Testing dependencies:
 
 Testing dependency number 1
-  Specification:    att@Time_Base:ET
+  Specification:    att@Time_Base|ET
 
   Dependency type:  att
   Dependency name:  Time_Base
@@ -649,7 +649,7 @@ Dependencies failed, checking next candidate.
 Testing dependencies:
 
 Testing dependency number 1
-  Specification:    att@Time_Base:ET
+  Specification:    att@Time_Base|ET
 
   Dependency type:  att
   Dependency name:  Time_Base
@@ -669,7 +669,7 @@ Group = CoreBands
   Debug                = Null
   InputPosition        = (Product_Observational, File_Area_Observational,
                           Array_2D_Image, Axis_Array)
-  InputKeyDependencies = tag@axis_name:Band
+  InputKeyDependencies = tag@axis_name|Band
   InputKey             = elements
   InputDefault         = 1
   OutputPosition       = (group, CoreCube)
@@ -694,7 +694,7 @@ Group = CoreSamples
   Debug                = Null
   InputPosition        = (Product_Observational, File_Area_Observational,
                           Array_2D_Image, Axis_Array)
-  InputKeyDependencies = tag@axis_name:Sample
+  InputKeyDependencies = tag@axis_name|Sample
   InputKey             = elements
   InputKeyAttribute    = Units
   InputDefault         = 2
@@ -781,12 +781,12 @@ Testing error throws
 **ERROR** Input element [INSTRUMENT_IFOV] does not have an attribute named [Bad_Input_Element_Attribute].
 
 **ERROR** Failed to translate output value for [BadDependencyType].
-**ERROR** Malformed dependency specification [bad@type:Spacecraft].
-**ERROR** Dependency type specification [bad] is invalid. Valid types are [att], [tag] and [new].
+**PROGRAMMER ERROR** Malformed dependency specification [bad@type|Spacecraft].
+**PROGRAMMER ERROR** Dependency type specification [bad] is invalid. Valid types are [att], [tag] and [new].
 
 **ERROR** Failed to translate output value for [NoDependencyValue].
-**ERROR** Malformed dependency specification [bad@type].
-**ERROR** Dependency type specification [bad] is invalid. Valid types are [att], [tag] and [new].
+**PROGRAMMER ERROR** Malformed dependency specification [bad@type].
+**PROGRAMMER ERROR** Dependency type specification [bad] is invalid. Valid types are [att], [tag] and [new].
 
 **ERROR** Failed to translate output value for [NotInTranslationTable].
 **ERROR** Unable to retrieve translation group from translation table.
diff --git a/isis/src/base/objs/XmlToPvlTranslationManager/unitTest.cpp b/isis/src/base/objs/XmlToPvlTranslationManager/unitTest.cpp
index 45feca46add3d899a9a8a5a84560d353f2ccb0d0..dbd942488640188630e85f997255da1520ff680a 100644
--- a/isis/src/base/objs/XmlToPvlTranslationManager/unitTest.cpp
+++ b/isis/src/base/objs/XmlToPvlTranslationManager/unitTest.cpp
@@ -50,7 +50,7 @@ int main(void) {
     trnsStrm << "  Debug" << endl;
     trnsStrm << "  InputPosition = (Observation_Area, Observing_System, Observing_System_Component)" << endl;
     trnsStrm << "  InputKey = name" << endl;
-    trnsStrm << "  InputKeyDependencies = tag@type:Spacecraft" << endl;
+    trnsStrm << "  InputKeyDependencies = tag@type|Spacecraft" << endl;
     trnsStrm << "  OutputPosition = (group, instrument)" << endl;
     trnsStrm << "  OutputName = SpacecraftName" << endl;
     trnsStrm << "  Translation = (*,*)" << endl;
@@ -60,7 +60,7 @@ int main(void) {
     trnsStrm << "  Debug" << endl;
     trnsStrm << "  InputPosition = (Observation_Area, Observing_System, Observing_System_Component)" << endl;
     trnsStrm << "  InputKey = name" << endl;
-    trnsStrm << "  InputKeyDependencies = tag@type:Instrument" << endl;
+    trnsStrm << "  InputKeyDependencies = tag@type|Instrument" << endl;
     trnsStrm << "  OutputPosition = (group, instrument)" << endl;
     trnsStrm << "  OutputName = InstrumentId" << endl;
     trnsStrm << "  Translation = (*,*)" << endl;
@@ -77,7 +77,7 @@ int main(void) {
     trnsStrm << "  Debug" << endl;
     trnsStrm << "  InputPosition = (CaSSIS_Header, DERIVED_HEADER_DATA)" << endl;
     trnsStrm << "  InputKey = OnboardImageAcquisitionTime" << endl;
-    trnsStrm << "  InputKeyDependencies = att@Time_Base:UTC" << endl;
+    trnsStrm << "  InputKeyDependencies = att@Time_Base|UTC" << endl;
     trnsStrm << "  OutputPosition = (group, instrument)" << endl;
     trnsStrm << "  OutputName = OnboardImageAcquisitionTimeUTC" << endl;
     trnsStrm << "  Translation = (*,*)" << endl;
@@ -87,7 +87,7 @@ int main(void) {
     trnsStrm << "  Debug" << endl;
     trnsStrm << "  InputPosition = (CaSSIS_Header, DERIVED_HEADER_DATA)" << endl;
     trnsStrm << "  InputKey = OnboardImageAcquisitionTime" << endl;
-    trnsStrm << "  InputKeyDependencies = att@Time_Base:ET" << endl;
+    trnsStrm << "  InputKeyDependencies = att@Time_Base|ET" << endl;
     trnsStrm << "  OutputPosition = (group, instrument)" << endl;
     trnsStrm << "  OutputName = OnboardImageAcquisitionTimeET" << endl;
     trnsStrm << "  Translation = (*,*)" << endl;
@@ -97,7 +97,7 @@ int main(void) {
     trnsStrm << "  Debug" << endl;
     trnsStrm << "  InputPosition = (Product_Observational, File_Area_Observational," << endl;
     trnsStrm << "                Array_2D_Image, Axis_Array)" << endl;
-    trnsStrm << "  InputKeyDependencies = \"tag@axis_name:Band\"" << endl;
+    trnsStrm << "  InputKeyDependencies = \"tag@axis_name|Band\"" << endl;
     trnsStrm << "  InputKey = elements" << endl;
     trnsStrm << "  InputDefault = 1" << endl;
     trnsStrm << "  OutputPosition = (group, CoreCube)" << endl;
@@ -109,7 +109,7 @@ int main(void) {
     trnsStrm << "  Debug" << endl;
     trnsStrm << "  InputPosition = (Product_Observational, File_Area_Observational," << endl;
     trnsStrm << "                Array_2D_Image, Axis_Array)" << endl;
-    trnsStrm << "  InputKeyDependencies = \"tag@axis_name:Sample\"" << endl;
+    trnsStrm << "  InputKeyDependencies = \"tag@axis_name|Sample\"" << endl;
     trnsStrm << "  InputKey = elements" << endl;
     trnsStrm << "  InputKeyAttribute = Units" << endl;
     trnsStrm << "  InputDefault = 2" << endl;
@@ -168,7 +168,7 @@ int main(void) {
     badTrnsStrm << "Group = NoDependencyType" << endl;
     badTrnsStrm << "  InputPosition = (Observation_Area, Observing_System, Observing_System_Component)" << endl;
     badTrnsStrm << "  InputKey = name" << endl;
-    badTrnsStrm << "  InputKeyDependencies = type:Spacecraft" << endl;
+    badTrnsStrm << "  InputKeyDependencies = type|Spacecraft" << endl;
     badTrnsStrm << "  OutputPosition = (group, instrument)" << endl;
     badTrnsStrm << "  OutputName = NoDependencyType" << endl;
     badTrnsStrm << "  Translation = (*,*)" << endl;
@@ -176,7 +176,7 @@ int main(void) {
     badTrnsStrm << "Group = BadDependencyType" << endl;
     badTrnsStrm << "  InputPosition = (Observation_Area, Observing_System, Observing_System_Component)" << endl;
     badTrnsStrm << "  InputKey = name" << endl;
-    badTrnsStrm << "  InputKeyDependencies = bad@type:Spacecraft" << endl;
+    badTrnsStrm << "  InputKeyDependencies = bad@type|Spacecraft" << endl;
     badTrnsStrm << "  OutputPosition = (group, instrument)" << endl;
     badTrnsStrm << "  OutputName = BadDependencyType" << endl;
     badTrnsStrm << "  Translation = (*,*)" << endl;
@@ -205,7 +205,7 @@ int main(void) {
     invalidTrnsStrm << "Group = InstrumentIfovWithUnits" << endl;
     invalidTrnsStrm << "  InputPosition = (CaSSIS_Header, CaSSIS_General)" << endl;
     invalidTrnsStrm << "  InputKey = INSTRUMENT_IFOV" << endl;
-    invalidTrnsStrm << "  InputKeyDependencies = \"tag@name:value\"" << endl;
+    invalidTrnsStrm << "  InputKeyDependencies = \"tag@name|value\"" << endl;
     invalidTrnsStrm << "  OutputPosition = (group, instrument)" << endl;
     invalidTrnsStrm << "  OutputName = InstrumentIfovWithUnits" << endl;
     invalidTrnsStrm << "  Translation = (*,*)" << endl;
diff --git a/isis/src/cassini/apps/ciss2isis/ciss2isis.xml b/isis/src/cassini/apps/ciss2isis/ciss2isis.xml
index 53ed3052f8e7a2fa320363d4a06c554f27bd68de..f2714b5bce1ae48867cf2e873359c92cc7a96805 100644
--- a/isis/src/cassini/apps/ciss2isis/ciss2isis.xml
+++ b/isis/src/cassini/apps/ciss2isis/ciss2isis.xml
@@ -64,6 +64,10 @@
     <change name="Tracie Sucharski" date="2012-05-04">
       Added error message when input image does not contain Pds labels.
     </change>
+    <change name="Christopher Combs" date="2018-01-30">
+      Changed documentation to reflect newly added and unsupported target names
+      in translation files. Fixes #4970.
+    </change>
   </history>
   <liens>
     <item> 
@@ -105,6 +109,14 @@
           Use this parameter to select the Cassini PDS Image Label. The file must
           contain PDS labels for Cassini ISS data.  This can be a detached label file with
           pointer to the cube data.
+          
+          <strong>NOTE:</strong> While we support most Cassini ISS Targets for ingestion, some of 
+          the smaller bodies do not currently have support for parameters such as their body radii. 
+          Therefore, spiceinit will fail when run on cubes created with these targets. The current 
+          list of these target bodies is : ANTHE, AEGAEON, BERGELMIR, BESTLA, ERRIAPO, ERRIAPUS,
+          FORNJOT, GREIP, HATI, HYROKKIN, IJIRAQ, JARNSAXA, K07S4, KARI, KIVIUQ, LOGE, MUNDILFARI,
+          NARVI, PAALIAQ, SIARNAQ, SKADI, SKATHI, SKOLL, SURTUR, SUTTUNG, SUTTUNGR, TARVOS, TARQEQ,
+          THRYM, THRYMR, YMIR. 
         </description>
         <filter>
           *.lbl *.LBL
@@ -119,6 +131,9 @@
          </brief>
          <description>
            Use this parameter to select the output filename
+           
+           <strong>NOTE:</strong> The following TARGET_NAMEs will be translated to 'Sky' in the
+           output cube's PVL: SKY, DARK SKY, S8_2004, S12_2004, S13_2004, S14_2004, S18_2004.
          </description>
          <filter>
            *.cub
diff --git a/isis/src/control/apps/cnetbin2pvl/assets/image/InputNetwork.png b/isis/src/control/apps/cnetbin2pvl/assets/image/InputNetwork.png
new file mode 100644
index 0000000000000000000000000000000000000000..d244248e1c05d2e8e0863cbae7c6e44276bd4bcc
Binary files /dev/null and b/isis/src/control/apps/cnetbin2pvl/assets/image/InputNetwork.png differ
diff --git a/isis/src/control/apps/cnetbin2pvl/assets/image/OutputNetwork.png b/isis/src/control/apps/cnetbin2pvl/assets/image/OutputNetwork.png
new file mode 100644
index 0000000000000000000000000000000000000000..d6768abe39bb7ef2ada20199458f6b2a6bfa93fc
Binary files /dev/null and b/isis/src/control/apps/cnetbin2pvl/assets/image/OutputNetwork.png differ
diff --git a/isis/src/control/apps/cnetbin2pvl/assets/image/cnetbin2pvlGUI.png b/isis/src/control/apps/cnetbin2pvl/assets/image/cnetbin2pvlGUI.png
new file mode 100644
index 0000000000000000000000000000000000000000..bb366719b09ac3b04dad0122f8895e888ad001c9
Binary files /dev/null and b/isis/src/control/apps/cnetbin2pvl/assets/image/cnetbin2pvlGUI.png differ
diff --git a/isis/src/control/apps/cnetbin2pvl/cnetbin2pvl.xml b/isis/src/control/apps/cnetbin2pvl/cnetbin2pvl.xml
index bf8069148d19c851c6a6a4c289fc60745104b425..6daa77c8a6ac99d088aceb6e7224ecee3c2dda6f 100644
--- a/isis/src/control/apps/cnetbin2pvl/cnetbin2pvl.xml
+++ b/isis/src/control/apps/cnetbin2pvl/cnetbin2pvl.xml
@@ -7,8 +7,9 @@
 
   <description>
     <p>
-      This program converts an Isis3 control network file from binary into an 
-    ascii pvl formatted file.
+      This program converts an Isis3 control network file from binary into a human readable
+      utf8 pvl formatted file. The output pvl will be written as the latest Pvl version.
+      The most recent Pvl template can be found in the Control data directory under templates/controlnetworks.
     </p>
   </description>
 
@@ -26,6 +27,11 @@
     <change name="Steven Lambright" date="2011-04-05">
       Added a basic progress
     </change>
+    <change name="Adam Goins" date="2018-01-24">
+      Updated Description to reflect utf file format.
+      Added link to current Pvl template.
+      Added user example.
+    </change>
   </history>
 
   <groups>
@@ -57,6 +63,51 @@
               *.cnet *.pvl
       </filter>
     </parameter>
-    </group>    
+    </group>
   </groups>
+  <examples>
+    <example>
+      <brief>Converting a binary Control Network to a Pvl network.</brief>
+      <description>A binary V0001 Control Network converted to the latest Pvl network.</description>
+      <terminalInterface>
+        <commandLine>
+          from=/usgs/cpkgs/isis3/data/control/testData/unitTest_ControlNetVersioner_ProtoNetwork1_ProtoV0001.net to=PvlNetwork.pvl
+        </commandLine>
+        <description>
+          In this example we are converting a binary V0001 network from the test data area to a Pvl network.
+        </description>
+      </terminalInterface>
+      <inputImages>
+        <image src="assets/image/InputNetwork.png" width="500" height="500">
+          <brief>Input binary V0001 control network</brief>
+          <description>
+            This is the input network that will be ingested by cnetbin2pvl.
+          </description>
+          <thumbnail caption=" Input control network" src="assets/image/InputNetwork.png" width="200" height="165"/>
+          <parameterName>FROM</parameterName>
+        </image>
+      </inputImages>
+      <outputImages>
+        <image src="assets/image/OutputNetwork.png" width="500" height="500">
+          <brief>Output Pvl network from cnetbin2pvl</brief>
+          <description>
+            This is the Pvl network that results from running cnetbin2pvl.
+          </description>
+          <thumbnail caption="Output Pvl network that was made from the existing network." src="assets/image/OutputNetwork.png" width="200" height="165"/>
+          <parameterName>TO</parameterName>
+        </image>
+      </outputImages>
+      <guiInterfaces>
+        <guiInterface>
+          <image width="500" height="500" src="assets/image/cnetbin2pvlGUI.png">
+            <brief>Example Gui</brief>
+            <description>
+              Screenshot of GUI with parameters filled to convert a binary Control Network to a Pvl network.
+            </description>
+            <thumbnail width="200" height="165" caption="Cnetbin2pvl -gui" src="assets/image/cnetbin2pvlGUI.png"/>
+          </image>
+        </guiInterface>
+      </guiInterfaces>
+    </example>
+  </examples>
 </application>
diff --git a/isis/src/control/apps/cnetcheck/cnetcheck.cpp b/isis/src/control/apps/cnetcheck/cnetcheck.cpp
index 1f76338ca0af559262ab1ead917b24f2b7e40e8e..801d3b06873184e92fb7808b823228040eaa492c 100644
--- a/isis/src/control/apps/cnetcheck/cnetcheck.cpp
+++ b/isis/src/control/apps/cnetcheck/cnetcheck.cpp
@@ -22,7 +22,6 @@
 
 #include "Camera.h"
 #include "CameraFactory.h"
-#include "ControlCubeGraphNode.h"
 #include "ControlMeasure.h"
 #include "ControlNet.h"
 #include "ControlPoint.h"
@@ -48,15 +47,12 @@ QVector< set<QString> > findIslands(
   set<QString> &index,
   QMap< QString, set<QString> > adjCubes);
 
-QList< ControlCubeGraphNode * > checkSerialList(
-    SerialNumberList *serialNumbers, ControlNet * controlNet);
-
 void writeOutput(SerialNumberList num2cube,
                  QString filename,
                  set<QString> sns,
                  QMap< QString, set<QString> > cps);
 
-double getControlFitness(const ControlCubeGraphNode * node, double tolerance, Cube * cube);
+double getControlFitness(ControlNet &cnet, QString sn, double tolerance, Cube * cube);
 void noLatLonCheck(ControlNet &cnet, CubeManager &manager, Progress &progress,
     bool ignore, SerialNumberList &num2cube,
     set<QString> &noLatLonSerialNumbers,
@@ -178,16 +174,16 @@ void IsisMain() {
 
         // Records if the currentsnum is not in the input cube list
         bool contains = false;
-        for (int sn = 0; 
-             sn < (int)listedSerialNumbers.size()  &&  !contains; 
+        for (int sn = 0;
+             sn < (int)listedSerialNumbers.size()  &&  !contains;
              sn++) {
           if (currentsn == listedSerialNumbers[sn]) {
             contains = true;
           }
         }
         // Check if already added
-        for (int sn = 0; 
-             sn < (int)nonListedSerialNumbers.size()  &&  !contains; 
+        for (int sn = 0;
+             sn < (int)nonListedSerialNumbers.size()  &&  !contains;
              sn++) {
           if (currentsn == nonListedSerialNumbers[sn]) {
             contains = true;
@@ -220,7 +216,7 @@ void IsisMain() {
 
     bool hasList = false;
     for (set<QString>::iterator island = islands[i].begin();
-         island != islands[i].end(); 
+         island != islands[i].end();
          island++) {
       if (num2cube.hasSerialNumber(*island)) {
         outputRow(out_stream, buildRow(num2cube, *island));
@@ -295,22 +291,21 @@ void IsisMain() {
   QString coverageOp = "LowCoverage";
   int failedCoverageCheck = 0;
   if (ui.GetBoolean(QString(coverageOp).toUpper())) {
-    QList< ControlCubeGraphNode * > nodes = innet.GetCubeGraphNodes();
+    QList< QString > netSerials = innet.GetCubeSerials();
 
-    if (nodes.size() > 0) {
+    if (netSerials.size() > 0) {
       QString name(FileName(prefix + coverageOp + ".txt").expanded());
       ofstream out_stream;
       out_stream.open(name.toLatin1().data(), std::ios::out);
       out_stream.seekp(0, std::ios::beg); // Start writing from file beginning
 
       double tolerance = ui.GetDouble("TOLERANCE");
-      foreach (ControlCubeGraphNode * node, nodes) {
-        QString sn = node->getSerialNumber();
+      foreach (QString sn, netSerials) {
 
         if (num2cube.hasSerialNumber(sn)) {
           // Create a convex hull
           Cube *cube = cbman.OpenCube(num2cube.fileName(sn));
-          double controlFitness = getControlFitness(node, tolerance, cube);
+          double controlFitness = getControlFitness(innet, sn, tolerance, cube);
 
           if (controlFitness < tolerance) {
             outputRow(out_stream, buildRow(num2cube, sn, controlFitness));
@@ -375,8 +370,7 @@ void IsisMain() {
     out_stream.seekp(0, std::ios::beg);   //Start writing from beginning of file
 
     for (int sn = 0; sn < (int)nonListedSerialNumbers.size(); sn++) {
-      int validMeasureCount = innet.getGraphNode(
-          nonListedSerialNumbers[sn])->getValidMeasures().size();
+      int validMeasureCount = innet.GetValidMeasuresInCube(nonListedSerialNumbers[sn]).size();
       QString rowText = nonListedSerialNumbers[sn] + " (Valid Measures: " +
           toString(validMeasureCount) + ")";
       outputRow(out_stream, rowText);
@@ -504,8 +498,8 @@ QVector< set<QString> > findIslands(set<QString> & index,
       // Find the first connected unvisited node
       QString nextNode = "";
       set<QString> neighbors = adjCubes[str_stack.top()];
-      for (set<QString>::iterator i = neighbors.begin(); 
-           i != neighbors.end(); 
+      for (set<QString>::iterator i = neighbors.begin();
+           i != neighbors.end();
            i++) {
         if (index.count(*i) == 1) {
           nextNode = *i;
@@ -542,7 +536,7 @@ void writeOutput(SerialNumberList num2cube, QString filename,
   out_stream.seekp(0, std::ios::beg);   //Start writing from beginning of file
 
   for (set<QString>::iterator sn = sns.begin();
-       sn != sns.end(); 
+       sn != sns.end();
        sn++) {
     outputRow(out_stream, buildRow(num2cube, *sn, cps[*sn]));
   }
@@ -551,12 +545,12 @@ void writeOutput(SerialNumberList num2cube, QString filename,
 }
 
 
-double getControlFitness(const ControlCubeGraphNode * node, double tolerance, Cube * cube) {
+double getControlFitness(ControlNet &cnet, QString sn, double tolerance, Cube * cube) {
   double controlFitness = 0;
 
   static  geos::geom::GeometryFactory geosFactory;
   geos::geom::CoordinateSequence * pts = new geos::geom::CoordinateArraySequence();
-  QList< ControlMeasure * > measures = node->getMeasures();
+  QList< ControlMeasure * > measures = cnet.GetMeasuresInCube(sn);
 
   // Populate pts with a list of control points
   foreach (ControlMeasure * measure, measures) {
@@ -572,7 +566,6 @@ double getControlFitness(const ControlCubeGraphNode * node, double tolerance, Cu
 
     // Calculate the area of the convex hull
     double convexArea = convexHull->getArea();
-    QString sn = node->getSerialNumber();
     double cubeArea = cube->sampleCount() * cube->lineCount();
 
     controlFitness = convexArea / cubeArea;
@@ -594,16 +587,14 @@ void noLatLonCheck(ControlNet &cnet, CubeManager &manager, Progress &progress,
     QMap< QString, set<QString> > &noLatLonControlPoints) {
 
   // Set calculating progress
-  QList<ControlCubeGraphNode *> graphNodes = cnet.GetCubeGraphNodes();
-  if (graphNodes.size() > 0) {
+  QList< QString > netSerials = cnet.GetCubeSerials();
+  if (netSerials.size() > 0) {
     progress.SetText("Checking for No Lat/Lon");
-    progress.SetMaximumSteps(graphNodes.size());
+    progress.SetMaximumSteps(netSerials.size());
     progress.CheckStatus();
   }
 
-  for (int sn = 0; sn < graphNodes.size(); sn++) {
-    ControlCubeGraphNode *graphNode = graphNodes[sn];
-    QString serialNumber = graphNode->getSerialNumber();
+  foreach (QString serialNumber, netSerials) {
 
     if (num2cube.hasSerialNumber(serialNumber)) {
       Cube *cube = manager.OpenCube(num2cube.fileName(serialNumber));
@@ -618,7 +609,7 @@ void noLatLonCheck(ControlNet &cnet, CubeManager &manager, Progress &progress,
         createdCamera = false;
       }
 
-      QList< ControlMeasure * > measures = graphNode->getMeasures();
+      QList< ControlMeasure * > measures = cnet.GetMeasuresInCube(serialNumber);
       for (int cm = 0; cm < measures.size(); cm++) {
         ControlMeasure *measure = measures[cm];
         ControlPoint *point = measure->Parent();
@@ -671,4 +662,3 @@ QString buildRow(SerialNumberList &serials, QString sn, double value) {
 void outputRow(ofstream &outStream, QString rowText) {
   outStream << rowText << "\n";
 }
-
diff --git a/isis/src/control/apps/cnetdiff/cnetdiff.cpp b/isis/src/control/apps/cnetdiff/cnetdiff.cpp
index 74106cf6109678b8c4e7622e05a8be0adedeb034..dfb48196f12689cbeac14fa6f1c39cd1214da285 100644
--- a/isis/src/control/apps/cnetdiff/cnetdiff.cpp
+++ b/isis/src/control/apps/cnetdiff/cnetdiff.cpp
@@ -9,7 +9,6 @@
 #include "ControlMeasure.h"
 #include "ControlNet.h"
 #include "ControlNetDiff.h"
-#include "ControlNetFile.h"
 #include "ControlNetVersioner.h"
 #include "ControlPoint.h"
 #include "IException.h"
@@ -17,7 +16,6 @@
 #include "PvlGroup.h"
 
 
-
 using namespace std;
 using namespace Isis;
 
@@ -29,7 +27,7 @@ PvlGroup ignorekeys;
 void CompareKeywords(const PvlKeyword &pvl1, const PvlKeyword &pvl2);
 void CompareGroups(const PvlContainer &pvl1, const PvlContainer &pvl2);
 void Compare(const PvlObject &point1, const PvlObject &point2);
-void Compare(LatestControlNetFile *net1, LatestControlNetFile *net2);
+void Compare(const QString net1Path, const QString net2Path);
 
 void IsisMain() {
   UserInterface &ui = Application::GetUserInterface();
@@ -41,11 +39,6 @@ void IsisMain() {
     differenceReason = "";
     filesMatch = true;
 
-    LatestControlNetFile *net1 = ControlNetVersioner::Read(
-        ui.GetFileName("FROM"));
-    LatestControlNetFile *net2 = ControlNetVersioner::Read(
-        ui.GetFileName("FROM2"));
-
     if(ui.WasEntered("DIFF")) {
       Pvl diffFile(ui.GetFileName("DIFF"));
 
@@ -64,10 +57,7 @@ void IsisMain() {
       ignorekeys += PvlKeyword("DateTime", "true");
     }
 
-    Compare(net1, net2);
-
-    delete net1;
-    delete net2;
+    Compare(ui.GetFileName("FROM"), ui.GetFileName("FROM2"));
 
     PvlGroup differences("Results");
     if(filesMatch) {
@@ -115,9 +105,12 @@ void IsisMain() {
   }
 }
 
-void Compare(LatestControlNetFile *net1, LatestControlNetFile *net2) {
-  Pvl net1Pvl(net1->toPvl());
-  Pvl net2Pvl(net2->toPvl());
+void Compare(QString net1Path, QString net2Path) {
+  ControlNetVersioner net1(net1Path);
+  ControlNetVersioner net2(net2Path);
+
+  Pvl net1Pvl(net1.toPvl());
+  Pvl net2Pvl(net2.toPvl());
 
   PvlObject &net1Obj = net1Pvl.findObject("ControlNetwork");
   PvlObject &net2Obj = net2Pvl.findObject("ControlNetwork");
diff --git a/isis/src/control/apps/cnetedit/cnetedit.cpp b/isis/src/control/apps/cnetedit/cnetedit.cpp
index 65ae762af7b8e54b5ce284a9dfcefcb140254bf2..7bcc4de68ebcba02c0dde4cf87494c9b7c4c47b3 100644
--- a/isis/src/control/apps/cnetedit/cnetedit.cpp
+++ b/isis/src/control/apps/cnetedit/cnetedit.cpp
@@ -8,7 +8,6 @@
 #include <QString>
 #include <QTextStream>
 
-#include "ControlCubeGraphNode.h"
 #include "ControlMeasure.h"
 #include "ControlNet.h"
 #include "ControlNetValidMeasure.h"
@@ -137,7 +136,7 @@ void IsisMain() {
     QString msg = "The control network [" + cnetInput.expanded() + "] entered for CNET does not exist.";
     throw IException(IException::User, msg, _FILEINFO_);
   }
-  
+
   // If the user wants to keep a log, go ahead and populate it with all the
   // existing ignored points and measures
   ControlNet cnet(ui.GetFileName("CNET"));
@@ -878,15 +877,13 @@ void lockMeasures(ControlNet &cnet,
 void checkAllMeasureValidity(ControlNet &cnet, QString cubeList) {
   SerialNumberList serialNumbers(cubeList);
 
-  QList<ControlCubeGraphNode *> graphNodes = cnet.GetCubeGraphNodes();
+  QList<QString> cnetSerials = cnet.GetCubeSerials();
   Progress progress;
   progress.SetText("Checking Measure Validity");
-  progress.SetMaximumSteps(graphNodes.size());
+  progress.SetMaximumSteps(cnetSerials.size());
   progress.CheckStatus();
 
-  for (int sn = 0; sn < graphNodes.size(); sn++) {
-    ControlCubeGraphNode *graphNode = graphNodes[sn];
-    QString serialNumber = graphNode->getSerialNumber();
+  foreach (QString serialNumber, cnetSerials) {
 
     Cube *cube = NULL;
     Camera *camera = NULL;
@@ -911,7 +908,7 @@ void checkAllMeasureValidity(ControlNet &cnet, QString cubeList) {
       }
     }
 
-    QList<ControlMeasure *> measures = graphNode->getMeasures();
+    QList<ControlMeasure *> measures = cnet.GetMeasuresInCube(serialNumber);
     for (int cm = 0; cm < measures.size(); cm++) {
       ControlMeasure *measure = measures[cm];
       ControlPoint *point = measure->Parent();
@@ -1076,5 +1073,3 @@ void EditDefFile(void) {
 
   GuiEditFile::EditFile(ui, sDefFile);
 }
-
-
diff --git a/isis/src/control/apps/cnethist/tsts/case01/Makefile b/isis/src/control/apps/cnethist/tsts/case01/Makefile
index 41c0958143d57ff712163a57afe0310217a3c5ec..07ae6cfa85d51320bdac61fdb392c949e70feaf7 100644
--- a/isis/src/control/apps/cnethist/tsts/case01/Makefile
+++ b/isis/src/control/apps/cnethist/tsts/case01/Makefile
@@ -11,8 +11,8 @@ commands:
 	$(APPNAME) clist=$(OUTPUT)/net.lis \
 	to=hist.txt \
 	bin_width = 0.1 >& $(OUTPUT)/temp.txt;
-	cat $(OUTPUT)/temp.txt | grep -v "Processed" | grep -v "Loading Control Points" \
-		| grep -v "Program" > $(OUTPUT)/error.pvl;
+	cat $(OUTPUT)/temp.txt | grep -v "Processed" | grep -v "Reading Control Points" \
+		| grep -v "Adding Control Points to Network"  | grep -v "Program" > $(OUTPUT)/error.pvl;
 	cat hist.txt  \
 	  | sed 's/\/[^,]*\/\([^,\/]*\.net\)/\1/g' \
 	  | sed 's/\([0-9][0-9]*\.[0-9][0-9][0-9][0-9][0-9]\)\([0-9][0-9]*\)/\1/g' \
diff --git a/isis/src/control/apps/cnetwinnow/cnetwinnow.cpp b/isis/src/control/apps/cnetwinnow/cnetwinnow.cpp
index 724060c5c0d81d3da1e60f146b4d390e5a8bdf01..6510a966bc67d6d98b3122672f10a1ca0722c725 100644
--- a/isis/src/control/apps/cnetwinnow/cnetwinnow.cpp
+++ b/isis/src/control/apps/cnetwinnow/cnetwinnow.cpp
@@ -22,7 +22,6 @@
 #include "SerialNumber.h"
 #include "SerialNumberList.h"
 #include "UserInterface.h"
-#include "ControlCubeGraphNode.h"
 
 #include "stdio.h"
 #include "string.h"
@@ -30,7 +29,7 @@
 using namespace std;
 using namespace Isis;
 
-void cubeConvexHullAndMeasures(QString &serialNum,ControlNet &net, double &area, int &validMeasures, 
+void cubeConvexHullAndMeasures(QString &serialNum,ControlNet &net, double &area, int &validMeasures,
                           QList <ControlMeasure *> *measToIgnor=NULL);
 
 
@@ -41,14 +40,14 @@ void IsisMain() {
 
   //build a histogram from the control net
   Progress progress;
-  
+
   //read the ControlNet
   ControlNet net(ui.GetFileName("CNET"), &progress);
   //read the file list
   SerialNumberList serialNumList(ui.GetFileName("FROMLIST"), true, &progress);
   //check to make sure all the serial numbers in the net have an associated file name
   QList<QString> cubeSerials = net.GetCubeSerials();
-  bool serFlag=true; 
+  bool serFlag=true;
   for (int i=0;i<cubeSerials.size();i++) {
     QString msg = "No file paths for the following serial numbers:\n";
     if (!serialNumList.hasSerialNumber(cubeSerials[i])) {
@@ -90,7 +89,7 @@ void IsisMain() {
     throw IException(IException::User, msg, _FILEINFO_);
     return;
   }
-  
+
   //analyze the histrogram to determine the boundaries between
     //inocent, suspect, and guilty measures
   double percentile80 = hist.Percent(80);
@@ -104,11 +103,11 @@ void IsisMain() {
   }
 
   if ( bin <0) {  //if Histogram is being inconsistent throw an error
-    string msg = "Histogram resturns the 80th percentile of " + IString(percentile80) + 
+    string msg = "Histogram resturns the 80th percentile of " + IString(percentile80) +
                  " but has no bin containing values that small";
     throw IException(IException::Programmer, msg, _FILEINFO_);
   }
-  
+
 
     //Now work forward back through the bins looking for local minima and maxima
     //  The idea hear is that if the residuals really belong to a Gaussian distribution
@@ -136,7 +135,7 @@ void IsisMain() {
     //look for significant bumps
   for (int i=1;i<nBins-2;i++) {
     //if i is a local minima
-    if ( binHeight[i-1] > binHeight[i] && binHeight[i] < binHeight[i+1] ) { 
+    if ( binHeight[i-1] > binHeight[i] && binHeight[i] < binHeight[i+1] ) {
       for (int j=i+1;j<nBins-1;j++) {  //find the next local maxima
         //if j is a local maxima
         if ( binHeight[j-1] < binHeight[j] && binHeight[j] > binHeight[j+1] ) {
@@ -144,7 +143,7 @@ void IsisMain() {
            //calculate the height of the bump as a ratio of the height of the local minima
            if (binHeight[i] >0) ratio = (binHeight[j]-binHeight[i])/binHeight[i];
            else ratio = DBL_MAX;
-           //if the first significant bumps save them 
+           //if the first significant bumps save them
            if (ratio > suspectRatio && inocentSuspectB ==0) inocentSuspectB = binCenter[i];
            if (ratio >  guiltyRatio &&  suspectGuiltyB ==0)  suspectGuiltyB = binCenter[i];
            i=j;  //advance to the j position
@@ -156,26 +155,26 @@ void IsisMain() {
     if (inocentSuspectB != 0.0 && suspectGuiltyB != 0.0) break;
   }
 
-  
+
 
     //rembering that the inocentSuspectB can not be less than the user defined floor
-  if ( inocentSuspectB < ui.GetDouble("SUSPECT_FLOOR") ) 
+  if ( inocentSuspectB < ui.GetDouble("SUSPECT_FLOOR") )
     inocentSuspectB = ui.GetDouble("SUSPECT_FLOOR");
     //add also remembering that suspectGuiltyB can not be greater than the user defined ceiling
-  if ( suspectGuiltyB > ui.GetDouble("GUILTY_FLOOR") ) 
+  if ( suspectGuiltyB > ui.GetDouble("GUILTY_FLOOR") )
     suspectGuiltyB = ui.GetDouble("GUILTY_FLOOR");
     //rembering that the suspectGuiltyB can not be less than the user defined floor either
-  if ( suspectGuiltyB < ui.GetDouble("SUSPECT_FLOOR") ) 
+  if ( suspectGuiltyB < ui.GetDouble("SUSPECT_FLOOR") )
     suspectGuiltyB = ui.GetDouble("SUSPECT_FLOOR");
     //finally make sure that inocentSuspectB <= suspectGuiltyB
   if (inocentSuspectB > suspectGuiltyB) inocentSuspectB = suspectGuiltyB;
     //the boundaries between inocent, suspect, and guilty measures have been established
 
   //get an ordered list of all the suspect and guilty measures
-  QList <ControlMeasure *> suspectMeasures 
+  QList <ControlMeasure *> suspectMeasures
        = net.sortedMeasureList(&ControlMeasure::GetResidualMagnitude,inocentSuspectB,DBL_MAX);
 
- 
+
   //print csv column headers
   fprintf(guiltyFile,/*"Guilty points (Residual Magnitudes > %lf) that could not be ignored.\n"
              "PtID:  Point ID Name\n"
@@ -218,15 +217,15 @@ void IsisMain() {
   //we will need a hash of the image original convex hulls and
     //numbers of measures, it will be built on the fly
   QHash<QString,QList<double> > originalCubeStats;
-  
+
 
   //we will also need to know how many islands we started with
-  int numInitialIslands = net.GetNodeConnections().size();
+  int numInitialIslands = net.GetSerialConnections().size();
 
   //user parameters for allowing measure rejection
   double hullReductionLimit = ui.GetDouble("HULL_REDUCTION_PERCENT")/100.0;
   double measureReductionLimit = ui.GetDouble("MEASURE_REDUCTION_PERCENT")/100.0;
-  
+
 
   //now work through the list from the end to the begining setting measures to ignor if we are able
   progress.SetText("Winnowing points");
@@ -234,7 +233,7 @@ void IsisMain() {
   progress.CheckStatus();
   for (int i = suspectMeasures.size() - 1; i > -1; i--) {
     //if the measure to be ignored is one of the last two active measures of a point then both of
-     //the measures and the point must be ignored together so we need the flexibility to test 
+     //the measures and the point must be ignored together so we need the flexibility to test
      //two points at a time
     QList<ControlMeasure*> measGroup;
     bool hullFlag[2]; //hull test pass flags
@@ -251,7 +250,7 @@ void IsisMain() {
     if ( suspectMeasures[i]->Parent()->GetNumValidMeasures() <= 2) {
       QList<ControlMeasure *> tempList = suspectMeasures[i]->Parent()->getMeasures();
       //pull the valid measures out of the list
-      for (int j=0;j<tempList.size();j++) 
+      for (int j=0;j<tempList.size();j++)
         if(!tempList[j]->IsIgnored())
           measGroup.push_back(tempList[j]);
     }
@@ -318,9 +317,9 @@ void IsisMain() {
     for (int j=0; j<measGroup.size(); j++) {
       measGroup[j]->SetIgnored(true);
     }
-    
+
     //if the number of islands has increased the network has split
-    if (net.GetNodeConnections().size() > numInitialIslands) islandFlag = false; //test failed
+    if (net.GetSerialConnections().size() > numInitialIslands) islandFlag = false; //test failed
     else islandFlag = true; //test passed
 
     //Check to see if the network has split
@@ -367,10 +366,10 @@ void IsisMain() {
                     measReduction[j]*100.0,
                     measOriNum[j],
                     measNum[j],
-                    !islandFlag ? "Yes":"No", 
-                    ableToEditFlag[j] ? "Yes":"No", 
+                    !islandFlag ? "Yes":"No",
+                    ableToEditFlag[j] ? "Yes":"No",
                     !groupFlag ? "Yes":"No");
-    
+
       if (!groupFlag && measGroup[j]->GetResidualMagnitude() >= suspectGuiltyB)
         fputs(line, guiltyFile);
       else  //print the stats of ingored points to the other report
@@ -386,7 +385,7 @@ void IsisMain() {
         //of an object point then ignor the point too
       if (measGroup.size() >1)
         measGroup[0]->Parent()->SetIgnored(true);
-    }      
+    }
     progress.CheckStatus();
   }
 
@@ -403,7 +402,7 @@ void IsisMain() {
 
 
 
-void cubeConvexHullAndMeasures(QString &serialNum,ControlNet &net, double &area, int &validMeasures, 
+void cubeConvexHullAndMeasures(QString &serialNum,ControlNet &net, double &area, int &validMeasures,
                           QList <ControlMeasure *> *measToIgnor) {
 
   int i,j,firstIndex=0;
@@ -418,7 +417,7 @@ void cubeConvexHullAndMeasures(QString &serialNum,ControlNet &net, double &area,
     //skip measure in the ToIgnor list
     ignorMeas=false;
     if (measToIgnor != NULL) {
-      for (j=0; j<measToIgnor->size() && !ignorMeas; j++) {  
+      for (j=0; j<measToIgnor->size() && !ignorMeas; j++) {
         if (cubeMeasures[i] == (*measToIgnor)[j]) {
           ignorMeas = true;
           break;
@@ -431,10 +430,10 @@ void cubeConvexHullAndMeasures(QString &serialNum,ControlNet &net, double &area,
       firstIndex =i;
     }
     //build point sequence
-    pts->add(geos::geom::Coordinate(cubeMeasures[i]->GetSample(), cubeMeasures[i]->GetLine())); 
+    pts->add(geos::geom::Coordinate(cubeMeasures[i]->GetSample(), cubeMeasures[i]->GetLine()));
   }
   //Adding the first active point again closes the "linestring"
-  pts->add(geos::geom::Coordinate(cubeMeasures[firstIndex]->GetSample(), 
+  pts->add(geos::geom::Coordinate(cubeMeasures[firstIndex]->GetSample(),
                                   cubeMeasures[firstIndex]->GetLine()));
   if (pts->size() >= 4) {
     // Calculate the convex hull
@@ -449,4 +448,3 @@ void cubeConvexHullAndMeasures(QString &serialNum,ControlNet &net, double &area,
   validMeasures = pts->size()-1; //subtract one because one point is in there twice
   return;
 }
-
diff --git a/isis/src/control/apps/jigsaw/tsts/errors/Makefile b/isis/src/control/apps/jigsaw/tsts/errors/Makefile
index e7acb64e826cca76da39ea4082ce819bca6716ed..38427ba0c8106b61004f4d34b0f9682589a150b2 100644
--- a/isis/src/control/apps/jigsaw/tsts/errors/Makefile
+++ b/isis/src/control/apps/jigsaw/tsts/errors/Makefile
@@ -15,14 +15,14 @@ include $(ISISROOT)/make/isismake.tsts
 
 commands:
 # TEST A: CAMSOLVE=None and SPSOLVE=None
-	echo -e "Error Test A:" > $(OUTPUT)/error.txt;
+	echo -e "Error Test A:" > $(OUTPUT)/error_temp.txt;
 	if [[ `$(APPNAME) \
 	  fromlist=$(INPUT)/empty.lis \
 	  cnet=$(INPUT)/empty.net \
 	  onet=$(OUTPUT)/out.net \
 	  camsolve=None \
 	  spsolve=None \
-	  2>> $(OUTPUT)/error.txt \
+	  2>> $(OUTPUT)/error_temp.txt \
 	  > /dev/null` ]]; \
 	then \
 	  true; \
@@ -30,47 +30,64 @@ commands:
 # TEST B: exception occurs when performing bundle adjust
 #         TODO: This still needs to be tested.
 # TEST C: SOLVETARGETBODY=yes and TBPARAMETERS file missing Target object
-	echo -e "Error Test C:" >> $(OUTPUT)/error.txt;
+	echo -e "Error Test C:" >> $(OUTPUT)/error_temp.txt;
 	if [[ `$(APPNAME) \
 	  fromlist=$(INPUT)/empty.lis \
 	  cnet=$(INPUT)/empty.net \
 	  onet=$(OUTPUT)/out.net \
 	  solvetargetbody=yes \
 	  tbparameters=$(INPUT)/invalidTargetParameters.pvl \
-	  2>> $(OUTPUT)/error.txt \
+	  2>> $(OUTPUT)/error_temp.txt \
 	  > /dev/null` ]]; \
 	then \
 	  true; \
 	fi;
 # TEST D: SOLVETARGETBODY=yes and # of parameters to solve is 0
-	echo -e "Error Test D:" >> $(OUTPUT)/error.txt;
+	echo -e "Error Test D:" >> $(OUTPUT)/error_temp.txt;
 	if [[ `$(APPNAME) \
 	  fromlist=$(INPUT)/empty.lis \
 	  cnet=$(INPUT)/empty.net \
 	  onet=$(OUTPUT)/out.net \
 	  solvetargetbody=yes \
 	  tbparameters=$(INPUT)/zeroTargetParameters.pvl \
-	  2>> $(OUTPUT)/error.txt \
+	  2>> $(OUTPUT)/error_temp.txt \
 	  > /dev/null` ]]; \
 	then \
 	  true; \
 	fi;
 # TEST F: CNET=[invalid control net file]
+<<<<<<< HEAD
 	echo -e "Error Test F:" >> $(OUTPUT)/error.txt;
 	if [[ `$(APPNAME) \
 	  fromlist=$(INPUT)/empty.lis \
 	  cnet=$(INPUT)/empty.net \
+=======
+	echo -e "Error Test F:" >> $(OUTPUT)/error_temp.txt;
+	if [[ `$(APPNAME) \
+	  fromlist=$(INPUT)/empty.lis \
+	  cnet=$(INPUT)/notacnet.net \
+>>>>>>> dev
 	  onet=$(output)/out.net \
 	  radius=yes \
 	  spsolve=positions \
 	  point_radius_sigma=500 \
 	  spacecraft_position_sigma=500 \
 	  camera_angles_sigma=2 \
+<<<<<<< HEAD
 	  2>> $(OUTPUT)/error.txt \
+=======
+	  2>> $(OUTPUT)/error_temp.txt \
+>>>>>>> dev
 	  > /dev/null` ]]; \
 	then \
 	  true; \
 	fi;
+<<<<<<< HEAD
 # Remove full paths from the errors file
 	sed -i "s/$(INPUT)\///" $(OUTPUT)/error.txt;
 	sed -i "s/$(OUTPUT)\///" $(OUTPUT)/error.txt;
+=======
+# Remove paths from errors file
+	$(SED) 's/\(\[\)\/.*\(input\)/\1\2/g' $(OUTPUT)/error_temp.txt > $(OUTPUT)/error.txt;
+	$(RM) $(OUTPUT)/error_temp.txt;
+>>>>>>> dev
diff --git a/isis/src/control/objs/ControlMeasure/ControlMeasure.cpp b/isis/src/control/objs/ControlMeasure/ControlMeasure.cpp
index e71f1918700916378244ebe7a48b41e6b6c36224..e5365755b8da926ea493e636c0bf642e13d73a27 100644
--- a/isis/src/control/objs/ControlMeasure/ControlMeasure.cpp
+++ b/isis/src/control/objs/ControlMeasure/ControlMeasure.cpp
@@ -33,7 +33,6 @@
 #include "ControlCubeGraphNode.h"
 #include "IString.h"
 #include "iTime.h"
-#include "ControlNetFileV0002.pb.h"
 #include "SpecialPixel.h"
 
 using namespace std;
@@ -54,75 +53,6 @@ namespace Isis {
     p_jigsawRejected = false;
     p_ignore = false;
 
-    p_sample = 0.0;
-    p_line = 0.0;
-  }
-
-
-  /**
-   * Converts the protocol buffer version of the measure into a real
-   *   ControlMeasure
-   *
-   * @param other The control measure to copy all of the values from
-   */
-  ControlMeasure::ControlMeasure(
-      const ControlPointFileEntryV0002_Measure &protoBuf) {
-    InitializeToNull();
-
-    p_serialNumber = new QString(protoBuf.serialnumber().c_str());
-    p_chooserName = new QString(protoBuf.choosername().c_str());
-    p_dateTime = new QString(protoBuf.datetime().c_str());
-    p_loggedData = new QVector<ControlMeasureLogData>();
-
-    switch (protoBuf.type()) {
-      case ControlPointFileEntryV0002_Measure::Candidate:
-        p_measureType = ControlMeasure::Candidate;
-        break;
-      case ControlPointFileEntryV0002_Measure::Manual:
-        p_measureType = ControlMeasure::Manual;
-        break;
-      case ControlPointFileEntryV0002_Measure::RegisteredPixel:
-        p_measureType = ControlMeasure::RegisteredPixel;
-        break;
-      case ControlPointFileEntryV0002_Measure::RegisteredSubPixel:
-        p_measureType = ControlMeasure::RegisteredSubPixel;
-        break;
-    }
-
-    p_editLock = protoBuf.editlock();
-    p_jigsawRejected = protoBuf.jigsawrejected();
-    p_ignore = protoBuf.ignore();
-    p_sample = protoBuf.sample();
-    p_line = protoBuf.line();
-//    ground = protoBuf.???
-
-    if (protoBuf.has_diameter())
-      p_diameter = protoBuf.diameter();
-
-    if (protoBuf.has_apriorisample())
-      p_aprioriSample = protoBuf.apriorisample();
-
-    if (protoBuf.has_aprioriline())
-      p_aprioriLine = protoBuf.aprioriline();
-
-    if (protoBuf.has_samplesigma())
-      p_sampleSigma = protoBuf.samplesigma();
-
-    if (protoBuf.has_linesigma())
-      p_lineSigma = protoBuf.linesigma();
-
-    if (protoBuf.has_sampleresidual())
-      p_sampleResidual = protoBuf.sampleresidual();
-
-    if (protoBuf.has_lineresidual())
-      p_lineResidual = protoBuf.lineresidual();
-
-    for (int dataEntry = 0;
-        dataEntry < protoBuf.log_size();
-        dataEntry ++) {
-      ControlMeasureLogData logEntry(protoBuf.log(dataEntry));
-      p_loggedData->push_back(logEntry);
-    }
   }
 
 
@@ -160,6 +90,11 @@ namespace Isis {
 
   //! initialize pointers and other data to NULL
   void ControlMeasure::InitializeToNull() {
+
+    // Previously these were initialized to 0.0 in the constructor.
+    p_sample = Null;
+    p_line = Null;
+
     p_serialNumber = NULL;
     p_chooserName = NULL;
     p_dateTime = NULL;
@@ -471,6 +406,7 @@ namespace Isis {
    */
   ControlMeasure::Status ControlMeasure::SetResidual(double sampResidual,
       double lineResidual) {
+        
     MeasureModified();
     p_sampleResidual = sampResidual;
     p_lineResidual   = lineResidual;
@@ -504,8 +440,8 @@ namespace Isis {
    */
   void ControlMeasure::SetLogData(ControlMeasureLogData data) {
     if (!data.IsValid()) {
-      IString msg = "Cannot set log data with invalid information stored in "
-          "the ControlMeasureLogData";
+      QString msg = "Cannot set log data with invalid information stored in "
+                    "the ControlMeasureLogData";
       throw IException(IException::Programmer, msg, _FILEINFO_);
     }
 
@@ -584,10 +520,10 @@ namespace Isis {
     }
 
     if (!updated) {
-      IString msg = "Unable to update the log data for [" +
-          newLogData.DataTypeToName(newLogData.GetDataType()) + "] because this"
-          " control measure does not have log data for this value. Please use "
-          "SetLogData instead";
+      QString msg = "Unable to update the log data for ["
+                    + newLogData.DataTypeToName(newLogData.GetDataType()) + "] because this"
+                    " control measure does not have log data for this value. Please use "
+                    "SetLogData instead";
       throw IException(IException::Programmer, msg, _FILEINFO_);
     }
   }
@@ -618,6 +554,10 @@ namespace Isis {
     }
   }
 
+  //! Returns true if the choosername is not empty.
+  bool ControlMeasure::HasChooserName() const {
+    return !p_chooserName->isEmpty();
+  }
 
   //! Return the serial number of the cube containing the coordinate
   QString ControlMeasure::GetCubeSerialNumber() const {
@@ -635,6 +575,12 @@ namespace Isis {
     }
   }
 
+  //! Returns true if the datetime is not empty.
+  bool ControlMeasure::HasDateTime() const {
+    return !p_dateTime->isEmpty();
+  }
+
+
 
   //! Return the diameter of the crater in pixels (0 implies no crater)
   double ControlMeasure::GetDiameter() const {
@@ -738,8 +684,8 @@ namespace Isis {
     }
 
     if (!validField) {
-      IString msg = "Cannot test IsStatisticallyRelevant on Measure Data ["
-          + IString(field) + "]";
+      QString msg = "Cannot test IsStatisticallyRelevant on Measure Data ["
+                    + QString(field) + "]";
       throw IException(IException::Programmer, msg, _FILEINFO_);
     }
 
@@ -802,7 +748,7 @@ namespace Isis {
 
   QString ControlMeasure::GetPointId() const {
     if (parentPoint == NULL) {
-      IString msg = "Measure has no containing point";
+      QString msg = "Measure has no containing point";
       throw IException(IException::User, msg, _FILEINFO_);
     }
 
@@ -848,22 +794,42 @@ namespace Isis {
   }
 
 
+  /**
+   * Return all of the log data for the measure.
+   *
+   * @return @b QVector<ControlMeasureLogData> All of the log data for the measure.
+   */
+  QVector<ControlMeasureLogData> ControlMeasure::GetLogDataEntries() const {
+    QVector<ControlMeasureLogData> logs;
+    if (p_loggedData) {
+      logs = *p_loggedData;
+    }
+    return logs;
+  }
+
+
   //! One Getter to rule them all
   double ControlMeasure::GetMeasureData(QString data) const {
-    if (data == "SampleResidual")
+    if (data == "SampleResidual") {
       return p_sampleResidual;
-    else if (data == "LineResidual")
+    }
+    else if (data == "LineResidual") {
       return p_lineResidual;
-    else if (data == "Type")
+    }
+    else if (data == "Type") {
       return p_measureType;
-    else if (data == "IsMeasured")
+    }
+    else if (data == "IsMeasured") {
       return IsMeasured();
-    else if (data == "IsRegistered")
+    }
+    else if (data == "IsRegistered") {
       return IsRegistered();
-    else if (data == "Ignore")
+    }
+    else if (data == "Ignore") {
       return p_ignore;
+    }
     else {
-      IString msg = data + " passed to GetMeasureData but is invalid";
+      QString msg = data + " passed to GetMeasureData but is invalid";
       throw IException(IException::Programmer, msg, _FILEINFO_);
     }
   }
@@ -958,8 +924,7 @@ namespace Isis {
    */
   ControlMeasure::MeasureType ControlMeasure::StringToMeasureType(QString str) {
 
-    IString err = "String [";
-    err += IString(str) + "] can not be converted to a MeasureType";
+    QString err = "String [" + str + "] can not be converted to a MeasureType";
 
     str = str.toLower();
     MeasureType measureType;
@@ -1019,6 +984,7 @@ namespace Isis {
     return sPrintable;
   }
 
+
   /**
    * Obtain a string representation of the MeasureType
    *
@@ -1114,12 +1080,12 @@ namespace Isis {
    *
    * @author sprasad (4/20/2010)
    *
-   * @internal 
+   * @internal
    *   @history 2010-06-24 Tracie Sucharski, Added new keywords
    *   @history 2012-07-26 Tracie Sucharski, Fixed bug in comparison of chooserName and dateTime,
    *                          comparison was between the pointers instead of the data and added
    *                          comparisons for missing member data.
-   *             
+   *
    *
    * @param pMeasure - Control Measure to be compared against
    *
@@ -1150,77 +1116,6 @@ namespace Isis {
         pMeasure.p_measuredEphemerisTime == p_measuredEphemerisTime;
   }
 
-
-  ControlPointFileEntryV0002_Measure ControlMeasure::ToProtocolBuffer() const {
-    ControlPointFileEntryV0002_Measure protoBufMeasure;
-
-    protoBufMeasure.set_serialnumber(GetCubeSerialNumber().toLatin1().data());
-    switch (GetType()) {
-      case ControlMeasure::Candidate:
-        protoBufMeasure.set_type(ControlPointFileEntryV0002_Measure::Candidate);
-        break;
-      case ControlMeasure::Manual:
-        protoBufMeasure.set_type(ControlPointFileEntryV0002_Measure::Manual);
-        break;
-      case ControlMeasure::RegisteredPixel:
-        protoBufMeasure.set_type(ControlPointFileEntryV0002_Measure::RegisteredPixel);
-        break;
-      case ControlMeasure::RegisteredSubPixel:
-        protoBufMeasure.set_type(ControlPointFileEntryV0002_Measure::RegisteredSubPixel);
-        break;
-    }
-
-    if (GetChooserName() != "") {
-      protoBufMeasure.set_choosername(GetChooserName().toLatin1().data());
-    }
-    if (GetDateTime() != "") {
-      protoBufMeasure.set_datetime(GetDateTime().toLatin1().data());
-    }
-    if (IsEditLocked())
-      protoBufMeasure.set_editlock(true);
-
-    if (IsIgnored())
-      protoBufMeasure.set_ignore(true);
-
-    if (IsRejected())
-      protoBufMeasure.set_jigsawrejected(true);
-
-    if (GetSample() != 0.)
-      protoBufMeasure.set_sample(GetSample());
-
-    if(GetLine() != 0.)
-      protoBufMeasure.set_line(GetLine());
-
-    if (GetSampleResidual() != Isis::Null)
-      protoBufMeasure.set_sampleresidual(GetSampleResidual());
-
-    if (GetLineResidual() != Isis::Null)
-      protoBufMeasure.set_lineresidual(GetLineResidual());
-
-    if (GetDiameter() != Isis::Null)
-      protoBufMeasure.set_diameter(GetDiameter());
-
-    if (GetAprioriSample() != Isis::Null)
-      protoBufMeasure.set_apriorisample(GetAprioriSample());
-
-    if (GetAprioriLine() != Isis::Null)
-      protoBufMeasure.set_aprioriline(GetAprioriLine());
-
-    if (GetSampleSigma() != Isis::Null)
-      protoBufMeasure.set_samplesigma(GetSampleSigma());
-
-    if (GetLineSigma() != Isis::Null)
-      protoBufMeasure.set_linesigma(GetLineSigma());
-
-    ControlMeasureLogData logEntry;
-    foreach(logEntry, *p_loggedData) {
-      *protoBufMeasure.add_log() = logEntry.ToProtocolBuffer();
-    }
-
-    return protoBufMeasure;
-  }
-
-
   void ControlMeasure::MeasureModified() {
     *p_dateTime = "";
     *p_chooserName = "";
diff --git a/isis/src/control/objs/ControlMeasure/ControlMeasure.h b/isis/src/control/objs/ControlMeasure/ControlMeasure.h
index 78c073002f4eecfa997a397035f7d67846d2bc91..60959b396f1249d605d2e3844cbb4910d723315d 100644
--- a/isis/src/control/objs/ControlMeasure/ControlMeasure.h
+++ b/isis/src/control/objs/ControlMeasure/ControlMeasure.h
@@ -36,7 +36,6 @@ namespace Isis {
   class Camera;
   class ControlMeasureLogData;
   class ControlPoint;
-  class ControlPointFileEntryV0002_Measure;
   class ControlCubeGraphNode;
   class PvlGroup;
   class PvlKeyword;
@@ -152,13 +151,13 @@ namespace Isis {
    *                              does math on special pixels.
    *   @history 2011-04-11 Steven Lambright - Added GetLogValue for convenience
    *   @history 2011-07-05 Debbie A. Cook - Removed editLock checks from methods
-   *                              SetCamera, SetRejected, and SetResidual and 
+   *                              SetCamera, SetRejected, and SetResidual and
    *                              changed all other editLock tests to use
    *                              IsEditLocked method instead of the private
    *                              member, p_editLock, directly.  Also added
    *                              a check for an implicit lock if the measure is
    *                              the reference measure of the parent point in
-   *                              the IsEditLocked method.  
+   *                              the IsEditLocked method.
    *   @history 2011-07-29 Jai Rideout, Steven Lambright, and Eric Hyer - Made
    *                           this inherit from QObject to get destroyed()
    *                           signal
@@ -167,6 +166,15 @@ namespace Isis {
    *                           data and added comparisons for missing member data.
    *   @history 2012-08-11 Tracie Sucharski, Add computed and measured ephemeris time set to Null
    *                           in InitializeToNull.
+   *   @history 2017-12-19 Adam Goins - Added "HasX()" accessors to ControlMeasure.
+   *   @history 2017-12-20 Jesse Mapel - Implemented GetLogDataEntries method for use in
+   *                           ControlNetVersioner refactor.
+   *   @history 2017-12-21 Adam Goins - Removed protobuf references.
+   *   @history 2018-01-04 Adam Goins - Moved sample/line initialization from the constructor
+   *                           to the InitToNull() method.
+   *   @history 2018-01-05 Adam Goins - Added HasDateTime() and HasChooserName() methods to allow
+   *                           to allow the value of these variables to be read without being
+   *                           overriden if they're empty. (Getters override if they're empty).
    */
   class ControlMeasure : public QObject {
 
@@ -237,7 +245,6 @@ namespace Isis {
       };
 
       ControlMeasure();
-      ControlMeasure(const ControlPointFileEntryV0002_Measure &);
       ControlMeasure(const ControlMeasure &other);
       ~ControlMeasure();
 
@@ -275,8 +282,10 @@ namespace Isis {
       double GetAprioriSample() const;
       Isis::Camera *Camera() const;
       QString GetChooserName() const;
+      bool HasChooserName() const;
       QString GetCubeSerialNumber() const;
       QString GetDateTime() const;
+      bool HasDateTime() const;
       double GetDiameter() const;
       ControlMeasureLogData GetLogData(long dataType) const;
       bool IsEditLocked() const;
@@ -318,8 +327,6 @@ namespace Isis {
       bool operator != (const Isis::ControlMeasure &pMeasure) const;
       bool operator == (const Isis::ControlMeasure &pMeasure) const;
 
-      ControlPointFileEntryV0002_Measure ToProtocolBuffer() const;
-
     private: // methods
       void InitializeToNull();
       void MeasureModified();
diff --git a/isis/src/control/objs/ControlMeasure/ControlMeasure.truth b/isis/src/control/objs/ControlMeasure/ControlMeasure.truth
index 02cb277b9f8362c25ba06fa74eca6d50094ff550..ad853c16d8534919ad34bb4d363f372fea6c9bd9 100644
--- a/isis/src/control/objs/ControlMeasure/ControlMeasure.truth
+++ b/isis/src/control/objs/ControlMeasure/ControlMeasure.truth
@@ -7,7 +7,7 @@ Object = ControlNetwork
   Created      = Yesterday
   LastModified = Yesterday
   Description  = Null
-  Version      = 3
+  Version      = 5
 
   Object = ControlPoint
     PointType   = Free
@@ -35,7 +35,7 @@ Object = ControlNetwork
   Created      = Yesterday
   LastModified = Yesterday
   Description  = Null
-  Version      = 3
+  Version      = 5
 
   Object = ControlPoint
     PointType   = Free
@@ -73,7 +73,7 @@ Object = ControlNetwork
   Created      = Yesterday
   LastModified = Yesterday
   Description  = Null
-  Version      = 3
+  Version      = 5
 
   Object = ControlPoint
     PointType   = Free
@@ -111,7 +111,7 @@ Object = ControlNetwork
   Created      = Yesterday
   LastModified = Yesterday
   Description  = Null
-  Version      = 3
+  Version      = 5
 
   Object = ControlPoint
     PointType   = Free
@@ -150,7 +150,7 @@ Object = ControlNetwork
   Created      = Yesterday
   LastModified = Yesterday
   Description  = Null
-  Version      = 3
+  Version      = 5
 
   Object = ControlPoint
     PointType   = Free
@@ -188,7 +188,7 @@ Object = ControlNetwork
   Created      = Yesterday
   LastModified = Yesterday
   Description  = Null
-  Version      = 3
+  Version      = 5
 
   Object = ControlPoint
     PointType   = Free
@@ -256,3 +256,8 @@ Test 13
 Testing != operator on two different measures
 Measure1 != Measure2   TRUE
 **PROGRAMMER ERROR** Cannot set log data with invalid information stored in the ControlMeasureLogData.
+
+Test 14: Testing accessor methods
+Measure was not rejected.
+Measure HasChooserName():  true
+Measure HasDateTime():  true
diff --git a/isis/src/control/objs/ControlMeasure/unitTest.cpp b/isis/src/control/objs/ControlMeasure/unitTest.cpp
index ac2aeb6ca0989eb2478f2c468e022a713cf54eee..b1c57e534f8dbd634f39cdea90f6fbfaefcd0f9e 100644
--- a/isis/src/control/objs/ControlMeasure/unitTest.cpp
+++ b/isis/src/control/objs/ControlMeasure/unitTest.cpp
@@ -1,6 +1,7 @@
 #include <iostream>
 #include <float.h>
 
+#include <QDebug>
 #include <QList>
 #include <QString>
 #include <QStringList>
@@ -26,13 +27,14 @@ int main() {
    * @history 2010-08-12  Tracie Sucharski,  Keywords changed AGAIN..
    * @history 2010-10-18  Tracie Sucharski,  Set EditLock to false before
    *                         Test 5 so type can be updatem.
-   * @history 2010-11-03  Mackenzie Boyd,  Added test for PrintableClassData() 
-   * @history 2012-07-26  Tracie Sucharski,  Added test for == and != operators. 
+   * @history 2010-11-03  Mackenzie Boyd,  Added test for PrintableClassData()
+   * @history 2012-07-26  Tracie Sucharski,  Added test for == and != operators.
+   * @history 2017-12-21  Kristin Berry - Added tests for accessor methods.
    *
   */
   Preference::Preferences(true);
   ControlMeasure m;
-  cout << "Test 1 Default values" << endl;
+  qDebug() << "Test 1 Default values";
   m.SetChooserName("ManuallySet");
   m.SetDateTime("2001-01-01T00:00:00");
   outit(m);
@@ -49,55 +51,54 @@ int main() {
   m.SetLineSigma(.21);
   m.SetChooserName("Bob");
   m.SetDateTime("2005-05-03T00:00:00");
-  cout << "Test 2" << endl;
+  qDebug() << "Test 2";
   outit(m);
 
   m.SetType(ControlMeasure::Candidate);
   m.SetChooserName("Bob");
   m.SetDateTime("2005-05-03T00:00:00");
-  cout << "Test 3" << endl;
+  qDebug() << "Test 3";
   outit(m);
 
   m.SetType(ControlMeasure::Manual);
   m.SetChooserName("Bob");
   m.SetDateTime("2005-05-03T00:00:00");
   m.SetEditLock(true);
-  cout << "Test 4" << endl;
+  qDebug() << "Test 4";
   outit(m);
 
   m.SetType(ControlMeasure::RegisteredPixel);
   m.SetChooserName("Bob");
   m.SetDateTime("2005-05-03T00:00:00");
   m.SetEditLock(false);
-  cout << "Test 5" << endl;
+  qDebug() << "Test 5";
   outit(m);
 
   m.SetType(ControlMeasure::RegisteredSubPixel);
   m.SetChooserName("Bob");
   m.SetDateTime("2005-05-03T00:00:00");
-  cout << "Test 6" << endl;
+  qDebug() << "Test 6";
   outit(m);
 
-  m.SetLogData(
-    ControlMeasureLogData(ControlMeasureLogData::GoodnessOfFit, 5.0)
-  );
+  m.SetLogData(ControlMeasureLogData(ControlMeasureLogData::GoodnessOfFit, 5.0));
   m.SetChooserName("Bob");
   m.SetDateTime("2005-05-03T00:00:00");
 
   // Dump of all variables
-  cout << "Test 7" << endl;
+  qDebug() << "Test 7";
   QList< QStringList > printableMeasureData = m.PrintableClassData();
   QStringList nameValuePair;
   foreach(nameValuePair, printableMeasureData) {
-    cout << nameValuePair.at(0).toStdString() << "=" <<
-        nameValuePair.at(1).toStdString() << endl;
+    // qDebug adds uneccessary spacing after each << so we use cout to display this data.
+    std::cout << nameValuePair.at(0).toLatin1().data() << "=" <<
+        nameValuePair.at(1).toLatin1().data() <<std::endl;
   }
 
-  cout << "Test 8" << endl;
-  cout << m.GetLogData(ControlMeasureLogData::GoodnessOfFit).
-      GetNumericalValue() << endl;
-  cout << m.GetLogValue(ControlMeasureLogData::GoodnessOfFit).
-      toDouble() << endl;
+  qDebug() << "Test 8";
+  qDebug() << m.GetLogData(ControlMeasureLogData::GoodnessOfFit).
+      GetNumericalValue();
+  qDebug() << m.GetLogValue(ControlMeasureLogData::GoodnessOfFit).
+      toDouble();
 
   // Test parent editLock on reference measure
   ControlPoint *cp = new ControlPoint("Parent1");
@@ -112,60 +113,76 @@ int main() {
   cp->Add(&m2);
   cp->SetRefMeasure(&m2);
   cp->SetEditLock(true);
-  cout << endl << "Test 9" << endl;
-  cout << "Testing point editLock on reference measure" << endl;
+  qDebug() << "";
+  qDebug() << "Test 9";
+  qDebug() << "Testing point editLock on reference measure";
   if (m2.IsEditLocked())
-    cout << "Reference point ok" << endl;
+    qDebug() << "Reference point ok";
   else
-    cout << "Reference point failed" << endl;
+    qDebug() << "Reference point failed";
   if (m.IsEditLocked())
-    cout << "Nonreference point failed" << endl;
+    qDebug() << "Nonreference point failed";
   else
-    cout << "Nonreference point ok" << endl;
+    qDebug() << "Nonreference point ok";
 
-  cout << endl << "Test 10" << endl;
-  cout << "Testing == operator on the same measures" << endl;
+  qDebug() << "";
+  qDebug() << "Test 10";
+  qDebug() << "Testing == operator on the same measures";
   if (m == m) {
-    cout << "Measure1 == Measure1   TRUE" << endl;
+    qDebug() << "Measure1 == Measure1   TRUE";
   }
   else {
-    cout << "Measure1 == Measure1   FALSE" << endl;
+    qDebug() << "Measure1 == Measure1   FALSE";
   }
 
-  cout << endl << "Test 11" << endl;
-  cout << "Testing == operator on two different measures" << endl;
+  qDebug() << "";
+  qDebug() << "Test 11";
+  qDebug() << "Testing == operator on two different measures";
   if (m == m2) {
-    cout << "Measure1 == Measure2   TRUE" << endl;
+    qDebug() << "Measure1 == Measure2   TRUE";
   }
   else {
-    cout << "Measure1 == Measure2   FALSE" << endl;
+    qDebug() << "Measure1 == Measure2   FALSE";
   }
 
-  cout << endl << "Test 12" << endl;
-  cout << "Testing != operator on the same measures" << endl;
+  qDebug() << "";
+  qDebug() << "Test 12";
+  qDebug() << "Testing != operator on the same measures";
   if (m != m) {
-    cout << "Measure1 != Measure1   TRUE" << endl;
+    qDebug() << "Measure1 != Measure1   TRUE";
   }
   else {
-    cout << "Measure1 != Measure1   FALSE" << endl;
+    qDebug() << "Measure1 != Measure1   FALSE";
   }
 
-  cout << endl << "Test 13" << endl;
-  cout << "Testing != operator on two different measures" << endl;
+  qDebug() << "";
+  qDebug() << "Test 13";
+  qDebug() << "Testing != operator on two different measures";
   if (m != m2) {
-    cout << "Measure1 != Measure2   TRUE" << endl;
+    qDebug() << "Measure1 != Measure2   TRUE";
   }
   else {
-    cout << "Measure1 != Measure2   FALSE" << endl;
+    qDebug() << "Measure1 != Measure2   FALSE";
   }
 
-
   try {
     m.SetLogData(ControlMeasureLogData());
   }
   catch (IException &e) {
     e.print();
   }
+
+  qDebug() << "";
+  qDebug() << "Test 14: Testing accessor methods";
+
+  if (m.IsRejected()) {
+      qDebug() << "Measure was rejected.";
+  }
+  else {
+      qDebug() << "Measure was not rejected.";
+  }
+  qDebug() << "Measure HasChooserName(): " << m.HasChooserName();
+  qDebug() << "Measure HasDateTime(): " << m.HasDateTime();
 }
 
 void outit(ControlMeasure &m) {
@@ -181,7 +198,6 @@ void outit(ControlMeasure &m) {
   net.SetModifiedDate("Yesterday");
   net.Write("./tmp.net", true);
   Pvl tmp("./tmp.net");
-  cout << "Printing measure:\n" << tmp << "\nDone printing measure." << endl
-       << endl;
+  std::cout << "Printing measure:\n" << tmp << "\nDone printing measure.\n" << std::endl;
   remove("./tmp.net");
 }
diff --git a/isis/src/control/objs/ControlMeasureLogData/ControlMeasureLogData.cpp b/isis/src/control/objs/ControlMeasureLogData/ControlMeasureLogData.cpp
index 88cc8442fb8042d997c8d86a9903fed6e62c48ca..fc0b5482073b944b51eea29535674aee3b5d9067 100644
--- a/isis/src/control/objs/ControlMeasureLogData/ControlMeasureLogData.cpp
+++ b/isis/src/control/objs/ControlMeasureLogData/ControlMeasureLogData.cpp
@@ -2,8 +2,6 @@
 
 #include <QVariant>
 
-#include "ControlNetFileV0001.pb.h"
-#include "ControlNetFileV0002.pb.h"
 #include "PvlKeyword.h"
 #include "SpecialPixel.h"
 
@@ -57,35 +55,6 @@ namespace Isis {
       p_numericalValue = toDouble(keywordRep[0]);
   }
 
-
-  /**
-   * This creates an instance based on the protocol buffer. This assumes the
-   *   protocol buffer is correct and does no extra validation.
-   *
-   * @param protoBuf The protocol buffer version of a log data
-   */
-  ControlMeasureLogData::ControlMeasureLogData(
-      const ControlNetLogDataProtoV0001_Point_Measure_DataEntry &protoBuf) {
-    p_dataType = (NumericLogDataType)protoBuf.datatype();
-    p_numericalValue = protoBuf.datavalue();
-  }
-
-
-  /**
-   * This creates an instance based on the protocol buffer. This assumes the
-   *   protocol buffer is correct and does no extra validation.
-   *
-   * @param protoBuf The protocol buffer version of a log data
-   */
-  ControlMeasureLogData::ControlMeasureLogData(
-      const ControlPointFileEntryV0002_Measure_MeasureLogData &protoBuf) {
-    if(protoBuf.has_doubledatatype()) {
-      p_dataType = (NumericLogDataType)protoBuf.doubledatatype();
-      p_numericalValue = protoBuf.doubledatavalue();
-    }
-  }
-
-
   /**
    * Copy constructor.
    *
@@ -193,29 +162,6 @@ namespace Isis {
       return PvlKeyword();
   }
 
-
-  /**
-   * This converts the log data to a protocol buffer object. This should be
-   *   understandable by the constructor that takes a protocol buffer object.
-   *
-   * @return A protocol buffer representation of this log data
-   */
-  ControlPointFileEntryV0002_Measure_MeasureLogData
-      ControlMeasureLogData::ToProtocolBuffer() const {
-    if(!IsValid()) {
-      IString msg = "Cannot write an invalid log data entry to binary format";
-      throw IException(IException::Programmer, msg, _FILEINFO_);
-    }
-
-    ControlPointFileEntryV0002_Measure_MeasureLogData protoBufDataEntry;
-
-    protoBufDataEntry.set_doubledatatype(p_dataType);
-    protoBufDataEntry.set_doubledatavalue(p_numericalValue);
-
-    return protoBufDataEntry;
-  }
-
-
   /**
    * This converts a string to a log data type and is useful for converting Pvl
    * keywords to Numeric Log Data Type.
diff --git a/isis/src/control/objs/ControlMeasureLogData/ControlMeasureLogData.h b/isis/src/control/objs/ControlMeasureLogData/ControlMeasureLogData.h
index 4392ddb15464c3a5c461e7ae1e92f278ad2443fc..c790d33fc2fe7ae4dad052f6725f50eaaa8cf65d 100644
--- a/isis/src/control/objs/ControlMeasureLogData/ControlMeasureLogData.h
+++ b/isis/src/control/objs/ControlMeasureLogData/ControlMeasureLogData.h
@@ -27,8 +27,6 @@ class QString;
 class QVariant;
 
 namespace Isis {
-  class ControlNetLogDataProtoV0001_Point_Measure_DataEntry;
-  class ControlPointFileEntryV0002_Measure_MeasureLogData;
   class PvlKeyword;
 
   /**
@@ -47,6 +45,8 @@ namespace Isis {
    *   @history 2011-04-04 Steven Lambright - Added error checking to the
    *                         conversion to protocol buffer
    *   @history 2011-04-11 Steven Lambright - Added GetValue method
+   *   @history 2017-12-21 Adam Goins - Removed protobuf references.
+   *   @history 2018-01-04 Adam Goins - Added variable names to method declarations.
    */
   class ControlMeasureLogData {
     public:
@@ -118,26 +118,22 @@ namespace Isis {
          */
         Obsolete_AverageResidual           = 8
       };
+
       /**
        * This value must be > the largest enumerated value in this type or
        * convertions to and from Pvl will not work.
        */
       static const int MaximumNumericLogDataType = 9;
 
-
       ControlMeasureLogData();
-      ControlMeasureLogData(NumericLogDataType);
-      ControlMeasureLogData(PvlKeyword);
-      ControlMeasureLogData(NumericLogDataType, double value);
-      ControlMeasureLogData(
-          const ControlNetLogDataProtoV0001_Point_Measure_DataEntry &);
-      ControlMeasureLogData(
-          const ControlPointFileEntryV0002_Measure_MeasureLogData &);
+      ControlMeasureLogData(NumericLogDataType dataType);
+      ControlMeasureLogData(PvlKeyword keywordRep);
+      ControlMeasureLogData(NumericLogDataType dataType, double value);
       ControlMeasureLogData(const ControlMeasureLogData & other);
       ~ControlMeasureLogData();
 
-      void SetNumericalValue(double);
-      void SetDataType(NumericLogDataType);
+      void SetNumericalValue(double value);
+      void SetDataType(NumericLogDataType newDataType);
 
       double GetNumericalValue() const;
       NumericLogDataType GetDataType() const;
@@ -145,11 +141,8 @@ namespace Isis {
       bool IsValid() const;
       PvlKeyword ToKeyword() const;
 
-      ControlPointFileEntryV0002_Measure_MeasureLogData
-          ToProtocolBuffer() const;
-
       NumericLogDataType NameToDataType(QString name) const;
-      QString DataTypeToName(NumericLogDataType) const;
+      QString DataTypeToName(NumericLogDataType type) const;
 
     private:
       void Init();
diff --git a/isis/src/control/objs/ControlNet/ControlNet.cpp b/isis/src/control/objs/ControlNet/ControlNet.cpp
index f85cd0eb9b2a9e05115841dca810c803ee3c5282..646f4a3d0c8c890acbd56c0317698928975cbae7 100644
--- a/isis/src/control/objs/ControlNet/ControlNet.cpp
+++ b/isis/src/control/objs/ControlNet/ControlNet.cpp
@@ -23,11 +23,11 @@
 #include "Application.h"
 #include "CameraFactory.h"
 #include "ControlMeasure.h"
-#include "ControlNetFile.h"
 #include "ControlNetVersioner.h"
 #include "ControlPoint.h"
 #include "ControlCubeGraphNode.h"
 #include "Distance.h"
+#include "FileName.h"
 #include "IException.h"
 #include "iTime.h"
 #include "Progress.h"
@@ -41,9 +41,9 @@ using namespace boost::numeric::ublas;
 
 
 namespace Isis {
-  
+
   void ControlNet::nullify() {
-    
+
     points = NULL;
     cubeGraphNodes = NULL;
     pointIds = NULL;
@@ -52,21 +52,22 @@ namespace Isis {
 
   //!Creates an empty ControlNet object
   ControlNet::ControlNet() {
-    
+
     nullify();
 
     points = new QHash< QString, ControlPoint * >;
     cubeGraphNodes = new QHash< QString, ControlCubeGraphNode * >;
     pointIds = new QStringList;
 
-    m_ownPoints = true; 
+    m_ownPoints = true;
+
     p_created = Application::DateTime();
     p_modified = Application::DateTime();
   }
 
 
   ControlNet::ControlNet(const ControlNet &other) {
-    
+
     nullify();
 
     points = new QHash< QString, ControlPoint * >;
@@ -78,7 +79,7 @@ namespace Isis {
       AddPoint(newPoint);
     }
 
-    m_ownPoints = true; 
+    m_ownPoints = true;
 
     p_targetName = other.p_targetName;
     p_targetRadii = other.p_targetRadii;
@@ -99,7 +100,7 @@ namespace Isis {
    * @param progress A pointer to the progress of reading in the control points
    */
   ControlNet::ControlNet(const QString &ptfile, Progress *progress) {
-    
+
     nullify();
 
     points = new QHash< QString, ControlPoint * >;
@@ -107,7 +108,7 @@ namespace Isis {
     pointIds = new QStringList;
 
     m_ownPoints = true;
-    
+
     try {
       ReadControl(ptfile, progress);
     }
@@ -120,36 +121,36 @@ namespace Isis {
 
  /**
   *  @brief Destructor removes allocated memory
-  * 
-  * @author Kris Becker 
+  *
+  * @author Kris Becker
   */
   ControlNet::~ControlNet() {
-    
+
     clear();
 
     delete points;
     delete cubeGraphNodes;
     delete pointIds;
 
-    nullify(); 
+    nullify();
   }
- 
+
 
  /**
   *  @brief Clear the contents of this object
-  * 
+  *
   *  The contents of the ControlNet object are deleted. The internal variables
   *  that hold the contents are not. See the destructor.
-  * 
+  *
   * @author Kris Becker
   */
   void ControlNet::clear() {
 
-    // Now must also own points to delete them. 
+    // Now must also own points to delete them.
     if (points) {
       if (GetNumPoints() > 0) {
         if (m_ownPoints) {
-          QHashIterator<QString, ControlPoint*> i(*points); 
+          QHashIterator<QString, ControlPoint*> i(*points);
           while (i.hasNext()) {
             i.next();
             delete(*points)[i.key()];
@@ -173,31 +174,31 @@ namespace Isis {
     if (pointIds) {
       pointIds->clear();
     }
- 
+
     return;
   }
 
 
   /**
-   * @brief Transfer ownership of all points to caller 
-   *  
-   * This method is used to transfer ownership to the caller. This method is not 
-   * reintrant in the sense that if someone else has already made this call, it is 
-   * an error to attempt to take ownership again. 
-   *  
-   * Note that it now becomes the responsibility of the caller to delete all the 
-   * pointers to ControlPoints that are returned in the list. 
-   *  
-   * WARNING!!! This call alone can create a situation where the owner could 
+   * @brief Transfer ownership of all points to caller
+   *
+   * This method is used to transfer ownership to the caller. This method is not
+   * reintrant in the sense that if someone else has already made this call, it is
+   * an error to attempt to take ownership again.
+   *
+   * Note that it now becomes the responsibility of the caller to delete all the
+   * pointers to ControlPoints that are returned in the list.
+   *
+   * WARNING!!! This call alone can create a situation where the owner could
    * delete point memory after the point list is exported from this class creating
    * a problem. For this reason, the clear() method be called!!!
-   * 
-   * @author Kris Becker 
-   * 
+   *
+   * @author Kris Becker
+   *
    * @return QList<ControlPoint*> Returns the list of all control points to caller
    */
     QList< ControlPoint * > ControlNet::take() {
-      
+
       // First check to see if someone else has taken ownership
       if (!m_ownPoints) {
         throw IException(IException::Programmer, "Ownership has already been taken",
@@ -236,48 +237,35 @@ namespace Isis {
    *                           they are read into memory instead of setting
    *                           parent prematurely to be able to set the radii
    *                           in ControlPoint.
+   * @history 2017-12-21 Jesse Mapel - Modified to use the ControlNetVersioner.
    *
    */
   void ControlNet::ReadControl(const QString &filename, Progress *progress) {
-    
-    LatestControlNetFile *fileData = ControlNetVersioner::Read(filename);
-
-    ControlNetFileHeaderV0002 &header = fileData->GetNetworkHeader();
-    p_networkId     = header.networkid().c_str();
-    if (header.has_targetname()) {
-      SetTarget(header.targetname().c_str());
-    }
-    else {
-      SetTarget("");
-    }
 
-    p_userName      = header.username().c_str();
-    p_created       = header.created().c_str();
-    p_modified      = header.lastmodified().c_str();
-    p_description   = header.description().c_str();
+    FileName cnetFileName(filename);
+    ControlNetVersioner versionedReader(cnetFileName, progress);
 
-    QList< ControlPointFileEntryV0002 > &fileDataPoints =
-      fileData->GetNetworkPoints();
+    SetTarget( versionedReader.targetName() );
+    p_networkId   = versionedReader.netId();
+    p_userName    = versionedReader.userName();
+    p_created     = versionedReader.creationDate();
+    p_modified    = versionedReader.lastModificationDate();
+    p_description = versionedReader.description();
 
-    if (fileDataPoints.size() > 0) {
-      if (progress != NULL) {
-        progress->SetText("Loading Control Points...");
-        progress->SetMaximumSteps(fileDataPoints.size());
-        progress->CheckStatus();
-      }
+    int numPoints = versionedReader.numPoints();
 
-      ControlPointFileEntryV0002 fileDataPoint;
-      foreach(fileDataPoint, fileDataPoints) {
-        AddPoint(new ControlPoint(fileDataPoint,
-                 p_targetRadii[0], p_targetRadii[1], p_targetRadii[2]));
+    if (progress) {
+      progress->SetText("Adding Control Points to Network...");
+      progress->SetMaximumSteps(numPoints);
+      progress->CheckStatus();
+    }
 
-        if (progress != NULL)
-          progress->CheckStatus();
+    for (int i = 0; i < numPoints; i++) {
+      AddPoint( versionedReader.takeFirstPoint() );
+      if (progress) {
+        progress->CheckStatus();
       }
     }
-
-    delete fileData;
-    fileData = NULL;
   }
 
 
@@ -288,41 +276,41 @@ namespace Isis {
    * @param pvl    Boolean indicating whether to write in pvl format
    *               (Default=false)
    *
-   * @throws Isis::iException::Programmer - "Invalid Net
-   *             Enumeration"
-   * @throws Isis::iException::Io - "Unable to write PVL
-   *             infomation to file"
-   *
    * @history 2010-10-05 Tracie Sucharski - Renamed old WRite method to WritePvl
    *                     and created this new method to determine format to
    *                     be written.
+   * @history 2017-12-21 Jesse Mapel - Modified to use new ControlNetVersioner.
    */
   void ControlNet::Write(const QString &ptfile, bool pvl) {
-    LatestControlNetFile *fileData = new LatestControlNetFile();
-
-    ControlNetFileHeaderV0002 &header = fileData->GetNetworkHeader();
+    ControlNetVersioner versionedWriter(this);
 
-    header.set_networkid(p_networkId.toLatin1().data());
-    header.set_targetname(p_targetName.toLatin1().data());
-    header.set_username(p_userName.toLatin1().data());
-    header.set_created(p_created.toLatin1().data());
-    header.set_lastmodified(p_modified.toLatin1().data());
-    header.set_description(p_description.toLatin1().data());
-
-    QList< ControlPointFileEntryV0002 > &fileDataPoints =
-      fileData->GetNetworkPoints();
-
-    for (int i = 0; i < pointIds->size(); i++) {
-      ControlPoint *point = points->value(pointIds->at(i));
+    if (pvl) {
+      Pvl network;
+      try {
+        network = versionedWriter.toPvl();
+      }
+      catch (IException &e) {
+        QString msg = "Failed to convert control network to Pvl format.";
+        throw IException(e, IException::Programmer, msg, _FILEINFO_);
+      }
 
-      ControlPointFileEntryV0002 pointFileEntry = point->ToFileEntry();
-      fileDataPoints.append(pointFileEntry);
+      try {
+        network.write(ptfile);
+      }
+      catch (IException &e) {
+        QString msg = "Failed writing control network to file [" + ptfile + "]";
+        throw IException(e, IException::Io, msg, _FILEINFO_);
+      }
+    }
+    else {
+      try {
+        versionedWriter.write(FileName(ptfile));
+      }
+      catch (IException &e) {
+        QString msg = "Failed writing control network to file [" + ptfile + "]";
+        throw IException(e, IException::Io, msg, _FILEINFO_);
+      }
     }
-
-    ControlNetVersioner::Write(ptfile, *fileData, pvl);
-
-    delete fileData;
-    fileData = NULL;
   }
 
 
@@ -366,9 +354,9 @@ namespace Isis {
    * this measure as its first.
    *
    * @param measure The measure added to the network.
-   * 
+   *
    * @throws IException::Programmer "NULL measure passed to ControlNet::AddControlCubeGraphNode!"
-   * @throws IException::Programmer "Control measure with NULL parent passed to 
+   * @throws IException::Programmer "Control measure with NULL parent passed to
    *     ControlNet::AddControlCubeGraphNode!"
    * @throws IException::Programmer "ControlNet does not contain the point."
    */
@@ -429,9 +417,9 @@ namespace Isis {
    * measure's serial number to reflect the unignoration.
    *
    * @param measure The measure unignored from the network.
-   * 
+   *
    * @throws IException::Programmer "NULL measure passed to ControlNet::AddControlCubeGraphNode!"
-   * @throws IException::Programmer "Control measure with NULL parent passed to 
+   * @throws IException::Programmer "Control measure with NULL parent passed to
    *     ControlNet::AddControlCubeGraphNode!"
    * @throws IException::Programmer "ControlNet does not contain the point."
    * @throws IException::Programmer "Node does not exist for the cube serial number."
@@ -532,7 +520,7 @@ namespace Isis {
     }
   }
 
-  
+
   void ControlNet::measureIgnored(ControlMeasure *measure) {
     if (!measure) {
       IString msg = "NULL measure passed to "
@@ -649,7 +637,7 @@ namespace Isis {
    *          second element is the number of critical edges.
    */
   QPair< int, int > ControlNet::CalcBWAndCE(QList< QString > serials) const {
-    
+
     for (int i = 0; i < serials.size(); i++)
       ASSERT(cubeGraphNodes->contains(serials[i]));
 
@@ -704,7 +692,7 @@ namespace Isis {
    * Delete a ControlPoint from the network using the point's Id.
    *
    * @param pointId The Point Id of the ControlPoint to be deleted.
-   * 
+   *
    * @throw IException::User "the point Id does not exist in the network"
    */
   int ControlNet::DeletePoint(QString pointId) {
@@ -861,7 +849,7 @@ namespace Isis {
    * @param island The list of graph nodes forming the island to be minimized
    * @param lessThan A comparison function telling us if one measure is better
    *                 than another
-   * 
+   *
    * @return The set of all measures (edges) in the minimum spanning tree
    */
   QSet< ControlMeasure * > ControlNet::MinimumSpanningTree(
@@ -1064,14 +1052,25 @@ namespace Isis {
   }
 
 
+  /**
+   * Get all the valid measures pertaining to a given cube serial number
+   *
+   * @returns A list of all valid measures which are in a given cube
+   */
+  QList< ControlMeasure * > ControlNet::GetValidMeasuresInCube(QString serialNumber) {
+    ValidateSerialNumber(serialNumber);
+    return (*cubeGraphNodes)[serialNumber]->getValidMeasures();
+  }
+
+
   /**
    * Copies the content of the a ControlMeasureLessThanFunctor
    *
    * @param other, reference to the other ControlMeasureLessThanFunctor
    */
-  ControlNet::ControlMeasureLessThanFunctor & 
+  ControlNet::ControlMeasureLessThanFunctor &
     ControlNet::ControlMeasureLessThanFunctor::operator=(ControlMeasureLessThanFunctor const &other) {
-    
+
     if (this != &other) {
       this->m_accessor = other.m_accessor;
     }
@@ -1082,18 +1081,18 @@ namespace Isis {
 
   /**
    * The () operator for the Control Measure less than functor
-   * 
+   *
    * @param a, ControlMeasure* pointer to the first control measure
    * @param b, ControlMeasure* pointer to the sencond control measure
    */
   bool ControlNet::ControlMeasureLessThanFunctor::operator()
     (ControlMeasure* const &a, ControlMeasure* const &b) {
-    
+
     return (a->*this->m_accessor)() < (b->*this->m_accessor)();
 
   }
 
-  
+
   /**
    * Get a sorted list of all the measures that have values in a given ragen
    *
@@ -1226,7 +1225,7 @@ namespace Isis {
    *
    * @author Sharmila Prasad (10/6/2010)
    *
-   * @return std::string
+   * @return QString
    */
   QString ControlNet::CreatedDate() const {
     return p_created;
@@ -1377,10 +1376,10 @@ namespace Isis {
   /**
    * Return the number of measures in image specified by serialNumber
    *
-   * @return Number of valid measures in image 
-   *  
-   * @history 2013-12-18 Tracie Sucharski - Renamed from GetNumberOfMeasuresInImage, it is 
-   *                         returning a count of only valid measures (Ignore=False). 
+   * @return Number of valid measures in image
+   *
+   * @history 2013-12-18 Tracie Sucharski - Renamed from GetNumberOfMeasuresInImage, it is
+   *                         returning a count of only valid measures (Ignore=False).
    */
   int ControlNet::GetNumberOfValidMeasuresInImage(const QString &serialNumber) {
     return p_cameraValidMeasuresMap[serialNumber];
@@ -1496,16 +1495,21 @@ namespace Isis {
     return p_userName;
   }
 
+  //! Return the last modified date
+  QString ControlNet::GetLastModified() const {
+    return p_modified;
+  }
+
 
-  //! Return QList of ControlPoints ordered by point ID
+  //! Return QList of all the ControlPoints in the network
   QList< ControlPoint * > ControlNet::GetPoints() {
-    QList< ControlPoint * > orderedPoints;
+    QList< ControlPoint * > pointsList;
 
     for (int i = 0; i < pointIds->size(); i++) {
-      orderedPoints.append(GetPoint(i));
+      pointsList.append(GetPoint(i));
     }
 
-    return orderedPoints;
+    return pointsList;
   }
 
 
@@ -1635,10 +1639,10 @@ namespace Isis {
 
   /**
    * Set mutex to lock for making Naif calls
-   * 
+   *
    * @author 2012-09-11 Tracie Sucharski
-   * 
-   * @param mutex 
+   *
+   * @param mutex
    */
   void ControlNet::SetMutex(QMutex *mutex) {
     m_mutex = mutex;
@@ -1656,14 +1660,14 @@ namespace Isis {
 
 
   /**
-   * Sets the target name and target radii, if available. 
-   *  
-   * Note: The target radii are found using NAIF target codes. If the given 
-   * target name is not recognized, the target radii vector will be filled with 
-   * Isis::Null values. 
-   *
-   * @see Target::radiiGroup(QString) 
-   *  
+   * Sets the target name and target radii, if available.
+   *
+   * Note: The target radii are found using NAIF target codes. If the given
+   * target name is not recognized, the target radii vector will be filled with
+   * Isis::Null values.
+   *
+   * @see Target::radiiGroup(QString)
+   *
    * @param target The name of the target of this Control Network
    */
   void ControlNet::SetTarget(const QString &target) {
@@ -1696,10 +1700,10 @@ namespace Isis {
 
 
   /**
-   * Sets the target name and radii using values found in the mapping group of 
+   * Sets the target name and radii using values found in the mapping group of
    * the given label, if available. If this fails, calls SetTarget(QString).
-   *  
-   * @param label A PVL Containing Target information (usually in a Mapping 
+   *
+   * @param label A PVL Containing Target information (usually in a Mapping
    *              group or NaifKeywords object).
    */
   void ControlNet::SetTarget(Pvl label) {
@@ -1720,16 +1724,16 @@ namespace Isis {
       // or if they are set to null,
       // try to get target radii using the TargetName or NaifKeywords object values
       Distance equatorialRadius, polarRadius;
-      if (!mapping.hasKeyword("EquatorialRadius") 
+      if (!mapping.hasKeyword("EquatorialRadius")
           || !mapping.hasKeyword("PolarRadius")) {
-      
+
         mapping = Target::radiiGroup(label, mapping);
-      
+
       }
 
       equatorialRadius = Distance(mapping["EquatorialRadius"], Distance::Meters);
       polarRadius      = Distance(mapping["PolarRadius"],      Distance::Meters);
-      
+
       p_targetRadii.push_back(equatorialRadius);
       p_targetRadii.push_back(equatorialRadius);
       p_targetRadii.push_back(polarRadius);
@@ -1751,15 +1755,15 @@ namespace Isis {
 
 
   /**
-   * Directly sets the target name and radii using the given information. 
-   *  
-   * @see Target::radiiGroup(Pvl, PvlGroup) 
-   *  
+   * Directly sets the target name and radii using the given information.
+   *
+   * @see Target::radiiGroup(Pvl, PvlGroup)
+   *
    * @param target The name of the target for this Control Network
    * @param target A 3-dimensional vector containing the A (equatorial major), B
    *               (equatorial minor), and C (polar) triaxial radii values of
    *               the target for this Control Network
-   *  
+   *
    */
   void ControlNet::SetTarget(const QString &target,
                              const QVector<Distance> &radii) {
@@ -1776,7 +1780,7 @@ namespace Isis {
     }
 
     p_targetName = target;
-    p_targetRadii = radii.toStdVector();
+    p_targetRadii = radii;
 
   }
 
@@ -1925,7 +1929,7 @@ namespace Isis {
    * @returns the radii of the target body
    */
   std::vector<Distance> ControlNet::GetTargetRadii() {
-    return p_targetRadii;
+    return p_targetRadii.toStdVector();
   }
 
 
diff --git a/isis/src/control/objs/ControlNet/ControlNet.h b/isis/src/control/objs/ControlNet/ControlNet.h
index 5afbaa060d39d4f18915880b25d1a22974a1e85f..008a5579e861149b93155dc131722e6ac9412dbb 100644
--- a/isis/src/control/objs/ControlNet/ControlNet.h
+++ b/isis/src/control/objs/ControlNet/ControlNet.h
@@ -27,13 +27,9 @@
 #include <QMetaType>
 #include <QObject> // parent class
 #include <QSharedPointer>
-
-#include <map>
-#include <vector>
-
-#include "ControlNetFile.h"
-
 #include <QString>
+#include <QMap>
+#include <QVector>
 
 template< typename A, typename B > class QHash;
 template< typename T > class QList;
@@ -42,7 +38,6 @@ template< typename T > class QSet;
 class QMutex;
 class QString;
 
-
 namespace Isis {
   class Camera;
   class ControlMeasure;
@@ -50,6 +45,7 @@ namespace Isis {
   class ControlCubeGraphNode;
   class Distance;
   class Progress;
+  class Pvl;
   class SerialNumberList;
 
   /**
@@ -206,6 +202,15 @@ namespace Isis {
    *   @history 2017-08-09 Summer Stapleton - Added throw to caught exception for bad control net
    *                           import in constructor. Also removed p_invalid as it was no longer
    *                           being used anywhere. Fixes #5068.
+   *   @history 2017-12-12 Kristin Berry - Updated to use QMap and QVector rather than std::map
+   *                           and std::vector. Fixes #5259.
+   *   @history 2017-12-18 Adam Goins - Added GetLastModified() accessor. References #5258.
+   *   @history 2017-12-21 Jesse Mapel - Modified read and write methods to use the refactored
+   *                           ControlNetVersioner instead of directly parsing the protobuf
+   *                           objects from the LatestControlNetFile.
+   *   @history 2018-01-12 Adam Goins - Added Progress support back to Read methods.
+   *   @history 2017-01-19 Jesse Mapel - Added a method to get all of the valid measures in an
+   *                           image. Previously, this had to be done throug the graph.
    */
   class ControlNet : public QObject {
       Q_OBJECT
@@ -242,6 +247,7 @@ namespace Isis {
       int getEdgeCount() const;
       QString CubeGraphToString() const;
       QList< ControlMeasure * > GetMeasuresInCube(QString serialNumber);
+      QList< ControlMeasure * > GetValidMeasuresInCube(QString serialNumber);
       QList< ControlMeasure * > sortedMeasureList(double(ControlMeasure::*statFunc)() const,
                                                   double min,double max);
       void DeleteMeasuresWithId(QString serialNumber);
@@ -253,7 +259,7 @@ namespace Isis {
       ControlPoint *GetPoint(QString pointId);
       const ControlPoint *GetPoint(int index) const;
       ControlPoint *GetPoint(int index);
-      
+
       const ControlCubeGraphNode *getGraphNode(QString serialNumber) const;
       ControlCubeGraphNode *getGraphNode(QString serialNumber);
 
@@ -280,6 +286,7 @@ namespace Isis {
       int GetNumValidPoints();
       QString GetTarget() const;
       QString GetUserName() const;
+      QString GetLastModified() const;
       QList< ControlPoint * > GetPoints();
       QList< QString > GetPointIds() const;
       std::vector<Distance> GetTargetRadii();
@@ -333,7 +340,7 @@ namespace Isis {
        *
        * @internal
        */
-      class ControlMeasureLessThanFunctor : 
+      class ControlMeasureLessThanFunctor :
           public std::binary_function<ControlMeasure* const &,
           ControlMeasure * const &, bool > {
         public:
@@ -344,9 +351,9 @@ namespace Isis {
             this->m_accessor = other.m_accessor;
           }
           ~ControlMeasureLessThanFunctor() {}
-            
+
           bool operator()(ControlMeasure* const &, ControlMeasure* const &);
-          ControlMeasureLessThanFunctor & operator=(ControlMeasureLessThanFunctor const &other); 
+          ControlMeasureLessThanFunctor & operator=(ControlMeasureLessThanFunctor const &other);
 
         private:
           double(ControlMeasure::*m_accessor)() const;
@@ -361,7 +368,7 @@ namespace Isis {
        *
        * @author ????-??-?? Unknown
        *
-       * @internal 
+       * @internal
        */
       class ControlVertex {
         public:
@@ -434,12 +441,12 @@ namespace Isis {
       QString p_modified;              //!< Date Last Modified
       QString p_description;           //!< Textual Description of network
       QString p_userName;              //!< The user who created the network
-      std::map<QString, Isis::Camera *> p_cameraMap; //!< A map from serialnumber to camera
-      std::map<QString, int> p_cameraValidMeasuresMap; //!< A map from serialnumber to #measures
-      std::map<QString, int> p_cameraRejectedMeasuresMap; //!< A map from serialnumber to
+      QMap<QString, Isis::Camera *> p_cameraMap; //!< A map from serialnumber to camera
+      QMap<QString, int> p_cameraValidMeasuresMap; //!< A map from serialnumber to #measures
+      QMap<QString, int> p_cameraRejectedMeasuresMap; //!< A map from serialnumber to
       //!  #rejected measures
-      std::vector<Isis::Camera *> p_cameraList; //!< Vector of image number to camera
-      std::vector<Distance> p_targetRadii;        //!< Radii of target body
+      QVector<Isis::Camera *> p_cameraList; //!< Vector of image number to camera
+      QVector<Distance> p_targetRadii;        //!< Radii of target body
 
       bool m_ownPoints; //!< Specifies ownership of point list. True if owned by this object. 
   };
diff --git a/isis/src/control/objs/ControlNet/ControlNet.truth b/isis/src/control/objs/ControlNet/ControlNet.truth
index f9e7f4dd5bb9bab564db1e4130c000f4b9b530d7..13ef6e7272d3f04b3b627134210ad082582a58b9 100644
--- a/isis/src/control/objs/ControlNet/ControlNet.truth
+++ b/isis/src/control/objs/ControlNet/ControlNet.truth
@@ -147,7 +147,7 @@ Object = ControlNetwork
   Created      = 2010-07-10T12:50:15
   LastModified = 2010-07-10T12:50:55
   Description  = "UnitTest of ControlNetwork"
-  Version      = 3
+  Version      = 5
 
   Object = ControlPoint
     PointType                = Fixed
diff --git a/isis/src/control/objs/ControlNetDiff/ControlNetDiff.cpp b/isis/src/control/objs/ControlNetDiff/ControlNetDiff.cpp
index 064234fbcdeb296fe9f996a158cb85c73e67e5af..573cc6aa3516792cfe6f5204453c9334f08e08f2 100644
--- a/isis/src/control/objs/ControlNetDiff/ControlNetDiff.cpp
+++ b/isis/src/control/objs/ControlNetDiff/ControlNetDiff.cpp
@@ -8,7 +8,6 @@
 
 #include "ControlMeasure.h"
 #include "ControlNet.h"
-#include "ControlNetFile.h"
 #include "ControlNetVersioner.h"
 #include "ControlPoint.h"
 #include "FileName.h"
@@ -18,11 +17,6 @@
 #include "PvlKeyword.h"
 #include "PvlObject.h"
 
-
-using std::cerr;
-using std::cout;
-using std::endl;
-
 namespace Isis {
 
   /**
@@ -91,24 +85,26 @@ namespace Isis {
     Pvl results;
     PvlObject report("Differences");
 
-    LatestControlNetFile *net1 = ControlNetVersioner::Read(net1Name.expanded());
-    LatestControlNetFile *net2 = ControlNetVersioner::Read(net2Name.expanded());
     diff("Filename", net1Name.name(), net2Name.name(), report);
 
-    Pvl net1Pvl(net1->toPvl());
-    Pvl net2Pvl(net2->toPvl());
-
-    PvlObject &net1Obj = net1Pvl.findObject("ControlNetwork");
-    PvlObject &net2Obj = net2Pvl.findObject("ControlNetwork");
+    ControlNetVersioner cnv1(net1Name);
+    ControlNetVersioner cnv2(net2Name);
 
-    BigInt net1NumPts = net1Obj.objects();
-    BigInt net2NumPts = net2Obj.objects();
+    BigInt net1NumPts = cnv1.numPoints();
+    BigInt net2NumPts = cnv2.numPoints();
     diff("Points", toString(net1NumPts), toString(net2NumPts), report);
 
-    diff("NetworkId", net1Obj, net2Obj, report);
-    diff("TargetName", net1Obj, net2Obj, report);
+    diff("NetworkId", cnv1.netId(), cnv2.netId(), report);
+    diff("TargetName", cnv1.targetName(), cnv2.targetName(), report);
 
+    Pvl net1Pvl = cnv1.toPvl();
+    Pvl net2Pvl = cnv2.toPvl();
+    
+    PvlObject &net1Obj = net1Pvl.findObject("ControlNetwork");
+    PvlObject &net2Obj = net2Pvl.findObject("ControlNetwork");
+    
     QMap< QString, QMap<int, PvlObject> > pointMap;
+     
     for (int p = 0; p < net1NumPts; p++) {
       PvlObject &point = net1Obj.object(p);
       pointMap[point.findKeyword("PointId")[0]].insert(
@@ -122,6 +118,7 @@ namespace Isis {
     }
 
     QList<QString> pointNames = pointMap.keys();
+ 
     for (int i = 0; i < pointNames.size(); i++) {
       QMap<int, PvlObject> idMap = pointMap[pointNames[i]];
       if (idMap.size() == 2) {
@@ -135,9 +132,6 @@ namespace Isis {
       }
     }
 
-    delete net1;
-    delete net2;
-
     results.addObject(report);
     return results;
   }
diff --git a/isis/src/control/objs/ControlNetDiff/ControlNetDiff.h b/isis/src/control/objs/ControlNetDiff/ControlNetDiff.h
index f4ae86aada6a91d0fda5056544e35b0a46a818da..8443bb56317c1ef1b4d57465d2b2c2f9d875dd52 100644
--- a/isis/src/control/objs/ControlNetDiff/ControlNetDiff.h
+++ b/isis/src/control/objs/ControlNetDiff/ControlNetDiff.h
@@ -60,6 +60,8 @@ namespace Isis {
    *
    * @internal
    *   @history 2012-04-26 Travis Addair - Added documentation.
+   *   @history 2018-01-02 Kristin Berry - Modified to use ControlNetVersioner instead of
+   *                           LatestControlNetFile.
    *
    */
   class ControlNetDiff {
diff --git a/isis/src/control/objs/ControlNetFilter/ControlNetFilter.cpp b/isis/src/control/objs/ControlNetFilter/ControlNetFilter.cpp
index 47f6276a14c06679309c107a2706bdd30a57258e..a5e80cb740fce472b3b3ea30733f90a80a196e53 100644
--- a/isis/src/control/objs/ControlNetFilter/ControlNetFilter.cpp
+++ b/isis/src/control/objs/ControlNetFilter/ControlNetFilter.cpp
@@ -1,12 +1,13 @@
 #include "ControlNetFilter.h"
 
+#include <QVector>
+
 #include "Angle.h"
 #include "Camera.h"
 #include "CameraFactory.h"
 #include "ControlMeasure.h"
 #include "ControlMeasureLogData.h"
 #include "ControlNet.h"
-#include "ControlCubeGraphNode.h"
 #include "ControlPoint.h"
 #include "FileName.h"
 #include "IString.h"
@@ -97,9 +98,7 @@ namespace Isis {
    * @param serialNum - Serial Number
    */
   void ControlNetFilter::FilterOutMeasuresBySerialNum(QString serialNum){
-    QString sn(serialNum);
-    const ControlCubeGraphNode *csn = mCNet->getGraphNode(sn);
-    QList< ControlMeasure * > measures = csn->getMeasures();
+    QList< ControlMeasure * > measures = mCNet->GetMeasuresInCube(serialNum);
 
     foreach(ControlMeasure * measure, measures) {
       bool pointEditFlag = false;
@@ -109,7 +108,7 @@ namespace Isis {
         point->SetEditLock(false);
         pointEditFlag = true;
       }
-      ControlMeasure *msr = point->GetMeasure(sn);
+      ControlMeasure *msr = point->GetMeasure(serialNum);
       msr->SetEditLock(false);
       point->Delete(serialNum);
       if (pointEditFlag) {
@@ -1018,7 +1017,7 @@ namespace Isis {
    * @param pbLastFilter - Flag to indicate whether this is the last filter to print the stats
    */
   void ControlNetFilter::PointCubeNamesFilter(const PvlGroup &pvlGrp, bool pbLastFilter) {
-    std::vector <QString> sCubeNames;
+    QVector<QString> sCubeNames;
 
     // Store the Cubenames from the PvlGroup
     for (int i = 0; i < pvlGrp.keywords(); i++) {
@@ -1079,7 +1078,7 @@ namespace Isis {
 
           // Image Details
           QString sn = cMeasure->GetCubeSerialNumber();
-          vector <double> imgStats = GetImageStatsBySerialNum(sn);
+          QVector<double> imgStats = GetImageStatsBySerialNum(sn);
           mOstm << mSerialNumList.fileName(sn)   << ", " << sn << ", "
                 << imgStats[imgTotalPoints] << ", " << imgStats[imgIgnoredPoints] << ", "
                 << imgStats[imgLockedPoints] << ", " << imgStats[imgFixedPoints] << ", "
@@ -1136,7 +1135,7 @@ namespace Isis {
 
     for (int sn = (iNumCubes - 1); sn >= 0; sn--) {
       QString sSerialNum = mSerialNumFilter.serialNumber(sn);
-      vector<double> imgStats = GetImageStatsBySerialNum(sSerialNum);
+      QVector<double> imgStats = GetImageStatsBySerialNum(sSerialNum);
       double convexHullRatio = imgStats[imgConvexHullRatio];
       if (convexHullRatio < dGreater || convexHullRatio > dLesser){
         FilterOutMeasuresBySerialNum(sSerialNum);
@@ -1213,7 +1212,7 @@ namespace Isis {
         QString sSerialNum = mSerialNumFilter.serialNumber(i);
 
         mOstm << mSerialNumFilter.fileName(i) << ", " << sSerialNum << ", ";
-        vector<double> imgStats = GetImageStatsBySerialNum(sSerialNum);
+        QVector<double> imgStats = GetImageStatsBySerialNum(sSerialNum);
         mOstm << mSerialNumFilter.fileName(sSerialNum) << ", " << sSerialNum << ", "
               << imgStats[imgTotalPoints]  << ", " << imgStats[imgIgnoredPoints] << ", " << imgStats[imgLockedPoints] << ", "
               << imgStats[imgFixedPoints] << ", " << imgStats[imgConstrainedPoints] << ", " << imgStats[imgFreePoints] << ", "
@@ -1258,7 +1257,7 @@ namespace Isis {
 
     for (int sn = (iNumCubes - 1); sn >= 0; sn--) {
       QString sSerialNum = mSerialNumFilter.serialNumber(sn);
-      vector<double> imgStats = GetImageStatsBySerialNum(sSerialNum);
+      QVector<double> imgStats = GetImageStatsBySerialNum(sSerialNum);
       double numPoints = imgStats[imgTotalPoints];
       if (numPoints < iGreaterPoints || numPoints > iLessPoints){
         FilterOutMeasuresBySerialNum(sSerialNum);
@@ -1318,9 +1317,9 @@ namespace Isis {
       double dDist = 0;
       bool bMatchDistance = false;
 
-      std::vector <int> sPointIndex1;
-      std::vector <int> sPointIndex2;
-      std::vector <double> dPointDistance;
+      QVector<int> sPointIndex1;
+      QVector<int> sPointIndex2;
+      QVector<double> dPointDistance;
 
       // Point stats
       int iPointsTotal   = 0;
@@ -1449,7 +1448,7 @@ namespace Isis {
         mSerialNumFilter.remove(sSerialNum);
       }
       else if (pbLastFilter) {
-        vector <double> imgStats = GetImageStatsBySerialNum((sSerialNum));
+        QVector<double> imgStats = GetImageStatsBySerialNum((sSerialNum));
         mOstm << mSerialNumList.fileName(sSerialNum) << ", " << sSerialNum << ", "
               << iPointsTotal << ", " << iPointsIgnored << ", " << iPointsLocked << ", "
               << iPointsFixed << ", " << iPointsConstrained << ", " << iPointsFree << ", "
diff --git a/isis/src/control/objs/ControlNetFilter/ControlNetFilter.h b/isis/src/control/objs/ControlNetFilter/ControlNetFilter.h
index 530a0a6b73533c0f36ea8896d65dae8f7b31908c..a9b940bd96b2a48c0949042c267474b6140168b8 100644
--- a/isis/src/control/objs/ControlNetFilter/ControlNetFilter.h
+++ b/isis/src/control/objs/ControlNetFilter/ControlNetFilter.h
@@ -65,7 +65,9 @@ namespace Isis {
    *  @history 2011-11-03 Sharmila Prasad - Added functionality to filter by Convex Hull Ratio
    *  @history 2011-12-29 Sharmila Prasad - Updated GoodnessOfFit Filter. Fixes Mantis #652
    *  @history 2017-08-08 Adam Goins - Changed references to SerialNumberList::Delete() to 
-   *                                     SerialNumberList::remove()
+   *                           SerialNumberList::remove()
+   *  @history 2017-12-12 Kristin Berry - Updated to use QVector instead of std::vector. Fixes
+   *                           #5259.
    */
   class ControlNetFilter : public ControlNetStatistics {
     public:
diff --git a/isis/src/control/objs/ControlNetStatistics/ControlNetStatistics.cpp b/isis/src/control/objs/ControlNetStatistics/ControlNetStatistics.cpp
index 77565b0f5f3bea8801c9ef510fa5ad8776143346..487ee47386af9a9f679967c07f0fae63eb8c63ec 100644
--- a/isis/src/control/objs/ControlNetStatistics/ControlNetStatistics.cpp
+++ b/isis/src/control/objs/ControlNetStatistics/ControlNetStatistics.cpp
@@ -15,7 +15,6 @@
 #include "ControlPoint.h"
 #include "ControlMeasure.h"
 #include "ControlMeasureLogData.h"
-#include "ControlCubeGraphNode.h"
 #include "Cube.h"
 #include "CubeManager.h"
 #include "FileName.h"
@@ -25,9 +24,6 @@
 #include "SpecialPixel.h"
 #include "Statistics.h"
 
-
-using namespace std;
-
 namespace Isis {
 
   //! String names for Point Type
@@ -219,23 +215,22 @@ namespace Isis {
     CubeManager cubeMgr;
     cubeMgr.SetNumOpenCubes(50);
 
-    mCubeGraphNodes = mCNet->GetCubeGraphNodes();
+    QList<QString> cnetSerials = mCNet->GetCubeSerials();
 
     if (mProgress != NULL) {
       mProgress->SetText("Generating Image Stats.....");
-      mProgress->SetMaximumSteps(mCubeGraphNodes.size());
+      mProgress->SetMaximumSteps(cnetSerials.size());
       mProgress->CheckStatus();
     }
 
-    foreach (ControlCubeGraphNode * node, mCubeGraphNodes) {
+    foreach (QString sn, cnetSerials) {
       geos::geom::CoordinateSequence * ptCoordinates =
           new geos::geom::CoordinateArraySequence();
 
       // setup vector for number of image properties and init to 0
-      vector<double> imgStats(numImageStats, 0);
+      QVector<double> imgStats(numImageStats, 0);
 
       // Open the cube to get the dimensions
-      QString sn = node->getSerialNumber();
       Cube *cube = cubeMgr.OpenCube(mSerialNumList.fileName(sn));
 
       mSerialNumMap[sn] = true;
@@ -245,7 +240,7 @@ namespace Isis {
       imgStats[imgLines]   = cube->lineCount();
       double cubeArea      = imgStats[imgSamples] * imgStats[imgLines];
 
-      QList< ControlMeasure * > measures = node->getMeasures();
+      QList< ControlMeasure * > measures = mCNet->GetMeasuresInCube(sn);
 
       // Populate pts with a list of control points
       if (!measures.isEmpty()) {
@@ -335,32 +330,32 @@ namespace Isis {
      }
 
     //map< QString, vector<double> >::iterator it;
-    map<QString, bool>::iterator it;
     // imgSamples, imgLines, imgTotalPoints, imgIgnoredPoints, imgFixedPoints, imgLockedPoints, imgLocked, imgConstrainedPoints, imgFreePoints, imgConvexHullArea, imgConvexHullRatio
-
+    QMap<QString, bool>::iterator it;
     // Log into the output file
     ostm << "Filename, SerialNumber, TotalPoints, PointsIgnored, PointsEditLocked, Fixed, Constrained, Free, ConvexHullRatio" <<  endl;
     //for (it = mImageMap.begin(); it != mImageMap.end(); it++) {
+
     for (it = mSerialNumMap.begin(); it != mSerialNumMap.end(); it++) {
-        ostm << mSerialNumList.fileName((*it).first) << ", " << (*it).first << ", ";
-        bool serialNumExists = (*it).second ;
-        if (serialNumExists) {
-          vector<double>imgStats = mImageMap[(*it).first] ;
-          ostm << imgStats[imgTotalPoints]<< ", " << imgStats[imgIgnoredPoints] << ", " ;
-          ostm << imgStats[imgLockedPoints] << ", " << imgStats[imgFixedPoints] << ", " ;
-          ostm << imgStats[imgConstrainedPoints] << ", " << imgStats[imgFreePoints] << ", ";
-          ostm << imgStats[ imgConvexHullRatio] << endl;
-        }
-        else {
-          ostm << "0, 0, 0, 0, 0, 0, 0" << endl;
-        }
+      ostm << mSerialNumList.fileName(it.key()) << ", " << it.key() << ", ";
+      bool serialNumExists = it.value();
+      if (serialNumExists) {
+        QVector<double> imgStats = mImageMap[(it).key()] ;
+        ostm << imgStats[imgTotalPoints]<< ", " << imgStats[imgIgnoredPoints] << ", " ;
+        ostm << imgStats[imgLockedPoints] << ", " << imgStats[imgFixedPoints] << ", " ;
+        ostm << imgStats[imgConstrainedPoints] << ", " << imgStats[imgFreePoints] << ", ";
+        ostm << imgStats[imgConvexHullRatio] << endl;
+      }
+      else {
+        ostm << "0, 0, 0, 0, 0, 0, 0" << endl;
+      }
     }
 
     if (!ostm) {
       QString msg = QObject::tr("Error writing to file: [%1]").arg(psImageFile);
       throw IException(IException::Io, msg, _FILEINFO_);
     }
-    ostm.close(); 
+    ostm.close();
   }
 
 
@@ -371,10 +366,10 @@ namespace Isis {
    *
    * @param psSerialNum - Image serialNum
    *
-   * @return const vector<double>
+   * @return const QVector<double>
    */
-  vector<double> ControlNetStatistics::GetImageStatsBySerialNum(QString psSerialNum) const {
-    return (*mImageMap.find(psSerialNum)).second;
+  QVector<double> ControlNetStatistics::GetImageStatsBySerialNum(QString psSerialNum) const {
+    return (mImageMap.find(psSerialNum)).value();
   }
 
 
@@ -613,4 +608,3 @@ namespace Isis {
     }
   }
 }
-
diff --git a/isis/src/control/objs/ControlNetStatistics/ControlNetStatistics.h b/isis/src/control/objs/ControlNetStatistics/ControlNetStatistics.h
index a19a4f60e82d2deffe9faf3479a893a44688f47d..79244cd53d5c1a6d4409b795348953b94181a9c6 100644
--- a/isis/src/control/objs/ControlNetStatistics/ControlNetStatistics.h
+++ b/isis/src/control/objs/ControlNetStatistics/ControlNetStatistics.h
@@ -1,14 +1,15 @@
 #ifndef _CONTROLNETSTATISTICS_H_
 #define _CONTROLNETSTATISTICS_H_
 
-#include <map>
-#include <iostream>
-#include <vector>
+#include <QMap>
+#include <QVector> 
+
 #include "Progress.h"
 #include "PvlGroup.h"
 #include "SerialNumberList.h"
 #include "Statistics.h"
 
+
 /**
  * @file
  * $Revision: $
@@ -34,7 +35,6 @@
 
 namespace Isis {
   class ControlNet;
-  class ControlCubeGraphNode;
   class Progress;
   class PvlGroup;
 
@@ -70,11 +70,11 @@ namespace Isis {
    *                           computation. Minor refactoring but needs a lot more. References #619
    *                           because fixing the order of the cnet caused us to fix some cnet graph
    *                           node bugs which caused the convex hull tests to fail.
-   *  @history 2015-06-04 Kristin Berry - Now throws an error when
-   *                           unable to open an output file or
+   *  @history 2015-06-04 Kristin Berry - Now throws an error when unable to open an output file or
    *                           finish writing to an output file.
    *                           Fixes #996.
-   *  
+   *  @history 2017-12-12 Kristin Berry - Updated std::map to QMap and std::vector to QVector. Fixes
+   *                           #5259.
    */
   class ControlNetStatistics {
     public:
@@ -114,7 +114,7 @@ namespace Isis {
       void PrintImageStats(const QString &psImageFile);
 
       //! Returns the Image Stats by Serial Number
-      std::vector<double> GetImageStatsBySerialNum(QString psSerialNum) const;
+      QVector<double> GetImageStatsBySerialNum(QString psSerialNum) const;
 
       //! Generate stats like Ignored, Fixed, Total Measures, Ignored by Control Point
       void GeneratePointStats(const QString &psPointFile);
@@ -124,135 +124,134 @@ namespace Isis {
 
       //! Returns the Number of Valid (Not Ignored) Points in the Control Net
       int NumValidPoints() const {
-        return (*mPointIntStats.find(validPoints)).second;
+        return (*mPointIntStats.find(validPoints));
       }
 
       //! Returns the Number of Fixed Points in the Control Net
       int NumFixedPoints() const {
-        return (*mPointIntStats.find(fixedPoints)).second;
+        return (*mPointIntStats.find(fixedPoints));
       }
 
       //! Returns the number of Constrained Points in Control Net
       int NumConstrainedPoints() const {
-        return (*mPointIntStats.find(constrainedPoints)).second;
+        return (*mPointIntStats.find(constrainedPoints));
       }
 
       //! Returns the number of Constrained Points in Control Net
       int NumFreePoints() const {
-        return (*mPointIntStats.find(freePoints)).second;
+        return (*mPointIntStats.find(freePoints));
       }
 
       //! Returns the number of ignored points
       int NumIgnoredPoints() const {
-        return (*mPointIntStats.find(ignoredPoints)).second;
+        return (*mPointIntStats.find(ignoredPoints));
       }
 
       //! Returns total number of edit locked points
       int NumEditLockedPoints() const {
-        return (*mPointIntStats.find(editLockedPoints)).second;
+        return (*mPointIntStats.find(editLockedPoints));
       }
 
       //! Returns the total Number of Measures in the Control Net
       int NumMeasures() const {
-        return (*mPointIntStats.find(totalMeasures)).second;
+        return (*mPointIntStats.find(totalMeasures));
       }
 
       //! Returns the total Number of valid Measures in the Control Net
       int NumValidMeasures() const {
-        return (*mPointIntStats.find(validMeasures)).second;
+        return (*mPointIntStats.find(validMeasures));
       }
 
       //! Returns the total Number of Ignored Measures in the Control Net
       int NumIgnoredMeasures() const {
-        return (*mPointIntStats.find(ignoredMeasures)).second;
+        return (*mPointIntStats.find(ignoredMeasures));
       }
 
       //! Returns total number of edit locked measures in the network
       int NumEditLockedMeasures() const {
-        return (*mPointIntStats.find(editLockedMeasures)).second;
+        return (*mPointIntStats.find(editLockedMeasures));
       }
 
       //! Determine the average error of all points in the network
       double GetAverageResidual() const {
-        return (*mPointDoubleStats.find(avgResidual)).second;
+        return (*mPointDoubleStats.find(avgResidual));
       }
 
       //! Determine the minimum error of all points in the network
       double GetMinimumResidual() const {
-        return (*mPointDoubleStats.find(minResidual)).second;
+        return (*mPointDoubleStats.find(minResidual));
       }
 
       //! Determine the maximum error of all points in the network
       double GetMaximumResidual() const {
-        return (*mPointDoubleStats.find(maxResidual)).second;
+        return (*mPointDoubleStats.find(maxResidual));
       }
 
       //! Determine the minimum line error of all points in the network
       double GetMinLineResidual() const {
-        return (*mPointDoubleStats.find(minLineResidual)).second;
+        return (*mPointDoubleStats.find(minLineResidual));
       }
 
       //! Determine the minimum sample error of all points in the network
       double GetMinSampleResidual() const {
-        return (*mPointDoubleStats.find(minSampleResidual)).second;
+        return (*mPointDoubleStats.find(minSampleResidual));
       }
 
       //! Determine the maximum line error of all points in the network
       double GetMaxLineResidual() const {
-        return (*mPointDoubleStats.find(maxLineResidual)).second;
+        return (*mPointDoubleStats.find(maxLineResidual));
       }
 
       //! Determine the maximum sample error of all points in the network
       double GetMaxSampleResidual() const {
-        return (*mPointDoubleStats.find(maxSampleResidual)).second;
+        return (*mPointDoubleStats.find(maxSampleResidual));
       }
 
       //! Get Min and Max LineShift
       double GetMinLineShift() const {
-        return (*mPointDoubleStats.find(minLineShift)).second;
+        return (*mPointDoubleStats.find(minLineShift));
       }
 
       //! Get network Max LineShift
       double GetMaxLineShift() const {
-        return (*mPointDoubleStats.find(maxLineShift)).second;
+        return (*mPointDoubleStats.find(maxLineShift));
       }
 
       //! Get network Min SampleShift
       double GetMinSampleShift() const {
-        return (*mPointDoubleStats.find(minSampleShift)).second;
+        return (*mPointDoubleStats.find(minSampleShift));
       }
 
       //! Get network Max SampleShift
       double GetMaxSampleShift() const {
-        return (*mPointDoubleStats.find(maxSampleShift)).second;
+        return (*mPointDoubleStats.find(maxSampleShift));
       }
 
       //! Get network Min PixelShift
       double GetMinPixelShift() const {
-        return (*mPointDoubleStats.find(minPixelShift)).second;
+        return (*mPointDoubleStats.find(minPixelShift));
       }
 
       //! Get network Max PixelShift
       double GetMaxPixelShift() const {
-        return (*mPointDoubleStats.find(maxPixelShift)).second;
+        return (*mPointDoubleStats.find(maxPixelShift));
       }
 
       //! Get network Avg PixelShift
       double GetAvgPixelShift() const {
-        return (*mPointDoubleStats.find(avgPixelShift)).second;
+        return (*mPointDoubleStats.find(avgPixelShift));
       }
 
     protected:
       SerialNumberList mSerialNumList;           //!< Serial Number List
       ControlNet *mCNet;                         //!< Control Network
       Progress *mProgress;                       //!< Progress state
-      QList<ControlCubeGraphNode *> mCubeGraphNodes;
 
     private:
-      std::map<int, int> mPointIntStats;           //!< Contains std::map of different count stats
-      std::map<int, double> mPointDoubleStats;     //!< Contains std::map of different computed stats
-      std::map<QString, std::vector<double> > mImageMap; //!< Contains stats by Image/Serial Num
-      std::map<QString, bool> mSerialNumMap;        //!< Whether serial# is part of ControlNet
+      QMap<int, int> mPointIntStats;           //!< Contains QMap of different count stats
+      QMap<int, double> mPointDoubleStats;     //!< Contains QMap of different computed stats
+      QMap<QString, QVector<double> > mImageMap; //!< Contains stats by Image/Serial Num
+      QMap<QString, bool> mSerialNumMap;        //!< Whether serial# is part of ControlNet
 
       //! Get point count stats
       void GetPointIntStats();
diff --git a/isis/src/control/objs/ControlNetValidMeasure/ControlNetValidMeasure.cpp b/isis/src/control/objs/ControlNetValidMeasure/ControlNetValidMeasure.cpp
index 4066c8cae04cf961e1296f51e24b507b7f20001a..ede97e14ba3aa69caa673815249a395dc29f1ab8 100644
--- a/isis/src/control/objs/ControlNetValidMeasure/ControlNetValidMeasure.cpp
+++ b/isis/src/control/objs/ControlNetValidMeasure/ControlNetValidMeasure.cpp
@@ -8,8 +8,6 @@
 #include "SpecialPixel.h"
 #include "UniversalGroundMap.h"
 
-using namespace std;
-
 namespace Isis {
 
   /**
diff --git a/isis/src/control/objs/ControlNetVersioner/ControlNetFile.h b/isis/src/control/objs/ControlNetVersioner/ControlNetFile.h
deleted file mode 100644
index 53dc8459525b8942a4ff903dceae2f2e69075fd2..0000000000000000000000000000000000000000
--- a/isis/src/control/objs/ControlNetVersioner/ControlNetFile.h
+++ /dev/null
@@ -1,86 +0,0 @@
-#ifndef ControlNetFile_h
-#define ControlNetFile_h
-
-namespace Isis {
-  class FileName;
-  class Pvl;
-
-  /**
-   * @brief Generic Binary Control Net File Representation
-   *
-   * This class is the parent for all binary forms of the control network
-   *   files. Each one must be readable, writable, and convertable to Pvl.
-   *   Other than that, they can be (and probably will be) literally anything as
-   *   long as it has a Pvl header.
-   *
-   * @author 2011-04-07 Steven Lambright
-   *
-   * @internal
-   */
-  class ControlNetFile {
-    public:
-      /**
-       * Constructor. No data so this does nothing.
-       */
-      ControlNetFile() {};
-      /**
-       * Destructor. No data so this does nothing.
-       */
-      virtual ~ControlNetFile() {};
-
-      /**
-       * This reads the binary file into memory. The header is the Pvl that must
-       *   be at the top of the file (it's how we could tell it was binary in
-       *   the first place).
-       *
-       * @param header The pvl at the top of the file down to the "End" keyword
-       * @param file The filename of the binary file to be read
-       */
-      virtual void Read(const Pvl &header, const FileName &file) = 0;
-
-      /**
-       * This writes the binary file that is in memory to disk. The behavior of
-       *   this method is undefined if the required data is not set
-       *   (ControlNetVersioner::LatestPvlToBinary guarantees they are, and this
-       *   should never be called for old versions).
-       *
-       * @param file The filename of the binary file to be written
-       */
-      virtual void Write(const FileName &file) const = 0;
-
-      /**
-       * Convert the binary representation to Pvl (any pvl version).
-       */
-      virtual Pvl toPvl() const = 0;
-
-    private:
-      /**
-       * Disallow copy construction. This should never happen.
-       *
-       * @param other File to copy from
-       */
-      ControlNetFile(const ControlNetFile &other);
-
-      /**
-       * Disallow assignment. This should never happen.
-       *
-       * @param other File to copy from
-       */
-      ControlNetFile &operator=(const ControlNetFile &other);
-  };
-
-}
-
-// Always include the latest version only
-#include "ControlNetFileV0002.h"
-
-namespace Isis {
-  class ControlNetFileV0002;
-
-  /**
-   * To minimize changes in other places, allow others to use "Latest"
-   */
-  typedef ControlNetFileV0002 LatestControlNetFile;
-}
-
-#endif
diff --git a/isis/src/control/objs/ControlNetVersioner/ControlNetFileHeaderV0002.proto b/isis/src/control/objs/ControlNetVersioner/ControlNetFileHeaderV0002.proto
new file mode 100644
index 0000000000000000000000000000000000000000..f0ecd89ab97f72de4655b63a2093c6e073f268cf
--- /dev/null
+++ b/isis/src/control/objs/ControlNetVersioner/ControlNetFileHeaderV0002.proto
@@ -0,0 +1,16 @@
+// 2017-12-11 Kristin Berry - Separated header and point into separate files. 
+
+// Protocol buffer header descriptor for Isis3 Control Networks
+package Isis;
+
+message ControlNetFileHeaderV0002 {
+//  Some fields of ControlNet
+  required string networkId    = 1;
+  required string targetName   = 2;
+  optional string created      = 3;
+  optional string lastModified = 4;
+  optional string description  = 5;
+  optional string userName     = 6;
+  repeated int32  pointMessageSizes = 7 [packed = true];
+}
+
diff --git a/isis/src/control/objs/ControlNetVersioner/ControlNetFileHeaderV0005.proto b/isis/src/control/objs/ControlNetVersioner/ControlNetFileHeaderV0005.proto
new file mode 100644
index 0000000000000000000000000000000000000000..d04e6ca50192996502979d04aff06a18883fe063
--- /dev/null
+++ b/isis/src/control/objs/ControlNetVersioner/ControlNetFileHeaderV0005.proto
@@ -0,0 +1,14 @@
+// Protocol buffer header descriptor for Isis3 Control Networks
+package Isis;
+
+message ControlNetFileHeaderV0005 {
+//  Some fields of ControlNet
+  required string networkId    = 1;
+  required string targetName   = 2;
+  optional string created      = 3;
+  optional string lastModified = 4;
+  optional string description  = 5;
+  optional string userName     = 6;
+  optional int32  numPoints    = 7; 
+}
+
diff --git a/isis/src/control/objs/ControlNetVersioner/ControlNetFileV0001.proto b/isis/src/control/objs/ControlNetVersioner/ControlNetFileProtoV0001.proto
similarity index 94%
rename from isis/src/control/objs/ControlNetVersioner/ControlNetFileV0001.proto
rename to isis/src/control/objs/ControlNetVersioner/ControlNetFileProtoV0001.proto
index ccf0f46c61a7bc2cc6e798593d66d716a2bc1495..fa04643b87e9be3d4c8d024f1a9c9f8e3b7e8b06 100644
--- a/isis/src/control/objs/ControlNetVersioner/ControlNetFileV0001.proto
+++ b/isis/src/control/objs/ControlNetVersioner/ControlNetFileProtoV0001.proto
@@ -1,4 +1,6 @@
 // Protocol buffer descriptor for ISIS3 ControlNet class hierarchy
+//
+// 2017-12-11 Kristin Berry - Separated top-level messages into different files
 
 package Isis;
 
@@ -131,19 +133,3 @@ message ControlNetFileProtoV0001 {
   optional PBNetCubes netcubes = 9;
 }
 
-message ControlNetLogDataProtoV0001 {
-  message Point {
-    message Measure {
-      message DataEntry {
-        required int32 dataType = 2;
-        required double dataValue = 3;
-      }
-
-      repeated DataEntry loggedMeasureData = 2;
-    }
-
-    repeated Measure measures = 2;
-  }
-
-  repeated Point points = 1;
-}
diff --git a/isis/src/control/objs/ControlNetVersioner/ControlNetFileV0001.cpp b/isis/src/control/objs/ControlNetVersioner/ControlNetFileV0001.cpp
deleted file mode 100644
index d378e34c13d7d6acb31769dd364b75421e687a3b..0000000000000000000000000000000000000000
--- a/isis/src/control/objs/ControlNetVersioner/ControlNetFileV0001.cpp
+++ /dev/null
@@ -1,322 +0,0 @@
-#include "ControlNetFileV0001.h"
-
-#include <fstream>
-
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/io/coded_stream.h>
-
-#include "ControlNetFileV0001.pb.h"
-#include "ControlMeasureLogData.h"
-#include "FileName.h"
-#include "IException.h"
-#include "Progress.h"
-#include "Pvl.h"
-#include "PvlGroup.h"
-#include "PvlObject.h"
-#include "PvlKeyword.h"
-
-using namespace google::protobuf;
-using namespace google::protobuf::io;
-using namespace std;
-
-namespace Isis {
-  ControlNetFileV0001::ControlNetFileV0001() {
-    p_network = new ControlNetFileProtoV0001;
-    p_logData = new ControlNetLogDataProtoV0001;
-  }
-
-
-  ControlNetFileV0001::~ControlNetFileV0001() {
-    delete p_network;
-    delete p_logData;
-  }
-
-
-  void ControlNetFileV0001::Read(const Pvl &head, const FileName &file) {
-    const PvlObject &protoBufferInfo = head.findObject("ProtoBuffer");
-    const PvlObject &protoBufferCore = protoBufferInfo.findObject("Core");
-
-    BigInt coreStartPos = protoBufferCore["StartByte"];
-    BigInt coreLength = protoBufferCore["Bytes"];
-
-    fstream input(file.expanded().toLatin1().data(), ios::in | ios::binary);
-    if (!input.is_open()) {
-      IString msg = "Failed to open PB file" + file.name();
-      throw IException(IException::Programmer, msg, _FILEINFO_);
-    }
-
-    input.seekg(coreStartPos, ios::beg);
-    IstreamInputStream inStream(&input);
-    CodedInputStream codedInStream(&inStream);
-    codedInStream.PushLimit(coreLength);
-    // max 512MB, warn at 400MB
-    codedInStream.SetTotalBytesLimit(1024 * 1024 * 512, 1024 * 1024 * 400);
-
-    // Now stream the rest of the input into the google protocol buffer.
-    try {
-      if (!p_network->ParseFromCodedStream(&codedInStream)) {
-        IString msg = "Failed to read input PB file " + file.name();
-        throw IException(IException::Programmer, msg, _FILEINFO_);
-      }
-    }
-    catch (IException &e) {
-      string msg = "Cannot parse binary PB file";
-      throw IException(e, IException::User, msg, _FILEINFO_);
-    }
-    catch (...) {
-      string msg = "Cannot parse binary PB file";
-      throw IException(IException::User, msg, _FILEINFO_);
-    }
-
-    const PvlObject &logDataInfo = protoBufferInfo.findObject("LogData");
-    BigInt logStartPos = logDataInfo["StartByte"];
-    BigInt logLength = logDataInfo["Bytes"];
-
-    input.clear();
-    input.seekg(logStartPos, ios::beg);
-    IstreamInputStream logInStream(&input);
-    CodedInputStream codedLogInStream(&logInStream);
-    codedLogInStream.PushLimit(logLength);
-    // max 512MB, warn at 400MB
-    codedLogInStream.SetTotalBytesLimit(1024 * 1024 * 512, 1024 * 1024 * 400);
-
-    // Now stream the rest of the input into the google protocol buffer.
-    try {
-      if (!p_logData->ParseFromCodedStream(&codedLogInStream)) {
-        IString msg = "Failed to read log data in PB file [" + file.name() + "]";
-        throw IException(IException::Programmer, msg, _FILEINFO_);
-      }
-    }
-    catch (...) {
-      string msg = "Cannot parse binary PB file's log data";
-      throw IException(IException::User, msg, _FILEINFO_);
-    }
-  }
-
-
-  Pvl ControlNetFileV0001::toPvl() const {
-    Pvl pvl;
-    pvl.addObject(PvlObject("ControlNetwork"));
-    PvlObject &network = pvl.findObject("ControlNetwork");
-
-    network += PvlKeyword("NetworkId", p_network->networkid().c_str());
-    network += PvlKeyword("TargetName", p_network->targetname().c_str());
-    network += PvlKeyword("UserName", p_network->username().c_str());
-    network += PvlKeyword("Created", p_network->created().c_str());
-    network += PvlKeyword("LastModified", p_network->lastmodified().c_str());
-    network += PvlKeyword("Description", p_network->description().c_str());
-
-    // This is the Pvl version we're converting to
-    network += PvlKeyword("Version", "1");
-
-    for (int i = 0; i < p_network->points_size(); i++) {
-      const ControlNetFileProtoV0001_PBControlPoint &binaryPoint =
-          p_network->points(i);
-      PvlObject pvlPoint("ControlPoint");
-
-      if(binaryPoint.type() == ControlNetFileProtoV0001_PBControlPoint::Ground)
-        pvlPoint += PvlKeyword("PointType", "Ground");
-      else
-        pvlPoint += PvlKeyword("PointType", "Tie");
-
-      pvlPoint += PvlKeyword("PointId", binaryPoint.id().c_str());
-      pvlPoint += PvlKeyword("ChooserName", binaryPoint.choosername().c_str());
-      pvlPoint += PvlKeyword("DateTime", binaryPoint.datetime().c_str());
-
-      if (binaryPoint.editlock()) {
-        pvlPoint += PvlKeyword("EditLock", "True");
-      }
-
-      if (binaryPoint.ignore()) {
-        pvlPoint += PvlKeyword("Ignore", "True");
-      }
-
-      switch (binaryPoint.apriorisurfpointsource()) {
-        case ControlNetFileProtoV0001_PBControlPoint::None:
-          break;
-        case ControlNetFileProtoV0001_PBControlPoint::User:
-          pvlPoint += PvlKeyword("AprioriXYZSource", "User");
-          break;
-        case ControlNetFileProtoV0001_PBControlPoint::AverageOfMeasures:
-          pvlPoint += PvlKeyword("AprioriXYZSource", "AverageOfMeasures");
-          break;
-        case ControlNetFileProtoV0001_PBControlPoint::Reference:
-          pvlPoint += PvlKeyword("AprioriXYZSource", "Reference");
-          break;
-        case ControlNetFileProtoV0001_PBControlPoint::Basemap:
-          pvlPoint += PvlKeyword("AprioriXYZSource", "Basemap");
-          break;
-        case ControlNetFileProtoV0001_PBControlPoint::BundleSolution:
-          pvlPoint += PvlKeyword("AprioriXYZSource", "BundleSolution");
-          break;
-        case ControlNetFileProtoV0001_PBControlPoint::Ellipsoid:
-        case ControlNetFileProtoV0001_PBControlPoint::DEM:
-          break;
-      }
-
-      if (binaryPoint.has_apriorisurfpointsourcefile())
-        pvlPoint += PvlKeyword("AprioriXYZSourceFile",
-                        binaryPoint.apriorisurfpointsourcefile().c_str());
-
-      switch (binaryPoint.aprioriradiussource()) {
-        case ControlNetFileProtoV0001_PBControlPoint::None:
-          break;
-        case ControlNetFileProtoV0001_PBControlPoint::User:
-          pvlPoint += PvlKeyword("AprioriRadiusSource", "User");
-          break;
-        case ControlNetFileProtoV0001_PBControlPoint::AverageOfMeasures:
-          pvlPoint += PvlKeyword("AprioriRadiusSource", "AverageOfMeasures");
-          break;
-        case ControlNetFileProtoV0001_PBControlPoint::Reference:
-          pvlPoint += PvlKeyword("AprioriRadiusSource", "Reference");
-          break;
-        case ControlNetFileProtoV0001_PBControlPoint::Basemap:
-          pvlPoint += PvlKeyword("AprioriRadiusSource", "Basemap");
-          break;
-        case ControlNetFileProtoV0001_PBControlPoint::BundleSolution:
-          pvlPoint += PvlKeyword("AprioriRadiusSource", "BundleSolution");
-          break;
-        case ControlNetFileProtoV0001_PBControlPoint::Ellipsoid:
-          pvlPoint += PvlKeyword("AprioriRadiusSource", "Ellipsoid");
-          break;
-        case ControlNetFileProtoV0001_PBControlPoint::DEM:
-          pvlPoint += PvlKeyword("AprioriRadiusSource", "DEM");
-          break;
-      }
-
-      if (binaryPoint.has_aprioriradiussourcefile())
-        pvlPoint += PvlKeyword("AprioriRadiusSourceFile",
-                        binaryPoint.aprioriradiussourcefile().c_str());
-
-      if(binaryPoint.has_apriorix()) {
-        pvlPoint += PvlKeyword("AprioriX", toString(binaryPoint.apriorix()), "meters");
-        pvlPoint += PvlKeyword("AprioriY", toString(binaryPoint.aprioriy()), "meters");
-        pvlPoint += PvlKeyword("AprioriZ", toString(binaryPoint.aprioriz()), "meters");
-
-        if(binaryPoint.aprioricovar_size()) {
-          PvlKeyword matrix("AprioriCovarianceMatrix");
-          matrix += toString(binaryPoint.aprioricovar(0));
-          matrix += toString(binaryPoint.aprioricovar(1));
-          matrix += toString(binaryPoint.aprioricovar(2));
-          matrix += toString(binaryPoint.aprioricovar(3));
-          matrix += toString(binaryPoint.aprioricovar(4));
-          matrix += toString(binaryPoint.aprioricovar(5));
-          pvlPoint += matrix;
-        }
-      }
-
-      if(binaryPoint.latitudeconstrained() &&
-         (binaryPoint.aprioricovar_size() || binaryPoint.adjustedcovar_size()))
-        pvlPoint += PvlKeyword("LatitudeConstrained", "True");
-
-      if(binaryPoint.longitudeconstrained() &&
-         (binaryPoint.aprioricovar_size() || binaryPoint.adjustedcovar_size()))
-        pvlPoint += PvlKeyword("LongitudeConstrained", "True");
-
-      if(binaryPoint.radiusconstrained() &&
-         (binaryPoint.aprioricovar_size() || binaryPoint.adjustedcovar_size()))
-        pvlPoint += PvlKeyword("RadiusConstrained", "True");
-
-      if(binaryPoint.has_adjustedx()) {
-        pvlPoint += PvlKeyword("AdjustedX", toString(binaryPoint.adjustedx()), "meters");
-        pvlPoint += PvlKeyword("AdjustedY", toString(binaryPoint.adjustedy()), "meters");
-        pvlPoint += PvlKeyword("AdjustedZ", toString(binaryPoint.adjustedz()), "meters");
-
-        if(binaryPoint.adjustedcovar_size()) {
-          PvlKeyword matrix("AdjustedCovarianceMatrix");
-          matrix += toString(binaryPoint.adjustedcovar(0));
-          matrix += toString(binaryPoint.adjustedcovar(1));
-          matrix += toString(binaryPoint.adjustedcovar(2));
-          matrix += toString(binaryPoint.adjustedcovar(3));
-          matrix += toString(binaryPoint.adjustedcovar(4));
-          matrix += toString(binaryPoint.adjustedcovar(5));
-          pvlPoint += matrix;
-        }
-      }
-
-      for (int j = 0; j < binaryPoint.measures_size(); j++) {
-        PvlGroup pvlMeasure("ControlMeasure");
-        const ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure &
-            binaryMeasure = binaryPoint.measures(j);
-        pvlMeasure += PvlKeyword("SerialNumber", binaryMeasure.serialnumber().c_str());
-
-        switch(binaryMeasure.type()) {
-          case ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure_MeasureType_Candidate:
-            pvlMeasure += PvlKeyword("MeasureType", "Candidate");
-            break;
-          case ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure_MeasureType_Manual:
-            pvlMeasure += PvlKeyword("MeasureType", "Manual");
-            break;
-          case ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure_MeasureType_RegisteredPixel:
-            pvlMeasure += PvlKeyword("MeasureType", "RegisteredPixel");
-            break;
-          case ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure_MeasureType_RegisteredSubPixel:
-            pvlMeasure += PvlKeyword("MeasureType", "RegisteredSubPixel");
-            break;
-        }
-
-        pvlMeasure += PvlKeyword("ChooserName", binaryMeasure.choosername().c_str());
-        pvlMeasure += PvlKeyword("DateTime", binaryMeasure.datetime().c_str());
-
-        if(binaryMeasure.editlock())
-          pvlMeasure += PvlKeyword("EditLock", "True");
-
-        if(binaryMeasure.ignore())
-          pvlMeasure += PvlKeyword("Ignore", "True");
-
-        if(binaryMeasure.has_measurement()) {
-          pvlMeasure += PvlKeyword("Sample", toString(binaryMeasure.measurement().sample()));
-          pvlMeasure += PvlKeyword("Line", toString(binaryMeasure.measurement().line()));
-
-          if (binaryMeasure.measurement().has_sampleresidual())
-            pvlMeasure += PvlKeyword("SampleResidual",
-                toString(binaryMeasure.measurement().sampleresidual()), "pixels");
-
-          if (binaryMeasure.measurement().has_lineresidual())
-            pvlMeasure += PvlKeyword("LineResidual",
-                toString(binaryMeasure.measurement().lineresidual()), "pixels");
-        }
-
-        if (binaryMeasure.has_diameter())
-          pvlMeasure += PvlKeyword("Diameter", toString(binaryMeasure.diameter()));
-
-        if (binaryMeasure.has_apriorisample())
-          pvlMeasure += PvlKeyword("AprioriSample", toString(binaryMeasure.apriorisample()));
-
-        if (binaryMeasure.has_aprioriline())
-          pvlMeasure += PvlKeyword("AprioriLine", toString(binaryMeasure.aprioriline()));
-
-        if (binaryMeasure.has_samplesigma())
-          pvlMeasure += PvlKeyword("SampleSigma", toString(binaryMeasure.samplesigma()));
-
-        if (binaryMeasure.has_samplesigma())
-          pvlMeasure += PvlKeyword("LineSigma", toString(binaryMeasure.linesigma()));
-
-         for (int logEntry = 0;
-             logEntry <
-               p_logData->points(i).measures(j).loggedmeasuredata_size();
-             logEntry ++) {
-           const ControlNetLogDataProtoV0001_Point_Measure_DataEntry &log =
-               p_logData->points(i).measures(j).loggedmeasuredata(logEntry);
-
-           try {
-             ControlMeasureLogData interpreter(log);
-             pvlMeasure += interpreter.ToKeyword();
-           }
-           catch(IException &) {
-           }
-         }
-
-        if(binaryPoint.has_referenceindex() &&
-           binaryPoint.referenceindex() == j)
-          pvlMeasure += PvlKeyword("Reference", "True");
-
-        pvlPoint.addGroup(pvlMeasure);
-      }
-
-      network.addObject(pvlPoint);
-    }
-
-    return pvl;
-  }
-}
diff --git a/isis/src/control/objs/ControlNetVersioner/ControlNetFileV0001.h b/isis/src/control/objs/ControlNetVersioner/ControlNetFileV0001.h
deleted file mode 100644
index fd3857fbb8f130eb413e58b0284c06fd8f8ea5b2..0000000000000000000000000000000000000000
--- a/isis/src/control/objs/ControlNetVersioner/ControlNetFileV0001.h
+++ /dev/null
@@ -1,95 +0,0 @@
-#ifndef ControlNetFileV0001_h
-#define ControlNetFileV0001_h
-/**
- * @file
- * $Revision: 1.9 $
- * $Date: 2009/07/15 17:33:52 $
- *
- *   Unless noted otherwise, the portions of Isis written by the USGS are
- *   public domain. See individual third-party library and package descriptions
- *   for intellectual property information, user agreements, and related
- *   information.
- *
- *   Although Isis has been used by the USGS, no warranty, expressed or
- *   implied, is made by the USGS as to the accuracy and functioning of such
- *   software and related material nor shall the fact of distribution
- *   constitute any such warranty, and no responsibility is assumed by the
- *   USGS in connection therewith.
- *
- *   For additional information, launch
- *   $ISISROOT/doc//documents/Disclaimers/Disclaimers.html
- *   in a browser or see the Privacy &amp; Disclaimers page on the Isis website,
- *   http://isis.astrogeology.usgs.gov, and the USGS privacy and disclaimers on
- *   http://www.usgs.gov/privacy.html.
- */
-
-#include "ControlNetFile.h"
-
-template <typename A> class QList;
-
-namespace Isis {
-  class ControlNetFileProtoV0001;
-  class ControlNetLogDataProtoV0001;
-
-  /**
-   * @brief Handle Binary Control Network Files version 1
-   *
-   * This functionality and history was extracted from Isis::ControlNet
-   *
-   * @author 2011-04-08 Steven Lambright
-   *
-   * @internal
-   *   @history 2010-01-12 Tracie Sucharski Added support for binary networks,
-   *                added new parameters, renamed ComputeErrors to
-   *                ComputeResiduals, renamed MaximumError to MaximumResidual,
-   *                renamed AverageError to AverageResidual.
-   *   @history 2010-08-05 Steven Lambright New label format much closer to a
-   *                cube so that we can expand upon it easily later. Also added
-   *                support for more than just the protocol buffer in the file,
-   *                at the current cost of reading the protocol buffer's binary
-   *                data into memory. This might need to be changed later.
-   *   @history 2011-04-04 Steven Lambright - Reading is more likely to work...
-   *                not sure why my changes fixed it for very large networks.
-   *                Binary reads now do the same progress as Pvl for console
-   *                output consistency (and because it can take time).
-   *   @history 2011-04-08 Steven Lambright - Extracted functionality to
-   *                ControlNetFileV0001 class
-   */
-  class ControlNetFileV0001 : public ControlNetFile {
-    public:
-      ControlNetFileV0001();
-      virtual ~ControlNetFileV0001();
-
-      virtual void Read(const Pvl &header, const FileName &file);
-
-      // We don't need old Write methods... since this wasn't already
-      //   implemented I'm not going to bother to implement it now.
-      virtual void Write(const FileName &file) const {};
-      virtual Pvl toPvl() const;
-
-      /**
-       * Retrieve the protocol buffer that encapsulates the entire control
-       *   network.
-       */
-      ControlNetFileProtoV0001 &GetNetwork() {
-        return *p_network;
-      }
-
-
-      /**
-       * Retrieve the protocol buffer that encapsulates all of the log data.
-       */
-      ControlNetLogDataProtoV0001 &GetLogData() {
-        return *p_logData;
-      }
-
-    private:
-      //! This contains the entire cnet
-      ControlNetFileProtoV0001 *p_network;
-
-      //! This contains all of the log data in the cnet
-      ControlNetLogDataProtoV0001 *p_logData;
-  };
-}
-
-#endif
diff --git a/isis/src/control/objs/ControlNetVersioner/ControlNetFileV0002.cpp b/isis/src/control/objs/ControlNetVersioner/ControlNetFileV0002.cpp
deleted file mode 100644
index 34de7077d16f4e98146488ac8aad8c49bc5f388f..0000000000000000000000000000000000000000
--- a/isis/src/control/objs/ControlNetVersioner/ControlNetFileV0002.cpp
+++ /dev/null
@@ -1,572 +0,0 @@
-#include "ControlNetFileV0002.h"
-
-#include <fstream>
-
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <boost/numeric/ublas/symmetric.hpp>
-#include <boost/numeric/ublas/io.hpp>
-
-#include <QList>
-#include <QDebug>
-
-#include "ControlMeasureLogData.h"
-#include "ControlNetFileV0002.pb.h"
-#include "FileName.h"
-#include "IException.h"
-#include "Latitude.h"
-#include "Longitude.h"
-#include "NaifStatus.h"
-#include "Pvl.h"
-#include "SurfacePoint.h"
-#include "Target.h"
-
-using namespace google::protobuf;
-using namespace google::protobuf::io;
-using boost::numeric::ublas::symmetric_matrix;
-using boost::numeric::ublas::upper;
-using namespace std;
-
-namespace Isis {
-  ControlNetFileV0002::ControlNetFileV0002() {
-    p_networkHeader = new ControlNetFileHeaderV0002;
-    p_controlPoints = new QList<ControlPointFileEntryV0002>;
-  }
-
-
-  ControlNetFileV0002::~ControlNetFileV0002() {
-    delete p_networkHeader;
-    delete p_controlPoints;
-  }
-
-
-
-  /**
-   * Reads binary version 2
-   *
-   * @internal
-   * @history 2011-05-02 Debbie A. Cook - Converted to read constrained
-   *                     point type
-   *
-   */
-  void ControlNetFileV0002::Read(const Pvl &header, const FileName &file) {
-    const PvlObject &protoBufferInfo = header.findObject("ProtoBuffer");
-    const PvlObject &protoBufferCore = protoBufferInfo.findObject("Core");
-
-    BigInt headerStartPos = protoBufferCore["HeaderStartByte"];
-    BigInt headerLength = protoBufferCore["HeaderBytes"];
-
-    fstream input(file.expanded().toLatin1().data(), ios::in | ios::binary);
-    if (!input.is_open()) {
-      IString msg = "Failed to open control network file" + file.name();
-      throw IException(IException::Programmer, msg, _FILEINFO_);
-    }
-
-    input.seekg(headerStartPos, ios::beg);
-    streampos filePos = input.tellg();
-    IstreamInputStream headerInStream(&input);
-    CodedInputStream headerCodedInStream(&headerInStream);
-    // max 512MB, warn at 400MB
-    headerCodedInStream.SetTotalBytesLimit(1024 * 1024 * 512,
-                                           1024 * 1024 * 400);
-
-    // Now stream the rest of the input into the google protocol buffer.
-    try {
-      filePos += headerLength;
-      int oldLimit = headerCodedInStream.PushLimit(headerLength);
-      if (!p_networkHeader->ParseFromCodedStream(&headerCodedInStream)) {
-        IString msg = "Failed to read input control net file [" +
-            file.name() + "]";
-        throw IException(IException::Io, msg, _FILEINFO_);
-      }
-      headerCodedInStream.PopLimit(oldLimit);
-
-      // Without closing and re-opening the protocol buffers break... no clue
-      //   why other than it's got some static data around keeping track
-      //   maybe. We need to do this for it to reset it's idea of the total
-      //   bytes though. Doing it every time is too expensive - so we're going
-      //   to just do it periodically.
-      IstreamInputStream *pointInStream = NULL;
-      CodedInputStream *pointCodedInStream = NULL;
-
-      for (int cp = 0; cp < p_networkHeader->pointmessagesizes_size(); cp ++) {
-        if (cp % 50000 == 0 && pointCodedInStream && pointInStream) {
-          delete pointCodedInStream;
-          pointCodedInStream = NULL;
-
-          delete pointInStream;
-          pointInStream = NULL;
-        }
-
-        if (pointInStream == NULL) {
-          input.close();
-          input.open(file.expanded().toLatin1().data(), ios::in | ios::binary);
-          input.seekg(filePos, ios::beg);
-
-          pointInStream = new IstreamInputStream(&input);
-          pointCodedInStream = new CodedInputStream(pointInStream);
-          // max 512MB, warn at 400MB
-          pointCodedInStream->SetTotalBytesLimit(1024 * 1024 * 512,
-                                                 1024 * 1024 * 400);
-        }
-
-        int size = p_networkHeader->pointmessagesizes(cp);
-        oldLimit = pointCodedInStream->PushLimit(size);
-
-        filePos += size;
-        ControlPointFileEntryV0002 newPoint;
-        newPoint.ParseFromCodedStream(pointCodedInStream);
-
-        if (newPoint.type() == ControlPointFileEntryV0002::obsolete_Tie ||
-            newPoint.type() == ControlPointFileEntryV0002::obsolete_Ground) {
-          if (newPoint.aprioricovar_size())
-            newPoint.set_type(ControlPointFileEntryV0002::Constrained);
-        }
-
-        p_controlPoints->append(newPoint);
-        pointCodedInStream->PopLimit(oldLimit);
-      }
-
-      if (pointCodedInStream) {
-        delete pointCodedInStream;
-        pointCodedInStream = NULL;
-      }
-
-      if (pointInStream) {
-        delete pointInStream;
-        pointInStream = NULL;
-      }
-    }
-    catch (...) {
-      string msg = "Cannot understand binary PB file";
-      throw IException(IException::Io, msg, _FILEINFO_);
-    }
-  }
-
-  void ControlNetFileV0002::Write(const FileName &file) const {
-    // We need to populate ControlNetFileHeaderV0002::pointMessageSizes
-    p_networkHeader->clear_pointmessagesizes();
-    BigInt pointsSize = 0;
-    BigInt numMeasures = 0;
-    for (int cpIndex = 0; cpIndex < p_controlPoints->size(); cpIndex ++) {
-      numMeasures += p_controlPoints->at(cpIndex).measures_size();
-      int size = p_controlPoints->at(cpIndex).ByteSize();
-      pointsSize += size;
-      p_networkHeader->add_pointmessagesizes(size);
-    }
-
-    streampos coreHeaderSize = p_networkHeader->ByteSize();
-
-    const int labelBytes = 65536;
-    fstream output(file.expanded().toLatin1().data(),
-                   ios::out | ios::trunc | ios::binary);
-
-    char *blankLabel = new char[labelBytes];
-    memset(blankLabel, 0, labelBytes);
-    output.write(blankLabel, labelBytes);
-    delete [] blankLabel;
-
-    streampos startCoreHeaderPos = output.tellp();
-
-    if (!p_networkHeader->SerializeToOstream(&output)) {
-      IString msg = "Failed to write output control network file [" +
-          file.name() + "]";
-      throw IException(IException::Io, msg, _FILEINFO_);
-    }
-
-    streampos curPosition = startCoreHeaderPos + coreHeaderSize;
-    for (int cpIndex = 0; cpIndex < p_controlPoints->size(); cpIndex ++) {
-      if (!p_controlPoints->at(cpIndex).IsInitialized()) {
-        IString msg = "Failed to write output control network file [" +
-            file.name() + "] because control points are missing required "
-            "fields";
-        throw IException(IException::Io, msg, _FILEINFO_);
-      }
-
-      if (!p_controlPoints->at(cpIndex).SerializeToOstream(&output)) {
-        IString msg = "Failed to write output control network file [" +
-            file.name() + "] while attempting to write control points";
-        throw IException(IException::Io, msg, _FILEINFO_);
-      }
-
-      curPosition += p_controlPoints->at(cpIndex).ByteSize();
-    }
-
-    Pvl p;
-    PvlObject protoObj("ProtoBuffer");
-
-    PvlObject protoCore("Core");
-    protoCore.addKeyword(PvlKeyword("HeaderStartByte",
-                         toString((BigInt) startCoreHeaderPos)));
-    protoCore.addKeyword(PvlKeyword("HeaderBytes", toString((BigInt) coreHeaderSize)));
-    protoCore.addKeyword(PvlKeyword("PointsStartByte",
-        toString((BigInt) ( startCoreHeaderPos + coreHeaderSize))));
-    protoCore.addKeyword(PvlKeyword("PointsBytes",
-        toString(pointsSize)));
-    protoObj.addObject(protoCore);
-
-    PvlGroup netInfo("ControlNetworkInfo");
-    netInfo.addComment("This group is for informational purposes only");
-    netInfo += PvlKeyword("NetworkId", p_networkHeader->networkid().c_str());
-    netInfo += PvlKeyword("TargetName", p_networkHeader->targetname().c_str());
-    netInfo += PvlKeyword("UserName", p_networkHeader->username().c_str());
-    netInfo += PvlKeyword("Created", p_networkHeader->created().c_str());
-    netInfo += PvlKeyword("LastModified", p_networkHeader->lastmodified().c_str());
-    netInfo += PvlKeyword("Description", p_networkHeader->description().c_str());
-    netInfo += PvlKeyword("NumberOfPoints", toString(p_controlPoints->size()));
-    netInfo += PvlKeyword("NumberOfMeasures", toString(numMeasures));
-    netInfo += PvlKeyword("Version", "2");
-    protoObj.addGroup(netInfo);
-
-    p.addObject(protoObj);
-
-    output.seekp(0, ios::beg);
-    output << p;
-    output << '\n';
-    output.close();
-  }
-
-
-  /**
-   * Converts binary control net version 2 to pvl version 3
-   *
-   * @internal
-   *   @history 2011-05-02 Debbie A. Cook - Converted to version pvl 3
-   *                           instead of 2
-   *   @history 2011-05-09 Tracie Sucharski - Add comments for printing apriori
-   *                           and adjusted values as lat/lon/radius, and sigmas.
-   *   @history 2011-05-16 Tracie Sucharski - Before trying to get radii, make
-   *                           sure network has a TargetName.  If not, do not add
-   *                           lat/lon/radius comments for SurfacePoints.
-   *   @history 2011-06-07 Tracie Sucharski/Debbie A. Cook - Point Type changes
-   *                           Ground ----> Fixed
-   *                           Tie    ----> Free
-   *
-   */
-  Pvl ControlNetFileV0002::toPvl() const {
-    Pvl pvl;
-    pvl.addObject(PvlObject("ControlNetwork"));
-    PvlObject &network = pvl.findObject("ControlNetwork");
-
-    network += PvlKeyword("NetworkId", p_networkHeader->networkid().c_str());
-    network += PvlKeyword("TargetName", p_networkHeader->targetname().c_str());
-    network += PvlKeyword("UserName", p_networkHeader->username().c_str());
-    network += PvlKeyword("Created", p_networkHeader->created().c_str());
-    network += PvlKeyword("LastModified", p_networkHeader->lastmodified().c_str());
-    network += PvlKeyword("Description", p_networkHeader->description().c_str());
-
-    // This is the Pvl version we're converting to
-    network += PvlKeyword("Version", "3");
-
-    //  Get Target Radii from naif kernel
-    PvlGroup pvlRadii;
-    QString target = (QString)network.findKeyword("TargetName",Pvl::Traverse);
-    if (target != "") {
-      try {
-        NaifStatus::CheckErrors();
-        pvlRadii = Target::radiiGroup(target);
-      }
-      catch (IException) {
-        // leave pvlRadii empty if target is not recognized by NAIF 
-      }
-    }
-
-    ControlPointFileEntryV0002 binaryPoint;
-    foreach(binaryPoint, *p_controlPoints) {
-      PvlObject pvlPoint("ControlPoint");
-
-      if (binaryPoint.type() == ControlPointFileEntryV0002::Fixed) {
-        pvlPoint += PvlKeyword("PointType", "Fixed");
-      }
-      else if (binaryPoint.type() == ControlPointFileEntryV0002::Constrained) {
-        pvlPoint += PvlKeyword("PointType", "Constrained");
-      }
-      else {
-        pvlPoint += PvlKeyword("PointType", "Free");
-      }
-
-      pvlPoint += PvlKeyword("PointId", binaryPoint.id().c_str());
-      pvlPoint += PvlKeyword("ChooserName", binaryPoint.choosername().c_str());
-      pvlPoint += PvlKeyword("DateTime", binaryPoint.datetime().c_str());
-
-      if (binaryPoint.editlock()) {
-        pvlPoint += PvlKeyword("EditLock", "True");
-      }
-
-      if (binaryPoint.ignore()) {
-        pvlPoint += PvlKeyword("Ignore", "True");
-      }
-
-      switch (binaryPoint.apriorisurfpointsource()) {
-        case ControlPointFileEntryV0002::None:
-          break;
-        case ControlPointFileEntryV0002::User:
-          pvlPoint += PvlKeyword("AprioriXYZSource", "User");
-          break;
-        case ControlPointFileEntryV0002::AverageOfMeasures:
-          pvlPoint += PvlKeyword("AprioriXYZSource", "AverageOfMeasures");
-          break;
-        case ControlPointFileEntryV0002::Reference:
-          pvlPoint += PvlKeyword("AprioriXYZSource", "Reference");
-          break;
-        case ControlPointFileEntryV0002::Basemap:
-          pvlPoint += PvlKeyword("AprioriXYZSource", "Basemap");
-          break;
-        case ControlPointFileEntryV0002::BundleSolution:
-          pvlPoint += PvlKeyword("AprioriXYZSource", "BundleSolution");
-          break;
-        case ControlPointFileEntryV0002::Ellipsoid:
-        case ControlPointFileEntryV0002::DEM:
-          break;
-      }
-
-      if (binaryPoint.has_apriorisurfpointsourcefile())
-        pvlPoint += PvlKeyword("AprioriXYZSourceFile",
-                        binaryPoint.apriorisurfpointsourcefile().c_str());
-
-      switch (binaryPoint.aprioriradiussource()) {
-        case ControlPointFileEntryV0002::None:
-          break;
-        case ControlPointFileEntryV0002::User:
-          pvlPoint += PvlKeyword("AprioriRadiusSource", "User");
-          break;
-        case ControlPointFileEntryV0002::AverageOfMeasures:
-          pvlPoint += PvlKeyword("AprioriRadiusSource", "AverageOfMeasures");
-          break;
-        case ControlPointFileEntryV0002::Reference:
-          pvlPoint += PvlKeyword("AprioriRadiusSource", "Reference");
-          break;
-        case ControlPointFileEntryV0002::Basemap:
-          pvlPoint += PvlKeyword("AprioriRadiusSource", "Basemap");
-          break;
-        case ControlPointFileEntryV0002::BundleSolution:
-          pvlPoint += PvlKeyword("AprioriRadiusSource", "BundleSolution");
-          break;
-        case ControlPointFileEntryV0002::Ellipsoid:
-          pvlPoint += PvlKeyword("AprioriRadiusSource", "Ellipsoid");
-          break;
-        case ControlPointFileEntryV0002::DEM:
-          pvlPoint += PvlKeyword("AprioriRadiusSource", "DEM");
-          break;
-      }
-
-      if (binaryPoint.has_aprioriradiussourcefile())
-        pvlPoint += PvlKeyword("AprioriRadiusSourceFile",
-                        binaryPoint.aprioriradiussourcefile().c_str());
-
-      if (binaryPoint.has_apriorix()) {
-        pvlPoint += PvlKeyword("AprioriX", toString(binaryPoint.apriorix()), "meters");
-        pvlPoint += PvlKeyword("AprioriY", toString(binaryPoint.aprioriy()), "meters");
-        pvlPoint += PvlKeyword("AprioriZ", toString(binaryPoint.aprioriz()), "meters");
-
-        // Get surface point, convert to lat,lon,radius and output as comment
-        SurfacePoint apriori;
-        apriori.SetRectangular(
-                Displacement(binaryPoint.apriorix(),Displacement::Meters),
-                Displacement(binaryPoint.aprioriy(),Displacement::Meters),
-                Displacement(binaryPoint.aprioriz(),Displacement::Meters));
-        pvlPoint.findKeyword("AprioriX").addComment("AprioriLatitude = " +
-                                 toString(apriori.GetLatitude().degrees()) +
-                                 " <degrees>");
-        pvlPoint.findKeyword("AprioriY").addComment("AprioriLongitude = " +
-                                 toString(apriori.GetLongitude().degrees()) +
-                                 " <degrees>");
-        pvlPoint.findKeyword("AprioriZ").addComment("AprioriRadius = " +
-                                 toString(apriori.GetLocalRadius().meters()) +
-                                 " <meters>");
-
-        if (binaryPoint.aprioricovar_size()) {
-          PvlKeyword matrix("AprioriCovarianceMatrix");
-          matrix += toString(binaryPoint.aprioricovar(0));
-          matrix += toString(binaryPoint.aprioricovar(1));
-          matrix += toString(binaryPoint.aprioricovar(2));
-          matrix += toString(binaryPoint.aprioricovar(3));
-          matrix += toString(binaryPoint.aprioricovar(4));
-          matrix += toString(binaryPoint.aprioricovar(5));
-          pvlPoint += matrix;
-
-          if (pvlRadii.hasKeyword("EquatorialRadius")) {
-            apriori.SetRadii(
-                         Distance(pvlRadii["EquatorialRadius"],Distance::Meters),
-                         Distance(pvlRadii["EquatorialRadius"],Distance::Meters),
-                         Distance(pvlRadii["PolarRadius"],Distance::Meters));
-            symmetric_matrix<double, upper> covar;
-            covar.resize(3);
-            covar.clear();
-            covar(0, 0) = binaryPoint.aprioricovar(0);
-            covar(0, 1) = binaryPoint.aprioricovar(1);
-            covar(0, 2) = binaryPoint.aprioricovar(2);
-            covar(1, 1) = binaryPoint.aprioricovar(3);
-            covar(1, 2) = binaryPoint.aprioricovar(4);
-            covar(2, 2) = binaryPoint.aprioricovar(5);
-            apriori.SetRectangularMatrix(covar);
-            QString sigmas = "AprioriLatitudeSigma = " +
-                             toString(apriori.GetLatSigmaDistance().meters()) +
-                             " <meters>  AprioriLongitudeSigma = " +
-                             toString(apriori.GetLonSigmaDistance().meters()) +
-                             " <meters>  AprioriRadiusSigma = " +
-                             toString(apriori.GetLocalRadiusSigma().meters()) +
-                             " <meters>";
-            pvlPoint.findKeyword("AprioriCovarianceMatrix").addComment(sigmas);
-          }
-        }
-      }
-
-      if (binaryPoint.latitudeconstrained())
-        pvlPoint += PvlKeyword("LatitudeConstrained", "True");
-
-      if (binaryPoint.longitudeconstrained())
-        pvlPoint += PvlKeyword("LongitudeConstrained", "True");
-
-      if (binaryPoint.radiusconstrained())
-        pvlPoint += PvlKeyword("RadiusConstrained", "True");
-
-      if (binaryPoint.has_adjustedx()) {
-        pvlPoint += PvlKeyword("AdjustedX", toString(binaryPoint.adjustedx()), "meters");
-        pvlPoint += PvlKeyword("AdjustedY", toString(binaryPoint.adjustedy()), "meters");
-        pvlPoint += PvlKeyword("AdjustedZ", toString(binaryPoint.adjustedz()), "meters");
-
-        // Get surface point, convert to lat,lon,radius and output as comment
-        SurfacePoint adjusted;
-        adjusted.SetRectangular(
-                Displacement(binaryPoint.adjustedx(),Displacement::Meters),
-                Displacement(binaryPoint.adjustedy(),Displacement::Meters),
-                Displacement(binaryPoint.adjustedz(),Displacement::Meters));
-        pvlPoint.findKeyword("AdjustedX").addComment("AdjustedLatitude = " +
-                                 toString(adjusted.GetLatitude().degrees()) +
-                                 " <degrees>");
-        pvlPoint.findKeyword("AdjustedY").addComment("AdjustedLongitude = " +
-                                 toString(adjusted.GetLongitude().degrees()) +
-                                 " <degrees>");
-        pvlPoint.findKeyword("AdjustedZ").addComment("AdjustedRadius = " +
-                                 toString(adjusted.GetLocalRadius().meters()) +
-                                 " <meters>");
-
-        if (binaryPoint.adjustedcovar_size()) {
-          PvlKeyword matrix("AdjustedCovarianceMatrix");
-          matrix += toString(binaryPoint.adjustedcovar(0));
-          matrix += toString(binaryPoint.adjustedcovar(1));
-          matrix += toString(binaryPoint.adjustedcovar(2));
-          matrix += toString(binaryPoint.adjustedcovar(3));
-          matrix += toString(binaryPoint.adjustedcovar(4));
-          matrix += toString(binaryPoint.adjustedcovar(5));
-          pvlPoint += matrix;
-
-          if (pvlRadii.hasKeyword("EquatorialRadius")) {
-            adjusted.SetRadii(
-                         Distance(pvlRadii["EquatorialRadius"],Distance::Meters),
-                         Distance(pvlRadii["EquatorialRadius"],Distance::Meters),
-                         Distance(pvlRadii["PolarRadius"],Distance::Meters));
-            symmetric_matrix<double, upper> covar;
-            covar.resize(3);
-            covar.clear();
-            covar(0, 0) = binaryPoint.adjustedcovar(0);
-            covar(0, 1) = binaryPoint.adjustedcovar(1);
-            covar(0, 2) = binaryPoint.adjustedcovar(2);
-            covar(1, 1) = binaryPoint.adjustedcovar(3);
-            covar(1, 2) = binaryPoint.adjustedcovar(4);
-            covar(2, 2) = binaryPoint.adjustedcovar(5);
-            adjusted.SetRectangularMatrix(covar);
-            QString sigmas = "AdjustedLatitudeSigma = " +
-                             toString(adjusted.GetLatSigmaDistance().meters()) +
-                             " <meters>  AdjustedLongitudeSigma = " +
-                             toString(adjusted.GetLonSigmaDistance().meters()) +
-                             " <meters>  AdjustedRadiusSigma = " +
-                             toString(adjusted.GetLocalRadiusSigma().meters()) +
-                             " <meters>";
-            pvlPoint.findKeyword("AdjustedCovarianceMatrix").addComment(sigmas);
-          }
-        }
-      }
-
-      for (int j = 0; j < binaryPoint.measures_size(); j++) {
-        PvlGroup pvlMeasure("ControlMeasure");
-        const ControlPointFileEntryV0002_Measure &
-            binaryMeasure = binaryPoint.measures(j);
-        pvlMeasure += PvlKeyword("SerialNumber", binaryMeasure.serialnumber().c_str());
-
-        switch(binaryMeasure.type()) {
-          case ControlPointFileEntryV0002_Measure_MeasureType_Candidate:
-            pvlMeasure += PvlKeyword("MeasureType", "Candidate");
-            break;
-          case ControlPointFileEntryV0002_Measure_MeasureType_Manual:
-            pvlMeasure += PvlKeyword("MeasureType", "Manual");
-            break;
-          case ControlPointFileEntryV0002_Measure_MeasureType_RegisteredPixel:
-            pvlMeasure += PvlKeyword("MeasureType", "RegisteredPixel");
-            break;
-          case ControlPointFileEntryV0002_Measure_MeasureType_RegisteredSubPixel:
-            pvlMeasure += PvlKeyword("MeasureType", "RegisteredSubPixel");
-            break;
-        }
-
-        if (binaryMeasure.has_choosername())
-          pvlMeasure += PvlKeyword("ChooserName", binaryMeasure.choosername().c_str());
-
-        if (binaryMeasure.has_datetime())
-          pvlMeasure += PvlKeyword("DateTime", binaryMeasure.datetime().c_str());
-
-        if (binaryMeasure.editlock())
-          pvlMeasure += PvlKeyword("EditLock", "True");
-
-        if (binaryMeasure.ignore())
-          pvlMeasure += PvlKeyword("Ignore", "True");
-
-        if (binaryMeasure.has_sample())
-          pvlMeasure += PvlKeyword("Sample", toString(binaryMeasure.sample()));
-
-        if (binaryMeasure.has_line())
-          pvlMeasure += PvlKeyword("Line", toString(binaryMeasure.line()));
-
-        if (binaryMeasure.has_diameter())
-          pvlMeasure += PvlKeyword("Diameter", toString(binaryMeasure.diameter()));
-
-        if (binaryMeasure.has_apriorisample())
-          pvlMeasure += PvlKeyword("AprioriSample", toString(binaryMeasure.apriorisample()));
-
-        if (binaryMeasure.has_aprioriline())
-          pvlMeasure += PvlKeyword("AprioriLine", toString(binaryMeasure.aprioriline()));
-
-        if (binaryMeasure.has_samplesigma())
-          pvlMeasure += PvlKeyword("SampleSigma", toString(binaryMeasure.samplesigma()),
-                                   "pixels");
-
-        if (binaryMeasure.has_samplesigma())
-          pvlMeasure += PvlKeyword("LineSigma", toString(binaryMeasure.linesigma()),
-                                   "pixels");
-
-        if (binaryMeasure.has_sampleresidual())
-          pvlMeasure += PvlKeyword("SampleResidual", toString(binaryMeasure.sampleresidual()),
-                                   "pixels");
-
-        if (binaryMeasure.has_lineresidual())
-          pvlMeasure += PvlKeyword("LineResidual", toString(binaryMeasure.lineresidual()),
-                                   "pixels");
-
-        if (binaryMeasure.has_jigsawrejected()) {
-         pvlMeasure += PvlKeyword("JigsawRejected", toString(binaryMeasure.jigsawrejected()));
-        }
-
-        for (int logEntry = 0;
-            logEntry < binaryMeasure.log_size();
-            logEntry ++) {
-          const ControlPointFileEntryV0002_Measure_MeasureLogData &log =
-                binaryMeasure.log(logEntry);
-
-          ControlMeasureLogData interpreter(log);
-          pvlMeasure += interpreter.ToKeyword();
-        }
-
-        if (binaryPoint.has_referenceindex() &&
-           binaryPoint.referenceindex() == j)
-          pvlMeasure += PvlKeyword("Reference", "True");
-
-        pvlPoint.addGroup(pvlMeasure);
-      }
-
-      network.addObject(pvlPoint);
-    }
-    return pvl;
-  }
-}
-
diff --git a/isis/src/control/objs/ControlNetVersioner/ControlNetFileV0002.h b/isis/src/control/objs/ControlNetVersioner/ControlNetFileV0002.h
deleted file mode 100644
index 7b7df7732d6cae186bb29e69d3e8ca0827c46c6e..0000000000000000000000000000000000000000
--- a/isis/src/control/objs/ControlNetVersioner/ControlNetFileV0002.h
+++ /dev/null
@@ -1,98 +0,0 @@
-#ifndef ControlNetFileV0002_h
-#define ControlNetFileV0002_h
-/**
- * @file
- * $Revision: 1.9 $
- * $Date: 2009/07/15 17:33:52 $
- *
- *   Unless noted otherwise, the portions of Isis written by the USGS are
- *   public domain. See individual third-party library and package descriptions
- *   for intellectual property information, user agreements, and related
- *   information.
- *
- *   Although Isis has been used by the USGS, no warranty, expressed or
- *   implied, is made by the USGS as to the accuracy and functioning of such
- *   software and related material nor shall the fact of distribution
- *   constitute any such warranty, and no responsibility is assumed by the
- *   USGS in connection therewith.
- *
- *   For additional information, launch
- *   $ISISROOT/doc//documents/Disclaimers/Disclaimers.html
- *   in a browser or see the Privacy &amp; Disclaimers page on the Isis website,
- *   http://isis.astrogeology.usgs.gov, and the USGS privacy and disclaimers on
- *   http://www.usgs.gov/privacy.html.
- */
-
-#include "ControlNetFile.h"
-
-template <typename A> class QList;
-
-namespace Isis {
-  class ControlNetFileHeaderV0002;
-  class ControlPointFileEntryV0002;
-  class FileName;
-
-  /**
-   * @brief Handle Binary Control Network Files version 2
-   *
-   * We went to binary v2 in order to split up the protocol buffer messages
-   *   by ControlPoint in order to completely avoid the maximum file size
-   *   limitation (512MB before protocol buffers might fail).
-   *
-   * This version takes the separate 'log' and 'network' sections and combines
-   *   them while simuntaneously splitting up the control points and network
-   *   header. Please keep in mind you can play with optional keywords all
-   *   day long without requiring a new binary control network version - this
-   *   should be done only when necessary. Upgrading the Pvl version does NOT
-   *   require having a new "ControlNetFile" child - simply handle that directly
-   *   in the ControlNetVersioner.
-   *
-   * @author 2011-04-07 Steven Lambright
-   *
-   * @internal
-   *   @history 2011-06-21 Steven Lambright - Files can have a larger size now
-   *   @history 2012-11-30 Debbie A. Cook - Changed to use TProjection and RingPlaneProjection
-   *                           instead of Projection.  References #775.
-   *   @history 2013-05-22 Kimberly Oyama and Tracie Sucharski - Added the JIGSAWREJECTED
-   *                           keyword to the toPvl() method. Fixes #661.
-   *   @history 2016-04-22 Jeannie Backer - Removed thrown exception in
-   *                           toPvl() when unable to find TargetRadii values. Instead, we
-   *                           will just leave these values blank. References #3892
-   */
-  class ControlNetFileV0002 : public ControlNetFile {
-    public:
-      ControlNetFileV0002();
-      virtual ~ControlNetFileV0002();
-
-      virtual void Read(const Pvl &header, const FileName &file);
-      virtual void Write(const FileName &file) const;
-      virtual Pvl toPvl() const;
-
-      /**
-       * Get the control network level information - things like NetworkID,
-       *   TargetName, etc...
-       *
-       * "ControlNetFileHeaderV0002::pointmessagesizes" is only used for IO
-       *   and you cannot assume it is populated.
-       */
-      ControlNetFileHeaderV0002 &GetNetworkHeader() {
-        return *p_networkHeader;
-      }
-
-      /**
-       * Get the control point data along with the log data.
-       */
-      QList<ControlPointFileEntryV0002> &GetNetworkPoints() {
-        return *p_controlPoints;
-      }
-
-    private:
-      //! This contains global cnet information...
-      ControlNetFileHeaderV0002 *p_networkHeader;
-
-      //! All of the control points
-      QList<ControlPointFileEntryV0002> *p_controlPoints;
-  };
-}
-
-#endif
diff --git a/isis/src/control/objs/ControlNetVersioner/ControlNetLogDataProtoV0001.proto b/isis/src/control/objs/ControlNetVersioner/ControlNetLogDataProtoV0001.proto
new file mode 100644
index 0000000000000000000000000000000000000000..2726a9f952e1e2f40aeab10893dcc74818b292bd
--- /dev/null
+++ b/isis/src/control/objs/ControlNetVersioner/ControlNetLogDataProtoV0001.proto
@@ -0,0 +1,22 @@
+// Protocol buffer descriptor for ISIS3 ControlNet class hierarchy
+//
+// 2017-12-11 Kristin Berry - Separated top-level messages into different files
+
+package Isis;
+
+message ControlNetLogDataProtoV0001 {
+  message Point {
+    message Measure {
+      message DataEntry {
+        required int32 dataType = 2;
+        required double dataValue = 3;
+      }
+
+      repeated DataEntry loggedMeasureData = 2;
+    }
+
+    repeated Measure measures = 2;
+  }
+
+  repeated Point points = 1;
+}
diff --git a/isis/src/control/objs/ControlNetVersioner/ControlNetVersioner.cpp b/isis/src/control/objs/ControlNetVersioner/ControlNetVersioner.cpp
index 0a9d11800794e3146bbd0bbc422945e63d47ad60..f02c607873ca0537c9562ce24ad9341501adb3cd 100644
--- a/isis/src/control/objs/ControlNetVersioner/ControlNetVersioner.cpp
+++ b/isis/src/control/objs/ControlNetVersioner/ControlNetVersioner.cpp
@@ -1,19 +1,25 @@
 #include "ControlNetVersioner.h"
 
-#include <string>
+#include <boost/numeric/ublas/symmetric.hpp>
+#include <boost/numeric/ublas/io.hpp>
 
 #include <QDebug>
+#include <QString>
 
-#include "ControlNetFile.h"
-#include "ControlNetFileV0001.h"
-#include "ControlNetFileV0002.h"
-#include "ControlNetFileV0002.pb.h"
+#include "ControlNetFileHeaderV0002.pb.h"
+#include "ControlNetFileHeaderV0005.pb.h"
+#include "ControlNetLogDataProtoV0001.pb.h"
+#include "ControlPointFileEntryV0002.pb.h"
+
+#include "ControlMeasure.h"
+#include "ControlNet.h"
 #include "ControlMeasureLogData.h"
 #include "Distance.h"
+#include "EndianSwapper.h"
 #include "FileName.h"
 #include "IException.h"
-#include "IString.h"
 #include "Latitude.h"
+#include "LinearAlgebra.h"
 #include "Longitude.h"
 #include "NaifStatus.h"
 #include "Progress.h"
@@ -21,930 +27,2095 @@
 #include "PvlGroup.h"
 #include "PvlKeyword.h"
 #include "PvlObject.h"
+#include "SpecialPixel.h"
 #include "SurfacePoint.h"
 #include "Target.h"
 
+
+#include <google/protobuf/io/zero_copy_stream_impl.h>
+#include <google/protobuf/io/zero_copy_stream.h>
+#include <google/protobuf/io/coded_stream.h>
+
+using boost::numeric::ublas::symmetric_matrix;
+using boost::numeric::ublas::upper;
+using namespace google::protobuf::io;
 using namespace std;
 
 namespace Isis {
-  
+
   /**
-   * Read the control network from disk. This will always return the network in
-   *   its "latest version" binary form. Generally this will only be called by
-   *   ControlNet but a conversion from binary to pvl can make use out of this
-   *   also.
-   *
-   * @param networkFileName The filename of the cnet to be read
+   * Construct a ControlNetVersioner from a control network. This versioner can only be used to
+   * write out the control points in the control network. It is expected that the control points
+   * in the control network will not be deleted while the control net versioner persists.
    *
+   * @param net A pointer to the network that will be written out.
    */
-  LatestControlNetFile *ControlNetVersioner::Read(const FileName &networkFileName) {
-    
-    try {
-      Pvl network(networkFileName.expanded());
-
-      if (network.hasObject("ProtoBuffer")) {
-        return ReadBinaryNetwork(network, networkFileName);
-      }
-      else if (network.hasObject("ControlNetwork")) {
-        return ReadPvlNetwork(network);
-      }
-      else {
-        IString msg = "Could not determine the control network file type";
-        throw IException(IException::Io, msg, _FILEINFO_);
-      }
-    }
-    catch (IException &e) {
-      IString msg = "Reading the control network [" + networkFileName.name()
-          + "] failed";
-      throw IException(e, IException::Io, msg, _FILEINFO_);
-    }
+  ControlNetVersioner::ControlNetVersioner(ControlNet *net)
+      : m_ownsPoints(false) {
+    // Populate the internal list of points.
+    m_points.append( net->GetPoints() );
+
+    ControlNetHeaderV0001 header;
+
+    header.networkID = net->GetNetworkId();
+    header.targetName = net->GetTarget();
+    header.created = net->CreatedDate();
+    header.lastModified = net->GetLastModified();
+    header.description = net->Description();
+    header.userName = net->GetUserName();
+    createHeader(header);
   }
 
-  
+
   /**
-   * This will write a control net file object to disk.
+   * Construct a ControlNetVersioner from a file. The file will be read in and converted into
+   * a header object that contains general information about the network and a list of
+   * ControlPoints.
    *
-   * @param file file The output filename that will be written to
-   * @param fileData The ControlNetFile representation to write
-   * @param pvl True if the output format should be Pvl, false if not
+   * @param netFile The control network file to read in.
+   * @param progress The progress object to track reading points.
    *
+   * @see ControlNetVersioner::Read
    */
-  void ControlNetVersioner::Write(const FileName &file,
-      const LatestControlNetFile &fileData, bool pvl) {
-    
-    if (pvl) {
-      fileData.toPvl().write(file.expanded());
-    }
-    else {
-      fileData.Write(file);
-    }
+  ControlNetVersioner::ControlNetVersioner(const FileName netFile, Progress *progress)
+      : m_ownsPoints(true) {
+    read(netFile, progress);
   }
 
 
   /**
-   * This interprets a Pvl network of any version. Since we already have the
-   *   Pvl in memory (we need it to figure out if it is a Pvl network) it
-   *   does not actually call Pvl::Read.
-   *
-   * The update cycle is contained in this method. Old versions of Pvl will be
-   *   updated until they reach the latest version and then LatestPvlToBinary
-   *   will be called to convert it back to a LatestControlNetFile.
-   *
-   * To add a new version, you only need to add a case to the switch that
-   *   calls a method (ConvertVersionAToVersionB). No other code should be
-   *   necessary. ConvertVersionAToVersionB is expected to update the Pvl's
-   *   version number.
-   *
-   * @param pvl The pvl network obtained from Pvl::Read on the input filename
+   * Destroy a ControlNetVersioner. If the versioner owns the control points stored in it,
+   * they will also be deleted.
    */
-  LatestControlNetFile *ControlNetVersioner::ReadPvlNetwork(Pvl pvl) {
-    
-    PvlObject &network = pvl.findObject("ControlNetwork");
-
-    if (!network.hasKeyword("Version"))
-      network += PvlKeyword("Version", "1");
-
-    int version = toInt(network["Version"][0]);
-
-    while (version != LATEST_PVL_VERSION) {
-      int previousVersion = version;
-
-      switch (version) {
-        case 1:
-          ConvertVersion1ToVersion2(network);
-          break;
-
-        case 2:
-          ConvertVersion2ToVersion3(network);
-          break;
-
-        case 3:
-          ConvertVersion3ToVersion4(network);
-          break;
-
-        default:
-          IString msg = "The Pvl file version [" + IString(version) + "] is not"
-              " supported";
-          throw IException(IException::Unknown, msg, _FILEINFO_);
-      }
-
-      version = toInt(network["Version"][0]);
-
-      if (version == previousVersion) {
-        IString msg = "Cannot update from version [" + IString(version) + "] "
-            "to any other version";
-          throw IException(IException::Programmer, msg, _FILEINFO_);
+  ControlNetVersioner::~ControlNetVersioner() {
+    if ( m_ownsPoints ) {
+      while ( !m_points.isEmpty() ) {
+        ControlPoint *unusedPoint = m_points.takeFirst();
+        delete unusedPoint;
+        unusedPoint = NULL;
       }
     }
-
-    return LatestPvlToBinary(network);
   }
 
 
   /**
-   * Convert a pvl (in the latest version) back to binary (LatestControlNetFile)
+   * Returns the ID for the network.
    *
-   * This does exactly what you think it would do - it copies PvlKeywords into
-   *   protocol buffer objects. Helper methods Copy(...) do most of the work.
-   *   Any unexpected keywords in the Pvl will cause an exception to be thrown.
-   *   Not enough keywords in the Pvl will cause an exception to be thrown.
-   *   The returned LatestControlNetFile is guaranteed to have all required
-   *   fields.
-   *
-   * @param network The input PVL Control Network to convert
+   * @return @b QString The network ID as a string
    */
-  LatestControlNetFile *ControlNetVersioner::LatestPvlToBinary(PvlObject &network) {
-    
-    LatestControlNetFile *latest = new LatestControlNetFile;
-
-    ControlNetFileHeaderV0002 &header = latest->GetNetworkHeader();
-
-    header.set_networkid(network.findKeyword("NetworkId")[0].toLatin1().data());
-    header.set_targetname(network.findKeyword("TargetName")[0].toLatin1().data());
-    header.set_created(network.findKeyword("Created")[0].toLatin1().data());
-    header.set_lastmodified(network.findKeyword("LastModified")[0].toLatin1().data());
-    header.set_description(network.findKeyword("Description")[0].toLatin1().data());
-    header.set_username(network.findKeyword("UserName")[0].toLatin1().data());
-    header.add_pointmessagesizes(0); // Just to pass the "IsInitialized" test
-
-    if (!header.IsInitialized()) {
-      IString msg = "There is missing required information in the network "
-          "header";
-      throw IException(IException::Io, msg, _FILEINFO_);
-    }
-
-    QList<ControlPointFileEntryV0002> &points = latest->GetNetworkPoints();
+  QString ControlNetVersioner::netId() const {
+    return m_header.networkID;
+  }
 
-    for (int objectIndex = 0; objectIndex < network.objects(); objectIndex ++) {
-      ControlPointFileEntryV0002 point;
-      PvlObject &object = network.object(objectIndex);
-
-      Copy(object, "PointId",
-           point, &ControlPointFileEntryV0002::set_id);
-      Copy(object, "ChooserName",
-           point, &ControlPointFileEntryV0002::set_choosername);
-      Copy(object, "DateTime",
-           point, &ControlPointFileEntryV0002::set_datetime);
-      Copy(object, "AprioriXYZSourceFile",
-           point, &ControlPointFileEntryV0002::set_apriorisurfpointsourcefile);
-      Copy(object, "AprioriRadiusSourceFile",
-           point, &ControlPointFileEntryV0002::set_aprioriradiussourcefile);
-      Copy(object, "JigsawRejected",
-           point, &ControlPointFileEntryV0002::set_jigsawrejected);
-      Copy(object, "EditLock",
-           point, &ControlPointFileEntryV0002::set_editlock);
-      Copy(object, "Ignore",
-           point, &ControlPointFileEntryV0002::set_ignore);
-      Copy(object, "AprioriX",
-           point, &ControlPointFileEntryV0002::set_apriorix);
-      Copy(object, "AprioriY",
-           point, &ControlPointFileEntryV0002::set_aprioriy);
-      Copy(object, "AprioriZ",
-           point, &ControlPointFileEntryV0002::set_aprioriz);
-      Copy(object, "AdjustedX",
-           point, &ControlPointFileEntryV0002::set_adjustedx);
-      Copy(object, "AdjustedY",
-           point, &ControlPointFileEntryV0002::set_adjustedy);
-      Copy(object, "AdjustedZ",
-           point, &ControlPointFileEntryV0002::set_adjustedz);
-      Copy(object, "LatitudeConstrained",
-           point, &ControlPointFileEntryV0002::set_latitudeconstrained);
-      Copy(object, "LongitudeConstrained",
-           point, &ControlPointFileEntryV0002::set_longitudeconstrained);
-      Copy(object, "RadiusConstrained",
-           point, &ControlPointFileEntryV0002::set_radiusconstrained);
-
-      if (object["PointType"][0] == "Fixed")
-        point.set_type(ControlPointFileEntryV0002::Fixed);
-      else if (object["PointType"][0] == "Constrained")
-        point.set_type(ControlPointFileEntryV0002::Constrained);
-      else
-        point.set_type(ControlPointFileEntryV0002::Free);
-
-      if (object.hasKeyword("AprioriXYZSource")) {
-        IString source = object["AprioriXYZSource"][0];
-
-        if (source == "None") {
-          point.set_apriorisurfpointsource(ControlPointFileEntryV0002::None);
-        }
-        else if (source == "User") {
-          point.set_apriorisurfpointsource(ControlPointFileEntryV0002::User);
-        }
-        else if (source == "AverageOfMeasures") {
-          point.set_apriorisurfpointsource(
-              ControlPointFileEntryV0002::AverageOfMeasures);
-        }
-        else if (source == "Reference") {
-          point.set_apriorisurfpointsource(
-              ControlPointFileEntryV0002::Reference);
-        }
-        else if (source == "Basemap") {
-          point.set_apriorisurfpointsource(
-              ControlPointFileEntryV0002::Basemap);
-        }
-        else if (source == "BundleSolution") {
-          point.set_apriorisurfpointsource(
-              ControlPointFileEntryV0002::BundleSolution);
-        }
-        else {
-          IString msg = "Invalid AprioriXYZSource [" + source + "]";
-          throw IException(IException::User, msg, _FILEINFO_);
-        }
-      }
 
-      if (object.hasKeyword("AprioriRadiusSource")) {
-        IString source = object["AprioriRadiusSource"][0];
+  /**
+   * Returns the target for the network.
+   *
+   * @return @b QString The target name as a string
+   */
+  QString ControlNetVersioner::targetName() const {
+    return m_header.targetName;
+  }
 
-        if (source == "None") {
-          point.set_aprioriradiussource(ControlPointFileEntryV0002::None);
-        }
-        else if (source == "User") {
-          point.set_aprioriradiussource(ControlPointFileEntryV0002::User);
-        }
-        else if (source == "AverageOfMeasures") {
-          point.set_aprioriradiussource(ControlPointFileEntryV0002::AverageOfMeasures);
-        }
-        else if (source == "Ellipsoid") {
-          point.set_aprioriradiussource(ControlPointFileEntryV0002::Ellipsoid);
-        }
-        else if (source == "DEM") {
-          point.set_aprioriradiussource(ControlPointFileEntryV0002::DEM);
-        }
-        else if (source == "BundleSolution") {
-          point.set_aprioriradiussource(ControlPointFileEntryV0002::BundleSolution);
-        }
-        else {
-          std::string msg = "Invalid AprioriRadiusSource, [" + source + "]";
-          throw IException(IException::User, msg, _FILEINFO_);
-        }
-      }
 
-      if (object.hasKeyword("AprioriCovarianceMatrix")) {
-        PvlKeyword &matrix = object["AprioriCovarianceMatrix"];
-
-        point.add_aprioricovar(toDouble(matrix[0]));
-        point.add_aprioricovar(toDouble(matrix[1]));
-        point.add_aprioricovar(toDouble(matrix[2]));
-        point.add_aprioricovar(toDouble(matrix[3]));
-        point.add_aprioricovar(toDouble(matrix[4]));
-        point.add_aprioricovar(toDouble(matrix[5]));
-      }
-
-      if (object.hasKeyword("AdjustedCovarianceMatrix")) {
-        PvlKeyword &matrix = object["AdjustedCovarianceMatrix"];
-
-        point.add_adjustedcovar(toDouble(matrix[0]));
-        point.add_adjustedcovar(toDouble(matrix[1]));
-        point.add_adjustedcovar(toDouble(matrix[2]));
-        point.add_adjustedcovar(toDouble(matrix[3]));
-        point.add_adjustedcovar(toDouble(matrix[4]));
-        point.add_adjustedcovar(toDouble(matrix[5]));
-      }
-
-      //  Process Measures
-      for (int groupIndex = 0; groupIndex < object.groups(); groupIndex ++) {
-        PvlGroup &group = object.group(groupIndex);
-        ControlPointFileEntryV0002::Measure measure;
-
-        Copy(group, "SerialNumber",
-             measure, &ControlPointFileEntryV0002::Measure::set_serialnumber);
-        Copy(group, "ChooserName",
-             measure, &ControlPointFileEntryV0002::Measure::set_choosername);
-        Copy(group, "Sample",
-             measure, &ControlPointFileEntryV0002::Measure::set_sample);
-        Copy(group, "Line",
-             measure, &ControlPointFileEntryV0002::Measure::set_line);
-        Copy(group, "SampleResidual",
-             measure, &ControlPointFileEntryV0002::Measure::set_sampleresidual);
-        Copy(group, "LineResidual",
-             measure, &ControlPointFileEntryV0002::Measure::set_lineresidual);
-        Copy(group, "DateTime",
-             measure, &ControlPointFileEntryV0002::Measure::set_datetime);
-        Copy(group, "Diameter",
-             measure, &ControlPointFileEntryV0002::Measure::set_diameter);
-        Copy(group, "EditLock",
-             measure, &ControlPointFileEntryV0002::Measure::set_editlock);
-        Copy(group, "Ignore",
-             measure, &ControlPointFileEntryV0002::Measure::set_ignore);
-        Copy(group, "JigsawRejected",
-             measure, &ControlPointFileEntryV0002::Measure::set_jigsawrejected);
-        Copy(group, "AprioriSample",
-             measure, &ControlPointFileEntryV0002::Measure::set_apriorisample);
-        Copy(group, "AprioriLine",
-             measure, &ControlPointFileEntryV0002::Measure::set_aprioriline);
-        Copy(group, "SampleSigma",
-             measure, &ControlPointFileEntryV0002::Measure::set_samplesigma);
-        Copy(group, "LineSigma",
-             measure, &ControlPointFileEntryV0002::Measure::set_linesigma);
-
-        if (group.hasKeyword("Reference")) {
-          if (group["Reference"][0].toLower() == "true")
-            point.set_referenceindex(groupIndex);
-
-          group.deleteKeyword("Reference");
-        }
-
-        QString type = group["MeasureType"][0].toLower();
-        if (type == "candidate")
-          measure.set_type(ControlPointFileEntryV0002::Measure::Candidate);
-        else if (type == "manual")
-          measure.set_type(ControlPointFileEntryV0002::Measure::Manual);
-        else if (type == "registeredpixel")
-          measure.set_type(ControlPointFileEntryV0002::Measure::RegisteredPixel);
-        else if (type == "registeredsubpixel")
-          measure.set_type(ControlPointFileEntryV0002::Measure::RegisteredSubPixel);
-        else
-          throw IException(IException::Io,
-                           "Unknown measure type [" + type + "]",
-                           _FILEINFO_);
-        group.deleteKeyword("MeasureType");
-
-        for (int key = 0; key < group.keywords(); key++) {
-          ControlMeasureLogData interpreter(group[key]);
-          if (!interpreter.IsValid()) {
-            IString msg = "Unhandled or duplicate keywords in control measure ["
-                + group[key].name() + "]";
-            throw IException(IException::Programmer, msg, _FILEINFO_);
-          }
-          else {
-            *measure.add_log() = interpreter.ToProtocolBuffer();
-          }
-        }
+  /**
+   * Returns the date and time that the network was created
+   *
+   * @return @b QString The date and time the network was created as a string
+   */
+  QString ControlNetVersioner::creationDate() const {
+    return m_header.created;
+  }
 
-        *point.add_measures() = measure;
-      }
 
-      if (!point.IsInitialized()) {
-        IString msg = "There is missing required information in the control "
-            "points or measures";
-        throw IException(IException::Io, msg, _FILEINFO_);
-      }
+  /**
+   * Returns the date and time of the last modification to the network.
+   *
+   * @return @b QString The date and time of the last modfication as a string
+   */
+  QString ControlNetVersioner::lastModificationDate() const {
+    return m_header.lastModified;
+  }
 
-      points.append(point);
-    }
 
-    return latest;
+  /**
+   * Returns the network's description.
+   *
+   * @return @b QString A description of the network.
+   */
+  QString ControlNetVersioner::description() const {
+    return m_header.description;
   }
 
 
   /**
-   * This method is designed to read any and all binary networks. Old versions
-   *   will be sent to ReadPvlNetwork.
+   * Returns the name of the last person or program to modify the network.
    *
-   * @param header The Pvl at the top of the binary file
-   * @param filename The file that contains the binary network
-   * @return In-memory representation of the network
+   * @return @b QString The name of the last person or program to modify the network.
    */
-  LatestControlNetFile *ControlNetVersioner::ReadBinaryNetwork(const Pvl &header,
-                                                               const FileName &filename) {
-    
-    // Find the binary cnet version by any means necessary
-    int version = 1;
-
-    const PvlObject &protoBuf = header.findObject("ProtoBuffer");
-    const PvlGroup &netInfo = protoBuf.findGroup("ControlNetworkInfo");
+  QString ControlNetVersioner::userName() const {
+    return m_header.userName;
+  }
 
-    if (netInfo.hasKeyword("Version"))
-      version = toInt(netInfo["Version"][0]);
 
-    // Okay, let's instantiate the correct ControlNetFile for this version
-    ControlNetFile *cnetFile;
-    switch (version) {
-      case 1:
-        cnetFile = new ControlNetFileV0001;
-        break;
+  /**
+   * Returns the number of points that have been read in or are ready to write out.
+   *
+   * @return @b int The number of control points stored internally.
+   */
+  int ControlNetVersioner::numPoints() const {
+    return m_points.size();
+  }
 
-      case 2:
-        cnetFile = new ControlNetFileV0002;
-        break;
 
-      default:
-        IString msg = "The binary file version [" + IString(version) + "] is "
-            "not supported";
-        throw IException(IException::Io, msg, _FILEINFO_);
+  /**
+   * Returns the first point stored in the versioner's internal list. This method passes ownership
+   * of the point to the caller who is expected to delete it when done with it.
+   *
+   * @return @b ControlPoint* A pointer to the control point. The caller assumes ownership of the
+   *                          ControlPoint and is expected to delete it when done. If there are no
+   *                          points to return, a NULL pointer is returned.
+   */
+  ControlPoint *ControlNetVersioner::takeFirstPoint() {
+    ControlPoint *point = NULL;
+    if ( !m_points.isEmpty() ) {
+      point = m_points.takeFirst();
     }
 
-    // Now read and update as necessary
-    cnetFile->Read(header, filename);
-
-    if (version != LATEST_BINARY_VERSION) {
-      Pvl pvl(cnetFile->toPvl());
-
-      delete cnetFile;
-      cnetFile = NULL;
-
-      return ReadPvlNetwork(pvl);
-    }
-    else {
-      return (LatestControlNetFile *)cnetFile;
-    }
+    return point;
   }
 
 
   /**
-   * This converts pvl networks from their implied version 1 to version 2.
+   * Generates a Pvl file from the currently stored control points and header.
    *
-   * We're trying to handle all cases of old keywords from over a very long
-   *   time in this method, and end up with a consistent set of keywords so
-   *   there is no more duplication or confusion about what will be in the Pvl.
-   *
-   * Future conversions will have similar operations in them but will probably
-   *   be smaller/less work.
-   *
-   * Modify in place to prevent unnecessary memory usage.
-   *
-   * Version 2 is the first version made inside this versioner. It is the
-   *   first time keyword names and values cannot vary.
-   *
-   * @param network Input is Version 1, must be modified to conform to Version 2
+   * @return Pvl The Pvl version of the network
    */
-  void ControlNetVersioner::ConvertVersion1ToVersion2(PvlObject &network) {
-    
-    network["Version"] = "2";
-
-    // Really... Projection::TargetRadii should be making this call
-    NaifStatus::CheckErrors();
-
-    if (QString(network["TargetName"]).startsWith("MRO/")) {
-      network["TargetName"] = "Mars";
-    }
+  Pvl ControlNetVersioner::toPvl(){
+    Pvl pvl;
+    pvl.addObject(PvlObject("ControlNetwork"));
+    PvlObject &network = pvl.findObject("ControlNetwork");
 
-    PvlGroup radii;
-    try {
-      radii = Target::radiiGroup(network["TargetName"][0]);
-    }
-    catch (IException &e) {
+    network += PvlKeyword("NetworkId", m_header.networkID);
+    network += PvlKeyword("TargetName", m_header.targetName);
+    network += PvlKeyword("UserName", m_header.userName);
+    network += PvlKeyword("Created", m_header.created);
+    network += PvlKeyword("LastModified", m_header.lastModified);
+    network += PvlKeyword("Description", m_header.description);
+    // optionally add username to output?
+
+    // This is the Pvl version we're converting to
+    network += PvlKeyword("Version", "5");
+
+    //  Get Target Radii from naif kernel
+    PvlGroup pvlRadii;
+    QString target = (QString)network.findKeyword("TargetName",Pvl::Traverse);
+    if ( target != "" ) {
       try {
         NaifStatus::CheckErrors();
+        pvlRadii = Target::radiiGroup(target);
       }
-      catch (IException &) {
+      catch (IException) {
+        // leave pvlRadii empty if target is not recognized by NAIF
       }
-
-      QString msg = "Unable to get convert ControlNet Version 1 to Version 2.";
-      throw IException(e, IException::Io, msg, _FILEINFO_);
     }
 
-    Distance equatorialRadius(radii["EquatorialRadius"], Distance::Meters);
-    Distance polarRadius(radii["PolarRadius"], Distance::Meters);
+    foreach (ControlPoint *controlPoint, m_points) {
+      PvlObject pvlPoint("ControlPoint");
+
+      if ( controlPoint->GetType() == ControlPoint::Fixed ) {
+        pvlPoint += PvlKeyword("PointType", "Fixed");
+      }
 
-    for (int cpIndex = 0; cpIndex < network.objects(); cpIndex ++) {
-      PvlObject &cp = network.object(cpIndex);
+      else if ( controlPoint->GetType() == ControlPoint::Constrained ) {
+        pvlPoint += PvlKeyword("PointType", "Constrained");
+      }
 
-      if (cp.hasKeyword("Held") && cp["Held"][0] == "True")
-        cp["PointType"] = "Ground";
+      else {
+        pvlPoint += PvlKeyword("PointType", "Free");
+      }
 
-      if (cp.hasKeyword("AprioriLatLonSource"))
-        cp["AprioriLatLonSource"].setName("AprioriXYZSource");
+      if ( controlPoint->GetId().isEmpty() ) {
+        QString msg = "Unbable to write control net to PVL file. "
+                      "Invalid control point has no point ID value.";
+        throw IException(IException::Unknown, msg, _FILEINFO_);
+      }
+      else {
+        pvlPoint += PvlKeyword("PointId", controlPoint->GetId());
+      }
+      if ( QString::compare(controlPoint->GetChooserName(), "Null", Qt::CaseInsensitive) != 0 ) {
+        pvlPoint += PvlKeyword("ChooserName", controlPoint->GetChooserName());
+      }
+      if ( QString::compare(controlPoint->GetDateTime(), "Null", Qt::CaseInsensitive) != 0 ) {
+        pvlPoint += PvlKeyword("DateTime", controlPoint->GetDateTime());
+      }
+      if ( controlPoint->IsEditLocked() ) {
+        pvlPoint += PvlKeyword("EditLock", "True");
+      }
+      if ( controlPoint->IsIgnored() ) {
+        pvlPoint += PvlKeyword("Ignore", "True");
+      }
 
-      if (cp.hasKeyword("AprioriLatLonSourceFile"))
-        cp["AprioriLatLonSourceFile"].setName("AprioriXYZSourceFile");
+      switch ( controlPoint->GetAprioriSurfacePointSource() ) {
+        case ControlPoint::SurfacePointSource::None:
+          break;
+        case ControlPoint::SurfacePointSource::User:
+          pvlPoint += PvlKeyword("AprioriXYZSource", "User");
+          break;
+        case ControlPoint::SurfacePointSource::AverageOfMeasures:
+          pvlPoint += PvlKeyword("AprioriXYZSource", "AverageOfMeasures");
+          break;
+        case ControlPoint::SurfacePointSource::Reference:
+          pvlPoint += PvlKeyword("AprioriXYZSource", "Reference");
+          break;
+        case ControlPoint::SurfacePointSource::Basemap:
+          pvlPoint += PvlKeyword("AprioriXYZSource", "Basemap");
+          break;
+        case ControlPoint::SurfacePointSource::BundleSolution:
+          pvlPoint += PvlKeyword("AprioriXYZSource", "BundleSolution");
+          break;
+      }
 
-      if (cp.hasKeyword("AprioriLatitude")) {
-        SurfacePoint apriori(
-            Latitude(toDouble(cp["AprioriLatitude"][0]), Angle::Degrees),
-            Longitude(toDouble(cp["AprioriLongitude"][0]), Angle::Degrees),
-            Distance(toDouble(cp["AprioriRadius"][0]), Distance::Meters));
+      if ( controlPoint->HasAprioriSurfacePointSourceFile() ) {
+        pvlPoint += PvlKeyword("AprioriXYZSourceFile",
+                        controlPoint->GetAprioriSurfacePointSourceFile());
+      }
 
-        cp += PvlKeyword("AprioriX", toString(apriori.GetX().meters()), "meters");
-        cp += PvlKeyword("AprioriY", toString(apriori.GetY().meters()), "meters");
-        cp += PvlKeyword("AprioriZ", toString(apriori.GetZ().meters()), "meters");
+      switch ( controlPoint->GetAprioriRadiusSource() ) {
+        case ControlPoint::RadiusSource::None:
+          break;
+        case ControlPoint::RadiusSource::User:
+          pvlPoint += PvlKeyword("AprioriRadiusSource", "User");
+          break;
+        case ControlPoint::RadiusSource::AverageOfMeasures:
+          pvlPoint += PvlKeyword("AprioriRadiusSource", "AverageOfMeasures");
+          break;
+        case ControlPoint::RadiusSource::BundleSolution:
+          pvlPoint += PvlKeyword("AprioriRadiusSource", "BundleSolution");
+          break;
+        case ControlPoint::RadiusSource::Ellipsoid:
+          pvlPoint += PvlKeyword("AprioriRadiusSource", "Ellipsoid");
+          break;
+        case ControlPoint::RadiusSource::DEM:
+          pvlPoint += PvlKeyword("AprioriRadiusSource", "DEM");
+          break;
       }
 
-      if (cp.hasKeyword("Latitude")) {
-        SurfacePoint adjusted(
-            Latitude(toDouble(cp["Latitude"][0]), Angle::Degrees),
-            Longitude(toDouble(cp["Longitude"][0]), Angle::Degrees),
-            Distance(toDouble(cp["Radius"][0]), Distance::Meters));
+      if ( controlPoint->HasAprioriRadiusSourceFile() ) {
+        pvlPoint += PvlKeyword("AprioriRadiusSourceFile",
+                        controlPoint->GetAprioriRadiusSourceFile());
+        }
+
+      // add surface point x/y/z, convert to lat,lon,radius and output as comment
+      SurfacePoint aprioriSurfacePoint = controlPoint->GetAprioriSurfacePoint();
+      if ( aprioriSurfacePoint.Valid() ) {
+        PvlKeyword aprioriX("AprioriX", toString(aprioriSurfacePoint.GetX().meters()), "meters");
+        PvlKeyword aprioriY("AprioriY", toString(aprioriSurfacePoint.GetY().meters()), "meters");
+        PvlKeyword aprioriZ("AprioriZ", toString(aprioriSurfacePoint.GetZ().meters()), "meters");
+
+        aprioriX.addComment("AprioriLatitude = "
+                            + toString(aprioriSurfacePoint.GetLatitude().degrees())
+                            + " <degrees>");
+        aprioriY.addComment("AprioriLongitude = "
+                            + toString(aprioriSurfacePoint.GetLongitude().degrees())
+                            + " <degrees>");
+
+        aprioriZ.addComment("AprioriRadius = "
+                            + toString(aprioriSurfacePoint.GetLocalRadius().meters())
+                            + " <meters>");
+
+        pvlPoint += aprioriX;
+        pvlPoint += aprioriY;
+        pvlPoint += aprioriZ;
+
+        symmetric_matrix<double, upper> aprioriCovarianceMatrix =
+              aprioriSurfacePoint.GetRectangularMatrix();
+
+        if ( aprioriCovarianceMatrix.size1() > 0 ) {
+
+          PvlKeyword matrix("AprioriCovarianceMatrix");
+          matrix += toString(aprioriCovarianceMatrix(0, 0));
+          matrix += toString(aprioriCovarianceMatrix(0, 1));
+          matrix += toString(aprioriCovarianceMatrix(0, 2));
+          matrix += toString(aprioriCovarianceMatrix(1, 1));
+          matrix += toString(aprioriCovarianceMatrix(1, 2));
+          matrix += toString(aprioriCovarianceMatrix(2, 2));
+
+          if ( pvlRadii.hasKeyword("EquatorialRadius") && pvlRadii.hasKeyword("PolarRadius") ) {
+
+            aprioriSurfacePoint.SetRadii( Distance(pvlRadii["EquatorialRadius"], Distance::Meters),
+                                          Distance(pvlRadii["EquatorialRadius"], Distance::Meters),
+                                          Distance(pvlRadii["PolarRadius"], Distance::Meters) );
+
+            if ( aprioriSurfacePoint.GetLatSigmaDistance().meters() != Isis::Null
+                 && aprioriSurfacePoint.GetLonSigmaDistance().meters() != Isis::Null
+                 && aprioriSurfacePoint.GetLocalRadiusSigma().meters() != Isis::Null ) {
+
+              QString sigmas = "AprioriLatitudeSigma = "
+              + toString(aprioriSurfacePoint.GetLatSigmaDistance().meters())
+              + " <meters>  AprioriLongitudeSigma = "
+              + toString(aprioriSurfacePoint.GetLonSigmaDistance().meters())
+              + " <meters>  AprioriRadiusSigma = "
+              + toString(aprioriSurfacePoint.GetLocalRadiusSigma().meters())
+              + " <meters>";
+              matrix.addComment(sigmas);
+            }
+          }
 
-        cp += PvlKeyword("AdjustedX", toString(adjusted.GetX().meters()), "meters");
-        cp += PvlKeyword("AdjustedY", toString(adjusted.GetY().meters()), "meters");
-        cp += PvlKeyword("AdjustedZ", toString(adjusted.GetZ().meters()), "meters");
+          // If the covariance matrix has a value, add it to the PVL point.
+          if ( aprioriCovarianceMatrix(0, 0) != 0.0
+               || aprioriCovarianceMatrix(0, 1) != 0.0
+               || aprioriCovarianceMatrix(0, 2) != 0.0
+               || aprioriCovarianceMatrix(1, 1) != 0.0
+               || aprioriCovarianceMatrix(1, 2) != 0.0
+               || aprioriCovarianceMatrix(2, 2) != 0.0 ) {
 
-        if (!cp.hasKeyword("AprioriLatitude")) {
-          cp += PvlKeyword("AprioriX", toString(adjusted.GetX().meters()), "meters");
-          cp += PvlKeyword("AprioriY", toString(adjusted.GetY().meters()), "meters");
-          cp += PvlKeyword("AprioriZ", toString(adjusted.GetZ().meters()), "meters");
+              pvlPoint += matrix;
+            }
         }
       }
 
-      if (cp.hasKeyword("X"))
-        cp["X"].setName("AdjustedX");
-
-      if (cp.hasKeyword("Y"))
-        cp["Y"].setName("AdjustedY");
+      if ( controlPoint->IsLatitudeConstrained() ) {
+        pvlPoint += PvlKeyword("LatitudeConstrained", "True");
+      }
 
-      if (cp.hasKeyword("Z"))
-        cp["Z"].setName("AdjustedZ");
+      if ( controlPoint->IsLongitudeConstrained() ) {
+        pvlPoint += PvlKeyword("LongitudeConstrained", "True");
+      }
 
-      if (cp.hasKeyword("AprioriSigmaLatitude") ||
-         cp.hasKeyword("AprioriSigmaLongitude") ||
-         cp.hasKeyword("AprioriSigmaRadius")) {
-        double sigmaLat = 10000.0;
-        double sigmaLon = 10000.0;
-        double sigmaRad = 10000.0;
+      if ( controlPoint->IsRadiusConstrained() ) {
+        pvlPoint += PvlKeyword("RadiusConstrained", "True");
+      }
 
-        if (cp.hasKeyword("AprioriSigmaLatitude")) {
-          if (toDouble(cp["AprioriSigmaLatitude"][0]) > 0 &&
-              toDouble(cp["AprioriSigmaLatitude"][0]) < sigmaLat)
-            sigmaLat = cp["AprioriSigmaLatitude"];
+      // adj surface point, convert to lat,lon,radius and output as comment
+      SurfacePoint adjustedSurfacePoint = controlPoint->GetAdjustedSurfacePoint();
+      if ( adjustedSurfacePoint.Valid() ) {
+        PvlKeyword adjustedX("AdjustedX",
+                             toString(adjustedSurfacePoint.GetX().meters()), "meters");
+        PvlKeyword adjustedY("AdjustedY",
+                             toString(adjustedSurfacePoint.GetY().meters()), "meters");
+        PvlKeyword adjustedZ("AdjustedZ",
+                             toString(adjustedSurfacePoint.GetZ().meters()), "meters");
+
+        adjustedX.addComment("AdjustedLatitude = "
+                             + toString(adjustedSurfacePoint.GetLatitude().degrees())
+                             + " <degrees>");
+        adjustedY.addComment("AdjustedLongitude = "
+                             + toString(adjustedSurfacePoint.GetLongitude().degrees())
+                             + " <degrees>");
+        adjustedZ.addComment("AdjustedRadius = "
+                             + toString(adjustedSurfacePoint.GetLocalRadius().meters())
+                             + " <meters>");
+
+        pvlPoint += adjustedX;
+        pvlPoint += adjustedY;
+        pvlPoint += adjustedZ;
+
+        symmetric_matrix<double, upper> adjustedCovarianceMatrix =
+              adjustedSurfacePoint.GetRectangularMatrix();
+
+        if ( adjustedCovarianceMatrix.size1() > 0 ) {
+
+          PvlKeyword matrix("AdjustedCovarianceMatrix");
+          matrix += toString(adjustedCovarianceMatrix(0, 0));
+          matrix += toString(adjustedCovarianceMatrix(0, 1));
+          matrix += toString(adjustedCovarianceMatrix(0, 2));
+          matrix += toString(adjustedCovarianceMatrix(1, 1));
+          matrix += toString(adjustedCovarianceMatrix(1, 2));
+          matrix += toString(adjustedCovarianceMatrix(2, 2));
+
+          if ( pvlRadii.hasKeyword("EquatorialRadius") && pvlRadii.hasKeyword("PolarRadius") ) {
+
+            adjustedSurfacePoint.SetRadii(Distance(pvlRadii["EquatorialRadius"], Distance::Meters),
+                                          Distance(pvlRadii["EquatorialRadius"], Distance::Meters),
+                                          Distance(pvlRadii["PolarRadius"], Distance::Meters) );
+
+            if ( adjustedSurfacePoint.GetLatSigmaDistance().meters() != Isis::Null
+                 && adjustedSurfacePoint.GetLonSigmaDistance().meters() != Isis::Null
+                 && adjustedSurfacePoint.GetLocalRadiusSigma().meters() != Isis::Null ) {
+
+            QString sigmas = "AdjustedLatitudeSigma = "
+                             + toString(adjustedSurfacePoint.GetLatSigmaDistance().meters())
+                             + " <meters>  AdjustedLongitudeSigma = "
+                             + toString(adjustedSurfacePoint.GetLonSigmaDistance().meters())
+                             + " <meters>  AdjustedRadiusSigma = "
+                             + toString(adjustedSurfacePoint.GetLocalRadiusSigma().meters())
+                             + " <meters>";
+
+            matrix.addComment(sigmas);
+            }
+          }
+          // If the covariance matrix has a value, add it to the PVL point.
+          if ( adjustedCovarianceMatrix(0, 0) != 0.0
+               || adjustedCovarianceMatrix(0, 1) != 0.0
+               || adjustedCovarianceMatrix(0, 2) != 0.0
+               || adjustedCovarianceMatrix(1, 1) != 0.0
+               || adjustedCovarianceMatrix(1, 2) != 0.0
+               || adjustedCovarianceMatrix(2, 2) != 0.0 ) {
+
+            pvlPoint += matrix;
+          }
+        }
+      }
 
-          cp += PvlKeyword("LatitudeConstrained", "True");
+      for (int j = 0; j < controlPoint->GetNumMeasures(); j++) {
+        PvlGroup pvlMeasure("ControlMeasure");
+        const ControlMeasure &controlMeasure = *controlPoint->GetMeasure(j);
+        pvlMeasure += PvlKeyword("SerialNumber", controlMeasure.GetCubeSerialNumber());
+
+        switch ( controlMeasure.GetType() ) {
+          case ControlMeasure::Candidate:
+            pvlMeasure += PvlKeyword("MeasureType", "Candidate");
+            break;
+          case ControlMeasure::Manual:
+            pvlMeasure += PvlKeyword("MeasureType", "Manual");
+            break;
+          case ControlMeasure::RegisteredPixel:
+            pvlMeasure += PvlKeyword("MeasureType", "RegisteredPixel");
+            break;
+          case ControlMeasure::RegisteredSubPixel:
+            pvlMeasure += PvlKeyword("MeasureType", "RegisteredSubPixel");
+            break;
         }
 
-        if (cp.hasKeyword("AprioriSigmaLongitude")) {
-          if (toDouble(cp["AprioriSigmaLongitude"][0]) > 0 &&
-              toDouble(cp["AprioriSigmaLongitude"][0]) < sigmaLon)
-            sigmaLon = cp["AprioriSigmaLongitude"];
+        if (QString::compare(controlMeasure.GetChooserName(), "Null", Qt::CaseInsensitive) != 0) {
+          pvlMeasure += PvlKeyword("ChooserName", controlMeasure.GetChooserName());
+        }
+        if (QString::compare(controlMeasure.GetDateTime(), "Null", Qt::CaseInsensitive) != 0) {
+          pvlMeasure += PvlKeyword("DateTime", controlMeasure.GetDateTime());
+        }
+        if ( controlMeasure.IsEditLocked() ) {
+          pvlMeasure += PvlKeyword("EditLock", "True");
+        }
 
-          cp += PvlKeyword("LongitudeConstrained", "True");
+        if ( controlMeasure.IsIgnored() ) {
+          pvlMeasure += PvlKeyword("Ignore", "True");
         }
 
-        if (cp.hasKeyword("AprioriSigmaRadius")) {
-          if (toDouble(cp["AprioriSigmaRadius"][0]) > 0 &&
-              toDouble(cp["AprioriSigmaRadius"][0]) < sigmaRad)
-            sigmaRad = cp["AprioriSigmaRadius"];
+        if ( controlMeasure.GetSample() != Isis::Null) {
+          pvlMeasure += PvlKeyword("Sample", toString(controlMeasure.GetSample()));
 
-          cp += PvlKeyword("RadiusConstrained", "True");
         }
 
-        SurfacePoint tmp;
-        tmp.SetRadii(equatorialRadius, equatorialRadius, polarRadius);
-        tmp.SetRectangular(
-            Displacement(cp["AprioriX"], Displacement::Meters),
-            Displacement(cp["AprioriY"], Displacement::Meters),
-            Displacement(cp["AprioriZ"], Displacement::Meters));
-        tmp.SetSphericalSigmasDistance(
-          Distance(sigmaLat, Distance::Meters),
-          Distance(sigmaLon, Distance::Meters),
-          Distance(sigmaRad, Distance::Meters));
+        if ( controlMeasure.GetLine() != Isis::Null ) {
+          pvlMeasure += PvlKeyword("Line", toString(controlMeasure.GetLine()));
+        }
 
-        PvlKeyword aprioriCovarMatrix("AprioriCovarianceMatrix");
-        aprioriCovarMatrix += toString(tmp.GetRectangularMatrix()(0, 0));
-        aprioriCovarMatrix += toString(tmp.GetRectangularMatrix()(0, 1));
-        aprioriCovarMatrix += toString(tmp.GetRectangularMatrix()(0, 2));
-        aprioriCovarMatrix += toString(tmp.GetRectangularMatrix()(1, 1));
-        aprioriCovarMatrix += toString(tmp.GetRectangularMatrix()(1, 2));
-        aprioriCovarMatrix += toString(tmp.GetRectangularMatrix()(2, 2));
+        if ( controlMeasure.GetDiameter() != Isis::Null
+             && controlMeasure.GetDiameter() != 0. ) {
+          pvlMeasure += PvlKeyword("Diameter", toString(controlMeasure.GetDiameter()));
+        }
 
-        cp += aprioriCovarMatrix;
-      }
+        if ( controlMeasure.GetAprioriSample() != Isis::Null ) {
+          pvlMeasure += PvlKeyword("AprioriSample", toString(controlMeasure.GetAprioriSample()));
+        }
 
-      if (cp.hasKeyword("AdjustedSigmaLatitude") ||
-          cp.hasKeyword("AdjustedSigmaLongitude") ||
-          cp.hasKeyword("AdjustedSigmaRadius")) {
-        double sigmaLat = 10000.0;
-        double sigmaLon = 10000.0;
-        double sigmaRad = 10000.0;
+        if ( controlMeasure.GetAprioriLine() != Isis::Null ) {
+          pvlMeasure += PvlKeyword("AprioriLine", toString(controlMeasure.GetAprioriLine()));
+        }
+
+        if ( controlMeasure.GetSampleSigma() != Isis::Null ) {
+          pvlMeasure += PvlKeyword("SampleSigma", toString(controlMeasure.GetSampleSigma()),
+                                   "pixels");
+        }
 
-        if (cp.hasKeyword("AdjustedSigmaLatitude")) {
-          if (toDouble(cp["AdjustedSigmaLatitude"][0]) > 0 &&
-              toDouble(cp["AdjustedSigmaLatitude"][0]) < sigmaLat)
-            sigmaLat = cp["AdjustedSigmaLatitude"];
+        if ( controlMeasure.GetLineSigma() != Isis::Null ) {
+          pvlMeasure += PvlKeyword("LineSigma", toString(controlMeasure.GetLineSigma()),
+                                   "pixels");
         }
 
-        if (cp.hasKeyword("AdjustedSigmaLongitude")) {
-          if (toDouble(cp["AdjustedSigmaLongitude"][0]) > 0 &&
-              toDouble(cp["AdjustedSigmaLongitude"][0]) < sigmaLon)
-            sigmaLon = cp["AdjustedSigmaLongitude"];
+        if ( controlMeasure.GetSampleResidual() != Isis::Null
+             && controlMeasure.GetSampleResidual() != 0. ) {
+          pvlMeasure += PvlKeyword("SampleResidual",
+                                   toString(controlMeasure.GetSampleResidual()),
+                                   "pixels");
         }
 
-        if (cp.hasKeyword("AdjustedSigmaRadius")) {
-          if (toDouble(cp["AdjustedSigmaRadius"][0]) > 0 &&
-              toDouble(cp["AdjustedSigmaRadius"][0]) < sigmaRad)
-            sigmaRad = cp["AdjustedSigmaRadius"];
+        if ( controlMeasure.GetLineResidual() != Isis::Null
+             && controlMeasure.GetLineResidual() != 0. ) {
+          pvlMeasure += PvlKeyword("LineResidual", toString(controlMeasure.GetLineResidual()),
+                                   "pixels");
         }
 
-        SurfacePoint tmp;
-        tmp.SetRadii(equatorialRadius, equatorialRadius, polarRadius);
-        tmp.SetRectangular(Displacement(cp["AdjustedX"], Displacement::Meters),
-                           Displacement(cp["AdjustedY"], Displacement::Meters),
-                           Displacement(cp["AdjustedZ"], Displacement::Meters));
-        tmp.SetSphericalSigmasDistance(Distance(sigmaLat, Distance::Meters),
-                                       Distance(sigmaLon, Distance::Meters),
-                                       Distance(sigmaRad, Distance::Meters));
+        if ( controlMeasure.IsRejected() ) {
+          pvlMeasure += PvlKeyword("JigsawRejected", toString(controlMeasure.IsRejected()));
+        }
 
-        PvlKeyword adjustedCovarMatrix("AdjustedCovarianceMatrix");
-        adjustedCovarMatrix += toString(tmp.GetRectangularMatrix()(0, 0));
-        adjustedCovarMatrix += toString(tmp.GetRectangularMatrix()(0, 1));
-        adjustedCovarMatrix += toString(tmp.GetRectangularMatrix()(0, 2));
-        adjustedCovarMatrix += toString(tmp.GetRectangularMatrix()(1, 1));
-        adjustedCovarMatrix += toString(tmp.GetRectangularMatrix()(1, 2));
-        adjustedCovarMatrix += toString(tmp.GetRectangularMatrix()(2, 2));
+        foreach (ControlMeasureLogData log, controlMeasure.GetLogDataEntries()) {
+          pvlMeasure += log.ToKeyword();
+        }
 
-        cp += adjustedCovarMatrix;
+        if ( controlPoint->HasRefMeasure()
+             && controlPoint->IndexOfRefMeasure() == j
+             && controlPoint->IsReferenceExplicit() ) {
+          pvlMeasure += PvlKeyword("Reference", "True");
+        }
+        pvlPoint.addGroup(pvlMeasure);
       }
+      network.addObject(pvlPoint);
+    }
+    return pvl;
+  }
 
-      if (cp.hasKeyword("ApostCovarianceMatrix"))
-        cp["ApostCovarianceMatrix"].setName("AdjustedCovarianceMatrix");
 
-      if (!cp.hasKeyword("LatitudeConstrained")) {
-        if (cp.hasKeyword("AprioriCovarianceMatrix"))
-          cp += PvlKeyword("LatitudeConstrained", "True");
-        else
-          cp += PvlKeyword("LatitudeConstrained", "False");
-      }
+  /**
+   * Read a control network file and prepare the data to be converted into
+   * a control network.
+   *
+   * @param netFile The control network file to read.
+   * @param progress The progress object to track reading points.
+   */
+  void ControlNetVersioner::read(const FileName netFile, Progress *progress) {
+    try {
 
-      if (!cp.hasKeyword("LongitudeConstrained")) {
-        if (cp.hasKeyword("AprioriCovarianceMatrix"))
-          cp += PvlKeyword("LongitudeConstrained", "True");
-        else
-          cp += PvlKeyword("LongitudeConstrained", "False");
-      }
+      const Pvl &network(netFile.expanded());
 
-      if (!cp.hasKeyword("RadiusConstrained")) {
-        if (cp.hasKeyword("AprioriCovarianceMatrix"))
-          cp += PvlKeyword("RadiusConstrained", "True");
-        else
-          cp += PvlKeyword("RadiusConstrained", "False");
+      if ( network.hasObject("ProtoBuffer") ) {
+        readProtobuf(network, netFile, progress);
       }
-
-      // Delete anything that has no value...
-      for (int cpKeyIndex = 0; cpKeyIndex < cp.keywords(); cpKeyIndex ++) {
-        if (cp[cpKeyIndex][0] == "") {
-          cp.deleteKeyword(cpKeyIndex);
-        }
+      else if ( network.hasObject("ControlNetwork") ) {
+        readPvl(network, progress);
       }
+      else {
+        QString msg = "Could not determine the control network file type";
+        throw IException(IException::Io, msg, _FILEINFO_);
+      }
+    }
+    catch (IException &e) {
+      QString msg = "Reading the control network [" + netFile.name()
+                    + "] failed";
+      throw IException(e, IException::Io, msg, _FILEINFO_);
+    }
+  }
 
-      for (int cmIndex = 0; cmIndex < cp.groups(); cmIndex ++) {
-        PvlGroup &cm = cp.group(cmIndex);
-
-        // Estimated => Candidate
-        if (cm.hasKeyword("MeasureType")) {
-          QString type = cm["MeasureType"][0].toLower();
 
-          if (type == "estimated" || type == "unmeasured") {
-            if (type == "unmeasured") {
-              bool hasSampleLine = false;
+  /**
+   * Read a Pvl control network and prepare the data to be converted into a
+   * control network.
+   *
+   * @param network The Pvl network data
+   * @param progress The progress object to track reading points.
+   */
+  void ControlNetVersioner::readPvl(const Pvl &network, Progress *progress) {
+    const PvlObject &controlNetwork = network.findObject("ControlNetwork");
 
-              try {
-                toDouble(cm["Sample"][0]);
-                toDouble(cm["Line"][0]);
-                hasSampleLine = true;
-              }
-              catch (...) {
-              }
+    int version = 1;
 
-              if (!hasSampleLine) {
-                cm.addKeyword(PvlKeyword("Sample", "0.0"), PvlContainer::Replace);
-                cm.addKeyword(PvlKeyword("Line", "0.0"), PvlContainer::Replace);
-                cm.addKeyword(PvlKeyword("Ignore", toString(true)), PvlContainer::Replace);
-              }
-            }
+    if ( controlNetwork.hasKeyword("Version") ) {
+      version = toInt(controlNetwork["Version"][0]);
+    }
 
-            cm["MeasureType"] = "Candidate";
-          }
-          else if (type == "automatic" || 
-                   type == "validatedmanual" ||
-                   type == "automaticpixel") {
-            cm["MeasureType"] = "RegisteredPixel";
-          }
-          else if (type == "validatedautomatic" || type == "automaticsubpixel") {
-            cm["MeasureType"] = "RegisteredSubPixel";
-          }
-        }
+    switch ( version ) {
+      case 1:
+        readPvlV0001(controlNetwork, progress);
+        break;
+      case 2:
+        readPvlV0002(controlNetwork, progress);
+        break;
+      case 3:
+        readPvlV0003(controlNetwork, progress);
+        break;
+      case 4:
+        readPvlV0004(controlNetwork, progress);
+        break;
+      case 5:
+        readPvlV0005(controlNetwork, progress);
+        break;
+      default:
+        QString msg = "The Pvl file version [" + toString(version)
+                      + "] is not supported";
+        throw IException(IException::Unknown, msg, _FILEINFO_);
+    }
+  }
 
-        if (cm.hasKeyword("ErrorSample"))
-          cm["ErrorSample"].setName("SampleResidual");
 
-        if (cm.hasKeyword("ErrorLine"))
-          cm["ErrorLine"].setName("LineResidual");
+  /**
+   * read a version 1 Pvl control network and convert the data into control points.
+   *
+   * @param network The control network PvlObject.
+   * @param progress The progress object to track reading points.
+   */
+  void ControlNetVersioner::readPvlV0001(const PvlObject &network, Progress *progress) {
+    // initialize the header
+    ControlNetHeaderV0001 header;
 
-        // Delete some extraneous values we once printed
-        if (cm.hasKeyword("SampleResidual") &&
-            toDouble(cm["SampleResidual"][0]) == 0.0)
-          cm.deleteKeyword("SampleResidual");
+    try {
+      header.networkID = network.findKeyword("NetworkId")[0];
+      header.targetName = network.findKeyword("TargetName")[0];
+      header.created = network.findKeyword("Created")[0];
+      header.lastModified = network.findKeyword("LastModified")[0];
+      header.description = network.findKeyword("Description")[0];
+      header.userName = network.findKeyword("UserName")[0];
+      createHeader(header);
+    }
+    catch (IException &e) {
+      QString msg = "Missing required header information.";
+      throw IException(e, IException::Io, msg, _FILEINFO_);
+    }
 
-        if (cm.hasKeyword("LineResidual") &&
-            toDouble(cm["LineResidual"][0]) == 0.0)
-          cm.deleteKeyword("LineResidual");
+    if (progress) {
+      progress->SetText("Reading Control Points...");
+      progress->SetMaximumSteps(network.objects());
+      progress->CheckStatus();
+    }
 
-        if (cm.hasKeyword("Diameter") &&
-            toDouble(cm["Diameter"][0]) == 0.0)
-          cm.deleteKeyword("Diameter");
+    // initialize the control points
+    for (int objectIndex = 0; objectIndex < network.objects(); objectIndex ++) {
+      try {
 
-        if (cm.hasKeyword("ErrorMagnitude"))
-          cm.deleteKeyword("ErrorMagnitude");
+        PvlObject pointObject = network.object(objectIndex);
+        ControlPointV0001 point(pointObject, m_header.targetName);
 
-        if (cm.hasKeyword("ZScore"))
-          cm.deleteKeyword("ZScore");
+        m_points.append( createPoint(point) );
 
-        // Delete anything that has no value...
-        for (int cmKeyIndex = 0; cmKeyIndex < cm.keywords(); cmKeyIndex ++) {
-          if (cm[cmKeyIndex][0] == "") {
-            cm.deleteKeyword(cmKeyIndex);
-          }
+        if (progress) {
+          progress->CheckStatus();
         }
+
+      }
+      catch (IException &e) {
+        QString msg = "Failed to initialize control point at index ["
+                      + toString(objectIndex) + "].";
+        throw IException(e, IException::Io, msg, _FILEINFO_);
       }
     }
   }
 
 
   /**
-   * This converts pvl networks from their version 2 to version 3.
+   * read a version 2 Pvl control network and convert the data into control points.
    *
-   * Modify in place to prevent unnecessary memory usage.
-   *
-   * @param network Input is Version 2, must be modified to conform to Version 3
+   * @param network The control network PvlObject.
+   * @param progress The progress object to track reading points.
    */
-  void ControlNetVersioner::ConvertVersion2ToVersion3(PvlObject &network) {
-    
-    network["Version"] = "3";
+  void ControlNetVersioner::readPvlV0002(const PvlObject &network, Progress *progress) {
+    // initialize the header
+    try {
+      ControlNetHeaderV0002 header;
+      header.networkID = network.findKeyword("NetworkId")[0];
+      header.targetName = network.findKeyword("TargetName")[0];
+      header.created = network.findKeyword("Created")[0];
+      header.lastModified = network.findKeyword("LastModified")[0];
+      header.description = network.findKeyword("Description")[0];
+      header.userName = network.findKeyword("UserName")[0];
+      createHeader(header);
+    }
+    catch (IException &e) {
+      QString msg = "Missing required header information.";
+      throw IException(e, IException::Io, msg, _FILEINFO_);
+    }
+
+    if (progress) {
+      progress->SetText("Reading Control Points...");
+      progress->SetMaximumSteps(network.objects());
+      progress->CheckStatus();
+    }
+
+    // initialize the control points
+    for (int objectIndex = 0; objectIndex < network.objects(); objectIndex ++) {
+      try {
+        PvlObject pointObject = network.object(objectIndex);
+        ControlPointV0002 point(pointObject);
+        m_points.append( createPoint(point) );
 
-    for (int cpIndex = 0; cpIndex < network.objects(); cpIndex ++) {
-      PvlObject &cp = network.object(cpIndex);
+        if (progress) {
+          progress->CheckStatus();
+        }
 
-     if (cp.hasKeyword("AprioriCovarianceMatrix") ||
-         cp.hasKeyword("AdjustedCovarianceMatrix"))
-       cp["PointType"] = "Constrained";
+      }
+      catch (IException &e) {
+        QString msg = "Failed to initialize control point at index ["
+                      + toString(objectIndex) + "].";
+        throw IException(e, IException::Io, msg, _FILEINFO_);
+      }
     }
   }
 
 
   /**
-   * This converts pvl networks from their version 3 to version 4.
+   * read a version 3 Pvl control network and convert the data into control points.
    *
-   * Modify in place to prevent unnecessary memory usage.
-   *
-   * @param network Input is Version 3, must be modified to conform to Version 4
+   * @param network The control network PvlObject.
+   * @param progress The progress object to track reading points.
    */
-  void ControlNetVersioner::ConvertVersion3ToVersion4(PvlObject &network) {
-    
-    network["Version"] = "4";
-
-    for (int cpIndex = 0; cpIndex < network.objects(); cpIndex ++) {
-      PvlObject &cp = network.object(cpIndex);
+  void ControlNetVersioner::readPvlV0003(const PvlObject &network, Progress *progress) {
+    // initialize the header
+    try {
+      ControlNetHeaderV0003 header;
+      header.networkID = network.findKeyword("NetworkId")[0];
+      header.targetName = network.findKeyword("TargetName")[0];
+      header.created = network.findKeyword("Created")[0];
+      header.lastModified = network.findKeyword("LastModified")[0];
+      header.description = network.findKeyword("Description")[0];
+      header.userName = network.findKeyword("UserName")[0];
+      createHeader(header);
+    }
+    catch (IException &e) {
+      QString msg = "Missing required header information.";
+      throw IException(e, IException::Io, msg, _FILEINFO_);
+    }
 
-     if (cp["PointType"][0] == "Ground") cp["PointType"] = "Fixed";
-     if (cp["PointType"][0] == "Tie") cp["PointType"] = "Free";
+    if (progress) {
+      progress->SetText("Reading Control Points...");
+      progress->SetMaximumSteps(network.objects());
+      progress->CheckStatus();
     }
-  }
 
+    // initialize the control points
+    for (int objectIndex = 0; objectIndex < network.objects(); objectIndex ++) {
+      try {
+        PvlObject pointObject = network.object(objectIndex);
+        ControlPointV0003 point(pointObject);
+        m_points.append( createPoint(point) );
 
-  /**
-   * This is a convenience method for copying keywords out of the container
-   *   and into the ControlPointFileEntryV0002 for booleans. This operation is
-   *   only necessary for the latest version of the binary so this method needs
-   *   to be updated or removed when V0003 comes around.
-   *
-   * If the keyword doesn't exist, this does nothing.
-   *
-   * @param container The PvlObject that represents a control point
-   * @param keyName The keyword name inside the PvlObject
-   * @param point The protocol buffer point instance to set the value in
-   * @param setter The protocol buffer setter method
-   */
-  void ControlNetVersioner::Copy(PvlContainer &container,
-                                 QString keyName, 
-                                 ControlPointFileEntryV0002 &point,
-                                 void (ControlPointFileEntryV0002::*setter)(bool)) {
-    
-    if (!container.hasKeyword(keyName))
-      return;
-
-    QString value = container[keyName][0];
-    container.deleteKeyword(keyName);
-    value = value.toLower();
-    
-    if (value == "true" || value == "yes")
-      (point.*setter)(true);
+        if (progress) {
+          progress->CheckStatus();
+        }
+
+      }
+      catch (IException &e) {
+        QString msg = "Failed to initialize control point at index ["
+                      + toString(objectIndex) + "].";
+        throw IException(e, IException::Io, msg, _FILEINFO_);
+      }
+    }
   }
 
 
   /**
-   * This is a convenience method for copying keywords out of the container
-   *   and into the ControlPointFileEntryV0002 for doubles. This operation is
-   *   only necessary for the latest version of the binary so this method needs
-   *   to be updated or removed when V0003 comes around.
-   *
-   * If the keyword doesn't exist, this does nothing.
+   * read a version 4 Pvl control network and convert the data into control points.
    *
-   * @param container The PvlObject that represents a control point
-   * @param keyName The keyword name inside the PvlObject
-   * @param point The protocol buffer point instance to set the value in
-   * @param setter The protocol buffer setter method
+   * @param network The control network PvlObject.
+   * @param progress The progress object to track reading points.
    */
-  void ControlNetVersioner::Copy(PvlContainer &container,
-                                 QString keyName, 
-                                 ControlPointFileEntryV0002 &point,
-                                 void (ControlPointFileEntryV0002::*setter)(double)) {
-    
-    if (!container.hasKeyword(keyName))
-      return;
-
-    double value = toDouble(container[keyName][0]);
-    container.deleteKeyword(keyName);
-    (point.*setter)(value);
+  void ControlNetVersioner::readPvlV0004(const PvlObject &network, Progress *progress) {
+    // initialize the header
+    try {
+      ControlNetHeaderV0004 header;
+      header.networkID = network.findKeyword("NetworkId")[0];
+      header.targetName = network.findKeyword("TargetName")[0];
+      header.created = network.findKeyword("Created")[0];
+      header.lastModified = network.findKeyword("LastModified")[0];
+      header.description = network.findKeyword("Description")[0];
+      header.userName = network.findKeyword("UserName")[0];
+      createHeader(header);
+    }
+    catch (IException &e) {
+      QString msg = "Missing required header information.";
+      throw IException(e, IException::Io, msg, _FILEINFO_);
+    }
+
+    if (progress) {
+      progress->SetText("Reading Control Points...");
+      progress->SetMaximumSteps(network.objects());
+      progress->CheckStatus();
+    }
+
+    // initialize the control points
+    for (int objectIndex = 0; objectIndex < network.objects(); objectIndex ++) {
+      try {
+        PvlObject pointObject = network.object(objectIndex);
+        ControlPointV0004 point(pointObject);
+        m_points.append( createPoint(point) );
+
+        if (progress) {
+          progress->CheckStatus();
+        }
+      }
+      catch (IException &e) {
+        QString msg = "Failed to initialize control point at index ["
+                      + toString(objectIndex) + "].";
+        throw IException(e, IException::Io, msg, _FILEINFO_);
+      }
+    }
+  }
+
+
+  /**
+   * read a version 5 Pvl control network and convert the data into control points.
+   *
+   * @param network The control network PvlObject.
+   * @param progress The progress object to track reading points.
+   */
+  void ControlNetVersioner::readPvlV0005(const PvlObject &network, Progress *progress) {
+    // initialize the header
+    try {
+      ControlNetHeaderV0005 header;
+      header.networkID = network.findKeyword("NetworkId")[0];
+      header.targetName = network.findKeyword("TargetName")[0];
+      header.created = network.findKeyword("Created")[0];
+      header.lastModified = network.findKeyword("LastModified")[0];
+      header.description = network.findKeyword("Description")[0];
+      header.userName = network.findKeyword("UserName")[0];
+      createHeader(header);
+    }
+    catch (IException &e) {
+      QString msg = "Missing required header information.";
+      throw IException(e, IException::Io, msg, _FILEINFO_);
+    }
+
+    if (progress) {
+      progress->SetText("Reading Control Points...");
+      progress->SetMaximumSteps(network.objects());
+      progress->CheckStatus();
+    }
+
+    // initialize the control points
+    for (int objectIndex = 0; objectIndex < network.objects(); objectIndex ++) {
+      try {
+        PvlObject pointObject = network.object(objectIndex);
+        ControlPointV0005 point(pointObject);
+        m_points.append( createPoint(point) );
+
+        if (progress) {
+          progress->CheckStatus();
+        }
+      }
+      catch (IException &e) {
+        QString msg = "Failed to initialize control point at index ["
+                      + toString(objectIndex) + "].";
+        throw IException(e, IException::Io, msg, _FILEINFO_);
+      }
+    }
+  }
+
+
+  /**
+   * Read a protobuf control network and prepare the data to be converted into a
+   * control network.
+   *
+   * @param header The Pvl network header that contains the version number.
+   * @param netFile The filename of the control network file.
+   * @param progress The progress object to track reading points.
+   */
+  void ControlNetVersioner::readProtobuf(const Pvl &header,
+                                         const FileName netFile,
+                                         Progress *progress) {
+    int version = 1;
+
+    const PvlObject &protoBuf = header.findObject("ProtoBuffer");
+    const PvlGroup &netInfo = protoBuf.findGroup("ControlNetworkInfo");
+
+    if ( netInfo.hasKeyword("Version") ) {
+      version = toInt(netInfo["Version"][0]);
+    }
+    switch ( version ) {
+      case 1:
+        readProtobufV0001(header, netFile, progress);
+        break;
+      case 2:
+        readProtobufV0002(header, netFile, progress);
+        break;
+      case 5:
+        readProtobufV0005(header, netFile, progress);
+        break;
+      default:
+        QString msg = "The Protobuf file version [" + toString(version)
+                      + "] is not supported";
+        throw IException(IException::Io, msg, _FILEINFO_);
+    }
+  }
+
+
+  /**
+   * Read a protobuf version 1 control network and prepare the data to be
+   * converted into a control network.
+   *
+   * @param header The Pvl file header that contains byte offsets for the protobuf messages
+   * @param netFile The filename of the control network file.
+   * @param progress The progress object to track reading points.
+   */
+  void ControlNetVersioner::readProtobufV0001(const Pvl &header,
+                                              const FileName netFile,
+                                              Progress *progress) {
+    const PvlObject &protoBufferInfo = header.findObject("ProtoBuffer");
+    const PvlObject &protoBufferCore = protoBufferInfo.findObject("Core");
+
+    BigInt coreStartPos = protoBufferCore["StartByte"];
+    BigInt coreLength = protoBufferCore["Bytes"];
+
+    fstream input(netFile.expanded().toLatin1().data(), ios::in | ios::binary);
+    if ( !input.is_open() ) {
+      QString msg = "Failed to open protobuf file [" + netFile.name() + "].";
+      throw IException(IException::Programmer, msg, _FILEINFO_);
+    }
+
+    input.seekg(coreStartPos, ios::beg);
+    IstreamInputStream inStream(&input);
+    CodedInputStream codedInStream(&inStream);
+    codedInStream.PushLimit(coreLength);
+    // max 512MB, warn at 400MB
+    codedInStream.SetTotalBytesLimit(1024 * 1024 * 512, 1024 * 1024 * 400);
+
+    // Now stream the rest of the input into the google protocol buffer.
+    ControlNetFileProtoV0001 protoNet;
+    try {
+      if ( !protoNet.ParseFromCodedStream(&codedInStream) ) {
+        QString msg = "Failed to read input PB file [" + netFile.name() + "].";
+        throw IException(IException::Programmer, msg, _FILEINFO_);
+      }
+    }
+    catch (IException &e) {
+      QString msg = "Cannot parse binary protobuf file";
+      throw IException(e, IException::User, msg, _FILEINFO_);
+    }
+    catch (...) {
+      QString msg = "Cannot parse binary PB file";
+      throw IException(IException::User, msg, _FILEINFO_);
+    }
+
+    const PvlObject &logDataInfo = protoBufferInfo.findObject("LogData");
+    BigInt logStartPos = logDataInfo["StartByte"];
+    BigInt logLength = logDataInfo["Bytes"];
+
+    input.clear();
+    input.seekg(logStartPos, ios::beg);
+    IstreamInputStream logInStream(&input);
+    CodedInputStream codedLogInStream(&logInStream);
+    codedLogInStream.PushLimit(logLength);
+    // max 512MB, warn at 400MB
+    codedLogInStream.SetTotalBytesLimit(1024 * 1024 * 512, 1024 * 1024 * 400);
+
+    // Now stream the rest of the input into the google protocol buffer.
+    ControlNetLogDataProtoV0001 protoLogData;
+    try {
+      if ( !protoLogData.ParseFromCodedStream(&codedLogInStream) ) {
+        QString msg = "Failed to read log data in protobuf file [" + netFile.name() + "].";
+        throw IException(IException::Programmer, msg, _FILEINFO_);
+      }
+    }
+    catch (...) {
+      QString msg = "Cannot parse binary protobuf file's log data";
+      throw IException(IException::User, msg, _FILEINFO_);
+    }
+
+    // Create the header
+    try {
+      ControlNetHeaderV0002 header;
+      header.networkID = protoNet.networkid().c_str();
+      if ( protoNet.has_targetname() ) {
+        header.targetName = protoNet.targetname().c_str();
+      }
+      else {
+        header.targetName = "";
+      }
+      header.created = protoNet.created().c_str();
+      header.lastModified = protoNet.lastmodified().c_str();
+      header.description = protoNet.description().c_str();
+      header.userName = protoNet.username().c_str();
+      createHeader(header);
+    }
+    catch (IException &e) {
+      QString msg = "Failed to parse the header from the protobuf control network file.";
+      throw IException(e, IException::User, msg, _FILEINFO_);
+    }
+
+    if (progress) {
+      progress->SetText("Reading Control Points...");
+      progress->SetMaximumSteps( protoNet.points_size() );
+      progress->CheckStatus();
+    }
+
+    // Create the control points
+    for (int i = 0; i < protoNet.points_size(); i++) {
+      try {
+        QSharedPointer<ControlNetFileProtoV0001_PBControlPoint>
+              protoPoint(new ControlNetFileProtoV0001_PBControlPoint(protoNet.points(i)));
+        QSharedPointer<ControlNetLogDataProtoV0001_Point>
+              protoPointLogData(new ControlNetLogDataProtoV0001_Point(protoLogData.points(i)));
+        ControlPointV0002 point(protoPoint, protoPointLogData);
+        m_points.append( createPoint(point) );
+
+        if (progress) {
+          progress->CheckStatus();
+        }
+
+      }
+      catch (IException &e) {
+        QString msg = "Failed to convert version 1 protobuf control point at index ["
+                      + toString(i) + "] into a ControlPoint.";
+        throw IException(e, IException::User, msg, _FILEINFO_);
+      }
+    }
+  }
+
+
+  /**
+   * Read a protobuf version 2 control network and prepare the data to be
+   *  converted into a control network.
+   *
+   * @param header The Pvl file header that contains byte offsets for the protobuf messages
+   * @param netFile The filename of the control network file.
+   * @param progress The progress object to track reading points.
+   */
+  void ControlNetVersioner::readProtobufV0002(const Pvl &header,
+                                              const FileName netFile,
+                                              Progress *progress) {
+    // read the header protobuf object
+    const PvlObject &protoBufferInfo = header.findObject("ProtoBuffer");
+    const PvlObject &protoBufferCore = protoBufferInfo.findObject("Core");
+
+    BigInt headerStartPos = protoBufferCore["HeaderStartByte"];
+    BigInt headerLength = protoBufferCore["HeaderBytes"];
+
+    fstream input(netFile.expanded().toLatin1().data(), ios::in | ios::binary);
+    if ( !input.is_open() ) {
+      QString msg = "Failed to open control network file" + netFile.name();
+      throw IException(IException::Programmer, msg, _FILEINFO_);
+    }
+
+    input.seekg(headerStartPos, ios::beg);
+    streampos filePos = input.tellg();
+
+    ControlNetFileHeaderV0002 protoHeader;
+    try {
+      IstreamInputStream headerInStream(&input);
+      CodedInputStream headerCodedInStream(&headerInStream);
+      // max 512MB, warn at 400MB
+      headerCodedInStream.SetTotalBytesLimit(1024 * 1024 * 512,
+                                             1024 * 1024 * 400);
+      CodedInputStream::Limit oldLimit = headerCodedInStream.PushLimit(headerLength);
+      if ( !protoHeader.ParseFromCodedStream(&headerCodedInStream) ) {
+        QString msg = "Failed to parse protobuf header from input control net file ["
+                      + netFile.name() + "]";
+        throw IException(IException::Io, msg, _FILEINFO_);
+      }
+      headerCodedInStream.PopLimit(oldLimit);
+      filePos += headerLength;
+    }
+    catch (...) {
+      QString msg = "An error occured while reading the protobuf control network header.";
+      throw IException(IException::Io, msg, _FILEINFO_);
+    }
+
+    // initialize the header from the protobuf header
+    try {
+      ControlNetHeaderV0004 header;
+      header.networkID = protoHeader.networkid().c_str();
+      if ( protoHeader.has_targetname() ) {
+        header.targetName = protoHeader.targetname().c_str();
+      }
+      else {
+        header.targetName = "";
+      }
+      header.created = protoHeader.created().c_str();
+      header.lastModified = protoHeader.lastmodified().c_str();
+      header.description = protoHeader.description().c_str();
+      header.userName = protoHeader.username().c_str();
+      createHeader(header);
+    }
+    catch (IException &e) {
+      QString msg = "Missing required header information.";
+      throw IException(e, IException::Io, msg, _FILEINFO_);
+    }
+
+    // read each protobuf control point and then initialize it
+    // For some reason, reading the header causes the input stream to fail so reopen the file
+    input.close();
+    input.open(netFile.expanded().toLatin1().data(), ios::in | ios::binary);
+    input.seekg(filePos, ios::beg);
+    IstreamInputStream pointInStream(&input);
+    int numPoints = protoHeader.pointmessagesizes_size();
+
+    if (progress) {
+      progress->SetText("Reading Control Points...");
+      progress->SetMaximumSteps(numPoints);
+      progress->CheckStatus();
+    }
+
+    for (int pointIndex = 0; pointIndex < numPoints; pointIndex ++) {
+      QSharedPointer<ControlPointFileEntryV0002> newPoint(new ControlPointFileEntryV0002);
+
+      try {
+        CodedInputStream pointCodedInStream(&pointInStream);
+        pointCodedInStream.SetTotalBytesLimit(1024 * 1024 * 512,
+                                              1024 * 1024 * 400);
+        int pointSize = protoHeader.pointmessagesizes(pointIndex);
+        CodedInputStream::Limit oldPointLimit = pointCodedInStream.PushLimit(pointSize);
+        newPoint->ParseFromCodedStream(&pointCodedInStream);
+        pointCodedInStream.PopLimit(oldPointLimit);
+      }
+      catch (...) {
+        QString msg = "Failed to read protobuf version 2 control point at index ["
+                      + toString(pointIndex) + "].";
+        throw IException(IException::Io, msg, _FILEINFO_);
+      }
+
+      try {
+        ControlPointV0004 point(newPoint);
+        m_points.append( createPoint(point) );
+
+        if (progress) {
+          progress->CheckStatus();
+        }
+
+      }
+      catch (IException &e) {
+        QString msg = "Failed to convert protobuf version 2 control point at index ["
+                      + toString(pointIndex) + "] into a ControlPoint.";
+        throw IException(e, IException::Io, msg, _FILEINFO_);
+      }
+    }
   }
 
 
   /**
-   * This is a convenience method for copying keywords out of the container
-   *   and into the ControlPointFileEntryV0002 for strings. This operation is
-   *   only necessary for the latest version of the binary so this method needs
-   *   to be updated or removed when V0003 comes around.
+   * Read a protobuf version 5 control network and prepare the data to be
+   *  converted into a control network.
    *
-   * If the keyword doesn't exist, this does nothing.
+   * @param header The Pvl file header that contains byte offsets for the protobuf messages
+   * @param netFile The filename of the control network file.
+   * @param progress The progress object to track reading points.
+   */
+  void ControlNetVersioner::readProtobufV0005(const Pvl &header,
+                                              const FileName netFile,
+                                              Progress *progress) {
+    // read the header protobuf object
+    const PvlObject &protoBufferInfo = header.findObject("ProtoBuffer");
+    const PvlObject &protoBufferCore = protoBufferInfo.findObject("Core");
+
+    BigInt headerStartPos = protoBufferCore["HeaderStartByte"];
+    BigInt headerLength = protoBufferCore["HeaderBytes"];
+    BigInt pointsLength = protoBufferCore["PointsBytes"];
+
+    fstream input(netFile.expanded().toLatin1().data(), ios::in | ios::binary);
+    if ( !input.is_open() ) {
+      QString msg = "Failed to open control network file" + netFile.name();
+      throw IException(IException::Programmer, msg, _FILEINFO_);
+    }
+
+    input.seekg(headerStartPos, ios::beg);
+
+    streampos filePos = input.tellg();
+
+    ControlNetFileHeaderV0005 protoHeader;
+    try {
+
+      IstreamInputStream headerInStream(&input);
+      CodedInputStream headerCodedInStream(&headerInStream);
+
+      // max 512MB, warn at 400MB
+      headerCodedInStream.SetTotalBytesLimit(1024 * 1024 * 512,
+                                             1024 * 1024 * 400);
+
+      CodedInputStream::Limit oldLimit = headerCodedInStream.PushLimit(headerLength);
+
+      if ( !protoHeader.ParseFromCodedStream(&headerCodedInStream) ) {
+        QString msg = "Failed to parse protobuf header from input control net file ["
+                      + netFile.name() + "]";
+        throw IException(IException::Io, msg, _FILEINFO_);
+      }
+
+      headerCodedInStream.PopLimit(oldLimit);
+
+      filePos += headerLength;
+    }
+    catch (...) {
+      QString msg = "An error occured while reading the protobuf control network header.";
+      throw IException(IException::Io, msg, _FILEINFO_);
+    }
+    // initialize the header from the protobuf header
+    try {
+      ControlNetHeaderV0005 header;
+      header.networkID = protoHeader.networkid().c_str();
+      if ( protoHeader.has_targetname() ) {
+        header.targetName = protoHeader.targetname().c_str();
+      }
+      else {
+        header.targetName = "";
+      }
+      header.created = protoHeader.created().c_str();
+      header.lastModified = protoHeader.lastmodified().c_str();
+      header.description = protoHeader.description().c_str();
+      header.userName = protoHeader.username().c_str();
+      createHeader(header);
+    }
+    catch (IException &e) {
+      QString msg = "Missing required header information.";
+      throw IException(e, IException::Io, msg, _FILEINFO_);
+    }
+
+    // read each protobuf control point and then initialize it
+    // For some reason, reading the header causes the input stream to fail so reopen the file
+    input.close();
+    input.open(netFile.expanded().toLatin1().data(), ios::in | ios::binary);
+    input.seekg(filePos, ios::beg);
+
+    IstreamInputStream pointInStream(&input);
+
+    BigInt numberOfPoints = 0;
+
+    if ( protoBufferInfo.hasGroup("ControlNetworkInfo") ) {
+      const PvlGroup &networkInfo = protoBufferInfo.findGroup("ControlNetworkInfo");
+
+      if ( networkInfo.hasKeyword("NumberOfPoints") ) {
+        try {
+          numberOfPoints = networkInfo["NumberOfPoints"];
+        }
+        catch (...) {
+          numberOfPoints = 0;
+        }
+      }
+    }
+
+    if (progress && numberOfPoints != 0) {
+      progress->SetText("Reading Control Points...");
+      progress->SetMaximumSteps(numberOfPoints);
+      progress->CheckStatus();
+    }
+
+    Isis::EndianSwapper lsb("LSB");
+    int pointIndex = -1;
+    while (pointInStream.ByteCount() < pointsLength) {
+      pointIndex += 1;
+      QSharedPointer<ControlPointFileEntryV0002> newPoint(new ControlPointFileEntryV0002);
+
+      try {
+
+        CodedInputStream pointCodedInStream(&pointInStream);
+        pointCodedInStream.SetTotalBytesLimit(1024 * 1024 * 512,
+                                              1024 * 1024 * 400);
+
+        uint32_t size;
+        pointCodedInStream.ReadRaw(reinterpret_cast<char *>(&size), sizeof(size));
+        
+        size = lsb.Uint32_t(&size);
+
+        CodedInputStream::Limit oldPointLimit = pointCodedInStream.PushLimit(size);
+        newPoint->ParseFromCodedStream(&pointCodedInStream);
+        pointCodedInStream.PopLimit(oldPointLimit);
+      }
+      catch (...) {
+        QString msg = "Failed to read protobuf version 2 control point at index ["
+                      + toString(pointIndex) + "].";
+        throw IException(IException::Io, msg, _FILEINFO_);
+      }
+
+      try {
+        ControlPointV0005 point(newPoint);
+        m_points.append( createPoint(point) );
+
+        if (progress && numberOfPoints != 0) {
+          progress->CheckStatus();
+        }
+
+      }
+      catch (IException &e) {
+        QString msg = "Failed to convert protobuf version 2 control point at index ["
+                      + toString(pointIndex) + "] into a ControlPoint.";
+        throw IException(e, IException::Io, msg, _FILEINFO_);
+      }
+    }
+  }
+
+
+  /**
+   * Create a pointer to a latest version ControlPoint from an
+   * object in a V0001 control net file. This method converts a
+   * ControlPointV0001 to the latest ControlPontV#### version
+   * and uses the latest versioned point to construct and fill an
+   * Isis::ControlPoint.
+   *
+   * @param point The versioned control point to be updated.
+   *
+   * @return @b ControlPoint* The ControlPoint constructed from the given point.
+   */
+  ControlPoint *ControlNetVersioner::createPoint(ControlPointV0001 &point) {
+    ControlPointV0002 newPoint(point);
+    return createPoint(newPoint);
+  }
+
+
+  /**
+   * Create a pointer to a latest version ControlPoint from an
+   * object in a V0002 control net file. This method converts a
+   * ControlPointV0002 to the latest ControlPontV#### version
+   * and uses the latest versioned point to construct and fill an
+   * Isis::ControlPoint.
+   *
+   * @param point The versioned control point to be updated.
    *
-   * @param container The PvlObject that represents a control point
-   * @param keyName The keyword name inside the PvlObject
-   * @param point The protocol buffer point instance to set the value in
-   * @param setter The protocol buffer setter method
+   * @return @b ControlPoint* The ControlPoint constructed from the given point.
    */
-  void ControlNetVersioner::Copy(PvlContainer &container,
-                                 QString keyName, 
-                                 ControlPointFileEntryV0002 &point,
-                                 void (ControlPointFileEntryV0002::*setter)(const std::string&)) {
-    
-    if (!container.hasKeyword(keyName))
-      return;
-
-    IString value = container[keyName][0];
-    container.deleteKeyword(keyName);
-    (point.*setter)(value);
+  ControlPoint *ControlNetVersioner::createPoint(ControlPointV0002 &point) {
+
+    ControlPointV0003 newPoint(point);
+    return createPoint(newPoint);
+
+  }
+
+
+  /**
+   * Create a pointer to a latest version ControlPoint from an
+   * object in a V0003 control net file. This method converts a
+   * ControlPointV0003 to the latest ControlPontV#### version
+   * and uses the latest versioned point to construct and fill an
+   * Isis::ControlPoint.
+   *
+   * @param point The versioned control point to be updated.
+   *
+   * @return @b ControlPoint* The ControlPoint constructed from the given point.
+   */
+  ControlPoint *ControlNetVersioner::createPoint(ControlPointV0003 &point) {
+    ControlPointFileEntryV0002 protoPoint = point.pointData();
+    ControlPoint *controlPoint = new ControlPoint;
+
+    // ID is required, no need for if-statement here
+    controlPoint->SetId(QString(protoPoint.id().c_str()));
+
+    if ( protoPoint.has_choosername() ) {
+      controlPoint->SetChooserName(protoPoint.choosername().c_str());
+    }
+
+    // point type is required, no need for if statement here
+    ControlPoint::PointType pointType;
+    switch ( protoPoint.type() ) {
+      case ControlPointFileEntryV0002_PointType_obsolete_Tie:
+      case ControlPointFileEntryV0002_PointType_Free:
+        pointType = ControlPoint::Free;
+        break;
+      case ControlPointFileEntryV0002_PointType_Constrained:
+        pointType = ControlPoint::Constrained;
+        break;
+      case ControlPointFileEntryV0002_PointType_obsolete_Ground:
+      case ControlPointFileEntryV0002_PointType_Fixed:
+        pointType = ControlPoint::Fixed;
+        break;
+      default:
+        QString msg = "Unable to create ControlPoint [" + toString(protoPoint.id().c_str())
+                      + "] from file. Type enumeration [" + toString((int)(protoPoint.type()))
+                      + "] is invalid.";
+        throw IException(IException::Programmer, msg, _FILEINFO_);
+        break;
+    }
+    controlPoint->SetType(pointType);
+
+    if ( protoPoint.has_ignore() ) {
+      controlPoint->SetIgnored(protoPoint.ignore());
+    }
+    if ( protoPoint.has_jigsawrejected() ) {
+      controlPoint->SetRejected(protoPoint.jigsawrejected());
+    }
+
+    // setting apriori radius information
+    if ( protoPoint.has_aprioriradiussource() ) {
+
+      switch ( protoPoint.aprioriradiussource() ) {
+        case ControlPointFileEntryV0002_AprioriSource_None:
+          controlPoint->SetAprioriRadiusSource(ControlPoint::RadiusSource::None);
+          break;
+        case ControlPointFileEntryV0002_AprioriSource_User:
+          controlPoint->SetAprioriRadiusSource(ControlPoint::RadiusSource::User);
+          break;
+        case ControlPointFileEntryV0002_AprioriSource_AverageOfMeasures:
+          controlPoint->SetAprioriRadiusSource(ControlPoint::RadiusSource::AverageOfMeasures);
+          break;
+        case ControlPointFileEntryV0002_AprioriSource_Ellipsoid:
+          controlPoint->SetAprioriRadiusSource(ControlPoint::RadiusSource::Ellipsoid);
+          break;
+        case ControlPointFileEntryV0002_AprioriSource_DEM:
+          controlPoint->SetAprioriRadiusSource(ControlPoint::RadiusSource::DEM);
+          break;
+        case ControlPointFileEntryV0002_AprioriSource_BundleSolution:
+          controlPoint->SetAprioriRadiusSource(ControlPoint::RadiusSource::BundleSolution);
+          break;
+
+        default:
+          QString msg = "Unknown control point apriori radius source.";
+          throw IException(IException::User, msg, _FILEINFO_);
+          break;
+      }
+    }
+
+    if ( protoPoint.has_aprioriradiussourcefile() ) {
+      controlPoint->SetAprioriRadiusSourceFile(protoPoint.aprioriradiussourcefile().c_str());
+    }
+
+    // setting apriori surf pt information
+    if ( protoPoint.has_apriorisurfpointsource() ) {
+      switch ( protoPoint.apriorisurfpointsource() ) {
+        case ControlPointFileEntryV0002_AprioriSource_None:
+          controlPoint->SetAprioriSurfacePointSource(ControlPoint::SurfacePointSource::None);
+         break;
+
+        case ControlPointFileEntryV0002_AprioriSource_User:
+          controlPoint->SetAprioriSurfacePointSource(ControlPoint::SurfacePointSource::User);
+          break;
+
+        case ControlPointFileEntryV0002_AprioriSource_AverageOfMeasures:
+          controlPoint->SetAprioriSurfacePointSource(
+                              ControlPoint::SurfacePointSource::AverageOfMeasures);
+          break;
+
+        case ControlPointFileEntryV0002_AprioriSource_Reference:
+          controlPoint->SetAprioriSurfacePointSource(ControlPoint::SurfacePointSource::Reference);
+          break;
+
+        case ControlPointFileEntryV0002_AprioriSource_Basemap:
+          controlPoint->SetAprioriSurfacePointSource(ControlPoint::SurfacePointSource::Basemap);
+          break;
+
+        case ControlPointFileEntryV0002_AprioriSource_BundleSolution:
+          controlPoint->SetAprioriSurfacePointSource(
+                              ControlPoint::SurfacePointSource::BundleSolution);
+          break;
+
+        default:
+          QString msg = "Unknown control point aprioir surface point source.";
+          throw IException(IException::User, msg, _FILEINFO_);
+          break;
+      }
+    }
+
+    if ( protoPoint.has_apriorisurfpointsourcefile() ) {
+      controlPoint->SetAprioriSurfacePointSourceFile(
+                          protoPoint.apriorisurfpointsourcefile().c_str());
+    }
+
+    if ( protoPoint.has_apriorix()
+        && protoPoint.has_aprioriy()
+        && protoPoint.has_aprioriz() ) {
+
+      SurfacePoint aprioriSurfacePoint(Displacement(protoPoint.apriorix(), Displacement::Meters),
+                                       Displacement(protoPoint.aprioriy(), Displacement::Meters),
+                                       Displacement(protoPoint.aprioriz(), Displacement::Meters));
+
+      if ( protoPoint.aprioricovar_size() > 0 ) {
+        symmetric_matrix<double, upper> aprioriCovarianceMatrix;
+        aprioriCovarianceMatrix.resize(3);
+        aprioriCovarianceMatrix.clear();
+        aprioriCovarianceMatrix(0, 0) = protoPoint.aprioricovar(0);
+        aprioriCovarianceMatrix(0, 1) = protoPoint.aprioricovar(1);
+        aprioriCovarianceMatrix(0, 2) = protoPoint.aprioricovar(2);
+        aprioriCovarianceMatrix(1, 1) = protoPoint.aprioricovar(3);
+        aprioriCovarianceMatrix(1, 2) = protoPoint.aprioricovar(4);
+        aprioriCovarianceMatrix(2, 2) = protoPoint.aprioricovar(5);
+        aprioriSurfacePoint.SetRectangularMatrix(aprioriCovarianceMatrix);
+        // note: setting lat/lon/rad constrained happens when we call SetAprioriSurfacePoint()
+      }
+
+      controlPoint->SetAprioriSurfacePoint(aprioriSurfacePoint);
+    }
+
+    // setting adj surf pt information
+    if ( protoPoint.has_adjustedx()
+        && protoPoint.has_adjustedy()
+        && protoPoint.has_adjustedz() ) {
+
+      SurfacePoint adjustedSurfacePoint(Displacement(protoPoint.adjustedx(),Displacement::Meters),
+                                        Displacement(protoPoint.adjustedy(),Displacement::Meters),
+                                        Displacement(protoPoint.adjustedz(),Displacement::Meters));
+
+      if ( protoPoint.adjustedcovar_size() > 0 ) {
+        symmetric_matrix<double, upper> adjustedCovarianceMatrix;
+        adjustedCovarianceMatrix.resize(3);
+        adjustedCovarianceMatrix.clear();
+        adjustedCovarianceMatrix(0, 0) = protoPoint.adjustedcovar(0);
+        adjustedCovarianceMatrix(0, 1) = protoPoint.adjustedcovar(1);
+        adjustedCovarianceMatrix(0, 2) = protoPoint.adjustedcovar(2);
+        adjustedCovarianceMatrix(1, 1) = protoPoint.adjustedcovar(3);
+        adjustedCovarianceMatrix(1, 2) = protoPoint.adjustedcovar(4);
+        adjustedCovarianceMatrix(2, 2) = protoPoint.adjustedcovar(5);
+        adjustedSurfacePoint.SetRectangularMatrix(adjustedCovarianceMatrix);
+      }
+
+      controlPoint->SetAdjustedSurfacePoint(adjustedSurfacePoint);
+    }
+
+    if ( m_header.equatorialRadius.isValid() && m_header.polarRadius.isValid() ) {
+      SurfacePoint aprioriSurfacePoint = controlPoint->GetAprioriSurfacePoint();
+      SurfacePoint adjustedSurfacePoint = controlPoint->GetAdjustedSurfacePoint();
+      aprioriSurfacePoint.SetRadii(m_header.equatorialRadius,
+                                   m_header.equatorialRadius,
+                                   m_header.polarRadius);
+      adjustedSurfacePoint.SetRadii(m_header.equatorialRadius,
+                                    m_header.equatorialRadius,
+                                    m_header.polarRadius);
+      controlPoint->SetAdjustedSurfacePoint(adjustedSurfacePoint);
+      controlPoint->SetAprioriSurfacePoint(aprioriSurfacePoint);
+    }
+
+    // adding measure information
+    for (int m = 0 ; m < protoPoint.measures_size(); m++) {
+      controlPoint->Add( createMeasure( protoPoint.measures(m) ) );
+    }
+
+    if ( protoPoint.has_referenceindex() ) {
+      controlPoint->SetRefMeasure(protoPoint.referenceindex());
+    }
+
+    // Set DateTime after calling all setters that clear DateTime value
+    if ( protoPoint.has_datetime() ) {
+      controlPoint->SetDateTime(protoPoint.datetime().c_str());
+    }
+    // Set edit lock last
+    if ( protoPoint.has_editlock() ) {
+      controlPoint->SetEditLock(protoPoint.editlock());
+    }
+
+    return controlPoint;
+
   }
 
 
   /**
-   * This is a convenience method for copying keywords out of the container
-   *   and into the ControlPointFileEntryV0002::Measure for booleans. This
-   *   operation is only necessary for the latest version of the binary so
-   *   this method needs to be updated or removed when V0003 comes around.
+   * Create a pointer to a ControlMeasure from a V0006 file.
    *
-   * If the keyword doesn't exist, this does nothing.
+   * @param measure The versioned control measure to be created.
    *
-   * @param container The PvlObject that represents a control point
-   * @param keyName The keyword name inside the PvlObject
-   * @param measure The protocol buffer point instance to set the value in
-   * @param setter The protocol buffer setter method
+   * @return The ControlMeasure constructed from the V0006 version
+   *         file.
    */
-  void ControlNetVersioner::Copy(PvlContainer &container, 
-                                 QString keyName,
-                                 ControlPointFileEntryV0002::Measure &measure,
-                                 void (ControlPointFileEntryV0002::Measure::*setter)(bool)) {
-    
-    if (!container.hasKeyword(keyName))
-      return;
-
-    QString value = container[keyName][0];
-    container.deleteKeyword(keyName);
-    value = value.toLower();
-    
-    if (value == "true" || value == "yes")
-      (measure.*setter)(true);
+  ControlMeasure *ControlNetVersioner::createMeasure(
+                                             const ControlPointFileEntryV0002_Measure &measure) {
+
+    ControlMeasure *newMeasure = new ControlMeasure;
+
+    // serial number is required, no need for if-statement
+    newMeasure->SetCubeSerialNumber(QString(measure.serialnumber().c_str()));
+
+    // measure type is required, no need for if-statement
+    ControlMeasure::MeasureType measureType;
+    switch ( measure.type() ) {
+      case ControlPointFileEntryV0002_Measure::Candidate:
+        measureType = ControlMeasure::Candidate;
+        break;
+      case ControlPointFileEntryV0002_Measure::Manual:
+        measureType = ControlMeasure::Manual;
+        break;
+      case ControlPointFileEntryV0002_Measure::RegisteredPixel:
+        measureType = ControlMeasure::RegisteredPixel;
+        break;
+      case ControlPointFileEntryV0002_Measure::RegisteredSubPixel:
+        measureType = ControlMeasure::RegisteredSubPixel;
+        break;
+      default:
+        QString msg = "Unknown control measure type.";
+        throw IException(IException::User, msg, _FILEINFO_);
+        break;
+    }
+    newMeasure->SetType(measureType);
+
+    if ( measure.has_jigsawrejected() ) {
+      newMeasure->SetRejected(measure.jigsawrejected());
+    }
+    if ( measure.has_ignore() ) {
+      newMeasure->SetIgnored(measure.ignore());
+    }
+    if ( measure.has_line() ) {
+      newMeasure->SetCoordinate(measure.sample(), measure.line());
+    }
+    if ( measure.has_diameter() ) {
+      newMeasure->SetDiameter(measure.diameter());
+    }
+    if ( measure.has_apriorisample() ) {
+      newMeasure->SetAprioriSample(measure.apriorisample());
+    }
+    if ( measure.has_aprioriline() ) {
+      newMeasure->SetAprioriLine(measure.aprioriline());
+    }
+    if ( measure.has_samplesigma() ) {
+      newMeasure->SetSampleSigma(measure.samplesigma());
+    }
+    if ( measure.has_linesigma() ) {
+      newMeasure->SetLineSigma(measure.linesigma());
+    }
+    if ( measure.has_sampleresidual()
+         && measure.has_lineresidual() ) {
+      newMeasure->SetResidual(measure.sampleresidual(), measure.lineresidual());
+    }
+
+    for (int i = 0; i < measure.log_size(); i++) {
+
+      const ControlPointFileEntryV0002_Measure_MeasureLogData &protoLog = measure.log(i);
+      ControlMeasureLogData logEntry;
+      if ( protoLog.has_doubledatatype() ) {
+        logEntry.SetDataType((ControlMeasureLogData::NumericLogDataType)protoLog.doubledatatype());
+      }
+      if ( protoLog.has_doubledatavalue() ) {
+        logEntry.SetNumericalValue( protoLog.doubledatavalue() );
+      }
+      newMeasure->SetLogData(logEntry);
+    }
+
+    if ( measure.has_choosername() ) {
+      newMeasure->SetChooserName(QString(measure.choosername().c_str()));
+    }
+
+    if ( measure.has_datetime() ) {
+      newMeasure->SetDateTime(QString(measure.datetime().c_str()));
+    }
+
+    // It is VERY important that the edit lock flag is set last because it prevents
+    // all of the other mutators from working if true.
+    if ( measure.has_editlock() ) {
+      newMeasure->SetEditLock(measure.editlock());
+    }
+    return newMeasure;
   }
 
 
   /**
-   * This is a convenience method for copying keywords out of the container
-   *   and into the ControlPointFileEntryV0002::Measure for doubles. This
-   *   operation is only necessary for the latest version of the binary so
-   *   this method needs to be updated or removed when V0003 comes around.
+   * Create the internal header from a V0001 header.
    *
-   * If the keyword doesn't exist, this does nothing.
+   * The latest version is V0001, so this will check for an old issue with
+   * Mars target names and then internalize the header.
    *
-   * @param container The PvlObject that represents a control point
-   * @param keyName The keyword name inside the PvlObject
-   * @param measure The protocol buffer point instance to set the value in
-   * @param setter The protocol buffer setter method
+   * @param header The V0001 header
    */
-  void ControlNetVersioner::Copy(PvlContainer &container, 
-                                 QString keyName,
-                                 ControlPointFileEntryV0002::Measure &measure,
-                                 void (ControlPointFileEntryV0002::Measure::*setter)(double)) {
-    
-    if (!container.hasKeyword(keyName))
-      return;
-
-    double value = toDouble(container[keyName][0]);
-    container.deleteKeyword(keyName);
-    (measure.*setter)(value);
+  void ControlNetVersioner::createHeader(const ControlNetHeaderV0001 header) {
+    m_header = header;
+
+    if ( m_header.targetName.startsWith("MRO/") ) {
+      m_header.targetName = "Mars";
+    }
+
+    if ( !m_header.targetName.isEmpty() ) {
+      try {
+        // attempt to get target radii values...
+        PvlGroup pvlRadii = Target::radiiGroup(m_header.targetName);
+        m_header.equatorialRadius.setMeters(pvlRadii["EquatorialRadius"]);
+        m_header.polarRadius.setMeters(pvlRadii["PolarRadius"]);
+       }
+       catch (IException &e) {
+         // do nothing
+       }
+    }
   }
 
 
   /**
-   * This is a convenience method for copying keywords out of the container
-   *   and into the ControlPointFileEntryV0002::Measure for strings. This
-   *   operation is only necessary for the latest version of the binary so
-   *   this method needs to be updated or removed when V0003 comes around.
+   * This will write a control net file object to disk.
    *
-   * If the keyword doesn't exist, this does nothing.
+   * @param netFile The output filename that will be written to
    *
-   * @param container The PvlObject that represents a control point
-   * @param keyName The keyword name inside the PvlObject
-   * @param measure The protocol buffer point instance to set the value in
-   * @param set The protocol buffer setter method
    */
-  void ControlNetVersioner::Copy(PvlContainer &container, 
-                                 QString keyName,
-                                 ControlPointFileEntryV0002::Measure &measure,
-                                 void (ControlPointFileEntryV0002::Measure::*set)
-                                      (const std::string &)) {
-    
-    if (!container.hasKeyword(keyName))
-      return;
-
-    IString value = container[keyName][0];
-    container.deleteKeyword(keyName);
-    (measure.*set)(value);
+  void ControlNetVersioner::write(FileName netFile) {
+    try {
+
+      const int labelBytes = 65536;
+      fstream output(netFile.expanded().toLatin1().data(), ios::out | ios::trunc | ios::binary);
+      char *blankLabel = new char[labelBytes];
+      memset(blankLabel, 0, labelBytes);
+      output.write(blankLabel, labelBytes);
+      delete [] blankLabel;
+
+      int numMeasures = 0;
+      int numPoints = m_points.size();
+      foreach (ControlPoint *point, m_points) {
+        numMeasures += point->GetNumMeasures();
+      }
+
+      streampos startCoreHeaderPos = output.tellp();
+
+      writeHeader(&output);
+
+      BigInt pointByteTotal = 0;
+      while ( !m_points.isEmpty() ) {
+         pointByteTotal += writeFirstPoint(&output);
+      }
+
+      // // Insert header at the beginning of the file once writing is done.
+      ControlNetFileHeaderV0005 protobufHeader;
+
+      protobufHeader.set_networkid(m_header.networkID.toLatin1().data());
+      protobufHeader.set_targetname(m_header.targetName.toLatin1().data());
+      protobufHeader.set_created(m_header.created.toLatin1().data());
+      protobufHeader.set_lastmodified(m_header.lastModified.toLatin1().data());
+      protobufHeader.set_description(m_header.description.toLatin1().data());
+      protobufHeader.set_username(m_header.userName.toLatin1().data());
+
+      streampos coreHeaderSize = protobufHeader.ByteSize();
+
+      Pvl p;
+
+      PvlObject protoObj("ProtoBuffer");
+
+      PvlObject protoCore("Core");
+      protoCore.addKeyword(PvlKeyword("HeaderStartByte",
+                           toString((BigInt) startCoreHeaderPos)));
+      protoCore.addKeyword(PvlKeyword("HeaderBytes", toString((BigInt) coreHeaderSize)));
+
+      BigInt pointsStartByte = (BigInt) (startCoreHeaderPos + coreHeaderSize);
+
+      protoCore.addKeyword(PvlKeyword("PointsStartByte", toString(pointsStartByte)));
+
+      protoCore.addKeyword(PvlKeyword("PointsBytes",
+                           toString(pointByteTotal)));
+      protoObj.addObject(protoCore);
+
+      PvlGroup netInfo("ControlNetworkInfo");
+      netInfo.addComment("This group is for informational purposes only");
+      netInfo += PvlKeyword("NetworkId", protobufHeader.networkid().c_str());
+      netInfo += PvlKeyword("TargetName", protobufHeader.targetname().c_str());
+      netInfo += PvlKeyword("UserName", protobufHeader.username().c_str());
+      netInfo += PvlKeyword("Created", protobufHeader.created().c_str());
+      netInfo += PvlKeyword("LastModified", protobufHeader.lastmodified().c_str());
+      netInfo += PvlKeyword("Description", protobufHeader.description().c_str());
+      netInfo += PvlKeyword("NumberOfPoints", toString(numPoints));
+
+      netInfo += PvlKeyword("NumberOfMeasures", toString(numMeasures));
+      netInfo += PvlKeyword("Version", "5");
+      protoObj.addGroup(netInfo);
+
+      p.addObject(protoObj);
+
+      output.seekp(0, ios::beg);
+      output << p;
+      output << '\n';
+      output.close();
+
+    }
+    catch (...) {
+      QString msg = "Can't write control net file";
+      throw IException(IException::Io, msg, _FILEINFO_);
+    }
+  }
+
+ /**
+  * This will read the binary protobuffer control network header to an fstream
+  *
+  * @param output The fstream we're writing out to.
+  */
+  void ControlNetVersioner::writeHeader(fstream *output) {
+
+    // Create the protobuf header using our struct
+    ControlNetFileHeaderV0005 protobufHeader;
+
+    protobufHeader.set_networkid(m_header.networkID.toLatin1().data());
+    protobufHeader.set_targetname(m_header.targetName.toLatin1().data());
+    protobufHeader.set_created(m_header.created.toLatin1().data());
+    protobufHeader.set_lastmodified(m_header.lastModified.toLatin1().data());
+    protobufHeader.set_description(m_header.description.toLatin1().data());
+    protobufHeader.set_username(m_header.userName.toLatin1().data());
+
+    // Write out the header
+    if ( !protobufHeader.SerializeToOstream(output) ) {
+      QString msg = "Failed to write output control network file.";
+      throw IException(IException::Io, msg, _FILEINFO_);
+    }
+  }
+
+
+ /**
+  * This will write the first control point to a file stream.
+  * The written point will be removed from the versioner and then deleted if the versioner
+  * has ownership of it.
+  *
+  * @param output A pointer to the fileStream that we are writing the point to.
+  *
+  * @return @b int The number of bytes written to the filestream.
+  */
+  int ControlNetVersioner::writeFirstPoint(fstream *output) {
+
+      BigInt startPos = output->tellp();
+
+      ControlPointFileEntryV0002 protoPoint;
+      ControlPoint *controlPoint = m_points.takeFirst();
+
+      if ( controlPoint->GetId().isEmpty() ) {
+        QString msg = "Unbable to write first point of control net. "
+                      "Invalid control point has no point ID value.";
+        throw IException(IException::Unknown, msg, _FILEINFO_);
+      }
+      else {
+        protoPoint.set_id(controlPoint->GetId().toLatin1().data());
+      }
+
+      if ( QString::compare(controlPoint->GetChooserName(), "Null", Qt::CaseInsensitive) != 0 ) {
+        protoPoint.set_choosername(controlPoint->GetChooserName().toLatin1().data());
+      }
+      if ( QString::compare(controlPoint->GetDateTime(), "Null", Qt::CaseInsensitive) != 0 ) {
+        protoPoint.set_datetime(controlPoint->GetDateTime().toLatin1().data());
+      }
+      if ( controlPoint->IsEditLocked() ) {
+        protoPoint.set_editlock(true);
+      }
+
+      ControlPointFileEntryV0002_PointType pointType;
+      switch ( controlPoint->GetType() ) {
+        case ControlPoint::Free:
+          pointType = ControlPointFileEntryV0002_PointType_Free;
+          break;
+        case ControlPoint::Constrained:
+          pointType = ControlPointFileEntryV0002_PointType_Constrained;
+          break;
+        case ControlPoint::Fixed:
+          pointType = ControlPointFileEntryV0002_PointType_Fixed;
+          break;
+        default:
+          QString msg = "Unable to create ProtoPoint [" + toString(protoPoint.id().c_str())
+                        + "] from file. Type enumeration ["
+                        + toString((int)(controlPoint->GetType())) + "] is invalid.";
+          throw IException(IException::Programmer, msg, _FILEINFO_);
+          break;
+      }
+      protoPoint.set_type(pointType);
+
+      if ( controlPoint->IsIgnored() ) {
+        protoPoint.set_ignore(true);
+      }
+
+      if ( controlPoint->IsRejected() ) {
+        protoPoint.set_jigsawrejected(true);
+      }
+
+      if ( controlPoint->HasRefMeasure() && controlPoint->IsReferenceExplicit() ) {
+        protoPoint.set_referenceindex(controlPoint->IndexOfRefMeasure());
+      }
+
+      if ( controlPoint->HasAprioriSurfacePointSourceFile() ) {
+        protoPoint.set_apriorisurfpointsourcefile(
+                   controlPoint->GetAprioriSurfacePointSourceFile().toLatin1().data());
+      }
+
+      // Apriori Surf Point Source ENUM settting
+      switch ( controlPoint->GetAprioriSurfacePointSource() ) {
+        case ControlPoint::SurfacePointSource::None:
+          protoPoint.set_apriorisurfpointsource(ControlPointFileEntryV0002_AprioriSource_None);
+          break;
+        case ControlPoint::SurfacePointSource::User:
+          protoPoint.set_apriorisurfpointsource(ControlPointFileEntryV0002_AprioriSource_User);
+          break;
+        case ControlPoint::SurfacePointSource::AverageOfMeasures:
+          protoPoint.set_apriorisurfpointsource(
+                           ControlPointFileEntryV0002_AprioriSource_AverageOfMeasures);
+          break;
+        case ControlPoint::SurfacePointSource::Reference:
+          protoPoint.set_apriorisurfpointsource(
+                           ControlPointFileEntryV0002_AprioriSource_Reference);
+          break;
+        case ControlPoint::SurfacePointSource::Basemap:
+          protoPoint.set_apriorisurfpointsource(ControlPointFileEntryV0002_AprioriSource_Basemap);
+          break;
+        case ControlPoint::SurfacePointSource::BundleSolution:
+          protoPoint.set_apriorisurfpointsource(
+                           ControlPointFileEntryV0002_AprioriSource_BundleSolution);
+          break;
+        default:
+          QString msg = "Unable to create ProtoPoint [" + toString(protoPoint.id().c_str())
+                        + "] from file. Type enumeration ["
+                        + toString((int)(controlPoint->GetAprioriSurfacePointSource()))
+                        + "] is invalid.";
+          throw IException(IException::Programmer, msg, _FILEINFO_);
+          break;
+      }
+
+      // Apriori Radius Point Source ENUM setting
+      switch ( controlPoint->GetAprioriRadiusSource() ) {
+        case ControlPoint::RadiusSource::None:
+          protoPoint.set_aprioriradiussource(ControlPointFileEntryV0002_AprioriSource_None);
+          break;
+        case ControlPoint::RadiusSource::User:
+          protoPoint.set_aprioriradiussource(ControlPointFileEntryV0002_AprioriSource_User);
+          break;
+        case ControlPoint::RadiusSource::AverageOfMeasures:
+          protoPoint.set_aprioriradiussource(
+                           ControlPointFileEntryV0002_AprioriSource_AverageOfMeasures);
+          break;
+        case ControlPoint::RadiusSource::BundleSolution:
+          protoPoint.set_aprioriradiussource(
+                           ControlPointFileEntryV0002_AprioriSource_BundleSolution);
+          break;
+        case ControlPoint::RadiusSource::Ellipsoid:
+          protoPoint.set_aprioriradiussource(ControlPointFileEntryV0002_AprioriSource_Ellipsoid);
+          break;
+        case ControlPoint::RadiusSource::DEM:
+          protoPoint.set_aprioriradiussource(ControlPointFileEntryV0002_AprioriSource_DEM);
+          break;
+        default:
+          QString msg = "Unable to create ProtoPoint [" + toString(protoPoint.id().c_str())
+                        + "] from file. Type enumeration ["
+                        + toString((int)(controlPoint->GetAprioriRadiusSource()))
+                        + "] is invalid.";
+          throw IException(IException::Programmer, msg, _FILEINFO_);
+          break;
+      }
+
+      if ( controlPoint->HasAprioriRadiusSourceFile() ) {
+        protoPoint.set_aprioriradiussourcefile(
+                   controlPoint->GetAprioriRadiusSourceFile().toLatin1().data());
+      }
+
+      SurfacePoint aprioriSurfacePoint = controlPoint->GetAprioriSurfacePoint();
+      if ( aprioriSurfacePoint.Valid() ) {
+        protoPoint.set_apriorix(aprioriSurfacePoint.GetX().meters());
+        protoPoint.set_aprioriy(aprioriSurfacePoint.GetY().meters());
+        protoPoint.set_aprioriz(aprioriSurfacePoint.GetZ().meters());
+
+        symmetric_matrix<double, upper> aprioriCovarianceMatrix =
+              aprioriSurfacePoint.GetRectangularMatrix();
+        if ( aprioriCovarianceMatrix.size1() > 0 &&
+             aprioriSurfacePoint.GetLatSigmaDistance().meters() != Isis::Null &&
+             aprioriSurfacePoint.GetLonSigmaDistance().meters() != Isis::Null &&
+             aprioriSurfacePoint.GetLocalRadiusSigma().meters() != Isis::Null ) {
+
+          protoPoint.add_aprioricovar(aprioriCovarianceMatrix(0, 0));
+          protoPoint.add_aprioricovar(aprioriCovarianceMatrix(0, 1));
+          protoPoint.add_aprioricovar(aprioriCovarianceMatrix(0, 2));
+          protoPoint.add_aprioricovar(aprioriCovarianceMatrix(1, 1));
+          protoPoint.add_aprioricovar(aprioriCovarianceMatrix(1, 2));
+          protoPoint.add_aprioricovar(aprioriCovarianceMatrix(2, 2));
+        }
+      }
+      // this might be redundant... determined by covariance matrix???
+      if ( controlPoint->IsLatitudeConstrained() ) {
+        protoPoint.set_latitudeconstrained(controlPoint->IsLatitudeConstrained());
+      }
+      if ( controlPoint->IsLongitudeConstrained() ) {
+        protoPoint.set_longitudeconstrained(controlPoint->IsLongitudeConstrained());
+      }
+      if ( controlPoint->IsRadiusConstrained() ) {
+        protoPoint.set_radiusconstrained(controlPoint->IsRadiusConstrained());
+      }
+
+      SurfacePoint adjustedSurfacePoint = controlPoint->GetAdjustedSurfacePoint();
+      if ( adjustedSurfacePoint.Valid() ) {
+
+        protoPoint.set_adjustedx(adjustedSurfacePoint.GetX().meters());
+        protoPoint.set_adjustedy(adjustedSurfacePoint.GetY().meters());
+        protoPoint.set_adjustedz(adjustedSurfacePoint.GetZ().meters());
+
+        symmetric_matrix<double, upper> adjustedCovarianceMatrix =
+              adjustedSurfacePoint.GetRectangularMatrix();
+        if ( adjustedCovarianceMatrix.size1() > 0 ) {
+          protoPoint.add_adjustedcovar(adjustedCovarianceMatrix(0, 0));
+          protoPoint.add_adjustedcovar(adjustedCovarianceMatrix(0, 1));
+          protoPoint.add_adjustedcovar(adjustedCovarianceMatrix(0, 2));
+          protoPoint.add_adjustedcovar(adjustedCovarianceMatrix(1, 1));
+          protoPoint.add_adjustedcovar(adjustedCovarianceMatrix(1, 2));
+          protoPoint.add_adjustedcovar(adjustedCovarianceMatrix(2, 2));
+        }
+      }
+
+      // Converting Measures
+      for (int j = 0; j < controlPoint->GetNumMeasures(); j++) {
+
+        const ControlMeasure &controlMeasure = *controlPoint->GetMeasure(j);
+
+        ControlPointFileEntryV0002_Measure protoMeasure;
+
+        protoMeasure.set_serialnumber(controlMeasure.GetCubeSerialNumber().toLatin1().data());
+
+        switch ( controlMeasure.GetType() ) {
+            case (ControlMeasure::Candidate):
+                protoMeasure.set_type(ControlPointFileEntryV0002_Measure_MeasureType_Candidate);
+                break;
+
+            case (ControlMeasure::Manual):
+                protoMeasure.set_type(ControlPointFileEntryV0002_Measure_MeasureType_Manual);
+                break;
+
+            case (ControlMeasure::RegisteredPixel):
+                protoMeasure.set_type(
+                      ControlPointFileEntryV0002_Measure_MeasureType_RegisteredPixel);
+                break;
+
+            case (ControlMeasure::RegisteredSubPixel):
+                protoMeasure.set_type(
+                      ControlPointFileEntryV0002_Measure_MeasureType_RegisteredSubPixel);
+                break;
+        }
+
+        if (QString::compare(controlMeasure.GetChooserName(), "Null", Qt::CaseInsensitive) != 0) {
+          protoMeasure.set_choosername(controlMeasure.GetChooserName().toLatin1().data());
+        }
+
+        if (QString::compare(controlMeasure.GetDateTime(), "Null", Qt::CaseInsensitive) != 0) {
+          protoMeasure.set_datetime(controlMeasure.GetDateTime().toLatin1().data());
+        }
+
+        if ( controlMeasure.IsEditLocked() ) {
+          protoMeasure.set_editlock(true);
+        }
+
+        if ( controlMeasure.IsIgnored() ) {
+          protoMeasure.set_ignore(true);
+        }
+
+        if ( controlMeasure.IsRejected() ) {
+          protoMeasure.set_jigsawrejected(true);
+        }
+
+        if ( controlMeasure.GetSample() != Isis::Null ) {
+          protoMeasure.set_sample(controlMeasure.GetSample());
+        }
+
+        if ( controlMeasure.GetLine() != Isis::Null ) {
+          protoMeasure.set_line(controlMeasure.GetLine());
+        }
+
+        if ( controlMeasure.GetDiameter() != Isis::Null ) {
+          protoMeasure.set_diameter(controlMeasure.GetDiameter());
+        }
+
+        if ( controlMeasure.GetAprioriSample() != Isis::Null ) {
+          protoMeasure.set_apriorisample(controlMeasure.GetAprioriSample());
+        }
+
+        if ( controlMeasure.GetAprioriLine() != Isis::Null ) {
+          protoMeasure.set_aprioriline(controlMeasure.GetAprioriLine());
+        }
+
+        if ( controlMeasure.GetSampleSigma() != Isis::Null ) {
+          protoMeasure.set_samplesigma(controlMeasure.GetSampleSigma());
+        }
+
+        if ( controlMeasure.GetLineSigma() != Isis::Null ) {
+          protoMeasure.set_linesigma(controlMeasure.GetLineSigma());
+        }
+
+        if ( controlMeasure.GetSampleResidual() != Isis::Null ) {
+          protoMeasure.set_sampleresidual(controlMeasure.GetSampleResidual());
+        }
+
+        if ( controlMeasure.GetLineResidual() != Isis::Null ) {
+          protoMeasure.set_lineresidual(controlMeasure.GetLineResidual());
+        }
+
+        if ( controlMeasure.IsRejected() ) {
+          protoMeasure.set_jigsawrejected(true);
+        }
+
+        QVector<ControlMeasureLogData> measureLogs = controlMeasure.GetLogDataEntries();
+        for (int logEntry = 0; logEntry < measureLogs.size(); logEntry ++) {
+
+          const ControlMeasureLogData &log = measureLogs[logEntry];
+
+          ControlPointFileEntryV0002_Measure_MeasureLogData logData;
+
+          if ( log.IsValid() ) {
+            logData.set_doubledatatype( (int) log.GetDataType() );
+            logData.set_doubledatavalue( log.GetNumericalValue() );
+          }
+
+          *protoMeasure.add_log() = logData;
+        }
+
+        *protoPoint.add_measures() = protoMeasure;
+      }
+
+      uint32_t byteSize = protoPoint.ByteSize();
+
+      Isis::EndianSwapper lsb("LSB");
+      byteSize = lsb.Uint32_t(&byteSize);
+
+      output->write(reinterpret_cast<char *>(&byteSize), sizeof(byteSize));
+
+      if ( !protoPoint.SerializeToOstream(output) ) {
+        QString err = "Error writing to coded protobuf stream";
+        throw IException(IException::Programmer, err, _FILEINFO_);
+      }
+
+      // Make sure that if the versioner owns the ControlPoint it is properly cleaned up.
+      if ( m_ownsPoints ) {
+        delete controlPoint;
+        controlPoint = NULL;
+      }
+      BigInt currentPos = output->tellp();
+      BigInt byteCount = currentPos - startPos;
+
+      // return size of message
+      return byteCount;
   }
 }
diff --git a/isis/src/control/objs/ControlNetVersioner/ControlNetVersioner.h b/isis/src/control/objs/ControlNetVersioner/ControlNetVersioner.h
index f255e028db7a0fecd5602c92f555ce77fa459188..14f15a7e01179b3b1e34dcaae323059ea7448e04 100644
--- a/isis/src/control/objs/ControlNetVersioner/ControlNetVersioner.h
+++ b/isis/src/control/objs/ControlNetVersioner/ControlNetVersioner.h
@@ -23,87 +23,338 @@
  *   http://www.usgs.gov/privacy.html.
  */
 
-#include <string>
+#include <QString>
 
-#include "ControlNetFile.h"
-#include "ControlNetFileV0002.pb.h"
+#include <QList>
+#include <QSharedPointer>
+#include <QVector>
+
+#include "ControlPoint.h"
+#include "ControlPointV0001.h"
+#include "ControlPointV0002.h"
+#include "ControlPointV0003.h"
 
 class QString;
 
 namespace Isis {
-  class ControlNetFileV0001;
-  class ControlNetFileV0002;
   class FileName;
   class Progress;
   class Pvl;
   class PvlContainer;
   class PvlObject;
+  class ControlPointV0001;
+  class ControlPointV0002;
+  class ControlPointV0003;
 
   /**
-   * @brief Handle Various Control Network Versions
-   *
-   * This class is used to read any and all control networks.
-   *
-   * All publicly released versions of binary control networks should be
-   *   supported if possible.
-   *
-   *                         ControlNetVersioner::Read
-   *                        /                         \
-   *                    [If Pvl]                    [If Binary]
-   *                      /                             \
-   *                  Pvl::Read                         |
-   *                     |          [If not latest]     |
-   *              Update To Latest <-- ToPvl --- ControlNetFileV????::Read
-   *                     |                              |  [If latest]
-   *                     |                              |
-   *                 Latest Pvl  ------------> Latest ControlNetFile
-   *                                                    |
-   *                                                    |
-   *                                             Isis::ControlNet
-   *
-   *
-   * We used to have the 4 conversions:
-   *   Pvl    -> Isis::ControlNet
-   *   Binary -> Isis::ControlNet
-   *   Pvl    <- Isis::ControlNet
-   *   Binary <- Isis::ControlNet
-   *
-   * But maintaining these causes us to need the old ControlNet code around.
-   *   These conversions are used instead:
-   *   Pvl    -> Binary           *Latest version only
-   *   Binary -> Pvl              *All versions
-   *   Binary -> Isis::ControlNet *Latest version only
-   *   Binary <- Isis::ControlNet *Latest version only
-   *
-   * The log data classes are still used to understand what log data is what,
-   *   so these classes must remain backwards compatible. Otherwise all of the
-   *   versioning code is here. I encourage the use of log data to avoid needing
-   *   to make any changes in this code.
-   *
-   * The reason the update cycle is only in Pvl form is because of how much
-   *   simpler and less error-prone the code is to convert between versions
-   *   in a generic file format. You don't need to do things like
-   *   new.setNetworkId(old.getNetworkId()) in Pvl. Hopefully the speed cost
-   *   is not significant enough to need an update cycle in binary form. It is
-   *   a one-time cost per network, timed at about 5 minutes for our currently
-   *   largest network (120MB protocol buffer file).
-   *
-   * This class is the reason Isis::ControlNet only need to work with the latest
-   *   version. Also, we only need 1-way conversions for old file formats
-   *   (ControlNetFile::ToPvl).
-   *
-   * If you want to change the Pvl format, you must update the following:
-   *     Update LATEST_PVL_VERSION
-   *     Write ConvertVersionAToVersionB
-   *     Update ReadPvlNetwork
-   *     Update LatestPvlToBinary
-   *
-   * If you want to change the Binary format, you must update the following:
-   *     Update LATEST_BINARY_VERSION
-   *     Write ControlNetFileV????
-   *     Update ControlNetFile.h
-   *     Update ReadBinaryNetwork
-   *     Update LatestPvlToBinary
+   * @brief Handle various control network file format versions.
+   *
+   * <h3>Overview</h3>
+   *
+   * This class is used to read all versions of control networks and write out
+   *   the most recent version in Pvl and protobuf format. When reading a
+   *   control net file, the ControlNeVersioner is initialized with the
+   *   filename. When writing a control net file or generating a Pvl network,
+   *   the ControlNetVersioner is initialized from a ControlNet object.
+   *
+   * This class exists to isolate the code dealing with control network file
+   *   formats. ControlNet can then interface with this class and only has to
+   *   work with the current ControlPoint object.
+   *
+   * <h3>Reading Control Network Files</h3>
+   *
+   * The read routine is as follows:
+   * <ol>
+   *   <li>Read the Pvl file header</li>
+   *   <li>Determine if the network is stored in Pvl or protobuf format</li>
+   *   <li>Determine the version of the network</li>
+   *   <li>Read in the general ControlNet information such as network
+   *        description, last modification date, etc. For Pvl networks, this
+   *        information is in a PvlObject at the start of the network. For
+   *        protobuf objects this information is stored in a header protobuf
+   *        message after the Pvl file header.</li>
+   *   <li>For each control point do the following:
+   *   <ol type="a">
+   *     <li>Read the control point into the appropriate ControlPointV####
+   *          object.</li>
+   *     <li>If the ControlPointV#### object is not the most recent version,
+   *          upgrade it to the latest version.</li>
+   *     <li>Convert the final ControlPointV#### object into a ControlPoint
+   *          object and store it in the ControlNetVersioner.</li>
+   *   </ol>
+   *   </li>
+   * </ol>
+   *
+   * Once the ControlNet file is read into the ControlNetVersioner, the
+   *   ControlPoints can be accessed through the takeFirstPoint method. This
+   *   will remove the first ControlPoint stored in the ControlNetVersioner and
+   *   give it to the caller. At this point, the caller is given ownership of
+   *   the ControlPoint and is expected to delete it when finished. General
+   *   information about the control network can be accessed directly from the
+   *   ControlNetVersioner.
+   *
+   * <h3>Writing Control Network Files</h3>
+   *
+   * The protobuf file write routine is as follows:
+   * <ol>
+   *   <li>Copy the general ControlNet information such as network description,
+   *        last modification date, etc. into the ControlNetVersioner.</li>
+   *   <li>Copy the pointers to the ControlPoints and store them in the
+   *        ControlNetVersioner. The ControlNetVersioner does not assume
+   *        ownership of the ControlPoints when it does this. The ControlNet
+   *        or what the ControlNet got the points from retains ownership.</li>
+   *   <li>Write a 65536 byte blank header to the file.</li>
+   *   <li>Write the general ControlNet information to a protobuf message header
+   *        after the blank header.</li>
+   *   <li>For each control point do the following:
+   *   <ol type="a">
+   *     <li>Convert the control point into a protobuf message.</li>
+   *     <li>Write the size of the protobuf message to the file.</li>
+   *     <li>Write the protobuf message to the file.</li>
+   *   </ol>
+   *   </li>
+   *   <li>Write a Pvl header into the original blank header at the start of the
+   *        file. This header contains: a flag indicating the network is a
+   *        protobuf formatted network, the version of the format, the byte
+   *        offset and size of the protobuf header, the byte offset and
+   *        size of the block of protobuf control points, and general
+   *        information about the control network.</li>
+   * </ol>
+   *
+   * Once the ControlNetVersioner is initialized from a file or a ControlNet,
+   *   a Pvl formatted version of the control network can be created by the
+   *   toPvl method. This will always output the control network in the latest
+   *   Pvl format. From here, the Pvl network can be written to a file with
+   *   Pvl::write(filename).
+   *
+   * <h3>Modifying the Control Network File Format</h3>
+   *
+   * If the control network file format is changed the following changes need
+   *   to be made to ControlNetVersioner and its supporting classes:
+   *<ul>
+   * <li>
+   * New containers need to be added to interface with the new format. These
+   *   containers should try to match the format of the data in the file, then
+   *   the versioner will convert from that format to ControlNet, ControlPoint,
+   *   ControlMeasure, and ControlMeasureLogData. General information about the
+   *   control network should be stored in the ControlNetHeaderV#### structs.
+   *   Data for control points should be stored in ControlPointV#### objects.
+   * </li>
+   * <li>
+   * If a new control point container was created, code needs to be added to
+   *   create ControlPoint objects from them. A new createPoint method that
+   *   takes the new container should be added to do this. The createMeasure
+   *   method should also be changed to create ControlMeasures from the new
+   *   containers.
+   * </li>
+   * <li>
+   * If a new header container was created, code needs to be added to store its
+   *   information in the ControlNetVersioner. A new createHeader method that
+   *   takes the new header container should be added to do this.
+   * </li>
+   * <li>
+   * New code needs to be added to update the previous containers to the new
+   *   containers. Updating control point containers should happen in the new
+   *   ControlPointV#### container class. It should have a constructor that
+   *   takes a container for the previous version. Then, the createPoint method
+   *   for the previous version needs to be changed to create a new container
+   *   with this and then call the createPoint method for the new version.
+   *   Updating header containers should happen in the createHeader method that
+   *   takes the previous version. If the headers become more complicated, this
+   *   may need to change to match how control point containers are updated.
+   * </li>
+   * <li>
+   * New methods need to be added to read the new file format. Methods for
+   *   reading Pvl formatted files and protobuf formatted files need to be
+   *   added; they should match the naming convention of readPvlV#### and
+   *   readProtobufV#### respectively.
+   * </li>
+   * <li>
+   * New methods need to be added to write out the new file format. The write
+   *   method should be changed to write out the new protobuf format. If
+   *   a new header container is added, the writeHeader method should be
+   *   changed to write the new protobuf header to the file. If a new control
+   *   point container is added, the writeFirstPoint method should be changed
+   *   to write a new protobuf control point to the file.
+   * </li>
+   * <li>
+   * Update the documentation on this class under the <b>Control Network File
+   *   Format History</b> heading. This should include a description of the new
+   *   file format and how it differs from the previous version.
+   * </li>
+   *</ul>
+   *
+   * <h3>Control Network File Format History</h3>
+   *
+   * Prior to the creation of this versioning class, which was released with
+   *   ISIS 3.2.2, all control network files were Pvl formatted text files.
+   *   Reading and writing these files was handled by the ControlNet, ControlPoint,
+   *   and ControlMeasure classes. As the file format was changed, those
+   *   classes were modified to account for the new format. Because of this,
+   *   the history of the control network file format prior to ISIS 3.2.2
+   *   is not well documented.
+   *
+   * The following are descriptions of the different control network file
+   *   format versions that are currently supported. Each description also
+   *   describes how that version differs from the previous.
+   *
+   * <b>Version 1</b>
+   *
+   *   This version maintains backwards compatibility with all files created
+   *   prior to versioning. If a control network file does not have a version
+   *   flag, then it is assumed to be a version 1 file. Because this version
+   *   supports all files created prior to ISIS 3.2.2, there is no standardized
+   *   Pvl format associated with it.
+   *
+   *   Originally, there was no version 1 binary format. When version 2 was
+   *   added, version 1 was changed to use the version 2 binary format.
+   *
+   * <b>Version 2</b>
+   *
+   *   This version was the first to have a standardized format. The following
+   *   were standardized with this format:
+   *   <ul>
+   *     <li>The Held flag was replaced by point types. Points could be either
+   *     Tie points or Ground points. Points that were previously flagged as
+   *     Held were changed to Ground points.</li>
+   *     <li>A posteriori was replaced with adjusted in several keyword
+   *     names.</li>
+   *     <li>The a priori and adjusted ground points were changed from
+   *     (latitude, longitude, radius) format to body fixed (X, Y, Z) format.
+   *     </li>
+   *     <li>Ground point sigmas were replaced with covariance matrices.</li>
+   *     <li>Latitude, longitude, and radius constrained flags were added.</li>
+   *     <li>Estimated measures were renamed to Candidate measures.</li>
+   *     <li>Unmeasured measures were renamed to Candidate measures, had their
+   *     line and sample set to 0, and were flagged as ignored.</li>
+   *     <li>Automatic, ValidatedManual and AutomaticPixel measures were
+   *     renamed to RegisteredPixel measures.</li>
+   *     <li>ValidatedAutomatic and AutomaticSubPixel measures were renamed to
+   *     RegisteredSubPixel measures.</li>
+   *     <li>ErrorSample and ErrorLine were renamed to SampleResidual and
+   *     LineResidual respectively.</li>
+   *     <li>Diameter, ZScore, and ErrorMagnitude were no longer saved in
+   *     measures.</li>
+   *   </ul>
+   *
+   *   Version 2 was the first version to support a binary protobuf format.
+   *   Version 1 was retroactively changed to use the version 2 binary format.
+   *   Version 2 binary control network files consist of three parts:
+   *   <ol>
+   *     <li>
+   *     <em>Pvl File Header:</em> The file starts with a Pvl formatted header
+   *     that contains offsets to the binary components of the file and the
+   *     version number of the file. This header may also contain general
+   *     information about the control network that is only for user reference
+   *     is not used when reading the file.
+   *     </li>
+   *     <li>
+   *     <em>Protobuf Core:</em> After the Pvl header is the protobuf core that
+   *     contains the majority of the network data. This is a hierarchical
+   *     structure with general network information such as the network
+   *     description at the top level. Below that is the control point
+   *     information. The lowest level contains the control measure information.
+   *     This structure is defined by <em>ControlNetFileProtoV0001.proto</em>.
+   *     </li>
+   *     <li>
+   *     <em>Protobuf Log Data:</em> The final component of the file contains
+   *     the control measure log data. This is structured the same as the
+   *     protobuf core. So, the log data for the i<sup>th</sup> measure in the
+   *     j<sup>th</sup> point in the core is in the i<sup>th</sup> measure of
+   *     the j<sup>th</sup> point in this structure. This structure is defined
+   *     by <em>ControlNetLogDataProtoV0001.proto</em>.
+   *     </li>
+   *   </ol>
+   *
+   * <b>Version 3</b>
+   *
+   *   This version was created to avoid file size limits imposed by the
+   *   version 2 binary file format. Protobuf messages are limited to 2GB for
+   *   security reasons. So, version 2 binary files can only contain 2GB of
+   *   information in their Protobuf Core. In version 3, the Protobuf Core was
+   *   changed from a single message to a header message and individual
+   *   messages for each control point. This way, the Protobuf Core could
+   *   contain an arbitrary amount of information as long as any single point
+   *   does not exceed 2GB. At the same time, control measure log data was
+   *   moved into the Protobuf Core so that each measure contains its own log
+   *   data.
+   *
+   *   Version 3 binary control network files are formatted as follows:
+   *   <ul>
+   *     <li>
+   *     <em>pvl File Header:</em> The Pvl Header in version 3 binary files
+   *     is the same as the Pvl Header in version 2 binary files, except it has
+   *     offsets to the Protobuf Header and Protobuf Core instead of the
+   *     Protobuf Core and Protobuf Log Data.
+   *     </li>
+   *     <li>
+   *     <em>Protobuf Header:</em> The binary component of version 3 binary
+   *     control network files starts with a protobuf message header that
+   *     contains general information about the network and the size of each
+   *     control point's protobuf message. The size of each control point
+   *     message is required to parse the Protobuf Core because protobuf
+   *     messages are not self-delimiting. This structure is defined by
+   *     <em>ControlNetFileHeaderV0002.proto</em>.
+   *     </li>
+   *     <li>
+   *     <em>Protobuf Core:</em> Immediately after the Protobuf Header is
+   *     the Protobuf Core which contains all of the control point and control
+   *     measure information. This is structured as consecutive protobuf
+   *     messages where each message contains all of the information for a
+   *     control point and its control measures. Because protobuf messages
+   *     are not self-delimiting, the size of each message must be known prior
+   *     to parsing the Protobuf Core. The control point messages are defined
+   *     by <em>ControlPointFileEntryV0002.proto</em>.
+   *     </li>
+   *   </ul>
+   *
+   *   Version 3 also further differentiated control point types. Control
+   *   points that had their latitude, longitude, and/or radius constrained
+   *   were changed from Tie points to Constrained points.
+   *
+   * <b>Version 4</b>
+   *
+   *   This version was created when Ground and Tie control points were renamed
+   *   to Fixed and Free respectively. Version 4 Pvl control network files are
+   *   identical to version 3 Pvl control network files, except for the new
+   *   control point type values. When version 4 was created, the .proto file
+   *   that defined control point protobuf messages was modified to allow for
+   *   the new control point type names and the old names were flagged as
+   *   deprecated. So, version 3 and version 4 binary control network files are
+   *   formatted exactly the same.
+   *
+   * <b>Version 5</b>
+   *
+   *   This version was created to allow for progressive reading and writing of
+   *   binary control network files. Previous versions required the entire
+   *   contents of binary control network files to be read into memory before
+   *   the ControlNet, ControlPoint, and ControlMeasure objects could be
+   *   created. Version 5 was created to allow binary control network files
+   *   to be read one control point at a time. Similarly, previous versions
+   *   required all of the information in the control network to be copied into
+   *   protobuf structures before any of it could be written to a file.
+   *
+   *   Version 5 Pvl control network files are identical to version 4 Pvl
+   *   control network files.
+   *
+   *   Version 5 binary control network files are formatted the same as version
+   *   4 binary control network files except for how they store the sizes of
+   *   the control point messages in the Protobuf Core. In a version 5 binary
+   *   control network file, each control point message is prepended by an
+   *   unsigned, 32 bit, LSB, integer (c++ uint32_t) that contains the size of
+   *   the message. This design was modeled after the delimited read and write
+   *   functionality in the Java protobuf library. Additionally, the Protobuf
+   *   Header contains the number of control points in the network instead of
+   *   a list of all the control point message sizes. The structure of the
+   *   Protobuf Header is defined by <em>ControlNetFileHeaderV0005.proto</em>.
+   *   The structure of the protobuf messages in the Protobuf Core is defined
+   *   by <em>ControlPointFileEntryV0002.proto</em>, the same as in version 4.
+   *
+   *   Starting with version 5, the naming scheme for .proto files was changed
+   *   to use the same version number as the control net file format. So, the
+   *   new .proto file defining the Protobuf Header was named
+   *   <em>ControlNetFileHeaderV0005.proto</em> instead of
+   *   <em>ControlNetFileHeaderV0003.proto</em>.
    *
    * @ingroup ControlNetwork
    *
@@ -128,75 +379,154 @@ namespace Isis {
    *                           call. This was done to reduce redundancy since the original
    *                           message for this error was very similar to the caught exception
    *                           to which it is appended. References #3892
+   *   @history 2017-12-11 Jeannie Backer & Jesse Mapel - Created class skeleton for refactor.
+   *   @history 2017-12-11 Jesse Mapel - Added VersionedControlNetHeaders.
+   *   @history 2017-12-12 Kristin Berry - Added initial toPvl for refactor.
+   *   @history 2017-12-12 Jeannie Backer - Added VersionedControlPoints.
+   *   @history 2017-12-12 Jeannie Backer - Implemented createPoint() methods.
+   *   @history 2017-12-13 Jeannie Backer - Added target radii to createPoint(V0006).
+   *   @history 2017-12-18 Adam Goins and Kristin Berry - Added new write() method.
+   *   @history 2017-12-19 Kristin Berry - Corrected method names and general cleanup in toPvl and
+   *                           write for refactor.
+   *   @history 2017-12-20 Jesse Mapel - Made read and createPoint methods match new
+   *                           ControlPointV#### classes.
+   *   @history 2017-12-20 Jeannie Backer - Updated toPvl and write methods to get surface point
+   *                           information from the ControlPoint.
+   *   @history 2018-01-03 Jesse Mapel - Updated class documentation.
+   *   @history 2018-01-04 Adam Goins - Updated read/write methods to read/write protobuf messages
+   *                           correctly.
+   *   @history 2018-01-12 Adam Goins - Added the ControlPoint radii to the header to avoid
+   *                           Target::GetRadii calls to speed up createPoint().
+   *   @history 2018-01-12 Adam Goins - Added Progress during reads.
+   *   @history 2018-01-24 Jesse Mapel - Fixed c++11 build warnings.
+   *   @history 2018-01-27 Jesse Mapel - Fixed some documentation formatting. Added a section
+   *                           describing the different file format versions.
+   *   @history 2018-01-30 Adam Goins - Ensured point sizes are written/read as lsb by using
+   *                           EndianSwapper.
    */
   class ControlNetVersioner {
-    public:
-      static LatestControlNetFile *Read(const FileName &file);
-      static void Write(const FileName &file, const LatestControlNetFile &,
-                        bool pvl = false);
 
-    private:
-      // read Pvl and bring it up to the latest version, then convert to binary
-      static LatestControlNetFile *ReadPvlNetwork(Pvl pvl);
-      static LatestControlNetFile *LatestPvlToBinary(PvlObject &network);
+    public:
+      ControlNetVersioner(ControlNet *net);
+      ControlNetVersioner(const FileName netFile, Progress *progress=NULL);
+      ~ControlNetVersioner();
 
-      // read Binary, convert to Pvl, call ReadPvlNetwork
-      static LatestControlNetFile *ReadBinaryNetwork(const Pvl &header,
-                                                     const FileName &file);
+      QString netId() const;
+      QString targetName() const;
+      QString creationDate() const;
+      QString lastModificationDate() const;
+      QString description() const;
+      QString userName() const;
 
-      static void ConvertVersion1ToVersion2(PvlObject &network);
-      static void ConvertVersion2ToVersion3(PvlObject &network);
-      static void ConvertVersion3ToVersion4(PvlObject &network);
+      int numPoints() const;
+      ControlPoint *takeFirstPoint();
 
-      // We only need the latest Pvl version because it has our update cycle
-      //! The latest version of the Pvl formatted control networks
-      static const int LATEST_PVL_VERSION = 4;
-      //! The latest version of the Binary formatted control networks
-      static const int LATEST_BINARY_VERSION = 2;
+      void write(FileName netFile);
+      Pvl toPvl();
 
     private:
-      // helper methods for LatestPvlToBinary
-      static void Copy(PvlContainer &container, QString keyName,
-          ControlPointFileEntryV0002 &point,
-          void (ControlPointFileEntryV0002::*setter)(bool));
-      static void Copy(PvlContainer &container,
-          QString keyName, ControlPointFileEntryV0002 &point,
-          void (ControlPointFileEntryV0002::*setter)(double));
-      static void Copy(PvlContainer &container,
-          QString keyName, ControlPointFileEntryV0002 &point,
-          void (ControlPointFileEntryV0002::*setter)(const std::string&));
-
-      static void Copy(PvlContainer &container, QString keyName,
-          ControlPointFileEntryV0002::Measure &measure,
-          void (ControlPointFileEntryV0002::Measure::*setter)(bool));
-      static void Copy(PvlContainer &container, QString keyName,
-          ControlPointFileEntryV0002::Measure &measure,
-          void (ControlPointFileEntryV0002::Measure::*setter)(double));
-      static void Copy(PvlContainer &container, QString keyName,
-          ControlPointFileEntryV0002::Measure &measure,
-          void (ControlPointFileEntryV0002::Measure::*setter)
-            (const std::string &));
-
-      // This class is static, no instantiation allowed
-      /**
-       * The constructor is not implemented.
-       */
+      // These three methods are private to ensure proper memory management
+      //! Default constructor. Intentially un-implemented.
       ControlNetVersioner();
       /**
-       * The constructor is not implemented so the copy constructor is
-       *   impossible.
+       * Copy constructor. Intentially un-implemented.
        *
-       * @param other The versioner to copy from
+       * @param other The other ControlNetVersioner to create a copy of.
        */
       ControlNetVersioner(const ControlNetVersioner &other);
       /**
-       * The constructor is not implemented so assignment is impossible.
+       * Asssignment operator. Intentially un-implemented.
+       *
+       * @param other The other ControlNetVersione to assign from.
        *
-       * @param other The versioner to copy from
+       * @return @b ControlNetVersioner& A reference to this after assignment.
        */
       ControlNetVersioner &operator=(const ControlNetVersioner &other);
+
+      // Private ControlNetHeader structs for versioning
+      /**
+       * Versioned container for general information about a control network.
+       *
+       * @ingroup ControlNetwork
+       *
+       * @author 2017-12-27 Jesse Mapel
+       *
+       * @internal
+       *   @history 2017-12-27 Jesse Mapel - Original Version
+       */
+      struct ControlNetHeaderV0001 {
+        //! The ID/Name of the control network
+        QString networkID;
+        //! The NAIF name of the target body
+        QString targetName;
+        //! The date and time of the control network's creation
+        QString created;
+        //! The date and time of the control network's last modification
+        QString lastModified;
+        //! The text description of the control network
+        QString description;
+        //! The name of the user or program that last modified the control network
+        QString userName;
+        /**
+         * The equatorial radius of the target body
+         * used to convert from spherical to rectangular coordinates
+         */
+        Distance equatorialRadius;
+        /**
+         * The equatorial radius of the target body
+         * used to convert from spherical to rectangular coordinates
+         */
+        Distance polarRadius;
+      };
+
+      //! Typedef for consistent naming of containers for version 2
+      typedef ControlNetHeaderV0001 ControlNetHeaderV0002;
+      //! Typedef for consistent naming of containers for version 3
+      typedef ControlNetHeaderV0001 ControlNetHeaderV0003;
+      //! Typedef for consistent naming of containers for version 4
+      typedef ControlNetHeaderV0001 ControlNetHeaderV0004;
+      //! Typedef for consistent naming of containers for version 5
+      typedef ControlNetHeaderV0001 ControlNetHeaderV0005;
+
+      //! Typedef for consistent naming of containers for version 4
+      typedef ControlPointV0003 ControlPointV0004;
+      //! Typedef for consistent naming of containers for version 5
+      typedef ControlPointV0003 ControlPointV0005;
+
+      void read(const FileName netFile, Progress *progress=NULL);
+
+      void readPvl(const Pvl &network, Progress *progress=NULL);
+      void readPvlV0001(const PvlObject &network, Progress *progress=NULL);
+      void readPvlV0002(const PvlObject &network, Progress *progress=NULL);
+      void readPvlV0003(const PvlObject &network, Progress *progress=NULL);
+      void readPvlV0004(const PvlObject &network, Progress *progress=NULL);
+      void readPvlV0005(const PvlObject &network, Progress *progress=NULL);
+
+      void readProtobuf(const Pvl &header, const FileName netFile, Progress *progress=NULL);
+      void readProtobufV0001(const Pvl &header, const FileName netFile, Progress *progress=NULL);
+      void readProtobufV0002(const Pvl &header, const FileName netFile, Progress *progress=NULL);
+      void readProtobufV0005(const Pvl &header, const FileName netFile, Progress *progress=NULL);
+
+      ControlPoint *createPoint(ControlPointV0001 &point);
+      ControlPoint *createPoint(ControlPointV0002 &point);
+      ControlPoint *createPoint(ControlPointV0003 &point);
+
+      ControlMeasure *createMeasure(const ControlPointFileEntryV0002_Measure&);
+
+      void createHeader(const ControlNetHeaderV0001 header);
+
+      void writeHeader(std::fstream *output);
+      int writeFirstPoint(std::fstream *output);
+
+      ControlNetHeaderV0005 m_header; /**< Header containing information about
+                                           the whole network.*/
+      QList<ControlPoint *> m_points; /**< ControlPoints that are read in from a file or
+                                           ready to be written out to a file.*/
+      bool m_ownsPoints; /**< Flag if the versioner owns the control points stored in it.
+                             This will be true when the versioner created the points from a file.
+                             This will be false when the versioner copied the points from an
+                             esiting control network.*/
+
   };
 }
-
 #endif
-
diff --git a/isis/src/control/objs/ControlNetVersioner/ControlNetVersioner.truth b/isis/src/control/objs/ControlNetVersioner/ControlNetVersioner.truth
index 64570bf6b297ab4688524b4a4363aeb094387ae2..f0d2e7d37abc644e989032217714a236f7bb04a7 100644
--- a/isis/src/control/objs/ControlNetVersioner/ControlNetVersioner.truth
+++ b/isis/src/control/objs/ControlNetVersioner/ControlNetVersioner.truth
@@ -1,13 +1,17 @@
 Test ControlNetVersioner
-Reading: ./reallyOldNetwork.net...
+Reading: $control/testData/unitTest_ControlNetVersioner_PvlNetwork2_PvlV0001.net...
 
 Read network...
-**I/O ERROR** Reading the control network [reallyOldNetwork.net] failed.
-**I/O ERROR** Unable to get convert ControlNet Version 1 to Version 2.
+Reading Control Points...
+0% Processed
**I/O ERROR** Reading the control network [unitTest_ControlNetVersioner_PvlNetwork2_PvlV0001.net] failed.
+**I/O ERROR** Failed to initialize control point at index [0].
+**I/O ERROR** Unable to get target body radii for [] when calculating covariance matrix.
 
-Reading: ./reallyOldNetwork2.net...
+Reading: $control/testData/unitTest_ControlNetVersioner_PvlNetwork3_PvlV0001.net...
 
 Read network...
+Reading Control Points...
+0% Processed
10% Processed
20% Processed
30% Processed
40% Processed
50% Processed
60% Processed
70% Processed
80% Processed
90% Processed
100% Processed
 Converted directly to Pvl:
 Object = ControlNetwork
   NetworkId    = Null
@@ -16,17 +20,19 @@ Object = ControlNetwork
   Created      = Null
   LastModified = Null
   Description  = Null
-  Version      = 3
+  Version      = 5
 
   Object = ControlPoint
     PointType   = Free
     PointId     = 1
-    ChooserName = Null
-    DateTime    = Null
+    ChooserName = Unknown
+    DateTime    = 2018-01-09
 
     Group = ControlMeasure
       SerialNumber = M0
       MeasureType  = Candidate
+      ChooserName  = Unknown
+      DateTime     = 2018-01-09
       Ignore       = True
       Sample       = 0.0
       Line         = 0.0
@@ -35,7 +41,8 @@ Object = ControlNetwork
     Group = ControlMeasure
       SerialNumber = M1
       MeasureType  = Candidate
-      ChooserName  = Null
+      ChooserName  = Unknown
+      DateTime     = 2018-01-09
       Sample       = 1.0
       Line         = 1.0
     End_Group
@@ -43,7 +50,8 @@ Object = ControlNetwork
     Group = ControlMeasure
       SerialNumber = M2
       MeasureType  = Candidate
-      ChooserName  = Null
+      ChooserName  = Unknown
+      DateTime     = 2018-01-09
       Sample       = 1.0
       Line         = 1.0
     End_Group
@@ -55,9 +63,11 @@ After reading and writing to a binary form does Pvl match?
 Conversion to Pvl stays consistent
 Reading/Writing control network is consistent
 
-Reading: ./oldNetwork.net...
+Reading: $control/testData/unitTest_ControlNetVersioner_PvlNetwork1_PvlV0001.net...
 
 Read network...
+Reading Control Points...
+0% Processed
10% Processed
20% Processed
30% Processed
40% Processed
50% Processed
60% Processed
70% Processed
80% Processed
90% Processed
100% Processed
 Converted directly to Pvl:
 Object = ControlNetwork
   NetworkId    = TestNet01
@@ -66,17 +76,19 @@ Object = ControlNetwork
   Created      = Null
   LastModified = Null
   Description  = "Test Network"
-  Version      = 3
+  Version      = 5
 
   Object = ControlPoint
     PointType   = Fixed
     PointId     = 1001
-    ChooserName = Null
-    DateTime    = Null
+    ChooserName = Unknown
+    DateTime    = 2018-01-19
 
     Group = ControlMeasure
       SerialNumber = Cassini-Huygens/ISSNA/1/1467436709.122
       MeasureType  = RegisteredPixel
+      ChooserName  = Unknown
+      DateTime     = 2018-01-19
       Sample       = 893.0
       Line         = 616.0
     End_Group
@@ -84,6 +96,8 @@ Object = ControlNetwork
     Group = ControlMeasure
       SerialNumber = Cassini-Huygens/ISSNA/1/1467443189.122
       MeasureType  = RegisteredPixel
+      ChooserName  = Unknown
+      DateTime     = 2018-01-19
       Sample       = 799.25
       Line         = 701.21
       Reference    = True
@@ -92,6 +106,8 @@ Object = ControlNetwork
     Group = ControlMeasure
       SerialNumber = Cassini-Huygens/ISSNA/1/1467454012.125
       MeasureType  = RegisteredPixel
+      ChooserName  = Unknown
+      DateTime     = 2018-01-19
       Sample       = 569.01
       Line         = 807.23
     End_Group
@@ -103,9 +119,11 @@ After reading and writing to a binary form does Pvl match?
 Conversion to Pvl stays consistent
 Reading/Writing control network is consistent
 
-Reading: ./oldNetwork2.net...
+Reading: $control/testData/unitTest_ControlNetVersioner_ProtoNetwork1_ProtoV0001.net...
 
 Read network...
+Reading Control Points...
+0% Processed
10% Processed
20% Processed
30% Processed
40% Processed
50% Processed
60% Processed
70% Processed
80% Processed
90% Processed
100% Processed
 Converted directly to Pvl:
 Object = ControlNetwork
   NetworkId    = Test
@@ -114,7 +132,7 @@ Object = ControlNetwork
   Created      = 2010-07-10T12:50:15
   LastModified = 2010-07-10T12:50:55
   Description  = "UnitTest of ControlNetwork"
-  Version      = 3
+  Version      = 5
 
   Object = ControlPoint
     PointType                = Constrained
@@ -283,22 +301,26 @@ After reading and writing to a binary form does Pvl match?
 Conversion to Pvl stays consistent
 Reading/Writing control network is consistent
 
-Reading: ./badNetwork.net...
+Reading: $control/testData/unitTest_ControlNetVersioner_BadNetwork_ProtoV0001.net...
 
 Read network...
-**I/O ERROR** Reading the control network [badNetwork.net] failed.
-**USER ERROR** Cannot parse binary PB file.
+**I/O ERROR** Reading the control network [unitTest_ControlNetVersioner_BadNetwork_ProtoV0001.net] failed.
+**USER ERROR** Cannot parse binary protobuf file.
 
-Reading: ./semilarge.net...
+Reading: $control/testData/unitTest_ControlNetVersioner_ProtoNetwork2_ProtoV0002.net...
 
 Read network...
+Reading Control Points...
+0% Processed
10% Processed
20% Processed
30% Processed
40% Processed
50% Processed
60% Processed
70% Processed
80% Processed
90% Processed
100% Processed
 Write the network and re-read it...
 After reading and writing to a binary form does Pvl match?
 Reading/Writing control network is consistent
 
-Reading: ./smallPvlTest.pvl...
+Reading: $control/testData/unitTest_ControlNetVersioner_PvlNetwork4_PvlV0003.pvl...
 
 Read network...
+Reading Control Points...
+0% Processed
10% Processed
20% Processed
30% Processed
40% Processed
50% Processed
60% Processed
70% Processed
80% Processed
90% Processed
100% Processed
 Converted directly to Pvl:
 Object = ControlNetwork
   NetworkId    = LUNAE_PALUS_THEMIS_DIR
@@ -307,7 +329,7 @@ Object = ControlNetwork
   Created      = 2012-01-04T12:09:57
   LastModified = 2012-01-04T12:09:57
   Description  = "Themis Day IR Network: Lunae Palus, Lat(0,30) Lon(270-315)"
-  Version      = 3
+  Version      = 5
 
   Object = ControlPoint
     PointType                = Free
@@ -539,3 +561,97 @@ Reading/Writing control network is consistent
 Check conversions between the binary format and the pvl format.
 The conversion methods for pvl->bin and bin->pvl are correct.
 
+Reading: $control/testData/unitTest_ControlNetVersioner_PvlNetwork5_PvlV0003.pvl...
+
+Read network...
+Reading Control Points...
+0% Processed
10% Processed
20% Processed
30% Processed
40% Processed
50% Processed
60% Processed
70% Processed
80% Processed
90% Processed
100% Processed
+Write the network and re-read it...
+After reading and writing to a binary form does Pvl match?
+Reading/Writing control network is consistent
+
+Reading: $control/testData/unitTest_ControlNetVersioner_PvlNetwork3_PvlV0001.net...
+
+Read network...
+Write the network and re-read it...
+After reading and writing to a binary form does Pvl match?
+Reading/Writing control network is consistent
+
+Reading: $control/testData/unitTest_ControlNetVersioner_ProtoNetwork1_ProtoV0001.net...
+
+Read network...
+Write the network and re-read it...
+After reading and writing to a binary form does Pvl match?
+Reading/Writing control network is consistent
+
+Reading: $control/testData/unitTest_ControlNetVersioner_ProtoNetwork2_ProtoV0002.net...
+
+Read network...
+Write the network and re-read it...
+After reading and writing to a binary form does Pvl match?
+Reading/Writing control network is consistent
+
+Reading: $control/testData/unitTest_ControlNetVersioner_PvlNetwork4_PvlV0003.pvl...
+
+Read network...
+Write the network and re-read it...
+After reading and writing to a binary form does Pvl match?
+Reading/Writing control network is consistent
+
+Test writing from ControlNet objects
+
+Reading Control Points...
+0% Processed
10% Processed
20% Processed
30% Processed
40% Processed
50% Processed
60% Processed
70% Processed
80% Processed
90% Processed
100% Processed
+Adding Control Points to Network...
+0% Processed
10% Processed
20% Processed
30% Processed
40% Processed
50% Processed
60% Processed
70% Processed
80% Processed
90% Processed
100% Processed
+
+Test reading version 1 protobuf network
+
+Reading Control Points...
+0% Processed
10% Processed
20% Processed
30% Processed
40% Processed
50% Processed
60% Processed
70% Processed
80% Processed
90% Processed
100% Processed
+Take all of the control points and delete them.
+  1 point taken
+  2 points taken
+  3 points taken
+  4 points taken
+
+Test reading version 5 protobuf network
+
+Reading Control Points...
+0% Processed
10% Processed
20% Processed
30% Processed
40% Processed
50% Processed
60% Processed
70% Processed
80% Processed
90% Processed
100% Processed
+
+Test writing with invalid target
+
+
+Test reading a random PVL file
+
+**I/O ERROR** Reading the control network [equirectangular.map] failed.
+**I/O ERROR** Could not determine the control network file type.
+
+Test reading a PVL files with missing header information
+
+**I/O ERROR** Reading the control network [unitTest_ControlNetVersioner_PvlNetwork_BadHeaderV1.net] failed.
+**I/O ERROR** Missing required header information.
+**ERROR** PVL Keyword [TargetName] does not exist in [Object = ControlNetwork] in file [/usgs/cpkgs/isis3/data/control/testData/unitTest_ControlNetVersioner_PvlNetwork_BadHeaderV1.net].
+**I/O ERROR** Reading the control network [unitTest_ControlNetVersioner_PvlNetwork_BadHeaderV2.net] failed.
+**I/O ERROR** Missing required header information.
+**ERROR** PVL Keyword [TargetName] does not exist in [Object = ControlNetwork] in file [/usgs/cpkgs/isis3/data/control/testData/unitTest_ControlNetVersioner_PvlNetwork_BadHeaderV2.net].
+**I/O ERROR** Reading the control network [unitTest_ControlNetVersioner_PvlNetwork_BadHeaderV3.net] failed.
+**I/O ERROR** Missing required header information.
+**ERROR** PVL Keyword [TargetName] does not exist in [Object = ControlNetwork] in file [/usgs/cpkgs/isis3/data/control/testData/unitTest_ControlNetVersioner_PvlNetwork_BadHeaderV3.net].
+**I/O ERROR** Reading the control network [unitTest_ControlNetVersioner_PvlNetwork_BadHeaderV4.net] failed.
+**I/O ERROR** Missing required header information.
+**ERROR** PVL Keyword [TargetName] does not exist in [Object = ControlNetwork] in file [/usgs/cpkgs/isis3/data/control/testData/unitTest_ControlNetVersioner_PvlNetwork_BadHeaderV4.net].
+**I/O ERROR** Reading the control network [unitTest_ControlNetVersioner_PvlNetwork_BadHeaderV5.net] failed.
+**I/O ERROR** Missing required header information.
+**ERROR** PVL Keyword [TargetName] does not exist in [Object = ControlNetwork] in file [/usgs/cpkgs/isis3/data/control/testData/unitTest_ControlNetVersioner_PvlNetwork_BadHeaderV5.net].
+
+Test reading a protobuf file with a bad version number
+
+**I/O ERROR** Reading the control network [unitTest_ControlNetVersioner_ProtoNetwork_BadVersion.net] failed.
+**I/O ERROR** The Protobuf file version [7] is not supported.
+
+Test reading a protobuf file with no version number
+
+**I/O ERROR** Reading the control network [unitTest_ControlNetVersioner_ProtoNetwork_NoVersion.net] failed.
+**ERROR** PVL Keyword [StartByte] does not exist in [Object = Core].
diff --git a/isis/src/control/objs/ControlNetVersioner/ControlNetFileV0002.proto b/isis/src/control/objs/ControlNetVersioner/ControlPointFileEntryV0002.proto
similarity index 90%
rename from isis/src/control/objs/ControlNetVersioner/ControlNetFileV0002.proto
rename to isis/src/control/objs/ControlNetVersioner/ControlPointFileEntryV0002.proto
index bee6f38df79e0c7ea596285e126514191bcfdbde..a911e609acf876ede1ed0a461d78b7672e4d65ba 100644
--- a/isis/src/control/objs/ControlNetVersioner/ControlNetFileV0002.proto
+++ b/isis/src/control/objs/ControlNetVersioner/ControlPointFileEntryV0002.proto
@@ -1,26 +1,17 @@
 // 2011-06-07 Tracie Sucharski/Debbie Cook - Changed PointType 
 //                    Ground  ---->  Fixed
 //                    Tie     ---->  Free          
+//
+// 2017-12-11 Kristin Berry - Separated header and point into separate files. 
 
-// Protocol buffer descriptor for Isis3 Control Networks
+// Protocol buffer control point descriptor for Isis3 Control Networks
 package Isis;
 
-message ControlNetFileHeaderV0002 {
-//  Some fields of ControlNet
-  required string networkId    = 1;
-  required string targetName   = 2;
-  optional string created      = 3;
-  optional string lastModified = 4;
-  optional string description  = 5;
-  optional string userName     = 6;
-  repeated int32  pointMessageSizes = 7 [packed = true];
-}
-
 message ControlPointFileEntryV0002 {
   enum PointType {
     Free                 = 2; //  Image to Image
     Constrained          = 3; //  Image to Ground
-    Fixed                = 4; //  Image to Groun
+    Fixed                = 4; //  Image to Ground
     obsolete_Tie         = 0; //  Image to Image
     obsolete_Ground      = 1; //  Image to Ground
   }
diff --git a/isis/src/control/objs/ControlNetVersioner/ControlPointFileEntryV0005.proto b/isis/src/control/objs/ControlNetVersioner/ControlPointFileEntryV0005.proto
new file mode 100644
index 0000000000000000000000000000000000000000..c177b4da09a9e393dba6094c1dae3f941ac9ed10
--- /dev/null
+++ b/isis/src/control/objs/ControlNetVersioner/ControlPointFileEntryV0005.proto
@@ -0,0 +1,111 @@
+// Protocol buffer control point descriptor for Isis3 Control Networks
+package Isis;
+
+message ControlPointFileEntryV0005 {
+  enum PointType {
+    Free                 = 2; //  Image to Image
+    Constrained          = 3; //  Image to Ground
+    Fixed                = 4; //  Image to Ground
+    obsolete_Tie         = 0; //  Image to Image
+    obsolete_Ground      = 1; //  Image to Ground
+  }
+
+  enum AprioriSource {
+    None              = 0;
+    User              = 1;
+    AverageOfMeasures = 2;
+    Reference         = 3;
+    Ellipsoid         = 4;
+    DEM               = 5;
+    Basemap           = 6;
+    BundleSolution    = 7;
+  }
+
+  required string         id   = 1;
+  required PointType      type = 2;
+  optional string         chooserName = 3;
+  optional string         datetime = 4;
+  optional bool           editLock = 5;
+  optional bool           ignore   = 6;
+  optional bool           jigsawRejected = 7;
+  optional int32          referenceIndex = 8;
+
+  optional AprioriSource        aprioriSurfPointSource = 9;
+  optional string               aprioriSurfPointSourceFile = 10;
+  optional AprioriSource        aprioriRadiusSource = 11;
+  optional string               aprioriRadiusSourceFile = 12;
+  optional bool                 latitudeConstrained = 13;
+  optional bool                 longitudeConstrained = 14;
+  optional bool                 radiusConstrained = 15;
+  optional double               aprioriX = 16; // <meters>
+  optional double               aprioriY = 17; // <meters>
+  optional double               aprioriZ = 18; // <meters>
+
+  //  Accuracy of apriori coordinates from basemap, user or mission SPICE,
+  //    jigsaw weights based on these values. The sigmas are stored as a
+  //    3 x 3 variance-covariance matrix.
+  repeated double aprioriCovar = 19 [packed = true];
+
+  optional double adjustedX = 20;
+  optional double adjustedY = 21;
+  optional double adjustedZ = 22;
+
+  //  Set in jigsaw.  Accuracy of adjusted lat/lon from basemap, user or
+  //  mission SPICE stored as a 3 x 3 variance-covariance matrix.
+  repeated double adjustedCovar = 23 [packed = true];
+
+  message PointLogData {
+    optional int32   doubleDataType  = 1;
+    optional double  doubleDataValue = 2;
+    optional int32   boolDataType    = 3;
+    optional bool    boolDataValue   = 4;
+  }
+
+  repeated PointLogData log = 24;
+
+// Start of ControlMeasure definition
+  message Measure {
+    enum MeasureType {
+      // predicted, unmeasured, unverified
+      Candidate           = 0;
+      // Hand Measured (e.g., qnet)
+      Manual              = 1;
+      // Automatically registered to whole pixel (e.g.,pointreg/qnet)
+      RegisteredPixel     = 2;
+      // Automatically registered to sub-pixel (e.g., pointreg/qnet)
+      RegisteredSubPixel  = 3;
+    }
+
+    message MeasureLogData {
+      optional int32   doubleDataType  = 1;
+      optional double  doubleDataValue = 2;
+      optional int32   boolDataType    = 3;
+      optional bool    boolDataValue   = 4;
+    }
+
+    required string       serialnumber   = 1;
+    required MeasureType  type           = 2;
+    optional double       sample         = 3;
+    optional double       line           = 4;
+    // Jigsaw info-solution error <pixels>
+    optional double       sampleResidual = 5;
+    optional double       lineResidual   = 6;
+    optional string       choosername    = 7;
+    optional string       datetime       = 8;
+    optional bool         editLock       = 9;
+    optional bool         ignore         = 10;
+    optional bool         jigsawRejected = 11;
+    optional double       diameter       = 12;
+    // The first identified location of measure
+    optional double       apriorisample  = 13;
+    optional double       aprioriline    = 14;
+
+    // Uncertainty/Sigma of current samp/line <pixels>
+    optional double       samplesigma    = 15;
+    optional double       linesigma      = 16;
+    repeated MeasureLogData log          = 17;
+  }
+
+  //  Actual declaration of variable number of ControlMeasures
+  repeated Measure measures = 25;
+}
diff --git a/isis/src/control/objs/ControlNetVersioner/ControlPointV0001.cpp b/isis/src/control/objs/ControlNetVersioner/ControlPointV0001.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..764952534bafa34803e3b20b0abecc4e65ccea28
--- /dev/null
+++ b/isis/src/control/objs/ControlNetVersioner/ControlPointV0001.cpp
@@ -0,0 +1,783 @@
+#include "ControlPointV0001.h"
+
+#include <QString>
+
+#include "ControlMeasureLogData.h"
+#include "Distance.h"
+#include "IException.h"
+#include "Latitude.h"
+#include "Longitude.h"
+#include "NaifStatus.h"
+#include "Pvl.h"
+#include "PvlContainer.h"
+#include "SpecialPixel.h"
+#include "SurfacePoint.h"
+#include "Target.h"
+
+using namespace std;
+
+namespace Isis {
+
+  /**
+   * Create a ControlPointV0001 object from a protobuf version 1 control point message.
+   *
+   * @param pointData The protobuf message from a control net file.
+   * @param logData The accompanying protobuf control measure log data for the point.
+   */
+  ControlPointV0001::ControlPointV0001(
+          QSharedPointer<ControlNetFileProtoV0001_PBControlPoint> pointData,
+          QSharedPointer<ControlNetLogDataProtoV0001_Point> logData)
+      : m_pointData(pointData), m_logData(logData) {
+
+   }
+
+
+  /**
+   * Create a ControlPointV0001 object from a version 1 control point Pvl object
+   *
+   * @param pointObject The control point and its measures in a Pvl object
+   * @param targetName The name of the target used to get the body radii when converting from
+   *                   lat/lon to x/y/z.
+   */
+  ControlPointV0001::ControlPointV0001(PvlObject &pointObject, const QString targetName)
+      : m_pointData(new ControlNetFileProtoV0001_PBControlPoint),
+        m_logData(new ControlNetLogDataProtoV0001_Point) {
+    // Clean up the Pvl control point
+    // Anything that doesn't have a value is removed
+    for (int cpKeyIndex = 0; cpKeyIndex < pointObject.keywords(); cpKeyIndex ++) {
+      if (pointObject[cpKeyIndex][0] == "") {
+        pointObject.deleteKeyword(cpKeyIndex);
+      }
+    }
+
+    // Copy over POD values
+    copy(pointObject, "PointId",
+         m_pointData, &ControlNetFileProtoV0001_PBControlPoint::set_id);
+    copy(pointObject, "ChooserName",
+         m_pointData, &ControlNetFileProtoV0001_PBControlPoint::set_choosername);
+    copy(pointObject, "DateTime",
+         m_pointData, &ControlNetFileProtoV0001_PBControlPoint::set_datetime);
+    copy(pointObject, "AprioriXYZSourceFile",
+         m_pointData, &ControlNetFileProtoV0001_PBControlPoint::set_apriorisurfpointsourcefile);
+    copy(pointObject, "AprioriLatLonSourceFile",
+         m_pointData, &ControlNetFileProtoV0001_PBControlPoint::set_apriorisurfpointsourcefile);
+    copy(pointObject, "AprioriRadiusSourceFile",
+         m_pointData, &ControlNetFileProtoV0001_PBControlPoint::set_aprioriradiussourcefile);
+    copy(pointObject, "JigsawRejected",
+         m_pointData, &ControlNetFileProtoV0001_PBControlPoint::set_jigsawrejected);
+    copy(pointObject, "EditLock",
+         m_pointData, &ControlNetFileProtoV0001_PBControlPoint::set_editlock);
+    copy(pointObject, "Ignore",
+         m_pointData, &ControlNetFileProtoV0001_PBControlPoint::set_ignore);
+    copy(pointObject, "LatitudeConstrained",
+         m_pointData, &ControlNetFileProtoV0001_PBControlPoint::set_latitudeconstrained);
+    copy(pointObject, "LongitudeConstrained",
+         m_pointData, &ControlNetFileProtoV0001_PBControlPoint::set_longitudeconstrained);
+    copy(pointObject, "RadiusConstrained",
+         m_pointData, &ControlNetFileProtoV0001_PBControlPoint::set_radiusconstrained);
+    // Copy over the adjusted surface point
+    if ( pointObject.hasKeyword("Latitude")
+         && pointObject.hasKeyword("Longitude")
+         && pointObject.hasKeyword("Radius") ) {
+      SurfacePoint adjustedPoint(
+          Latitude(toDouble(pointObject["Latitude"][0]), Angle::Degrees),
+          Longitude(toDouble(pointObject["Longitude"][0]), Angle::Degrees),
+          Distance(toDouble(pointObject["Radius"][0]), Distance::Meters));
+
+      m_pointData->set_adjustedx( adjustedPoint.GetX().meters() );
+      m_pointData->set_adjustedy( adjustedPoint.GetY().meters() );
+      m_pointData->set_adjustedz( adjustedPoint.GetZ().meters() );
+    }
+    else if ( pointObject.hasKeyword("X")
+              && pointObject.hasKeyword("Y")
+              && pointObject.hasKeyword("Z") ) {
+      m_pointData->set_adjustedx( toDouble(pointObject["X"][0]) );
+      m_pointData->set_adjustedy( toDouble(pointObject["Y"][0]) );
+      m_pointData->set_adjustedz( toDouble(pointObject["Z"][0]) );
+    }
+
+    // copy over the apriori surface point
+    if ( pointObject.hasKeyword("AprioriLatitude")
+         && pointObject.hasKeyword("AprioriLongitude")
+         && pointObject.hasKeyword("AprioriRadius") ) {
+      SurfacePoint aprioriPoint(
+          Latitude(toDouble(pointObject["AprioriLatitude"][0]), Angle::Degrees),
+          Longitude(toDouble(pointObject["AprioriLongitude"][0]), Angle::Degrees),
+          Distance(toDouble(pointObject["AprioriRadius"][0]), Distance::Meters));
+
+      m_pointData->set_apriorix( aprioriPoint.GetX().meters() );
+      m_pointData->set_aprioriy( aprioriPoint.GetY().meters() );
+      m_pointData->set_aprioriz( aprioriPoint.GetZ().meters() );
+    }
+    else if ( pointObject.hasKeyword("AprioriX")
+              && pointObject.hasKeyword("AprioriY")
+              && pointObject.hasKeyword("AprioriZ") ) {
+      m_pointData->set_apriorix( toDouble(pointObject["AprioriX"][0]) );
+      m_pointData->set_aprioriy( toDouble(pointObject["AprioriY"][0]) );
+      m_pointData->set_aprioriz( toDouble(pointObject["AprioriZ"][0]) );
+    }
+    // If the apriori values are missing, copy them from the adjusted.
+    else if ( m_pointData->has_adjustedx()
+              && m_pointData->has_adjustedy()
+              && m_pointData->has_adjustedz() ) {
+      m_pointData->set_apriorix( m_pointData->adjustedx() );
+      m_pointData->set_aprioriy( m_pointData->adjustedy() );
+      m_pointData->set_aprioriz( m_pointData->adjustedz() );
+    }
+
+    // Ground points were previously flagged by the Held keyword being true.
+    if ( (pointObject.hasKeyword("Held") && pointObject["Held"][0] == "True")
+         || (pointObject["PointType"][0] == "Ground") ) {
+      m_pointData->set_type(ControlNetFileProtoV0001_PBControlPoint::Ground);
+    }
+    else if (pointObject["PointType"][0] == "Tie") {
+      m_pointData->set_type(ControlNetFileProtoV0001_PBControlPoint::Tie);
+    }
+    else {
+      QString msg = "Invalid ControlPoint type [" + pointObject["PointType"][0] + "].";
+      throw IException(IException::User, msg, _FILEINFO_);
+    }
+
+ if (pointObject.hasKeyword("AprioriXYZSource")) {
+      QString source = pointObject["AprioriXYZSource"][0];
+
+      if (source == "None") {
+        m_pointData->set_apriorisurfpointsource(ControlNetFileProtoV0001_PBControlPoint::None);
+      }
+      else if (source == "User") {
+        m_pointData->set_apriorisurfpointsource(ControlNetFileProtoV0001_PBControlPoint::User);
+      }
+      else if (source == "AverageOfMeasures") {
+        m_pointData->set_apriorisurfpointsource(
+                           ControlNetFileProtoV0001_PBControlPoint::AverageOfMeasures);
+      }
+      else if (source == "Reference") {
+        m_pointData->set_apriorisurfpointsource(
+                           ControlNetFileProtoV0001_PBControlPoint::Reference);
+      }
+      else if (source == "Basemap") {
+        m_pointData->set_apriorisurfpointsource(ControlNetFileProtoV0001_PBControlPoint::Basemap);
+      }
+      else if (source == "BundleSolution") {
+        m_pointData->set_apriorisurfpointsource(
+                         ControlNetFileProtoV0001_PBControlPoint::BundleSolution);
+      }
+      else {
+        QString msg = "Invalid AprioriXYZSource [" + source + "]";
+        throw IException(IException::User, msg, _FILEINFO_);
+      }
+    }
+
+    if (pointObject.hasKeyword("AprioriLatLonSource")) {
+      QString source = pointObject["AprioriLatLonSource"][0];
+
+      if (source == "None") {
+        m_pointData->set_apriorisurfpointsource(ControlNetFileProtoV0001_PBControlPoint::None);
+      }
+      else if (source == "User") {
+        m_pointData->set_apriorisurfpointsource(ControlNetFileProtoV0001_PBControlPoint::User);
+      }
+      else if (source == "AverageOfMeasures") {
+        m_pointData->set_apriorisurfpointsource(
+                         ControlNetFileProtoV0001_PBControlPoint::AverageOfMeasures);
+      }
+      else if (source == "Reference") {
+        m_pointData->set_apriorisurfpointsource(
+                           ControlNetFileProtoV0001_PBControlPoint::Reference);
+      }
+      else if (source == "Basemap") {
+        m_pointData->set_apriorisurfpointsource(ControlNetFileProtoV0001_PBControlPoint::Basemap);
+      }
+      else if (source == "BundleSolution") {
+        m_pointData->set_apriorisurfpointsource(
+                           ControlNetFileProtoV0001_PBControlPoint::BundleSolution);
+      }
+      else {
+        QString msg = "Invalid AprioriLatLonSource [" + source + "]";
+        throw IException(IException::User, msg, _FILEINFO_);
+      }
+    }
+
+    if (pointObject.hasKeyword("AprioriRadiusSource")) {
+      QString source = pointObject["AprioriRadiusSource"][0];
+
+      if (source == "None") {
+        m_pointData->set_aprioriradiussource(ControlNetFileProtoV0001_PBControlPoint::None);
+      }
+      else if (source == "User") {
+        m_pointData->set_aprioriradiussource(ControlNetFileProtoV0001_PBControlPoint::User);
+      }
+      else if (source == "AverageOfMeasures") {
+        m_pointData->set_aprioriradiussource(
+                           ControlNetFileProtoV0001_PBControlPoint::AverageOfMeasures);
+      }
+      else if (source == "Ellipsoid") {
+        m_pointData->set_aprioriradiussource(ControlNetFileProtoV0001_PBControlPoint::Ellipsoid);
+      }
+      else if (source == "DEM") {
+        m_pointData->set_aprioriradiussource(ControlNetFileProtoV0001_PBControlPoint::DEM);
+      }
+      else if (source == "BundleSolution") {
+        m_pointData->set_aprioriradiussource(
+                           ControlNetFileProtoV0001_PBControlPoint::BundleSolution);
+      }
+      else {
+        QString msg = "Invalid AprioriRadiusSource, [" + source + "]";
+        throw IException(IException::User, msg, _FILEINFO_);
+      }
+    }
+
+    // Copy the covariance matrices
+    // Sometimes they are not stored in version 1 Pvls so we compute them from a combination
+    // of the surface point sigmas and the target radii.
+
+    // We have to do this because Target::radiiGroup calls NAIF routines,
+    // but doesn't check for errors.
+    NaifStatus::CheckErrors();
+    PvlGroup radii;
+    try {
+     radii = Target::radiiGroup(targetName);
+    }
+    catch (IException &e) {
+     try {
+       NaifStatus::CheckErrors();
+     }
+     catch (IException &) {
+       // pass to the outer catch
+     }
+     QString msg = "Unable to get target body radii for [" + targetName
+                   + "] when calculating covariance matrix.";
+     throw IException(e, IException::Io, msg, _FILEINFO_);
+    }
+    Distance equatorialRadius(radii["EquatorialRadius"], Distance::Meters);
+    Distance polarRadius(radii["PolarRadius"], Distance::Meters);
+
+    // Add the Apriori Covariance Matrix
+    if ( pointObject.hasKeyword("AprioriCovarianceMatrix") ) {
+      PvlKeyword &matrix = pointObject["AprioriCovarianceMatrix"];
+
+      m_pointData->add_aprioricovar(toDouble(matrix[0]));
+      m_pointData->add_aprioricovar(toDouble(matrix[1]));
+      m_pointData->add_aprioricovar(toDouble(matrix[2]));
+      m_pointData->add_aprioricovar(toDouble(matrix[3]));
+      m_pointData->add_aprioricovar(toDouble(matrix[4]));
+      m_pointData->add_aprioricovar(toDouble(matrix[5]));
+
+      m_pointData->set_latitudeconstrained(true);
+      m_pointData->set_longitudeconstrained(true);
+      m_pointData->set_radiusconstrained(true);
+    }
+    else if ( pointObject.hasKeyword("AprioriSigmaLatitude")
+              || pointObject.hasKeyword("AprioriSigmaLongitude")
+              || pointObject.hasKeyword("AprioriSigmaRadius") ) {
+      // There may be missing or negative apriori sigmas so default to 10,000
+      double sigmaLat = 10000.0;
+      double sigmaLon = 10000.0;
+      double sigmaRad = 10000.0;
+
+      if ( pointObject.hasKeyword("AprioriSigmaLatitude") ) {
+        if (toDouble(pointObject["AprioriSigmaLatitude"][0]) > 0
+            && toDouble(pointObject["AprioriSigmaLatitude"][0]) < sigmaLat) {
+          sigmaLat = toDouble(pointObject["AprioriSigmaLatitude"][0]);
+        }
+        m_pointData->set_latitudeconstrained(true);
+      }
+
+      if ( pointObject.hasKeyword("AprioriSigmaLongitude") ) {
+        if (toDouble(pointObject["AprioriSigmaLongitude"][0]) > 0
+            && toDouble(pointObject["AprioriSigmaLongitude"][0]) < sigmaLon) {
+          sigmaLon = toDouble(pointObject["AprioriSigmaLongitude"][0]);
+        }
+        m_pointData->set_longitudeconstrained(true);
+      }
+
+      if ( pointObject.hasKeyword("AprioriSigmaRadius") ) {
+        if (toDouble(pointObject["AprioriSigmaRadius"][0]) > 0
+            && toDouble(pointObject["AprioriSigmaRadius"][0]) < sigmaRad) {
+          sigmaRad = toDouble(pointObject["AprioriSigmaRadius"][0]);
+        }
+        m_pointData->set_radiusconstrained(true);
+      }
+
+      SurfacePoint aprioriPoint;
+      aprioriPoint.SetRadii(equatorialRadius, equatorialRadius, polarRadius);
+      aprioriPoint.SetRectangular( Displacement(m_pointData->apriorix(), Displacement::Meters),
+                                   Displacement(m_pointData->aprioriy(), Displacement::Meters),
+                                   Displacement(m_pointData->aprioriz(), Displacement::Meters) );
+      aprioriPoint.SetSphericalSigmasDistance( Distance(sigmaLat, Distance::Meters),
+                                               Distance(sigmaLon, Distance::Meters),
+                                               Distance(sigmaRad, Distance::Meters) );
+      m_pointData->add_aprioricovar( aprioriPoint.GetRectangularMatrix()(0, 0) );
+      m_pointData->add_aprioricovar( aprioriPoint.GetRectangularMatrix()(0, 1) );
+      m_pointData->add_aprioricovar( aprioriPoint.GetRectangularMatrix()(0, 2) );
+      m_pointData->add_aprioricovar( aprioriPoint.GetRectangularMatrix()(1, 1) );
+      m_pointData->add_aprioricovar( aprioriPoint.GetRectangularMatrix()(1, 2) );
+      m_pointData->add_aprioricovar( aprioriPoint.GetRectangularMatrix()(2, 2) );
+    }
+
+    // Add the Adjusted (Apost) Covariance Matrix
+    if ( pointObject.hasKeyword("ApostCovarianceMatrix") ) {
+      PvlKeyword &matrix = pointObject["ApostCovarianceMatrix"];
+
+      m_pointData->add_adjustedcovar(toDouble(matrix[0]));
+      m_pointData->add_adjustedcovar(toDouble(matrix[1]));
+      m_pointData->add_adjustedcovar(toDouble(matrix[2]));
+      m_pointData->add_adjustedcovar(toDouble(matrix[3]));
+      m_pointData->add_adjustedcovar(toDouble(matrix[4]));
+      m_pointData->add_adjustedcovar(toDouble(matrix[5]));
+
+      m_pointData->set_latitudeconstrained(true);
+      m_pointData->set_longitudeconstrained(true);
+      m_pointData->set_radiusconstrained(true);
+    }
+    else if ( pointObject.hasKeyword("AdjustedSigmaLatitude")
+          || pointObject.hasKeyword("AdjustedSigmaLongitude")
+          || pointObject.hasKeyword("AdjustedSigmaRadius") ) {
+      // There may be missing or negative adjusted sigmas so default to 10,000
+      double sigmaLat = 10000.0;
+      double sigmaLon = 10000.0;
+      double sigmaRad = 10000.0;
+
+      if ( pointObject.hasKeyword("AdjustedSigmaLatitude") ) {
+        if (toDouble(pointObject["AdjustedSigmaLatitude"][0]) > 0
+            && toDouble(pointObject["AdjustedSigmaLatitude"][0]) < sigmaLat) {
+          sigmaLat = toDouble(pointObject["AdjustedSigmaLatitude"][0]);
+        }
+      }
+
+      if ( pointObject.hasKeyword("AdjustedSigmaLongitude") ) {
+        if (toDouble(pointObject["AdjustedSigmaLongitude"][0]) > 0
+            && toDouble(pointObject["AdjustedSigmaLongitude"][0]) < sigmaLon) {
+          sigmaLon = toDouble(pointObject["AdjustedSigmaLongitude"][0]);
+        }
+      }
+
+      if ( pointObject.hasKeyword("AdjustedSigmaRadius") ) {
+        if (toDouble(pointObject["AdjustedSigmaRadius"][0]) > 0
+            && toDouble(pointObject["AdjustedSigmaRadius"][0]) < sigmaRad) {
+          sigmaRad = toDouble(pointObject["AdjustedSigmaRadius"][0]);
+        }
+      }
+
+      SurfacePoint adjustedPoint;
+      adjustedPoint.SetRadii(equatorialRadius, equatorialRadius, polarRadius);
+      adjustedPoint.SetRectangular( Displacement(m_pointData->adjustedx(), Displacement::Meters),
+                                    Displacement(m_pointData->adjustedy(), Displacement::Meters),
+                                    Displacement(m_pointData->adjustedz(), Displacement::Meters) );
+      adjustedPoint.SetSphericalSigmasDistance( Distance(sigmaLat, Distance::Meters),
+                                                Distance(sigmaLon, Distance::Meters),
+                                                Distance(sigmaRad, Distance::Meters) );
+      m_pointData->add_adjustedcovar( adjustedPoint.GetRectangularMatrix()(0, 0) );
+      m_pointData->add_adjustedcovar( adjustedPoint.GetRectangularMatrix()(0, 1) );
+      m_pointData->add_adjustedcovar( adjustedPoint.GetRectangularMatrix()(0, 2) );
+      m_pointData->add_adjustedcovar( adjustedPoint.GetRectangularMatrix()(1, 1) );
+      m_pointData->add_adjustedcovar( adjustedPoint.GetRectangularMatrix()(1, 2) );
+      m_pointData->add_adjustedcovar( adjustedPoint.GetRectangularMatrix()(2, 2) );
+    }
+
+    //  Process Measures
+    for (int groupIndex = 0; groupIndex < pointObject.groups(); groupIndex ++) {
+      PvlGroup &group = pointObject.group(groupIndex);
+      ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure measure;
+
+      // Copy strings, booleans, and doubles
+      copy(group, "SerialNumber",
+           measure, &ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::set_serialnumber);
+      copy(group, "ChooserName",
+           measure, &ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::set_choosername);
+      copy(group, "DateTime",
+           measure, &ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::set_datetime);
+      copy(group, "Diameter",
+           measure, &ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::set_diameter);
+      copy(group, "EditLock",
+           measure, &ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::set_editlock);
+      copy(group, "Ignore",
+           measure, &ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::set_ignore);
+      copy(group, "JigsawRejected",
+           measure, &ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::set_jigsawrejected);
+      copy(group, "AprioriSample",
+           measure, &ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::set_apriorisample);
+      copy(group, "AprioriLine",
+           measure, &ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::set_aprioriline);
+      copy(group, "SampleSigma",
+           measure, &ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::set_samplesigma);
+      copy(group, "LineSigma",
+           measure, &ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::set_linesigma);
+
+      // The sample, line, sample residual, and line residual are nested in another structure
+      // inside the measure, so they cannot be copied with the conenience methods.
+      if (group.hasKeyword("Sample")) {
+        // The sample may not be a numeric value
+        // in this case set it to 0 and ignore the measure
+        double value;
+        try {
+          value = toDouble(group["Sample"][0]);
+        }
+        catch (...) {
+          value = 0;
+          measure.set_ignore(true);
+        }
+        measure.mutable_measurement()->set_sample(value);
+        group.deleteKeyword("Sample");
+      }
+      if (group.hasKeyword("Line")) {
+        // The line may not be a numeric value
+        // in this case set it to 0 and ignore the measure
+        double value;
+        try {
+          value = toDouble(group["Line"][0]);
+        }
+        catch (...) {
+          value = 0;
+          measure.set_ignore(true);
+        }
+        measure.mutable_measurement()->set_line(value);
+        group.deleteKeyword("Line");
+      }
+
+      // Some old networks use ErrorSample and ErrorLine,
+      // others use SampleResidual and LineResidual so check for both
+      if (group.hasKeyword("ErrorSample")) {
+        double value = toDouble(group["ErrorSample"][0]);
+        measure.mutable_measurement()->set_sampleresidual(value);
+        group.deleteKeyword("ErrorSample");
+      }
+      if (group.hasKeyword("ErrorLine")) {
+        double value = toDouble(group["ErrorLine"][0]);
+        measure.mutable_measurement()->set_lineresidual(value);
+        group.deleteKeyword("ErrorLine");
+      }
+
+      if (group.hasKeyword("SampleResidual")) {
+        double value = toDouble(group["SampleResidual"][0]);
+        measure.mutable_measurement()->set_sampleresidual(value);
+        group.deleteKeyword("SampleResidual");
+      }
+
+      if (group.hasKeyword("LineResidual")) {
+        double value = toDouble(group["LineResidual"][0]);
+        measure.mutable_measurement()->set_lineresidual(value);
+        group.deleteKeyword("LineResidual");
+      }
+
+      if (group.hasKeyword("Reference")) {
+        if (group["Reference"][0].toLower() == "true") {
+          m_pointData->set_referenceindex(groupIndex);
+        }
+        group.deleteKeyword("Reference");
+      }
+
+      // Copy the measure type
+      if (group.hasKeyword("MeasureType")) {
+        QString type = group["MeasureType"][0].toLower();
+        if (type == "estimated"
+            || type == "unmeasured"
+            || type == "candidate") {
+          measure.set_type(ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::Candidate);
+        }
+        else if (type == "manual") {
+          measure.set_type(ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::Manual);
+        }
+        else if (type == "automatic"
+                 || type == "validatedmanual"
+                 || type == "automaticpixel") {
+          measure.set_type(ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::RegisteredPixel);
+        }
+        else if (type == "validatedautomatic"
+                 || type == "automaticsubpixel") {
+          measure.set_type(ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::RegisteredSubPixel);
+        }
+        else {
+          throw IException(IException::Io,
+                           "Unknown measure type [" + type + "]",
+                           _FILEINFO_);
+        }
+        group.deleteKeyword("MeasureType");
+      }
+
+      // Clean up the remaining keywords
+      for (int cmKeyIndex = 0; cmKeyIndex < group.keywords(); cmKeyIndex++) {
+        if (group[cmKeyIndex][0] == ""
+            || group[cmKeyIndex].name() == "ZScore"
+            || group[cmKeyIndex].name() == "ErrorMagnitude") {
+          group.deleteKeyword(cmKeyIndex);
+          cmKeyIndex--;
+        }
+      }
+
+      // Create the log data for the measure
+      ControlNetLogDataProtoV0001_Point_Measure measureLogData;
+
+      for (int keyIndex = 0; keyIndex < group.keywords(); keyIndex++) {
+        PvlKeyword dataKeyword = group[keyIndex];
+        QString name = dataKeyword.name();
+        int dataType = 0;
+        double value = 0.0;
+
+        if (name == "Obsolete_Eccentricity") {
+          dataType = 1;
+        }
+        else if (name == "GoodnessOfFit") {
+          dataType = 2;
+        }
+        else if (name ==  "MinimumPixelZScore") {
+          dataType = 3;
+        }
+        else if (name ==  "MaximumPixelZScore") {
+          dataType = 4;
+        }
+        else if (name == "PixelShift") {
+          dataType = 5;
+        }
+        else if (name == "WholePixelCorrelation") {
+          dataType = 6;
+        }
+        else if (name == "SubPixelCorrelation") {
+          dataType = 7;
+        }
+        else if (name == "Obsolete_AverageResidual") {
+          dataType = 8;
+        }
+        else {
+          QString msg = "Invalid control measure log data name [" + name + "]";
+          throw IException(IException::Programmer, msg, _FILEINFO_);
+        }
+
+        try {
+          value = toDouble(dataKeyword[0]);
+        }
+        catch (IException e) {
+          QString msg = "Invalid control measure log data value [" + dataKeyword[0] + "]";
+          throw IException(e, IException::Io, msg, _FILEINFO_);
+        }
+
+        ControlNetLogDataProtoV0001_Point_Measure_DataEntry logEntry;
+        logEntry.set_datatype(dataType);
+        logEntry.set_datavalue(value);
+        *measureLogData.add_loggedmeasuredata() = logEntry;
+      }
+
+      // Store the measure and its log data
+      *m_pointData->add_measures() = measure;
+      *m_logData->add_measures() = measureLogData;
+    }
+
+    if (!m_pointData->IsInitialized()) {
+      QString msg = "There is missing required information in the control "
+                    "points or measures";
+      throw IException(IException::Io, msg, _FILEINFO_);
+    }
+
+  }
+
+
+  /**
+   * Access the protobuf control point data.
+   *
+   * @return @b QSharedPointer<ControlNetFileProtoV0001_PBControlPoint> A pointer to the internal
+   *                                                                    control point data.
+   */
+  QSharedPointer<ControlNetFileProtoV0001_PBControlPoint> ControlPointV0001::pointData() {
+    return m_pointData;
+  }
+
+
+  /**
+   * Access the protobuf log data for the control measures in the point.
+   *
+   * @return @b QSharedPointer<ControlNetLogDataProtoV0001_Point> A pointer to the internal
+   *                                                              measure log data.
+   */
+  QSharedPointer<ControlNetLogDataProtoV0001_Point> ControlPointV0001::logData() {
+    return m_logData;
+  }
+
+
+  /**
+   * This convenience method takes a boolean value from a PvlKeyword and copies it into a version 1
+   * protobuf field. Once copied, the PvlKeyword is deleted.
+   *
+   * If the keyword doesn't exist, this does nothing.
+   *
+   * @param container The PvlContainer representation of the control point that contains the
+   *                  PvlKeyword.
+   * @param keyName The name of the keyword to be copied.
+   * @param[out] point The version 1 protobuf representation of the control point that the value
+   *                   will be copied into.
+   * @param setter The protobuf mutator method that sets the value of the field in the protobuf
+   *               representation.
+   */
+  void ControlPointV0001::copy(PvlContainer &container,
+                               QString keyName,
+                               QSharedPointer<ControlNetFileProtoV0001_PBControlPoint> point,
+                               void (ControlNetFileProtoV0001_PBControlPoint::*setter)(bool)) {
+
+    if (!container.hasKeyword(keyName)) {
+      return;
+    }
+
+    QString value = container[keyName][0];
+    container.deleteKeyword(keyName);
+    value = value.toLower();
+
+    if (value == "true" || value == "yes") {
+      (point.data()->*setter)(true);
+    }
+  }
+
+
+  /**
+   * This convenience method takes a double value from a PvlKeyword and copies it into a version 1
+   * protobuf field. Once copied, the PvlKeyword is deleted.
+   *
+   * If the keyword doesn't exist, this does nothing.
+   *
+   * @param container The PvlContainer representation of the control point that contains the
+   *                  PvlKeyword.
+   * @param keyName The name of the keyword to be copied.
+   * @param[out] point The version 1 protobuf representation of the control point that the value
+   *                   will be copied into.
+   * @param setter The protobuf mutator method that sets the value of the field in the protobuf
+   *               representation.
+   */
+  void ControlPointV0001::copy(PvlContainer &container,
+                               QString keyName,
+                               QSharedPointer<ControlNetFileProtoV0001_PBControlPoint> point,
+                               void (ControlNetFileProtoV0001_PBControlPoint::*setter)(double)) {
+
+    if (!container.hasKeyword(keyName)) {
+      return;
+    }
+
+    double value = toDouble(container[keyName][0]);
+    container.deleteKeyword(keyName);
+    (point.data()->*setter)(value);
+  }
+
+
+  /**
+   * This convenience method takes a string value from a PvlKeyword and copies it into a version 1
+   * protobuf field. Once copied, the PvlKeyword is deleted.
+   *
+   * If the keyword doesn't exist, this does nothing.
+   *
+   * @param container The PvlContainer representation of the control point that contains the
+   *                  PvlKeyword.
+   * @param keyName The name of the keyword to be copied.
+   * @param[out] point The version 1 protobuf representation of the control point that the value
+   *                   will be copied into.
+   * @param setter The protobuf mutator method that sets the value of the field in the protobuf
+   *               representation.
+   */
+  void ControlPointV0001::copy(PvlContainer &container,
+                               QString keyName,
+                               QSharedPointer<ControlNetFileProtoV0001_PBControlPoint> point,
+                               void (ControlNetFileProtoV0001_PBControlPoint::*setter)(const std::string&)) {
+
+    if (!container.hasKeyword(keyName)) {
+      return;
+    }
+
+    QString value = container[keyName][0];
+    container.deleteKeyword(keyName);
+    (point.data()->*setter)(value.toLatin1().data());
+  }
+
+
+  /**
+   * This convenience method takes a boolean value from a PvlKeyword and copies it into a version 1
+   * protobuf field. Once copied, the PvlKeyword is deleted.
+   *
+   * If the keyword doesn't exist, this does nothing.
+   *
+   * @param container The PvlContainer representation of the control measure that contains the
+   *                  PvlKeyword.
+   * @param keyName The name of the keyword to be copied.
+   * @param[out] measure The version 1 protobuf representation of the control measure that the
+   *                     value will be copied into.
+   * @param setter The protobuf mutator method that sets the value of the field in the protobuf
+   *               representation.
+   */
+  void ControlPointV0001::copy(PvlContainer &container,
+                               QString keyName,
+                               ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure &measure,
+                               void (ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::*setter)(bool)) {
+
+    if (!container.hasKeyword(keyName)) {
+      return;
+    }
+
+    QString value = container[keyName][0];
+    container.deleteKeyword(keyName);
+    value = value.toLower();
+
+    if (value == "true" || value == "yes") {
+      (measure.*setter)(true);
+    }
+  }
+
+
+  /**
+   * This convenience method takes a double value from a PvlKeyword and copies it into a version 1
+   * protobuf field. Once copied, the PvlKeyword is deleted.
+   *
+   * If the keyword doesn't exist, this does nothing.
+   *
+   * @param container The PvlContainer representation of the control measure that contains the
+   *                  PvlKeyword.
+   * @param keyName The name of the keyword to be copied.
+   * @param[out] measure The version 1 protobuf representation of the control measure that the
+   *                     value will be copied into.
+   * @param setter The protobuf mutator method that sets the value of the field in the protobuf
+   *               representation.
+   */
+  void ControlPointV0001::copy(PvlContainer &container,
+                               QString keyName,
+                               ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure &measure,
+                               void (ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::*setter)(double)) {
+
+    if (!container.hasKeyword(keyName)) {
+      return;
+    }
+
+    double value = Isis::Null;
+    if ( container.hasKeyword(keyName) ) {
+      value = toDouble(container[keyName][0]);
+      container.deleteKeyword(keyName);
+
+    }
+
+    (measure.*setter)(value);
+  }
+
+
+  /**
+   * This convenience method takes a string value from a PvlKeyword and copies it into a version 1
+   * protobuf field. Once copied, the PvlKeyword is deleted.
+   *
+   * If the keyword doesn't exist, this does nothing.
+   *
+   * @param container The PvlContainer representation of the control measure that contains the
+   *                  PvlKeyword.
+   * @param keyName The name of the keyword to be copied.
+   * @param[out] measure The version 1 protobuf representation of the control measure that the
+   *                     value will be into.
+   * @param setter The protobuf mutator method that sets the value of the field in the protobuf
+   *               representation.
+   */
+  void ControlPointV0001::copy(PvlContainer &container,
+                               QString keyName,
+                               ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure &measure,
+                               void (ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::*setter)
+                                      (const std::string &)) {
+
+    if (!container.hasKeyword(keyName)) {
+      return;
+    }
+
+
+    QString value = container[keyName][0];
+    container.deleteKeyword(keyName);
+    (measure.*setter)(value.toLatin1().data());
+  }
+}
diff --git a/isis/src/control/objs/ControlNetVersioner/ControlPointV0001.h b/isis/src/control/objs/ControlNetVersioner/ControlPointV0001.h
new file mode 100644
index 0000000000000000000000000000000000000000..0fe4e6e89683c364be1a73e1be617ccfa930e629
--- /dev/null
+++ b/isis/src/control/objs/ControlNetVersioner/ControlPointV0001.h
@@ -0,0 +1,132 @@
+#ifndef ControlPointV0001_h
+#define ControlPointV0001_h
+/**
+ * @file
+ * $Revision: 1.9 $
+ * $Date: 2009/07/15 17:33:52 $
+ *
+ *   Unless noted otherwise, the portions of Isis written by the USGS are
+ *   public domain. See individual third-party library and package descriptions
+ *   for intellectual property information, user agreements, and related
+ *   information.
+ *
+ *   Although Isis has been used by the USGS, no warranty, expressed or
+ *   implied, is made by the USGS as to the accuracy and functioning of such
+ *   software and related material nor shall the fact of distribution
+ *   constitute any such warranty, and no responsibility is assumed by the
+ *   USGS in connection therewith.
+ *
+ *   For additional information, launch
+ *   $ISISROOT/doc//documents/Disclaimers/Disclaimers.html
+ *   in a browser or see the Privacy &amp; Disclaimers page on the Isis website,
+ *   http://isis.astrogeology.usgs.gov, and the USGS privacy and disclaimers on
+ *   http://www.usgs.gov/privacy.html.
+ */
+
+ #include <QSharedPointer>
+
+ #include "ControlNetFileProtoV0001.pb.h"
+ #include "ControlNetLogDataProtoV0001.pb.h"
+
+namespace Isis {
+  class PvlObject;
+  class PvlContainer;
+
+  /**
+   * @brief A container for the information stored in a version 1 ControlPoint.
+   *
+   * A wrapper around the version 1 protobuf serialization of a ControlPoint. It allows for reading
+   * ControlPoints serialized as both PvlObjects and protobuf messages.
+   *
+   * This class is designed to be compatible with all Pvl formats created prior
+   * to the use of versioning. So, the PvlObject constructor has to work with
+   * several different formats. Hence, several different keywords are checked
+   * for the same value.
+   *
+   * Because this version supports several different formats, there is no
+   * standardized set of keywords, but all version 1 Pvl control networks
+   * have the same high level structure. Control points are represented by
+   * objects contained in the ControlNetwork object. Control measures are
+   * represented by groups contained in the control point objects.
+   *
+   * Once read in, the data is always stored in a protobuf message regardless
+   * of the source. This is done to optimize reading binary control network
+   * files. Because the protobuf format for version 1 control points is
+   * identical to the version 2 format, control points read from a version 1
+   * file are automatically "converted" to version 2. This also makes the
+   * version 1 to 2 upgrade process as simple as passing a pointer.
+   *
+   * @ingroup ControlNetwork
+   *
+   * @author 2017-12-18 Jesse Mapel
+   *
+   * @internal
+   *   @history 2017-12-18 Jesse Mapel - Original version.
+   *   @history 2017-12-21 Adam Goins - Changed Pvl constructor to take PvlObject.
+   *   @history 2017-12-21 Jesse Mapel - Improved documentation.
+   *   @history 2017-01-27 Jesse Mapel - More documentation improvements.
+   */
+  class ControlPointV0001 {
+    public:
+      ControlPointV0001(PvlObject &pointObject, const QString targetName);
+      ControlPointV0001(QSharedPointer<ControlNetFileProtoV0001_PBControlPoint> pointData,
+                        QSharedPointer<ControlNetLogDataProtoV0001_Point> logData);
+
+      QSharedPointer<ControlNetFileProtoV0001_PBControlPoint> pointData();
+      QSharedPointer<ControlNetLogDataProtoV0001_Point> logData();
+
+    private:
+      /**
+       * Default constructor. Intentionally un-implemented.
+       */
+      ControlPointV0001();
+      /**
+       * Copy constructor. Intentionally un-implemented.
+       *
+       * @param other The other ControlPointV0001 to copy from.
+       */
+      ControlPointV0001(const ControlPointV0001 &other);
+      /**
+       * Assignment operator. Intentionally un-implemented.
+       *
+       * @param other The other ControlPointV0001 to assign from.
+       *
+       * @return @b ControlPointV0001& A reference to this after assignment.
+       */
+      ControlPointV0001 &operator=(const ControlPointV0001 &other);
+
+      // methods for converting from Pvl to protobuf
+      void copy(PvlContainer &container,
+                QString keyName,
+                QSharedPointer<ControlNetFileProtoV0001_PBControlPoint> point,
+                void (ControlNetFileProtoV0001_PBControlPoint::*setter)(bool));
+      void copy(PvlContainer &container,
+                QString keyName,
+                QSharedPointer<ControlNetFileProtoV0001_PBControlPoint> point,
+                void (ControlNetFileProtoV0001_PBControlPoint::*setter)(double));
+      void copy(PvlContainer &container,
+                QString keyName,
+                QSharedPointer<ControlNetFileProtoV0001_PBControlPoint> point,
+                void (ControlNetFileProtoV0001_PBControlPoint::*setter)(const std::string&));
+      void copy(PvlContainer &container,
+                QString keyName,
+                ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure &measure,
+                void (ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::*setter)(bool));
+      void copy(PvlContainer &container,
+                QString keyName,
+                ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure &measure,
+                void (ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::*setter)(double));
+      void copy(PvlContainer &container,
+                QString keyName,
+                ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure &measure,
+                void (ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::*setter)(
+                            const std::string &));
+
+      QSharedPointer<ControlNetFileProtoV0001_PBControlPoint> m_pointData;
+      /**< Protobuf container that holds information used to create a control point.*/
+      QSharedPointer<ControlNetLogDataProtoV0001_Point> m_logData;
+      /**< Protobuf container that holds log data for the control measures in the point.*/
+  };
+}
+
+#endif
diff --git a/isis/src/control/objs/ControlNetVersioner/ControlPointV0002.cpp b/isis/src/control/objs/ControlNetVersioner/ControlPointV0002.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..7ad11df692d70039ac4c57812ab1799d76e7dc4b
--- /dev/null
+++ b/isis/src/control/objs/ControlNetVersioner/ControlPointV0002.cpp
@@ -0,0 +1,540 @@
+#include "ControlPointV0002.h"
+
+#include <QString>
+
+#include "ControlPointV0001.h"
+#include "IException.h"
+#include "Pvl.h"
+#include "PvlContainer.h"
+
+using namespace std;
+
+namespace Isis {
+
+  /**
+   * Create a ControlPointV0002 object from a protobuf version 1 control point message.
+   *
+   * @param pointData The protobuf message from a control net file.
+   * @param logData The accompanying protobuf control measure log data for the point.
+   */
+  ControlPointV0002::ControlPointV0002(
+          QSharedPointer<ControlNetFileProtoV0001_PBControlPoint> pointData,
+          QSharedPointer<ControlNetLogDataProtoV0001_Point> logData)
+      : m_pointData(pointData), m_logData(logData) {
+
+  }
+
+
+  /**
+   * Create a ControlPointV0002 object from a version 2 control point Pvl object.
+   *
+   * @param pointObject The control point and its measures in a Pvl object.
+   */
+  ControlPointV0002::ControlPointV0002(PvlObject &pointObject)
+      : m_pointData(new ControlNetFileProtoV0001_PBControlPoint),
+        m_logData(new ControlNetLogDataProtoV0001_Point) {
+
+    // Copy over strings, doubles, and bools
+    copy(pointObject, "PointId",
+         m_pointData, &ControlNetFileProtoV0001_PBControlPoint::set_id);
+    copy(pointObject, "ChooserName",
+         m_pointData, &ControlNetFileProtoV0001_PBControlPoint::set_choosername);
+    copy(pointObject, "DateTime",
+         m_pointData, &ControlNetFileProtoV0001_PBControlPoint::set_datetime);
+    copy(pointObject, "AprioriXYZSourceFile",
+         m_pointData, &ControlNetFileProtoV0001_PBControlPoint::set_apriorisurfpointsourcefile);
+    copy(pointObject, "AprioriRadiusSourceFile",
+         m_pointData, &ControlNetFileProtoV0001_PBControlPoint::set_aprioriradiussourcefile);
+    copy(pointObject, "JigsawRejected",
+         m_pointData, &ControlNetFileProtoV0001_PBControlPoint::set_jigsawrejected);
+    copy(pointObject, "EditLock",
+         m_pointData, &ControlNetFileProtoV0001_PBControlPoint::set_editlock);
+    copy(pointObject, "Ignore",
+         m_pointData, &ControlNetFileProtoV0001_PBControlPoint::set_ignore);
+    copy(pointObject, "AprioriX",
+         m_pointData, &ControlNetFileProtoV0001_PBControlPoint::set_apriorix);
+    copy(pointObject, "AprioriY",
+         m_pointData, &ControlNetFileProtoV0001_PBControlPoint::set_aprioriy);
+    copy(pointObject, "AprioriZ",
+         m_pointData, &ControlNetFileProtoV0001_PBControlPoint::set_aprioriz);
+    copy(pointObject, "AdjustedX",
+         m_pointData, &ControlNetFileProtoV0001_PBControlPoint::set_adjustedx);
+    copy(pointObject, "AdjustedY",
+         m_pointData, &ControlNetFileProtoV0001_PBControlPoint::set_adjustedy);
+    copy(pointObject, "AdjustedZ",
+         m_pointData, &ControlNetFileProtoV0001_PBControlPoint::set_adjustedz);
+    copy(pointObject, "LatitudeConstrained",
+         m_pointData, &ControlNetFileProtoV0001_PBControlPoint::set_latitudeconstrained);
+    copy(pointObject, "LongitudeConstrained",
+         m_pointData, &ControlNetFileProtoV0001_PBControlPoint::set_longitudeconstrained);
+    copy(pointObject, "RadiusConstrained",
+         m_pointData, &ControlNetFileProtoV0001_PBControlPoint::set_radiusconstrained);
+
+    // Copy enumerated values
+
+    if (pointObject["PointType"][0] == "Ground") {
+      m_pointData->set_type(ControlNetFileProtoV0001_PBControlPoint::Ground);
+    }
+    else if (pointObject["PointType"][0] == "Tie") {
+      m_pointData->set_type(ControlNetFileProtoV0001_PBControlPoint::Tie);
+    }
+    else {
+      QString msg = "Invalid ControlPoint type [" + pointObject["PointType"][0] + "].";
+      throw IException(IException::User, msg, _FILEINFO_);
+    }
+
+    if (pointObject.hasKeyword("AprioriXYZSource")) {
+      QString source = pointObject["AprioriXYZSource"][0];
+
+      if (source == "None") {
+        m_pointData->set_apriorisurfpointsource(ControlNetFileProtoV0001_PBControlPoint::None);
+      }
+      else if (source == "User") {
+        m_pointData->set_apriorisurfpointsource(ControlNetFileProtoV0001_PBControlPoint::User);
+      }
+      else if (source == "AverageOfMeasures") {
+        m_pointData->set_apriorisurfpointsource(
+                           ControlNetFileProtoV0001_PBControlPoint::AverageOfMeasures);
+      }
+      else if (source == "Reference") {
+        m_pointData->set_apriorisurfpointsource(
+                           ControlNetFileProtoV0001_PBControlPoint::Reference);
+      }
+      else if (source == "Basemap") {
+        m_pointData->set_apriorisurfpointsource(ControlNetFileProtoV0001_PBControlPoint::Basemap);
+      }
+      else if (source == "BundleSolution") {
+        m_pointData->set_apriorisurfpointsource(
+                           ControlNetFileProtoV0001_PBControlPoint::BundleSolution);
+      }
+      else {
+        QString msg = "Invalid AprioriXYZSource [" + source + "]";
+        throw IException(IException::User, msg, _FILEINFO_);
+      }
+    }
+
+    if (pointObject.hasKeyword("AprioriRadiusSource")) {
+      QString source = pointObject["AprioriRadiusSource"][0];
+
+      if (source == "None") {
+        m_pointData->set_aprioriradiussource(ControlNetFileProtoV0001_PBControlPoint::None);
+      }
+      else if (source == "User") {
+        m_pointData->set_aprioriradiussource(ControlNetFileProtoV0001_PBControlPoint::User);
+      }
+      else if (source == "AverageOfMeasures") {
+        m_pointData->set_aprioriradiussource(
+                           ControlNetFileProtoV0001_PBControlPoint::AverageOfMeasures);
+      }
+      else if (source == "Ellipsoid") {
+        m_pointData->set_aprioriradiussource(ControlNetFileProtoV0001_PBControlPoint::Ellipsoid);
+      }
+      else if (source == "DEM") {
+        m_pointData->set_aprioriradiussource(ControlNetFileProtoV0001_PBControlPoint::DEM);
+      }
+      else if (source == "BundleSolution") {
+        m_pointData->set_aprioriradiussource(
+                           ControlNetFileProtoV0001_PBControlPoint::BundleSolution);
+      }
+      else {
+        QString msg = "Invalid AprioriRadiusSource, [" + source + "]";
+        throw IException(IException::User, msg, _FILEINFO_);
+      }
+    }
+
+    // Copy array values
+    if (pointObject.hasKeyword("AprioriCovarianceMatrix")) {
+      PvlKeyword &matrix = pointObject["AprioriCovarianceMatrix"];
+
+      m_pointData->add_aprioricovar(toDouble(matrix[0]));
+      m_pointData->add_aprioricovar(toDouble(matrix[1]));
+      m_pointData->add_aprioricovar(toDouble(matrix[2]));
+      m_pointData->add_aprioricovar(toDouble(matrix[3]));
+      m_pointData->add_aprioricovar(toDouble(matrix[4]));
+      m_pointData->add_aprioricovar(toDouble(matrix[5]));
+    }
+
+    if (pointObject.hasKeyword("AdjustedCovarianceMatrix")) {
+      PvlKeyword &matrix = pointObject["AdjustedCovarianceMatrix"];
+
+      m_pointData->add_adjustedcovar(toDouble(matrix[0]));
+      m_pointData->add_adjustedcovar(toDouble(matrix[1]));
+      m_pointData->add_adjustedcovar(toDouble(matrix[2]));
+      m_pointData->add_adjustedcovar(toDouble(matrix[3]));
+      m_pointData->add_adjustedcovar(toDouble(matrix[4]));
+      m_pointData->add_adjustedcovar(toDouble(matrix[5]));
+    }
+
+    //  Process Measures
+    for (int groupIndex = 0; groupIndex < pointObject.groups(); groupIndex ++) {
+      PvlGroup &group = pointObject.group(groupIndex);
+      ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure measure;
+
+      // Copy strings, booleans, and doubles
+      copy(group, "SerialNumber",
+           measure, &ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::set_serialnumber);
+      copy(group, "ChooserName",
+           measure, &ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::set_choosername);
+      copy(group, "DateTime",
+           measure, &ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::set_datetime);
+      copy(group, "Diameter",
+           measure, &ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::set_diameter);
+      copy(group, "EditLock",
+           measure, &ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::set_editlock);
+      copy(group, "Ignore",
+           measure, &ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::set_ignore);
+      copy(group, "JigsawRejected",
+           measure, &ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::set_jigsawrejected);
+      copy(group, "AprioriSample",
+           measure, &ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::set_apriorisample);
+      copy(group, "AprioriLine",
+           measure, &ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::set_aprioriline);
+      copy(group, "SampleSigma",
+           measure, &ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::set_samplesigma);
+      copy(group, "LineSigma",
+           measure, &ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::set_linesigma);
+
+      // The sample, line, sample residual, and line residual are nested in another structure
+      // inside the measure, so they cannot be copied with the conenience methods.
+      if (group.hasKeyword("Sample")) {
+        double value = toDouble(group["Sample"][0]);
+        measure.mutable_measurement()->set_sample(value);
+      }
+      if (group.hasKeyword("Line")) {
+        double value = toDouble(group["Line"][0]);
+        measure.mutable_measurement()->set_line(value);
+      }
+      if (group.hasKeyword("SampleResidual")) {
+        double value = toDouble(group["SampleResidual"][0]);
+        measure.mutable_measurement()->set_sampleresidual(value);
+      }
+      if (group.hasKeyword("LineResidual")) {
+        double value = toDouble(group["LineResidual"][0]);
+        measure.mutable_measurement()->set_lineresidual(value);
+      }
+
+
+      if (group.hasKeyword("Reference")) {
+        if (group["Reference"][0].toLower() == "true") {
+          m_pointData->set_referenceindex(groupIndex);
+        }
+        group.deleteKeyword("Reference");
+      }
+
+      QString type = group["MeasureType"][0].toLower();
+      if (type == "candidate") {
+        measure.set_type(ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::Candidate);
+      }
+      else if (type == "manual") {
+        measure.set_type(ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::Manual);
+      }
+      else if (type == "registeredpixel") {
+        measure.set_type(
+              ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::RegisteredPixel);
+      }
+      else if (type == "registeredsubpixel") {
+        measure.set_type(
+              ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::RegisteredSubPixel);
+      }
+      else {
+        throw IException(IException::Io,
+                         "Unknown measure type [" + type + "]",
+                         _FILEINFO_);
+      }
+      group.deleteKeyword("MeasureType");
+
+      // Clean up the remaining keywords
+      // This also removes obsolete log data entries
+      for (int cmKeyIndex = 0; cmKeyIndex < group.keywords(); cmKeyIndex ++) {
+        if (group[cmKeyIndex][0] == ""
+            || group[cmKeyIndex].name() == "ZScore"
+            || group[cmKeyIndex].name() == "ErrorMagnitude") {
+          group.deleteKeyword(cmKeyIndex);
+        }
+      }
+
+      // Create the log data for the measure
+      ControlNetLogDataProtoV0001_Point_Measure measureLogData;
+
+      for (int keyIndex = 0; keyIndex < group.keywords(); keyIndex++) {
+        PvlKeyword dataKeyword = group[keyIndex];
+        QString name = dataKeyword.name();
+        int dataType = 0;
+        double value = 0.0;
+
+        if (name == "Obsolete_Eccentricity") {
+          dataType = 1;
+        }
+        else if (name == "GoodnessOfFit") {
+          dataType = 2;
+        }
+        else if (name ==  "MinimumPixelZScore") {
+          dataType = 3;
+        }
+        else if (name ==  "MaximumPixelZScore") {
+          dataType = 4;
+        }
+        else if (name == "PixelShift") {
+          dataType = 5;
+        }
+        else if (name == "WholePixelCorrelation") {
+          dataType = 6;
+        }
+        else if (name == "SubPixelCorrelation") {
+          dataType = 7;
+        }
+        else if (name == "Obsolete_AverageResidual") {
+          dataType = 8;
+        }
+        else {
+          QString msg = "Invalid control measure log data name [" + name + "]";
+          throw IException(IException::Programmer, msg, _FILEINFO_);
+        }
+
+        try {
+          value = toDouble(dataKeyword[0]);
+        }
+        catch (IException e) {
+          QString msg = "Invalid control measure log data value [" + dataKeyword[0] + "]";
+          throw IException(e, IException::Io, msg, _FILEINFO_);
+        }
+
+        ControlNetLogDataProtoV0001_Point_Measure_DataEntry logEntry;
+        logEntry.set_datatype(dataType);
+        logEntry.set_datavalue(value);
+        *measureLogData.add_loggedmeasuredata() = logEntry;
+      }
+
+      // Store the measure and its log data
+      *m_pointData->add_measures() = measure;
+      *m_logData->add_measures() = measureLogData;
+    }
+
+    if (!m_pointData->IsInitialized()) {
+      QString msg = "There is missing required information in the control "
+                    "points or measures";
+      throw IException(IException::Io, msg, _FILEINFO_);
+    }
+  }
+
+
+  /**
+   * Create a version 2 control point from a version 1 control point. The two versions internally
+   * store the same protobuf message, so all this does is copy the pointer to the internal protobuf
+   * object.
+   *
+   * @note Because the two points share the same container, modifications to one will affect the
+   *       other.
+   *
+   * @param oldPoint The old version 1 control point.
+   */
+  ControlPointV0002::ControlPointV0002(ControlPointV0001 &oldPoint)
+      : m_pointData(oldPoint.pointData()), m_logData(oldPoint.logData()) {
+
+  }
+
+
+  /**
+   * Access the protobuf control point data.
+   *
+   * @return @b QSharedPointer<ControlNetFileProtoV0001_PBControlPoint> A pointer to the internal
+   *                                                                    point data.
+   */
+  QSharedPointer<ControlNetFileProtoV0001_PBControlPoint> ControlPointV0002::pointData() {
+    return m_pointData;
+  }
+
+
+  /**
+   * Access the protobuf log data for the control measures in the point.
+   *
+   * @return @b QSharedPointer<ControlNetLogDataProtoV0001_Point> A pointer to the internal
+   *                                                              measure log data.
+   */
+  QSharedPointer<ControlNetLogDataProtoV0001_Point> ControlPointV0002::logData() {
+    return m_logData;
+  }
+
+
+  /**
+   * This convenience method takes a boolean value from a PvlKeyword and copies it into a version 1
+   * protobuf field. Once copied, the PvlKeyword is deleted.
+   *
+   * If the keyword doesn't exist, this does nothing.
+   *
+   * @param container The PvlContainer representation of the control point that contains the
+   *                  PvlKeyword.
+   * @param keyName The name of the keyword to be copied.
+   * @param[out] point The version 1 protobuf representation of the control point that the value
+   *                   will be copied into.
+   * @param setter The protobuf mutator method that sets the value of the field in the protobuf
+   *               representation.
+   */
+  void ControlPointV0002::copy(PvlContainer &container,
+                               QString keyName,
+                               QSharedPointer<ControlNetFileProtoV0001_PBControlPoint> point,
+                               void (ControlNetFileProtoV0001_PBControlPoint::*setter)(bool)) {
+
+    if (!container.hasKeyword(keyName)) {
+      return;
+    }
+
+    QString value = container[keyName][0];
+    container.deleteKeyword(keyName);
+    value = value.toLower();
+
+    if (value == "true" || value == "yes") {
+      (point.data()->*setter)(true);
+    }
+  }
+
+
+  /**
+   * This convenience method takes a double value from a PvlKeyword and copies it into a version 1
+   * protobuf field. Once copied, the PvlKeyword is deleted.
+   *
+   * If the keyword doesn't exist, this does nothing.
+   *
+   * @param container The PvlContainer representation of the control point that contains the
+   *                  PvlKeyword.
+   * @param keyName The name of the keyword to be copied.
+   * @param[out] point The version 1 protobuf representation of the control point that the value
+   *                   will be copied into.
+   * @param setter The protobuf mutator method that sets the value of the field in the protobuf
+   *               representation.
+   */
+  void ControlPointV0002::copy(PvlContainer &container,
+                               QString keyName,
+                               QSharedPointer<ControlNetFileProtoV0001_PBControlPoint> point,
+                               void (ControlNetFileProtoV0001_PBControlPoint::*setter)(double)) {
+
+    if (!container.hasKeyword(keyName)) {
+      return;
+    }
+
+    double value = toDouble(container[keyName][0]);
+    container.deleteKeyword(keyName);
+    (point.data()->*setter)(value);
+  }
+
+
+  /**
+   * This convenience method takes a string value from a PvlKeyword and copies it into a version 1
+   * protobuf field. Once copied, the PvlKeyword is deleted.
+   *
+   * If the keyword doesn't exist, this does nothing.
+   *
+   * @param container The PvlContainer representation of the control point that contains the
+   *                  PvlKeyword.
+   * @param keyName The name of the keyword to be copied.
+   * @param[out] point The version 1 protobuf representation of the control point that the value
+   *                   will be copied into.
+   * @param setter The protobuf mutator method that sets the value of the field in the protobuf
+   *               representation.
+   */
+  void ControlPointV0002::copy(PvlContainer &container,
+                               QString keyName,
+                               QSharedPointer<ControlNetFileProtoV0001_PBControlPoint> point,
+                               void (ControlNetFileProtoV0001_PBControlPoint::*setter)(const std::string&)) {
+
+    if (!container.hasKeyword(keyName)) {
+      return;
+    }
+
+    QString value = container[keyName][0];
+    container.deleteKeyword(keyName);
+    (point.data()->*setter)(value.toLatin1().data());
+  }
+
+
+  /**
+   * This convenience method takes a boolean value from a PvlKeyword and copies it into a version 1
+   * protobuf field. Once copied, the PvlKeyword is deleted.
+   *
+   * If the keyword doesn't exist, this does nothing.
+   *
+   * @param container The PvlContainer representation of the control measure that contains the
+   *                  PvlKeyword.
+   * @param keyName The name of the keyword to be copied.
+   * @param[out] measure The version 1 protobuf representation of the control measure that the
+   *                     value will be copied into.
+   * @param setter The protobuf mutator method that sets the value of the field in the protobuf
+   *               representation.
+   */
+  void ControlPointV0002::copy(PvlContainer &container,
+                               QString keyName,
+                               ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure &measure,
+                               void (ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::*setter)(bool)) {
+
+    if (!container.hasKeyword(keyName)) {
+      return;
+    }
+
+    QString value = container[keyName][0];
+    container.deleteKeyword(keyName);
+    value = value.toLower();
+
+    if (value == "true" || value == "yes") {
+      (measure.*setter)(true);
+    }
+  }
+
+
+  /**
+   * This convenience method takes a double value from a PvlKeyword and copies it into a version 1
+   * protobuf field. Once copied, the PvlKeyword is deleted.
+   *
+   * If the keyword doesn't exist, this does nothing.
+   *
+   * @param container The PvlContainer representation of the control measure that contains the
+   *                  PvlKeyword.
+   * @param keyName The name of the keyword to be copied.
+   * @param[out] measure The version 1 protobuf representation of the control measure that the
+   *                     value will be copied into.
+   * @param setter The protobuf mutator method that sets the value of the field in the protobuf
+   *               representation.
+   */
+  void ControlPointV0002::copy(PvlContainer &container,
+                               QString keyName,
+                               ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure &measure,
+                               void (ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::*setter)(double)) {
+
+    if (!container.hasKeyword(keyName)) {
+      return;
+    }
+
+    double value = toDouble(container[keyName][0]);
+    container.deleteKeyword(keyName);
+    (measure.*setter)(value);
+  }
+
+
+  /**
+   * This convenience method takes a string value from a PvlKeyword and copies it into a version 1
+   * protobuf field. Once copied, the PvlKeyword is deleted.
+   *
+   * If the keyword doesn't exist, this does nothing.
+   *
+   * @param container The PvlContainer representation of the control measure that contains the
+   *                  PvlKeyword.
+   * @param keyName The name of the keyword to be copied.
+   * @param[out] measure The version 1 protobuf representation of the control measure that the
+   *                     value will be into.
+   * @param setter The protobuf mutator method that sets the value of the field in the protobuf
+   *               representation.
+   */
+  void ControlPointV0002::copy(PvlContainer &container,
+                               QString keyName,
+                               ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure &measure,
+                               void (ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::*setter)
+                                      (const std::string &)) {
+
+    if (!container.hasKeyword(keyName)) {
+      return;
+    }
+
+    QString value = container[keyName][0];
+    container.deleteKeyword(keyName);
+    (measure.*setter)(value.toLatin1().data());
+  }
+}
diff --git a/isis/src/control/objs/ControlNetVersioner/ControlPointV0002.h b/isis/src/control/objs/ControlNetVersioner/ControlPointV0002.h
new file mode 100644
index 0000000000000000000000000000000000000000..95d18e5077731d6a796993f221f98de01f5333d7
--- /dev/null
+++ b/isis/src/control/objs/ControlNetVersioner/ControlPointV0002.h
@@ -0,0 +1,232 @@
+#ifndef ControlPointV0002_h
+#define ControlPointV0002_h
+/**
+ * @file
+ * $Revision: 1.9 $
+ * $Date: 2009/07/15 17:33:52 $
+ *
+ *   Unless noted otherwise, the portions of Isis written by the USGS are
+ *   public domain. See individual third-party library and package descriptions
+ *   for intellectual property information, user agreements, and related
+ *   information.
+ *
+ *   Although Isis has been used by the USGS, no warranty, expressed or
+ *   implied, is made by the USGS as to the accuracy and functioning of such
+ *   software and related material nor shall the fact of distribution
+ *   constitute any such warranty, and no responsibility is assumed by the
+ *   USGS in connection therewith.
+ *
+ *   For additional information, launch
+ *   $ISISROOT/doc//documents/Disclaimers/Disclaimers.html
+ *   in a browser or see the Privacy &amp; Disclaimers page on the Isis website,
+ *   http://isis.astrogeology.usgs.gov, and the USGS privacy and disclaimers on
+ *   http://www.usgs.gov/privacy.html.
+ */
+
+ #include <QSharedPointer>
+
+ #include "ControlNetFileProtoV0001.pb.h"
+ #include "ControlNetLogDataProtoV0001.pb.h"
+
+namespace Isis {
+  class ControlPointV0001;
+  class PvlObject;
+  class PvlContainer;
+
+  /**
+   * @brief A container for the information stored in a version 2 ControlPoint.
+   *
+   * A wrapper around the version 2 protobuf serialization of a ControlPoint. It allows for reading
+   * ControlPoints serialized as both PvlObjects and protobuf messages.
+   *
+   * The version 1 and 2 control points use the same internal protobuf message format.
+   * Thus the "upgrade" process simply copies the shared pointer to the protobuf message.
+   *
+   * Version 2 was the first version to have a standardized Pvl format. In the
+   * Pvl format, control points are represented by objects contained in the
+   * ControlNetwork object. Control measures are represented by groups
+   * contained in the control point objects.
+   *
+   * <b>Valid Control Point Keywords</b>
+   *
+   * <ul>
+   *   <li><em>PointId:</em> The point ID string</li>
+   *   <li><em>ChooserName:</em> The name of the application or user that last
+   *       modified the point</li>
+   *   <li><em>DateTime:</em> The date and time of the last modification to the
+   *       point</li>
+   *   <li><em>AprioriXYZSource:</em> What type of source the apriori ground
+   *       point was calculated from. Options:
+   *       <ul>
+   *           <li>None</li>
+   *           <li>User</li>
+   *           <li>AverageOfMeasures</li>
+   *           <li>Reference</li>
+   *           <li>Basemap</li>
+   *           <li>BundleSolution</li>
+   *       </ul></li>
+   *   <li><em>AprioriXYZSourceFile:</em> The name of the file that the apriori
+   *       ground point was calculated from</li>
+   *   <li><em>AprioriRadiusSource:</em> What type of source the apriori point
+   *       radius was calculated from. Options:
+   *       <ul>
+   *           <li>None</li>
+   *           <li>User</li>
+   *           <li>AverageOfMeasures</li>
+   *           <li>Ellipsoid</li>
+   *           <li>DEM</li>
+   *           <li>BundleSolution</li>
+   *       </ul></li>
+   *   <li><em>AprioriRadiusSourceFile:</em> The name of the file that the
+   *       apriori point radius was calculated from</li>
+   *   <li><em>JigsawRejected:</em> If the point was rejected by a bundle
+   *       adjustment</li>
+   *   <li><em>EditLock:</em> If the point is locked out of editing</li>
+   *   <li><em>Ignore:</em> If the point will be ignored</li>
+   *   <li><em>AprioriX:</em> The body fixed X coordinate of the a priori
+   *       ground point in meters</li>
+   *   <li><em>AprioriY:</em> The body fixed Y coordinate of the a priori
+   *       ground point in meters</li>
+   *   <li><em>AprioriZ:</em> The body fixed Z coordinate of the a priori
+   *       ground point in meters</li>
+   *   <li><em>AdjustedX:</em> The body fixed X coordinate of the adjusted
+   *       ground point in meters</li>
+   *   <li><em>AdjustedY:</em> The body fixed Y coordinate of the adjusted
+   *       ground point in meters</li>
+   *   <li><em>AdjustedZ:</em> The body fixed Z coordinate of the adjusted
+   *       ground point in meters</li>
+   *   <li><em>LatitudeConstrained:</em> If the latitude of the ground point
+   *       is constrained</li>
+   *   <li><em>LongitudeConstrained:</em> If the longitude of the ground point
+   *       is constrained</li>
+   *   <li><em>RadiusConstrained:</em> If the radius of the ground point
+   *       is constrained</li>
+   *   <li><em>PointType:</em> What type of point it is. Options:
+   *       <ul>
+   *           <li>Ground</li>
+   *           <li>Tie</li>
+   *       </ul></li>
+   *   <li><em>AprioriCovarianceMatrix:</em> A six element vector corresponding
+   *       to the upper triangle; elements (0,0), (0,1), (0,2), (1,1), (1,2),
+   *       and (2,2); of the 3x3, symmetric covariance matrix for
+   *       the rectangular, a priori ground point.</li>
+   *   <li><em>AdjustedCovarianceMatrix:</em> A six element vector corresponding
+   *       to the upper triangle; elements (0,0), (0,1), (0,2), (1,1), (1,2),
+   *       and (2,2); of the 3x3, symmetric covariance matrix for
+   *       the rectangular, adjusted ground point.</li>
+   * </ul>
+   *
+   * <b>Valid Control Measure Keywords</b>
+   *
+   * <ul>
+   *   <li><em>SerialNumber:</em> The serial number of the cube the measure
+   *       is from</li>
+   *   <li><em>ChooserName:</em> The name of the application or user who last
+   *       modified the measure</li>
+   *   <li><em>DateTime:</em> The date and time of the last modification</li>
+   *   <li><em>Diameter:</em> If the measure was selected from a crater, this
+   *       is the diameter of the crater in meters</li>
+   *   <li><em>EditLock:</em> If the measure is locked out of editing</li>
+   *   <li><em>Ignore:</em> If the measure will be ignored</li>
+   *   <li><em>JigsawRejected:</em> If the measure was rejected during a
+   *       bundle adjustment</li>
+   *   <li><em>AprioriSample:</em> The a priori sample</li>
+   *   <li><em>AprioriLine:</em> The a priori line</li>
+   *   <li><em>SampleSigma:</em> The standard deviation of the sample
+   *       measurement</li>
+   *   <li><em>LineSigma:</em> The standard deviation of the line
+   *       measurement</li>
+   *   <li><em>Sample:</em> The adjusted sample</li>
+   *   <li><em>Line:</em> The adjusted line</li>
+   *   <li><em>SampleResidual:</em> The difference between the a priori and
+   *       adjusted sample</li>
+   *   <li><em>LineResidual:</em> The difference between the a priori and
+   *       adjusted line</li>
+   *   <li><em>Reference:</em> If the measure is the reference measure for
+   *       its point</li>
+   *   <li><em>MeasureType:</em> What type of measure it is. Options:
+   *       <ul>
+   *           <li>candidate</li>
+   *           <li>manual</li>
+   *           <li>registeredpixel</li>
+   *           <li>registeredsubpixel</li>
+   *       </ul></li>
+   * </ul>
+   *
+   *
+   * @ingroup ControlNetwork
+   *
+   * @author 2017-12-14 Jesse Mapel
+   *
+   * @internal
+   *   @history 2017-12-14 Jesse Mapel - Original version.
+   *   @history 2017-12-21 Jesse Mapel - Added support for measure log data.
+   *   @history 2017-12-21 Adam Goins - Changed Pvl constructor to take PvlObject.
+   *   @history 2018-01-03 Jesse Mapel - Improved documentation.
+   *   @history 2017-01-27 Jesse Mapel - More documentation improvements.
+   */
+  class ControlPointV0002 {
+    public:
+      ControlPointV0002(PvlObject &pointObject);
+      ControlPointV0002(QSharedPointer<ControlNetFileProtoV0001_PBControlPoint> pointData,
+                        QSharedPointer<ControlNetLogDataProtoV0001_Point> logData);
+      ControlPointV0002(ControlPointV0001 &oldPoint);
+
+      QSharedPointer<ControlNetFileProtoV0001_PBControlPoint> pointData();
+      QSharedPointer<ControlNetLogDataProtoV0001_Point> logData();
+
+    private:
+      /**
+       * Default constructor. Intentionally un-implemented.
+       */
+      ControlPointV0002();
+      /**
+       * Copy constructor. Intentionally un-implemented.
+       *
+       * @param other The other ControlPointV0002 to copy from.
+       */
+      ControlPointV0002(const ControlPointV0002 &other);
+      /**
+       * Assignment operator. Intentionally un-implemented.
+       *
+       * @param other The other ControlPointV0002 to assign from.
+       *
+       * @return @b ControlPointV0002& A reference to this after assignment.
+       */
+      ControlPointV0002 &operator=(const ControlPointV0002 &other);
+
+      // methods for converting from Pvl to protobuf
+      void copy(PvlContainer &container,
+                QString keyName,
+                QSharedPointer<ControlNetFileProtoV0001_PBControlPoint> point,
+                void (ControlNetFileProtoV0001_PBControlPoint::*setter)(bool));
+      void copy(PvlContainer &container,
+                QString keyName,
+                QSharedPointer<ControlNetFileProtoV0001_PBControlPoint> point,
+                void (ControlNetFileProtoV0001_PBControlPoint::*setter)(double));
+      void copy(PvlContainer &container,
+                QString keyName,
+                QSharedPointer<ControlNetFileProtoV0001_PBControlPoint> point,
+                void (ControlNetFileProtoV0001_PBControlPoint::*setter)(const std::string&));
+      void copy(PvlContainer &container,
+                QString keyName,
+                ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure &measure,
+                void (ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::*setter)(bool));
+      void copy(PvlContainer &container,
+                QString keyName,
+                ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure &measure,
+                void (ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::*setter)(double));
+      void copy(PvlContainer &container,
+                QString keyName,
+                ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure &measure,
+                void (ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure::*setter)(
+                            const std::string &));
+
+      QSharedPointer<ControlNetFileProtoV0001_PBControlPoint> m_pointData;
+      /**< protobuf container that holds information used to create a control point.*/
+      QSharedPointer<ControlNetLogDataProtoV0001_Point> m_logData;
+      /**< Protobuf container that holds log data for the control measures in the point.*/
+  };
+}
+
+#endif
diff --git a/isis/src/control/objs/ControlNetVersioner/ControlPointV0003.cpp b/isis/src/control/objs/ControlNetVersioner/ControlPointV0003.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..86b3526a5f43c876b1a3bc947283ffe3a59a7394
--- /dev/null
+++ b/isis/src/control/objs/ControlNetVersioner/ControlPointV0003.cpp
@@ -0,0 +1,743 @@
+#include "ControlPointV0003.h"
+
+#include <QString>
+
+#include "ControlMeasureLogData.h"
+#include "ControlPointFileEntryV0002.pb.h"
+#include "ControlPointV0002.h"
+#include "IException.h"
+#include "PvlObject.h"
+#include "PvlContainer.h"
+
+using namespace std;
+
+namespace Isis {
+
+  /**
+   * Create a ControlPointV0003 object from a protobuf version 2 control point message.
+   *
+   * @param pointData The protobuf message from a control net file.
+   */
+  ControlPointV0003::ControlPointV0003(QSharedPointer<ControlPointFileEntryV0002> pointData)
+      : m_pointData(pointData) {
+
+  }
+
+
+  /**
+   * Create a ControlPointV0003 object from a version 3 or 4 control point Pvl object
+   *
+   * @param pointObject The control point and its measures in a Pvl object
+   */
+  ControlPointV0003::ControlPointV0003(PvlObject &pointObject)
+      : m_pointData(new ControlPointFileEntryV0002) {
+
+    // Copy over strings, doubles, and bools
+    copy(pointObject, "PointId",
+         m_pointData, &ControlPointFileEntryV0002::set_id);
+    copy(pointObject, "ChooserName",
+         m_pointData, &ControlPointFileEntryV0002::set_choosername);
+    copy(pointObject, "DateTime",
+         m_pointData, &ControlPointFileEntryV0002::set_datetime);
+    copy(pointObject, "AprioriXYZSourceFile",
+         m_pointData, &ControlPointFileEntryV0002::set_apriorisurfpointsourcefile);
+    copy(pointObject, "AprioriRadiusSourceFile",
+         m_pointData, &ControlPointFileEntryV0002::set_aprioriradiussourcefile);
+    copy(pointObject, "JigsawRejected",
+         m_pointData, &ControlPointFileEntryV0002::set_jigsawrejected);
+    copy(pointObject, "EditLock",
+         m_pointData, &ControlPointFileEntryV0002::set_editlock);
+    copy(pointObject, "Ignore",
+         m_pointData, &ControlPointFileEntryV0002::set_ignore);
+    copy(pointObject, "AprioriX",
+         m_pointData, &ControlPointFileEntryV0002::set_apriorix);
+    copy(pointObject, "AprioriY",
+         m_pointData, &ControlPointFileEntryV0002::set_aprioriy);
+    copy(pointObject, "AprioriZ",
+         m_pointData, &ControlPointFileEntryV0002::set_aprioriz);
+    copy(pointObject, "AdjustedX",
+         m_pointData, &ControlPointFileEntryV0002::set_adjustedx);
+    copy(pointObject, "AdjustedY",
+         m_pointData, &ControlPointFileEntryV0002::set_adjustedy);
+    copy(pointObject, "AdjustedZ",
+         m_pointData, &ControlPointFileEntryV0002::set_adjustedz);
+    copy(pointObject, "LatitudeConstrained",
+         m_pointData, &ControlPointFileEntryV0002::set_latitudeconstrained);
+    copy(pointObject, "LongitudeConstrained",
+         m_pointData, &ControlPointFileEntryV0002::set_longitudeconstrained);
+    copy(pointObject, "RadiusConstrained",
+         m_pointData, &ControlPointFileEntryV0002::set_radiusconstrained);
+
+    // Copy enumerated values
+
+    // The control point type names were changed between version 3 and version 4.
+    // In version 3, the types are ground, tie, and constrained
+    // In version 4, these were changed to fixed, free, and constrained respectively.
+    // The protobuf file version was not changed, fixed and free were simply added to the
+    // enumeration and the old names were flagged as obsolete.
+    if (pointObject["PointType"][0] == "Fixed"
+        || pointObject["PointType"][0] == "Ground") {
+      m_pointData->set_type(ControlPointFileEntryV0002::Fixed);
+    }
+    else if (pointObject["PointType"][0] == "Constrained") {
+      m_pointData->set_type(ControlPointFileEntryV0002::Constrained);
+    }
+    else if (pointObject["PointType"][0] == "Free"
+             || pointObject["PointType"][0] == "Tie") {
+      m_pointData->set_type(ControlPointFileEntryV0002::Free);
+    }
+    else {
+      QString msg = "Invalid ControlPoint type [" + pointObject["PointType"][0] + "].";
+      throw IException(IException::User, msg, _FILEINFO_);
+    }
+
+    if (pointObject.hasKeyword("AprioriXYZSource")) {
+      QString source = pointObject["AprioriXYZSource"][0];
+
+      if (source == "None") {
+        m_pointData->set_apriorisurfpointsource(ControlPointFileEntryV0002::None);
+      }
+      else if (source == "User") {
+        m_pointData->set_apriorisurfpointsource(ControlPointFileEntryV0002::User);
+      }
+      else if (source == "AverageOfMeasures") {
+        m_pointData->set_apriorisurfpointsource(ControlPointFileEntryV0002::AverageOfMeasures);
+      }
+      else if (source == "Reference") {
+        m_pointData->set_apriorisurfpointsource(ControlPointFileEntryV0002::Reference);
+      }
+      else if (source == "Basemap") {
+        m_pointData->set_apriorisurfpointsource(ControlPointFileEntryV0002::Basemap);
+      }
+      else if (source == "BundleSolution") {
+        m_pointData->set_apriorisurfpointsource(ControlPointFileEntryV0002::BundleSolution);
+      }
+      else {
+        QString msg = "Invalid AprioriXYZSource [" + source + "]";
+        throw IException(IException::User, msg, _FILEINFO_);
+      }
+    }
+
+    if (pointObject.hasKeyword("AprioriRadiusSource")) {
+      QString source = pointObject["AprioriRadiusSource"][0];
+
+      if (source == "None") {
+        m_pointData->set_aprioriradiussource(ControlPointFileEntryV0002::None);
+      }
+      else if (source == "User") {
+        m_pointData->set_aprioriradiussource(ControlPointFileEntryV0002::User);
+      }
+      else if (source == "AverageOfMeasures") {
+        m_pointData->set_aprioriradiussource(ControlPointFileEntryV0002::AverageOfMeasures);
+      }
+      else if (source == "Ellipsoid") {
+        m_pointData->set_aprioriradiussource(ControlPointFileEntryV0002::Ellipsoid);
+      }
+      else if (source == "DEM") {
+        m_pointData->set_aprioriradiussource(ControlPointFileEntryV0002::DEM);
+      }
+      else if (source == "BundleSolution") {
+        m_pointData->set_aprioriradiussource(ControlPointFileEntryV0002::BundleSolution);
+      }
+      else {
+        QString msg = "Invalid AprioriRadiusSource, [" + source + "]";
+        throw IException(IException::User, msg, _FILEINFO_);
+      }
+    }
+
+    // Copy array values
+    if (pointObject.hasKeyword("AprioriCovarianceMatrix")) {
+      PvlKeyword &matrix = pointObject["AprioriCovarianceMatrix"];
+
+      m_pointData->add_aprioricovar(toDouble(matrix[0]));
+      m_pointData->add_aprioricovar(toDouble(matrix[1]));
+      m_pointData->add_aprioricovar(toDouble(matrix[2]));
+      m_pointData->add_aprioricovar(toDouble(matrix[3]));
+      m_pointData->add_aprioricovar(toDouble(matrix[4]));
+      m_pointData->add_aprioricovar(toDouble(matrix[5]));
+    }
+
+    if (pointObject.hasKeyword("AdjustedCovarianceMatrix")) {
+      PvlKeyword &matrix = pointObject["AdjustedCovarianceMatrix"];
+
+      m_pointData->add_adjustedcovar(toDouble(matrix[0]));
+      m_pointData->add_adjustedcovar(toDouble(matrix[1]));
+      m_pointData->add_adjustedcovar(toDouble(matrix[2]));
+      m_pointData->add_adjustedcovar(toDouble(matrix[3]));
+      m_pointData->add_adjustedcovar(toDouble(matrix[4]));
+      m_pointData->add_adjustedcovar(toDouble(matrix[5]));
+    }
+
+    //  Process Measures
+    for (int groupIndex = 0; groupIndex < pointObject.groups(); groupIndex ++) {
+      PvlGroup &group = pointObject.group(groupIndex);
+      ControlPointFileEntryV0002_Measure measure;
+
+      // Copy strings, booleans, and doubles
+      copy(group, "SerialNumber",
+           measure, &ControlPointFileEntryV0002_Measure::set_serialnumber);
+      copy(group, "ChooserName",
+           measure, &ControlPointFileEntryV0002_Measure::set_choosername);
+      copy(group, "Sample",
+           measure, &ControlPointFileEntryV0002_Measure::set_sample);
+      copy(group, "Line",
+           measure, &ControlPointFileEntryV0002_Measure::set_line);
+      copy(group, "SampleResidual",
+           measure, &ControlPointFileEntryV0002_Measure::set_sampleresidual);
+      copy(group, "LineResidual",
+           measure, &ControlPointFileEntryV0002_Measure::set_lineresidual);
+      copy(group, "DateTime",
+           measure, &ControlPointFileEntryV0002_Measure::set_datetime);
+      copy(group, "Diameter",
+           measure, &ControlPointFileEntryV0002_Measure::set_diameter);
+      copy(group, "EditLock",
+           measure, &ControlPointFileEntryV0002_Measure::set_editlock);
+      copy(group, "Ignore",
+           measure, &ControlPointFileEntryV0002_Measure::set_ignore);
+      copy(group, "JigsawRejected",
+           measure, &ControlPointFileEntryV0002_Measure::set_jigsawrejected);
+      copy(group, "AprioriSample",
+           measure, &ControlPointFileEntryV0002_Measure::set_apriorisample);
+      copy(group, "AprioriLine",
+           measure, &ControlPointFileEntryV0002_Measure::set_aprioriline);
+      copy(group, "SampleSigma",
+           measure, &ControlPointFileEntryV0002_Measure::set_samplesigma);
+      copy(group, "LineSigma",
+           measure, &ControlPointFileEntryV0002_Measure::set_linesigma);
+
+      if (group.hasKeyword("Reference")) {
+        if (group["Reference"][0].toLower() == "true") {
+          m_pointData->set_referenceindex(groupIndex);
+        }
+        group.deleteKeyword("Reference");
+      }
+
+      QString type = group["MeasureType"][0].toLower();
+      if (type == "candidate") {
+        measure.set_type(ControlPointFileEntryV0002_Measure::Candidate);
+      }
+      else if (type == "manual") {
+        measure.set_type(ControlPointFileEntryV0002_Measure::Manual);
+      }
+      else if (type == "registeredpixel") {
+        measure.set_type(ControlPointFileEntryV0002_Measure::RegisteredPixel);
+      }
+      else if (type == "registeredsubpixel") {
+        measure.set_type(ControlPointFileEntryV0002_Measure::RegisteredSubPixel);
+      }
+      else {
+        throw IException(IException::Io,
+                         "Unknown measure type [" + type + "]",
+                         _FILEINFO_);
+      }
+      group.deleteKeyword("MeasureType");
+
+      for (int key = 0; key < group.keywords(); key++) {
+        ControlMeasureLogData interpreter(group[key]);
+        if (!interpreter.IsValid()) {
+          QString msg = "Unhandled or duplicate keywords in control measure ["
+                        + group[key].name() + "]";
+          throw IException(IException::Programmer, msg, _FILEINFO_);
+        }
+        else {
+          ControlPointFileEntryV0002_Measure_MeasureLogData protoBufDataEntry;
+
+          protoBufDataEntry.set_doubledatatype(interpreter.GetDataType());
+          protoBufDataEntry.set_doubledatavalue(interpreter.GetNumericalValue());
+
+          *measure.add_log() = protoBufDataEntry;
+        }
+      }
+
+      *m_pointData->add_measures() = measure;
+    }
+
+    if (!m_pointData->IsInitialized()) {
+      QString msg = "There is missing required information in the control "
+                    "points or measures";
+      throw IException(IException::Io, msg, _FILEINFO_);
+    }
+  }
+
+
+  /**
+   * Create a ControlPointV0003 object from a ControlPointV0002 object
+   *
+   * @param oldPoint The PvlControlPointV0002 that will be upgraded to V0003.
+   */
+  ControlPointV0003::ControlPointV0003(ControlPointV0002 &oldPoint)
+      : m_pointData(new ControlPointFileEntryV0002) {
+    QSharedPointer<ControlNetFileProtoV0001_PBControlPoint> oldPointData = oldPoint.pointData();
+    if (!oldPointData) {
+      QString msg = "Version 2 control point is missing point data.";
+      throw IException(IException::User, msg, _FILEINFO_);
+    }
+    QSharedPointer<ControlNetLogDataProtoV0001_Point> oldLogData = oldPoint.logData();
+    if (!oldLogData) {
+      QString msg = "Version 2 control point is missing measure log data.";
+      throw IException(IException::User, msg, _FILEINFO_);
+    }
+
+    // Copy over POD values
+    if ( oldPointData->has_id() ) {
+      m_pointData->set_id( oldPointData->id() );
+    }
+    if ( oldPointData->has_choosername() ) {
+      m_pointData->set_choosername( oldPointData->choosername() );
+    }
+    if ( oldPointData->has_datetime() ) {
+      m_pointData->set_datetime( oldPointData->datetime() );
+    }
+    if ( oldPointData->has_apriorisurfpointsourcefile() ) {
+      m_pointData->set_apriorisurfpointsourcefile( oldPointData->apriorisurfpointsourcefile() );
+    }
+    if ( oldPointData->has_aprioriradiussourcefile() ) {
+      m_pointData->set_aprioriradiussourcefile( oldPointData->aprioriradiussourcefile() );
+    }
+    if ( oldPointData->has_jigsawrejected() ) {
+      m_pointData->set_jigsawrejected( oldPointData->jigsawrejected() );
+    }
+    if ( oldPointData->has_editlock() ) {
+      m_pointData->set_editlock( oldPointData->editlock() );
+    }
+    if ( oldPointData->has_ignore() ) {
+      m_pointData->set_ignore( oldPointData->ignore() );
+    }
+    if ( oldPointData->has_apriorix() ) {
+      m_pointData->set_apriorix( oldPointData->apriorix() );
+    }
+    if ( oldPointData->has_aprioriy() ) {
+      m_pointData->set_aprioriy( oldPointData->aprioriy() );
+    }
+    if ( oldPointData->has_aprioriz() ) {
+      m_pointData->set_aprioriz( oldPointData->aprioriz() );
+    }
+    if ( oldPointData->has_adjustedx() ) {
+      m_pointData->set_adjustedx( oldPointData->adjustedx() );
+    }
+    if ( oldPointData->has_adjustedy() ) {
+      m_pointData->set_adjustedy( oldPointData->adjustedy() );
+    }
+    if ( oldPointData->has_adjustedz() ) {
+      m_pointData->set_adjustedz( oldPointData->adjustedz() );
+    }
+    if ( oldPointData->has_latitudeconstrained() ) {
+      m_pointData->set_latitudeconstrained( oldPointData->latitudeconstrained() );
+    }
+    if ( oldPointData->has_longitudeconstrained() ) {
+      m_pointData->set_longitudeconstrained( oldPointData->longitudeconstrained() );
+    }
+    if ( oldPointData->has_radiusconstrained() ) {
+      m_pointData->set_radiusconstrained( oldPointData->radiusconstrained() );
+    }
+    if ( oldPointData->has_referenceindex() ) {
+      m_pointData->set_referenceindex( oldPointData->referenceindex() );
+    }
+
+    // Copy over enumerated values
+
+    // The only point types in V0002 are ground and tie.
+    // So, convert ground and tie to their V0003 values, fixed and free respectively.
+    // Later check if the point is constrained.
+    if ( oldPointData->has_type() ) {
+      ControlNetFileProtoV0001_PBControlPoint_PointType pointType = oldPointData->type();
+      if (pointType == ControlNetFileProtoV0001_PBControlPoint::Ground) {
+        m_pointData->set_type(ControlPointFileEntryV0002::Fixed);
+      }
+      else if (pointType == ControlNetFileProtoV0001_PBControlPoint::Tie) {
+        m_pointData->set_type(ControlPointFileEntryV0002::Free);
+      }
+      else {
+        QString msg = "Invalid ControlPoint type.";
+        throw IException(IException::User, msg, _FILEINFO_);
+      }
+    }
+
+    if ( oldPointData->has_apriorisurfpointsource() ) {
+      ControlNetFileProtoV0001_PBControlPoint_AprioriSource surfacePointSource;
+      surfacePointSource = oldPointData->apriorisurfpointsource();
+      if (surfacePointSource == ControlNetFileProtoV0001_PBControlPoint::None) {
+        m_pointData->set_apriorisurfpointsource(ControlPointFileEntryV0002::None);
+      }
+      else if (surfacePointSource == ControlNetFileProtoV0001_PBControlPoint::User) {
+        m_pointData->set_apriorisurfpointsource(ControlPointFileEntryV0002::User);
+      }
+      else if (surfacePointSource == ControlNetFileProtoV0001_PBControlPoint::AverageOfMeasures) {
+        m_pointData->set_apriorisurfpointsource(ControlPointFileEntryV0002::AverageOfMeasures);
+      }
+      else if (surfacePointSource == ControlNetFileProtoV0001_PBControlPoint::Reference) {
+        m_pointData->set_apriorisurfpointsource(ControlPointFileEntryV0002::Reference);
+      }
+      else if (surfacePointSource == ControlNetFileProtoV0001_PBControlPoint::Basemap) {
+        m_pointData->set_apriorisurfpointsource(ControlPointFileEntryV0002::Basemap);
+      }
+      else if (surfacePointSource == ControlNetFileProtoV0001_PBControlPoint::BundleSolution) {
+        m_pointData->set_apriorisurfpointsource(ControlPointFileEntryV0002::BundleSolution);
+      }
+      else {
+        QString msg = "Invalid ControlPoint apriori surface point source.";
+        throw IException(IException::User, msg, _FILEINFO_);
+      }
+    }
+
+    if ( oldPointData->has_aprioriradiussource() ) {
+      ControlNetFileProtoV0001_PBControlPoint_AprioriSource radiusSource;
+      radiusSource = oldPointData->aprioriradiussource();
+      if (radiusSource == ControlNetFileProtoV0001_PBControlPoint::None) {
+        m_pointData->set_aprioriradiussource(ControlPointFileEntryV0002::None);
+      }
+      else if (radiusSource == ControlNetFileProtoV0001_PBControlPoint::User) {
+        m_pointData->set_aprioriradiussource(ControlPointFileEntryV0002::User);
+      }
+      else if (radiusSource == ControlNetFileProtoV0001_PBControlPoint::AverageOfMeasures) {
+        m_pointData->set_aprioriradiussource(ControlPointFileEntryV0002::AverageOfMeasures);
+      }
+      else if (radiusSource == ControlNetFileProtoV0001_PBControlPoint::Ellipsoid) {
+        m_pointData->set_aprioriradiussource(ControlPointFileEntryV0002::Ellipsoid);
+      }
+      else if (radiusSource == ControlNetFileProtoV0001_PBControlPoint::DEM) {
+        m_pointData->set_aprioriradiussource(ControlPointFileEntryV0002::DEM);
+      }
+      else if (radiusSource == ControlNetFileProtoV0001_PBControlPoint::BundleSolution) {
+        m_pointData->set_aprioriradiussource(ControlPointFileEntryV0002::BundleSolution);
+      }
+      else {
+        QString msg = "Invalid AprioriRadiusSource.";
+        throw IException(IException::User, msg, _FILEINFO_);
+      }
+    }
+
+    // Copy the array values
+
+    // If there is a covariance matrix, then the point is constrained
+    if (oldPointData->aprioricovar_size() > 0) {
+      m_pointData->set_type(ControlPointFileEntryV0002::Constrained);
+      m_pointData->add_aprioricovar( oldPointData->aprioricovar(0) );
+      m_pointData->add_aprioricovar( oldPointData->aprioricovar(1) );
+      m_pointData->add_aprioricovar( oldPointData->aprioricovar(2) );
+      m_pointData->add_aprioricovar( oldPointData->aprioricovar(3) );
+      m_pointData->add_aprioricovar( oldPointData->aprioricovar(4) );
+      m_pointData->add_aprioricovar( oldPointData->aprioricovar(5) );
+    }
+
+    if (oldPointData->adjustedcovar_size() > 0) {
+      m_pointData->add_adjustedcovar( oldPointData->adjustedcovar(0) );
+      m_pointData->add_adjustedcovar( oldPointData->adjustedcovar(1) );
+      m_pointData->add_adjustedcovar( oldPointData->adjustedcovar(2) );
+      m_pointData->add_adjustedcovar( oldPointData->adjustedcovar(3) );
+      m_pointData->add_adjustedcovar( oldPointData->adjustedcovar(4) );
+      m_pointData->add_adjustedcovar( oldPointData->adjustedcovar(5) );
+    }
+
+    // Copy the measures
+    for (int i = 0; i < oldPointData->measures_size(); i++) {
+      ControlPointFileEntryV0002_Measure *newMeasure = m_pointData->add_measures();
+      ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure oldMeasure;
+      oldMeasure = oldPointData->measures(i);
+
+      // Copy over POD values
+      if ( oldMeasure.has_serialnumber() ) {
+        newMeasure->set_serialnumber( oldMeasure.serialnumber() );
+      }
+      if ( oldMeasure.has_choosername() ) {
+        newMeasure->set_choosername( oldMeasure.choosername() );
+      }
+      if ( oldMeasure.has_datetime() ) {
+        newMeasure->set_datetime( oldMeasure.datetime() );
+      }
+      if ( oldMeasure.has_diameter() ) {
+        newMeasure->set_diameter( oldMeasure.diameter() );
+      }
+      if ( oldMeasure.has_editlock() ) {
+        newMeasure->set_editlock( oldMeasure.editlock() );
+      }
+      if ( oldMeasure.has_ignore() ) {
+        newMeasure->set_ignore( oldMeasure.ignore() );
+      }
+      if ( oldMeasure.has_jigsawrejected() ) {
+        newMeasure->set_jigsawrejected( oldMeasure.jigsawrejected() );
+      }
+      if ( oldMeasure.has_apriorisample() ) {
+        newMeasure->set_apriorisample( oldMeasure.apriorisample() );
+      }
+      if ( oldMeasure.has_aprioriline() ) {
+        newMeasure->set_aprioriline( oldMeasure.aprioriline() );
+      }
+      if ( oldMeasure.has_samplesigma() ) {
+        newMeasure->set_samplesigma( oldMeasure.samplesigma() );
+      }
+      if ( oldMeasure.has_linesigma() ) {
+        newMeasure->set_linesigma( oldMeasure.linesigma() );
+      }
+      // In the version 1 protobuf format, the sample, line, sample residual, and line residual
+      // values are stored in a nested message so we have to copy them differently.
+      if ( oldMeasure.has_measurement() ) {
+        ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure_PBMeasure oldMeasurement;
+        oldMeasurement = oldMeasure.measurement();
+        if ( oldMeasurement.has_sample() ) {
+          newMeasure->set_sample( oldMeasurement.sample() );
+        }
+        if ( oldMeasurement.has_line() ) {
+          newMeasure->set_line( oldMeasurement.line() );
+        }
+        if ( oldMeasurement.has_sampleresidual() ) {
+          newMeasure->set_sampleresidual( oldMeasurement.sampleresidual() );
+        }
+        if ( oldMeasurement.has_lineresidual() ) {
+          newMeasure->set_lineresidual( oldMeasurement.lineresidual() );
+        }
+      }
+
+      // Copy over the enumerated values
+      if ( oldMeasure.has_type() ) {
+        ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure_MeasureType oldType;
+        oldType = oldMeasure.type();
+        if (oldType == ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure_MeasureType_Candidate) {
+          newMeasure->set_type(ControlPointFileEntryV0002_Measure_MeasureType_Candidate);
+        }
+        else if (oldType == ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure_MeasureType_Manual) {
+          newMeasure->set_type(ControlPointFileEntryV0002_Measure_MeasureType_Manual);
+        }
+        else if (oldType == ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure_MeasureType_RegisteredPixel) {
+          newMeasure->set_type(ControlPointFileEntryV0002_Measure_MeasureType_RegisteredPixel);
+        }
+        else if (oldType == ControlNetFileProtoV0001_PBControlPoint_PBControlMeasure_MeasureType_RegisteredSubPixel) {
+          newMeasure->set_type(ControlPointFileEntryV0002_Measure_MeasureType_RegisteredSubPixel);
+        }
+        else {
+          QString msg = "Invalid measure type";
+          throw IException(IException::User, msg, _FILEINFO_);
+        }
+
+        // Copy over any log data
+        ControlNetLogDataProtoV0001_Point_Measure measureLogData = oldLogData->measures(i);
+        for (int j = 0; j < measureLogData.loggedmeasuredata_size(); j++) {
+
+          ControlNetLogDataProtoV0001_Point_Measure_DataEntry oldData =
+              measureLogData.loggedmeasuredata(j);
+
+          ControlPointFileEntryV0002_Measure_MeasureLogData newData;
+
+          newData.set_doubledatatype( oldData.datatype() );
+          newData.set_doubledatavalue( oldData.datavalue() );
+
+          *newMeasure->add_log() = newData;
+        }
+
+        // Check that all the required fields in the measure are filled
+        if ( !newMeasure->IsInitialized() ) {
+          QString msg = "Measure file entry at index [" + toString(i)
+                        + "] is missing required fields.";
+          throw IException(IException::User, msg, _FILEINFO_);
+        }
+      }
+    }
+
+    // Check that all of the required fields in the point are filled
+    if ( !m_pointData->IsInitialized() ) {
+      QString msg = "Control point file entry is missing required fields.";
+      throw IException(IException::User, msg, _FILEINFO_);
+    }
+  }
+
+
+  /**
+   * Access the protobuf control point data. If there is not internal point data then
+   * default point data is returned. Note that default point data may be missing required
+   * fields.
+   *
+   * @return @b const ControlPointFileEntryV0002& A constant reference to the internal control
+   *                                              point data. There is no guarantee that the point
+   *                                              data is fully initialized.
+   */
+  const ControlPointFileEntryV0002 &ControlPointV0003::pointData() {
+    if (!m_pointData) {
+      m_pointData.reset(new ControlPointFileEntryV0002);
+    }
+
+    return *m_pointData;
+  }
+
+
+  /**
+   * This convenience method takes a boolean value from a PvlKeyword and copies it into a version 2
+   * protobuf field. Once copied, the PvlKeyword is deleted.
+   *
+   * If the keyword doesn't exist, this does nothing.
+   *
+   * @param container The PvlContainer representation of the control point that contains the
+   *                  PvlKeyword.
+   * @param keyName The name of the keyword to be copied.
+   * @param[out] point The version 2 protobuf representation of the control point that the value
+   *                   will be copied into.
+   * @param setter The protobuf mutator method that sets the value of the field in the protobuf
+   *               representation.
+   */
+  void ControlPointV0003::copy(PvlContainer &container,
+                               QString keyName,
+                               QSharedPointer<ControlPointFileEntryV0002> point,
+                               void (ControlPointFileEntryV0002::*setter)(bool)) {
+
+    if (!container.hasKeyword(keyName)) {
+      return;
+    }
+
+    QString value = container[keyName][0];
+    container.deleteKeyword(keyName);
+    value = value.toLower();
+
+    if (value == "true" || value == "yes") {
+      (point.data()->*setter)(true);
+    }
+  }
+
+
+  /**
+   * This convenience method takes a double value from a PvlKeyword and copies it into a version 2
+   * protobuf field. Once copied, the PvlKeyword is deleted.
+   *
+   * If the keyword doesn't exist, this does nothing.
+   *
+   * @param container The PvlContainer representation of the control point that contains the
+   *                  PvlKeyword.
+   * @param keyName The name of the keyword to be copied.
+   * @param[out] point The version 2 protobuf representation of the control point that the value
+   *                   will be copied into.
+   * @param setter The protobuf mutator method that sets the value of the field in the protobuf
+   *               representation.
+   */
+  void ControlPointV0003::copy(PvlContainer &container,
+                               QString keyName,
+                               QSharedPointer<ControlPointFileEntryV0002> point,
+                               void (ControlPointFileEntryV0002::*setter)(double)) {
+
+    if (!container.hasKeyword(keyName)) {
+      return;
+    }
+
+    double value = toDouble(container[keyName][0]);
+    container.deleteKeyword(keyName);
+    (point.data()->*setter)(value);
+  }
+
+
+  /**
+   * This convenience method takes a string value from a PvlKeyword and copies it into a version 2
+   * protobuf field. Once copied, the PvlKeyword is deleted.
+   *
+   * If the keyword doesn't exist, this does nothing.
+   *
+   * @param container The PvlContainer representation of the control point that contains the
+   *                  PvlKeyword.
+   * @param keyName The name of the keyword to be copied.
+   * @param[out] point The version 2 protobuf representation of the control point that the value
+   *                   will be copied into.
+   * @param setter The protobuf mutator method that sets the value of the field in the protobuf
+   *               representation.
+   */
+  void ControlPointV0003::copy(PvlContainer &container,
+                               QString keyName,
+                               QSharedPointer<ControlPointFileEntryV0002> point,
+                               void (ControlPointFileEntryV0002::*setter)(const std::string&)) {
+
+    if (!container.hasKeyword(keyName)) {
+      return;
+    }
+
+    QString value = container[keyName][0];
+    container.deleteKeyword(keyName);
+    (point.data()->*setter)(value.toLatin1().data());
+  }
+
+
+  /**
+   * This convenience method takes a boolean value from a PvlKeyword and copies it into a version 2
+   * protobuf field. Once copied, the PvlKeyword is deleted.
+   *
+   * If the keyword doesn't exist, this does nothing.
+   *
+   * @param container The PvlContainer representation of the control measure that contains the
+   *                  PvlKeyword.
+   * @param keyName The name of the keyword to be copied.
+   * @param[out] measure The version 2 protobuf representation of the control measure that the
+   *                     value will be copied into.
+   * @param setter The protobuf mutator method that sets the value of the field in the protobuf
+   *               representation.
+   */
+  void ControlPointV0003::copy(PvlContainer &container,
+                               QString keyName,
+                               ControlPointFileEntryV0002_Measure &measure,
+                               void (ControlPointFileEntryV0002_Measure::*setter)(bool)) {
+
+    if (!container.hasKeyword(keyName)) {
+      return;
+    }
+
+    QString value = container[keyName][0];
+    container.deleteKeyword(keyName);
+    value = value.toLower();
+
+    if (value == "true" || value == "yes") {
+      (measure.*setter)(true);
+    }
+  }
+
+
+  /**
+   * This convenience method takes a double value from a PvlKeyword and copies it into a version 2
+   * protobuf field. Once copied, the PvlKeyword is deleted.
+   *
+   * If the keyword doesn't exist, this does nothing.
+   *
+   * @param container The PvlContainer representation of the control measure that contains the
+   *                  PvlKeyword.
+   * @param keyName The name of the keyword to be copied.
+   * @param[out] measure The version 2 protobuf representation of the control measure that the
+   *                     value will be copied into.
+   * @param setter The protobuf mutator method that sets the value of the field in the protobuf
+   *               representation.
+   */
+  void ControlPointV0003::copy(PvlContainer &container,
+                               QString keyName,
+                               ControlPointFileEntryV0002_Measure &measure,
+                               void (ControlPointFileEntryV0002_Measure::*setter)(double)) {
+
+    if (!container.hasKeyword(keyName)) {
+      return;
+    }
+
+    double value = toDouble(container[keyName][0]);
+    container.deleteKeyword(keyName);
+    (measure.*setter)(value);
+  }
+
+
+  /**
+   * This convenience method takes a string value from a PvlKeyword and copies it into a version 2
+   * protobuf field. Once copied, the PvlKeyword is deleted.
+   *
+   * If the keyword doesn't exist, this does nothing.
+   *
+   * @param container The PvlContainer representation of the control measure that contains the
+   *                  PvlKeyword.
+   * @param keyName The name of the keyword to be copied.
+   * @param[out] measure The version 2 protobuf representation of the control measure that the
+   *                     value will be into.
+   * @param setter The protobuf mutator method that sets the value of the field in the protobuf
+   *               representation.
+   */
+  void ControlPointV0003::copy(PvlContainer &container,
+                               QString keyName,
+                               ControlPointFileEntryV0002_Measure &measure,
+                               void (ControlPointFileEntryV0002_Measure::*setter)
+                                      (const std::string &)) {
+
+    if (!container.hasKeyword(keyName)) {
+      return;
+    }
+
+    QString value = container[keyName][0];
+    container.deleteKeyword(keyName);
+    (measure.*setter)(value.toLatin1().data());
+  }
+}
diff --git a/isis/src/control/objs/ControlNetVersioner/ControlPointV0003.h b/isis/src/control/objs/ControlNetVersioner/ControlPointV0003.h
new file mode 100644
index 0000000000000000000000000000000000000000..e01ad9b747fa7476e74277e230337f75008b2d75
--- /dev/null
+++ b/isis/src/control/objs/ControlNetVersioner/ControlPointV0003.h
@@ -0,0 +1,234 @@
+#ifndef ControlPointV0003_h
+#define ControlPointV0003_h
+/**
+ * @file
+ * $Revision: 1.9 $
+ * $Date: 2009/07/15 17:33:52 $
+ *
+ *   Unless noted otherwise, the portions of Isis written by the USGS are
+ *   public domain. See individual third-party library and package descriptions
+ *   for intellectual property information, user agreements, and related
+ *   information.
+ *
+ *   Although Isis has been used by the USGS, no warranty, expressed or
+ *   implied, is made by the USGS as to the accuracy and functioning of such
+ *   software and related material nor shall the fact of distribution
+ *   constitute any such warranty, and no responsibility is assumed by the
+ *   USGS in connection therewith.
+ *
+ *   For additional information, launch
+ *   $ISISROOT/doc//documents/Disclaimers/Disclaimers.html
+ *   in a browser or see the Privacy &amp; Disclaimers page on the Isis website,
+ *   http://isis.astrogeology.usgs.gov, and the USGS privacy and disclaimers on
+ *   http://www.usgs.gov/privacy.html.
+ */
+
+#include <QSharedPointer>
+
+#include "ControlPointFileEntryV0002.pb.h"
+
+namespace Isis {
+  class ControlPointV0002;
+  class PvlObject;
+  class PvlContainer;
+
+  /**
+   * @brief A container for the information stored in a version 3 and 4 ControlPoint.
+   *
+   * A wrapper around the version 3 and 4 protobuf serialization of a ControlPoint. It allows for
+   * reading ControlPoints serialized as both PvlObjects and protobuf messages. It also allows
+   * for upgrading version 2 ControlPoints to version 3 and 4 ControlPoints.
+   *
+   * The version 3 and 4 binary serialization of ControlPoint use the same protobuf message, so
+   * this class works with both versions. The difference between the version 3 and 4 Pvl
+   * serializations is Ground and Tie points were renamed to Fixed and Free respectively.
+   * This is sufficiently minor that it is handled in the pvl constructor.
+   *
+   * In the Pvl format, control points are represented by objects contained in the
+   * ControlNetwork object. Control measures are represented by groups
+   * contained in the control point objects.
+   *
+   * <b>Valid Control Point Keywords</b>
+   *
+   * <ul>
+   *   <li><em>PointId:</em> The point ID string</li>
+   *   <li><em>ChooserName:</em> The name of the application or user that last
+   *       modified the point</li>
+   *   <li><em>DateTime:</em> The date and time of the last modification to the
+   *       point</li>
+   *   <li><em>AprioriXYZSource:</em> What type of source the apriori ground
+   *       point was calculated from. Options:
+   *       <ul>
+   *           <li>None</li>
+   *           <li>User</li>
+   *           <li>AverageOfMeasures</li>
+   *           <li>Reference</li>
+   *           <li>Basemap</li>
+   *           <li>BundleSolution</li>
+   *       </ul></li>
+   *   <li><em>AprioriXYZSourceFile:</em> The name of the file that the apriori
+   *       ground point was calculated from</li>
+   *   <li><em>AprioriRadiusSource:</em> What type of source the apriori point
+   *       radius was calculated from. Options:
+   *       <ul>
+   *           <li>None</li>
+   *           <li>User</li>
+   *           <li>AverageOfMeasures</li>
+   *           <li>Ellipsoid</li>
+   *           <li>DEM</li>
+   *           <li>BundleSolution</li>
+   *       </ul></li>
+   *   <li><em>AprioriRadiusSourceFile:</em> The name of the file that the
+   *       apriori point radius was calculated from</li>
+   *   <li><em>JigsawRejected:</em> If the point was rejected by a bundle
+   *       adjustment</li>
+   *   <li><em>EditLock:</em> If the point is locked out of editing</li>
+   *   <li><em>Ignore:</em> If the point will be ignored</li>
+   *   <li><em>AprioriX:</em> The body fixed X coordinate of the a priori
+   *       ground point in meters</li>
+   *   <li><em>AprioriY:</em> The body fixed Y coordinate of the a priori
+   *       ground point in meters</li>
+   *   <li><em>AprioriZ:</em> The body fixed Z coordinate of the a priori
+   *       ground point in meters</li>
+   *   <li><em>AdjustedX:</em> The body fixed X coordinate of the adjusted
+   *       ground point in meters</li>
+   *   <li><em>AdjustedY:</em> The body fixed Y coordinate of the adjusted
+   *       ground point in meters</li>
+   *   <li><em>AdjustedZ:</em> The body fixed Z coordinate of the adjusted
+   *       ground point in meters</li>
+   *   <li><em>LatitudeConstrained:</em> If the latitude of the ground point
+   *       is constrained</li>
+   *   <li><em>LongitudeConstrained:</em> If the longitude of the ground point
+   *       is constrained</li>
+   *   <li><em>RadiusConstrained:</em> If the radius of the ground point
+   *       is constrained</li>
+   *   <li><em>PointType:</em> What type of point it is. Options:
+   *       <ul>
+   *           <li>Fixed</li>
+   *           <li>Ground</li>
+   *           <li>Constrained</li>
+   *           <li>Free</li>
+   *           <li>Tie</li>
+   *       </ul></li>
+   *   <li><em>AprioriCovarianceMatrix:</em> A six element vector corresponding
+   *       to the upper triangle; elements (0,0), (0,1), (0,2), (1,1), (1,2),
+   *       and (2,2); of the 3x3, symmetric covariance matrix for
+   *       the rectangular, a priori ground point.</li>
+   *   <li><em>AdjustedCovarianceMatrix:</em> A six element vector corresponding
+   *       to the upper triangle; elements (0,0), (0,1), (0,2), (1,1), (1,2),
+   *       and (2,2); of the 3x3, symmetric covariance matrix for
+   *       the rectangular, adjusted ground point.</li>
+   * </ul>
+   *
+   * <b>Valid Control Measure Keywords</b>
+   *
+   * <ul>
+   *   <li><em>SerialNumber:</em> The serial number of the cube the measure
+   *       is from</li>
+   *   <li><em>ChooserName:</em> The name of the application or user who last
+   *       modified the measure</li>
+   *   <li><em>DateTime:</em> The date and time of the last modification</li>
+   *   <li><em>Diameter:</em> If the measure was selected from a crater, this
+   *       is the diameter of the crater in meters</li>
+   *   <li><em>EditLock:</em> If the measure is locked out of editing</li>
+   *   <li><em>Ignore:</em> If the measure will be ignored</li>
+   *   <li><em>JigsawRejected:</em> If the measure was rejected during a
+   *       bundle adjustment</li>
+   *   <li><em>AprioriSample:</em> The a priori sample</li>
+   *   <li><em>AprioriLine:</em> The a priori line</li>
+   *   <li><em>SampleSigma:</em> The standard deviation of the sample
+   *       measurement</li>
+   *   <li><em>LineSigma:</em> The standard deviation of the line
+   *       measurement</li>
+   *   <li><em>Sample:</em> The adjusted sample</li>
+   *   <li><em>Line:</em> The adjusted line</li>
+   *   <li><em>SampleResidual:</em> The difference between the a priori and
+   *       adjusted sample</li>
+   *   <li><em>LineResidual:</em> The difference between the a priori and
+   *       adjusted line</li>
+   *   <li><em>Reference:</em> If the measure is the reference measure for
+   *       its point</li>
+   *   <li><em>MeasureType:</em> What type of measure it is. Options:
+   *       <ul>
+   *           <li>candidate</li>
+   *           <li>manual</li>
+   *           <li>registeredpixel</li>
+   *           <li>registeredsubpixel</li>
+   *       </ul></li>
+   * </ul>
+   *
+   * @ingroup ControlNetwork
+   *
+   * @author 2017-12-14 Jesse Mapel
+   *
+   * @internal
+   *   @history 2017-12-14 Jesse Mapel - Original version.
+   *   @history 2017-12-21 Jesse Mapel - Added support for measure log data.
+   *   @history 2017-12-21 Adam Goins - Changed Pvl constructor to take PvlObject.
+   *   @history 2017-12-21 Adam Goins - Changed Pvl constructor to not used
+   *                           the deprecated "ToProtocolBuffer()" call from
+   *                           ControlMeasureLogData.
+   *   @history 2018-01-03 Jesse Mapel - Improved documentation.
+   *   @history 2017-01-27 Jesse Mapel - More documentation improvements.
+   */
+  class ControlPointV0003 {
+    public:
+      ControlPointV0003(PvlObject &pointObject);
+      ControlPointV0003(QSharedPointer<ControlPointFileEntryV0002> pointData);
+      ControlPointV0003(ControlPointV0002 &oldPoint);
+
+      const ControlPointFileEntryV0002 &pointData();
+
+    private:
+      /**
+       * Default constructor. Intentionally un-implemented.
+       */
+      ControlPointV0003();
+      /**
+       * Copy constructor. Intentionally un-implemented.
+       *
+       * @param other The other ControlPointV0003 to copy from.
+       */
+      ControlPointV0003(const ControlPointV0003 &other);
+      /**
+       * Assignment operator. Intentionally un-implemented.
+       *
+       * @param other The other ControlPointV0003 to assign from.
+       *
+       * @return @b ControlPointV0003& A reference to this after assignment.
+       */
+      ControlPointV0003 &operator=(const ControlPointV0003 &other);
+
+      // methods for converting from Pvl to protobuf
+      void copy(PvlContainer &container,
+                QString keyName,
+                QSharedPointer<ControlPointFileEntryV0002> point,
+                void (ControlPointFileEntryV0002::*setter)(bool));
+      void copy(PvlContainer &container,
+                QString keyName,
+                QSharedPointer<ControlPointFileEntryV0002> point,
+                void (ControlPointFileEntryV0002::*setter)(double));
+      void copy(PvlContainer &container,
+                QString keyName,
+                QSharedPointer<ControlPointFileEntryV0002> point,
+                void (ControlPointFileEntryV0002::*setter)(const std::string&));
+      void copy(PvlContainer &container,
+                QString keyName,
+                ControlPointFileEntryV0002_Measure &measure,
+                void (ControlPointFileEntryV0002_Measure::*setter)(bool));
+      void copy(PvlContainer &container,
+                QString keyName,
+                ControlPointFileEntryV0002_Measure &measure,
+                void (ControlPointFileEntryV0002_Measure::*setter)(double));
+      void copy(PvlContainer &container,
+                QString keyName,
+                ControlPointFileEntryV0002_Measure &measure,
+                void (ControlPointFileEntryV0002_Measure::*setter)(const std::string &));
+
+      QSharedPointer<ControlPointFileEntryV0002> m_pointData; /**< protobuf container that holds
+                                                                   information used to create a
+                                                                   control point.*/
+  };
+}
+
+#endif
diff --git a/isis/src/control/objs/ControlNetVersioner/badNetwork.net b/isis/src/control/objs/ControlNetVersioner/badNetwork.net
deleted file mode 100644
index 3b5ed11f2cd249ec1874277c1e2f84c5113ba095..0000000000000000000000000000000000000000
Binary files a/isis/src/control/objs/ControlNetVersioner/badNetwork.net and /dev/null differ
diff --git a/isis/src/control/objs/ControlNetVersioner/oldNetwork.net b/isis/src/control/objs/ControlNetVersioner/oldNetwork.net
deleted file mode 100644
index 8504d74945d40e05fcd3ed0c13b24c30794b501b..0000000000000000000000000000000000000000
--- a/isis/src/control/objs/ControlNetVersioner/oldNetwork.net
+++ /dev/null
@@ -1,52 +0,0 @@
-Object = ControlNetwork
-  NetworkId    = TestNet01
-  NetworkType  = ImageToGround
-  TargetName   = Titan
-  UserName     = bgeorge
-  Created      = Null
-  LastModified = Null
-  Description  = "Test Network"
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = 1001
-    Held      = True
-
-    Group = ControlMeasure
-      SerialNumber   = Cassini-Huygens/ISSNA/1/1467436709.122
-      MeasureType    = ValidatedManual
-      Sample         = 893.0
-      Line           = 616.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      Diameter       = 0.0
-      Reference      = False 
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = Cassini-Huygens/ISSNA/1/1467443189.122
-      MeasureType    = ValidatedManual
-      Reference      = True
-      Sample         = 799.25
-      Line           = 701.21
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      Diameter       = 0.0
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = Cassini-Huygens/ISSNA/1/1467454012.125
-      MeasureType    = ValidatedManual
-      Sample         = 569.01
-      Line           = 807.23
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      Diameter       = 0.0
-      Reference      = False
-    End_Group
-  End_Object
-End_Object
-End
diff --git a/isis/src/control/objs/ControlNetVersioner/oldNetwork2.net b/isis/src/control/objs/ControlNetVersioner/oldNetwork2.net
deleted file mode 100644
index c438423de89d7606b874d93621f274c5a855fb5d..0000000000000000000000000000000000000000
Binary files a/isis/src/control/objs/ControlNetVersioner/oldNetwork2.net and /dev/null differ
diff --git a/isis/src/control/objs/ControlNetVersioner/reallyOldNetwork.net b/isis/src/control/objs/ControlNetVersioner/reallyOldNetwork.net
deleted file mode 100644
index 3be685465ad35f14981a15632744413e7c3b0989..0000000000000000000000000000000000000000
--- a/isis/src/control/objs/ControlNetVersioner/reallyOldNetwork.net
+++ /dev/null
@@ -1,191 +0,0 @@
-Object = ControlNetwork
-  NetworkId    = ""
-  NetworkType  = ImageToImage
-  TargetName   = ""
-  UserName     = ""
-  Created      = ""
-  LastModified = ""
-  Description  = ""
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = "1"
-
-    Group = ControlMeasure
-      SerialNumber   = "M0"
-      MeasureType    = Unmeasured 
-      Sample         = NULL
-      Line           = Null
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = "M1"
-      MeasureType    = Estimated
-      Sample         = 1
-      Line           = 1
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = ""
-      ChooserName    = ""
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = "M2"
-      MeasureType    = Estimated
-      Sample         = 1
-      Line           = 1
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = ""
-      ChooserName    = ""
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = "2"
-
-    Group = ControlMeasure
-      SerialNumber   = "M1"
-      MeasureType    = Estimated
-      Sample         = 100
-      Line           = 1
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = ""
-      ChooserName    = ""
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = "M2"
-      MeasureType    = Estimated
-      Sample         = 1000
-      Line           = 1
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = ""
-      ChooserName    = ""
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = "3"
-
-    Group = ControlMeasure
-      SerialNumber   = "M1"
-      MeasureType    = Estimated
-      Sample         = 1
-      Line           = 500
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = ""
-      ChooserName    = ""
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = "M2"
-      MeasureType    = Estimated
-      Sample         = 250
-      Line           = 500
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = ""
-      ChooserName    = ""
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = "4"
-
-    Group = ControlMeasure
-      SerialNumber   = "M1"
-      MeasureType    = Estimated
-      Sample         = 100
-      Line           = 500
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = ""
-      ChooserName    = ""
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = "M2"
-      MeasureType    = Estimated
-      Sample         = 750
-      Line           = 500
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = ""
-      ChooserName    = ""
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = "5"
-
-    Group = ControlMeasure
-      SerialNumber   = "M1"
-      MeasureType    = Estimated
-      Sample         = 1
-      Line           = 1000
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = ""
-      ChooserName    = ""
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = "M2"
-      MeasureType    = Estimated
-      Sample         = 1
-      Line           = 1000
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = ""
-      ChooserName    = ""
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = "6"
-
-    Group = ControlMeasure
-      SerialNumber   = "M1"
-      MeasureType    = Estimated
-      Sample         = 100
-      Line           = 1000
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = ""
-      ChooserName    = ""
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = "M2"
-      MeasureType    = Estimated
-      Sample         = 1000
-      Line           = 1000
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = ""
-      ChooserName    = ""
-    End_Group
-  End_Object
- End_Object
-End
diff --git a/isis/src/control/objs/ControlNetVersioner/reallyOldNetwork2.net b/isis/src/control/objs/ControlNetVersioner/reallyOldNetwork2.net
deleted file mode 100644
index 711bbbfab906db9b29a7f744c2444eb68ea3e285..0000000000000000000000000000000000000000
--- a/isis/src/control/objs/ControlNetVersioner/reallyOldNetwork2.net
+++ /dev/null
@@ -1,46 +0,0 @@
-Object = ControlNetwork
-  NetworkId    = ""
-  NetworkType  = ImageToImage
-  TargetName   = "MRO/SomeHiRiseSerialNumber/..."
-  UserName     = ""
-  Created      = ""
-  LastModified = ""
-  Description  = ""
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = "1"
-
-    Group = ControlMeasure
-      SerialNumber   = "M0"
-      MeasureType    = Unmeasured 
-      Sample         = NULL
-      Line           = Null
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = "M1"
-      MeasureType    = Estimated
-      Sample         = 1
-      Line           = 1
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = ""
-      ChooserName    = ""
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = "M2"
-      MeasureType    = Estimated
-      Sample         = 1
-      Line           = 1
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = ""
-      ChooserName    = ""
-    End_Group
-  End_Object
-End_Object
-End
diff --git a/isis/src/control/objs/ControlNetVersioner/reallyOldNetwork2.pvl.net b/isis/src/control/objs/ControlNetVersioner/reallyOldNetwork2.pvl.net
deleted file mode 100644
index 14d23025bd8effe19d0b60b648efc81a1850eea1..0000000000000000000000000000000000000000
--- a/isis/src/control/objs/ControlNetVersioner/reallyOldNetwork2.pvl.net
+++ /dev/null
@@ -1,159 +0,0 @@
-Object = ControlNetwork
-  NetworkId    = Test
-  TargetName   = Mars
-  UserName     = TSucharski
-  Created      = 2010-07-10T12:50:15
-  LastModified = 2010-07-10T12:50:55
-  Description  = "UnitTest of ControlNetwork"
-
-  Object = ControlPoint
-    PointType               = Ground
-    PointId                 = T0000
-    ChooserName             = autoseed
-    DateTime                = 2010-08-27T17:10:06
-    EditLock                = True
-    AprioriXYZSource        = Basemap
-    AprioriXYZSourceFile    = /work1/tsucharski/basemap.cub
-    AprioriRadiusSource     = DEM
-    AprioriRadiusSourceFile = $base/dems/molaMarsPlanetaryRadius0003.cub
-    AprioriX                = -424.024048 <meters>
-    AprioriY                = 734.4311949 <meters>
-    AprioriZ                = 529.919264 <meters>
-    AprioriCovarianceMatrix = (100.0, 0.0, 0.0, 2500.0, 0.0, 400.0)
-    X                       = -424.024048 <meters>
-    Y                       = 734.4311949 <meters>
-    Z                       = 529.919264 <meters>
-    ApostCovarianceMatrix   = (100.0, 0.0, 0.0, 2500.0, 0.0, 400.0)
-
-    Group = ControlMeasure
-      SerialNumber = id0
-      MeasureType  = Candidate 
-      ChooserName  = cnetref
-      DateTime     = 2010-08-27T17:10:06
-      EditLock     = True
-      Sample       = 0.0
-      Line         = 0.0
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = id1
-      MeasureType    = Candidate
-      ChooserName    = autoseed
-      DateTime       = 2010-08-27T17:10:06
-      Ignore         = True
-      Sample         = 1.0
-      Line           = 2.0
-      Diameter       = 15.0
-      AprioriSample  = 2.0
-      AprioriLine    = 5.0
-      SampleSigma    = 0.01 <pixels>
-      LineSigma      = 0.21 <pixels>
-      SampleResidual = -3.0 <pixels>
-      LineResidual   = 4.0 <pixels>
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType   = Tie
-    PointId     = T0001
-    ChooserName = autoseed
-    DateTime    = 2010-08-27T17:10:06
-    Ignore      = True
-
-    Group = ControlMeasure
-      SerialNumber = id0
-      MeasureType  = Candidate 
-      ChooserName  = cnetref
-      DateTime     = 2010-08-27T17:10:06
-      EditLock     = True
-      Sample       = 0.0
-      Line         = 0.0
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = id1
-      MeasureType    = Candidate
-      ChooserName    = autoseed
-      DateTime       = 2010-08-27T17:10:06
-      Ignore         = True
-      Sample         = 1.0
-      Line           = 2.0
-      Diameter       = 15.0
-      AprioriSample  = 2.0
-      AprioriLine    = 5.0
-      SampleSigma    = 0.01 <pixels>
-      LineSigma      = 0.21 <pixels>
-      SampleResidual = -3.0 <pixels>
-      LineResidual   = 4.0 <pixels>
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType   = Tie
-    PointId     = T0003
-    ChooserName = autoseed
-    DateTime    = 2010-08-27T17:10:06
-
-    Group = ControlMeasure
-      SerialNumber = id0
-      MeasureType  = Candidate 
-      ChooserName  = cnetref
-      DateTime     = 2010-08-27T17:10:06
-      EditLock     = True
-      Sample       = 0.0
-      Line         = 0.0
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = id1
-      MeasureType    = Candidate
-      ChooserName    = autoseed
-      DateTime       = 2010-08-27T17:10:06
-      Ignore         = True
-      Sample         = 1.0
-      Line           = 2.0
-      Diameter       = 15.0
-      AprioriSample  = 2.0
-      AprioriLine    = 5.0
-      SampleSigma    = 0.01 <pixels>
-      LineSigma      = 0.21 <pixels>
-      SampleResidual = -3.0 <pixels>
-      LineResidual   = 4.0 <pixels>
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType   = Tie
-    PointId     = T0004
-    ChooserName = autoseed
-    DateTime    = 2010-08-27T17:10:06
-
-    Group = ControlMeasure
-      SerialNumber = id0
-      MeasureType  = Candidate 
-      ChooserName  = cnetref
-      DateTime     = 2010-08-27T17:10:06
-      EditLock     = True
-      Sample       = 0.0
-      Line         = 0.0
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = id1
-      MeasureType    = Candidate
-      ChooserName    = autoseed
-      DateTime       = 2010-08-27T17:10:06
-      Ignore         = True
-      Sample         = 1.0
-      Line           = 2.0
-      Diameter       = 15.0
-      AprioriSample  = 2.0
-      AprioriLine    = 5.0
-      SampleSigma    = 0.01 <pixels>
-      LineSigma      = 0.21 <pixels>
-      SampleResidual = -3.0 <pixels>
-      LineResidual   = 4.0 <pixels>
-    End_Group
-  End_Object
-End_Object
-End
diff --git a/isis/src/control/objs/ControlNetVersioner/semilarge.net b/isis/src/control/objs/ControlNetVersioner/semilarge.net
deleted file mode 100644
index b1bb5a7839dfa91d91e16f219fe70234efdf001e..0000000000000000000000000000000000000000
Binary files a/isis/src/control/objs/ControlNetVersioner/semilarge.net and /dev/null differ
diff --git a/isis/src/control/objs/ControlNetVersioner/semilarge.pvl.net b/isis/src/control/objs/ControlNetVersioner/semilarge.pvl.net
deleted file mode 100644
index b6a8e25a048c0e77ecb21d380af6572e46f46b29..0000000000000000000000000000000000000000
--- a/isis/src/control/objs/ControlNetVersioner/semilarge.pvl.net
+++ /dev/null
@@ -1,10000 +0,0 @@
-Object = ControlNetwork
-  NetworkId    = LROC_NAC_LRPAIR_AUTO
-  NetworkType  = ImageToGround
-  TargetName   = MOON
-  UserName     = lweller
-  Created      = 2011-03-29T16:51:31
-  LastModified = 2011-03-29T16:51:31
-  Description  = "LROC NAC LEFT-RIGHT PAIR AUTOSEED NETWORK"
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_001
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 31.0
-      Line           = 281.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:08
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2471.5928559749
-      Line           = 234.82656356672
-      ErrorLine      = -6.7465155264759
-      ErrorSample    = 1.2354620728888
-      ErrorMagnitude = 6.8587052920013
-      ZScore         = (-4.0818936852491, 3.9296700970244)
-      DateTime       = 2011-03-25T17:57:17
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.80230531562529
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277164494:04377/NACR
-      MeasureType    = Automatic
-      Sample         = 1428.0595023276
-      Line           = 5347.6742911586
-      ErrorLine      = -10.731284210308
-      ErrorSample    = -13.651644019019
-      ErrorMagnitude = 17.364557156012
-      ZScore         = (-1.4334508480517, 7.817476740004)
-      DateTime       = 2011-03-26T01:18:36
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.28247019891842
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277184863:36490/NACR
-      MeasureType    = Automatic
-      Sample         = 764.58730983931
-      Line           = 5157.2529041914
-      ErrorLine      = -10.226813962273
-      ErrorSample    = -13.989791364823
-      ErrorMagnitude = 17.329223475108
-      ZScore         = (-1.4334508480517, 7.817476740004)
-      DateTime       = 2011-03-26T01:18:40
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.29902156131811
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 204.51224795061
-      Line           = 3380.0609826149
-      ErrorLine      = -11.828162113779
-      ErrorSample    = -13.220084435594
-      ErrorMagnitude = 17.73911078589
-      ZScore         = (-1.4334508480517, 7.817476740004)
-      DateTime       = 2011-03-26T01:18:44
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.33245474419073
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 2029.1230266919
-      Line           = 4253.3362397764
-      ErrorLine      = -4.6841548177608
-      ErrorSample    = -4.7126582893309
-      ErrorMagnitude = 6.6445808377016
-      ZScore         = (-1.4334508480517, 7.817476740004)
-      DateTime       = 2011-03-26T01:18:50
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.34459442043681
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277245961:32558/NACL
-      MeasureType    = Automatic
-      Sample         = 1306.8911929966
-      Line           = 3565.6165416615
-      ErrorLine      = -3.2883818655041
-      ErrorSample    = -4.8812468085441
-      ErrorMagnitude = 5.8855777710687
-      ZScore         = (-1.4334508480517, 7.817476740004)
-      DateTime       = 2011-03-26T01:18:53
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.36265834341793
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277266323:25349/NACL
-      MeasureType    = Automatic
-      Sample         = 673.95661553499
-      Line           = 4323.7157694382
-      ErrorLine      = -2.6302200607979
-      ErrorSample    = -5.5229990085409
-      ErrorMagnitude = 6.1173176815143
-      ZScore         = (-1.4334508480517, 7.817476740004)
-      DateTime       = 2011-03-26T01:18:57
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.37271229727776
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/285452254:35179/NACL
-      MeasureType    = Automatic
-      Sample         = 1351.6875730258
-      Line           = 40799.326853459
-      ErrorLine      = -4.8864522893709
-      ErrorSample    = 11.720138102968
-      ErrorMagnitude = 12.697994059258
-      ZScore         = (-1.4334508480517, 7.817476740004)
-      DateTime       = 2011-03-26T01:19:02
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.42182915005833
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 1286.2071765986
-      Line           = 41450.607002243
-      ErrorLine      = -5.9311590258658
-      ErrorSample    = 35.13402542994
-      ErrorMagnitude = 35.631143544683
-      ZScore         = (-1.4334508480517, 7.817476740004)
-      DateTime       = 2011-03-26T01:19:06
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.49996681408538
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/292537538:63360/NACR
-      MeasureType    = Automatic
-      Sample         = 2442.0126522959
-      Line           = 7752.7554554516
-      ErrorLine      = 17.486349085773
-      ErrorSample    = -13.225303598871
-      ErrorMagnitude = 21.924439779201
-      ZScore         = (-1.4334508480517, 7.817476740004)
-      DateTime       = 2011-03-26T01:19:10
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.46789632277796
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300686942:48419/NACL
-      MeasureType    = Automatic
-      Sample         = 739.36894855378
-      Line           = 9677.9220498208
-      ErrorLine      = -15.617261249083
-      ErrorSample    = 17.191319043872
-      ErrorMagnitude = 23.22585411541
-      ZScore         = (-1.4334508480517, 7.817476740004)
-      DateTime       = 2011-03-26T01:19:13
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.40819256634222
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300700514:53662/NACR
-      MeasureType    = Automatic
-      Sample         = 333.86942728104
-      Line           = 7586.0085656547
-      ErrorLine      = -4.8115814691055
-      ErrorSample    = 16.624581624395
-      ErrorMagnitude = 17.306878124607
-      ZScore         = (-1.4334508480517, 7.817476740004)
-      DateTime       = 2011-03-26T01:19:18
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.40478177047589
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305389100:01888/NACL
-      MeasureType    = Automatic
-      Sample         = 719.58451301085
-      Line           = 11529.072485229
-      ErrorLine      = -42.043574567375
-      ErrorSample    = 7.5149994743467
-      ErrorMagnitude = 42.709921323995
-      ZScore         = (-1.4334508480517, 7.817476740004)
-      DateTime       = 2011-03-26T01:19:23
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.38318772347702
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305409449:44487/NACR
-      MeasureType    = Automatic
-      Sample         = 945.07837326052
-      Line           = 11055.596164828
-      ErrorLine      = -38.880059453973
-      ErrorSample    = -2.0135170375601
-      ErrorMagnitude = 38.932162462481
-      ZScore         = (-1.4334508480517, 7.817476740004)
-      DateTime       = 2011-03-26T01:19:28
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.4181907469856
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_002
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Estimated
-      Sample         = 2503.0
-      Line           = 375.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:08
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Automatic
-      Sample         = 63.202406706247
-      Line           = 421.3735149814
-      ErrorLine      = 6.5907346067902
-      ErrorSample    = -1.9326222003612
-      ErrorMagnitude = 6.8682465903949
-      ZScore         = (-1.0403962891144, 3.5240361109166)
-      DateTime       = 2011-03-25T17:57:17
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.94299232621108
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277164494:04377/NACR
-      MeasureType    = Automatic
-      Sample         = 1331.1177002898
-      Line           = 5431.0367462628
-      ErrorLine      = 51.99287989489
-      ErrorSample    = 77.171414903467
-      ErrorMagnitude = 93.052065199906
-      ZScore         = (-0.6940888588304, 11.791506816892)
-      DateTime       = 2011-03-26T01:19:31
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.45147703196028
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277245961:32558/NACL
-      MeasureType    = Automatic
-      Sample         = 1045.8305155109
-      Line           = 3654.3108047352
-      ErrorLine      = 50.222033943674
-      ErrorSample    = 196.28384193343
-      ErrorMagnitude = 202.60700702983
-      ZScore         = (-0.79381016125087, 7.6117404741451)
-      DateTime       = 2011-03-26T03:00:02
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.44181413230399
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277266323:25349/NACL
-      MeasureType    = Automatic
-      Sample         = 463.5681135097
-      Line           = 4409.9746597719
-      ErrorLine      = 51.195177577243
-      ErrorSample    = 131.37801728602
-      ErrorMagnitude = 141.00045969135
-      ZScore         = (-0.79381016125087, 7.6117404741451)
-      DateTime       = 2011-03-26T03:00:10
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.47264165757952
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/285452254:35179/NACL
-      MeasureType    = Automatic
-      Sample         = 956.95326242736
-      Line           = 39928.368370251
-      ErrorLine      = 723.41380215886
-      ErrorSample    = 441.99583169114
-      ErrorMagnitude = 847.75458971702
-      ZScore         = (-0.79381016125087, 7.6117404741451)
-      DateTime       = 2011-03-26T03:00:20
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.43751463507579
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 1333.548087544
-      Line           = 41314.886714183
-      ErrorLine      = -12.330329958349
-      ErrorSample    = 32.760439737577
-      ErrorMagnitude = 35.004049032664
-      ZScore         = (-0.6940888588304, 11.791506816892)
-      DateTime       = 2011-03-26T01:19:43
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.38441332070124
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/292537538:63360/NACR
-      MeasureType    = Automatic
-      Sample         = 2395.2578847644
-      Line           = 7616.4760842645
-      ErrorLine      = 11.36924147118
-      ErrorSample    = -10.454714455762
-      ErrorMagnitude = 15.44541051515
-      ZScore         = (-0.6940888588304, 11.791506816892)
-      DateTime       = 2011-03-26T01:19:45
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.48876168252082
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300686942:48419/NACL
-      MeasureType    = Automatic
-      Sample         = 514.07356611605
-      Line           = 9938.5107995618
-      ErrorLine      = -31.238946549392
-      ErrorSample    = 197.58020652784
-      ErrorMagnitude = 200.03452150341
-      ZScore         = (-0.6940888588304, 11.791506816892)
-      DateTime       = 2011-03-26T01:19:48
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.39510238676303
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300700514:53662/NACR
-      MeasureType    = Automatic
-      Sample         = 301.11827438919
-      Line           = 7822.400497151
-      ErrorLine      = 5.1564192702408
-      ErrorSample    = 11.850913814415
-      ErrorMagnitude = 12.92411768467
-      ZScore         = (-0.6940888588304, 11.791506816892)
-      DateTime       = 2011-03-26T01:19:51
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.33143880711668
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305389100:01888/NACL
-      MeasureType    = Automatic
-      Sample         = 669.15527926883
-      Line           = 11761.584043484
-      ErrorLine      = -31.712265014185
-      ErrorSample    = 1.7487166141684
-      ErrorMagnitude = 31.760443355321
-      ZScore         = (-0.6940888588304, 11.791506816892)
-      DateTime       = 2011-03-26T01:19:54
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.52116576143453
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305409449:44487/NACR
-      MeasureType    = Automatic
-      Sample         = 906.03231138589
-      Line           = 11290.045530584
-      ErrorLine      = -27.838748854489
-      ErrorSample    = -7.0823617803853
-      ErrorMagnitude = 28.725524993837
-      ZScore         = (-0.6940888588304, 11.791506816892)
-      DateTime       = 2011-03-26T01:19:58
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.59154237261464
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_004
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 31.0
-      Line           = 975.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:08
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2471.6438390593
-      Line           = 928.75664035754
-      ErrorLine      = -6.707723634784
-      ErrorSample    = 1.210222815665
-      ErrorMagnitude = 6.8160249137012
-      ZScore         = (-2.8334154224735, 2.3302286661136)
-      DateTime       = 2011-03-25T17:57:17
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.90515842760976
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277164494:04377/NACR
-      MeasureType    = Automatic
-      Sample         = 1572.8542509862
-      Line           = 6026.3893635603
-      ErrorLine      = -10.628534070934
-      ErrorSample    = -13.450749035354
-      ErrorMagnitude = 17.143173163364
-      ZScore         = (-1.0457852313339, 8.9197995707664)
-      DateTime       = 2011-03-26T01:20:01
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.58679856768413
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277184863:36490/NACR
-      MeasureType    = Automatic
-      Sample         = 841.96607179066
-      Line           = 5839.4983610768
-      ErrorLine      = -10.194723770043
-      ErrorSample    = -13.688809587711
-      ErrorMagnitude = 17.067978810512
-      ZScore         = (-1.0457852313339, 8.9197995707664)
-      DateTime       = 2011-03-26T01:20:03
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.60304153145626
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 214.18754212158
-      Line           = 4064.6873642004
-      ErrorLine      = -11.847505844998
-      ErrorSample    = -13.364800476066
-      ErrorMagnitude = 17.860047214728
-      ZScore         = (-1.0457852313339, 8.9197995707664)
-      DateTime       = 2011-03-26T01:20:06
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.61784521396839
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 1973.2303332507
-      Line           = 4937.2990237392
-      ErrorLine      = -4.2587099454631
-      ErrorSample    = -5.3688523602307
-      ErrorMagnitude = 6.8528232186115
-      ZScore         = (-1.0457852313339, 8.9197995707664)
-      DateTime       = 2011-03-26T01:20:09
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.61866432421721
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277245961:32558/NACL
-      MeasureType    = Automatic
-      Sample         = 1186.4272642957
-      Line           = 4246.8397891831
-      ErrorLine      = -3.109980374029
-      ErrorSample    = -5.5607631312034
-      ErrorMagnitude = 6.3713471517566
-      ZScore         = (-1.0457852313339, 8.9197995707664)
-      DateTime       = 2011-03-26T01:20:13
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.63235500527662
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277266323:25349/NACL
-      MeasureType    = Automatic
-      Sample         = 487.94754147602
-      Line           = 4999.836209585
-      ErrorLine      = -2.42358866017
-      ErrorSample    = -6.67672439649
-      ErrorMagnitude = 7.1029874461658
-      ZScore         = (-1.0457852313339, 8.9197995707664)
-      DateTime       = 2011-03-26T01:20:16
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.62927631687307
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/285452254:35179/NACL
-      MeasureType    = Automatic
-      Sample         = 1269.9105983548
-      Line           = 40129.937355093
-      ErrorLine      = -4.7935389854028
-      ErrorSample    = 10.298282956429
-      ErrorMagnitude = 11.359253842364
-      ZScore         = (-1.0457852313339, 8.9197995707664)
-      DateTime       = 2011-03-26T01:20:19
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.51960455791777
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 1251.1087329742
-      Line           = 40781.27717549
-      ErrorLine      = -5.9225874114709
-      ErrorSample    = 35.270347252916
-      ErrorMagnitude = 35.764150164484
-      ZScore         = (-1.0457852313339, 8.9197995707664)
-      DateTime       = 2011-03-26T01:20:23
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.63493424988337
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/292537538:63360/NACR
-      MeasureType    = Automatic
-      Sample         = 2492.0359930826
-      Line           = 7083.1194575658
-      ErrorLine      = 17.514495267843
-      ErrorSample    = -12.519446486336
-      ErrorMagnitude = 21.528912764269
-      ZScore         = (-1.0457852313339, 8.9197995707664)
-      DateTime       = 2011-03-26T01:20:25
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.60616141812352
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300686942:48419/NACL
-      MeasureType    = Automatic
-      Sample         = 359.44189779041
-      Line           = 10786.066201185
-      ErrorLine      = -16.934693964737
-      ErrorSample    = 15.679002190219
-      ErrorMagnitude = 23.078452490585
-      ZScore         = (-1.0457852313339, 8.9197995707664)
-      DateTime       = 2011-03-26T01:20:28
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.51255418622623
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300700514:53662/NACL
-      MeasureType    = Automatic
-      Sample         = 2428.8721955158
-      Line           = 8637.6853571906
-      ErrorLine      = -9.4925417747545
-      ErrorSample    = 17.428321351317
-      ErrorMagnitude = 19.845773718105
-      ZScore         = (-1.0457852313339, 8.9197995707664)
-      DateTime       = 2011-03-26T01:20:32
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.51109433833244
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305389100:01888/NACL
-      MeasureType    = Automatic
-      Sample         = 287.62242683195
-      Line           = 12621.170766693
-      ErrorLine      = -43.864203744411
-      ErrorSample    = 6.4071212733505
-      ErrorMagnitude = 44.329669219865
-      ZScore         = (-1.0457852313339, 8.9197995707664)
-      DateTime       = 2011-03-26T01:20:36
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.55528061130099
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305409449:44487/NACR
-      MeasureType    = Automatic
-      Sample         = 573.16117028106
-      Line           = 12165.309683702
-      ErrorLine      = -37.671568436399
-      ErrorSample    = -2.3297447455726
-      ErrorMagnitude = 37.743539566896
-      ZScore         = (-1.0457852313339, 8.9197995707664)
-      DateTime       = 2011-03-26T01:20:39
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.56854549860509
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_005
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 59.0
-      Line           = 1238.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:09
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2499.6580875704
-      Line           = 1191.7986841464
-      ErrorLine      = -6.9362596524511
-      ErrorSample    = 1.0629599624094
-      ErrorMagnitude = 7.0172346296747
-      ZScore         = (-1.3850487337374, 1.7701867435504)
-      DateTime       = 2011-03-25T17:57:17
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.98681328615322
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 660.21535523156
-      Line           = 224.4184740357
-      ErrorLine      = -0.90918664719226
-      ErrorSample    = 0.0097984572048517
-      ErrorMagnitude = 0.90923944546874
-      ZScore         = (-0.78943798989514, 10.3237165344)
-      DateTime       = 2011-03-26T01:20:42
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.70283344736436
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277164494:04377/NACR
-      MeasureType    = Automatic
-      Sample         = 1446.1692306882
-      Line           = 6229.5104300469
-      ErrorLine      = 45.422842164662
-      ErrorSample    = 131.44617090325
-      ErrorMagnitude = 139.0731118349
-      ZScore         = (-0.78943798989514, 10.3237165344)
-      DateTime       = 2011-03-26T01:20:44
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.44893884676299
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 185.11123070796
-      Line           = 4324.2413863729
-      ErrorLine      = -12.081373760924
-      ErrorSample    = -13.183268169707
-      ErrorMagnitude = 17.881782673591
-      ZScore         = (-0.78943798989514, 10.3237165344)
-      DateTime       = 2011-03-26T01:20:48
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.44495580301918
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 1921.4006262882
-      Line           = 5195.5927173654
-      ErrorLine      = -4.2220975385762
-      ErrorSample    = -4.7309793583015
-      ErrorMagnitude = 6.3409993939383
-      ZScore         = (-0.78943798989514, 10.3237165344)
-      DateTime       = 2011-03-26T01:20:51
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.51618261518706
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277245961:32558/NACL
-      MeasureType    = Automatic
-      Sample         = 1112.3418503538
-      Line           = 4502.932741842
-      ErrorLine      = -2.9806608061153
-      ErrorSample    = -4.6003638341854
-      ErrorMagnitude = 5.4815769855027
-      ZScore         = (-0.78943798989514, 10.3237165344)
-      DateTime       = 2011-03-26T01:20:54
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.6055926123845
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277266323:25349/NACL
-      MeasureType    = Automatic
-      Sample         = 390.55811824233
-      Line           = 5252.9994613986
-      ErrorLine      = -2.2683995996931
-      ErrorSample    = -5.5963076209376
-      ErrorMagnitude = 6.0385673575818
-      ZScore         = (-0.78943798989514, 10.3237165344)
-      DateTime       = 2011-03-26T01:20:57
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.67473224099558
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/285452254:35179/NACL
-      MeasureType    = Automatic
-      Sample         = 1290.3540143997
-      Line           = 39875.627384794
-      ErrorLine      = -4.828620170163
-      ErrorSample    = 11.521998459644
-      ErrorMagnitude = 12.492878821622
-      ZScore         = (-0.78943798989514, 10.3237165344)
-      DateTime       = 2011-03-26T01:21:01
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.52395137074654
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 1282.5727647302
-      Line           = 40527.425894329
-      ErrorLine      = -6.0243285864271
-      ErrorSample    = 34.710991719864
-      ErrorMagnitude = 35.229894707389
-      ZScore         = (-0.78943798989514, 10.3237165344)
-      DateTime       = 2011-03-26T01:21:05
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.43092975110994
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/292537538:63360/NACR
-      MeasureType    = Automatic
-      Sample         = 2393.9479228534
-      Line           = 6678.0412742439
-      ErrorLine      = 168.57094192492
-      ErrorSample    = 47.21599152453
-      ErrorMagnitude = 175.05859681004
-      ZScore         = (-0.78943798989514, 10.3237165344)
-      DateTime       = 2011-03-26T01:21:08
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.40540807204184
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300686942:48419/NACL
-      MeasureType    = Automatic
-      Sample         = 252.2339510676
-      Line           = 11215.515331156
-      ErrorLine      = -17.513587117406
-      ErrorSample    = 16.839694140519
-      ErrorMagnitude = 24.296111467994
-      ZScore         = (-0.78943798989514, 10.3237165344)
-      DateTime       = 2011-03-26T01:21:12
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.44286060631657
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300700514:53662/NACL
-      MeasureType    = Automatic
-      Sample         = 2331.6672883631
-      Line           = 9070.2892201759
-      ErrorLine      = -9.727809304919
-      ErrorSample    = 17.491200921727
-      ErrorMagnitude = 20.014304473478
-      ZScore         = (-0.78943798989514, 10.3237165344)
-      DateTime       = 2011-03-26T01:21:16
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.45295733971034
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305409449:44487/NACR
-      MeasureType    = Automatic
-      Sample         = 463.48025917773
-      Line           = 12595.404450074
-      ErrorLine      = -37.594881060231
-      ErrorSample    = -2.5437861810381
-      ErrorMagnitude = 37.680843011639
-      ZScore         = (-0.78943798989514, 10.3237165344)
-      DateTime       = 2011-03-26T01:21:19
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.62161850103166
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_013
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 31.0
-      Line           = 3357.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:10
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2471.6707293902
-      Line           = 3310.8281998381
-      ErrorLine      = -6.8769500130629
-      ErrorSample    = 1.1346049677995
-      ErrorMagnitude = 6.9699189317467
-      ZScore         = (-0.98363155233126, 4.3565056562141)
-      DateTime       = 2011-03-25T17:57:17
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.9582661934113
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 802.10197088688
-      Line           = 2342.41846577
-      ErrorLine      = -0.94484958334715
-      ErrorSample    = -0.045805056700829
-      ErrorMagnitude = 0.94595921601867
-      ZScore         = (-0.76172487310619, 10.572161909987)
-      DateTime       = 2011-03-26T01:21:22
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.75492353044865
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274888710:05688/NACR
-      MeasureType    = Automatic
-      Sample         = 1677.9216558608
-      Line           = 1595.9272625274
-      ErrorLine      = -1.2660847420293
-      ErrorSample    = -0.50534643631113
-      ErrorMagnitude = 1.3632115003519
-      ZScore         = (-0.76172487310619, 10.572161909987)
-      DateTime       = 2011-03-26T01:21:26
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.73716994276492
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274909074:43699/NACR
-      MeasureType    = Automatic
-      Sample         = 2375.0308532449
-      Line           = 559.59314162304
-      ErrorLine      = 1.7145070273818
-      ErrorSample    = 98.865263153927
-      ErrorMagnitude = 98.880128402233
-      ZScore         = (-0.76172487310619, 10.572161909987)
-      DateTime       = 2011-03-26T01:21:29
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.39885718528848
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277184863:36490/NACR
-      MeasureType    = Automatic
-      Sample         = 1195.0165512634
-      Line           = 8141.8184530582
-      ErrorLine      = 29.476628674612
-      ErrorSample    = -101.7526976172
-      ErrorMagnitude = 105.93622189977
-      ZScore         = (-0.76172487310619, 10.572161909987)
-      DateTime       = 2011-03-26T01:21:33
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.39644289877731
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 1780.4908372138
-      Line           = 7286.3483646644
-      ErrorLine      = -4.2467978862196
-      ErrorSample    = -5.2843546261947
-      ErrorMagnitude = 6.7793580892135
-      ZScore         = (-0.76172487310619, 10.572161909987)
-      DateTime       = 2011-03-26T01:21:36
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.41231746984886
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 1131.8975958752
-      Line           = 38483.567280737
-      ErrorLine      = -5.9325585366387
-      ErrorSample    = 34.990018688157
-      ErrorMagnitude = 35.489387971452
-      ZScore         = (-0.76172487310619, 10.572161909987)
-      DateTime       = 2011-03-26T01:21:44
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.46715546098767
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305409449:44487/NACL
-      MeasureType    = Automatic
-      Sample         = 1736.3360299075
-      Line           = 15915.617978298
-      ErrorLine      = -47.074196103076
-      ErrorSample    = -2.6652678320306
-      ErrorMagnitude = 47.149587393394
-      ZScore         = (-0.76172487310619, 10.572161909987)
-      DateTime       = 2011-03-26T01:21:48
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.66190538102546
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305423011:64885/NACR
-      MeasureType    = Automatic
-      Sample         = 1593.2516707571
-      Line           = 22050.042438487
-      ErrorLine      = -43.615826442023
-      ErrorSample    = -6.2113248022531
-      ErrorMagnitude = 44.055883511964
-      ZScore         = (-0.76172487310619, 10.572161909987)
-      DateTime       = 2011-03-26T01:21:53
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.67202724707204
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_015
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 31.0
-      Line           = 3835.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:11
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2471.6497578615
-      Line           = 3788.7622745373
-      ErrorLine      = -6.8243551361707
-      ErrorSample    = 1.1832933456553
-      ErrorMagnitude = 6.9261826547133
-      ZScore         = (-2.1144009000713, 3.1970623087416)
-      DateTime       = 2011-03-25T17:57:18
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.84285710154495
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 840.0719344741
-      Line           = 2820.045697489
-      ErrorLine      = -1.0401973135881
-      ErrorSample    = 0.094987845664605
-      ErrorMagnitude = 1.0445253189942
-      ZScore         = (-1.3990173078705, 7.1469743677947)
-      DateTime       = 2011-03-26T01:21:56
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.56789250743714
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274888710:05688/NACR
-      MeasureType    = Automatic
-      Sample         = 1753.8197568431
-      Line           = 2071.6654211833
-      ErrorLine      = -1.8702114546659
-      ErrorSample    = -0.29048758305953
-      ErrorMagnitude = 1.8926367641667
-      ZScore         = (-1.3990173078705, 7.1469743677947)
-      DateTime       = 2011-03-26T01:22:00
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.56248544402297
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277245961:32558/NACL
-      MeasureType    = Automatic
-      Sample         = 688.64499945052
-      Line           = 7053.156783435
-      ErrorLine      = -1.1674561240616
-      ErrorSample    = -6.2063101260372
-      ErrorMagnitude = 6.3151594740086
-      ZScore         = (-1.3990173078705, 7.1469743677947)
-      DateTime       = 2011-03-26T01:22:08
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.35551884110009
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/285452254:35179/NACL
-      MeasureType    = Automatic
-      Sample         = 927.5114997592
-      Line           = 37370.688517351
-      ErrorLine      = -3.9373000309351
-      ErrorSample    = 11.06236604614
-      ErrorMagnitude = 11.742157981921
-      ZScore         = (-1.3990173078705, 7.1469743677947)
-      DateTime       = 2011-03-26T01:22:11
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.44286252012353
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 1108.8477922765
-      Line           = 38022.708773822
-      ErrorLine      = -6.0337782903734
-      ErrorSample    = 34.932830665611
-      ErrorMagnitude = 35.450093635555
-      ZScore         = (-1.3990173078705, 7.1469743677947)
-      DateTime       = 2011-03-26T01:22:15
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.5333021893739
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300700514:53662/NACL
-      MeasureType    = Automatic
-      Sample         = 1027.9958342045
-      Line           = 13255.3974347
-      ErrorLine      = -15.539923918703
-      ErrorSample    = 15.318758267104
-      ErrorMagnitude = 21.820943844047
-      ZScore         = (-1.3990173078705, 7.1469743677947)
-      DateTime       = 2011-03-26T01:22:19
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.42861079634895
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300714095:63575/NACR
-      MeasureType    = Automatic
-      Sample         = 873.43512669565
-      Line           = 594.01419233261
-      ErrorLine      = 0.23578315371674
-      ErrorSample    = 15.860924137686
-      ErrorMagnitude = 15.862676577331
-      ZScore         = (-1.3990173078705, 7.1469743677947)
-      DateTime       = 2011-03-26T01:22:24
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.41801118704279
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305409449:44487/NACL
-      MeasureType    = Automatic
-      Sample         = 1483.2065315665
-      Line           = 16681.720959122
-      ErrorLine      = -47.929780824608
-      ErrorSample    = -3.1561163264189
-      ErrorMagnitude = 48.033581587894
-      ZScore         = (-1.3990173078705, 7.1469743677947)
-      DateTime       = 2011-03-26T01:22:26
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.44895692837417
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305423011:64885/NACR
-      MeasureType    = Automatic
-      Sample         = 1367.0376394317
-      Line           = 22830.815435741
-      ErrorLine      = -42.878851357516
-      ErrorSample    = -6.1041332626128
-      ErrorMagnitude = 43.311157184122
-      ZScore         = (-1.3990173078705, 7.1469743677947)
-      DateTime       = 2011-03-26T01:22:30
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.45030140671497
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_016
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Estimated
-      Sample         = 2486.0
-      Line           = 4101.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:11
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Automatic
-      Sample         = 45.611423632377
-      Line           = 4147.299345339
-      ErrorLine      = 6.7714598163775
-      ErrorSample    = -1.3983434794916
-      ErrorMagnitude = 6.9143352920908
-      ZScore         = (-1.4295536943253, 3.229822931998)
-      DateTime       = 2011-03-25T17:57:18
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.83144200566983
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 878.77579432918
-      Line           = 3131.5773091719
-      ErrorLine      = 5.6856005267559
-      ErrorSample    = -0.51971348208303
-      ErrorMagnitude = 5.709304288029
-      ZScore         = (-1.3966974976022, 7.4724294324718)
-      DateTime       = 2011-03-26T01:22:33
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.53554845063081
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274888710:05688/NACR
-      MeasureType    = Automatic
-      Sample         = 1817.1889201738
-      Line           = 2381.2111989183
-      ErrorLine      = 4.7539522801972
-      ErrorSample    = -0.28967975289311
-      ErrorMagnitude = 4.7627698497438
-      ZScore         = (-1.3966974976022, 7.4724294324718)
-      DateTime       = 2011-03-26T01:22:36
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.4978499570334
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/285452254:35179/NACL
-      MeasureType    = Automatic
-      Sample         = 915.66761700035
-      Line           = 37068.583016258
-      ErrorLine      = -9.9506894668157
-      ErrorSample    = 7.5395124750373
-      ErrorMagnitude = 12.484409045936
-      ZScore         = (-1.3966974976022, 7.4724294324718)
-      DateTime       = 2011-03-26T01:22:50
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.26076280176767
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 1118.662824415
-      Line           = 37721.331527753
-      ErrorLine      = -12.535606652069
-      ErrorSample    = 32.580316151397
-      ErrorMagnitude = 34.908715740634
-      ZScore         = (-1.3966974976022, 7.4724294324718)
-      DateTime       = 2011-03-26T01:22:53
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.4025582002223
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300700514:53662/NACL
-      MeasureType    = Automatic
-      Sample         = 893.00193847876
-      Line           = 13764.623718024
-      ErrorLine      = -6.2500045078159
-      ErrorSample    = 10.24782416396
-      ErrorMagnitude = 12.003351883668
-      ZScore         = (-1.3966974976022, 7.4724294324718)
-      DateTime       = 2011-03-26T01:22:57
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.25374097716485
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300714095:63575/NACR
-      MeasureType    = Automatic
-      Sample         = 755.80010246888
-      Line           = 1111.5952512902
-      ErrorLine      = 11.163256431139
-      ErrorSample    = 11.147404245786
-      ErrorMagnitude = 15.776023439585
-      ZScore         = (-1.3966974976022, 7.4724294324718)
-      DateTime       = 2011-03-26T01:23:01
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.24541201255488
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305409449:44487/NACL
-      MeasureType    = Automatic
-      Sample         = 1335.1556346811
-      Line           = 17187.260533006
-      ErrorLine      = -38.184145502066
-      ErrorSample    = -8.7281370948922
-      ErrorMagnitude = 39.16898447586
-      ZScore         = (-1.3966974976022, 7.4724294324718)
-      DateTime       = 2011-03-26T01:23:04
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.34954199904951
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305423011:64885/NACR
-      MeasureType    = Automatic
-      Sample         = 1236.3360106787
-      Line           = 23344.9868362
-      ErrorLine      = -31.393875912385
-      ErrorSample    = -10.949987902578
-      ErrorMagnitude = 33.24872448484
-      ZScore         = (-1.3966974976022, 7.4724294324718)
-      DateTime       = 2011-03-26T01:23:07
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.39253031882527
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_017
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 49.0
-      Line           = 4407.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:12
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2489.6183439502
-      Line           = 4360.6731735787
-      ErrorLine      = -6.743675470083
-      ErrorSample    = 1.1568813191984
-      ErrorMagnitude = 6.8421877519189
-      ZScore         = (-0.82795352088839, 8.1763286655676)
-      DateTime       = 2011-03-25T17:57:18
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.82065411041413
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 1674.7168815146
-      Line           = 8319.9963147343
-      ErrorLine      = -3.1124285836759
-      ErrorSample    = -5.8066990984553
-      ErrorMagnitude = 6.5882445392141
-      ZScore         = (-1.174426415643, 11.933687782537)
-      DateTime       = 2011-03-26T01:23:14
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.37484632343421
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277245961:32558/NACL
-      MeasureType    = Automatic
-      Sample         = 567.47124393985
-      Line           = 7613.3358740806
-      ErrorLine      = -0.9657478236395
-      ErrorSample    = -6.2057706248644
-      ErrorMagnitude = 6.2804663765754
-      ZScore         = (-1.174426415643, 11.933687782537)
-      DateTime       = 2011-03-26T01:23:18
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.41257091358784
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/285452254:35179/NACL
-      MeasureType    = Automatic
-      Sample         = 890.19122094319
-      Line           = 36818.339239954
-      ErrorLine      = -3.8093811769577
-      ErrorSample    = 10.918913127836
-      ErrorMagnitude = 11.564343857072
-      ZScore         = (-1.174426415643, 11.933687782537)
-      DateTime       = 2011-03-26T01:23:22
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.37280705739431
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 1112.4487514841
-      Line           = 37470.708206865
-      ErrorLine      = -5.9727396220187
-      ErrorSample    = 35.112415779396
-      ErrorMagnitude = 35.61678481359
-      ZScore         = (-1.174426415643, 11.933687782537)
-      DateTime       = 2011-03-26T01:23:25
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.49204526520407
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300700514:53662/NACL
-      MeasureType    = Automatic
-      Sample         = 770.4641472181
-      Line           = 14184.654449062
-      ErrorLine      = -16.840256984957
-      ErrorSample    = 14.919974563863
-      ErrorMagnitude = 22.498886557021
-      ZScore         = (-1.174426415643, 11.933687782537)
-      DateTime       = 2011-03-26T01:23:28
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.3799667410467
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300714095:63575/NACR
-      MeasureType    = Automatic
-      Sample         = 647.84167523467
-      Line           = 1539.1713425231
-      ErrorLine      = 0.93481066729214
-      ErrorSample    = 15.452783119271
-      ErrorMagnitude = 15.481032818094
-      ZScore         = (-1.174426415643, 11.933687782537)
-      DateTime       = 2011-03-26T01:23:32
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.36509314010709
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305409449:44487/NACL
-      MeasureType    = Automatic
-      Sample         = 1201.5647896479
-      Line           = 17604.342248815
-      ErrorLine      = -48.742584745931
-      ErrorSample    = -3.5384113964924
-      ErrorMagnitude = 48.870849418903
-      ZScore         = (-1.174426415643, 11.933687782537)
-      DateTime       = 2011-03-26T01:23:36
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.51258585215874
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305423011:64885/NACR
-      MeasureType    = Automatic
-      Sample         = 1117.7070767805
-      Line           = 23770.52838154
-      ErrorLine      = -41.925638719884
-      ErrorSample    = -6.1521108056907
-      ErrorMagnitude = 42.37461090601
-      ZScore         = (-1.174426415643, 11.933687782537)
-      DateTime       = 2011-03-26T01:23:40
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.52656675977232
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_018
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 31.0
-      Line           = 4618.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:12
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2471.5271686287
-      Line           = 4571.7215092538
-      ErrorLine      = -6.8042007211197
-      ErrorSample    = 1.2802198938593
-      ErrorMagnitude = 6.9235908624007
-      ZScore         = (-2.432455284664, 3.4739362708414)
-      DateTime       = 2011-03-25T17:57:18
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.89529559752066
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 901.80224401283
-      Line           = 3602.2914341332
-      ErrorLine      = -1.0421014868907
-      ErrorSample    = 0.17102183837846
-      ErrorMagnitude = 1.0560416555147
-      ZScore         = (-1.4056658281299, 10.12569182111)
-      DateTime       = 2011-03-26T01:23:42
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.59316681409837
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274888710:05688/NACR
-      MeasureType    = Automatic
-      Sample         = 1877.2971150149
-      Line           = 2850.1715762209
-      ErrorLine      = -1.9225463150819
-      ErrorSample    = -0.028548747998684
-      ErrorMagnitude = 1.9227582699464
-      ZScore         = (-1.4056658281299, 10.12569182111)
-      DateTime       = 2011-03-26T01:23:45
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.59073440404791
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277164494:04377/NACR
-      MeasureType    = Automatic
-      Sample         = 2333.6854639153
-      Line           = 9588.749499068
-      ErrorLine      = -9.6528988698246
-      ErrorSample    = -13.332433803512
-      ErrorMagnitude = 16.460019675447
-      ZScore         = (-1.4056658281299, 10.12569182111)
-      DateTime       = 2011-03-26T01:23:49
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.51006509170838
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277184863:36490/NACR
-      MeasureType    = Automatic
-      Sample         = 1245.9836763615
-      Line           = 9420.4876553484
-      ErrorLine      = -9.3739785297566
-      ErrorSample    = -13.246632452551
-      ErrorMagnitude = 16.22790019717
-      ZScore         = (-1.4056658281299, 10.12569182111)
-      DateTime       = 2011-03-26T01:23:52
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.52745233923633
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 263.43111555802
-      Line           = 7658.3689567147
-      ErrorLine      = -11.815195040828
-      ErrorSample    = -13.34325982977
-      ErrorMagnitude = 17.82249748878
-      ZScore         = (-1.4056658281299, 10.12569182111)
-      DateTime       = 2011-03-26T01:23:56
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.53815337847846
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 1678.7092663651
-      Line           = 8529.2794005466
-      ErrorLine      = -3.7690142931642
-      ErrorSample    = -5.5235666163849
-      ErrorMagnitude = 6.6869467552627
-      ZScore         = (-1.4056658281299, 10.12569182111)
-      DateTime       = 2011-03-26T01:23:58
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.54569689150594
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277245961:32558/NACL
-      MeasureType    = Automatic
-      Sample         = 552.58998478466
-      Line           = 7822.0145283137
-      ErrorLine      = -1.2813289477645
-      ErrorSample    = -6.536674002311
-      ErrorMagnitude = 6.6610743041095
-      ZScore         = (-1.4056658281299, 10.12569182111)
-      DateTime       = 2011-03-26T01:24:01
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.5603767772518
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/285452254:35179/NACL
-      MeasureType    = Automatic
-      Sample         = 835.58376524811
-      Line           = 36615.738149546
-      ErrorLine      = -4.1528175749554
-      ErrorSample    = 10.15082297836
-      ErrorMagnitude = 10.96745644846
-      ZScore         = (-1.4056658281299, 10.12569182111)
-      DateTime       = 2011-03-26T01:24:04
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.43818953922255
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 1069.8149971085
-      Line           = 37267.60608391
-      ErrorLine      = -6.1472847963523
-      ErrorSample    = 35.013457981296
-      ErrorMagnitude = 35.548999285148
-      ZScore         = (-1.4056658281299, 10.12569182111)
-      DateTime       = 2011-03-26T01:24:08
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.56573132600715
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300700514:53662/NACL
-      MeasureType    = Automatic
-      Sample         = 647.90569272111
-      Line           = 14518.992740735
-      ErrorLine      = -16.519843116064
-      ErrorSample    = 14.228233302357
-      ErrorMagnitude = 21.802473242402
-      ZScore         = (-1.4056658281299, 10.12569182111)
-      DateTime       = 2011-03-26T01:24:11
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.4306872992529
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300714095:63575/NACR
-      MeasureType    = Automatic
-      Sample         = 534.84242737222
-      Line           = 1880.3496979752
-      ErrorLine      = 1.8946155994522
-      ErrorSample    = 15.286493794544
-      ErrorMagnitude = 15.403456131671
-      ZScore         = (-1.4056658281299, 10.12569182111)
-      DateTime       = 2011-03-26T01:24:14
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.42173211191948
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305409449:44487/NACL
-      MeasureType    = Automatic
-      Sample         = 1069.9643350228
-      Line           = 17937.167012786
-      ErrorLine      = -49.833132166197
-      ErrorSample    = -3.7489290361202
-      ErrorMagnitude = 49.973948517318
-      ZScore         = (-1.4056658281299, 10.12569182111)
-      DateTime       = 2011-03-26T01:24:17
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.49661692613336
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305423011:64885/NACR
-      MeasureType    = Automatic
-      Sample         = 996.3146149507
-      Line           = 24110.099277626
-      ErrorLine      = -41.904627948155
-      ErrorSample    = -6.2471144067285
-      ErrorMagnitude = 42.367726890689
-      ZScore         = (-1.4056658281299, 10.12569182111)
-      DateTime       = 2011-03-26T01:24:21
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.49049054926218
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_019
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 32.0
-      Line           = 4950.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:13
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2472.5198254791
-      Line           = 4903.612695692
-      ErrorLine      = -6.8580490991917
-      ErrorSample    = 1.2969833500792
-      ErrorMagnitude = 6.9796134031411
-      ZScore         = (-4.3686241856135, 6.0755028185605)
-      DateTime       = 2011-03-25T17:57:18
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.73535575093115
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 926.76315345833
-      Line           = 3933.9303634529
-      ErrorLine      = -1.0143973221548
-      ErrorSample    = 0.17578573659
-      ErrorMagnitude = 1.0295156882648
-      ZScore         = (-1.2471850773023, 10.009044916607)
-      DateTime       = 2011-03-26T01:24:24
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.61297469606961
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274888710:05688/NACR
-      MeasureType    = Automatic
-      Sample         = 1926.0101867168
-      Line           = 3180.2014683068
-      ErrorLine      = -1.9199437556122
-      ErrorSample    = -0.07979259856279
-      ErrorMagnitude = 1.9216011249736
-      ZScore         = (-1.2471850773023, 10.009044916607)
-      DateTime       = 2011-03-26T01:24:27
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.61864738949953
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277164494:04377/NACR
-      MeasureType    = Automatic
-      Sample         = 2396.1344561223
-      Line           = 9913.2694219629
-      ErrorLine      = -9.5953268813955
-      ErrorSample    = -13.238194441068
-      ErrorMagnitude = 16.349926300151
-      ZScore         = (-1.2471850773023, 10.009044916607)
-      DateTime       = 2011-03-26T01:24:29
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.55710305319462
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277184863:36490/NACR
-      MeasureType    = Automatic
-      Sample         = 1279.048207914
-      Line           = 9746.661750406
-      ErrorLine      = -9.333747781513
-      ErrorSample    = -13.129107685087
-      ErrorMagnitude = 16.10876519959
-      ZScore         = (-1.2471850773023, 10.009044916607)
-      DateTime       = 2011-03-26T01:24:32
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.57162214016716
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 267.4328777732
-      Line           = 7985.6835579666
-      ErrorLine      = -11.787266822591
-      ErrorSample    = -13.318392634081
-      ErrorMagnitude = 17.785365936705
-      ZScore         = (-1.2471850773023, 10.009044916607)
-      DateTime       = 2011-03-26T01:24:36
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.57738790489748
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 1654.7199248534
-      Line           = 8856.2049972522
-      ErrorLine      = -3.3708819810272
-      ErrorSample    = -5.530681101131
-      ErrorMagnitude = 6.4769806833448
-      ZScore         = (-1.2471850773023, 10.009044916607)
-      DateTime       = 2011-03-26T01:24:39
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.58199030554169
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277245961:32558/NACL
-      MeasureType    = Automatic
-      Sample         = 500.96072548694
-      Line           = 8147.7162007634
-      ErrorLine      = -1.165735846952
-      ErrorSample    = -6.5777438024188
-      ErrorMagnitude = 6.6802435281304
-      ZScore         = (-1.2471850773023, 10.009044916607)
-      DateTime       = 2011-03-26T01:24:42
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.58954213082143
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/285452254:35179/NACL
-      MeasureType    = Automatic
-      Sample         = 806.16079065779
-      Line           = 36295.611386394
-      ErrorLine      = -4.1421049003256
-      ErrorSample    = 8.9963573685155
-      ErrorMagnitude = 9.9041142414324
-      ZScore         = (-1.2471850773023, 10.009044916607)
-      DateTime       = 2011-03-26T01:24:45
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.43536602658787
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 1050.3892567587
-      Line           = 36947.576975338
-      ErrorLine      = -6.2724013265179
-      ErrorSample    = 34.767925578334
-      ErrorMagnitude = 35.329190019324
-      ZScore         = (-1.2471850773023, 10.009044916607)
-      DateTime       = 2011-03-26T01:24:49
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.59407581063715
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300700514:53662/NACL
-      MeasureType    = Automatic
-      Sample         = 494.15984464984
-      Line           = 15054.807753818
-      ErrorLine      = -17.104315050245
-      ErrorSample    = 13.334790119397
-      ErrorMagnitude = 21.688112432077
-      ZScore         = (-1.2471850773023, 10.009044916607)
-      DateTime       = 2011-03-26T01:24:53
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.44907248598065
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300714095:63575/NACR
-      MeasureType    = Automatic
-      Sample         = 391.76787296639
-      Line           = 2426.4281450797
-      ErrorLine      = 2.0859734260034
-      ErrorSample    = 14.259475033977
-      ErrorMagnitude = 14.411242603558
-      ZScore         = (-1.2471850773023, 10.009044916607)
-      DateTime       = 2011-03-26T01:24:57
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.43327403214607
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305409449:44487/NACL
-      MeasureType    = Automatic
-      Sample         = 900.98834911481
-      Line           = 18468.930408039
-      ErrorLine      = -50.239662715161
-      ErrorSample    = -4.1434089604058
-      ErrorMagnitude = 50.410232567866
-      ZScore         = (-1.2471850773023, 10.009044916607)
-      DateTime       = 2011-03-26T01:25:00
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.52070670355442
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305423011:64885/NACR
-      MeasureType    = Automatic
-      Sample         = 837.97936214333
-      Line           = 24652.720173545
-      ErrorLine      = -41.597258997022
-      ErrorSample    = -6.3963054093251
-      ErrorMagnitude = 42.086157806988
-      ZScore         = (-1.2471850773023, 10.009044916607)
-      DateTime       = 2011-03-26T01:25:04
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.51496497237076
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_020
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 51.0
-      Line           = 5070.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:13
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2491.4320627355
-      Line           = 5023.4247474414
-      ErrorLine      = -6.7492096351298
-      ErrorSample    = 1.3091596530317
-      ErrorMagnitude = 6.8750076142543
-      ZScore         = (-3.9758328868097, 3.1457756487074)
-      DateTime       = 2011-03-25T17:57:18
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.84788775195329
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 953.79753998599
-      Line           = 4053.155374918
-      ErrorLine      = -1.0892919829448
-      ErrorSample    = 0.17147052948428
-      ErrorMagnitude = 1.1027053852183
-      ZScore         = (-1.7529872882442, 7.9929556355901)
-      DateTime       = 2011-03-26T01:25:07
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.49863040153468
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274888710:05688/NACR
-      MeasureType    = Automatic
-      Sample         = 1961.4421232461
-      Line           = 3298.1558003403
-      ErrorLine      = -1.9842306096475
-      ErrorSample    = -0.049949551456166
-      ErrorMagnitude = 1.9848592065819
-      ZScore         = (-1.7529872882442, 7.9929556355901)
-      DateTime       = 2011-03-26T01:25:10
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.50357954376159
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277164494:04377/NACR
-      MeasureType    = Automatic
-      Sample         = 2395.5460005372
-      Line           = 10032.170085941
-      ErrorLine      = -9.7589985468639
-      ErrorSample    = -13.067211084705
-      ErrorMagnitude = 16.309201641096
-      ZScore         = (-1.7529872882442, 7.9929556355901)
-      DateTime       = 2011-03-26T01:25:13
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.44378270440393
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277184863:36490/NACR
-      MeasureType    = Automatic
-      Sample         = 1268.3272920737
-      Line           = 9865.3857897548
-      ErrorLine      = -9.4446747926177
-      ErrorSample    = -12.946176688123
-      ErrorMagnitude = 16.025148135927
-      ZScore         = (-1.7529872882442, 7.9929556355901)
-      DateTime       = 2011-03-26T01:25:16
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.45614809195831
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 246.68159800997
-      Line           = 8104.1075781101
-      ErrorLine      = -11.858379948634
-      ErrorSample    = -13.23111336732
-      ErrorMagnitude = 17.767485357952
-      ZScore         = (-1.7529872882442, 7.9929556355901)
-      DateTime       = 2011-03-26T01:25:20
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.45807152218367
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 1624.6516757968
-      Line           = 8973.8494733086
-      ErrorLine      = -3.3523746578321
-      ErrorSample    = -5.4868880018075
-      ErrorMagnitude = 6.4299576818867
-      ZScore         = (-1.7529872882442, 7.9929556355901)
-      DateTime       = 2011-03-26T01:25:23
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.46260183997401
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277245961:32558/NACL
-      MeasureType    = Automatic
-      Sample         = 461.15338060775
-      Line           = 8264.2440348471
-      ErrorLine      = -1.1987301433437
-      ErrorSample    = -6.5900847334421
-      ErrorMagnitude = 6.6982214617395
-      ZScore         = (-1.7529872882442, 7.9929556355901)
-      DateTime       = 2011-03-26T01:25:26
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.46636174779815
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/285452254:35179/NACL
-      MeasureType    = Automatic
-      Sample         = 827.05948505196
-      Line           = 36179.363754364
-      ErrorLine      = -4.1190451231232
-      ErrorSample    = 9.5330558708931
-      ErrorMagnitude = 10.384877802068
-      ZScore         = (-1.7529872882442, 7.9929556355901)
-      DateTime       = 2011-03-26T01:25:30
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.31185876399559
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 1075.9195178527
-      Line           = 36831.574595372
-      ErrorLine      = -6.1729116988936
-      ErrorSample    = 34.712462346601
-      ErrorMagnitude = 35.257054343869
-      ZScore         = (-1.7529872882442, 7.9929556355901)
-      DateTime       = 2011-03-26T01:25:33
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.47820189443883
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300700514:53662/NACL
-      MeasureType    = Automatic
-      Sample         = 460.25038096685
-      Line           = 15254.003921783
-      ErrorLine      = -17.111674002597
-      ErrorSample    = 13.655492905832
-      ErrorMagnitude = 21.892507249568
-      ZScore         = (-1.7529872882442, 7.9929556355901)
-      DateTime       = 2011-03-26T01:25:36
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.34133669113362
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300714095:63575/NACR
-      MeasureType    = Automatic
-      Sample         = 361.65208177048
-      Line           = 2628.742684099
-      ErrorLine      = 2.1880335173096
-      ErrorSample    = 14.728928283168
-      ErrorMagnitude = 14.890561407938
-      ZScore         = (-1.7529872882442, 7.9929556355901)
-      DateTime       = 2011-03-26T01:25:39
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.32463266362083
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305409449:44487/NACL
-      MeasureType    = Automatic
-      Sample         = 861.88506438182
-      Line           = 18667.473304418
-      ErrorLine      = -50.476377971765
-      ErrorSample    = -4.1862920459831
-      ErrorMagnitude = 50.649676941149
-      ZScore         = (-1.7529872882442, 7.9929556355901)
-      DateTime       = 2011-03-26T01:25:42
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.41158225287472
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305423011:64885/NACR
-      MeasureType    = Automatic
-      Sample         = 802.70419877222
-      Line           = 24854.629817294
-      ErrorLine      = -41.757244653792
-      ErrorSample    = -6.3412340989123
-      ErrorMagnitude = 42.235988575785
-      ZScore         = (-1.7529872882442, 7.9929556355901)
-      DateTime       = 2011-03-26T01:25:45
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.4094179913227
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_021
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 61.0
-      Line           = 5442.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:13
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2501.4542410792
-      Line           = 5395.3798315319
-      ErrorLine      = -6.8960467662409
-      ErrorSample    = 1.2742698000179
-      ErrorMagnitude = 7.0127900671145
-      ZScore         = (-4.4769185545487, 4.1405059358475)
-      DateTime       = 2011-03-25T17:57:18
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.58130661402447
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 989.39660794565
-      Line           = 4424.4971360578
-      ErrorLine      = -1.1550884506596
-      ErrorSample    = 0.35508145219001
-      ErrorMagnitude = 1.2084337658873
-      ZScore         = (-1.6474684605519, 11.788191185118)
-      DateTime       = 2011-03-26T01:25:49
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.46640740279872
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274888710:05688/NACR
-      MeasureType    = Automatic
-      Sample         = 2022.9334773718
-      Line           = 3667.3695474004
-      ErrorLine      = -2.0530398453802
-      ErrorSample    = -0.14022589366095
-      ErrorMagnitude = 2.0578230992901
-      ZScore         = (-1.6474684605519, 11.788191185118)
-      DateTime       = 2011-03-26T01:25:52
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.47412948198235
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277164494:04377/NACR
-      MeasureType    = Automatic
-      Sample         = 2452.5433260693
-      Line           = 10396.448416518
-      ErrorLine      = -9.7754336414091
-      ErrorSample    = -13.119436037744
-      ErrorMagnitude = 16.360889487618
-      ZScore         = (-1.6474684605519, 11.788191185118)
-      DateTime       = 2011-03-26T01:25:54
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.41402834521341
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277184863:36490/NACR
-      MeasureType    = Automatic
-      Sample         = 1293.7318327545
-      Line           = 10231.239468207
-      ErrorLine      = -9.5391297263395
-      ErrorSample    = -12.944378654885
-      ErrorMagnitude = 16.079550201948
-      ZScore         = (-1.6474684605519, 11.788191185118)
-      DateTime       = 2011-03-26T01:25:57
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.42402630125616
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 240.80581129674
-      Line           = 8470.8426983454
-      ErrorLine      = -12.109135278593
-      ErrorSample    = -13.193060761693
-      ErrorMagnitude = 17.907763943524
-      ZScore         = (-1.6474684605519, 11.788191185118)
-      DateTime       = 2011-03-26T01:26:01
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.42530328589055
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 1588.8121708063
-      Line           = 9340.3063161503
-      ErrorLine      = -3.4380966327608
-      ErrorSample    = -5.5186680794645
-      ErrorMagnitude = 6.5020155203984
-      ZScore         = (-1.6474684605519, 11.788191185118)
-      DateTime       = 2011-03-26T01:26:05
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.4334698930661
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277245961:32558/NACL
-      MeasureType    = Automatic
-      Sample         = 395.59741625626
-      Line           = 8628.6126214074
-      ErrorLine      = -1.115386602989
-      ErrorSample    = -6.5988371532962
-      ErrorMagnitude = 6.6924389462923
-      ZScore         = (-1.6474684605519, 11.788191185118)
-      DateTime       = 2011-03-26T01:26:09
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.43779361337874
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/285452254:35179/NACL
-      MeasureType    = Automatic
-      Sample         = 810.42535949411
-      Line           = 35820.325773004
-      ErrorLine      = -3.9366376492035
-      ErrorSample    = 9.6745168528211
-      ErrorMagnitude = 10.444778232047
-      ZScore         = (-1.6474684605519, 11.788191185118)
-      DateTime       = 2011-03-26T01:26:14
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.30524497710121
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 1068.8348767127
-      Line           = 36472.757051172
-      ErrorLine      = -6.1244857842757
-      ErrorSample    = 34.411120193821
-      ErrorMagnitude = 34.951888634456
-      ZScore         = (-1.6474684605519, 11.788191185118)
-      DateTime       = 2011-03-26T01:26:17
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.45381382095184
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300700514:53662/NACL
-      MeasureType    = Automatic
-      Sample         = 300.82559176175
-      Line           = 15857.613260779
-      ErrorLine      = -18.350803471607
-      ErrorSample    = 13.372938107501
-      ErrorMagnitude = 22.706551074097
-      ZScore         = (-1.6474684605519, 11.788191185118)
-      DateTime       = 2011-03-26T01:26:21
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.31657920740145
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300714095:63575/NACR
-      MeasureType    = Automatic
-      Sample         = 212.3479473277
-      Line           = 3242.7131946998
-      ErrorLine      = 2.6164692641314
-      ErrorSample    = 14.275564206444
-      ErrorMagnitude = 14.513360907193
-      ZScore         = (-1.6474684605519, 11.788191185118)
-      DateTime       = 2011-03-26T01:26:25
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.2976127008742
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305409449:44487/NACL
-      MeasureType    = Automatic
-      Sample         = 685.99424585378
-      Line           = 19267.047040349
-      ErrorLine      = -51.757917180126
-      ErrorSample    = -4.5445640399719
-      ErrorMagnitude = 51.957050081179
-      ZScore         = (-1.6474684605519, 11.788191185118)
-      DateTime       = 2011-03-26T01:26:29
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.38257170578436
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305423011:64885/NACR
-      MeasureType    = Automatic
-      Sample         = 636.65792179039
-      Line           = 25464.825871151
-      ErrorLine      = -40.806430083401
-      ErrorSample    = -6.5022213848939
-      ErrorMagnitude = 41.321224801422
-      ZScore         = (-1.6474684605519, 11.788191185118)
-      DateTime       = 2011-03-26T01:26:32
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.37634827478632
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_022
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 56.0
-      Line           = 5737.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:14
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2496.3905266639
-      Line           = 5690.1566419236
-      ErrorLine      = -6.7945161103971
-      ErrorSample    = 1.3456525193055
-      ErrorMagnitude = 6.9264875569916
-      ZScore         = (-3.8428829044446, 5.5313606833312)
-      DateTime       = 2011-03-25T17:57:19
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.6424670299582
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 1005.4517756508
-      Line           = 4719.4730348899
-      ErrorLine      = -1.1941706503285
-      ErrorSample    = 0.40103529518058
-      ErrorMagnitude = 1.259711415399
-      ZScore         = (-1.5594951130364, 9.7674383962774)
-      DateTime       = 2011-03-26T01:26:34
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.50185491464072
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274888710:05688/NACR
-      MeasureType    = Automatic
-      Sample         = 2059.7688165311
-      Line           = 3961.1278173641
-      ErrorLine      = -2.1253411054572
-      ErrorSample    = -0.12126434832408
-      ErrorMagnitude = 2.1287977491346
-      ZScore         = (-1.5594951130364, 9.7674383962774)
-      DateTime       = 2011-03-26T01:26:38
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.50765401321041
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277184863:36490/NACR
-      MeasureType    = Automatic
-      Sample         = 1329.5547620656
-      Line           = 10520.746709296
-      ErrorLine      = -9.4596509523471
-      ErrorSample    = -12.911316566627
-      ErrorMagnitude = 16.005845545422
-      ZScore         = (-1.5594951130364, 9.7674383962774)
-      DateTime       = 2011-03-26T01:26:41
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.44668488505613
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 251.31766566547
-      Line           = 8761.9296730173
-      ErrorLine      = -12.432773051765
-      ErrorSample    = -13.160794697542
-      ErrorMagnitude = 18.104705543796
-      ZScore         = (-1.5594951130364, 9.7674383962774)
-      DateTime       = 2011-03-26T01:26:44
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.44955181853948
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 1574.8116384101
-      Line           = 9631.24614632
-      ErrorLine      = -3.3401297807304
-      ErrorSample    = -5.5079774535366
-      ErrorMagnitude = 6.4416055902849
-      ZScore         = (-1.5594951130364, 9.7674383962774)
-      DateTime       = 2011-03-26T01:26:48
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.46136546505295
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277245961:32558/NACL
-      MeasureType    = Automatic
-      Sample         = 357.56367121276
-      Line           = 8918.1573361995
-      ErrorLine      = -0.68422099702184
-      ErrorSample    = -6.7477733909916
-      ErrorMagnitude = 6.782374518481
-      ZScore         = (-1.5594951130364, 9.7674383962774)
-      DateTime       = 2011-03-26T01:26:51
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.46113276912547
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/285452254:35179/NACL
-      MeasureType    = Automatic
-      Sample         = 774.59685963628
-      Line           = 35536.035645834
-      ErrorLine      = -3.9020664226409
-      ErrorSample    = 9.0749804974226
-      ErrorMagnitude = 9.8783294840424
-      ZScore         = (-1.5594951130364, 9.7674383962774)
-      DateTime       = 2011-03-26T01:26:54
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.34022040206401
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 1041.7630851075
-      Line           = 36188.265894314
-      ErrorLine      = -6.1415876628162
-      ErrorSample    = 34.352014971759
-      ErrorMagnitude = 34.896705168827
-      ZScore         = (-1.5594951130364, 9.7674383962774)
-      DateTime       = 2011-03-26T01:26:57
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.48648146205687
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300700514:53662/NACL
-      MeasureType    = Automatic
-      Sample         = 158.6228664335
-      Line           = 16331.89449198
-      ErrorLine      = -18.825002550011
-      ErrorSample    = 13.08820804104
-      ErrorMagnitude = 22.927754158082
-      ZScore         = (-1.5594951130364, 9.7674383962774)
-      DateTime       = 2011-03-26T01:27:00
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.35883213574289
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300714095:63575/NACR
-      MeasureType    = Automatic
-      Sample         = 78.847336600839
-      Line           = 3726.1181405419
-      ErrorLine      = 3.0381970702506
-      ErrorSample    = 14.015481584037
-      ErrorMagnitude = 14.341002945058
-      ZScore         = (-1.5594951130364, 9.7674383962774)
-      DateTime       = 2011-03-26T01:27:04
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.3506735683568
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300727653:10001/NACR
-      MeasureType    = Automatic
-      Sample         = 2431.0582876783
-      Line           = 21950.492959959
-      ErrorLine      = -14.221216802893
-      ErrorSample    = 13.653092659729
-      ErrorMagnitude = 19.714206718254
-      ZScore         = (-1.5594951130364, 9.7674383962774)
-      DateTime       = 2011-03-26T01:27:07
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.32644783650176
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305409449:44487/NACL
-      MeasureType    = Automatic
-      Sample         = 531.22463234371
-      Line           = 19737.65236156
-      ErrorLine      = -52.191214843049
-      ErrorSample    = -4.7993549776344
-      ErrorMagnitude = 52.411417792258
-      ZScore         = (-1.5594951130364, 9.7674383962774)
-      DateTime       = 2011-03-26T01:27:11
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.42394965795211
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305423011:64885/NACR
-      MeasureType    = Automatic
-      Sample         = 490.82962096276
-      Line           = 25945.169975177
-      ErrorLine      = -40.677703464473
-      ErrorSample    = -6.6912915857466
-      ErrorMagnitude = 41.224373157503
-      ZScore         = (-1.5594951130364, 9.7674383962774)
-      DateTime       = 2011-03-26T01:27:15
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.41719400332477
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_023
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 31.0
-      Line           = 5997.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:14
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2471.6383776151
-      Line           = 5950.1541888374
-      ErrorLine      = -6.9161921137056
-      ErrorSample    = 1.1689311604637
-      ErrorMagnitude = 7.0142792510412
-      ZScore         = (-4.3115832631956, 4.5621325324813)
-      DateTime       = 2011-03-25T17:57:19
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.64478010534094
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 999.40273723495
-      Line           = 4980.1612972334
-      ErrorLine      = -1.220076497988
-      ErrorSample    = 0.453835191027
-      ErrorMagnitude = 1.3017499919559
-      ZScore         = (-1.5722473307143, 12.577202577794)
-      DateTime       = 2011-03-26T01:27:19
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.48650032791284
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274888710:05688/NACR
-      MeasureType    = Automatic
-      Sample         = 2071.849956427
-      Line           = 4221.5391050131
-      ErrorLine      = -2.1162508494972
-      ErrorSample    = -0.019414442168454
-      ErrorMagnitude = 2.116339901472
-      ZScore         = (-1.5722473307143, 12.577202577794)
-      DateTime       = 2011-03-26T01:27:22
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.48789084412601
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/285452254:35179/NACL
-      MeasureType    = Automatic
-      Sample         = 706.90473584346
-      Line           = 35285.972267291
-      ErrorLine      = -3.6922848455797
-      ErrorSample    = 9.7698067678285
-      ErrorMagnitude = 10.44423724652
-      ZScore         = (-1.5722473307143, 12.577202577794)
-      DateTime       = 2011-03-26T01:27:33
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.3347990019347
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 981.98710304671
-      Line           = 35937.740117853
-      ErrorLine      = -6.1154199512457
-      ErrorSample    = 34.222503263493
-      ErrorMagnitude = 34.764609746118
-      ZScore         = (-1.5722473307143, 12.577202577794)
-      DateTime       = 2011-03-26T01:27:36
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.47276425154905
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300714095:63575/NACL
-      MeasureType    = Automatic
-      Sample         = 2377.0399019735
-      Line           = 4079.5206769771
-      ErrorLine      = -3.0165661378146
-      ErrorSample    = 15.791519337345
-      ErrorMagnitude = 16.077056765638
-      ZScore         = (-1.5722473307143, 12.577202577794)
-      DateTime       = 2011-03-26T01:27:41
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.33914624209501
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300727653:10001/NACR
-      MeasureType    = Automatic
-      Sample         = 2297.9769891902
-      Line           = 22384.51125031
-      ErrorLine      = -13.685768212505
-      ErrorSample    = 13.79965475743
-      ErrorMagnitude = 19.435295804044
-      ZScore         = (-1.5722473307143, 12.577202577794)
-      DateTime       = 2011-03-26T01:27:44
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.32681660892194
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305409449:44487/NACL
-      MeasureType    = Automatic
-      Sample         = 371.30155497822
-      Line           = 20145.43028925
-      ErrorLine      = -52.587503019935
-      ErrorSample    = -4.7455078882397
-      ErrorMagnitude = 52.801186719514
-      ZScore         = (-1.5722473307143, 12.577202577794)
-      DateTime       = 2011-03-26T01:27:47
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.22570151497075
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305423011:64885/NACR
-      MeasureType    = Automatic
-      Sample         = 338.22357107489
-      Line           = 26362.25426197
-      ErrorLine      = -40.34956447775
-      ErrorSample    = -6.797967272575
-      ErrorMagnitude = 40.918207592502
-      ZScore         = (-1.5722473307143, 12.577202577794)
-      DateTime       = 2011-03-26T01:27:50
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.26307133202954
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_024
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 61.0
-      Line           = 6114.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:15
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2501.5180019313
-      Line           = 6067.0221610222
-      ErrorLine      = -6.8301256718032
-      ErrorSample    = 1.2295285647224
-      ErrorMagnitude = 6.9399104593715
-      ZScore         = (-1.0639817626911, 3.0557536114091)
-      DateTime       = 2011-03-25T17:57:19
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.96130645846421
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 1037.2146583757
-      Line           = 5096.1579640743
-      ErrorLine      = -1.4186677297466
-      ErrorSample    = 0.39418203180867
-      ErrorMagnitude = 1.4724121711074
-      ZScore         = (-0.82230966580163, 12.000217108416)
-      DateTime       = 2011-03-26T01:27:54
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.62373023283408
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274888710:05688/NACR
-      MeasureType    = Automatic
-      Sample         = 2028.9080211591
-      Line           = 4408.2994278745
-      ErrorLine      = -74.832853916789
-      ErrorSample    = 89.201736452485
-      ErrorMagnitude = 116.43412648992
-      ZScore         = (-0.88595592851728, 7.414996899146)
-      DateTime       = 2011-03-26T03:01:28
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.49583863038424
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277184863:36490/NACR
-      MeasureType    = Automatic
-      Sample         = 1453.3565567317
-      Line           = 10670.753048202
-      ErrorLine      = 211.10094179588
-      ErrorSample    = -104.5331717055
-      ErrorMagnitude = 235.56483526605
-      ZScore         = (-0.82230966580163, 12.000217108416)
-      DateTime       = 2011-03-26T01:28:00
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.50147593669928
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 421.64322663595
-      Line           = 8932.6130137802
-      ErrorLine      = 188.55836748572
-      ErrorSample    = -183.61253876312
-      ErrorMagnitude = 263.18780811413
-      ZScore         = (-0.82230966580163, 12.000217108416)
-      DateTime       = 2011-03-26T01:28:03
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.49977622498561
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 1690.0478883517
-      Line           = 9813.002492289
-      ErrorLine      = 186.43091187161
-      ErrorSample    = -152.1540381539
-      ErrorMagnitude = 240.63943198865
-      ZScore         = (-0.82230966580163, 12.000217108416)
-      DateTime       = 2011-03-26T01:28:07
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.49140183518006
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277245961:32558/NACL
-      MeasureType    = Automatic
-      Sample         = 435.94699300576
-      Line           = 9128.6163405268
-      ErrorLine      = 158.56515234436
-      ErrorSample    = -147.57302011107
-      ErrorMagnitude = 216.61187364199
-      ZScore         = (-0.82230966580163, 12.000217108416)
-      DateTime       = 2011-03-26T01:28:11
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.49637600973708
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/285452254:35179/NACL
-      MeasureType    = Automatic
-      Sample         = 1274.4221102611
-      Line           = 37562.801157634
-      ErrorLine      = -2394.2453755604
-      ErrorSample    = -518.03880211245
-      ErrorMagnitude = 2449.6479581537
-      ZScore         = (-0.88595592851728, 7.414996899146)
-      DateTime       = 2011-03-26T03:01:36
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.42611528799068
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 1109.1837062815
-      Line           = 35683.35966124
-      ErrorLine      = 135.13525716322
-      ErrorSample    = -47.46835214528
-      ErrorMagnitude = 143.22982295583
-      ZScore         = (-0.82230966580163, 12.000217108416)
-      DateTime       = 2011-03-26T01:28:17
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.50924319311844
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305409449:44487/NACL
-      MeasureType    = Automatic
-      Sample         = 212.90638677634
-      Line           = 20210.838150365
-      ErrorLine      = 79.44471630135
-      ErrorSample    = 129.03271728104
-      ErrorMagnitude = 151.52856191864
-      ZScore         = (-0.82230966580163, 12.000217108416)
-      DateTime       = 2011-03-26T01:28:27
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.46688223610209
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_028
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 31.0
-      Line           = 7291.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:16
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2471.8322284099
-      Line           = 7244.0388417889
-      ErrorLine      = -6.7262631868653
-      ErrorSample    = 0.96890588033148
-      ErrorMagnitude = 6.7956894472835
-      ZScore         = (-2.1510202574882, 3.0019571053441)
-      DateTime       = 2011-03-25T17:57:19
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.89897165882087
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 1101.9368379269
-      Line           = 6273.2814694644
-      ErrorLine      = -1.6769806115235
-      ErrorSample    = 0.53824509187211
-      ErrorMagnitude = 1.7612415366298
-      ZScore         = (-1.0755368529869, 10.995607237866)
-      DateTime       = 2011-03-26T01:28:33
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.65950905047612
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274888710:05688/NACR
-      MeasureType    = Automatic
-      Sample         = 2278.3379548679
-      Line           = 5508.4377335269
-      ErrorLine      = -2.8151272859241
-      ErrorSample    = -0.09722650170761
-      ErrorMagnitude = 2.8168057491756
-      ZScore         = (-1.0755368529869, 10.995607237866)
-      DateTime       = 2011-03-26T01:28:36
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.6619241651897
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277184863:36490/NACR
-      MeasureType    = Automatic
-      Sample         = 1528.5594190631
-      Line           = 12047.146659678
-      ErrorLine      = -9.1716137203766
-      ErrorSample    = -13.436331657183
-      ErrorMagnitude = 16.268174655985
-      ZScore         = (-1.0755368529869, 10.995607237866)
-      DateTime       = 2011-03-26T01:28:38
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.45147832789098
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 302.13100044278
-      Line           = 10294.231718701
-      ErrorLine      = -11.799211355359
-      ErrorSample    = -13.501299308777
-      ErrorMagnitude = 17.930601541321
-      ZScore         = (-1.0755368529869, 10.995607237866)
-      DateTime       = 2011-03-26T01:28:42
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.48728919250516
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 1481.5155062776
-      Line           = 11164.231798641
-      ErrorLine      = -3.0429400780649
-      ErrorSample    = -5.9106797988645
-      ErrorMagnitude = 6.6479786404138
-      ZScore         = (-1.0755368529869, 10.995607237866)
-      DateTime       = 2011-03-26T01:28:46
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.50908598105252
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277245961:32558/NACL
-      MeasureType    = Automatic
-      Sample         = 120.19987316465
-      Line           = 10445.128489933
-      ErrorLine      = -0.26576836222375
-      ErrorSample    = -7.3535676043724
-      ErrorMagnitude = 7.3583686598617
-      ZScore         = (-1.0755368529869, 10.995607237866)
-      DateTime       = 2011-03-26T01:28:49
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.53223373490073
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/285452254:35179/NACL
-      MeasureType    = Automatic
-      Sample         = 549.628535192
-      Line           = 34037.361274158
-      ErrorLine      = -3.1388981300261
-      ErrorSample    = 10.834111608937
-      ErrorMagnitude = 11.279656724634
-      ZScore         = (-1.0755368529869, 10.995607237866)
-      DateTime       = 2011-03-26T01:28:53
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.4132028618842
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 921.1952315167
-      Line           = 34689.846794559
-      ErrorLine      = -6.0702501480482
-      ErrorSample    = 34.575700762208
-      ErrorMagnitude = 35.104515664764
-      ZScore         = (-1.0755368529869, 10.995607237866)
-      DateTime       = 2011-03-26T01:28:57
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.55739492875273
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300714095:63575/NACL
-      MeasureType    = Automatic
-      Sample         = 1825.3526899535
-      Line           = 6210.3625300914
-      ErrorLine      = -5.2396071082985
-      ErrorSample    = 15.466099973463
-      ErrorMagnitude = 16.329535542644
-      ZScore         = (-1.0755368529869, 10.995607237866)
-      DateTime       = 2011-03-26T01:29:01
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.41862373659296
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300727653:10001/NACR
-      MeasureType    = Automatic
-      Sample         = 1825.3540410005
-      Line           = 24576.450638111
-      ErrorLine      = -12.82021260227
-      ErrorSample    = 14.371941855256
-      ErrorMagnitude = 19.259038497762
-      ZScore         = (-1.0755368529869, 10.995607237866)
-      DateTime       = 2011-03-26T01:29:05
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.41806322681896
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305423011:64885/NACL
-      MeasureType    = Automatic
-      Sample         = 2170.630508542
-      Line           = 28413.027078
-      ErrorLine      = -48.993409196635
-      ErrorSample    = -6.3103120788014
-      ErrorMagnitude = 49.398119227768
-      ZScore         = (-1.0755368529869, 10.995607237866)
-      DateTime       = 2011-03-26T01:29:09
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.56846374691122
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_029
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 55.0
-      Line           = 7443.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:16
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2495.6588816064
-      Line           = 7395.9736386848
-      ErrorLine      = -6.7173056164629
-      ErrorSample    = 1.093505571378
-      ErrorMagnitude = 6.805729143861
-      ZScore         = (-2.3212789409057, 2.4693141270544)
-      DateTime       = 2011-03-25T17:57:19
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.89156356922399
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 1137.0880724521
-      Line           = 6424.2918298341
-      ErrorLine      = -1.742614301872
-      ErrorSample    = 0.41493519131336
-      ErrorMagnitude = 1.7913335306634
-      ZScore         = (-1.2982876270431, 9.3434798634058)
-      DateTime       = 2011-03-26T01:29:11
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.55624316865578
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274888710:05688/NACR
-      MeasureType    = Automatic
-      Sample         = 2325.5653683888
-      Line           = 5657.8043758886
-      ErrorLine      = -2.8890996092205
-      ErrorSample    = -0.15962582859993
-      ErrorMagnitude = 2.8935059974284
-      ZScore         = (-1.2982876270431, 9.3434798634058)
-      DateTime       = 2011-03-26T01:29:14
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.5620460287264
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277184863:36490/NACR
-      MeasureType    = Automatic
-      Sample         = 1516.0903102683
-      Line           = 12197.539224819
-      ErrorLine      = -9.1587515403389
-      ErrorSample    = -13.380316943643
-      ErrorMagnitude = 16.214672716093
-      ZScore         = (-1.2982876270431, 9.3434798634058)
-      DateTime       = 2011-03-26T01:29:18
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.32334143393655
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 275.66107075486
-      Line           = 10444.258863462
-      ErrorLine      = -11.776769279257
-      ErrorSample    = -13.472030511331
-      ErrorMagnitude = 17.893795035014
-      ZScore         = (-1.2982876270431, 9.3434798634058)
-      DateTime       = 2011-03-26T01:29:21
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.36997150930802
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277245961:32558/NACL
-      MeasureType    = Automatic
-      Sample         = 66.377522841269
-      Line           = 10592.628492495
-      ErrorLine      = -0.18672238750514
-      ErrorSample    = -7.4828907887917
-      ErrorMagnitude = 7.4852200907508
-      ZScore         = (-1.2982876270431, 9.3434798634058)
-      DateTime       = 2011-03-26T01:29:23
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.42220723711853
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/285452254:35179/NACL
-      MeasureType    = Automatic
-      Sample         = 573.62355656141
-      Line           = 33890.145068232
-      ErrorLine      = -3.2455514793473
-      ErrorSample    = 10.554849940622
-      ErrorMagnitude = 11.042574956691
-      ZScore         = (-1.2982876270431, 9.3434798634058)
-      DateTime       = 2011-03-26T01:29:27
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.4313829993871
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 955.79282969627
-      Line           = 34542.960855308
-      ErrorLine      = -6.1015923413725
-      ErrorSample    = 34.520146177149
-      ErrorMagnitude = 35.055240994636
-      ZScore         = (-1.2982876270431, 9.3434798634058)
-      DateTime       = 2011-03-26T01:29:30
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.53497776195945
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300714095:63575/NACL
-      MeasureType    = Automatic
-      Sample         = 1789.7760793051
-      Line           = 6466.9851370097
-      ErrorLine      = -5.2540370927718
-      ErrorSample    = 15.243704639989
-      ErrorMagnitude = 16.123753809937
-      ZScore         = (-1.2982876270431, 9.3434798634058)
-      DateTime       = 2011-03-26T01:29:33
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.41361251281614
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300727653:10001/NACR
-      MeasureType    = Automatic
-      Sample         = 1798.6391350539
-      Line           = 24839.562136316
-      ErrorLine      = -12.726772643593
-      ErrorSample    = 14.159184487402
-      ErrorMagnitude = 19.038204938229
-      ZScore         = (-1.2982876270431, 9.3434798634058)
-      DateTime       = 2011-03-26T01:29:36
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.40756713641622
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305423011:64885/NACL
-      MeasureType    = Automatic
-      Sample         = 2128.1272495
-      Line           = 28669.043482442
-      ErrorLine      = -49.223807448096
-      ErrorSample    = -6.5552112252331
-      ErrorMagnitude = 49.658373049211
-      ZScore         = (-1.2982876270431, 9.3434798634058)
-      DateTime       = 2011-03-26T01:29:39
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.46351424088607
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_030
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 48.0
-      Line           = 7850.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:17
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2488.5380422114
-      Line           = 7802.8607916858
-      ErrorLine      = -6.7135968702742
-      ErrorSample    = 1.2135583907161
-      ErrorMagnitude = 6.8223974454903
-      ZScore         = (-2.0615615769339, 4.3447829243042)
-      DateTime       = 2011-03-25T17:57:19
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.92850435982496
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 1159.4632403137
-      Line           = 6831.1873739144
-      ErrorLine      = -1.7519305491724
-      ErrorSample    = 0.55943240523584
-      ErrorMagnitude = 1.8390827238467
-      ZScore         = (-1.2118338861362, 11.790709884065)
-      DateTime       = 2011-03-26T01:29:42
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.60707895881933
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274888710:05688/NACR
-      MeasureType    = Automatic
-      Sample         = 2377.6045469816
-      Line           = 6063.0335655151
-      ErrorLine      = -2.9982006000282
-      ErrorSample    = -0.11215228572291
-      ErrorMagnitude = 3.0002974807846
-      ZScore         = (-1.2118338861362, 11.790709884065)
-      DateTime       = 2011-03-26T01:29:45
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.61383484010366
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277184863:36490/NACR
-      MeasureType    = Automatic
-      Sample         = 1565.5561645949
-      Line           = 12597.016192041
-      ErrorLine      = -9.0383291692397
-      ErrorSample    = -12.901681127703
-      ErrorMagnitude = 15.752611532456
-      ZScore         = (-1.2118338861362, 11.790709884065)
-      DateTime       = 2011-03-26T01:29:49
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.47867785917697
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 289.71345222273
-      Line           = 10845.528398395
-      ErrorLine      = -11.776733550916
-      ErrorSample    = -13.132252044843
-      ErrorMagnitude = 17.639373483731
-      ZScore         = (-1.2118338861362, 11.790709884065)
-      DateTime       = 2011-03-26T01:29:52
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.51060410742684
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 1421.4677786396
-      Line           = 11714.78190778
-      ErrorLine      = -2.9109004676684
-      ErrorSample    = -5.7232568853508
-      ErrorMagnitude = 6.4209820828583
-      ZScore         = (-1.2118338861362, 11.790709884065)
-      DateTime       = 2011-03-26T01:29:55
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.5320493107447
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/285452254:35179/NACL
-      MeasureType    = Automatic
-      Sample         = 520.37170106145
-      Line           = 33498.056487281
-      ErrorLine      = -3.315471323127
-      ErrorSample    = 11.234657559664
-      ErrorMagnitude = 11.713662133483
-      ZScore         = (-1.2118338861362, 11.790709884065)
-      DateTime       = 2011-03-26T01:29:58
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.44234445299116
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 920.98968432216
-      Line           = 34150.379779509
-      ErrorLine      = -6.0613373310553
-      ErrorSample    = 34.286286668232
-      ErrorMagnitude = 34.817944565081
-      ZScore         = (-1.2118338861362, 11.790709884065)
-      DateTime       = 2011-03-26T01:30:02
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.58164915990164
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300714095:63575/NACL
-      MeasureType    = Automatic
-      Sample         = 1611.4691717387
-      Line           = 7134.4422823912
-      ErrorLine      = -5.6234400018056
-      ErrorSample    = 15.305957936215
-      ErrorMagnitude = 16.306300187323
-      ZScore         = (-1.2118338861362, 11.790709884065)
-      DateTime       = 2011-03-26T01:30:05
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.42318016342051
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300727653:10001/NACR
-      MeasureType    = Automatic
-      Sample         = 1636.7839012032
-      Line           = 25526.413259772
-      ErrorLine      = -11.717700080022
-      ErrorSample    = 14.346079929575
-      ErrorMagnitude = 18.523350250727
-      ZScore         = (-1.2118338861362, 11.790709884065)
-      DateTime       = 2011-03-26T01:30:09
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.41081617376858
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305423011:64885/NACL
-      MeasureType    = Automatic
-      Sample         = 1931.7149646751
-      Line           = 29333.307544276
-      ErrorLine      = -50.568318314592
-      ErrorSample    = -6.6657574022327
-      ErrorMagnitude = 51.005755939024
-      ZScore         = (-1.2118338861362, 11.790709884065)
-      DateTime       = 2011-03-26T01:30:13
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.50512544137928
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_031
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 61.0
-      Line           = 8076.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:17
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2501.9462612162
-      Line           = 8028.8666248567
-      ErrorLine      = -6.7848187641612
-      ErrorSample    = 0.79120513800717
-      ErrorMagnitude = 6.830795797923
-      ZScore         = (-2.2578083921873, 3.4354290736125)
-      DateTime       = 2011-03-25T17:57:19
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.87019371352892
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 1188.5906849517
-      Line           = 7056.4819430549
-      ErrorLine      = -1.8029594962709
-      ErrorSample    = 0.42194027001642
-      ErrorMagnitude = 1.8516739822806
-      ZScore         = (-1.5908096297861, 6.2149975208479)
-      DateTime       = 2011-03-26T01:30:16
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.52818180145186
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277184863:36490/NACR
-      MeasureType    = Automatic
-      Sample         = 1573.2527364807
-      Line           = 12819.68561784
-      ErrorLine      = -9.1105328908561
-      ErrorSample    = -13.162410415355
-      ErrorMagnitude = 16.007837377285
-      ZScore         = (-1.5908096297861, 6.2149975208479)
-      DateTime       = 2011-03-26T01:30:19
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.35353632728584
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 277.67237678908
-      Line           = 11068.467202514
-      ErrorLine      = -11.848136323486
-      ErrorSample    = -13.384325294078
-      ErrorMagnitude = 17.875080361151
-      ZScore         = (-1.5908096297861, 6.2149975208479)
-      DateTime       = 2011-03-26T01:30:22
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.39007684866556
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 1390.7234877976
-      Line           = 11937.143925395
-      ErrorLine      = -2.9064649368029
-      ErrorSample    = -5.9047637772107
-      ErrorMagnitude = 6.5813200570649
-      ZScore         = (-1.5908096297861, 6.2149975208479)
-      DateTime       = 2011-03-26T01:30:26
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.41726826642844
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/285452254:35179/NACL
-      MeasureType    = Automatic
-      Sample         = 520.50082223851
-      Line           = 33279.561499262
-      ErrorLine      = -3.0775371306299
-      ErrorSample    = 10.741308790903
-      ErrorMagnitude = 11.173493157108
-      ZScore         = (-1.5908096297861, 6.2149975208479)
-      DateTime       = 2011-03-26T01:30:30
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.39851229505621
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 930.94436636915
-      Line           = 33932.400166564
-      ErrorLine      = -6.0752629536219
-      ErrorSample    = 33.874372248731
-      ErrorMagnitude = 34.414850213262
-      ZScore         = (-1.5908096297861, 6.2149975208479)
-      DateTime       = 2011-03-26T01:30:33
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.50258184525683
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300714095:63575/NACL
-      MeasureType    = Automatic
-      Sample         = 1533.3657263264
-      Line           = 7510.5834958786
-      ErrorLine      = -6.6435181590023
-      ErrorSample    = 15.027916862032
-      ErrorMagnitude = 16.430904379892
-      ZScore         = (-1.5908096297861, 6.2149975208479)
-      DateTime       = 2011-03-26T01:30:38
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.38435657761511
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300727653:10001/NACR
-      MeasureType    = Automatic
-      Sample         = 1568.5298132635
-      Line           = 25912.516041042
-      ErrorLine      = -11.838104309874
-      ErrorSample    = 13.977091072139
-      ErrorMagnitude = 18.316653310316
-      ZScore         = (-1.5908096297861, 6.2149975208479)
-      DateTime       = 2011-03-26T01:30:41
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.38351311540919
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305423011:64885/NACL
-      MeasureType    = Automatic
-      Sample         = 1843.2692911108
-      Line           = 29706.821540337
-      ErrorLine      = -50.892209479924
-      ErrorSample    = -6.7620481110516
-      ErrorMagnitude = 51.339480718105
-      ZScore         = (-1.5908096297861, 6.2149975208479)
-      DateTime       = 2011-03-26T01:30:45
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.43105712861507
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_032
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 46.0
-      Line           = 8213.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:17
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2486.6437091676
-      Line           = 8165.8546744447
-      ErrorLine      = -6.7700009814553
-      ErrorSample    = 1.1213690991863
-      ErrorMagnitude = 6.8622432152697
-      ZScore         = (-1.152087141429, 3.9094144405956)
-      DateTime       = 2011-03-25T17:57:20
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.84836545401163
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 1184.3194016121
-      Line           = 7193.9725826466
-      ErrorLine      = -1.818204857921
-      ErrorSample    = 0.47279613507953
-      ErrorMagnitude = 1.8786710970028
-      ZScore         = (-1.414593489743, 6.7116212014847)
-      DateTime       = 2011-03-26T01:30:48
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.57733424511207
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274888710:05688/NACR
-      MeasureType    = Automatic
-      Sample         = 2429.6832439901
-      Line           = 6424.1663034359
-      ErrorLine      = -3.0466725264114
-      ErrorSample    = -0.13417356754371
-      ErrorMagnitude = 3.049625555608
-      ZScore         = (-1.414593489743, 6.7116212014847)
-      DateTime       = 2011-03-26T01:30:51
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.57896822781368
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277184863:36490/NACR
-      MeasureType    = Automatic
-      Sample         = 1606.1831918695
-      Line           = 12953.293110665
-      ErrorLine      = -8.6659908284437
-      ErrorSample    = -13.609301027657
-      ErrorMagnitude = 16.134201917047
-      ZScore         = (-1.414593489743, 6.7116212014847)
-      DateTime       = 2011-03-26T01:30:55
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.34787390433303
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 297.73754932123
-      Line           = 11203.331007189
-      ErrorLine      = -11.630162092468
-      ErrorSample    = -13.756524924489
-      ErrorMagnitude = 18.01395704156
-      ZScore         = (-1.414593489743, 6.7116212014847)
-      DateTime       = 2011-03-26T01:30:59
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.39911081042828
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 1398.049579278
-      Line           = 12072.478330031
-      ErrorLine      = -2.6192175873293
-      ErrorSample    = -6.2598821757772
-      ErrorMagnitude = 6.785751662446
-      ZScore         = (-1.414593489743, 6.7116212014847)
-      DateTime       = 2011-03-26T01:31:03
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.42513642974245
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/285452254:35179/NACL
-      MeasureType    = Automatic
-      Sample         = 480.18215133698
-      Line           = 33147.664899458
-      ErrorLine      = -2.8649978825124
-      ErrorSample    = 10.159151404061
-      ErrorMagnitude = 10.555404782264
-      ZScore         = (-1.414593489743, 6.7116212014847)
-      DateTime       = 2011-03-26T01:31:07
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.38913121619407
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 897.17230818568
-      Line           = 33800.319431961
-      ErrorLine      = -5.9032675511262
-      ErrorSample    = 34.421360951593
-      ErrorMagnitude = 34.923898086268
-      ZScore         = (-1.414593489743, 6.7116212014847)
-      DateTime       = 2011-03-26T01:31:10
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.5107374016261
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300714095:63575/NACL
-      MeasureType    = Automatic
-      Sample         = 1458.7357258857
-      Line           = 7732.3372993597
-      ErrorLine      = -7.1968626308062
-      ErrorSample    = 14.617291103882
-      ErrorMagnitude = 16.292944207304
-      ZScore         = (-1.414593489743, 6.7116212014847)
-      DateTime       = 2011-03-26T01:31:13
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.37116493784379
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300727653:10001/NACR
-      MeasureType    = Automatic
-      Sample         = 1500.4300827787
-      Line           = 26141.374406515
-      ErrorLine      = -12.124336495643
-      ErrorSample    = 13.726687737947
-      ErrorMagnitude = 18.314515874428
-      ZScore         = (-1.414593489743, 6.7116212014847)
-      DateTime       = 2011-03-26T01:31:17
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.36379896194103
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305423011:64885/NACL
-      MeasureType    = Automatic
-      Sample         = 1762.6350133168
-      Line           = 29926.271207727
-      ErrorLine      = -50.875373375868
-      ErrorSample    = -6.9688991803916
-      ErrorMagnitude = 51.350454447068
-      ZScore         = (-1.414593489743, 6.7116212014847)
-      DateTime       = 2011-03-26T01:31:20
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.47285008326253
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_035
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 31.0
-      Line           = 8957.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:19
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2471.6681367674
-      Line           = 8909.897270323
-      ErrorLine      = -6.8980319212569
-      ErrorSample    = 1.1576990894241
-      ErrorMagnitude = 6.9945058130173
-      ZScore         = (-2.2044773512849, 4.215918045675)
-      DateTime       = 2011-03-25T17:57:20
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.84552524101264
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 1225.9405403164
-      Line           = 7937.8974679639
-      ErrorLine      = -1.8544751566806
-      ErrorSample    = 0.56397293669261
-      ErrorMagnitude = 1.9383352599763
-      ZScore         = (-1.4120195959257, 7.8593445831251)
-      DateTime       = 2011-03-26T01:31:24
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.55208678690178
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277184863:36490/NACR
-      MeasureType    = Automatic
-      Sample         = 1702.3713598778
-      Line           = 13684.593955
-      ErrorLine      = -9.0964741384214
-      ErrorSample    = -12.988536269648
-      ErrorMagnitude = 15.85710932607
-      ZScore         = (-1.4120195959257, 7.8593445831251)
-      DateTime       = 2011-03-26T01:31:27
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.46146629813302
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 325.15227039785
-      Line           = 11937.505325761
-      ErrorLine      = -11.960338246023
-      ErrorSample    = -13.248047749981
-      ErrorMagnitude = 17.848262104335
-      ZScore         = (-1.4120195959257, 7.8593445831251)
-      DateTime       = 2011-03-26T01:31:31
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.48381187807536
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 1358.6398603876
-      Line           = 12807.055258891
-      ErrorLine      = -2.9359226585348
-      ErrorSample    = -5.9608398778898
-      ErrorMagnitude = 6.6446409915615
-      ZScore         = (-1.4120195959257, 7.8593445831251)
-      DateTime       = 2011-03-26T01:31:34
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.49239258035959
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/285452254:35179/NACL
-      MeasureType    = Automatic
-      Sample         = 372.47264773039
-      Line           = 32430.955082078
-      ErrorLine      = -3.2224789849279
-      ErrorSample    = 9.6323091777012
-      ErrorMagnitude = 10.157054243388
-      ZScore         = (-1.4120195959257, 7.8593445831251)
-      DateTime       = 2011-03-26T01:31:38
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.34885162049613
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 834.00750062713
-      Line           = 33082.691165707
-      ErrorLine      = -5.9751159409643
-      ErrorSample    = 34.464970388627
-      ErrorMagnitude = 34.979082240632
-      ZScore         = (-1.4120195959257, 7.8593445831251)
-      DateTime       = 2011-03-26T01:31:41
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.50554711561017
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300714095:63575/NACL
-      MeasureType    = Automatic
-      Sample         = 1131.5939868807
-      Line           = 8952.1555928944
-      ErrorLine      = -7.3449079786369
-      ErrorSample    = 13.788726552924
-      ErrorMagnitude = 15.622952767193
-      ZScore         = (-1.4120195959257, 7.8593445831251)
-      DateTime       = 2011-03-26T01:31:46
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.33942069889235
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300727653:10001/NACR
-      MeasureType    = Automatic
-      Sample         = 1210.8548329647
-      Line           = 27397.275569085
-      ErrorLine      = -10.814751791349
-      ErrorSample    = 13.251970712295
-      ErrorMagnitude = 17.104782491105
-      ZScore         = (-1.4120195959257, 7.8593445831251)
-      DateTime       = 2011-03-26T01:31:50
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.3253865306915
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305423011:64885/NACL
-      MeasureType    = Automatic
-      Sample         = 1403.9062930571
-      Line           = 31139.756196446
-      ErrorLine      = -52.595058530711
-      ErrorSample    = -7.2798623553838
-      ErrorMagnitude = 53.096483666645
-      ZScore         = (-1.4120195959257, 7.8593445831251)
-      DateTime       = 2011-03-26T01:31:54
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.43706827958158
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_036
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 33.0
-      Line           = 9286.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:19
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2473.8710288815
-      Line           = 9238.868611017
-      ErrorLine      = -6.8807443941605
-      ErrorSample    = 0.96494230755752
-      ErrorMagnitude = 6.9480757821634
-      ZScore         = (-1.236122146573, 5.0919956200452)
-      DateTime       = 2011-03-25T17:57:20
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.81305318657974
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 1253.0690895562
-      Line           = 8266.531299661
-      ErrorLine      = -1.7539260630056
-      ErrorSample    = 0.59604268989642
-      ErrorMagnitude = 1.8524371845408
-      ZScore         = (-1.1458329450156, 10.196061203267)
-      DateTime       = 2011-03-26T01:31:57
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.62662511427516
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277184863:36490/NACR
-      MeasureType    = Automatic
-      Sample         = 1735.6439675914
-      Line           = 14007.676941688
-      ErrorLine      = -8.5679826072792
-      ErrorSample    = -13.454338644537
-      ErrorMagnitude = 15.950848075276
-      ZScore         = (-1.1458329450156, 10.196061203267)
-      DateTime       = 2011-03-26T01:31:59
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.50818469029127
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 327.59323364309
-      Line           = 12262.086330255
-      ErrorLine      = -11.862519598097
-      ErrorSample    = -13.677574205846
-      ErrorMagnitude = 18.105121026153
-      ZScore         = (-1.1458329450156, 10.196061203267)
-      DateTime       = 2011-03-26T01:32:02
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.52706318724267
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 1331.4986488724
-      Line           = 13131.061732287
-      ErrorLine      = -2.4068270630924
-      ErrorSample    = -6.5410081008442
-      ErrorMagnitude = 6.9697635172898
-      ZScore         = (-1.1458329450156, 10.196061203267)
-      DateTime       = 2011-03-26T01:32:06
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.54733726211361
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/285452254:35179/NACL
-      MeasureType    = Automatic
-      Sample         = 338.16244669019
-      Line           = 32113.116438957
-      ErrorLine      = -2.8374598559021
-      ErrorSample    = 9.9369800345723
-      ErrorMagnitude = 10.334154568292
-      ZScore         = (-1.1458329450156, 10.196061203267)
-      DateTime       = 2011-03-26T01:32:09
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.42629421599122
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 821.13885349703
-      Line           = 32765.344402209
-      ErrorLine      = -6.0447727233768
-      ErrorSample    = 34.565173517004
-      ErrorMagnitude = 35.089749180322
-      ZScore         = (-1.1458329450156, 10.196061203267)
-      DateTime       = 2011-03-26T01:32:12
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.50105120793432
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300714095:63575/NACL
-      MeasureType    = Automatic
-      Sample         = 996.75380330195
-      Line           = 9495.4128811948
-      ErrorLine      = -8.7860566962063
-      ErrorSample    = 13.661408868946
-      ErrorMagnitude = 16.242810241872
-      ZScore         = (-1.1458329450156, 10.196061203267)
-      DateTime       = 2011-03-26T01:32:15
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.43412225433894
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300727653:10001/NACR
-      MeasureType    = Automatic
-      Sample         = 1093.7266185293
-      Line           = 27955.542766354
-      ErrorLine      = -10.937259142476
-      ErrorSample    = 13.212160489546
-      ErrorMagnitude = 17.151816881928
-      ZScore         = (-1.1458329450156, 10.196061203267)
-      DateTime       = 2011-03-26T01:32:18
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.42632916599814
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305423011:64885/NACL
-      MeasureType    = Automatic
-      Sample         = 1255.809670371
-      Line           = 31678.712600626
-      ErrorLine      = -52.86619427691
-      ErrorSample    = -7.623863512903
-      ErrorMagnitude = 53.413086338344
-      ZScore         = (-1.1458329450156, 10.196061203267)
-      DateTime       = 2011-03-26T01:32:20
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.54125123485392
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_037
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 56.0
-      Line           = 9541.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:19
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2496.5149300316
-      Line           = 9493.815490156
-      ErrorLine      = -6.8814871676404
-      ErrorSample    = 1.2145298716014
-      ErrorMagnitude = 6.9878429037444
-      ZScore         = (-2.9633795850399, 4.5449328990432)
-      DateTime       = 2011-03-25T17:57:20
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.65027458504505
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 1294.6652557672
-      Line           = 8520.4654281844
-      ErrorLine      = -1.8130144080969
-      ErrorSample    = 0.56234016313601
-      ErrorMagnitude = 1.8982222480634
-      ZScore         = (-1.5068766500003, 10.335033011862)
-      DateTime       = 2011-03-26T01:32:23
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.52587633086296
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277184863:36490/NACR
-      MeasureType    = Automatic
-      Sample         = 1734.6517454653
-      Line           = 14259.342101813
-      ErrorLine      = -8.5868387936735
-      ErrorSample    = -13.155346352502
-      ErrorMagnitude = 15.709772058271
-      ZScore         = (-1.5068766500003, 10.335033011862)
-      DateTime       = 2011-03-26T01:32:26
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.46276944494002
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 303.57822063572
-      Line           = 12513.815624209
-      ErrorLine      = -11.936330050474
-      ErrorSample    = -13.451851379416
-      ErrorMagnitude = 17.984111893773
-      ZScore         = (-1.5068766500003, 10.335033011862)
-      DateTime       = 2011-03-26T01:32:29
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.47985150099157
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 1285.6440399608
-      Line           = 13381.743193572
-      ErrorLine      = -2.3586609202193
-      ErrorSample    = -6.4735044188342
-      ErrorMagnitude = 6.8898142788638
-      ZScore         = (-1.5068766500003, 10.335033011862)
-      DateTime       = 2011-03-26T01:32:32
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.48989423221064
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/285452254:35179/NACL
-      MeasureType    = Automatic
-      Sample         = 349.64367925512
-      Line           = 31866.639541252
-      ErrorLine      = -2.9935004240651
-      ErrorSample    = 9.6734316052714
-      ErrorMagnitude = 10.126022111903
-      ZScore         = (-1.5068766500003, 10.335033011862)
-      DateTime       = 2011-03-26T01:32:35
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.38037220220122
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 849.11151272767
-      Line           = 32519.193085264
-      ErrorLine      = -6.2090371224112
-      ErrorSample    = 34.137041678935
-      ErrorMagnitude = 34.697114528111
-      ZScore         = (-1.5068766500003, 10.335033011862)
-      DateTime       = 2011-03-26T01:32:39
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.50353701633139
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300714095:63575/NACL
-      MeasureType    = Automatic
-      Sample         = 918.19007449777
-      Line           = 9921.1502641921
-      ErrorLine      = -8.7871616783468
-      ErrorSample    = 13.503641420022
-      ErrorMagnitude = 16.110944787999
-      ZScore         = (-1.5068766500003, 10.335033011862)
-      DateTime       = 2011-03-26T01:32:43
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.3751674198129
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300727653:10001/NACR
-      MeasureType    = Automatic
-      Sample         = 1028.6883831081
-      Line           = 28392.343455015
-      ErrorLine      = -10.045145322048
-      ErrorSample    = 13.16390272832
-      ErrorMagnitude = 16.558782551315
-      ZScore         = (-1.5068766500003, 10.335033011862)
-      DateTime       = 2011-03-26T01:32:46
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.36579429984522
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305423011:64885/NACL
-      MeasureType    = Automatic
-      Sample         = 1166.3992795005
-      Line           = 32102.924473572
-      ErrorLine      = -53.184268829835
-      ErrorSample    = -7.6622062747217
-      ErrorMagnitude = 53.73337748514
-      ZScore         = (-1.5068766500003, 10.335033011862)
-      DateTime       = 2011-03-26T01:32:49
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.44052442778229
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_038
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 45.0
-      Line           = 9874.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:20
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2485.4654907045
-      Line           = 9826.788419916
-      ErrorLine      = -6.9098822813176
-      ErrorSample    = 1.279324921853
-      ErrorMagnitude = 7.0273142378395
-      ZScore         = (-2.6405353455067, 5.6882760596714)
-      DateTime       = 2011-03-25T17:57:20
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.77782215104708
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 1308.5100709591
-      Line           = 8853.62689856
-      ErrorLine      = -1.7903988352464
-      ErrorSample    = 0.48195543449447
-      ErrorMagnitude = 1.8541329591187
-      ZScore         = (-1.4622995904913, 10.340281466844)
-      DateTime       = 2011-03-26T01:32:52
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.53498612518524
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277184863:36490/NACR
-      MeasureType    = Automatic
-      Sample         = 1782.3882863142
-      Line           = 14586.02699913
-      ErrorLine      = -8.3603813321552
-      ErrorSample    = -13.366748797541
-      ErrorMagnitude = 15.765974420746
-      ZScore         = (-1.4622995904913, 10.340281466844)
-      DateTime       = 2011-03-26T01:32:55
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.35299367198968
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 321.32000855444
-      Line           = 12842.022021269
-      ErrorLine      = -11.690088307898
-      ErrorSample    = -13.545196731043
-      ErrorMagnitude = 17.892191568646
-      ZScore         = (-1.4622995904913, 10.340281466844)
-      DateTime       = 2011-03-26T01:32:59
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.382425121099
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 1274.257240049
-      Line           = 13710.279425866
-      ErrorLine      = -2.1381372368196
-      ErrorSample    = -6.4859621533355
-      ErrorMagnitude = 6.8292998102276
-      ZScore         = (-1.4622995904913, 10.340281466844)
-      DateTime       = 2011-03-26T01:33:02
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.41630959048507
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/285452254:35179/NACL
-      MeasureType    = Automatic
-      Sample         = 295.32954228755
-      Line           = 31545.744140576
-      ErrorLine      = -2.9148863291339
-      ErrorSample    = 10.263107818983
-      ErrorMagnitude = 10.669017968672
-      ZScore         = (-1.4622995904913, 10.340281466844)
-      DateTime       = 2011-03-26T01:33:05
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.39397265645403
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 812.53500709693
-      Line           = 32198.179257017
-      ErrorLine      = -6.1514983417037
-      ErrorSample    = 33.807575153826
-      ErrorMagnitude = 34.362669710451
-      ZScore         = (-1.4622995904913, 10.340281466844)
-      DateTime       = 2011-03-26T01:33:09
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.51432657320947
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300714095:63575/NACL
-      MeasureType    = Automatic
-      Sample         = 767.92501805792
-      Line           = 10466.222150551
-      ErrorLine      = -9.2455078152034
-      ErrorSample    = 13.52911922977
-      ErrorMagnitude = 16.386472527494
-      ZScore         = (-1.4622995904913, 10.340281466844)
-      DateTime       = 2011-03-26T01:33:12
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.38354655567036
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300727653:10001/NACR
-      MeasureType    = Automatic
-      Sample         = 893.58897516544
-      Line           = 28953.767982179
-      ErrorLine      = -9.8525327941315
-      ErrorSample    = 13.259937692003
-      ErrorMagnitude = 16.519635288203
-      ZScore         = (-1.4622995904913, 10.340281466844)
-      DateTime       = 2011-03-26T01:33:16
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.37644421521236
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305423011:64885/NACL
-      MeasureType    = Automatic
-      Sample         = 1002.862418923
-      Line           = 32644.854053895
-      ErrorLine      = -54.147448019365
-      ErrorSample    = -7.8994267599774
-      ErrorMagnitude = 54.720627464843
-      ZScore         = (-1.4622995904913, 10.340281466844)
-      DateTime       = 2011-03-26T01:33:19
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.41814072253965
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_039
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 61.0
-      Line           = 10100.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:20
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2501.7227954776
-      Line           = 10052.723790655
-      ErrorLine      = -6.866509226069
-      ErrorSample    = 0.97274761490826
-      ErrorMagnitude = 6.9350693488963
-      ZScore         = (-2.1877759089998, 4.1960932598363)
-      DateTime       = 2011-03-25T17:57:20
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.8221053384168
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 1341.1855387473
-      Line           = 9078.8382407877
-      ErrorLine      = -1.9135031968199
-      ErrorSample    = 0.4239340085187
-      ErrorMagnitude = 1.959901662793
-      ZScore         = (-1.773863401187, 6.3206404868612)
-      DateTime       = 2011-03-26T01:33:25
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.46702014007315
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/285452254:35179/NACL
-      MeasureType    = Automatic
-      Sample         = 297.39958740097
-      Line           = 31326.941577314
-      ErrorLine      = -2.5284746180441
-      ErrorSample    = 10.663704939761
-      ErrorMagnitude = 10.959369823871
-      ZScore         = (-1.773863401187, 6.3206404868612)
-      DateTime       = 2011-03-26T01:33:34
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.28674392167704
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 828.95805060592
-      Line           = 31979.953739562
-      ErrorLine      = -6.018905883051
-      ErrorSample    = 33.779219604358
-      ErrorMagnitude = 34.311264988462
-      ZScore         = (-1.773863401187, 6.3206404868612)
-      DateTime       = 2011-03-26T01:33:37
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.42683239378584
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300714095:63575/NACL
-      MeasureType    = Automatic
-      Sample         = 692.82585392227
-      Line           = 10843.2044134
-      ErrorLine      = -10.121564512903
-      ErrorSample    = 13.812587676734
-      ErrorMagnitude = 17.12406629619
-      ZScore         = (-1.773863401187, 6.3206404868612)
-      DateTime       = 2011-03-26T01:33:41
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.27724793533662
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300727653:10001/NACR
-      MeasureType    = Automatic
-      Sample         = 830.59350089318
-      Line           = 29340.91378531
-      ErrorLine      = -10.19670142289
-      ErrorSample    = 13.526467322719
-      ErrorMagnitude = 16.939245500912
-      ZScore         = (-1.773863401187, 6.3206404868612)
-      DateTime       = 2011-03-26T01:33:44
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.27725522898527
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305423011:64885/NACL
-      MeasureType    = Automatic
-      Sample         = 918.88807936241
-      Line           = 33019.238255507
-      ErrorLine      = -54.200029085441
-      ErrorSample    = -8.0827441243538
-      ErrorMagnitude = 54.799396944149
-      ZScore         = (-1.773863401187, 6.3206404868612)
-      DateTime       = 2011-03-26T01:33:47
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.35651388494352
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305443365:16554/NACR
-      MeasureType    = Automatic
-      Sample         = 2398.1843846616
-      Line           = 31038.842035678
-      ErrorLine      = -38.419624929433
-      ErrorSample    = -8.9704601246744
-      ErrorMagnitude = 39.452968640733
-      ZScore         = (-1.773863401187, 6.3206404868612)
-      DateTime       = 2011-03-26T01:33:50
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.36208134773733
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_040
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 31.0
-      Line           = 10295.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:21
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2471.7316909545
-      Line           = 10247.851675836
-      ErrorLine      = -7.0037828725763
-      ErrorSample    = 1.1181626915422
-      ErrorMagnitude = 7.0924792795573
-      ZScore         = (-1.1063716658373, 4.6740857933736)
-      DateTime       = 2011-03-25T17:57:20
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.80999204460727
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 1326.6468902548
-      Line           = 9274.8509961652
-      ErrorLine      = -1.9676002796732
-      ErrorSample    = 0.71788392605754
-      ErrorMagnitude = 2.0944708620226
-      ZScore         = (-1.6783416926621, 5.7006327167979)
-      DateTime       = 2011-03-26T01:33:52
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.47680490592757
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/285452254:35179/NACL
-      MeasureType    = Automatic
-      Sample         = 223.46651769644
-      Line           = 31139.765312577
-      ErrorLine      = -2.5018412545178
-      ErrorSample    = 11.175926568948
-      ErrorMagnitude = 11.45253440673
-      ZScore         = (-2.0226268790553, 4.8853157560472)
-      DateTime       = 2011-03-26T03:02:36
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.25923280356801
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 766.80780410599
-      Line           = 31792.128691036
-      ErrorLine      = -5.9650510999018
-      ErrorSample    = 34.453530313056
-      ErrorMagnitude = 34.966091941438
-      ZScore         = (-1.6783416926621, 5.7006327167979)
-      DateTime       = 2011-03-26T01:34:02
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.34627071261457
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300714095:63575/NACL
-      MeasureType    = Automatic
-      Sample         = 575.1713802433
-      Line           = 11156.25699816
-      ErrorLine      = -10.803870686888
-      ErrorSample    = 14.666778822757
-      ErrorMagnitude = 18.216421790645
-      ZScore         = (-2.0226268790553, 4.8853157560472)
-      DateTime       = 2011-03-26T03:02:44
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.2479695094371
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300727653:10001/NACR
-      MeasureType    = Automatic
-      Sample         = 723.39835970918
-      Line           = 29664.001457776
-      ErrorLine      = -10.05174579073
-      ErrorSample    = 13.838002157962
-      ErrorMagnitude = 17.103446938124
-      ZScore         = (-1.6783416926621, 5.7006327167979)
-      DateTime       = 2011-03-26T01:34:08
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.19769404652425
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305423011:64885/NACL
-      MeasureType    = Automatic
-      Sample         = 795.10815119669
-      Line           = 33328.906951439
-      ErrorLine      = -54.221497803941
-      ErrorSample    = -8.4084862993914
-      ErrorMagnitude = 54.869604208066
-      ZScore         = (-1.6783416926621, 5.7006327167979)
-      DateTime       = 2011-03-26T01:34:12
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.37707473830687
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305443365:16554/NACR
-      MeasureType    = Automatic
-      Sample         = 2287.4859576362
-      Line           = 31360.815408059
-      ErrorLine      = -37.852219406403
-      ErrorSample    = -8.9314033357737
-      ErrorMagnitude = 38.891650511861
-      ZScore         = (-1.6783416926621, 5.7006327167979)
-      DateTime       = 2011-03-26T01:34:15
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.38831649165877
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_041
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 50.0
-      Line           = 10661.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:21
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2490.2795162174
-      Line           = 10613.680052785
-      ErrorLine      = -6.8564663072611
-      ErrorSample    = 1.4689827283401
-      ErrorMagnitude = 7.0120639243213
-      ZScore         = (-3.2772360363013, 5.0749147979876)
-      DateTime       = 2011-03-25T17:57:21
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.83396256241258
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 1372.6624681245
-      Line           = 9639.6881503852
-      ErrorLine      = -1.9143678428954
-      ErrorSample    = 0.70855891996393
-      ErrorMagnitude = 2.041288803911
-      ZScore         = (-1.5976904077056, 7.9423971175559)
-      DateTime       = 2011-03-26T01:34:18
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.49560771517099
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277184863:36490/NACR
-      MeasureType    = Automatic
-      Sample         = 1859.2914305364
-      Line           = 15360.137177784
-      ErrorLine      = -8.3196602151602
-      ErrorSample    = -12.991677177531
-      ErrorMagnitude = 15.427262297015
-      ZScore         = (-1.5976904077056, 7.9423971175559)
-      DateTime       = 2011-03-26T01:34:21
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.44182700198144
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 325.80954613993
-      Line           = 13618.586166729
-      ErrorLine      = -11.931440438808
-      ErrorSample    = -13.323707059722
-      ErrorMagnitude = 17.885201725396
-      ZScore         = (-1.5976904077056, 7.9423971175559)
-      DateTime       = 2011-03-26T01:34:24
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.45305358228688
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 1208.8100992974
-      Line           = 14486.333209631
-      ErrorLine      = -2.2678649643694
-      ErrorSample    = -6.5669027098625
-      ErrorMagnitude = 6.9474759947346
-      ZScore         = (-1.5976904077056, 7.9423971175559)
-      DateTime       = 2011-03-26T01:34:27
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.45815697558646
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/285452254:35179/NACL
-      MeasureType    = Automatic
-      Sample         = 216.37409902171
-      Line           = 30786.546464159
-      ErrorLine      = -2.8062112261759
-      ErrorSample    = 10.091427940861
-      ErrorMagnitude = 10.474337178624
-      ZScore         = (-1.5976904077056, 7.9423971175559)
-      DateTime       = 2011-03-26T01:34:30
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.36036357946887
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 782.20904706297
-      Line           = 31439.182486757
-      ErrorLine      = -6.1864012560582
-      ErrorSample    = 33.761350515084
-      ErrorMagnitude = 34.323466449403
-      ZScore         = (-1.5976904077056, 7.9423971175559)
-      DateTime       = 2011-03-26T01:34:33
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.46512811964021
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300714095:63575/NACL
-      MeasureType    = Automatic
-      Sample         = 447.29812001037
-      Line           = 11763.353049369
-      ErrorLine      = -10.747257059274
-      ErrorSample    = 12.989381652481
-      ErrorMagnitude = 16.859050092218
-      ZScore         = (-1.5976904077056, 7.9423971175559)
-      DateTime       = 2011-03-26T01:34:37
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.35326084668486
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300727653:10001/NACR
-      MeasureType    = Automatic
-      Sample         = 613.96786091
-      Line           = 30287.910583096
-      ErrorLine      = -9.2501148411211
-      ErrorSample    = 13.296971207052
-      ErrorMagnitude = 16.197964929432
-      ZScore         = (-1.5976904077056, 7.9423971175559)
-      DateTime       = 2011-03-26T01:34:40
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.34500463227232
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305423011:64885/NACL
-      MeasureType    = Automatic
-      Sample         = 650.50828065871
-      Line           = 33934.595912123
-      ErrorLine      = -55.891019066221
-      ErrorSample    = -8.3433765907694
-      ErrorMagnitude = 56.510334852981
-      ZScore         = (-1.5976904077056, 7.9423971175559)
-      DateTime       = 2011-03-26T01:34:44
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.38996288445287
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305443365:16554/NACR
-      MeasureType    = Automatic
-      Sample         = 2170.9813968207
-      Line           = 31984.567121493
-      ErrorLine      = -37.697449510109
-      ErrorSample    = -8.6531451807323
-      ErrorMagnitude = 38.677831132136
-      ZScore         = (-1.5976904077056, 7.9423971175559)
-      DateTime       = 2011-03-26T01:34:48
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.38429443765108
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_042
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 61.0
-      Line           = 10886.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:22
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2501.2095244591
-      Line           = 10838.536456941
-      ErrorLine      = -6.8751728955322
-      ErrorSample    = 1.4986733899896
-      ErrorMagnitude = 7.0366202308582
-      ZScore         = (-4.9711691434528, 4.8704284437785)
-      DateTime       = 2011-03-25T17:57:21
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.76333061678815
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 1398.1474918002
-      Line           = 9864.1045202462
-      ErrorLine      = -1.9306140426179
-      ErrorSample    = 0.65800177612823
-      ErrorMagnitude = 2.0396658841441
-      ZScore         = (-1.4133709952007, 11.56428124888)
-      DateTime       = 2011-03-26T01:34:51
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.51145397032633
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277184863:36490/NACR
-      MeasureType    = Automatic
-      Sample         = 1867.0263822727
-      Line           = 15581.574896623
-      ErrorLine      = -8.4007220289041
-      ErrorSample    = -12.938252801679
-      ErrorMagnitude = 15.426293014431
-      ZScore         = (-1.4133709952007, 11.56428124888)
-      DateTime       = 2011-03-26T01:34:54
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.38376833928942
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 316.10736239404
-      Line           = 13840.400856588
-      ErrorLine      = -11.929833108381
-      ErrorSample    = -13.245850407837
-      ErrorMagnitude = 17.826201811396
-      ZScore         = (-1.4133709952007, 11.56428124888)
-      DateTime       = 2011-03-26T01:34:57
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.42368903400438
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 1182.5526545653
-      Line           = 14707.77759305
-      ErrorLine      = -2.2138818459134
-      ErrorSample    = -6.6372355195081
-      ErrorMagnitude = 6.9967255319246
-      ZScore         = (-1.4133709952007, 11.56428124888)
-      DateTime       = 2011-03-26T01:35:01
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.46395691224188
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/285452254:35179/NACL
-      MeasureType    = Automatic
-      Sample         = 217.03329719845
-      Line           = 30569.182078864
-      ErrorLine      = -2.667635234262
-      ErrorSample    = 9.6882455292621
-      ErrorMagnitude = 10.048799887466
-      ZScore         = (-1.4133709952007, 11.56428124888)
-      DateTime       = 2011-03-26T01:35:03
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.36957249078932
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 787.86708162035
-      Line           = 31222.119502403
-      ErrorLine      = -6.1891134331709
-      ErrorSample    = 33.694045801423
-      ErrorMagnitude = 34.257756020455
-      ZScore         = (-1.4133709952007, 11.56428124888)
-      DateTime       = 2011-03-26T01:35:08
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.48618089320735
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300714095:63575/NACL
-      MeasureType    = Automatic
-      Sample         = 371.44955892107
-      Line           = 12136.562717724
-      ErrorLine      = -11.1068981628
-      ErrorSample    = 12.759714520771
-      ErrorMagnitude = 16.916663425463
-      ZScore         = (-1.4133709952007, 11.56428124888)
-      DateTime       = 2011-03-26T01:35:11
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.36986725904262
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300727653:10001/NACR
-      MeasureType    = Automatic
-      Sample         = 544.78616079859
-      Line           = 30671.522563436
-      ErrorLine      = -9.1263096819748
-      ErrorSample    = 13.117619593571
-      ErrorMagnitude = 15.980033548555
-      ZScore         = (-1.4133709952007, 11.56428124888)
-      DateTime       = 2011-03-26T01:35:14
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.36153949042637
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305423011:64885/NACL
-      MeasureType    = Automatic
-      Sample         = 565.18885421567
-      Line           = 34306.000408194
-      ErrorLine      = -56.357000689757
-      ErrorSample    = -8.580291534126
-      ErrorMagnitude = 57.006428844086
-      ZScore         = (-1.4133709952007, 11.56428124888)
-      DateTime       = 2011-03-26T01:35:18
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.41458139782753
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305443365:16554/NACR
-      MeasureType    = Automatic
-      Sample         = 2094.6784233382
-      Line           = 32367.67924512
-      ErrorLine      = -37.535279901218
-      ErrorSample    = -8.4229687561124
-      ErrorMagnitude = 38.468735876413
-      ZScore         = (-1.4133709952007, 11.56428124888)
-      DateTime       = 2011-03-26T01:35:22
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.41146952193867
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_043
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Estimated
-      Sample         = 2503.0
-      Line           = 10986.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:22
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Automatic
-      Sample         = 62.376311932754
-      Line           = 11033.488599177
-      ErrorLine      = 6.8601319769004
-      ErrorSample    = -1.0845378805246
-      ErrorMagnitude = 6.9453317526799
-      ZScore         = (-1.0437974645432, 2.3172800606027)
-      DateTime       = 2011-03-25T17:57:21
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.98164669704269
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 1409.7443819435
-      Line           = 10011.324103928
-      ErrorLine      = 5.068543860174
-      ErrorSample    = -0.39185216964256
-      ErrorMagnitude = 5.0836684574588
-      ZScore         = (-0.82678858233251, 5.930867046324)
-      DateTime       = 2011-03-26T01:35:25
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.7378874906999
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 481.81520778191
-      Line           = 12926.487412413
-      ErrorLine      = 1054.2262309382
-      ErrorSample    = -177.03014128311
-      ErrorMagnitude = 1068.9867243894
-      ZScore         = (-0.88682697386181, 5.3883273112095)
-      DateTime       = 2011-03-26T03:02:51
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.55510603464518
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/285452254:35179/NACL
-      MeasureType    = Automatic
-      Sample         = 134.22307182478
-      Line           = 30363.992538252
-      ErrorLine      = 53.662969717232
-      ErrorSample    = 80.127689747461
-      ErrorMagnitude = 96.437342265006
-      ZScore         = (-0.82678858233251, 5.930867046324)
-      DateTime       = 2011-03-26T01:35:30
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.53512541053146
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 690.90052596946
-      Line           = 30936.82670855
-      ErrorLine      = 130.12841144378
-      ErrorSample    = 122.19161986597
-      ErrorMagnitude = 178.50544930156
-      ZScore         = (-0.88682697386181, 5.3883273112095)
-      DateTime       = 2011-03-26T03:03:01
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.52691314261119
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305423011:64885/NACL
-      MeasureType    = Automatic
-      Sample         = 502.09939559009
-      Line           = 34547.602614958
-      ErrorLine      = -45.57337016258
-      ErrorSample    = -12.694142091088
-      ErrorMagnitude = 47.308279522767
-      ZScore         = (-0.82678858233251, 5.930867046324)
-      DateTime       = 2011-03-26T01:35:42
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.66497253996931
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305443365:16554/NACR
-      MeasureType    = Automatic
-      Sample         = 2038.8933302565
-      Line           = 32617.496536705
-      ErrorLine      = -26.009518576935
-      ErrorSample    = -13.238747113392
-      ErrorMagnitude = 29.184918737873
-      ZScore         = (-0.82678858233251, 5.930867046324)
-      DateTime       = 2011-03-26T01:35:46
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.67156010104964
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_046
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 40.0
-      Line           = 12024.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:22
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2480.4363556198
-      Line           = 11976.631765298
-      ErrorLine      = -6.9393881391716
-      ErrorSample    = 1.325055290888
-      ErrorMagnitude = 7.0647632140069
-      ZScore         = (-0.95465516621342, 3.9763374586599)
-      DateTime       = 2011-03-25T17:57:21
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.8775687458317
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 1465.0785982929
-      Line           = 11001.885789277
-      ErrorLine      = -1.9588248158834
-      ErrorSample    = 0.7563391570734
-      ErrorMagnitude = 2.099772268567
-      ZScore         = (-0.96849674006899, 6.5647754379295)
-      DateTime       = 2011-03-26T01:35:49
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.70367031422029
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 1118.6502592157
-      Line           = 15830.750161372
-      ErrorLine      = -2.1577207445589
-      ErrorSample    = -6.9123667173478
-      ErrorMagnitude = 7.2413101332975
-      ZScore         = (-0.96849674006899, 6.5647754379295)
-      DateTime       = 2011-03-26T01:35:54
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.65801125044027
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 697.60250272818
-      Line           = 30124.524618063
-      ErrorLine      = -6.271563722672
-      ErrorSample    = 33.757882089243
-      ErrorMagnitude = 34.335508073695
-      ZScore         = (-0.96849674006899, 6.5647754379295)
-      DateTime       = 2011-03-26T01:35:57
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.51273177821122
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300727653:10001/NACR
-      MeasureType    = Automatic
-      Sample         = 107.90352762329
-      Line           = 32593.560005011
-      ErrorLine      = -7.9727741572897
-      ErrorSample    = 11.311838042836
-      ErrorMagnitude = 13.839176553195
-      ZScore         = (-0.96849674006899, 6.5647754379295)
-      DateTime       = 2011-03-26T01:36:00
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.51334728881739
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305443365:16554/NACR
-      MeasureType    = Automatic
-      Sample         = 1644.4145643056
-      Line           = 34287.139439773
-      ErrorLine      = -36.592550474503
-      ErrorSample    = -8.6110191939611
-      ErrorMagnitude = 37.592078976665
-      ZScore         = (-0.96849674006899, 6.5647754379295)
-      DateTime       = 2011-03-26T01:36:04
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.63359040196519
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_047
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 31.0
-      Line           = 12281.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:23
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2471.6508539651
-      Line           = 12233.604008087
-      ErrorLine      = -7.003230459899
-      ErrorSample    = 1.1620242454665
-      ErrorMagnitude = 7.0989814214089
-      ZScore         = (-3.2585837898195, 4.9777551332578)
-      DateTime       = 2011-03-25T17:57:21
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.7324423369455
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 1474.9438213543
-      Line           = 11258.977565964
-      ErrorLine      = -1.977410217356
-      ErrorSample    = 0.66635775646387
-      ErrorMagnitude = 2.086668116233
-      ZScore         = (-1.3769437311361, 9.7909098909307)
-      DateTime       = 2011-03-26T01:36:08
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.54807164547856
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277184863:36490/NACR
-      MeasureType    = Automatic
-      Sample         = 2051.3732699817
-      Line           = 16951.861095081
-      ErrorLine      = -8.3994978321134
-      ErrorSample    = -12.884482071912
-      ErrorMagnitude = 15.380554024257
-      ZScore         = (-1.3769437311361, 9.7909098909307)
-      DateTime       = 2011-03-26T01:36:11
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.49168523676417
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 370.09087166727
-      Line           = 15216.635534076
-      ErrorLine      = -11.966684737132
-      ErrorSample    = -13.285096147797
-      ErrorMagnitude = 17.88002581805
-      ZScore         = (-1.3769437311361, 9.7909098909307)
-      DateTime       = 2011-03-26T01:36:13
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.50331180453941
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 1110.7726752041
-      Line           = 16084.479827952
-      ErrorLine      = -2.1666344262812
-      ErrorSample    = -6.7740544143526
-      ErrorMagnitude = 7.1121106533684
-      ZScore         = (-1.3769437311361, 9.7909098909307)
-      DateTime       = 2011-03-26T01:36:17
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.50423070746456
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 668.96443015251
-      Line           = 29876.729087108
-      ErrorLine      = -6.2556662296156
-      ErrorSample    = 33.687818001333
-      ErrorMagnitude = 34.263719028548
-      ZScore         = (-1.3769437311361, 9.7909098909307)
-      DateTime       = 2011-03-26T01:36:21
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.52228087799995
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305443365:16554/NACR
-      MeasureType    = Automatic
-      Sample         = 1536.2919412592
-      Line           = 34719.738619628
-      ErrorLine      = -36.665172239656
-      ErrorSample    = -8.4921117193858
-      ErrorMagnitude = 37.63576512864
-      ZScore         = (-1.3769437311361, 9.7909098909307)
-      DateTime       = 2011-03-26T01:36:27
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.44413643899588
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_048
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 31.0
-      Line           = 12386.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:23
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2471.3036573591
-      Line           = 12338.543206852
-      ErrorLine      = -6.9694863088989
-      ErrorSample    = 1.4933609127138
-      ErrorMagnitude = 7.1276830895846
-      ZScore         = (-3.035220474852, 3.1417882087404)
-      DateTime       = 2011-03-25T17:57:21
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.76420063390469
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 1482.2554519946
-      Line           = 11363.924356627
-      ErrorLine      = -2.0508650554566
-      ErrorSample    = 0.60637338668039
-      ErrorMagnitude = 2.1386295050259
-      ZScore         = (-1.4655256063783, 9.4478928401102)
-      DateTime       = 2011-03-26T01:36:30
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.56975229242562
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277184863:36490/NACR
-      MeasureType    = Automatic
-      Sample         = 2061.7321801056
-      Line           = 17055.079854059
-      ErrorLine      = -8.4549677539762
-      ErrorSample    = -12.942070332776
-      ErrorMagnitude = 15.459096487806
-      ZScore         = (-1.4655256063783, 9.4478928401102)
-      DateTime       = 2011-03-26T01:36:33
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.52074880752662
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 371.69296857336
-      Line           = 15320.256799293
-      ErrorLine      = -12.057566621974
-      ErrorSample    = -13.357728275802
-      ErrorMagnitude = 17.994827521638
-      ZScore         = (-1.4655256063783, 9.4478928401102)
-      DateTime       = 2011-03-26T01:36:36
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.52694226900712
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 1103.8687665904
-      Line           = 16188.098040807
-      ErrorLine      = -2.2498300340339
-      ErrorSample    = -6.8262180020722
-      ErrorMagnitude = 7.1874186878083
-      ZScore         = (-1.4655256063783, 9.4478928401102)
-      DateTime       = 2011-03-26T01:36:40
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.5279236207025
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 663.32147509831
-      Line           = 29775.414072729
-      ErrorLine      = -6.1728784935913
-      ErrorSample    = 33.574011037943
-      ErrorMagnitude = 34.136763848856
-      ZScore         = (-1.4655256063783, 9.4478928401102)
-      DateTime       = 2011-03-26T01:36:42
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.54714738221992
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305443365:16554/NACR
-      MeasureType    = Automatic
-      Sample         = 1496.4608155575
-      Line           = 34896.848989447
-      ErrorLine      = -36.001175809855
-      ErrorSample    = -8.6770384681336
-      ErrorMagnitude = 37.032089547709
-      ZScore         = (-1.4655256063783, 9.4478928401102)
-      DateTime       = 2011-03-26T01:36:48
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.47044969399394
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_050
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 31.0
-      Line           = 12905.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:24
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2471.4659461641
-      Line           = 12857.392873185
-      ErrorLine      = -6.8877460468884
-      ErrorSample    = 1.3520361978067
-      ErrorMagnitude = 7.0191913698521
-      ZScore         = (-1.3907123195044, 3.4666078590392)
-      DateTime       = 2011-03-25T17:57:22
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.8909092483583
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 1520.484142497
-      Line           = 11882.408528346
-      ErrorLine      = -1.9487905941733
-      ErrorSample    = 0.67527431786584
-      ErrorMagnitude = 2.0624694383936
-      ZScore         = (-1.3946633955234, 9.4964359228538)
-      DateTime       = 2011-03-26T01:36:51
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.55187468364966
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277184863:36490/NACR
-      MeasureType    = Automatic
-      Sample         = 2115.513267758
-      Line           = 17565.570087354
-      ErrorLine      = -8.6831860913626
-      ErrorSample    = -13.072439150742
-      ErrorMagnitude = 15.693514139513
-      ZScore         = (-1.3946633955234, 9.4964359228538)
-      DateTime       = 2011-03-26T01:36:54
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.40677082906313
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 378.8049218012
-      Line           = 15832.603159244
-      ErrorLine      = -12.37917062061
-      ErrorSample    = -13.503450026494
-      ErrorMagnitude = 18.319034578061
-      ZScore         = (-1.3946633955234, 9.4964359228538)
-      DateTime       = 2011-03-26T01:36:57
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.3998856204098
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 1066.1513565696
-      Line           = 16700.192137234
-      ErrorLine      = -2.4019189794308
-      ErrorSample    = -7.108082600382
-      ErrorMagnitude = 7.5029362943852
-      ZScore         = (-1.3946633955234, 9.4964359228538)
-      DateTime       = 2011-03-26T01:37:00
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.4291733207865
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 636.33126196862
-      Line           = 29274.588233216
-      ErrorLine      = -5.893192059928
-      ErrorSample    = 34.266581266767
-      ErrorMagnitude = 34.769646307766
-      ZScore         = (-1.3946633955234, 9.4964359228538)
-      DateTime       = 2011-03-26T01:37:04
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.45164980059781
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305443365:16554/NACR
-      MeasureType    = Automatic
-      Sample         = 1302.4176683197
-      Line           = 35774.682599644
-      ErrorLine      = -35.671609425721
-      ErrorSample    = -8.7001291854942
-      ErrorMagnitude = 36.71724345407
-      ZScore         = (-1.3946633955234, 9.4964359228538)
-      DateTime       = 2011-03-26T01:37:11
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.44231732728258
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_051
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Estimated
-      Sample         = 2474.0
-      Line           = 13196.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:24
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Automatic
-      Sample         = 33.146405301896
-      Line           = 13243.594741196
-      ErrorLine      = 6.9865250792518
-      ErrorSample    = -0.97790470756539
-      ErrorMagnitude = 7.0546318330649
-      ZScore         = (-1.1609036712322, 2.7523376552869)
-      DateTime       = 2011-03-25T17:57:22
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.93326321623141
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 1547.7543904836
-      Line           = 12220.470156546
-      ErrorLine      = 5.1234729110802
-      ErrorSample    = -0.37824858434533
-      ErrorMagnitude = 5.1374163411322
-      ZScore         = (-1.252979475194, 7.6546727833696)
-      DateTime       = 2011-03-26T01:37:14
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.61108308129224
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 1038.9011058083
-      Line           = 17033.82906935
-      ErrorLine      = 4.7013837492086
-      ErrorSample    = -5.8591958393406
-      ErrorMagnitude = 7.5122024094848
-      ZScore         = (-1.252979475194, 7.6546727833696)
-      DateTime       = 2011-03-26T01:37:21
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.31237265845493
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 624.62639759718
-      Line           = 28947.933569943
-      ErrorLine      = -12.726114055346
-      ErrorSample    = 31.250932619312
-      ErrorMagnitude = 33.742773574892
-      ZScore         = (-1.252979475194, 7.6546727833696)
-      DateTime       = 2011-03-26T01:37:25
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.47774620132805
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305443365:16554/NACR
-      MeasureType    = Automatic
-      Sample         = 1179.2533739666
-      Line           = 36347.988067916
-      ErrorLine      = -24.01544816549
-      ErrorSample    = -13.308514437201
-      ErrorMagnitude = 27.456480238999
-      ZScore         = (-1.252979475194, 7.6546727833696)
-      DateTime       = 2011-03-26T01:37:33
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.51640266077084
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_053
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 61.0
-      Line           = 13720.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:25
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2501.6501818861
-      Line           = 13672.308057183
-      ErrorLine      = -6.8493116951213
-      ErrorSample    = 1.0449766726229
-      ErrorMagnitude = 6.9285674524574
-      ZScore         = (-2.1484928766867, 3.1793702042417)
-      DateTime       = 2011-03-25T17:57:22
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.82804059897899
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 1610.9055289224
-      Line           = 12695.598353724
-      ErrorLine      = -2.1116026507116
-      ErrorSample    = 0.6582371478778
-      ErrorMagnitude = 2.2118186854574
-      ZScore         = (-1.3490044775849, 8.146857000781)
-      DateTime       = 2011-03-26T01:37:36
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.60786618855127
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 650.21483520265
-      Line           = 28488.305548048
-      ErrorLine      = -6.2737254821513
-      ErrorSample    = 33.488489569994
-      ErrorMagnitude = 34.071081067454
-      ZScore         = (-1.3490044775849, 8.146857000781)
-      DateTime       = 2011-03-26T01:37:43
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.53528536539488
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305443365:16554/NACR
-      MeasureType    = Automatic
-      Sample         = 1036.2879679244
-      Line           = 37160.799395033
-      ErrorLine      = -35.106872774013
-      ErrorSample    = -8.9031960842756
-      ErrorMagnitude = 36.218219399714
-      ZScore         = (-1.3490044775849, 8.146857000781)
-      DateTime       = 2011-03-26T01:37:50
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.50604769033998
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_054
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 36.0
-      Line           = 13987.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:25
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2475.9216975184
-      Line           = 13939.299454748
-      ErrorLine      = -6.9259666850303
-      ErrorSample    = 1.8830910669762
-      ErrorMagnitude = 7.1773983091838
-      ZScore         = (-1.1394399703069, 3.9543631042119)
-      DateTime       = 2011-03-25T17:57:22
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.96471958126418
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 1605.27654184
-      Line           = 12963.5131706
-      ErrorLine      = -2.1393493383312
-      ErrorSample    = 0.46458021528838
-      ErrorMagnitude = 2.1892122710819
-      ZScore         = (-0.80196894729781, 11.179521004109)
-      DateTime       = 2011-03-26T01:37:53
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.72587788006877
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 457.28388548427
-      Line           = 28086.508733769
-      ErrorLine      = 138.24900629344
-      ErrorSample    = 169.34562183267
-      ErrorMagnitude = 218.61090406249
-      ZScore         = (-0.80196894729781, 11.179521004109)
-      DateTime       = 2011-03-26T01:37:56
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.44484481130962
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300727653:10001/NACL
-      MeasureType    = Automatic
-      Sample         = 1070.9563206026
-      Line           = 40026.939729615
-      ErrorLine      = -4191.7159877213
-      ErrorSample    = 780.16370610619
-      ErrorMagnitude = 4263.7000750573
-      ZScore         = (-0.82573924277465, 11.472338111519)
-      DateTime       = 2011-03-26T03:04:06
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.40678598848535
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305443365:16554/NACR
-      MeasureType    = Automatic
-      Sample         = 906.52488995812
-      Line           = 37605.850770387
-      ErrorLine      = -34.570077007818
-      ErrorSample    = -9.2720181460323
-      ErrorMagnitude = 35.791906135701
-      ZScore         = (-0.80196894729781, 11.179521004109)
-      DateTime       = 2011-03-26T01:38:02
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.58362028402826
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_058
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 47.0
-      Line           = 15029.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:26
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2487.9035715303
-      Line           = 14981.419205688
-      ErrorLine      = -6.9317514707509
-      ErrorSample    = 0.8500726008001
-      ErrorMagnitude = 6.9836811123424
-      ZScore         = (-2.3080956648219, 4.6562185204059)
-      DateTime       = 2011-03-25T17:57:22
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.77857699543108
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 1699.8135385338
-      Line           = 14004.026581057
-      ErrorLine      = -2.3551997748727
-      ErrorSample    = 0.66140175218197
-      ErrorMagnitude = 2.4463070652209
-      ZScore         = (-1.3905770661233, 7.7851148782317)
-      DateTime       = 2011-03-26T01:38:06
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.57436621512898
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 844.03589549566
-      Line           = 18910.770253932
-      ErrorLine      = -118.63013406757
-      ErrorSample    = 30.987238937135
-      ErrorMagnitude = 122.6104305752
-      ZScore         = (-1.4609548071099, 4.5024496508364)
-      DateTime       = 2011-03-26T03:04:26
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.35114676078774
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 565.2465833058
-      Line           = 27225.962869374
-      ErrorLine      = -6.354537755542
-      ErrorSample    = 33.533307521701
-      ErrorMagnitude = 34.130087363375
-      ZScore         = (-1.3905770661233, 7.7851148782317)
-      DateTime       = 2011-03-26T01:38:20
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.46800316582357
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305443365:16554/NACR
-      MeasureType    = Automatic
-      Sample         = 536.2919057691
-      Line           = 39371.082303309
-      ErrorLine      = -33.652397059908
-      ErrorSample    = -9.4520777803064
-      ErrorMagnitude = 34.954622044054
-      ZScore         = (-1.3905770661233, 7.7851148782317)
-      DateTime       = 2011-03-26T01:38:27
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.50347085162866
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_059
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 49.0
-      Line           = 15296.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:27
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2489.3647254986
-      Line           = 15248.344467856
-      ErrorLine      = -6.9197193475993
-      ErrorSample    = 1.40215651785
-      ErrorMagnitude = 7.0603511775328
-      ZScore         = (-1.2620105633362, 2.9880572265104)
-      DateTime       = 2011-03-25T17:57:22
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.94943118509235
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 1721.2138746242
-      Line           = 14271.081354182
-      ErrorLine      = -2.7825330104261
-      ErrorSample    = 0.40629538471126
-      ErrorMagnitude = 2.8120394545149
-      ZScore         = (-1.1579737543448, 6.0961506574921)
-      DateTime       = 2011-03-26T01:38:31
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.60706678124461
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300741228:63823/NACR
-      MeasureType    = Automatic
-      Sample         = 1190.2306404877
-      Line           = 37443.497628084
-      ErrorLine      = -4448.1448218788
-      ErrorSample    = 720.76410451445
-      ErrorMagnitude = 4506.1616982487
-      ZScore         = (-1.2326919078561, 5.6303860740855)
-      DateTime       = 2011-03-26T03:04:57
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.4021633609309
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305443365:16554/NACR
-      MeasureType    = Automatic
-      Sample         = 439.75253919202
-      Line           = 39823.266610994
-      ErrorLine      = -33.559613214413
-      ErrorSample    = -10.1338667314
-      ErrorMagnitude = 35.056281805559
-      ZScore         = (-1.1579737543448, 6.0961506574921)
-      DateTime       = 2011-03-26T01:38:46
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.5547862467115
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_063
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 45.0
-      Line           = 16408.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:28
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2485.4613035287
-      Line           = 16360.383211938
-      ErrorLine      = -6.8758780628305
-      ErrorSample    = 1.3144617478929
-      ErrorMagnitude = 7.0003934761974
-      ZScore         = (-1.8388062394806, 4.3478426977739)
-      DateTime       = 2011-03-25T17:57:22
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.80510703413961
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 1805.3010070099
-      Line           = 15382.139260922
-      ErrorLine      = -2.7450987889915
-      ErrorSample    = 0.7223238954025
-      ErrorMagnitude = 2.838541733213
-      ZScore         = (-1.2703159102894, 6.6522942988742)
-      DateTime       = 2011-03-26T01:38:50
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.61866689336966
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277184863:36490/NACR
-      MeasureType    = Automatic
-      Sample         = 2477.1809974603
-      Line           = 21009.431211127
-      ErrorLine      = -7.6789269334004
-      ErrorSample    = -12.972098358089
-      ErrorMagnitude = 15.074523364287
-      ZScore         = (-1.2703159102894, 6.6522942988742)
-      DateTime       = 2011-03-26T01:38:53
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.53627775050336
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 407.36630302169
-      Line           = 19288.35653007
-      ErrorLine      = -11.744687920505
-      ErrorSample    = -13.396611695676
-      ErrorMagnitude = 17.815917020316
-      ZScore         = (-1.2703159102894, 6.6522942988742)
-      DateTime       = 2011-03-26T01:38:57
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.56722415074728
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 776.09024538135
-      Line           = 20153.584341382
-      ErrorLine      = -0.96176429477055
-      ErrorSample    = -7.8993581200079
-      ErrorMagnitude = 7.9576912020278
-      ZScore         = (-1.2703159102894, 6.6522942988742)
-      DateTime       = 2011-03-26T01:39:01
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.57296873791347
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 497.2937980087
-      Line           = 25895.680138307
-      ErrorLine      = -6.2557904963542
-      ErrorSample    = 33.533981918844
-      ErrorMagnitude = 34.112502958118
-      ZScore         = (-1.2703159102894, 6.6522942988742)
-      DateTime       = 2011-03-26T01:39:04
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.54174744674219
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305443365:16554/NACL
-      MeasureType    = Automatic
-      Sample         = 2460.6882514226
-      Line           = 41636.512515509
-      ErrorLine      = -40.743512967128
-      ErrorSample    = -8.9370467154886
-      ErrorMagnitude = 41.712164327656
-      ZScore         = (-1.2703159102894, 6.6522942988742)
-      DateTime       = 2011-03-26T01:39:17
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.51718212299966
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_065
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Estimated
-      Sample         = 2494.0
-      Line           = 16920.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:28
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Automatic
-      Sample         = 53.427376415338
-      Line           = 16967.61089208
-      ErrorLine      = 6.9072869624215
-      ErrorSample    = -1.1468595473454
-      ErrorMagnitude = 7.0018497557842
-      ZScore         = (-1.0243800857414, 5.482381791934)
-      DateTime       = 2011-03-25T17:57:23
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.75569136352954
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 1857.0453639597
-      Line           = 15940.913594331
-      ErrorLine      = 4.1260229653435
-      ErrorSample    = -0.51634108897088
-      ErrorMagnitude = 4.1582055782154
-      ZScore         = (-0.73065754655698, 7.5804282313807)
-      DateTime       = 2011-03-26T01:39:20
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.7082136698109
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 547.10581623065
-      Line           = 19802.631281841
-      ErrorLine      = 32.943204953033
-      ErrorSample    = -154.47791498942
-      ErrorMagnitude = 157.95151462413
-      ZScore         = (-0.73065754655698, 7.5804282313807)
-      DateTime       = 2011-03-26T01:39:24
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.37128341689228
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 485.5583692692
-      Line           = 25355.844383144
-      ErrorLine      = -12.918421470629
-      ErrorSample    = 31.157741364054
-      ErrorMagnitude = 33.72966735979
-      ZScore         = (-0.73065754655698, 7.5804282313807)
-      DateTime       = 2011-03-26T01:39:28
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.27093623595556
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305443365:16554/NACL
-      MeasureType    = Automatic
-      Sample         = 2262.6730476683
-      Line           = 42586.417746401
-      ErrorLine      = -30.317195970791
-      ErrorSample    = -12.975246452796
-      ErrorMagnitude = 32.977104057848
-      ZScore         = (-0.73065754655698, 7.5804282313807)
-      DateTime       = 2011-03-26T01:39:38
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.58820574424226
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_067
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 56.0
-      Line           = 17479.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:29
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2496.6992734104
-      Line           = 17431.418327661
-      ErrorLine      = -6.9565160457059
-      ErrorSample    = 1.0084956615815
-      ErrorMagnitude = 7.0292374404051
-      ZScore         = (-0.96409996393405, 3.6762372150424)
-      DateTime       = 2011-03-25T17:57:23
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.93316956618423
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 1900.180433768
-      Line           = 16451.703764856
-      ErrorLine      = -2.8787118665932
-      ErrorSample    = 0.55093406956985
-      ErrorMagnitude = 2.9309572429289
-      ZScore         = (-0.82904179804423, 6.8136881827037)
-      DateTime       = 2011-03-26T01:39:41
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.69444323009338
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 463.90717828459
-      Line           = 20533.034907516
-      ErrorLine      = -199.65211659908
-      ErrorSample    = -69.418233522219
-      ErrorMagnitude = 211.37610746685
-      ZScore         = (-0.82904179804423, 6.8136881827037)
-      DateTime       = 2011-03-26T01:39:45
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.36372629047071
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 714.68227204347
-      Line           = 21398.374584993
-      ErrorLine      = -189.96269871273
-      ErrorSample    = -44.49789906194
-      ErrorMagnitude = 195.10481778559
-      ZScore         = (-0.82904179804423, 6.8136881827037)
-      DateTime       = 2011-03-26T01:39:49
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.37216739307519
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 635.30318604875
-      Line           = 25224.224842648
-      ErrorLine      = -367.85462897646
-      ErrorSample    = -135.4328427769
-      ErrorMagnitude = 391.99372821774
-      ZScore         = (-0.82904179804423, 6.8136881827037)
-      DateTime       = 2011-03-26T01:39:52
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.38190737837132
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300727653:10001/NACL
-      MeasureType    = Automatic
-      Sample         = 619.12571623446
-      Line           = 41780.001156953
-      ErrorLine      = -21.224143052386
-      ErrorSample    = 10.591152049382
-      ErrorMagnitude = 23.719965220069
-      ZScore         = (-0.82904179804423, 6.8136881827037)
-      DateTime       = 2011-03-26T01:39:56
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.43376864710899
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/300741228:63823/NACR
-      MeasureType    = Automatic
-      Sample         = 1262.3574852866
-      Line           = 36767.791222062
-      ErrorLine      = -6.7244002897205
-      ErrorSample    = 12.440437051163
-      ErrorMagnitude = 14.141500389999
-      ZScore         = (-0.82904179804423, 6.8136881827037)
-      DateTime       = 2011-03-26T01:40:01
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.43904825501431
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305443365:16554/NACL
-      MeasureType    = Automatic
-      Sample         = 2076.4382732652
-      Line           = 43453.636695233
-      ErrorLine      = -42.727240705783
-      ErrorSample    = -9.298381940278
-      ErrorMagnitude = 43.72730274139
-      ZScore         = (-0.82904179804423, 6.8136881827037)
-      DateTime       = 2011-03-26T01:40:05
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.61329870255668
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_069
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 31.0
-      Line           = 17848.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:29
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2471.8794394854
-      Line           = 17800.581259766
-      ErrorLine      = -7.0320591289783
-      ErrorSample    = 0.92336259819376
-      ErrorMagnitude = 7.0924222999755
-      ZScore         = (-1.2091346354208, 2.98356851273)
-      DateTime       = 2011-03-25T17:57:23
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.91038086656351
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 1904.3571131202
-      Line           = 16821.380075506
-      ErrorLine      = -2.9192428393653
-      ErrorSample    = 0.65181267001981
-      ErrorMagnitude = 2.9911266292125
-      ZScore         = (-1.0036808749335, 8.3909769800171)
-      DateTime       = 2011-03-26T01:40:08
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.67790095713281
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 442.36660958881
-      Line           = 20709.412308507
-      ErrorLine      = -11.990226522703
-      ErrorSample    = -13.631294541893
-      ErrorMagnitude = 18.154275610819
-      ZScore         = (-1.0036808749335, 8.3909769800171)
-      DateTime       = 2011-03-26T01:40:11
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.39862745008486
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 678.05522465093
-      Line           = 21574.4764219
-      ErrorLine      = -1.2038942795007
-      ErrorSample    = -8.048913797249
-      ErrorMagnitude = 8.1384503900779
-      ZScore         = (-1.0036808749335, 8.3909769800171)
-      DateTime       = 2011-03-26T01:40:14
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.40772572259903
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 405.77959968663
-      Line           = 24506.698754062
-      ErrorLine      = -6.2264853856141
-      ErrorSample    = 33.657742579106
-      ErrorMagnitude = 34.228829307743
-      ZScore         = (-1.0036808749335, 8.3909769800171)
-      DateTime       = 2011-03-26T01:40:18
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.33034880605737
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305443365:16554/NACL
-      MeasureType    = Automatic
-      Sample         = 1909.9117488727
-      Line           = 44072.460312701
-      ErrorLine      = -43.185309957968
-      ErrorSample    = -9.518787653378
-      ErrorMagnitude = 44.221921199286
-      ZScore         = (-1.0036808749335, 8.3909769800171)
-      DateTime       = 2011-03-26T01:40:28
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.55050088104235
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_071
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 58.0
-      Line           = 18523.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:29
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2498.9938424502
-      Line           = 18475.503194732
-      ErrorLine      = -6.9548258513387
-      ErrorSample    = 0.72768426110815
-      ErrorMagnitude = 6.9927910741215
-      ZScore         = (-1.0318084146834, 5.759939056388)
-      DateTime       = 2011-03-25T17:57:23
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.80532182140337
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 1984.0684686671
-      Line           = 17494.741992031
-      ErrorLine      = -2.9644991971945
-      ErrorSample    = 0.79789984352942
-      ErrorMagnitude = 3.0699999430735
-      ZScore         = (-0.93389429481784, 11.613032886229)
-      DateTime       = 2011-03-26T01:40:32
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.68253783733235
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 419.47928593443
-      Line           = 21375.530032062
-      ErrorLine      = -11.895698363551
-      ErrorSample    = -14.076568755042
-      ErrorMagnitude = 18.429797271593
-      ZScore         = (-0.93389429481784, 11.613032886229)
-      DateTime       = 2011-03-26T01:40:36
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.60888738593985
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 421.15570835011
-      Line           = 23855.540046697
-      ErrorLine      = -6.5301481733186
-      ErrorSample    = 33.852960936381
-      ErrorMagnitude = 34.477032925204
-      ZScore         = (-0.93389429481784, 11.613032886229)
-      DateTime       = 2011-03-26T01:40:40
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.49488796904552
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305456931:43507/NACR
-      MeasureType    = Automatic
-      Sample         = 2466.4523945295
-      Line           = 47571.725302856
-      ErrorLine      = -39.085393690497
-      ErrorSample    = -9.9295542393534
-      ErrorMagnitude = 40.326964271234
-      ZScore         = (-0.93389429481784, 11.613032886229)
-      DateTime       = 2011-03-26T01:40:49
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.64215047713333
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_075
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 61.0
-      Line           = 19472.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:31
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2501.7808819442
-      Line           = 19424.493416644
-      ErrorLine      = -6.9075749814365
-      ErrorSample    = 0.91346997121991
-      ErrorMagnitude = 6.9677126456598
-      ZScore         = (-1.1831267039624, 4.1975070764369)
-      DateTime       = 2011-03-25T17:57:23
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.88825908428396
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 2061.1068314861
-      Line           = 18442.772149583
-      ErrorLine      = -2.9728497134456
-      ErrorSample    = 0.85432942868329
-      ErrorMagnitude = 3.0931721891042
-      ZScore         = (-1.3540786498414, 10.948919035163)
-      DateTime       = 2011-03-26T01:40:53
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.58952912480709
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 427.5120293925
-      Line           = 22312.318553683
-      ErrorLine      = -12.113256467976
-      ErrorSample    = -13.448106578064
-      ErrorMagnitude = 18.099241774006
-      ZScore         = (-1.3540786498414, 10.948919035163)
-      DateTime       = 2011-03-26T01:40:58
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.44006532795902
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 514.04835044315
-      Line           = 23175.067944483
-      ErrorLine      = -0.70291835737225
-      ErrorSample    = -8.1760743104987
-      ErrorMagnitude = 8.2062345413672
-      ZScore         = (-1.3540786498414, 10.948919035163)
-      DateTime       = 2011-03-26T01:41:01
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.45603187073175
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 381.22465295465
-      Line           = 22939.532532268
-      ErrorLine      = -6.0708521331144
-      ErrorSample    = 34.189818202823
-      ErrorMagnitude = 34.724615395483
-      ZScore         = (-1.3540786498414, 10.948919035163)
-      DateTime       = 2011-03-26T01:41:05
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.42491615416748
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305443365:16554/NACL
-      MeasureType    = Automatic
-      Sample         = 1348.7429763159
-      Line           = 46831.456886704
-      ErrorLine      = -45.786191617175
-      ErrorSample    = -10.560168986799
-      ErrorMagnitude = 46.988216733926
-      ZScore         = (-1.3540786498414, 10.948919035163)
-      DateTime       = 2011-03-26T01:41:09
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.4652298438541
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305450184:05413/NACR
-      MeasureType    = Automatic
-      Sample         = 540.33552235713
-      Line           = 1219.5569869876
-      ErrorLine      = -12.496102517811
-      ErrorSample    = -10.61875162036
-      ErrorMagnitude = 16.398489689924
-      ZScore         = (-1.3540786498414, 10.948919035163)
-      DateTime       = 2011-03-26T01:41:14
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.4749941155842
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305456931:43507/NACR
-      MeasureType    = Automatic
-      Sample         = 2174.6124889709
-      Line           = 49206.60642583
-      ErrorLine      = -38.450665899596
-      ErrorSample    = -10.224607036871
-      ErrorMagnitude = 39.786885995021
-      ZScore         = (-1.3540786498414, 10.948919035163)
-      DateTime       = 2011-03-26T01:41:19
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.47264440630715
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_076
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 42.0
-      Line           = 19661.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:31
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2482.7232887653
-      Line           = 19613.528470383
-      ErrorLine      = -6.9957447236447
-      ErrorSample    = 1.0677567081307
-      ErrorMagnitude = 7.0767611678056
-      ZScore         = (-0.93934694243142, 3.5081195291101)
-      DateTime       = 2011-03-25T17:57:23
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.91983021207625
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 2056.61567876
-      Line           = 18632.409848733
-      ErrorLine      = -3.0166380346454
-      ErrorSample    = 0.84862659126793
-      ErrorMagnitude = 3.1337313419431
-      ZScore         = (-1.1601877353312, 6.9654855569669)
-      DateTime       = 2011-03-26T01:41:22
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.62418186807918
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 452.15961862591
-      Line           = 22498.304914227
-      ErrorLine      = -11.737662800784
-      ErrorSample    = -13.264648414458
-      ErrorMagnitude = 17.71224507464
-      ZScore         = (-1.1601877353312, 6.9654855569669)
-      DateTime       = 2011-03-26T01:41:26
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.44680049324961
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 521.85519926002
-      Line           = 23361.704656537
-      ErrorLine      = -0.29534335455901
-      ErrorSample    = -8.0928439684645
-      ErrorMagnitude = 8.0982313621552
-      ZScore         = (-1.1601877353312, 6.9654855569669)
-      DateTime       = 2011-03-26T01:41:30
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.47349733264673
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 339.41569873522
-      Line           = 22757.026232743
-      ErrorLine      = -5.5829844972031
-      ErrorSample    = 33.673713621877
-      ErrorMagnitude = 34.133395743527
-      ZScore         = (-1.1601877353312, 6.9654855569669)
-      DateTime       = 2011-03-26T01:41:33
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.45980003383193
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305443365:16554/NACL
-      MeasureType    = Automatic
-      Sample         = 1257.001889267
-      Line           = 47146.855088229
-      ErrorLine      = -46.083935735944
-      ErrorSample    = -10.523930406446
-      ErrorMagnitude = 47.270310387328
-      ZScore         = (-1.1601877353312, 6.9654855569669)
-      DateTime       = 2011-03-26T01:41:37
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.50253830982183
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305450184:05413/NACR
-      MeasureType    = Automatic
-      Sample         = 452.7013782602
-      Line           = 1536.1571334754
-      ErrorLine      = -12.392214681933
-      ErrorSample    = -10.671715361063
-      ErrorMagnitude = 16.353974852331
-      ZScore         = (-1.1601877353312, 6.9654855569669)
-      DateTime       = 2011-03-26T01:41:40
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.50739235442052
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_077
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 50.0
-      Line           = 20047.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:31
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2490.5866786189
-      Line           = 19999.445486226
-      ErrorLine      = -6.9569526368286
-      ErrorSample    = 1.1405961600572
-      ErrorMagnitude = 7.0498333023848
-      ZScore         = (-2.6622674731341, 3.1440907108247)
-      DateTime       = 2011-03-25T17:57:24
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.82397469325815
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 2092.8579464546
-      Line           = 19017.870896964
-      ErrorLine      = -3.1338198171543
-      ErrorSample    = 0.74860715998102
-      ErrorMagnitude = 3.2219930673985
-      ZScore         = (-1.5996052247367, 6.9448550090244)
-      DateTime       = 2011-03-26T01:41:43
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.54127139482262
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 448.0474043066
-      Line           = 22878.770687243
-      ErrorLine      = -11.239147956359
-      ErrorSample    = -13.563751992266
-      ErrorMagnitude = 17.615158667824
-      ZScore         = (-1.5996052247367, 6.9448550090244)
-      DateTime       = 2011-03-26T01:41:46
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.34936205631857
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 484.68672998347
-      Line           = 23741.733620145
-      ErrorLine      = 0.18497464757456
-      ErrorSample    = -8.1024918333201
-      ErrorMagnitude = 8.1046029840619
-      ZScore         = (-1.5996052247367, 6.9448550090244)
-      DateTime       = 2011-03-26T01:41:49
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.37886647424966
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 334.91604022459
-      Line           = 22385.52496558
-      ErrorLine      = -6.667932303455
-      ErrorSample    = 33.789459238487
-      ErrorMagnitude = 34.441092851895
-      ZScore         = (-1.5996052247367, 6.9448550090244)
-      DateTime       = 2011-03-26T01:41:52
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.4805169264564
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305443365:16554/NACL
-      MeasureType    = Automatic
-      Sample         = 1126.4006582288
-      Line           = 47802.295614672
-      ErrorLine      = -46.297995869958
-      ErrorSample    = -10.52710946906
-      ErrorMagnitude = 47.479726782578
-      ZScore         = (-1.5996052247367, 6.9448550090244)
-      DateTime       = 2011-03-26T01:41:56
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.42692029011778
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305450184:05413/NACR
-      MeasureType    = Automatic
-      Sample         = 331.67287827229
-      Line           = 2194.0405887945
-      ErrorLine      = -12.320933484279
-      ErrorSample    = -11.31955182276
-      ErrorMagnitude = 16.731337525499
-      ZScore         = (-1.5996052247367, 6.9448550090244)
-      DateTime       = 2011-03-26T01:41:59
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.42875833388825
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305456931:43507/NACR
-      MeasureType    = Automatic
-      Sample         = 1980.0752448026
-      Line           = 50194.076772578
-      ErrorLine      = -37.563203610276
-      ErrorSample    = -10.392588373724
-      ErrorMagnitude = 38.974352574132
-      ZScore         = (-1.5996052247367, 6.9448550090244)
-      DateTime       = 2011-03-26T01:42:04
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.42139156729536
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_078
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 61.0
-      Line           = 20325.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:32
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2501.5987611615
-      Line           = 20277.35181692
-      ErrorLine      = -6.8724705707318
-      ErrorSample    = 1.1247906827075
-      ErrorMagnitude = 6.9639073676694
-      ZScore         = (-2.6582292743779, 4.5417978761018)
-      DateTime       = 2011-03-25T17:57:24
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.69203620339158
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 2124.0354588895
-      Line           = 19295.150706031
-      ErrorLine      = -3.1081499801221
-      ErrorSample    = 1.0143899957402
-      ErrorMagnitude = 3.2694928295365
-      ZScore         = (-1.596512302572, 8.1699025491125)
-      DateTime       = 2011-03-26T01:42:08
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.47252969668898
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 438.64446787975
-      Line           = 23153.372620287
-      ErrorLine      = -11.520857941538
-      ErrorSample    = -13.579116242485
-      ErrorMagnitude = 17.8079354681
-      ZScore         = (-1.596512302572, 8.1699025491125)
-      DateTime       = 2011-03-26T01:42:11
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.37444305240842
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 451.9366369627
-      Line           = 24015.82416854
-      ErrorLine      = -0.063482378878689
-      ErrorSample    = -8.6411992654232
-      ErrorMagnitude = 8.6414324482217
-      ZScore         = (-1.596512302572, 8.1699025491125)
-      DateTime       = 2011-03-26T01:42:16
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.38745492406088
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 340.87679341358
-      Line           = 22117.334428661
-      ErrorLine      = -6.8791831180024
-      ErrorSample    = 33.815669765544
-      ErrorMagnitude = 34.508298741945
-      ZScore         = (-1.596512302572, 8.1699025491125)
-      DateTime       = 2011-03-26T01:42:19
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.45095524000408
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305443365:16554/NACL
-      MeasureType    = Automatic
-      Sample         = 1038.9669014782
-      Line           = 48276.032364386
-      ErrorLine      = -46.75494241414
-      ErrorSample    = -10.924215728308
-      ErrorMagnitude = 48.014197165299
-      ZScore         = (-1.596512302572, 8.1699025491125)
-      DateTime       = 2011-03-26T01:42:22
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.37603977882554
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305450184:05413/NACR
-      MeasureType    = Automatic
-      Sample         = 249.73388263629
-      Line           = 2667.7944888726
-      ErrorLine      = -11.217928721117
-      ErrorSample    = -10.728270458409
-      ErrorMagnitude = 15.522168399448
-      ZScore         = (-1.596512302572, 8.1699025491125)
-      DateTime       = 2011-03-26T01:42:25
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.38236103208874
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305456931:43507/NACR
-      MeasureType    = Automatic
-      Sample         = 1906.9130135317
-      Line           = 50675.724476218
-      ErrorLine      = -37.583321498867
-      ErrorSample    = -10.220405567333
-      ErrorMagnitude = 38.948205925921
-      ZScore         = (-1.596512302572, 8.1699025491125)
-      DateTime       = 2011-03-26T01:42:29
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.38118020847742
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_079
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 31.0
-      Line           = 20624.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:32
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2471.8129773131
-      Line           = 20576.428248605
-      ErrorLine      = -7.0268310754291
-      ErrorSample    = 1.0221928155047
-      ErrorMagnitude = 7.1007910203502
-      ZScore         = (-1.1736378550009, 4.0102395287909)
-      DateTime       = 2011-03-25T17:57:24
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.89802286227871
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 2115.3495410444
-      Line           = 19595.023426294
-      ErrorLine      = -3.1258817854068
-      ErrorSample    = 0.91400828074529
-      ErrorMagnitude = 3.2567695763761
-      ZScore         = (-1.2397482246903, 10.036045229887)
-      DateTime       = 2011-03-26T01:42:33
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.61001790307819
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 477.89772798405
-      Line           = 23448.375090699
-      ErrorLine      = -11.826548482415
-      ErrorSample    = -13.565747534597
-      ErrorMagnitude = 17.997131859809
-      ZScore         = (-1.2397482246903, 10.036045229887)
-      DateTime       = 2011-03-26T01:42:36
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.53599832453801
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 466.72892987978
-      Line           = 24311.902527585
-      ErrorLine      = -0.22078139724545
-      ErrorSample    = -8.6400375622671
-      ErrorMagnitude = 8.642857947621
-      ZScore         = (-1.2397482246903, 10.036045229887)
-      DateTime       = 2011-03-26T01:42:38
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.5467790759194
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 273.56881687261
-      Line           = 21828.886419894
-      ErrorLine      = -6.2980941604474
-      ErrorSample    = 33.524683161372
-      ErrorMagnitude = 34.111147314686
-      ZScore         = (-1.2397482246903, 10.036045229887)
-      DateTime       = 2011-03-26T01:42:42
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.50724323345548
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305443365:16554/NACL
-      MeasureType    = Automatic
-      Sample         = 896.08312069734
-      Line           = 48775.437887866
-      ErrorLine      = -47.680809390244
-      ErrorSample    = -11.107614769014
-      ErrorMagnitude = 48.95751923827
-      ZScore         = (-1.2397482246903, 10.036045229887)
-      DateTime       = 2011-03-26T01:42:46
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.50027749707442
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305450184:05413/NACR
-      MeasureType    = Automatic
-      Sample         = 110.92173439174
-      Line           = 3168.8654646694
-      ErrorLine      = -11.387966433949
-      ErrorSample    = -11.483409351011
-      ErrorMagnitude = 16.172645727389
-      ZScore         = (-1.2397482246903, 10.036045229887)
-      DateTime       = 2011-03-26T01:42:50
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.5013807991545
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305456931:43507/NACR
-      MeasureType    = Automatic
-      Sample         = 1775.1197301279
-      Line           = 51184.311861383
-      ErrorLine      = -37.015889142749
-      ErrorSample    = -9.7821321114716
-      ErrorMagnitude = 38.286631579111
-      ZScore         = (-1.2397482246903, 10.036045229887)
-      DateTime       = 2011-03-26T01:42:53
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.50733472587854
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_080
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 35.0
-      Line           = 20732.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:33
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2475.6631543069
-      Line           = 20684.381925558
-      ErrorLine      = -6.9868708554714
-      ErrorSample    = 1.1462174016497
-      ErrorMagnitude = 7.0802668511067
-      ZScore         = (-1.8558581342581, 4.1813592933696)
-      DateTime       = 2011-03-25T17:57:24
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.65582557249854
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 2127.535728484
-      Line           = 19702.783407759
-      ErrorLine      = -3.1112998919671
-      ErrorSample    = 0.87605067708637
-      ErrorMagnitude = 3.2322827547382
-      ZScore         = (-1.4246477514929, 7.3759900093)
-      DateTime       = 2011-03-26T01:42:57
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.55368078172069
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 474.54009836568
-      Line           = 23554.833824657
-      ErrorLine      = -11.65335407824
-      ErrorSample    = -13.536577823338
-      ErrorMagnitude = 17.861679664581
-      ZScore         = (-1.4246477514929, 7.3759900093)
-      DateTime       = 2011-03-26T01:43:00
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.4686732800692
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 453.80542776866
-      Line           = 24418.195080555
-      ErrorLine      = -0.13199043737404
-      ErrorSample    = -8.5466029201909
-      ErrorMagnitude = 8.5476220641167
-      ZScore         = (-1.4246477514929, 7.3759900093)
-      DateTime       = 2011-03-26T01:43:04
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.47813432790645
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 275.08044638918
-      Line           = 21724.514973998
-      ErrorLine      = -6.1695510829777
-      ErrorSample    = 33.883721461772
-      ErrorMagnitude = 34.440817944184
-      ZScore         = (-1.4246477514929, 7.3759900093)
-      DateTime       = 2011-03-26T01:43:07
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.43623384726834
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305443365:16554/NACL
-      MeasureType    = Automatic
-      Sample         = 862.20640996176
-      Line           = 48959.63525448
-      ErrorLine      = -47.958058904849
-      ErrorSample    = -11.691126687728
-      ErrorMagnitude = 49.362514696371
-      ZScore         = (-1.4246477514929, 7.3759900093)
-      DateTime       = 2011-03-26T01:43:10
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.44555666174529
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305450184:05413/NACR
-      MeasureType    = Automatic
-      Sample         = 79.261769627832
-      Line           = 3353.3359897456
-      ErrorLine      = -11.167253759644
-      ErrorSample    = -11.486963119545
-      ErrorMagnitude = 16.020545503886
-      ZScore         = (-1.4246477514929, 7.3759900093)
-      DateTime       = 2011-03-26T01:43:14
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.44685635707265
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305456931:43507/NACR
-      MeasureType    = Automatic
-      Sample         = 1746.374383614
-      Line           = 51370.93266726
-      ErrorLine      = -37.03975003599
-      ErrorSample    = -10.057193721288
-      ErrorMagnitude = 38.38085757609
-      ZScore         = (-1.4246477514929, 7.3759900093)
-      DateTime       = 2011-03-26T01:43:17
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.45098944024721
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_081
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 31.0
-      Line           = 20986.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:33
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2471.6601744931
-      Line           = 20938.377476476
-      ErrorLine      = -7.0141295860994
-      ErrorSample    = 1.1805534279843
-      ErrorMagnitude = 7.1127856882462
-      ZScore         = (-2.3717578836934, 3.4923233180421)
-      DateTime       = 2011-03-25T17:57:24
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.76667262740193
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 2142.8329712865
-      Line           = 19956.705001981
-      ErrorLine      = -3.1472179988559
-      ErrorSample    = 0.81665491482136
-      ErrorMagnitude = 3.2514468136853
-      ZScore         = (-1.5988351028655, 6.8361390020018)
-      DateTime       = 2011-03-26T01:43:20
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.51394616861944
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 482.52339507494
-      Line           = 23805.351354415
-      ErrorLine      = -11.642677216081
-      ErrorSample    = -13.649425527165
-      ErrorMagnitude = 17.940422235262
-      ZScore         = (-1.5988351028655, 6.8361390020018)
-      DateTime       = 2011-03-26T01:43:23
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.45251855851711
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 439.25893079082
-      Line           = 24668.761537665
-      ErrorLine      = -0.03144416068244
-      ErrorSample    = -8.5347404526316
-      ErrorMagnitude = 8.5347983765891
-      ZScore         = (-1.5988351028655, 6.8361390020018)
-      DateTime       = 2011-03-26T01:43:26
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.4606833037451
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 256.39907402304
-      Line           = 21480.0961252
-      ErrorLine      = -6.7858669142224
-      ErrorSample    = 33.843444994717
-      ErrorMagnitude = 34.517050263427
-      ZScore         = (-1.5988351028655, 6.8361390020018)
-      DateTime       = 2011-03-26T01:43:30
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.47345645870337
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305443365:16554/NACL
-      MeasureType    = Automatic
-      Sample         = 765.51734489946
-      Line           = 49389.351763897
-      ErrorLine      = -48.005861628582
-      ErrorSample    = -11.093896546921
-      ErrorMagnitude = 49.271059368521
-      ZScore         = (-1.5988351028655, 6.8361390020018)
-      DateTime       = 2011-03-26T01:43:33
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.39416436256397
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305450184:05413/NACL
-      MeasureType    = Automatic
-      Sample         = 2428.3796596376
-      Line           = 3717.1701977153
-      ErrorLine      = -19.314529999869
-      ErrorSample    = -10.009210168753
-      ErrorMagnitude = 21.753973368516
-      ZScore         = (-1.5988351028655, 6.8361390020018)
-      DateTime       = 2011-03-26T01:43:38
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.39676141339805
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305456931:43507/NACR
-      MeasureType    = Automatic
-      Sample         = 1663.4703938023
-      Line           = 51807.972022135
-      ErrorLine      = -37.089413944617
-      ErrorSample    = -10.204286836195
-      ErrorMagnitude = 38.467546017266
-      ZScore         = (-1.5988351028655, 6.8361390020018)
-      DateTime       = 2011-03-26T01:43:40
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.39055553602338
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_082
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 41.0
-      Line           = 21412.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:34
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2481.6667401961
-      Line           = 21364.314284566
-      ErrorLine      = -6.9713059585447
-      ErrorSample    = 1.1125522233979
-      ErrorMagnitude = 7.0595240078513
-      ZScore         = (-1.9759700040539, 4.7555681444373)
-      DateTime       = 2011-03-25T17:57:24
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.63926701666037
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 2185.2117678504
-      Line           = 20381.944252713
-      ErrorLine      = -3.2266867820035
-      ErrorSample    = 0.78205179057341
-      ErrorMagnitude = 3.3201073163823
-      ZScore         = (-1.4355952455422, 10.098782346871)
-      DateTime       = 2011-03-26T01:43:43
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.53786764024881
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 476.37747681903
-      Line           = 24225.513932711
-      ErrorLine      = -11.412138457832
-      ErrorSample    = -13.759001837098
-      ErrorMagnitude = 17.875878600337
-      ZScore         = (-1.4355952455422, 10.098782346871)
-      DateTime       = 2011-03-26T01:43:46
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.40342832652914
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 395.10730917622
-      Line           = 25088.380385825
-      ErrorLine      = 0.24200893047237
-      ErrorSample    = -8.6583168272973
-      ErrorMagnitude = 8.6616983671961
-      ZScore         = (-1.4355952455422, 10.098782346871)
-      DateTime       = 2011-03-26T01:43:50
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.42259914690567
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 252.89920267037
-      Line           = 21068.857314596
-      ErrorLine      = -6.4972711022201
-      ErrorSample    = 33.936059087465
-      ErrorMagnitude = 34.552433172841
-      ZScore         = (-1.4355952455422, 10.098782346871)
-      DateTime       = 2011-03-26T01:43:53
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.45535133922021
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305443365:16554/NACL
-      MeasureType    = Automatic
-      Sample         = 622.2236882433
-      Line           = 50113.381302596
-      ErrorLine      = -48.724306569289
-      ErrorSample    = -11.674088282152
-      ErrorMagnitude = 50.103317134473
-      ZScore         = (-1.4355952455422, 10.098782346871)
-      DateTime       = 2011-03-26T01:43:57
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.42301690470231
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305450184:05413/NACL
-      MeasureType    = Automatic
-      Sample         = 2295.5652160419
-      Line           = 4443.0365829778
-      ErrorLine      = -19.807314444397
-      ErrorSample    = -10.228681077142
-      ErrorMagnitude = 22.29250147644
-      ZScore         = (-1.4355952455422, 10.098782346871)
-      DateTime       = 2011-03-26T01:44:00
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.42793616619201
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_083
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 34.0
-      Line           = 21490.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:34
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2474.8865149813
-      Line           = 21442.367378705
-      ErrorLine      = -7.0004490899191
-      ErrorSample    = 0.89517067351335
-      ErrorMagnitude = 7.0574512393121
-      ZScore         = (-1.3323248002521, 5.6602838145335)
-      DateTime       = 2011-03-25T17:57:25
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.75038500930509
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 2184.2325203533
-      Line           = 20460.140947817
-      ErrorLine      = -3.1832256766793
-      ErrorSample    = 0.78344491271037
-      ErrorMagnitude = 3.2782177535853
-      ZScore         = (-1.2224394411386, 8.9705591262873)
-      DateTime       = 2011-03-26T01:44:03
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.59894292853642
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 485.55489339135
-      Line           = 24302.36686815
-      ErrorLine      = -11.347436824533
-      ErrorSample    = -13.700794760773
-      ErrorMagnitude = 17.789775140895
-      ZScore         = (-1.2224394411386, 8.9705591262873)
-      DateTime       = 2011-03-26T01:44:05
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.45341706839463
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 397.18825315466
-      Line           = 25165.516370884
-      ErrorLine      = 0.30504987137829
-      ErrorSample    = -8.5392101283041
-      ErrorMagnitude = 8.5446571048439
-      ZScore         = (-1.2224394411386, 8.9705591262873)
-      DateTime       = 2011-03-26T01:44:08
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.4769339122995
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 236.99378702671
-      Line           = 20993.667271844
-      ErrorLine      = -6.4878095541135
-      ErrorSample    = 34.059520738495
-      ErrorMagnitude = 34.671928497654
-      ZScore         = (-1.2224394411386, 8.9705591262873)
-      DateTime       = 2011-03-26T01:44:11
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.50549594779295
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305443365:16554/NACL
-      MeasureType    = Automatic
-      Sample         = 585.48346957632
-      Line           = 50243.808142775
-      ErrorLine      = -48.680979678793
-      ErrorSample    = -11.534599042201
-      ErrorMagnitude = 50.028839258486
-      ZScore         = (-1.2224394411386, 8.9705591262873)
-      DateTime       = 2011-03-26T01:44:14
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.47599263748816
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305450184:05413/NACL
-      MeasureType    = Automatic
-      Sample         = 2260.6202315522
-      Line           = 4574.0450262501
-      ErrorLine      = -19.765542077837
-      ErrorSample    = -10.22171845201
-      ErrorMagnitude = 22.252194987077
-      ZScore         = (-1.2224394411386, 8.9705591262873)
-      DateTime       = 2011-03-26T01:44:16
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.47963484795218
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_086
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 31.0
-      Line           = 22454.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:35
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2471.4827894174
-      Line           = 22406.376874036
-      ErrorLine      = -7.0064290080845
-      ErrorSample    = 1.3010682345503
-      ErrorMagnitude = 7.126206985226
-      ZScore         = (-2.6520497273833, 8.9828527824929)
-      DateTime       = 2011-03-25T17:57:25
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.56186086949583
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 2257.9124254165
-      Line           = 21423.721162633
-      ErrorLine      = -3.1284757301873
-      ErrorSample    = 0.77574323179761
-      ErrorMagnitude = 3.2232185709397
-      ZScore         = (-1.3173784421041, 9.7452277380928)
-      DateTime       = 2011-03-26T01:44:20
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.60081485763658
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 503.49654519249
-      Line           = 25253.899857904
-      ErrorLine      = -11.461563180001
-      ErrorSample    = -14.178497928683
-      ErrorMagnitude = 18.231764424839
-      ZScore         = (-1.3173784421041, 9.7452277380928)
-      DateTime       = 2011-03-26T01:44:24
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.51603412672557
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 324.61770577613
-      Line           = 26115.837088976
-      ErrorLine      = 0.67602369646556
-      ErrorSample    = -9.0551805202247
-      ErrorMagnitude = 9.0803800742061
-      ZScore         = (-1.3173784421041, 9.7452277380928)
-      DateTime       = 2011-03-26T01:44:27
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.52943703712299
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 185.63562421425
-      Line           = 20064.446876956
-      ErrorLine      = -6.9580305185955
-      ErrorSample    = 33.967518331823
-      ErrorMagnitude = 34.672849469296
-      ZScore         = (-1.3173784421041, 9.7452277380928)
-      DateTime       = 2011-03-26T01:44:31
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.55539145536113
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305443365:16554/NACL
-      MeasureType    = Automatic
-      Sample         = 226.45456009842
-      Line           = 51876.400022672
-      ErrorLine      = -50.209512804351
-      ErrorSample    = -12.458041154512
-      ErrorMagnitude = 51.731982036819
-      ZScore         = (-1.3173784421041, 9.7452277380928)
-      DateTime       = 2011-03-26T01:44:34
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.48221595066389
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305450184:05413/NACL
-      MeasureType    = Automatic
-      Sample         = 1930.6167748005
-      Line           = 6211.8274502934
-      ErrorLine      = -21.276915188976
-      ErrorSample    = -10.738009515728
-      ErrorMagnitude = 23.833001664053
-      ZScore         = (-1.3173784421041, 9.7452277380928)
-      DateTime       = 2011-03-26T01:44:39
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.48429656022017
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_088
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 54.0
-      Line           = 22806.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:36
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2494.3620626303
-      Line           = 22758.164875175
-      ErrorLine      = -6.8878741204171
-      ErrorSample    = 1.1775232300706
-      ErrorMagnitude = 6.9878015753216
-      ZScore         = (-1.5132567857483, 4.1404084134986)
-      DateTime       = 2011-03-25T17:57:25
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.77348693066983
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 2305.6924953836
-      Line           = 21773.830415772
-      ErrorLine      = -3.1734847628468
-      ErrorSample    = 1.2201770366282
-      ErrorMagnitude = 3.3999761088478
-      ZScore         = (-1.333004421617, 9.0564957924174)
-      DateTime       = 2011-03-26T01:44:43
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.57523054090598
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 481.63925639377
-      Line           = 25600.505462416
-      ErrorLine      = -11.31400980629
-      ErrorSample    = -14.084179949214
-      ErrorMagnitude = 18.065739473896
-      ZScore         = (-1.333004421617, 9.0564957924174)
-      DateTime       = 2011-03-26T01:44:46
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.48600226026338
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 272.33370916609
-      Line           = 26461.64709323
-      ErrorLine      = 0.81420021891245
-      ErrorSample    = -9.283012411575
-      ErrorMagnitude = 9.3186501935598
-      ZScore         = (-1.333004421617, 9.0564957924174)
-      DateTime       = 2011-03-26T01:44:50
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.50806101194576
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 207.04892238046
-      Line           = 19724.966797822
-      ErrorLine      = -6.7287137811691
-      ErrorSample    = 34.210174368195
-      ErrorMagnitude = 34.865622315559
-      ZScore         = (-1.333004421617, 9.0564957924174)
-      DateTime       = 2011-03-26T01:44:53
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.50252580027245
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305450184:05413/NACL
-      MeasureType    = Automatic
-      Sample         = 1838.533823049
-      Line           = 6813.6225259943
-      ErrorLine      = -20.988253061714
-      ErrorSample    = -9.948753299569
-      ErrorMagnitude = 23.226804747925
-      ZScore         = (-1.333004421617, 9.0564957924174)
-      DateTime       = 2011-03-26T01:44:56
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.44984194298922
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_092
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 34.0
-      Line           = 23974.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:37
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2474.905494804
-      Line           = 23926.503954154
-      ErrorLine      = -7.0412585742197
-      ErrorSample    = 1.0283748175102
-      ErrorMagnitude = 7.1159593221372
-      ZScore         = (-1.7528630869629, 4.6260785483212)
-      DateTime       = 2011-03-25T17:57:25
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.73505322339656
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 2379.2290057428
-      Line           = 22942.377903254
-      ErrorLine      = -3.6512579753253
-      ErrorSample    = 0.55957099550506
-      ErrorMagnitude = 3.6938874510991
-      ZScore         = (-1.3940523167009, 6.4522111555206)
-      DateTime       = 2011-03-26T01:44:59
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.54178409185079
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 520.36640673349
-      Line           = 26753.771231926
-      ErrorLine      = -12.098773357488
-      ErrorSample    = -13.579090940382
-      ErrorMagnitude = 18.187139069217
-      ZScore         = (-1.3940523167009, 6.4522111555206)
-      DateTime       = 2011-03-26T01:45:02
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.4282518489963
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 203.01071334633
-      Line           = 27615.242214782
-      ErrorLine      = 0.3194403679845
-      ErrorSample    = -8.8172573451655
-      ErrorMagnitude = 8.8230419493264
-      ZScore         = (-1.3940523167009, 6.4522111555206)
-      DateTime       = 2011-03-26T01:45:05
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.43168599506316
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 117.67661560426
-      Line           = 18598.658296367
-      ErrorLine      = -6.8006740162782
-      ErrorSample    = 33.461476323673
-      ErrorMagnitude = 34.145564350812
-      ZScore         = (-1.3940523167009, 6.4522111555206)
-      DateTime       = 2011-03-26T01:45:08
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.46158350271435
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305450184:05413/NACL
-      MeasureType    = Automatic
-      Sample         = 1422.385417636
-      Line           = 8794.8244796845
-      ErrorLine      = -22.993991373822
-      ErrorSample    = -11.377501931263
-      ErrorMagnitude = 25.65484729043
-      ZScore         = (-1.3940523167009, 6.4522111555206)
-      DateTime       = 2011-03-26T01:45:12
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.44828663536282
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305463753:22535/NACR
-      MeasureType    = Automatic
-      Sample         = 2431.8748045958
-      Line           = 7631.308585368
-      ErrorLine      = -15.36443819331
-      ErrorSample    = -11.034775491279
-      ErrorMagnitude = 18.916453978983
-      ZScore         = (-1.3940523167009, 6.4522111555206)
-      DateTime       = 2011-03-26T01:45:16
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.43337630800306
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_095
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 55.0
-      Line           = 24617.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:38
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2495.7548549616
-      Line           = 24569.412373914
-      ErrorLine      = -6.935286980668
-      ErrorSample    = 1.2142409033722
-      ErrorMagnitude = 7.0407802462259
-      ZScore         = (-0.93817128075312, 4.0413327343585)
-      DateTime       = 2011-03-25T17:57:25
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.85631016555885
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 2449.6773014732
-      Line           = 23583.978919829
-      ErrorLine      = -3.9000461844589
-      ErrorSample    = 0.20492597651582
-      ErrorMagnitude = 3.9054263399485
-      ZScore         = (-0.97840396322559, 8.8948787900026)
-      DateTime       = 2011-03-26T01:45:19
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.65819365964308
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 504.48108732884
-      Line           = 27387.30732115
-      ErrorLine      = -11.507303775707
-      ErrorSample    = -13.785796710888
-      ErrorMagnitude = 17.957344768655
-      ZScore         = (-0.97840396322559, 8.8948787900026)
-      DateTime       = 2011-03-26T01:45:22
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.52567600586281
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305450184:05413/NACL
-      MeasureType    = Automatic
-      Sample         = 1231.8601765172
-      Line           = 9891.9257894737
-      ErrorLine      = -24.452964046573
-      ErrorSample    = -11.824283325933
-      ErrorMagnitude = 27.161758537233
-      ZScore         = (-0.97840396322559, 8.8948787900026)
-      DateTime       = 2011-03-26T01:45:26
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.55302679405213
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305463753:22535/NACR
-      MeasureType    = Automatic
-      Sample         = 2277.2364923058
-      Line           = 8744.7858636455
-      ErrorLine      = -15.345244181412
-      ErrorSample    = -11.355143615639
-      ErrorMagnitude = 19.089677983637
-      ZScore         = (-0.97840396322559, 8.8948787900026)
-      DateTime       = 2011-03-26T01:45:29
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.55919359087238
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_096
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 31.0
-      Line           = 25066.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:38
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2471.0169515531
-      Line           = 25018.268194679
-      ErrorLine      = -7.0387883373623
-      ErrorSample    = 1.5236133480344
-      ErrorMagnitude = 7.2018010867071
-      ZScore         = (-1.4404105751233, 3.0863568009152)
-      DateTime       = 2011-03-25T17:57:25
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.89877818111177
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 538.80862935301
-      Line           = 27830.475181885
-      ErrorLine      = -11.801781821727
-      ErrorSample    = -13.608483313207
-      ErrorMagnitude = 18.01313055117
-      ZScore         = (-1.229917915017, 6.9361318872563)
-      DateTime       = 2011-03-26T01:45:35
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.51807017215833
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 123.19386442677
-      Line           = 28692.32816278
-      ErrorLine      = 0.63833466023425
-      ErrorSample    = -8.720578890084
-      ErrorMagnitude = 8.7439102989815
-      ZScore         = (-1.229917915017, 6.9361318872563)
-      DateTime       = 2011-03-26T01:45:38
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.52711202152477
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 58.356210738343
-      Line           = 17546.187759555
-      ErrorLine      = -6.8059328892159
-      ErrorSample    = 33.569892977285
-      ErrorMagnitude = 34.252860274711
-      ZScore         = (-1.229917915017, 6.9361318872563)
-      DateTime       = 2011-03-26T01:45:41
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.49802349907168
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305450184:05413/NACL
-      MeasureType    = Automatic
-      Sample         = 1050.7590247617
-      Line           = 10648.050143754
-      ErrorLine      = -24.983971215914
-      ErrorSample    = -12.06006710656
-      ErrorMagnitude = 27.742459089496
-      ZScore         = (-1.229917915017, 6.9361318872563)
-      DateTime       = 2011-03-26T01:45:45
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.52265462893956
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305463753:22535/NACR
-      MeasureType    = Automatic
-      Sample         = 2120.7934714763
-      Line           = 9514.4503880255
-      ErrorLine      = -15.321465300649
-      ErrorSample    = -11.66438604927
-      ErrorMagnitude = 19.256302886728
-      ZScore         = (-1.229917915017, 6.9361318872563)
-      DateTime       = 2011-03-26T01:45:48
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.52136751478974
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_097
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 43.0
-      Line           = 25264.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:39
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2484.3515875088
-      Line           = 25216.55889386
-      ErrorLine      = -7.1187027492524
-      ErrorSample    = 0.60965636546916
-      ErrorMagnitude = 7.1447609978341
-      ZScore         = (-0.96633374430574, 4.1063321651916)
-      DateTime       = 2011-03-25T17:57:26
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.86041946214095
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 527.42718025594
-      Line           = 28026.135722347
-      ErrorLine      = -11.70821820635
-      ErrorSample    = -13.56548808282
-      ErrorMagnitude = 17.919398441149
-      ZScore         = (-0.77509982824707, 5.8576161494878)
-      DateTime       = 2011-03-26T01:45:54
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.63324005071172
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 70.376143189546
-      Line           = 17354.768764443
-      ErrorLine      = -6.6577959850329
-      ErrorSample    = 33.725527158274
-      ErrorMagnitude = 34.376408036352
-      ZScore         = (-0.77509982824707, 5.8576161494878)
-      DateTime       = 2011-03-26T01:45:57
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.46671980889687
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305450184:05413/NACL
-      MeasureType    = Automatic
-      Sample         = 1000.525799049
-      Line           = 10987.976827955
-      ErrorLine      = -25.056153654823
-      ErrorSample    = -12.258207350706
-      ErrorMagnitude = 27.893986510124
-      ZScore         = (-0.77509982824707, 5.8576161494878)
-      DateTime       = 2011-03-26T01:46:01
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.64485184873956
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305463753:22535/NACR
-      MeasureType    = Automatic
-      Sample         = 2081.0073577996
-      Line           = 9858.4418646095
-      ErrorLine      = -14.520488098382
-      ErrorSample    = -11.303726163826
-      ErrorMagnitude = 18.401597751337
-      ZScore         = (-0.77509982824707, 5.8576161494878)
-      DateTime       = 2011-03-26T01:46:05
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.64762405892634
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_098
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 31.0
-      Line           = 25410.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:39
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2471.6815635051
-      Line           = 25362.540042038
-      ErrorLine      = -6.9641122257162
-      ErrorSample    = 1.495037145025
-      ErrorMagnitude = 7.1227800160734
-      ZScore         = (-1.3333686564185, 3.102616786163)
-      DateTime       = 2011-03-25T17:57:26
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.81980237734206
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274868345:16174/NACR
-      MeasureType    = Automatic
-      Sample         = 2423.4009335566
-      Line           = 24343.399645882
-      ErrorLine      = 30.36084052864
-      ErrorSample    = 65.702386086463
-      ErrorMagnitude = 72.378064184255
-      ZScore         = (-0.95336557723783, 4.8936587156054)
-      DateTime       = 2011-03-26T01:46:07
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.36097720693931
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 541.74861163917
-      Line           = 28170.524929361
-      ErrorLine      = -11.500410855973
-      ErrorSample    = -13.031215308082
-      ErrorMagnitude = 17.380219281176
-      ZScore         = (-0.95336557723783, 4.8936587156054)
-      DateTime       = 2011-03-26T01:46:10
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.60307093721622
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277225597:08310/NACL
-      MeasureType    = Automatic
-      Sample         = 94.461353765796
-      Line           = 29031.890500158
-      ErrorLine      = 1.015094544764
-      ErrorSample    = -8.5406335680316
-      ErrorMagnitude = 8.6007464023884
-      ZScore         = (-0.95336557723783, 4.8936587156054)
-      DateTime       = 2011-03-26T01:46:13
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.62124178627528
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 44.928361343617
-      Line           = 17213.341439522
-      ErrorLine      = -6.4810049297957
-      ErrorSample    = 33.116579047673
-      ErrorMagnitude = 33.744795639044
-      ZScore         = (-0.95336557723783, 4.8936587156054)
-      DateTime       = 2011-03-26T01:46:16
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.51250543134302
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305450184:05413/NACL
-      MeasureType    = Automatic
-      Sample         = 936.75776037606
-      Line           = 11233.958273795
-      ErrorLine      = -24.816570394676
-      ErrorSample    = -11.498711419226
-      ErrorMagnitude = 27.351097426914
-      ZScore         = (-0.95336557723783, 4.8936587156054)
-      DateTime       = 2011-03-26T01:46:19
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.60110800104758
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_100
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 50.0
-      Line           = 26045.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:40
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2490.8926701261
-      Line           = 25997.520328594
-      ErrorLine      = -7.0271327182563
-      ErrorSample    = 1.1450581489771
-      ErrorMagnitude = 7.119814070924
-      ZScore         = (-1.4487938871418, 3.5820789696207)
-      DateTime       = 2011-03-25T17:57:26
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.90889356166554
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 528.06679576794
-      Line           = 28797.697984674
-      ErrorLine      = -11.874906195142
-      ErrorSample    = -13.583484130306
-      ErrorMagnitude = 18.042295814605
-      ZScore         = (-1.1079280348351, 8.8187643732959)
-      DateTime       = 2011-03-26T01:46:22
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.4276807822007
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 48.254589631182
-      Line           = 16600.57317602
-      ErrorLine      = -6.4510786829123
-      ErrorSample    = 32.955140900447
-      ErrorMagnitude = 33.580615359779
-      ZScore         = (-1.1079280348351, 8.8187643732959)
-      DateTime       = 2011-03-26T01:46:25
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.40495878601632
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305450184:05413/NACL
-      MeasureType    = Automatic
-      Sample         = 747.92778575654
-      Line           = 12317.866338627
-      ErrorLine      = -26.506179462325
-      ErrorSample    = -11.912556335268
-      ErrorMagnitude = 29.060050724834
-      ZScore         = (-1.1079280348351, 8.8187643732959)
-      DateTime       = 2011-03-26T01:46:28
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.56401872930928
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305463753:22535/NACR
-      MeasureType    = Automatic
-      Sample         = 1872.3679804173
-      Line           = 11208.426030688
-      ErrorLine      = -14.343130422396
-      ErrorSample    = -11.569534798317
-      ErrorMagnitude = 18.42768367873
-      ZScore         = (-1.1079280348351, 8.8187643732959)
-      DateTime       = 2011-03-26T01:46:32
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.55775616502979
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_103
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 49.0
-      Line           = 26763.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:40
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2489.7315784811
-      Line           = 26715.430042406
-      ErrorLine      = -6.893689831315
-      ErrorSample    = 1.3133887734234
-      ErrorMagnitude = 7.0176883345252
-      ZScore         = (-0.79667059035168, 5.9338382089936)
-      DateTime       = 2011-03-25T17:57:26
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.8520159176544
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 537.90293235088
-      Line           = 29506.723160535
-      ErrorLine      = -11.700993496037
-      ErrorSample    = -13.871118904143
-      ErrorMagnitude = 18.147208833514
-      ZScore         = (-0.8844158633651, 5.9038075856763)
-      DateTime       = 2011-03-26T01:46:36
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.55364458252461
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACR
-      MeasureType    = Automatic
-      Sample         = 29.340450897368
-      Line           = 15088.648960642
-      ErrorLine      = 812.60051973397
-      ErrorSample    = 16.962573508374
-      ErrorMagnitude = 812.77754248745
-      ZScore         = (-0.94022925966711, 5.0686841568865)
-      DateTime       = 2011-03-26T03:06:00
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.36667575427418
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305450184:05413/NACL
-      MeasureType    = Automatic
-      Sample         = 503.7497336624
-      Line           = 13537.673449224
-      ErrorLine      = -26.861445317119
-      ErrorSample    = -12.267507684105
-      ErrorMagnitude = 29.530136967243
-      ZScore         = (-0.8844158633651, 5.9038075856763)
-      DateTime       = 2011-03-26T01:46:45
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.61275201229455
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305463753:22535/NACR
-      MeasureType    = Automatic
-      Sample         = 1673.9094090143
-      Line           = 12448.046381397
-      ErrorLine      = -13.871861683478
-      ErrorSample    = -11.514037916839
-      ErrorMagnitude = 18.027801189162
-      ZScore         = (-0.8844158633651, 5.9038075856763)
-      DateTime       = 2011-03-26T01:46:50
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.61592441720131
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_104
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 32.0
-      Line           = 27008.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:41
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2472.3318544986
-      Line           = 26960.260303402
-      ErrorLine      = -7.0583518964922
-      ErrorSample    = 1.1354533340241
-      ErrorMagnitude = 7.1490968498448
-      ZScore         = (-1.2662526046324, 3.093038845988)
-      DateTime       = 2011-03-25T17:57:26
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.89279686836312
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACL
-      MeasureType    = Automatic
-      Sample         = 2410.2755029644
-      Line           = 15700.486760347
-      ErrorLine      = -4.7215007308823
-      ErrorSample    = 34.511122754669
-      ErrorMagnitude = 34.832602012189
-      ZScore         = (-1.3062364965332, 7.1249333957868)
-      DateTime       = 2011-03-26T01:46:52
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.45866120067149
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305450184:05413/NACL
-      MeasureType    = Automatic
-      Sample         = 400.57971206054
-      Line           = 13949.595807438
-      ErrorLine      = -27.430066357992
-      ErrorSample    = -13.305630552646
-      ErrorMagnitude = 30.486855279076
-      ZScore         = (-1.3062364965332, 7.1249333957868)
-      DateTime       = 2011-03-26T01:46:55
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.49079565779721
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305463753:22535/NACR
-      MeasureType    = Automatic
-      Sample         = 1585.1651724669
-      Line           = 12867.649656547
-      ErrorLine      = -13.953752232799
-      ErrorSample    = -11.732431474803
-      ErrorMagnitude = 18.230665091688
-      ZScore         = (-1.3062364965332, 7.1249333957868)
-      DateTime       = 2011-03-26T01:46:59
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.49873757051137
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_107
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 47.0
-      Line           = 27744.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:42
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2487.7513409279
-      Line           = 27696.521785311
-      ErrorLine      = -7.0332654995436
-      ErrorSample    = 1.172645055723
-      ErrorMagnitude = 7.1303520259369
-      ZScore         = (-2.3719309862434, 4.3790541981022)
-      DateTime       = 2011-03-25T17:57:27
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.67953720277342
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 553.14253699141
-      Line           = 30474.712408918
-      ErrorLine      = -11.801961658977
-      ErrorSample    = -13.286204856719
-      ErrorMagnitude = 17.771030878783
-      ZScore         = (-1.3476783038555, 7.0752223552632)
-      DateTime       = 2011-03-26T01:47:03
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.54871226454452
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACL
-      MeasureType    = Automatic
-      Sample         = 2403.3656372877
-      Line           = 14989.696223547
-      ErrorLine      = -4.2916644703037
-      ErrorSample    = 33.404432430517
-      ErrorMagnitude = 33.678991818798
-      ZScore         = (-1.3476783038555, 7.0752223552632)
-      DateTime       = 2011-03-26T01:47:07
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.55627679446479
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305450184:05413/NACL
-      MeasureType    = Automatic
-      Sample         = 170.35461727734
-      Line           = 15204.993126869
-      ErrorLine      = -28.758264175061
-      ErrorSample    = -13.588085192246
-      ErrorMagnitude = 31.806820299337
-      ZScore         = (-1.3476783038555, 7.0752223552632)
-      DateTime       = 2011-03-26T01:47:10
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.47076468366959
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305463753:22535/NACR
-      MeasureType    = Automatic
-      Sample         = 1401.1692235866
-      Line           = 14141.751324712
-      ErrorLine      = -13.456360241767
-      ErrorSample    = -11.391570574616
-      ErrorMagnitude = 17.630697975766
-      ZScore         = (-1.3476783038555, 7.0752223552632)
-      DateTime       = 2011-03-26T01:47:15
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.4665763842695
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_108
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 31.0
-      Line           = 27998.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:42
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2470.9468791369
-      Line           = 27950.220265616
-      ErrorLine      = -6.9555624651293
-      ErrorSample    = 1.7203048331899
-      ErrorMagnitude = 7.165144654884
-      ZScore         = (-1.4346784813282, 3.5545662706593)
-      DateTime       = 2011-03-25T17:57:27
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.81566033669344
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 574.21531265145
-      Line           = 30725.673777644
-      ErrorLine      = -11.765642048544
-      ErrorSample    = -13.430860818745
-      ErrorMagnitude = 17.855485295756
-      ZScore         = (-1.2825145675115, 8.5543400941783)
-      DateTime       = 2011-03-26T01:47:18
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.52081148209982
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACL
-      MeasureType    = Automatic
-      Sample         = 2365.187003644
-      Line           = 14744.541691725
-      ErrorLine      = -4.535066565546
-      ErrorSample    = 33.863785483371
-      ErrorMagnitude = 34.166105953382
-      ZScore         = (-1.2825145675115, 8.5543400941783)
-      DateTime       = 2011-03-26T01:47:20
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.5019536256732
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305450184:05413/NACL
-      MeasureType    = Automatic
-      Sample         = 66.947213233043
-      Line           = 15633.439109085
-      ErrorLine      = -29.012563387361
-      ErrorSample    = -13.52223833115
-      ErrorMagnitude = 32.009057527363
-      ZScore         = (-1.2825145675115, 8.5543400941783)
-      DateTime       = 2011-03-26T01:47:23
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.50801449530809
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305463753:22535/NACR
-      MeasureType    = Automatic
-      Sample         = 1310.9108914922
-      Line           = 14577.955378953
-      ErrorLine      = -13.476461406064
-      ErrorSample    = -11.854410801922
-      ErrorMagnitude = 17.948316564231
-      ZScore         = (-1.2825145675115, 8.5543400941783)
-      DateTime       = 2011-03-26T01:47:26
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.50061110173192
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_109
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 61.0
-      Line           = 28410.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:42
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2502.1678132504
-      Line           = 28362.508794768
-      ErrorLine      = -7.0306276578922
-      ErrorSample    = 0.77566116258186
-      ErrorMagnitude = 7.0732860470263
-      ZScore         = (-2.0691169134753, 6.5749357956886)
-      DateTime       = 2011-03-25T17:57:27
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.68286133124298
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 544.2201700658
-      Line           = 31132.256317775
-      ErrorLine      = -11.76938146001
-      ErrorSample    = -13.342179614006
-      ErrorMagnitude = 17.791348931535
-      ZScore         = (-1.300420860445, 7.2590071178184)
-      DateTime       = 2011-03-26T01:47:29
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.53824801789597
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACL
-      MeasureType    = Automatic
-      Sample         = 2397.9898907849
-      Line           = 14346.548165415
-      ErrorLine      = -4.18796367086
-      ErrorSample    = 33.322704491711
-      ErrorMagnitude = 33.584842925795
-      ZScore         = (-1.300420860445, 7.2590071178184)
-      DateTime       = 2011-03-26T01:47:31
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.53496908741454
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305463753:22535/NACR
-      MeasureType    = Automatic
-      Sample         = 1234.7587019226
-      Line           = 15294.731111371
-      ErrorLine      = -13.005005838444
-      ErrorSample    = -12.208553019065
-      ErrorMagnitude = 17.837571126061
-      ZScore         = (-1.300420860445, 7.2590071178184)
-      DateTime       = 2011-03-26T01:47:34
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.46849942161953
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_110
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 61.0
-      Line           = 28551.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:43
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2502.1726249195
-      Line           = 28503.340295373
-      ErrorLine      = -6.9403375171169
-      ErrorSample    = 0.63562548115897
-      ErrorMagnitude = 6.9693833732834
-      ZScore         = (-0.90782076320571, 3.7260158030433)
-      DateTime       = 2011-03-25T17:57:27
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.93033540853935
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACL
-      MeasureType    = Automatic
-      Sample         = 2391.6407124593
-      Line           = 14210.652392639
-      ErrorLine      = -4.652444685642
-      ErrorSample    = 34.167606495253
-      ErrorMagnitude = 34.482902649972
-      ZScore         = (-0.95761016115408, 7.2664070360085)
-      DateTime       = 2011-03-26T01:47:37
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.5046775018227
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305463753:22535/NACR
-      MeasureType    = Automatic
-      Sample         = 1195.9169727526
-      Line           = 15538.491177719
-      ErrorLine      = -12.550409018444
-      ErrorSample    = -11.948090038811
-      ErrorMagnitude = 17.328289647446
-      ZScore         = (-0.95761016115408, 7.2664070360085)
-      DateTime       = 2011-03-26T01:47:41
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.60428037527799
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_111
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 42.0
-      Line           = 28850.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:43
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2482.7451846283
-      Line           = 28802.473368239
-      ErrorLine      = -7.1121495261032
-      ErrorSample    = 1.0215150204472
-      ErrorMagnitude = 7.1851349200032
-      ZScore         = (-1.6071633491787, 6.2960037703753)
-      DateTime       = 2011-03-25T17:57:27
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.77419231144017
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 573.22640939266
-      Line           = 31565.793054124
-      ErrorLine      = -11.447993291513
-      ErrorSample    = -14.158786831357
-      ErrorMagnitude = 18.207904737732
-      ZScore         = (-1.0470430581866, 8.9552498650943)
-      DateTime       = 2011-03-26T01:47:44
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.55332188607372
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACL
-      MeasureType    = Automatic
-      Sample         = 2343.708293346
-      Line           = 13922.314981087
-      ErrorLine      = -4.1320831977573
-      ErrorSample    = 33.390824770597
-      ErrorMagnitude = 33.645524076969
-      ZScore         = (-1.0470430581866, 8.9552498650943)
-      DateTime       = 2011-03-26T01:47:47
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.42802832768575
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305463753:22535/NACR
-      MeasureType    = Automatic
-      Sample         = 1088.3529580505
-      Line           = 16049.843113016
-      ErrorLine      = -12.484912414167
-      ErrorSample    = -11.76513256319
-      ErrorMagnitude = 17.154922973271
-      ZScore         = (-1.0470430581866, 8.9552498650943)
-      DateTime       = 2011-03-26T01:47:50
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.5608036669928
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_116
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 52.0
-      Line           = 30242.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:44
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2492.6605849979
-      Line           = 30194.308333686
-      ErrorLine      = -7.0323758398699
-      ErrorSample    = 0.94536337357385
-      ErrorMagnitude = 7.0956339999524
-      ZScore         = (-0.97913193965213, 4.6898913861389)
-      DateTime       = 2011-03-25T17:57:27
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.82341964766192
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 578.42263642768
-      Line           = 32940.051257962
-      ErrorLine      = -12.093168659398
-      ErrorSample    = -13.886785097605
-      ErrorMagnitude = 18.414329435842
-      ZScore         = (-0.96260625386208, 8.1312959478387)
-      DateTime       = 2011-03-26T01:47:54
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.40527053278311
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACL
-      MeasureType    = Automatic
-      Sample         = 2295.1328581958
-      Line           = 12579.076197133
-      ErrorLine      = -3.8760219039032
-      ErrorSample    = 33.727094962653
-      ErrorMagnitude = 33.949086591827
-      ZScore         = (-0.96260625386208, 8.1312959478387)
-      DateTime       = 2011-03-26T01:47:57
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.4016792373277
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305463753:22535/NACR
-      MeasureType    = Automatic
-      Sample         = 716.48876867109
-      Line           = 18455.355711512
-      ErrorLine      = -11.680304816153
-      ErrorSample    = -11.997729110276
-      ErrorMagnitude = 16.744402778296
-      ZScore         = (-0.96260625386208, 8.1312959478387)
-      DateTime       = 2011-03-26T01:48:01
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.5971659298566
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_117
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 46.0
-      Line           = 30370.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:45
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2487.1922588685
-      Line           = 30322.462239527
-      ErrorLine      = -7.0078876121333
-      ErrorSample    = 0.79095320172064
-      ErrorMagnitude = 7.0523822749198
-      ZScore         = (-1.4364361107966, 3.3491854919688)
-      DateTime       = 2011-03-25T17:57:28
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.77197540635393
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACL
-      MeasureType    = Automatic
-      Sample         = 2279.0823605023
-      Line           = 12455.856948877
-      ErrorLine      = -4.0737545920601
-      ErrorSample    = 33.44306108504
-      ErrorMagnitude = 33.69026285463
-      ZScore         = (-0.95936540886659, 6.7562135601344)
-      DateTime       = 2011-03-26T01:48:09
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.34446054377622
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305463753:22535/NACR
-      MeasureType    = Automatic
-      Sample         = 673.84328246621
-      Line           = 18675.601308609
-      ErrorLine      = -11.869949082742
-      ErrorSample    = -12.134085961916
-      ErrorMagnitude = 16.974443536035
-      ZScore         = (-0.95936540886659, 6.7562135601344)
-      DateTime       = 2011-03-26T01:48:12
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.60331104556917
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_123
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 47.0
-      Line           = 32105.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:46
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2487.1873926462
-      Line           = 32057.395530214
-      ErrorLine      = -6.9561839541748
-      ErrorSample    = 1.5235164972632
-      ErrorMagnitude = 7.1210671757646
-      ZScore         = (-1.6369123439087, 6.1410996991639)
-      DateTime       = 2011-03-25T17:57:28
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.64925256558217
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 607.59674130414
-      Line           = 34778.805989118
-      ErrorLine      = -11.832588985584
-      ErrorSample    = -13.67828712753
-      ErrorMagnitude = 18.086063718922
-      ZScore         = (-1.1906229073085, 8.0326983284407)
-      DateTime       = 2011-03-26T01:48:15
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.5041341525166
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACL
-      MeasureType    = Automatic
-      Sample         = 2199.0782023855
-      Line           = 10781.509419066
-      ErrorLine      = -4.0141356122494
-      ErrorSample    = 33.589940287126
-      ErrorMagnitude = 33.828942833116
-      ZScore         = (-1.1906229073085, 8.0326983284407)
-      DateTime       = 2011-03-26T01:48:19
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.50983694355
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305463753:22535/NACR
-      MeasureType    = Automatic
-      Sample         = 193.69177601436
-      Line           = 21671.147400707
-      ErrorLine      = -10.50638839884
-      ErrorSample    = -13.114507126021
-      ErrorMagnitude = 16.804002331163
-      ZScore         = (-1.1906229073085, 8.0326983284407)
-      DateTime       = 2011-03-26T01:48:23
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.53757391605905
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_124
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 61.0
-      Line           = 32350.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:46
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2502.547403338
-      Line           = 32302.531469562
-      ErrorLine      = -7.0269044304332
-      ErrorSample    = 0.35792300269304
-      ErrorMagnitude = 7.036014123799
-      ZScore         = (-1.2245992310524, 3.3853695247132)
-      DateTime       = 2011-03-25T17:57:28
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.83930400848999
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 593.60103577043
-      Line           = 35020.931788824
-      ErrorLine      = -11.987079922379
-      ErrorSample    = -13.573832250472
-      ErrorMagnitude = 18.109086311282
-      ZScore         = (-1.0261725728911, 7.1427575026562)
-      DateTime       = 2011-03-26T01:48:26
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.5366586789205
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACL
-      MeasureType    = Automatic
-      Sample         = 2212.5928659449
-      Line           = 10544.546146993
-      ErrorLine      = -3.6638668901087
-      ErrorSample    = 33.449657243242
-      ErrorMagnitude = 33.64971753639
-      ZScore         = (-1.0261725728911, 7.1427575026562)
-      DateTime       = 2011-03-26T01:48:30
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.36900112600779
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305463753:22535/NACR
-      MeasureType    = Automatic
-      Sample         = 143.43228551982
-      Line           = 22097.639865713
-      ErrorLine      = -10.630895210248
-      ErrorSample    = -13.261235755988
-      ErrorMagnitude = 16.996361573795
-      ZScore         = (-1.0261725728911, 7.1427575026562)
-      DateTime       = 2011-03-26T01:48:32
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.58785941952192
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_126
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 61.0
-      Line           = 32762.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:47
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2501.5391667458
-      Line           = 32714.552866953
-      ErrorLine      = -6.9426094694645
-      ErrorSample    = 1.3962364632625
-      ErrorMagnitude = 7.0816172239709
-      ZScore         = (-1.7877190074219, 4.5662119969653)
-      DateTime       = 2011-03-25T17:57:28
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.80806859667655
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 598.7681004047
-      Line           = 35427.13344734
-      ErrorLine      = -11.605127273971
-      ErrorSample    = -13.487211299211
-      ErrorMagnitude = 17.792803255098
-      ZScore         = (-1.2127427494351, 7.4958741445934)
-      DateTime       = 2011-03-26T01:48:36
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.53776871656555
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACL
-      MeasureType    = Automatic
-      Sample         = 2192.3602953643
-      Line           = 10147.513154033
-      ErrorLine      = -3.9543797178449
-      ErrorSample    = 33.152252040753
-      ErrorMagnitude = 33.387257065032
-      ZScore         = (-1.2127427494351, 7.4958741445934)
-      DateTime       = 2011-03-26T01:48:39
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.55024353278804
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305463753:22535/NACL
-      MeasureType    = Automatic
-      Sample         = 2468.2263514423
-      Line           = 22741.962280397
-      ErrorLine      = -18.206340758872
-      ErrorSample    = -12.011771201793
-      ErrorMagnitude = 21.811774142247
-      ZScore         = (-1.2127427494351, 7.4958741445934)
-      DateTime       = 2011-03-26T01:48:43
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.49303284362941
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_127
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 32.0
-      Line           = 32970.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:47
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2472.5769241533
-      Line           = 32922.443245961
-      ErrorLine      = -6.9795135418899
-      ErrorSample    = 1.1922731631798
-      ErrorMagnitude = 7.0806161156402
-      ZScore         = (-2.4016676372766, 5.8102781044808)
-      DateTime       = 2011-03-25T17:57:28
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.771989083059
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 635.22794379959
-      Line           = 35631.886758171
-      ErrorLine      = -11.047658135525
-      ErrorSample    = -13.619342092506
-      ErrorMagnitude = 17.536739415072
-      ZScore         = (-1.283822521462, 7.5296632690503)
-      DateTime       = 2011-03-26T01:48:46
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.53578744124388
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACL
-      MeasureType    = Automatic
-      Sample         = 2132.3901941822
-      Line           = 9947.222308935
-      ErrorLine      = -4.16510594793
-      ErrorSample    = 33.542589961431
-      ErrorMagnitude = 33.800198947316
-      ZScore         = (-1.283822521462, 7.5296632690503)
-      DateTime       = 2011-03-26T01:48:49
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.57531296183333
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305463753:22535/NACL
-      MeasureType    = Automatic
-      Sample         = 2373.6442933489
-      Line           = 23095.8975005
-      ErrorLine      = -17.918393409233
-      ErrorSample    = -11.502583025102
-      ErrorMagnitude = 21.29268040002
-      ZScore         = (-1.283822521462, 7.5296632690503)
-      DateTime       = 2011-03-26T01:48:52
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.4988002284008
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_128
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 46.0
-      Line           = 33284.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:48
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2486.2871651993
-      Line           = 33236.488865754
-      ErrorLine      = -7.0485779589362
-      ErrorSample    = 1.530493363327
-      ErrorMagnitude = 7.2128261575051
-      ZScore         = (-2.1409427240369, 4.1257044442891)
-      DateTime       = 2011-03-25T17:57:28
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.81877612146934
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 622.59425821598
-      Line           = 35942.070387874
-      ErrorLine      = -11.522832313836
-      ErrorSample    = -13.43372760214
-      ErrorMagnitude = 17.698607341293
-      ZScore         = (-0.91538298180936, 7.4207882728051)
-      DateTime       = 2011-03-26T01:48:55
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.64315349437038
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACL
-      MeasureType    = Automatic
-      Sample         = 2143.1489679339
-      Line           = 9643.994877207
-      ErrorLine      = -4.0340636529199
-      ErrorSample    = 33.279144505023
-      ErrorMagnitude = 33.522755384097
-      ZScore         = (-0.91538298180936, 7.4207882728051)
-      DateTime       = 2011-03-26T01:48:59
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.56250283013014
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305463753:22535/NACL
-      MeasureType    = Automatic
-      Sample         = 2304.1970496224
-      Line           = 23641.501924391
-      ErrorLine      = -18.818878639224
-      ErrorSample    = -11.833884977302
-      ErrorMagnitude = 22.230407708674
-      ZScore         = (-0.91538298180936, 7.4207882728051)
-      DateTime       = 2011-03-26T01:49:03
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.59769629165203
-      Reference      = False
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType = Tie
-    PointId   = M107794445_auto_130
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACR
-      MeasureType    = Estimated
-      Sample         = 61.0
-      Line           = 33802.0
-      ErrorLine      = 0.0
-      ErrorSample    = 0.0
-      ErrorMagnitude = 0.0
-      DateTime       = 2011-03-25T17:56:48
-      ChooserName    = "Application cnetref(interest)"
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/274847978:28626/NACL
-      MeasureType    = Automatic
-      Sample         = 2501.4878589449
-      Line           = 33754.328733827
-      ErrorLine      = -6.9855918781177
-      ErrorSample    = 1.0873237412957
-      ErrorMagnitude = 7.0697076888659
-      ZScore         = (-1.0555095248167, 5.3594045323143)
-      DateTime       = 2011-03-25T17:57:28
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.80969758933702
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/277205233:08310/NACR
-      MeasureType    = Automatic
-      Sample         = 611.98219048582
-      Line           = 36453.544919511
-      ErrorLine      = -11.685348147999
-      ErrorSample    = -13.728391970339
-      ErrorMagnitude = 18.028203111548
-      ZScore         = (-1.0830934632321, 7.7573868602209)
-      DateTime       = 2011-03-26T01:49:07
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.54518981648926
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/290182186:06999/NACL
-      MeasureType    = Automatic
-      Sample         = 2143.9544231139
-      Line           = 9143.9835726611
-      ErrorLine      = -3.8858290881799
-      ErrorSample    = 33.638990089804
-      ErrorMagnitude = 33.86268332493
-      ZScore         = (-1.0830934632321, 7.7573868602209)
-      DateTime       = 2011-03-26T01:49:11
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.45019976241656
-      Reference      = False
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = LRO/1/305463753:22535/NACL
-      MeasureType    = Automatic
-      Sample         = 2178.8364142046
-      Line           = 24539.468810442
-      ErrorLine      = -19.361310274944
-      ErrorSample    = -11.986267563908
-      ErrorMagnitude = 22.77127457294
-      ZScore         = (-1.0830934632321, 7.7573868602209)
-      DateTime       = 2011-03-26T01:49:14
-      ChooserName    = "Application pointreg"
-      GoodnessOfFit  = 0.556266435
-      Reference      = False
-    End_Group
-  End_Object
-End_Object
-End
diff --git a/isis/src/control/objs/ControlNetVersioner/semilarge2.net b/isis/src/control/objs/ControlNetVersioner/semilarge2.net
deleted file mode 100644
index d4d6388cb4008cfb4e5649d8d96ae5ac454cf0c0..0000000000000000000000000000000000000000
Binary files a/isis/src/control/objs/ControlNetVersioner/semilarge2.net and /dev/null differ
diff --git a/isis/src/control/objs/ControlNetVersioner/smallPvlTest.pvl b/isis/src/control/objs/ControlNetVersioner/smallPvlTest.pvl
deleted file mode 100644
index 77b4edff9bcdbd5384b32940dec4f4864f417d8a..0000000000000000000000000000000000000000
--- a/isis/src/control/objs/ControlNetVersioner/smallPvlTest.pvl
+++ /dev/null
@@ -1,232 +0,0 @@
-Object = ControlNetwork
-  NetworkId    = LUNAE_PALUS_THEMIS_DIR
-  TargetName   = Mars
-  UserName     = lweller
-  Created      = 2012-01-04T12:09:57
-  LastModified = 2012-01-04T12:09:57
-  Description  = "Themis Day IR Network: Lunae Palus, Lat(0,30) Lon(270-315)"
-  Version      = 3
-
-  Object = ControlPoint
-    PointType                = Free
-    PointId                  = I00826010RDR_bndry_12_LUPA
-    ChooserName              = cnetadd
-    DateTime                 = 2012-01-04T17:01:32
-    AprioriXYZSource         = AverageOfMeasures
-    AprioriRadiusSource      = AverageOfMeasures
-
-    # AprioriLatitude = 14.14339916959 <degrees>
-    AprioriX                 = 1485514.8494536 <meters>
-
-    # AprioriLongitude = 296.82889373072 <degrees>
-    AprioriY                 = -2937138.2000946 <meters>
-
-    # AprioriRadius = 3394325.0717817 <meters>
-    AprioriZ                 = 829401.90409959 <meters>
-
-    # AdjustedLatitude = 14.146765358974 <degrees>
-    AdjustedX                = 1485464.8707894 <meters>
-
-    # AdjustedLongitude = 296.8283466239 <degrees>
-    AdjustedY                = -2937109.019407 <meters>
-
-    # AdjustedRadius = 3394325.2138031 <meters>
-    AdjustedZ                = 829595.31268436 <meters>
-
-    # AdjustedLatitudeSigma = 100.13842019954 <meters>  AdjustedLongitudeSigma = 106.48711145076 <meters>  AdjustedRadiusSigma = 0.099947528407384 <meters>
-    AdjustedCovarianceMatrix = (8096.6118516192, 3791.9236705506,
-                                -1072.6708105639, 2516.0772474838,
-                                2117.9301543094, 9418.2547424025)
-
-    Group = ControlMeasure
-      SerialNumber       = Odyssey/THEMIS_IR/698683699.000
-      MeasureType        = RegisteredSubPixel
-      ChooserName        = jigsaw
-      DateTime           = 2012-01-04T17:01:32
-      Sample             = 281.08153003015
-      Line               = 11156.102814549
-      AprioriSample      = 281.03269406111
-      AprioriLine        = 11152.532413247
-      SampleResidual     = 0.09390925836783 <pixels>
-      LineResidual       = -0.40064279964683 <pixels>
-      MinimumPixelZScore = -6.9339878963865
-      MaximumPixelZScore = 7.8509687345151
-      GoodnessOfFit      = 0.7774975693515
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = Odyssey/THEMIS_IR/703655751.025
-      MeasureType    = Candidate
-      ChooserName    = jigsaw
-      DateTime       = 2012-01-04T17:01:32
-      Sample         = 50.0
-      Line           = 119.0
-      AprioriSample  = 63.884272146677
-      AprioriLine    = 142.5235022424
-      SampleResidual = -0.094840643252908 <pixels>
-      LineResidual   = 0.40119503350171 <pixels>
-      Reference      = True
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber       = Odyssey/THEMIS_IR/823772384.051
-      MeasureType        = RegisteredSubPixel
-      ChooserName        = jigsaw
-      DateTime           = 2012-01-04T17:01:32
-      Sample             = 125.64867138851
-      Line               = 6934.86240197
-      AprioriSample      = 125.97474105797
-      AprioriLine        = 6929.0974196911
-      SampleResidual     = -0.21291253682794 <pixels>
-      LineResidual       = 1.5456238534476 <pixels>
-      JigsawRejected     = Yes
-      MinimumPixelZScore = -6.9339878963865
-      MaximumPixelZScore = 7.8509687345151
-      GoodnessOfFit      = 0.83301329654337
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber       = Odyssey/THEMIS_IR/886537550.076
-      MeasureType        = RegisteredSubPixel
-      ChooserName        = jigsaw
-      DateTime           = 2012-01-04T17:01:32
-      Sample             = 121.71328243649
-      Line               = 1611.0779378425
-      AprioriSample      = 121.96374543834
-      AprioriLine        = 1604.7225382451
-      SampleResidual     = -0.76190274948203 <pixels>
-      LineResidual       = 2.9999718926613 <pixels>
-      JigsawRejected     = Yes
-      MinimumPixelZScore = -6.9339878963865
-      MaximumPixelZScore = 7.8509687345151
-      GoodnessOfFit      = 0.73500978891097
-    End_Group
-  End_Object
-
-  Object = ControlPoint
-    PointType                = Free
-    PointId                  = I00826010RDR_bndry_18_LUPA
-    ChooserName              = cnetadd
-    DateTime                 = 2012-01-04T17:01:32
-    AprioriXYZSource         = AverageOfMeasures
-    AprioriRadiusSource      = AverageOfMeasures
-
-    # AprioriLatitude = 1.5761959010641 <degrees>
-    AprioriX                 = 1438906.6184968 <meters>
-
-    # AprioriLongitude = 295.06807013258 <degrees>
-    AprioriY                 = -3076198.23962 <meters>
-
-    # AprioriRadius = 3397378.4988624 <meters>
-    AprioriZ                 = 93449.442681098 <meters>
-
-    # AdjustedLatitude = 1.5740867356935 <degrees>
-    AdjustedX                = 1438753.7401475 <meters>
-
-    # AdjustedLongitude = 295.06519690035 <degrees>
-    AdjustedY                = -3076273.3580737 <meters>
-
-    # AdjustedRadius = 3397378.3342506 <meters>
-    AdjustedZ                = 93324.42152629 <meters>
-
-    # AdjustedLatitudeSigma = 56.560713922924 <meters>  AdjustedLongitudeSigma = 56.546411110445 <meters>  AdjustedRadiusSigma = 0.099943774867249 <meters>
-    AdjustedCovarianceMatrix = (2621.8486551013, 1225.183985133,
-                                -35.999329178353, 575.49833284641,
-                                80.485341554024, 3198.9240672187)
-
-    Group = ControlMeasure
-      SerialNumber       = Odyssey/THEMIS_IR/698683699.000
-      MeasureType        = RegisteredSubPixel
-      ChooserName        = jigsaw
-      DateTime           = 2012-01-04T17:01:32
-      Sample             = 262.1189848565
-      Line               = 18645.53932567
-      AprioriSample      = 263.9067249829
-      AprioriLine        = 18640.965067677
-      SampleResidual     = -0.12761620783141 <pixels>
-      LineResidual       = 0.473333530677 <pixels>
-      MinimumPixelZScore = -2.4444144842514
-      MaximumPixelZScore = 6.9676729547839
-      GoodnessOfFit      = 0.66365907994161
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber       = Odyssey/THEMIS_IR/735440023.102
-      MeasureType        = RegisteredSubPixel
-      ChooserName        = jigsaw
-      DateTime           = 2012-01-04T17:01:32
-      Sample             = 113.19805161656
-      Line               = 871.24205655933
-      AprioriSample      = 114.24804752929
-      AprioriLine        = 870.86225771974
-      SampleResidual     = 0.029113440104908 <pixels>
-      LineResidual       = -0.18796253373658 <pixels>
-      MinimumPixelZScore = -2.4444144842514
-      MaximumPixelZScore = 6.9676729547839
-      GoodnessOfFit      = 0.78883477858692
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber       = Odyssey/THEMIS_IR/743341642.230
-      MeasureType        = RegisteredSubPixel
-      ChooserName        = jigsaw
-      DateTime           = 2012-01-04T17:01:32
-      Sample             = 146.43702923022
-      Line               = 1503.6954607526
-      AprioriSample      = 147.51524919147
-      AprioriLine        = 1503.5776603544
-      SampleResidual     = 0.061164798476028 <pixels>
-      LineResidual       = 0.0089720872815207 <pixels>
-      MinimumPixelZScore = -2.4444144842514
-      MaximumPixelZScore = 6.9676729547839
-      GoodnessOfFit      = 0.89964014420426
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber       = Odyssey/THEMIS_IR/748668439.128
-      MeasureType        = RegisteredSubPixel
-      ChooserName        = jigsaw
-      DateTime           = 2012-01-04T17:01:32
-      Sample             = 273.35496192874
-      Line               = 7502.064819162
-      AprioriSample      = 274.48842778612
-      AprioriLine        = 7500.1422047045
-      SampleResidual     = -0.070064463477593 <pixels>
-      LineResidual       = -0.24223011077042 <pixels>
-      MinimumPixelZScore = -2.4444144842514
-      MaximumPixelZScore = 6.9676729547839
-      GoodnessOfFit      = 0.86261888858658
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber       = Odyssey/THEMIS_IR/863012025.153
-      MeasureType        = RegisteredSubPixel
-      ChooserName        = jigsaw
-      DateTime           = 2012-01-04T17:01:32
-      Sample             = 103.98926084184
-      Line               = 761.53392870525
-      AprioriSample      = 104.94650253457
-      AprioriLine        = 760.35658417009
-      SampleResidual     = 0.066430623970064 <pixels>
-      LineResidual       = 0.031916462414969 <pixels>
-      MinimumPixelZScore = -2.4444144842514
-      MaximumPixelZScore = 6.9676729547839
-      GoodnessOfFit      = 0.88323894279087
-    End_Group
-
-    Group = ControlMeasure
-      SerialNumber   = Odyssey/THEMIS_IR/865231481.179
-      MeasureType    = Candidate
-      ChooserName    = jigsaw
-      DateTime       = 2012-01-04T17:01:32
-      Sample         = 201.0
-      Line           = 713.0
-      AprioriSample  = 231.97649098258
-      AprioriLine    = 681.86891715185
-      SampleResidual = 0.039205563748425 <pixels>
-      LineResidual   = -0.084795557950841 <pixels>
-      Reference      = True
-    End_Group
-  End_Object
-End_Object
-End
diff --git a/isis/src/control/objs/ControlNetVersioner/unitTest.cpp b/isis/src/control/objs/ControlNetVersioner/unitTest.cpp
index b9bdee3afed5c8a4f204bc837298d4623160f807..d5b60a8c13942d278c401e5f98d50bc1c05e890c 100644
--- a/isis/src/control/objs/ControlNetVersioner/unitTest.cpp
+++ b/isis/src/control/objs/ControlNetVersioner/unitTest.cpp
@@ -1,7 +1,5 @@
 #include "ControlNetVersioner.h"
 
-#include <string>
-
 #include <QString>
 #include <QTime>
 
@@ -10,32 +8,141 @@
 #include "IException.h"
 #include "IString.h"
 #include "Preference.h"
+#include "Progress.h"
 #include "Pvl.h"
 
 using namespace std;
 using namespace Isis;
 
-void TestNetwork(const QString &filename, bool printNetwork = true, bool pvlInput = false);
+void TestNetwork(const QString &filename, Progress *progress, bool printNetwork = true, bool pvlInput = false);
 
 int main(int argc, char *argv[]) {
   Preference::Preferences(true);
-  cerr << "Test ControlNetVersioner" << endl;
-  TestNetwork("./reallyOldNetwork.net"); // No target
-  TestNetwork("./reallyOldNetwork2.net"); // Really odd keywords with target
-  TestNetwork("./oldNetwork.net"); // Another set of odd keywords
-  TestNetwork("./oldNetwork2.net"); // Binary V1
-  TestNetwork("./badNetwork.net"); // Corrupted (based off of oldNetwork2.net)
-  TestNetwork("./semilarge.net", false);
-  TestNetwork("./smallPvlTest.pvl", true, true); // network with rejected jigsaw points
+  Progress *testProgress = new Progress();
+  std::cout << "Test ControlNetVersioner";
+
+  TestNetwork("$control/testData/unitTest_ControlNetVersioner_PvlNetwork2_PvlV0001.net", testProgress);     // No target
+  TestNetwork("$control/testData/unitTest_ControlNetVersioner_PvlNetwork3_PvlV0001.net", testProgress);     // Really odd keywords with target
+  TestNetwork("$control/testData/unitTest_ControlNetVersioner_PvlNetwork1_PvlV0001.net", testProgress);     // Another set of odd keywords
+  TestNetwork("$control/testData/unitTest_ControlNetVersioner_ProtoNetwork1_ProtoV0001.net", testProgress); // Binary V1
+  TestNetwork("$control/testData/unitTest_ControlNetVersioner_BadNetwork_ProtoV0001.net", testProgress);    // Corrupted (based off of oldNetwork2.net)
+  TestNetwork("$control/testData/unitTest_ControlNetVersioner_ProtoNetwork2_ProtoV0002.net", testProgress, false);  // Binary V2
+  TestNetwork("$control/testData/unitTest_ControlNetVersioner_PvlNetwork4_PvlV0003.pvl", testProgress, true, true); // Network with rejected jigsaw points
+  TestNetwork("$control/testData/unitTest_ControlNetVersioner_PvlNetwork5_PvlV0003.pvl", testProgress, false, false); // Network full of weird test cases (based on PvlNetwork4)
+
+  // Re-test each version without progress
+  TestNetwork("$control/testData/unitTest_ControlNetVersioner_PvlNetwork3_PvlV0001.net", 0, false);
+  TestNetwork("$control/testData/unitTest_ControlNetVersioner_ProtoNetwork1_ProtoV0001.net", 0, false);
+  TestNetwork("$control/testData/unitTest_ControlNetVersioner_ProtoNetwork2_ProtoV0002.net", 0, false);
+  TestNetwork("$control/testData/unitTest_ControlNetVersioner_PvlNetwork4_PvlV0003.pvl", 0, false);
+
+  std::cout << std::endl << "Test writing from ControlNet objects" << std::endl << std::endl;
+  ControlNet *binaryV2Net = new ControlNet("$control/testData/unitTest_ControlNetVersioner_ProtoNetwork2_ProtoV0002.net",
+                                           testProgress);
+  ControlNetVersioner *binV2Versioner = new ControlNetVersioner(binaryV2Net);
+  binV2Versioner->write("./binaryV2tmp.net");
+  remove("./binaryV2tmp.net");
+  delete binV2Versioner;
+  binV2Versioner = NULL;
+
+  std::cout << std::endl << "Test reading version 1 protobuf network" << std::endl << std::endl;
+  ControlNetVersioner *binV1Versioner = new ControlNetVersioner(FileName("$control/testData/unitTest_ControlNetVersioner_ProtoNetwork1_ProtoV0001.net"), testProgress);
+  std::cout << "Take all of the control points and delete them." << std::endl;
+  int pointsTaken = 0;
+  ControlPoint *readPoint = binV1Versioner->takeFirstPoint();
+  while (readPoint != NULL) {
+    pointsTaken++;
+    std::cout << "  " << pointsTaken << (pointsTaken > 1 ? " points taken" : " point taken") << std::endl;
+    delete readPoint;
+    readPoint = binV1Versioner->takeFirstPoint();
+  }
+  delete binV1Versioner;
+  binV1Versioner = NULL;
+
+  std::cout << std::endl << "Test reading version 5 protobuf network" << std::endl << std::endl;
+  ControlNetVersioner *binV5Versioner = new ControlNetVersioner(FileName("$control/testData/unitTest_ControlNetVersioner_ProtoNetwork3_ProtoV0005.net"), testProgress);
+  delete binV5Versioner;
+  binV5Versioner = NULL;
+
+  std::cout << std::endl << "Test writing with invalid target" << std::endl << std::endl;
+  try {
+    binaryV2Net->SetTarget("INVALID_TARGET_NAME");
+    binV2Versioner = new ControlNetVersioner(binaryV2Net);
+  }
+  catch (IException &e) {
+    e.print();
+    if (binV2Versioner) {
+      delete binV2Versioner;
+      binV2Versioner = NULL;
+    }
+  }
+
+  std::cout << std::endl << "Test reading a random PVL file" << std::endl << std::endl;
+  try {
+    ControlNetVersioner invalidVersioner("$base/templates/maps/equirectangular.map");
+  }
+  catch (IException &e) {
+    e.print();
+  }
+
+  std::cout << std::endl << "Test reading a PVL files with missing header information" << std::endl << std::endl;
+  try {
+    ControlNetVersioner invalidVersionerV1("$control/testData/unitTest_ControlNetVersioner_PvlNetwork_BadHeaderV1.net");
+  }
+  catch (IException &e) {
+    e.print();
+  }
+  try {
+    ControlNetVersioner invalidVersionerV2("$control/testData/unitTest_ControlNetVersioner_PvlNetwork_BadHeaderV2.net");
+  }
+  catch (IException &e) {
+    e.print();
+  }
+  try {
+    ControlNetVersioner invalidVersionerV3("$control/testData/unitTest_ControlNetVersioner_PvlNetwork_BadHeaderV3.net");
+  }
+  catch (IException &e) {
+    e.print();
+  }
+  try {
+    ControlNetVersioner invalidVersionerV4("$control/testData/unitTest_ControlNetVersioner_PvlNetwork_BadHeaderV4.net");
+  }
+  catch (IException &e) {
+    e.print();
+  }
+  try {
+    ControlNetVersioner invalidVersionerV5("$control/testData/unitTest_ControlNetVersioner_PvlNetwork_BadHeaderV5.net");
+  }
+  catch (IException &e) {
+    e.print();
+  }
+
+  std::cout << std::endl << "Test reading a protobuf file with a bad version number" << std::endl << std::endl;
+  try {
+    ControlNetVersioner invalidVersioner("$control/testData/unitTest_ControlNetVersioner_ProtoNetwork_BadVersion.net");
+  }
+  catch (IException &e) {
+    e.print();
+  }
+
+  std::cout << std::endl << "Test reading a protobuf file with no version number" << std::endl << std::endl;
+  try {
+    ControlNetVersioner invalidVersioner("$control/testData/unitTest_ControlNetVersioner_ProtoNetwork_NoVersion.net");
+  }
+  catch (IException &e) {
+    e.print();
+  }
+
+  delete binaryV2Net;
 }
 
-void TestNetwork(const QString &filename, bool printNetwork, bool pvlInput) {
-  cerr << "Reading: " << filename << "...\n\n";
+void TestNetwork(const QString &filename, Progress *progress, bool printNetwork, bool pvlInput) {
+  std::cout << "\nReading: " << filename << "...\n";
   FileName networkFileName(filename);
 
-  LatestControlNetFile * test = NULL;
-  LatestControlNetFile * test2 = NULL;
-  
+  ControlNetVersioner *test = NULL;
+  ControlNetVersioner *test2 = NULL;
+
   try {
 
     // If we're reading in a Pvl file, this will call the Pvl update cycle, then
@@ -44,55 +151,55 @@ void TestNetwork(const QString &filename, bool printNetwork, bool pvlInput) {
     //   convert to Pvl, then update, then convert to binary, and back to pvl.
     //   The reason for the intermediate Pvl is described in
     //   ControlNetVersioner.h.
-    cerr << "Read network..." << endl;
-    test = ControlNetVersioner::Read(networkFileName);
+    std::cout << "\nRead network..." << std::endl;
+    test = new ControlNetVersioner(networkFileName, progress);
 
     if(printNetwork) {
-      cerr << "Converted directly to Pvl:" << endl;
+      std::cout << "Converted directly to Pvl:" << std::endl;
       Pvl pvlVersion(test->toPvl());
-      cerr << pvlVersion << endl;
+
+      // std::cout does not support this operation on a pvl
+      std::cout << pvlVersion << std::endl;
       pvlVersion.write("./tmp.pvl");
     }
 
     // Test the latest binary read/write and Pvl conversion
-    cerr << "Write the network and re-read it..." << endl;
-    ControlNetVersioner::Write(FileName("./tmp"), *test);
-          
+    std::cout << "Write the network and re-read it..." << std::endl;
+    test->write( FileName("./tmp") );
     try {
-      test2 = ControlNetVersioner::Read(FileName("./tmp"));
+      test2 = new ControlNetVersioner( FileName("./tmp") );
     }
     catch(IException &e) {
       remove("./tmp");
       throw;
     }
 
-    cerr << "After reading and writing to a binary form does Pvl match?"
-         << endl;
+    std::cout << "After reading and writing to a binary form does Pvl match?" << std::endl;
+
     if(printNetwork) {
       Pvl pvlVersion2(test2->toPvl());
       pvlVersion2.write("./tmp2.pvl");
       if(system("cmp ./tmp.pvl ./tmp2.pvl")) {
-        cerr << "Reading/Writing results in Pvl differences!" << endl;
+        std::cout << "Reading/Writing results in Pvl differences!" << std::endl;
       }
       else {
-        cerr << "Conversion to Pvl stays consistent" << endl;
+        std::cout << "Conversion to Pvl stays consistent" << std::endl;
       }
     }
 
-    ControlNetVersioner::Write(FileName("./tmp2"), *test2);
+    test2->write(FileName("./tmp2"));
     if(system("cmp ./tmp ./tmp2")) {
-      cerr << "Reading/Writing control network results in binary differences!"
-           << endl;
+      std::cout << "Reading/Writing control network results in binary differences!" << std::endl;
     }
     else {
-      cerr << "Reading/Writing control network is consistent" << endl;
+      std::cout << "Reading/Writing control network is consistent" << std::endl;
     }
 
     if (pvlInput) {
 
-      LatestControlNetFile * cNet2 = NULL;
-      
-      cerr << "Check conversions between the binary format and the pvl format." << endl;
+      ControlNetVersioner *cNet2 = NULL;
+
+      std::cout << "Check conversions between the binary format and the pvl format." << std::endl;
       /*
        * When the input is a pvl, ./tmp is the binary form of the initial input. (pvl1->bin1)
        * Furthermore, ./tmp.pvl is the first binary conversion reverted back to pvl.
@@ -101,7 +208,7 @@ void TestNetwork(const QString &filename, bool printNetwork, bool pvlInput) {
        *
        *                                  a       b       c
        *                            (pvl1 -> bin1 -> pvl2 -> bin2)
-       * 
+       *
        * if (pvl1 != pvl2)
        *        a or b is broken but we don't know which yet
        *        if(bin1 != bin2)
@@ -112,26 +219,26 @@ void TestNetwork(const QString &filename, bool printNetwork, bool pvlInput) {
        * else
        *        The conversions are up to date and correct because neither a nor b broke.
        *
-       * 
+       *
        */
-      cNet2 = ControlNetVersioner::Read(FileName("./tmp.pvl"));
+      cNet2 = new ControlNetVersioner(FileName("./tmp.pvl"));
 
-      ControlNetVersioner::Write(FileName("./tmpCNet2"), *cNet2);
+      cNet2->write( FileName("./tmpCNet2") );
 
       //if there are differences between the pvls.
-      QString cmd = "diff -EbB --suppress-common-lines " + filename + " ./tmp.pvl";
+      QString cmd = "diff -EbB --suppress-common-lines -I 'Version.*' " + networkFileName.expanded() + " ./tmp.pvl";
       if(system(cmd.toStdString().c_str())) {
-        
+
         //if the binary files are different.
         if(system("diff -EbB --suppress-common-lines ./tmp ./tmpCNet2")){
-          cerr << "The conversion from binary to pvl is incorrect." << endl;
+          std::cout << "The conversion from binary to pvl is incorrect." << std::endl;
         }
         else {
-          cerr << "The conversion from pvl to binary is incorrect." << endl;
+          std::cout << "The conversion from pvl to binary is incorrect." << std::endl;
         }
       }
       else {
-        cerr << "The conversion methods for pvl->bin and bin->pvl are correct." << endl;
+        std::cout << "The conversion methods for pvl->bin and bin->pvl are correct." << std::endl;
       }
 
       remove("./tmpCNet2");
@@ -150,7 +257,7 @@ void TestNetwork(const QString &filename, bool printNetwork, bool pvlInput) {
   catch(IException &e) {
     QStringList errors = e.toString().split("\n");
     errors.removeLast();
-    cerr << errors.join("\n") << endl;
+    std::cout << errors.join("\n") << std::endl;
   }
 
   if(test) {
@@ -163,6 +270,4 @@ void TestNetwork(const QString &filename, bool printNetwork, bool pvlInput) {
     test2 = NULL;
   }
 
-  cerr << endl;
 }
-
diff --git a/isis/src/control/objs/ControlPoint/ControlPoint.cpp b/isis/src/control/objs/ControlPoint/ControlPoint.cpp
index 14a090da7f13eae125faf7c87a32225302bfa358..04df89eae32ecb2cad8503fd845a05d73809ae92 100644
--- a/isis/src/control/objs/ControlPoint/ControlPoint.cpp
+++ b/isis/src/control/objs/ControlPoint/ControlPoint.cpp
@@ -17,9 +17,6 @@
 #include "ControlMeasure.h"
 #include "ControlMeasureLogData.h"
 #include "ControlNet.h"
-#include "ControlNetFile.h"
-#include "ControlNetFile.h"
-#include "ControlNetFileV0002.pb.h"
 #include "Cube.h"
 #include "IString.h"
 #include "Latitude.h"
@@ -86,8 +83,9 @@ namespace Isis {
       ControlMeasure *newMeasure = new ControlMeasure(*otherCm);
       AddMeasure(newMeasure);
 
-      if (other.referenceMeasure == otherCm)
+      if (other.referenceMeasure == otherCm) {
         SetRefMeasure(newMeasure);
+      }
     }
 
     id = other.id;
@@ -110,209 +108,6 @@ namespace Isis {
   }
 
 
-  /**
-   * This is used when reading from a protocol buffer. Given a file
-   *   representation (protocol buffer), and log data,
-   *   construct the control point.
-   *
-   * @history 2008-06-18  Debbie A. Cook, Swapped Init with SetRadii
-   *          calls to avoid resetting the surface points with no radii
-   * @history 2015-11-03  Kris Becker - invalid flag was not being initialized
-   */
-  ControlPoint::ControlPoint(const ControlPointFileEntryV0002 &fileEntry,
-      const Distance &majorRad, const Distance &minorRad,
-      const Distance &polarRad) : invalid(false)  {
-    measures = NULL;
-    cubeSerials = NULL;
-    referenceMeasure = NULL;
-    numberOfRejectedMeasures = 0;
-    measures = new QHash< QString, ControlMeasure * >;
-    cubeSerials = new QStringList;
-
-    id = fileEntry.id().c_str();
-    dateTime = "";
-    aprioriSurfacePointSource = SurfacePointSource::None;
-    aprioriRadiusSource = RadiusSource::None;
-
-    chooserName = fileEntry.choosername().c_str();
-    dateTime = fileEntry.datetime().c_str();
-    editLock = false;
-
-    parentNetwork = NULL;
-
-    switch (fileEntry.type()) {
-      case ControlPointFileEntryV0002_PointType_obsolete_Tie:
-      case ControlPointFileEntryV0002_PointType_Free:
-        type = Free;
-        break;
-      case ControlPointFileEntryV0002_PointType_Constrained:
-        type = Constrained;
-        break;
-      case ControlPointFileEntryV0002_PointType_obsolete_Ground:
-      case ControlPointFileEntryV0002_PointType_Fixed:
-        type = Fixed;
-        break;
-      default:
-        QString msg = "Point type is invalid.";
-        throw IException(IException::Programmer, msg, _FILEINFO_);
-    }
-
-    ignore = fileEntry.ignore();
-    jigsawRejected = fileEntry.jigsawrejected();
-
-    // Read apriori keywords
-    if (fileEntry.has_apriorisurfpointsource()) {
-      switch (fileEntry.apriorisurfpointsource()) {
-        case ControlPointFileEntryV0002_AprioriSource_None:
-          aprioriSurfacePointSource = SurfacePointSource::None;
-          break;
-
-        case ControlPointFileEntryV0002_AprioriSource_User:
-          aprioriSurfacePointSource = SurfacePointSource::User;
-          break;
-
-        case ControlPointFileEntryV0002_AprioriSource_AverageOfMeasures:
-          aprioriSurfacePointSource = SurfacePointSource::AverageOfMeasures;
-          break;
-
-        case ControlPointFileEntryV0002_AprioriSource_Reference:
-          aprioriSurfacePointSource = SurfacePointSource::Reference;
-          break;
-
-        case ControlPointFileEntryV0002_AprioriSource_Basemap:
-          aprioriSurfacePointSource = SurfacePointSource::Basemap;
-          break;
-
-        case ControlPointFileEntryV0002_AprioriSource_BundleSolution:
-          aprioriSurfacePointSource = SurfacePointSource::BundleSolution;
-          break;
-
-        case ControlPointFileEntryV0002_AprioriSource_Ellipsoid:
-        case ControlPointFileEntryV0002_AprioriSource_DEM:
-          break;
-      }
-    }
-
-    if (fileEntry.has_apriorisurfpointsourcefile()) {
-      aprioriSurfacePointSourceFile = fileEntry.apriorisurfpointsourcefile().c_str();
-    }
-
-    if (fileEntry.has_aprioriradiussource()) {
-      switch (fileEntry.aprioriradiussource()) {
-        case ControlPointFileEntryV0002_AprioriSource_None:
-          aprioriRadiusSource = RadiusSource::None;
-          break;
-        case ControlPointFileEntryV0002_AprioriSource_User:
-          aprioriRadiusSource = RadiusSource::User;
-          break;
-        case ControlPointFileEntryV0002_AprioriSource_AverageOfMeasures:
-          aprioriRadiusSource = RadiusSource::AverageOfMeasures;
-          break;
-        case ControlPointFileEntryV0002_AprioriSource_Ellipsoid:
-          aprioriRadiusSource = RadiusSource::Ellipsoid;
-          break;
-        case ControlPointFileEntryV0002_AprioriSource_DEM:
-          aprioriRadiusSource = RadiusSource::DEM;
-          break;
-        case ControlPointFileEntryV0002_AprioriSource_BundleSolution:
-          aprioriRadiusSource = RadiusSource::BundleSolution;
-          break;
-
-        case ControlPointFileEntryV0002_AprioriSource_Reference:
-        case ControlPointFileEntryV0002_AprioriSource_Basemap:
-          break;
-      }
-    }
-
-    if (fileEntry.has_aprioriradiussourcefile()) {
-      aprioriRadiusSourceFile = fileEntry.aprioriradiussourcefile().c_str();
-    }
-
-    constraintStatus.reset();
-
-    if (fileEntry.has_apriorix() && fileEntry.has_aprioriy() &&
-        fileEntry.has_aprioriz()) {
-      SurfacePoint apriori(
-        Displacement(fileEntry.apriorix(), Displacement::Meters),
-        Displacement(fileEntry.aprioriy(), Displacement::Meters),
-        Displacement(fileEntry.aprioriz(), Displacement::Meters));
-
-      if (fileEntry.aprioricovar_size() > 0) {
-        symmetric_matrix<double, upper> covar;
-        covar.resize(3);
-        covar.clear();
-        covar(0, 0) = fileEntry.aprioricovar(0);
-        covar(0, 1) = fileEntry.aprioricovar(1);
-        covar(0, 2) = fileEntry.aprioricovar(2);
-        covar(1, 1) = fileEntry.aprioricovar(3);
-        covar(1, 2) = fileEntry.aprioricovar(4);
-        covar(2, 2) = fileEntry.aprioricovar(5);
-        apriori.SetRectangularMatrix(covar);
-
-        if (Displacement(covar(0, 0), Displacement::Meters).isValid() ||
-            Displacement(covar(1, 1), Displacement::Meters).isValid()) {
-          if (fileEntry.latitudeconstrained())
-            constraintStatus.set(LatitudeConstrained);
-          if (fileEntry.longitudeconstrained())
-            constraintStatus.set(LongitudeConstrained);
-          if (fileEntry.radiusconstrained())
-            constraintStatus.set(RadiusConstrained);
-        }
-        else if (Displacement(covar(2, 2), Displacement::Meters).isValid()) {
-          if (fileEntry.latitudeconstrained())
-            constraintStatus.set(LatitudeConstrained);
-          if (fileEntry.radiusconstrained())
-            constraintStatus.set(RadiusConstrained);
-        }
-      }
-
-      aprioriSurfacePoint = apriori;
-    }
-
-    if (fileEntry.has_adjustedx() &&
-        fileEntry.has_adjustedy() &&
-        fileEntry.has_adjustedz()) {
-      SurfacePoint adjusted(
-        Displacement(fileEntry.adjustedx(), Displacement::Meters),
-        Displacement(fileEntry.adjustedy(), Displacement::Meters),
-        Displacement(fileEntry.adjustedz(), Displacement::Meters));
-
-      if (fileEntry.adjustedcovar_size() > 0) {
-        symmetric_matrix<double, upper> covar;
-        covar.resize(3);
-        covar.clear();
-        covar(0, 0) = fileEntry.adjustedcovar(0);
-        covar(0, 1) = fileEntry.adjustedcovar(1);
-        covar(0, 2) = fileEntry.adjustedcovar(2);
-        covar(1, 1) = fileEntry.adjustedcovar(3);
-        covar(1, 2) = fileEntry.adjustedcovar(4);
-        covar(2, 2) = fileEntry.adjustedcovar(5);
-        adjusted.SetRectangularMatrix(covar);
-      }
-
-      adjustedSurfacePoint = adjusted;
-    }
-
-    if (majorRad.isValid() && minorRad.isValid() && polarRad.isValid()) {
-      aprioriSurfacePoint.SetRadii(majorRad, minorRad, polarRad);
-      adjustedSurfacePoint.SetRadii(majorRad, minorRad, polarRad);
-    }
-
-    referenceExplicitlySet = false;
-
-    for (int m = 0 ; m < fileEntry.measures_size() ; m++) {
-      ControlMeasure *measure = new ControlMeasure(fileEntry.measures(m));
-      AddMeasure(measure);
-    }
-
-    if (fileEntry.has_referenceindex()) {
-      SetRefMeasure((*measures)[cubeSerials->at(fileEntry.referenceindex())]);
-    }
-
-    // Set edit lock last
-    editLock = fileEntry.editlock();
-  }
-
 
   /**
    * Construct a control point with given Id
@@ -440,7 +235,7 @@ namespace Isis {
     }
 
     if (!measures->size()) {
-      ASSERT(referenceMeasure == NULL);
+      ASSERT(!HasRefMeasure());
       referenceMeasure = measure;
     }
     else if (referenceMeasure->IsIgnored() && !measure->IsIgnored() &&
@@ -490,8 +285,9 @@ namespace Isis {
     ValidateMeasure(serialNumber);
     ControlMeasure *cm = (*measures)[serialNumber];
 
-    if (cm->IsEditLocked())
+    if (cm->IsEditLocked()) {
       return ControlMeasure::MeasureLocked;
+    }
 
     // remove measure from the point's data structures
     measures->remove(serialNumber);
@@ -512,8 +308,9 @@ namespace Isis {
     if (parentNetwork) {
       parentNetwork->measureDeleted(cm);
 
-      if (!IsIgnored() && !cm->IsIgnored())
+      if (!IsIgnored() && !cm->IsIgnored()) {
         parentNetwork->emitNetworkStructureModified();
+      }
     }
 
     delete cm;
@@ -559,8 +356,9 @@ namespace Isis {
    * @author Sharmila Prasad (10/22/2010)
    */
   ControlPoint::Status ControlPoint::ResetApriori() {
-    if (IsEditLocked())
+    if (IsEditLocked()) {
       return PointLocked;
+    }
 
     aprioriSurfacePointSource = SurfacePointSource::None;
     aprioriSurfacePointSourceFile    = "";
@@ -618,13 +416,23 @@ namespace Isis {
   }
 
 
+  /**
+   * Checks to see if a reference measure is set.
+   *
+   * @returns bool True if a reference measure is set.
+   */
+  bool ControlPoint::HasRefMeasure() const {
+    return !(referenceMeasure == NULL);
+  }
+
+
   /**
    * Get the reference control measure.
    *
    * @returns const reference measure for this point
    */
   const ControlMeasure *ControlPoint::GetRefMeasure() const {
-    if (referenceMeasure == NULL) {
+    if (!HasRefMeasure()) {
       QString msg = "Control point [" + GetId() + "] has no reference measure!";
       throw IException(IException::Programmer, msg, _FILEINFO_);
     }
@@ -637,7 +445,7 @@ namespace Isis {
    * Get the measure that is the reference directly.
    */
   ControlMeasure *ControlPoint::GetRefMeasure() {
-    if (referenceMeasure == NULL) {
+    if (!HasRefMeasure()) {
       QString msg = "Control point [" + GetId() + "] has no reference measure!";
       throw IException(IException::Programmer, msg, _FILEINFO_);
     }
@@ -654,8 +462,9 @@ namespace Isis {
    * @param name The username of the person who last modified this control point
    */
   ControlPoint::Status ControlPoint::SetChooserName(QString name) {
-    if (editLock)
+    if (editLock) {
       return PointLocked;
+    }
     chooserName = name;
     return Success;
   }
@@ -670,8 +479,9 @@ namespace Isis {
    * @param newDateTime The date and time this control point was last modified
    */
   ControlPoint::Status ControlPoint::SetDateTime(QString newDateTime) {
-    if (editLock)
+    if (editLock) {
       return PointLocked;
+    }
     dateTime = newDateTime;
     return Success;
   }
@@ -714,12 +524,14 @@ namespace Isis {
    * @return  (int) status Success or PointLocked
    */
   ControlPoint::Status ControlPoint::SetId(QString newId) {
-    if (editLock)
+    if (editLock) {
       return PointLocked;
+    }
     QString oldId = id;
     id = newId;
-    if (parentNetwork)
+    if (parentNetwork) {
       parentNetwork->UpdatePointReference(this, oldId);
+    }
     return Success;
   }
 
@@ -730,8 +542,9 @@ namespace Isis {
    * @param cm The new reference measure
    */
   ControlPoint::Status ControlPoint::SetRefMeasure(ControlMeasure *cm) {
-    if (editLock)
+    if (editLock) {
       return PointLocked;
+    }
 
     ASSERT(cm);
     SetExplicitReference(cm);
@@ -745,8 +558,9 @@ namespace Isis {
    * @param index The index of the new reference measure
    */
   ControlPoint::Status ControlPoint::SetRefMeasure(int index) {
-    if (editLock)
+    if (editLock) {
       return PointLocked;
+    }
 
     if (index < 0 || index >= cubeSerials->size()) {
       QString msg = "Index [";
@@ -765,8 +579,9 @@ namespace Isis {
    * @param sn The serial number of the new reference measure
    */
   ControlPoint::Status ControlPoint::SetRefMeasure(QString sn) {
-    if (editLock)
+    if (editLock) {
       return PointLocked;
+    }
 
     if (!cubeSerials->contains(sn)) {
       QString msg = "Point [" + id + "] has no measure with serial number [" +
@@ -810,8 +625,9 @@ namespace Isis {
    *                        un-ignore
    */
   ControlPoint::Status ControlPoint::SetIgnored(bool newIgnoreStatus) {
-    if (editLock)
+    if (editLock) {
       return PointLocked;
+    }
 
     bool oldStatus = ignore;
     ignore = newIgnoreStatus;
@@ -822,10 +638,12 @@ namespace Isis {
       if (parentNetwork) {
         foreach(ControlMeasure * cm, measures->values()) {
           if (!cm->IsIgnored()) {
-            if (ignore)
+            if (ignore) {
               parentNetwork->measureIgnored(cm);
-            else
+            }
+            else {
               parentNetwork->measureUnIgnored(cm);
+            }
           }
         }
         parentNetwork->emitNetworkStructureModified();
@@ -872,8 +690,9 @@ namespace Isis {
       throw IException(IException::Programmer, msg, _FILEINFO_);
     }
 
-    if (editLock)
+    if (editLock) {
       return PointLocked;
+    }
     PointModified();
     type = newType;
     return Success;
@@ -889,8 +708,9 @@ namespace Isis {
    */
   ControlPoint::Status ControlPoint::SetAprioriRadiusSource(
     RadiusSource::Source source) {
-    if (editLock)
+    if (editLock) {
       return PointLocked;
+    }
     PointModified();
     aprioriRadiusSource = source;
     return Success;
@@ -907,8 +727,9 @@ namespace Isis {
    */
   ControlPoint::Status ControlPoint::SetAprioriRadiusSourceFile(
     QString sourceFile) {
-    if (editLock)
+    if (editLock) {
       return PointLocked;
+    }
     PointModified();
     aprioriRadiusSourceFile = sourceFile;
     return Success;
@@ -934,14 +755,18 @@ namespace Isis {
       std::vector<Distance> targetRadii = parentNetwork->GetTargetRadii();
       aprioriSurfacePoint.SetRadii(targetRadii[0], targetRadii[1], targetRadii[2]);
     }
-    if (editLock)
+    if (editLock) {
       return PointLocked;
-    if (aprioriSP.GetLatSigma().isValid())
+    }
+    if (aprioriSP.GetLatSigma().isValid()) {
       constraintStatus.set(LatitudeConstrained);
-    if (aprioriSP.GetLonSigma().isValid())
+    }
+    if (aprioriSP.GetLonSigma().isValid()) {
       constraintStatus.set(LongitudeConstrained);
-    if (aprioriSP.GetLocalRadiusSigma().isValid())
+    }
+    if (aprioriSP.GetLocalRadiusSigma().isValid()) {
       constraintStatus.set(RadiusConstrained);
+    }
     PointModified();
     aprioriSurfacePoint = aprioriSP;
     return Success;
@@ -956,9 +781,10 @@ namespace Isis {
    * @param source Where the surface point came from
    */
   ControlPoint::Status ControlPoint::SetAprioriSurfacePointSource(
-    SurfacePointSource::Source source) {
-    if (editLock)
+      SurfacePointSource::Source source) {
+    if (editLock) {
       return PointLocked;
+    }
     PointModified();
     aprioriSurfacePointSource = source;
     return Success;
@@ -973,9 +799,10 @@ namespace Isis {
    * @param sourceFile Where the surface point came from
    */
   ControlPoint::Status ControlPoint::SetAprioriSurfacePointSourceFile(
-    QString sourceFile) {
-    if (editLock)
+      QString sourceFile) {
+    if (editLock) {
       return PointLocked;
+    }
     PointModified();
     aprioriSurfacePointSourceFile = sourceFile;
     return Success;
@@ -1073,8 +900,9 @@ namespace Isis {
         else {
           // JAA: Don't stop if we know the lat/lon.  The SetImage may fail
           // but the FocalPlane measures have been set
-          if (GetType() == Fixed)
+          if (GetType() == Fixed) {
             continue;
+          }
 
           // TODO: What do we do
 //          QString msg = "Cannot compute lat/lon/radius (x/y/z) for "
@@ -1102,7 +930,7 @@ namespace Isis {
         || IsLatitudeConstrained()
         || IsLongitudeConstrained()
         || IsRadiusConstrained()) {
-      
+
       // Initialize the adjusted x/y/z to the a priori coordinates
       adjustedSurfacePoint = aprioriSurfacePoint;
 
@@ -1170,8 +998,9 @@ namespace Isis {
    *                            duplication of code
    */
   ControlPoint::Status ControlPoint::ComputeResiduals() {
-    if (IsIgnored())
+    if (IsIgnored()) {
       return Failure;
+    }
 
     PointModified();
 
@@ -1180,11 +1009,12 @@ namespace Isis {
 
     for (int j = 0; j < keys.size(); j++) {
       ControlMeasure *m = (*measures)[keys[j]];
-      if (m->IsIgnored())
+      if (m->IsIgnored()) {
         continue;
+      }
       // The following lines actually check for Candidate measures
       // Commented out on 2011-03-24 by DAC
-//       if (!m->IsMeasured())
+//       if (!m->IsMeasured()) {
 //         continue;
 
       // TODO:  Should we use crater diameter?
@@ -1239,10 +1069,12 @@ namespace Isis {
         double adjLine;
 
         // Step 1. What happens if measured line is 1???  TODO
-        if (computedY < 0)
+        if (computedY < 0) {
           adjLine = m->GetLine() - 1.;
-        else
+        }
+        else {
           adjLine = m->GetLine() + 1.;
+        }
 
         cam->SetImage(sample, adjLine);
         SurfacePoint sp = cam->GetSurfacePoint();
@@ -1256,10 +1088,12 @@ namespace Isis {
         cam->GroundMap()->GetXY(sp, &focalplaneX, &scalingY);
         double deltaLine;
 
-        if (computedY < 0)
+        if (computedY < 0) {
           deltaLine = -computedY/scalingY;
-        else
+        }
+        else {
           deltaLine = computedY/scalingY;
+        }
 
         // Now map through the camera steps to take X from slant range to ground
         // range to pixels.  Y just tracks through as 0.
@@ -1322,8 +1156,9 @@ namespace Isis {
    */
 
   ControlPoint::Status ControlPoint::ComputeResiduals_Millimeters() {
-    if (IsIgnored())
+    if (IsIgnored()) {
       return Failure;
+    }
 
     PointModified();
 
@@ -1332,11 +1167,12 @@ namespace Isis {
 
     for (int j = 0; j < keys.size(); j++) {
       ControlMeasure *m = (*measures)[keys[j]];
-      if (m->IsIgnored())
+      if (m->IsIgnored()) {
         continue;
+      }
       // The following lines actually check for Candidate measures
       // Commented out on 2011-03-24 by DAC
-//       if (!m->IsMeasured())
+//       if (!m->IsMeasured()) {
 //         continue;
 
       // TODO:  Should we use crater diameter?
@@ -1350,8 +1186,9 @@ namespace Isis {
       // going to distorted focal plane or ground range in this case), so we
       // can hold the Spice to calculate residuals in undistorted focal plane
       // coordinates.
-      if (cam->GetCameraType() != 0)  // no need to call setimage for framing camera
+      if (cam->GetCameraType() != 0) {  // no need to call setimage for framing camera
         cam->SetImage(m->GetSample(), m->GetLine());
+      }
 
       cam->GroundMap()->GetXY(GetAdjustedSurfacePoint(), &cudx, &cudy);
       // double mudx = m->GetFocalPlaneMeasuredX();
@@ -1375,6 +1212,16 @@ namespace Isis {
     }
   }
 
+  //! Returns true if the choosername is not empty.
+  bool ControlPoint::HasChooserName() const {
+    return !chooserName.isEmpty();
+  }
+
+  //! Returns true if the datetime is not empty.
+  bool ControlPoint::HasDateTime() const {
+    return !dateTime.isEmpty();
+  }
+
 
   QString ControlPoint::GetDateTime() const {
     if (dateTime != "") {
@@ -1406,10 +1253,12 @@ namespace Isis {
    * the a priori surface point.
    */
   SurfacePoint ControlPoint::GetBestSurfacePoint() const {
-    if (adjustedSurfacePoint.Valid())
+    if (adjustedSurfacePoint.Valid()) {
       return adjustedSurfacePoint;
-    else
+    }
+    else {
       return aprioriSurfacePoint;
+    }
   }
 
 
@@ -1482,14 +1331,18 @@ namespace Isis {
             errMsg += pointTypeString;
             errMsg += "\".";
 
-    if (pointTypeString == "Fixed")
+    if (pointTypeString == "Fixed") {
       type = ControlPoint::Fixed;
-    else if (pointTypeString == "Constrained")
+    }
+    else if (pointTypeString == "Constrained") {
       type = ControlPoint::Constrained;
-    else if (pointTypeString == "Free")
+    }
+    else if (pointTypeString == "Free") {
       type = ControlPoint::Free;
-    else
+    }
+    else {
       throw IException(IException::Programmer, errMsg, _FILEINFO_);
+    }
 
     return type;
   }
@@ -1562,16 +1415,21 @@ namespace Isis {
     str = str.toLower();
     RadiusSource::Source source = RadiusSource::None;
 
-    if (str == "user")
+    if (str == "user") {
       source = RadiusSource::User;
-    else if (str == "averageofmeasures")
+    }
+    else if (str == "averageofmeasures") {
       source = RadiusSource::AverageOfMeasures;
-    else if (str == "ellipsoid")
+    }
+    else if (str == "ellipsoid") {
       source = RadiusSource::Ellipsoid;
-    else if (str == "dem")
+    }
+    else if (str == "dem") {
       source = RadiusSource::DEM;
-    else if (str == "bundlesolution")
+    }
+    else if (str == "bundlesolution") {
       source = RadiusSource::BundleSolution;
+    }
 
     return source;
   }
@@ -1639,16 +1497,21 @@ namespace Isis {
     str = str.toLower();
     SurfacePointSource::Source source = SurfacePointSource::None;
 
-    if (str == "user")
+    if (str == "user") {
       source = SurfacePointSource::User;
-    else if (str == "averageofmeasures")
+    }
+    else if (str == "averageofmeasures") {
       source = SurfacePointSource::AverageOfMeasures;
-    else if (str == "reference")
+    }
+    else if (str == "reference") {
       source = SurfacePointSource::Reference;
-    else if (str == "basemap")
+    }
+    else if (str == "basemap") {
       source = SurfacePointSource::Basemap;
-    else if (str == "bundlesolution")
+    }
+    else if (str == "bundlesolution") {
       source = SurfacePointSource::BundleSolution;
+    }
 
     return source;
   }
@@ -1674,19 +1537,23 @@ namespace Isis {
   }
 
 
-  ControlPoint::RadiusSource::Source ControlPoint::GetAprioriRadiusSource()
-  const {
-    return aprioriRadiusSource;
-  }
+   ControlPoint::RadiusSource::Source ControlPoint::GetAprioriRadiusSource()
+       const {
+     return aprioriRadiusSource;
+   }
 
-  bool ControlPoint::HasAprioriCoordinates() {
-    if (aprioriSurfacePoint.GetX().isValid() &&
-        aprioriSurfacePoint.GetY().isValid() &&
-        aprioriSurfacePoint.GetZ().isValid())
-      return true;
 
-    return false;
-  }
+   bool ControlPoint::HasAprioriCoordinates() {
+     if (aprioriSurfacePoint.GetX().isValid() &&
+         aprioriSurfacePoint.GetY().isValid() &&
+         aprioriSurfacePoint.GetZ().isValid()) {
+       return true;
+     }
+
+     return false;
+     // return aprioriSurfacePoint.Valid(); ???
+   }
+
 
   bool ControlPoint::IsConstrained() {
     return constraintStatus.any();
@@ -1708,6 +1575,17 @@ namespace Isis {
     return constraintStatus.count();
   }
 
+
+ /**
+  * Checks to see if the radius source file has been set.
+  *
+  * @return bool True if the radius source file has been set.
+  */
+  bool ControlPoint::HasAprioriRadiusSourceFile() const {
+    return !( aprioriRadiusSourceFile.isEmpty() || aprioriRadiusSourceFile.isNull() );
+  }
+
+
   QString ControlPoint::GetAprioriRadiusSourceFile() const {
     return aprioriRadiusSourceFile;
   }
@@ -1718,6 +1596,16 @@ namespace Isis {
   }
 
 
+ /**
+  * Checks to see if the surface point source file has been set.
+  *
+  * @return bool True if the surface point source file has been set.
+  */
+  bool ControlPoint::HasAprioriSurfacePointSourceFile() const {
+    return !( aprioriSurfacePointSourceFile.isEmpty() || aprioriSurfacePointSourceFile.isNull() );
+  }
+
+
   QString ControlPoint::GetAprioriSurfacePointSourceFile() const {
     return aprioriSurfacePointSourceFile;
   }
@@ -1736,8 +1624,9 @@ namespace Isis {
     int size = 0;
     QList<QString> keys = measures->keys();
     for (int cm = 0; cm < keys.size(); cm++) {
-      if (!(*measures)[keys[cm]]->IsIgnored())
+      if (!(*measures)[keys[cm]]->IsIgnored()) {
         size++;
+      }
     }
     return size;
   }
@@ -1752,8 +1641,9 @@ namespace Isis {
     int size = 0;
     QList<QString> keys = measures->keys();
     for (int cm = 0; cm < keys.size(); cm++) {
-      if ((*measures)[keys[cm]]->IsEditLocked())
+      if ((*measures)[keys[cm]]->IsEditLocked()) {
         size++;
+      }
     }
     return size;
   }
@@ -1783,7 +1673,7 @@ namespace Isis {
    * @returns The cube serial number of the reference measure
    */
   QString ControlPoint::GetReferenceSN() const {
-    if (referenceMeasure == NULL) {
+    if (!HasRefMeasure()) {
       QString msg = "There is no reference measure set in the ControlPoint [" +
           GetId() + "]";
       throw IException(IException::Programmer, msg, _FILEINFO_);
@@ -1837,7 +1727,7 @@ namespace Isis {
    * measure.
    */
   int ControlPoint::IndexOfRefMeasure() const {
-    if (!referenceMeasure) {
+    if (!HasRefMeasure()) {
       QString msg = "There is no reference measure for point [" + id + "]."
           "  This also means of course that the point is empty!";
       throw IException(IException::Programmer, msg, _FILEINFO_);
@@ -1865,8 +1755,9 @@ namespace Isis {
     double(ControlMeasure::*statFunc)() const) const {
     Statistics stats;
     foreach(ControlMeasure * cm, *measures) {
-      if (!cm->IsIgnored())
+      if (!cm->IsIgnored()) {
         stats.AddData((cm->*statFunc)());
+      }
     }
 
     return stats;
@@ -1876,8 +1767,9 @@ namespace Isis {
   Statistics ControlPoint::GetStatistic(long dataType) const {
     Statistics stats;
     foreach(ControlMeasure * cm, *measures) {
-      if (!cm->IsIgnored())
+      if (!cm->IsIgnored()) {
         stats.AddData(cm->GetLogData(dataType).GetNumericalValue());
+      }
     }
 
     return stats;
@@ -1895,8 +1787,9 @@ namespace Isis {
     QList< ControlMeasure * > orderedMeasures;
     for (int i = 0; i < cubeSerials->size(); i++) {
       ControlMeasure *measure = measures->value((*cubeSerials)[i]);
-      if (!excludeIgnored || !measure->IsIgnored())
+      if (!excludeIgnored || !measure->IsIgnored()) {
         orderedMeasures.append(measures->value((*cubeSerials)[i]));
+      }
     }
     return orderedMeasures;
   }
@@ -2038,8 +1931,9 @@ namespace Isis {
         ControlMeasure *newMeasure = new ControlMeasure;
         *newMeasure = *i.value();
         AddMeasure(newMeasure);
-        if (other.referenceMeasure == i.value())
+        if (other.referenceMeasure == i.value()) {
           SetRefMeasure(newMeasure);
+        }
       }
 
       id             = other.id;
@@ -2107,18 +2001,21 @@ namespace Isis {
    */
   double ControlPoint::GetSampleResidualRms() const {
       int nmeasures = measures->size();
-      if( nmeasures <= 0 )
+      if ( nmeasures <= 0 ) {
           return 0.0;
+      }
 
       Statistics stats;
 
       for( int i = 0; i < nmeasures; i++) {
           const ControlMeasure* m = GetMeasure(i);
-          if( !m )
+          if ( !m ) {
               continue;
+          }
 
-          if( !m->IsIgnored() || m->IsRejected() )
+          if ( !m->IsIgnored() || m->IsRejected() ) {
               continue;
+          }
 
           stats.AddData(m->GetSampleResidual());
       }
@@ -2135,18 +2032,21 @@ namespace Isis {
    */
   double ControlPoint::GetLineResidualRms() const {
       int nmeasures = measures->size();
-      if( nmeasures <= 0 )
+      if ( nmeasures <= 0 ) {
           return 0.0;
+      }
 
       Statistics stats;
 
       for( int i = 0; i < nmeasures; i++) {
           const ControlMeasure* m = GetMeasure(i);
-          if( !m )
+          if ( !m ) {
               continue;
+          }
 
-          if( !m->IsIgnored() || m->IsRejected() )
+          if ( !m->IsIgnored() || m->IsRejected() ) {
               continue;
+          }
 
           stats.AddData(m->GetLineResidual());
       }
@@ -2163,18 +2063,21 @@ namespace Isis {
    */
   double ControlPoint::GetResidualRms() const {
       int nmeasures = measures->size();
-      if( nmeasures <= 0 )
+      if ( nmeasures <= 0 ) {
           return 0.0;
+      }
 
       Statistics stats;
 
       for( int i = 0; i < nmeasures; i++) {
           const ControlMeasure* m = GetMeasure(i);
-          if( !m )
+          if ( !m ) {
               continue;
+          }
 
-          if( m->IsIgnored() || m->IsRejected() )
+          if ( m->IsIgnored() || m->IsRejected() ) {
               continue;
+          }
 
           stats.AddData(m->GetSampleResidual());
           stats.AddData(m->GetLineResidual());
@@ -2189,13 +2092,15 @@ namespace Isis {
    */
   void ControlPoint::ClearJigsawRejected() {
     int nmeasures = measures->size();
-    if( nmeasures <= 0 )
+    if ( nmeasures <= 0 ) {
         return;
+    }
 
     for( int i = 0; i < nmeasures; i++) {
       ControlMeasure* m = GetMeasure(i);
-      if( !m )
+      if ( !m ) {
         continue;
+      }
 
       m->SetRejected(false);
     }
@@ -2203,145 +2108,4 @@ namespace Isis {
     SetRejected(false);
   }
 
-
-  ControlPointFileEntryV0002 ControlPoint::ToFileEntry() const {
-    ControlPointFileEntryV0002 fileEntry;
-
-    fileEntry.set_id(GetId().toLatin1().data());
-    switch (GetType()) {
-      case ControlPoint::Free:
-        fileEntry.set_type(ControlPointFileEntryV0002::Free);
-        break;
-      case ControlPoint::Constrained:
-        fileEntry.set_type(ControlPointFileEntryV0002::Constrained);
-        break;
-      case ControlPoint::Fixed:
-        fileEntry.set_type(ControlPointFileEntryV0002::Fixed);
-        break;
-    }
-
-    if (!GetChooserName().isEmpty()) {
-      fileEntry.set_choosername(GetChooserName().toLatin1().data());
-    }
-    if (!GetDateTime().isEmpty()) {
-      fileEntry.set_datetime(GetDateTime().toLatin1().data());
-    }
-    if (IsEditLocked())
-      fileEntry.set_editlock(true);
-    if (IsIgnored())
-      fileEntry.set_ignore(true);
-    if (IsRejected())
-      fileEntry.set_jigsawrejected(true);
-
-    if (referenceMeasure && referenceExplicitlySet) {
-      fileEntry.set_referenceindex(IndexOfRefMeasure());
-    }
-
-    switch (GetAprioriSurfacePointSource()) {
-      case ControlPoint::SurfacePointSource::None:
-        break;
-      case ControlPoint::SurfacePointSource::User:
-        fileEntry.set_apriorisurfpointsource(ControlPointFileEntryV0002_AprioriSource_User);
-        break;
-      case ControlPoint::SurfacePointSource::AverageOfMeasures:
-        fileEntry.set_apriorisurfpointsource(ControlPointFileEntryV0002_AprioriSource_AverageOfMeasures);
-        break;
-      case ControlPoint::SurfacePointSource::Reference:
-        fileEntry.set_apriorisurfpointsource(ControlPointFileEntryV0002_AprioriSource_Reference);
-        break;
-      case ControlPoint::SurfacePointSource::Basemap:
-        fileEntry.set_apriorisurfpointsource(ControlPointFileEntryV0002_AprioriSource_Basemap);
-        break;
-      case ControlPoint::SurfacePointSource::BundleSolution:
-        fileEntry.set_apriorisurfpointsource(ControlPointFileEntryV0002_AprioriSource_BundleSolution);
-        break;
-      default:
-        break;
-    }
-    if (!GetAprioriSurfacePointSourceFile().isEmpty()) {
-      fileEntry.set_apriorisurfpointsourcefile(GetAprioriSurfacePointSourceFile().toLatin1().data());
-    }
-
-    switch (GetAprioriRadiusSource()) {
-      case ControlPoint::RadiusSource::None:
-        break;
-      case ControlPoint::RadiusSource::User:
-        fileEntry.set_aprioriradiussource(ControlPointFileEntryV0002_AprioriSource_User);
-        break;
-      case ControlPoint::RadiusSource::AverageOfMeasures:
-        fileEntry.set_aprioriradiussource(ControlPointFileEntryV0002_AprioriSource_AverageOfMeasures);
-        break;
-      case ControlPoint::RadiusSource::Ellipsoid:
-        fileEntry.set_aprioriradiussource(ControlPointFileEntryV0002_AprioriSource_Ellipsoid);
-        break;
-      case ControlPoint::RadiusSource::DEM:
-        fileEntry.set_aprioriradiussource(ControlPointFileEntryV0002_AprioriSource_DEM);
-        break;
-      case ControlPoint::RadiusSource::BundleSolution:
-        fileEntry.set_aprioriradiussource(ControlPointFileEntryV0002_AprioriSource_BundleSolution);
-        break;
-      default:
-        break;
-    }
-
-    if (!GetAprioriRadiusSourceFile().isEmpty()) {
-      fileEntry.set_aprioriradiussourcefile(GetAprioriRadiusSourceFile().toLatin1().data());
-    }
-
-    if (GetAprioriSurfacePoint().Valid()) {
-      SurfacePoint apriori = GetAprioriSurfacePoint();
-      fileEntry.set_apriorix(apriori.GetX().meters());
-      fileEntry.set_aprioriy(apriori.GetY().meters());
-      fileEntry.set_aprioriz(apriori.GetZ().meters());
-
-      symmetric_matrix< double, upper > covar = apriori.GetRectangularMatrix();
-      if (covar(0, 0) != 0. || covar(0, 1) != 0. ||
-          covar(0, 2) != 0. || covar(1, 1) != 0. ||
-          covar(1, 2) != 0. || covar(2, 2) != 0.) {
-        fileEntry.add_aprioricovar(covar(0, 0));
-        fileEntry.add_aprioricovar(covar(0, 1));
-        fileEntry.add_aprioricovar(covar(0, 2));
-        fileEntry.add_aprioricovar(covar(1, 1));
-        fileEntry.add_aprioricovar(covar(1, 2));
-        fileEntry.add_aprioricovar(covar(2, 2));
-      }
-      if (constraintStatus.test(LatitudeConstrained))
-//      if (!IsLatitudeConstrained())
-        fileEntry.set_latitudeconstrained(true);
-      if (constraintStatus.test(LongitudeConstrained))
-//      if (!IsLongitudeConstrained())
-        fileEntry.set_longitudeconstrained(true);
-      if (constraintStatus.test(RadiusConstrained))
-//      if (!IsRadiusConstrained())
-        fileEntry.set_radiusconstrained(true);
-    }
-
-
-    if (GetAdjustedSurfacePoint().Valid()) {
-      SurfacePoint adjusted = GetAdjustedSurfacePoint();
-      fileEntry.set_adjustedx(adjusted.GetX().meters());
-      fileEntry.set_adjustedy(adjusted.GetY().meters());
-      fileEntry.set_adjustedz(adjusted.GetZ().meters());
-
-      symmetric_matrix< double, upper > covar = adjusted.GetRectangularMatrix();
-      if (covar(0, 0) != 0. || covar(0, 1) != 0. ||
-          covar(0, 2) != 0. || covar(1, 1) != 0. ||
-          covar(1, 2) != 0. || covar(2, 2) != 0.) {
-        fileEntry.add_adjustedcovar(covar(0, 0));
-        fileEntry.add_adjustedcovar(covar(0, 1));
-        fileEntry.add_adjustedcovar(covar(0, 2));
-        fileEntry.add_adjustedcovar(covar(1, 1));
-        fileEntry.add_adjustedcovar(covar(1, 2));
-        fileEntry.add_adjustedcovar(covar(2, 2));
-      }
-    }
-
-    //  Process all measures in the point
-    for (int i = 0; i < cubeSerials->size(); i++) {
-      *fileEntry.add_measures() =
-        (*measures)[cubeSerials->at(i)]->ToProtocolBuffer();
-    }
-
-    return fileEntry;
-  }
 }
diff --git a/isis/src/control/objs/ControlPoint/ControlPoint.h b/isis/src/control/objs/ControlPoint/ControlPoint.h
index f93641c12f7d2ced24ec5772b305bd6747b98c06..f2c00adb101cb1a14eece562084ed2a76e87dc1a 100644
--- a/isis/src/control/objs/ControlPoint/ControlPoint.h
+++ b/isis/src/control/objs/ControlPoint/ControlPoint.h
@@ -312,7 +312,7 @@ namespace Isis {
    *                           and fixed problems (which caused ASSERT fails) in
    *                           the copy constructor.
    *   @history 2011-10-06 Steven Lambright - Radii provided in the protocol
-   *                           buffer constructor can now be invalid. 
+   *                           buffer constructor can now be invalid.
    *   @history 2011-10-07 Steven Lambright and Stuart Sides - Fixed bug in the
    *                           constructor given a protocol buffer. This caused
    *                           unpredictable reference measure behaviour
@@ -320,21 +320,29 @@ namespace Isis {
    *   @history 2011-10-14 Ken Edmundson Added method ClearJigsawRejected(); to
    *                           set all measure and point JigsawRejected flags to
    *                           false prior to bundle adjustment.
-   *   @history 2012-03-31 Debbie A. Cook Programmer note:  Revised 
-   *                           ComputeResiduals to call 
+   *   @history 2012-03-31 Debbie A. Cook Programmer note:  Revised
+   *                           ComputeResiduals to call
    *                           ComputeResidualsMillimeters and avoid duplication
-   *                           of code.  Also revised 
+   *                           of code.  Also revised
    *                           ComputeResidualsMillimeters to make the radar
    *                           case handled the same as other instruments.
-   *   @history 2013-11-12 Ken Edmundson Programmer note:  Revised 
+   *   @history 2013-11-12 Ken Edmundson Programmer note:  Revised
    *                           ComputeApriori such that initial coordinates are
    *                           computed for "Free" points that have constrained
    *                           coordinates. References #1653.
    *   @history 2013-11-13 Kimberly Oyama - Added missing member variables to == operator and
    *                           made sure the comparisons are being done correctly. Fixes #1014.
    *   @history 2015-11-05 Kris Becker - invalid flag was not properly
-   *                           initialized in ControlPointFileEntryV0002 
-   *                           constructor (Merged by Kristin Berry. Fixes #2392) 
+   *                           initialized in ControlPointFileEntryV0002
+   *                           constructor (Merged by Kristin Berry. Fixes #2392)
+   *   @history 2017-12-18 Kristin Berry - Added convenience methods:
+   *                            HasAprioriSurfacePointSourceFile(), HasAprioriRadiusSourceFile(),
+   *                            HasRefMeasure().
+   *   @history 2017-12-21 Adam Goins - Removed redundant code following ControlNetVersioner
+   *                           refactor.
+   *   @history 2018-01-05 Adam Goins - Added HasDateTime() and HasChooserName() methods to allow
+   *                           to allow the value of these variables to be read without being
+   *                           overriden if they're empty. (Getters override if they're empty).
    */
   class ControlPoint : public QObject {
 
@@ -439,9 +447,6 @@ namespace Isis {
       ControlPoint();
       ControlPoint(const ControlPoint &);
       ControlPoint(const QString &id);
-      ControlPoint(const ControlPointFileEntryV0002 &fileEntry,
-          const Distance &majorRad, const Distance &minorRad,
-          const Distance &polarRad);
       ~ControlPoint();
 
       ControlNet *Parent() { return parentNetwork; }
@@ -460,6 +465,7 @@ namespace Isis {
       const ControlMeasure *GetMeasure(int index) const;
       ControlMeasure *GetMeasure(int index);
 
+      bool HasRefMeasure() const;
       const ControlMeasure *GetRefMeasure() const;
       ControlMeasure *GetRefMeasure();
 
@@ -489,6 +495,7 @@ namespace Isis {
       Status ComputeResiduals_Millimeters();
 
       SurfacePoint GetAdjustedSurfacePoint() const;
+
       SurfacePoint GetBestSurfacePoint() const;
       QString GetChooserName() const;
       QString GetDateTime() const;
@@ -499,8 +506,8 @@ namespace Isis {
       bool IsValid() const;
       bool IsInvalid() const;
       bool IsFixed() const;
-
       bool HasAprioriCoordinates();
+
       bool IsConstrained();
       bool IsLatitudeConstrained();
       bool IsLongitudeConstrained();
@@ -519,17 +526,21 @@ namespace Isis {
       static QString SurfacePointSourceToString(SurfacePointSource::Source source);
       static SurfacePointSource::Source StringToSurfacePointSource(QString str);
       QString GetSurfacePointSourceString() const;
-
       SurfacePoint GetAprioriSurfacePoint() const;
+
       RadiusSource::Source GetAprioriRadiusSource() const;
+      bool HasAprioriRadiusSourceFile() const;
       QString GetAprioriRadiusSourceFile() const;
       SurfacePointSource::Source GetAprioriSurfacePointSource() const;
+      bool HasAprioriSurfacePointSourceFile() const;
       QString GetAprioriSurfacePointSourceFile() const;
 
       int GetNumMeasures() const;
       int GetNumValidMeasures() const;
       int GetNumLockedMeasures() const;
       bool HasSerialNumber(QString serialNumber) const;
+      bool HasChooserName() const;
+      bool HasDateTime() const;
       int IndexOf(ControlMeasure *, bool throws = true) const;
       int IndexOf(QString sn, bool throws = true) const;
       int IndexOfRefMeasure() const;
@@ -561,8 +572,6 @@ namespace Isis {
       double GetResidualRms() const;
       void ClearJigsawRejected();
 
-      ControlPointFileEntryV0002 ToFileEntry() const;
-
     private:
       void SetExplicitReference(ControlMeasure *measure);
       void ValidateMeasure(QString serialNumber) const;
diff --git a/isis/src/control/objs/ControlPoint/ControlPoint.truth b/isis/src/control/objs/ControlPoint/ControlPoint.truth
index c2e1c36bde8333a850d10d264e4dfa71e28363aa..d1afe89eb26da325609b4552ba1a6099134bad72 100644
--- a/isis/src/control/objs/ControlPoint/ControlPoint.truth
+++ b/isis/src/control/objs/ControlPoint/ControlPoint.truth
@@ -1,5 +1,9 @@
 ControlPoint unitTest
 Adding ControlMeasure with cube serial number [Test1]
+
+Testing point has ChooserName: TRUE
+Testing point has DateTime:    TRUE
+
 Printing point:
 Object = ControlNetwork
   NetworkId    = Identifier
@@ -8,7 +12,7 @@ Object = ControlNetwork
   Created      = Yesterday
   LastModified = Yesterday
   Description  = Null
-  Version      = 3
+  Version      = 5
 
   Object = ControlPoint
     PointType                = Fixed
@@ -70,6 +74,10 @@ Done printing point.
 Adding ControlMeasure with cube serial number [Test2]
 Testing Edit Locking... ok!
 
+
+Testing point has ChooserName: TRUE
+Testing point has DateTime:    TRUE
+
 Printing point:
 Object = ControlNetwork
   NetworkId    = Identifier
@@ -78,7 +86,7 @@ Object = ControlNetwork
   Created      = Yesterday
   LastModified = Yesterday
   Description  = Null
-  Version      = 3
+  Version      = 5
 
   Object = ControlPoint
     PointType                = Fixed
@@ -159,6 +167,10 @@ Testing copy constructor...
 	 Also testing == operator
 		 original == its self (yes)? 1
 		 original == copy (no)? 0
+
+Testing point has ChooserName: TRUE
+Testing point has DateTime:    TRUE
+
 Printing point:
 Object = ControlNetwork
   NetworkId    = Identifier
@@ -167,7 +179,7 @@ Object = ControlNetwork
   Created      = Yesterday
   LastModified = Yesterday
   Description  = Null
-  Version      = 3
+  Version      = 5
 
   Object = ControlPoint
     PointType                = Fixed
@@ -245,6 +257,10 @@ End
 Done printing point.
 
 Testing assignment operator...
+
+Testing point has ChooserName: TRUE
+Testing point has DateTime:    TRUE
+
 Printing point:
 Object = ControlNetwork
   NetworkId    = Identifier
@@ -253,7 +269,7 @@ Object = ControlNetwork
   Created      = Yesterday
   LastModified = Yesterday
   Description  = Null
-  Version      = 3
+  Version      = 5
 
   Object = ControlPoint
     PointType                = Fixed
@@ -330,6 +346,10 @@ Done printing point.
 
 Deleting ControlMeasure with cube serial number [Test1]
 Measure type: Candidate
+
+Testing point has ChooserName: TRUE
+Testing point has DateTime:    TRUE
+
 Printing point:
 Object = ControlNetwork
   NetworkId    = Identifier
@@ -338,7 +358,7 @@ Object = ControlNetwork
   Created      = Yesterday
   LastModified = Yesterday
   Description  = Null
-  Version      = 3
+  Version      = 5
 
   Object = ControlPoint
     PointType                = Fixed
diff --git a/isis/src/control/objs/ControlPoint/unitTest.cpp b/isis/src/control/objs/ControlPoint/unitTest.cpp
index 6e6d983240f013ecdbdc414d5e8fa343dddf67c7..9a108b0a10f6fd94323ad9a0e9b41d78e3ef1acc 100644
--- a/isis/src/control/objs/ControlPoint/unitTest.cpp
+++ b/isis/src/control/objs/ControlPoint/unitTest.cpp
@@ -1,4 +1,3 @@
-#include <string>
 #include <iostream>
 
 #include <boost/numeric/ublas/symmetric.hpp>
@@ -29,14 +28,17 @@ void printPoint(ControlPoint &p);
   * @history 2011-06-07 Debbie A. Cook and Tracie Sucharski - Modified point types
   *                         Ground ------> Fixed
   *                         Tie----------> Free
-  * @history 2015-02-17  Andrew Stebenne, changed a reference to a local filesystem to a dummy file 
+  * @history 2015-02-17  Andrew Stebenne, changed a reference to a local filesystem to a dummy file
   *                         (dummy.cub) to make it clearer that the .cub file being referenced
   *                         wasn't necessary.
+  * @history 2017-12-21 Kristin Berry - Added tests for newly added accessor methods.
+  * @history 2018-01-04 Adam Goins - Replaced QDebug with std::cout. Removed commented out code for
+  *                         Removed accessor methods.
   */
 int main() {
   Preference::Preferences(true);
 
-  cout << "ControlPoint unitTest" << endl;
+  std::cout << "ControlPoint unitTest" << std::endl;
 
   ControlPoint cp("C151");
 
@@ -71,7 +73,7 @@ int main() {
   cm1->SetChooserName("seedgrid");
   cm1->SetDateTime("2005-05-03T00:00:00");
 
-  cout << "Adding ControlMeasure with cube serial number [" << cm1->GetCubeSerialNumber() << "]" << endl; // Cube Serial Number "Test1"
+  std::cout << "Adding ControlMeasure with cube serial number [" << cm1->GetCubeSerialNumber() << "]" << std::endl; // Cube Serial Number "Test1"
   cp.Add(cm1);
 
   printPoint(cp);
@@ -89,52 +91,55 @@ int main() {
   cm2->SetResidual(-2.0, 2.0);
   cm2->SetChooserName("seedgrid");
   cm2->SetDateTime("2005-05-03T00:00:00");
-  cout << "Adding ControlMeasure with cube serial number [" << cm2->GetCubeSerialNumber() << "]" << endl; // Cube Serial Number "Test2"
+  std::cout << "Adding ControlMeasure with cube serial number [" << cm2->GetCubeSerialNumber() << "]" << std::endl; // Cube Serial Number "Test2"
   cp.Add(cm2);
-  cout << "Testing Edit Locking... ";
+  std::cout << "Testing Edit Locking... ";
   cp.SetRefMeasure(cm2);
   if (cp.GetRefMeasure() != cm2) {
     cp.SetEditLock(false);
     cp.SetRefMeasure(cm2);
-    if (cp.GetRefMeasure() == cm2)
-      cout << "ok!\n";
-    else
-      cout << "Failed!\n";
+    if (cp.GetRefMeasure() == cm2) {
+      std::cout << "ok!" << std::endl;
+    }
+    else {
+      std::cout << "Failed!" << std::endl;
+    }
   }
   else {
-    cout << "Failed!\n";
+    std::cout << "Failed!" << std::endl;
   }
-  cout << "\n";
+  std::cout << std::endl;
   cp.SetEditLock(false);
   cp.SetRefMeasure(cm2);
   cp.SetEditLock(true);
 
   printPoint(cp);
 
-  cout << "Testing copy constructor...\n";
+  std::cout << "Testing copy constructor..." << std::endl;
   ControlPoint copy(cp);
-  cout << "\t Also testing == operator" << endl;
+  std::cout << "\t Also testing == operator" << std::endl;
   bool equal = (cp == cp);
-  cout << "\t\t original == its self (yes)? " << equal << endl;
+  std::cout << "\t\t original == its self (yes)? " << equal << std::endl;
   copy.SetEditLock(false);
   copy.SetRefMeasure(0);
   equal = (cp == copy);
-  cout << "\t\t original == copy (no)? " << equal << endl;
+  std::cout << "\t\t original == copy (no)? " << equal << std::endl;
   printPoint(cp);
-  cout << "Testing assignment operator...\n";
+  std::cout << "Testing assignment operator..." << std::endl;
   ControlPoint assignment = copy;
   printPoint(assignment);
 
   // Should be successful
-  cout << "Deleting ControlMeasure with cube serial number [" << cp.getCubeSerialNumbers().at(0).toStdString() << "]" << endl;
-  cout << "Measure type: " << ControlMeasure::MeasureTypeToString(cp.GetMeasure(0)->GetType()) << endl;
+  std::cout << "Deleting ControlMeasure with cube serial number [" << cp.getCubeSerialNumbers().at(0).toLatin1().data() << "]" << std::endl;
+  std::cout << "Measure type: " << ControlMeasure::MeasureTypeToString(cp.GetMeasure(0)->GetType()) << std::endl;
   cp.Delete(0);
   printPoint(cp);
-//  cout << "ReferenceIndex = " << cp.GetReferenceIndex() << endl;
+//  std::cout << "ReferenceIndex = " << cp.GetReferenceIndex();
 
-//  cout << "ReferenceIndex = " << cp.GetReferenceIndex() << endl;
+//  std::cout << "ReferenceIndex = " << cp.GetReferenceIndex();
 
-  cout << endl << "Test adding control measures with identical serial numbers ..." << endl;
+  std::cout << std::endl;
+  std::cout << "Test adding control measures with identical serial numbers ..." << std::endl;
   try {
     cp.Add(cm2);
   }
@@ -142,27 +147,29 @@ int main() {
     e.print();
   }
 
-  cout << endl << "Test SetAdjustedSurfacePoint ... " << endl;
+  std::cout << std::endl;
+  std::cout << "Test SetAdjustedSurfacePoint ... " << std::endl;
   SurfacePoint surfPt(cp.GetAdjustedSurfacePoint());
-  cout << "X = " << surfPt.GetX().meters() << endl;
-  cout << "Y = " << surfPt.GetY().meters() << endl;
-  cout << "Z = " << surfPt.GetZ().meters() << endl;
-  cout << "Latitude = " << surfPt.GetLatitude().degrees() << endl;
-  cout << "Longitude = " << surfPt.GetLongitude().degrees() << endl;
-  cout << "Radius = " << surfPt.GetLocalRadius().meters() << endl;
+  std::cout << "X = " << surfPt.GetX().meters() << std::endl;
+  std::cout << "Y = " << surfPt.GetY().meters() << std::endl;
+  std::cout << "Z = " << surfPt.GetZ().meters() << std::endl;
+  std::cout << "Latitude = " << surfPt.GetLatitude().degrees() << std::endl;
+  std::cout << "Longitude = " << surfPt.GetLongitude().degrees() << std::endl;
+  std::cout << "Radius = " << surfPt.GetLocalRadius().meters() << std::endl;
   surfPt.SetSpherical(Latitude(32, Angle::Degrees),
       Longitude(120, Angle::Degrees),
       Distance(1000, Distance::Meters));
   cp.SetAdjustedSurfacePoint(surfPt);
   surfPt = cp.GetAdjustedSurfacePoint();
-  cout << "X = " << surfPt.GetX().meters() << endl;
-  cout << "Y = " << surfPt.GetY().meters() << endl;
-  cout << "Z = " << surfPt.GetZ().meters() << endl;
-  cout << "Latitude = " << surfPt.GetLatitude().degrees() << endl;
-  cout << "Longitude = " << surfPt.GetLongitude().degrees() << endl;
-  cout << "Radius = " << surfPt.GetLocalRadius().meters() << endl;
+  std::cout << "X = " << surfPt.GetX().meters() << std::endl;
+  std::cout << "Y = " << surfPt.GetY().meters() << std::endl;
+  std::cout << "Z = " << surfPt.GetZ().meters() << std::endl;
+  std::cout << "Latitude = " << surfPt.GetLatitude().degrees() << std::endl;
+  std::cout << "Longitude = " << surfPt.GetLongitude().degrees() << std::endl;
+  std::cout << "Radius = " << surfPt.GetLocalRadius().meters() << std::endl;
 
-  cout << endl << "Test conversions for apriori/adjusted covariance matrices ... " << endl;
+  std::cout << std::endl;
+  std::cout << "Test conversions for apriori/adjusted covariance matrices ... " << std::endl;
 
   symmetric_matrix<double, upper> covar;
   covar.resize(3);
@@ -182,19 +189,19 @@ int main() {
 
   //c.SetAprioriCovariance();
   point = cp.GetAprioriSurfacePoint();
-  cout << "Apriori Sigma X = " << point.GetXSigma().meters() << endl;
-  cout << "Apriori Sigma Y = " << point.GetYSigma().meters() << endl;
-  cout << "Apriori Sigma Z = " << point.GetZSigma().meters() << endl;
+  std::cout << "Apriori Sigma X = " << point.GetXSigma().meters() << std::endl;
+  std::cout << "Apriori Sigma Y = " << point.GetYSigma().meters() << std::endl;
+  std::cout << "Apriori Sigma Z = " << point.GetZSigma().meters() << std::endl;
 
   point = cp.GetAdjustedSurfacePoint();
-  cout << "Adjusted Sigma X = " << point.GetXSigma().meters() << endl;
-  cout << "Adjusted Sigma Y = " << point.GetYSigma().meters() << endl;
-  cout << "Adjusted Sigma Z = " << point.GetZSigma().meters() << endl;
+  std::cout << "Adjusted Sigma X = " << point.GetXSigma().meters() << std::endl;
+  std::cout << "Adjusted Sigma Y = " << point.GetYSigma().meters() << std::endl;
+  std::cout << "Adjusted Sigma Z = " << point.GetZSigma().meters() << std::endl;
 
-  cout << endl;
+  std::cout << std::endl;
 
-  cout << "Testing IsReferenceExplicit..." << endl;
-  cout << "cp:                    " << cp.IsReferenceExplicit() << endl;
+  std::cout << "Testing IsReferenceExplicit..." << std::endl;
+  std::cout << "cp:                    " << cp.IsReferenceExplicit() << std::endl;
 
   ControlMeasure *cm3 = new ControlMeasure;
   cm3->SetCubeSerialNumber("Test1");
@@ -223,16 +230,16 @@ int main() {
   cm4->SetDateTime("2005-05-03T00:00:00");
 
   ControlPoint newCp;
-  cout << "newCp:                 " << newCp.IsReferenceExplicit() << endl;
+  std::cout << "newCp:                 " << newCp.IsReferenceExplicit() << std::endl;
   newCp.Add(cm3);
-  cout << "newCp with implicit:   " << newCp.IsReferenceExplicit() << endl;
+  std::cout << "newCp with implicit:   " << newCp.IsReferenceExplicit() << std::endl;
   newCp.Add(cm4);
   newCp.SetRefMeasure(cm3);
-  cout << "newCp with explicit:   " << newCp.IsReferenceExplicit() << endl;
+  std::cout << "newCp with explicit:   " << newCp.IsReferenceExplicit() << std::endl;
   newCp.Delete(cm3);
-  cout << "newCp reverted to implicit:   " << newCp.IsReferenceExplicit() << endl;
+  std::cout << "newCp reverted to implicit:   " << newCp.IsReferenceExplicit() << std::endl;
 
-  cout << "\ntesting getMeasures method...\n";
+  std::cout << "\ntesting getMeasures method..." << std::endl;
   ControlMeasure * alpha = new ControlMeasure;
   alpha->SetCubeSerialNumber("alpha");
   ControlMeasure * beta = new ControlMeasure;
@@ -241,19 +248,21 @@ int main() {
   getMeasuresTestPoint.Add(alpha);
   getMeasuresTestPoint.Add(beta);
   QList< ControlMeasure * > measures = getMeasuresTestPoint.getMeasures();
-  foreach (ControlMeasure * measure, measures)
-    cout << measure->GetCubeSerialNumber() << "\n";
+  foreach (ControlMeasure * measure, measures) {
+    std::cout << measure->GetCubeSerialNumber() << std::endl;
+  }
   beta->SetIgnored(true);
   measures = getMeasuresTestPoint.getMeasures(true);
-  foreach (ControlMeasure * measure, measures)
-    cout << measure->GetCubeSerialNumber() << "\n";
+  foreach (ControlMeasure * measure, measures) {
+    std::cout << measure->GetCubeSerialNumber() << std::endl;
+  }
 
-  cout << "\ntesting error handling for StringToPointType...\n";
+  std::cout << "\ntesting error handling for StringToPointType..." << std::endl;
   try {
     ControlPoint::StringToPointType("aoeu");
   }
   catch (IException &e) {
-    cout << "  " << e.toString() << "\n";
+    std::cout << "  " << e.toString() << std::endl;
   }
 }
 
@@ -264,6 +273,23 @@ void printPoint(Isis::ControlPoint &p) {
   p.SetDateTime("2005-05-03T00:00:00");
   p.SetEditLock(wasLocked);
 
+  std::cout << std::endl;
+  std::cout << "Testing point has ChooserName: ";
+  if ( p.HasChooserName() ) {
+    std::cout << "TRUE" << std::endl;
+  }
+  else {
+    std::cout << "FALSE" << std::endl;
+  }
+
+  std::cout << "Testing point has DateTime:    ";
+  if ( p.HasDateTime() ) {
+    std::cout << "TRUE" << std::endl;
+  }
+  else {
+    std::cout << "FALSE" << std::endl;
+  }
+  std::cout << std::endl;
   ControlNet net;
 
   ControlPoint *copyPoint = new ControlPoint(p);
@@ -285,6 +311,7 @@ void printPoint(Isis::ControlPoint &p) {
   net.SetModifiedDate("Yesterday");
   net.Write("./tmp.net", true);
   Pvl tmp("./tmp.net");
-  cout << "Printing point:\n" << tmp << "\nDone printing point." << endl << endl;
+  cout << "Printing point:\n" << tmp << "\nDone printing point." << std::endl;
+  std::cout << std::endl;
   remove("./tmp.net");
 }
diff --git a/isis/src/control/objs/ControlPointList/ControlPointList.h b/isis/src/control/objs/ControlPointList/ControlPointList.h
index 9f34d9ccc9db26af619ba26cfddf7076b8f3efd3..05a71273f84d26236e4d7e7fd38990ac133f5a64 100644
--- a/isis/src/control/objs/ControlPointList/ControlPointList.h
+++ b/isis/src/control/objs/ControlPointList/ControlPointList.h
@@ -23,9 +23,8 @@
  *   http://www.usgs.gov/privacy.html.
  */
 
-#include <string>
-#include <vector>
 #include <QStringList>
+#include <QVector>
 
 #include "Pvl.h"
 
@@ -46,7 +45,9 @@ namespace Isis {
    *
    *   @history 2009-08-11 Sharmila Prasad Original Version
    *   @history 2009-10-04 Steven Lambright Constructor now takes a FileName
-   *     instead of a string.
+   *            instead of a string.
+   *   @history 2017-12-12 Kristin Berry Updated to use QVector and QString instead of std::vector
+   *            and std::string. Fixes #5259.
    */
   class ControlPointList {
     public:
@@ -67,7 +68,7 @@ namespace Isis {
 
       //! holds one to one correspondence with "mqCpList" on
       //! whether the point was valid
-      std::vector<bool> mbFound; 
+      QVector<bool> mbFound; 
   };
 };
 
diff --git a/isis/src/docsys/documents/ControlNetworks/ControlNetworks.xml b/isis/src/docsys/documents/ControlNetworks/ControlNetworks.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5f0cd5ac5b404725fd93cbc154e14328de4327fd
--- /dev/null
+++ b/isis/src/docsys/documents/ControlNetworks/ControlNetworks.xml
@@ -0,0 +1,536 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://isis.astrogeology.usgs.gov/Schemas/Documentation/documentation.xsd">
+  <files>
+
+    <!-- HTML FILE -->
+    <file primary="true">
+      <body>
+
+<!--  This block is used for notes and warnings, modify it or comment it out, do NOT delete it. -->
+<!-- <div style="border: 4px solid red; padding: 5px ; background-color: gold;">
+<div style="font-style: allcaps; font-weight: bold;">Upgrade Notes</div>
+<p>
+2007-07-19
+</p>
+<p>
+If you are upgrading to version 3.1.12, you <em>must</em>
+download the latest ISIS Data Files!!!
+</p>
+<p>
+If you are <em>not</em> upgrading to 3.1.12,
+you must <em>not</em> upgrade the ISIS Data Files!!!
+</p>
+</div>
+-->
+
+	  <h2>Introduction</h2>
+
+        <h3>Control Network</h3>
+        <p>A Control Network in ISIS3 is a structure which holds a network of image correspondances, also known as tie points or control points, which identify common ground points across multiple images of the same body. A Control Network is made up of Control Points (the common tie point) and a Control Point has one or more Control Measures (measurements in image space of the common point in a particular image). There are two file formats for Control Networks in ISIS3 -- a binary google protocol buffer format and a human-readable pvl format. Both contain the same contents and information. This document describes the keywords present in the PVL format for convenience.</p>
+
+	<h2>Control Network</h2>
+        <p>This section describes the keywords associated with the main Control Network object.</p>
+
+<pre style="padding-left:4em;">
+  Object = ControlNetwork
+  NetworkId    = ExampleNetwork1
+  TargetName   = Template
+  UserName     = aexample
+  Created      = 2012-01-04T12:09:57
+  LastModified = 2012-01-04T12:09:57
+  Description  = "Example PvlV0005 ControlNetwork template."
+  Version      = 5
+</pre>
+
+<table class="tableFormattedInformation" align="center">
+  <tr><th>Keyword</th>
+      <th> Required </th>
+      <th> Default </th>
+      <th>Description</th>
+  </tr>
+  <tr><td> <b>NetworkId</b></td>
+      <td>  Yes</td>
+      <td>  No Default</td>
+      <td> A user defined single-word identifier assigned to the control network file. </td>
+      <!--Most programs should copy this from the input cnet with an option to change it if it is entered by the user. If more than one input cnet use the first cnet entered (i.e., cnetmerge) -->
+  </tr>
+  <tr><td>  <b>TargetName</b></td>
+      <td>  Yes</td>
+      <td>  ""</td>
+      <td>  The planetary body to which the control network file applies. This Target Name should appear in all cubes used in the control network. Possible example values are Moon, or Mars.</td>
+<!--Use Cases:
+*cnetmerge should use this to verify the control networks share the same target.
+*cnetadd should use this to verify the control network and images share the same target.
+-->
+      </tr>
+  <tr><td> <b> UserName</b></td>
+      <td>  No</td>
+      <td> No Default</td>
+      <td> Name of the user that created the control network file.</td>
+  </tr>
+  <tr><td> <b> Created </b> </td>
+      <td>  No</td>
+      <td> Set automatically</td>
+      <td> Initial creation date and time of control net file. Once this is set it should not be modified. </td>
+<!--
+''''''Note:'''''' For cnetmerge retain the earliest of the input cnets.
+''''''Note:'''''' Report all input creation dates to the log file. -->
+  </tr>
+  <tr><td> <b> LastModified </b></td>
+      <td>  No</td>
+      <td> None</td>
+      <td> Date and time on which the control net file was last modified. All programs which modify the contents of this network must set this keyword.</td>
+  </tr>
+<!--(Default:  CurrentLocalTime()) QUESTION: Is there truly a default? -->
+  <tr><td> <b> Description</b></td>
+      <td> No </td>
+      <td> None </td>
+      <td>Brief description of the control network file. This is free-form text normally supplied by the person running the application.</td>
+  </tr>
+  <tr><td> <b> Version</b></td>
+      <td> No</td>
+      <td> Set to current version on output.</td>
+      <td> The Version of the Control Network file. The most recent version is 5.</td>
+  </tr>
+  </table>
+
+
+<h2>Control Point</h2>
+<p>   A control point is one or more measurements that identify the same feature or location in different images. This section contains the information describing a Control Point.</p>
+
+<pre style="padding-left:4em;">
+  Object = ControlPoint
+    PointType                = "Fixed    # (Fixed, Constrained, Free)"
+    PointId                  = I00826010RDR_ex_1_ID
+    ChooserName              = aexample
+    DateTime                 = 2012-01-04T17:01:32
+    EditLock                 = True
+    Ignore                   = True
+    AprioriXYZSource         = "User # (None, User, AverageOfMeasures, Reference, Basemap, BundleSolution)"
+    AprioriXYZSourceFile     = /home/temp/xyzSource.cub
+    AprioriRadiusSource      = "User   # (AverageOfMeasures, BundleSolution, Ellipsoid, DEM)"
+    AprioriRadiusSourceFile  = /home/temp/radiusSource.cub
+
+    # AprioriLatitude = 1.1 &lt;degrees&gt;
+    AprioriX                 = 100 &lt;meters&gt;
+
+    # AprioriLongitude = 2.2 &lt;degrees&gt;
+    AprioriY                 = 100 &lt;meters&gt;
+
+    # AprioriRadius = 3.3 &lt;meters&gt;
+    AprioriZ                 = 100 &lt;meters&gt;
+    AprioriCovarianceMatrix  = (1.1, 2.2, 3.3, 4.4, 5.5, 6.6)
+    LatitudeConstrained      = True
+    LongitudeConstrained     = True
+    RadiusConstrained        = True
+
+    # AdjustedLatitude = 1.1 &lt;degrees&gt;
+    AdjustedX                = 100 &lt;meters&gt;
+
+    # AdjustedLongitude = 2.2 &lt;degrees&gt;
+    AdjustedY                = 100 &lt;meters&gt;
+
+    # AdjustedRadius = 3.3 &lt;meters&gt;
+    AdjustedZ                = 100 &lt;meters&gt;
+    AdjustedCovarianceMatrix = (1.1, 2.2, 3.3, 4.4, 5.5, 6.6)
+</pre>
+
+<table class="tableFormattedInformation" align="center">
+  <tr><th>Keyword</th>
+      <th> Required </th>
+      <th> Default </th>
+      <th>Description</th>
+  </tr>
+  <tr><td> <b>PointType</b></td>
+      <td>  Yes</td>
+      <td>  No Default?</td>
+      <td>  <ul>
+		<li><b>Fixed</b> - A Fixed point is a Control Point whose lat/lon is well established and should not be changed. Some people will refer to this as a truth (i.e., ground truth).  <!--A fixed point can be identifed in one or
+          * more cubes.  Historically this point was called a "Ground" point.--></li>
+		<li><b> Constrained</b> - A Constrained point is a Control Point whose lat/lon/radius is somewhat established and should not be changed. </li>
+		<li><b>Free</b> - A Free point is a Control Point that identifies common measurements between two or more cubes. While it could have a lat/lon, it is not necessarily correct and is subject to change.  This is the most common type of control point.  This point type floats freely in a bundle adjustment.</li>
+		</ul>
+<!--
+This type of control point is measured image to image. Each measurement associated with this point has a line and sample coordinate indicating the location of this point on that image.
+
+The coordinates of this type of control point are assumed to have a known accuracy. The bundle adjustment will constrain"Ground" points accordingly.
+-->
+      </td>
+  </tr>
+  <tr><td> <b>PointId</b></td>
+      <td>  Yes </td>
+      <td>  No Default </td>
+      <td>   String to identify an individual Control Point. This is a required keyword for all points and must be unique within a single Control Network. This keyword is often generated automatically by applications which create Control Points.</td>
+  </tr>
+  <tr><td> <b>ChooserName</b></td>
+      <td>  No</td>
+      <td> No Default</td>
+      <td> The name of the user who manually created a point or the name of the application which automatically created a point.</td>
+<!--Use cases:
+*When qnet is used to create a new point, qnet should set this to the user name.
+*When autoseed creates points it should set this to "autoseed".-->
+  </tr>
+  <tr><td> <b>DateTime</b></td>
+      <td>  No </td>
+      <td>  No Default </td>
+      <td> Indicates the date/time a ground Control Point's coordinate was last changed</td>
+  </tr>
+  <tr><td> <b>EditLock</b></td>
+      <td>  No </td>
+      <td>  False </td>
+      <td> Indicator to applications that edit the contents of Control Points that all information about this point (e.g. Latitude, Longitude, Radius) should not be modified. This does not include adding or removing measurements or the contents of existing measurements, as long as those measures are not locked.
+      </td>
+  </tr><!--EditLock=True is 'trump'...this includes the Ignore flag...if an application needs to set the Ignore=True, it cannot and will need to report the problem to the user.
+
+Question: Should Reference measures have EditLock set to True by default when the ControlPoint it is associated with is locked? YES....or if Point-EditLock=TRUE then implicitly the Reference Measure-editlock=TRUE.
+
+('''IMPORTANT NOTE:'''  Implicit EditLock of Reference measure if Point EditLock=True will not work.  ControlMeasure cannot get to ControlPoint EditLock.  The Reference measure EditLock must be set to True if the ControlPoint EditLock=True.)
+
+For applications such as 'cnetadd', when the control Point-EditLock=TRUE, new measures can be still added to the network..BUT, if the AprioriXYZSource=AverageOfMeasures; the a priori xyz values will remain UNchanged because the Point-EditLock=TRUE (most likely not the responsibilty to a measure app like cnetadd anyway).  There might need to be a new app that updates 'ControlPoint' Level information allowing the user to "unlock" points and update a priori xyz values based on current state of measures. -->
+  <tr><td> <b>Ignore</b></td>
+      <td>  No </td>
+      <td>  False </td>
+      <td> Flag (True/False) to indicate whether this Control Point should be Ignored. When a point is ignored, no data within the point should be used by a program unless the program is explicitly working with ignored points.
+      </td>
+  </tr>
+  <tr><td> <b>AprioriXYZSource</b></td>
+      <td>  No </td>
+      <td>  None </td>
+      <td>
+        Set to one of the values below:
+        <ul>
+          <li><b>User</b> - The a priori coordinates for this point were entered by the user.</li>
+          <li><b>AverageOfMeasures</b> - The a priori coordinates for this point were calculated by averaging the  coordinates for all measures (e.g., Average lat/lon or x/y/z for all measures).</li>
+          <li><b>Reference</b> - The a priori coordinates for this point were obtained from the camera associated with the Control Measure marked as "REFERENCE".</li>
+          <li><b>Basemap</b> - The a priori coordinates for this point were obtained from either a controlled mosaic or a single projected image used for a priori coordinates.</li>
+          <li><b>BundleSolution</b> - The a priori coordinates for this point were obtained from a previous run of jigsaw.</li>
+        </ul>
+      </td>
+  </tr>
+  <tr><td> <b>AprioriXYZSourceFile</b></td>
+      <td>  No </td>
+      <td>  "" </td>
+      <td> A string containing the file name of the AprioriLatitude and AprioriLongitude source.   This keyword will only be used if AprioriLatLonSource == Basemap.
+      </td>
+<!--If the AprioriLatLonSource is set to "Reference" set this to the serial number of the reference measurement.
+'''Note:''' If the AprioriCoordinateSourceFile is set to the serial number of the reference measurement and the reference measurement is modified then all a  priori information should be updated.-->
+  </tr>
+  <tr><td><b> AprioriRadiusSource</b></td>
+      <td>  No</td>
+      <td>  Doesn't exist in net</td>
+      <td> Set to one of the values below:
+        <ul>
+          <li><b>User</b> - The a priori radius was hand entered by the user.</li>
+          <li><b>AverageOfMeasures</b> - The a priori radius was calculated as the average radius for all measures.</li>
+          <li><b>Ellipsoid</b> - The a priori radius was calculated using the Naif PCK body radii. The number of radii used depends on the IAU definition of the target body.</li>
+          <li><b>DEM</b> - Digital Elevation Model used for a priori radius.</li>
+          <li><b>BundleSolution</b> - Radius output from a previous run of jigsaw.</li>
+        </ul>
+      </td>
+  </tr>
+  <tr><td><b> AprioriRadiusSourceFile</b></td>
+      <td>  No</td>
+      <td>  ""</td>
+      <td> A string containing the file name of the AprioriRadius source.
+        <br /> If AprioriiRadiusSource = Ellipsoid, this keyword will be set to the Naif PCK file.
+        <br /> If AprioriRadiusSource = DEM, this keyword will be set to the file name of the DEM.
+      </td>
+  </tr>
+  <tr><td><b> AprioriX</b></td>
+      <td>  No</td>
+      <td>  False </td>
+      <td> Internal storage of the '''initial''' position of the point on the target. Always stored in body fixed x,y,z coordinates.
+      </td>
+  </tr>
+  <tr><td> <b>AprioriY</b></td>
+      <td>  No</td>
+      <td>  False</td>
+      <td> Internal storage of the '''initial''' position of the point on the target. Always stored in body fixed x,y,z coordinates.
+      </td>
+  </tr>
+  <tr><td> <b>AprioriZ</b></td>
+      <td>  No </td>
+      <td>  False </td>
+      <td> Internal storage of the '''initial''' position of the point on the target. Always stored in body fixed x,y,z coordinates.
+      </td>
+<!--When this information is presented to the person running an application, it should be displayed in appropriate units.
+
+If any a priori coordinate is present without a corresponding a priori sigma, it will be ignored by bundle adjustment applications, and the a priori information for that coordinate will be recomputed during the bundle adjustment.  Any a priori coordinate with a valid value and a valid corresponding sigma, will be used as the a priori coordinate value in the bundle adjustment as is and not recomputed.  For example, a tie point can have a valid AprioriiZ value entered and a valid AprioriSigmaZ without either the X or Y coordinates set.  The bundle adjustment will compute AprioriX and AprioriY values, and their corresponding sigmas, but use the AprioriZ and AprioriSigmaZ from the control net.   Additionally the use of the a priori values in a bundle adjustment is determined by the presence of the constraint flags (LatitudeConstrained, LongitudeConstrained, RadiusConstrained, XConstrained, YConstrained, and ZConstrained). If the constraint flag is true for a particular a priori values the constraint will be applied during a bundle adjustment, however if the constraint flag is false, the constraint will not be used in the bundle adjustment. This allows individual a priori sigma values to be turned off and on without loosing the values.
+-->
+  </tr>
+  <tr><td> <b>AprioriSigmaX</b></td>
+      <td>  No </td>
+      <td>  None </td>
+      <td> Pre-adjustment standard deviation of XXXXXXX. An indicator of accuracy that may be used in the weighting of the XXXXXX point coordinate in the bundle adjustment. May originate from a variety of sources; for example a base-map, a previous bundle adjustment, or from the assumed or estimated quality of a sensor measurement such as GPS (in the case of terrestrial mapping) or lidar. Or for other planets accuracy of the MOLA solution. Units are meters.
+      </td>
+  </tr>
+  <tr><td> <b>AprioriSigmaY</b></td>
+      <td>  No </td>
+      <td>  None </td>
+      <td> Pre-adjustment standard deviation of XXXXXXX. An indicator of accuracy that may be used in the weighting of the XXXXXX point coordinate in the bundle adjustment. May originate from a variety of sources; for example a base-map, a previous bundle adjustment, or from the assumed or estimated quality of a sensor measurement such as GPS (in the case of terrestrial mapping) or lidar. Or for other planets accuracy of the MOLA solution. Units are meters.
+      </td>
+  </tr>
+  <tr><td> <b>AprioriSigmaZ</b></td>
+      <td>  No </td>
+      <td>  None </td>
+      <td> Pre-adjustment standard deviation of XXXXXXX. An indicator of accuracy that may be used in the weighting of the XXXXXX point coordinate in the bundle adjustment. May originate from a variety of sources; for example a base-map, a previous bundle adjustment, or from the assumed or estimated quality of a sensor measurement such as GPS (in the case of terrestrial mapping) or lidar. Or for other planets accuracy of the MOLA solution. Units are meters.
+      </td>
+<!-- The Sigmas are stored in the binary control net as an 6 element upper triangular covariance matrix for accuracy.  The keyword is AprioriCovarianceMatrix.  See the description under AprioriX, AprioriY, and AprioriZ. -->
+  </tr>
+  <tr><td> <b>LatitudeConstrained</b></td>
+      <td>  No </td>
+      <td>  False </td>
+      <td> Flag that indicates if the Latitude is constrained.
+      </td>
+<!-- For control nets with AprioriX, AprioriY, and AprioriZ, the default is false.  Even it a point has both the coordinates and covariance matrix, the  a priori information will not be applied for any of the coordinates unless the appropriate constraint flags are present.  For old and transitional nets, the default will depend on the presence a valid value for the coordinate and its corresponding sigma.-->
+  </tr>
+  <tr><td><b> LongitudeConstrained</b></td>
+      <td>  No </td>
+      <td> False</td>
+      <td> Flag that indicates if the longitude is constrained.
+      </td>
+  </tr>
+  <tr><td> <b>RadiusConstrained</b></td>
+      <td>  No</td>
+      <td> False</td>
+      <td> Flag that indicates if the radius is constrained.
+      </td>
+  </tr>
+  <tr><td> <b>AdjustedX</b></td>
+      <td>  No </td>
+      <td>  None</td>
+      <td> Adjusted X coordinate of the Control Point location. Units are decimal meters.
+      </td>
+<!--'''Note:''' The adjusted coordinates stored in the binary control network will always be (X,Y,Z) <meters>. When this information is presented on a terminal window, graphical display, or log file, these will be converted to a user chosen coordinate system. That system may be controlled by the application, user's preference or something else.-->
+  </tr>
+<tr><td> <b>AdjustedY</b></td>
+      <td>  No </td>
+      <td>  None</td>
+      <td> Adjusted Y coordinate of the Control Point location. Units are decimal meters.
+      </td>
+  </tr>
+<tr><td> <b>AdjustedZ</b></td>
+      <td>  No </td>
+      <td>  None</td>
+      <td> Adjusted Z coordinate of the Control Point location. Units are decimal meters.
+      </td>
+  </tr>
+</table>
+
+<h2>Control Measure</h2>
+<p>A Control Measure is a measurement in image space (sample and line coordinates) of a point in one cube that has been associated with a Control Point and other overlapping image cubes.
+
+Each ControlMeasure group in a PVL-formatted Control Network contains all information concerning a control measurement. An example follows:</p>
+
+<pre style="padding-left:4em;">
+    Group = ControlMeasure
+      SerialNumber       = Example/Measure/111.000
+      MeasureType        = "Candidate   # (Candidate, Manual, RegisteredPixel, RegisteredSubPixel)"
+      ChooserName        = aexample
+      DateTime           = 2012-01-04T17:01:32
+      EditLock           = True
+      Ignore             = True
+      Sample             = 180.0
+      Line               = 270.0
+      Diameter           = 10.0
+      AprioriSample      = 50
+      AprioriLine        = 50
+      SampleSigma        = 10 &lt;pixels&gt;
+      LineSigma          = 10 &lt;pixels&gt;
+      SampleResidual     = 10 &lt;pixels&gt;
+      LineResidual       = -10 &lt;pixels&gt;
+      JigsawRejected     = Yes
+      MinimumPixelZScore = -6.9339878963865
+      MaximumPixelZScore = 7.8509687345151
+      GoodnessOfFit      = 0.7774975693515
+      Reference          = True
+      End_Group
+</pre>
+
+<table class="tableFormattedInformation" align="center">
+  <tr><th>Keyword</th>
+      <th> Required </th>
+      <th> Default </th>
+      <th>Description</th>
+  </tr>
+  <tr><td> <b>SerialNumber</b></td>
+      <td>  Yes </td>
+      <td>  No Default </td>
+      <td> A serial number is a unique identifier for a cube. This value is usually comprised of a spacecraft name, instrument name, start time, and if needed, other identifying label values from the cube. Serial numbers are used within control networks in conjunction with a cube list to associate cubes and control measures.
+      </td>
+  </tr>
+  <tr><td> <b>MeasureType</b></td>
+      <td>  No</td>
+      <td>  Candidate</td>
+      <td>
+    	  <ul>
+          <li><b>Candidate</b> - This Control Measurement is considered a candidate (i.e., the location is preliminary or not well know). <!--Application such as Autoseed, cnetref should use this setting--></li>
+          <li><b>Manual</b> - This Control Measurement was hand measured (eg. qnet).</li>
+          <li><b>RegisteredPixel</b> - Automatically registered to whole pixel (eg. pointreg).</li>
+          <li><b>RegisteredSubPixel</b> - Automatically registered to sub-pixel (eg. pointreg, qnet).</li>
+    	  </ul>
+      </td>
+  </tr>
+ <tr><td> <b>ChooserName</b></td>
+      <td>  No </td>
+      <td>  Omitted if not set</td>
+      <td>Indicates the name of the user or application that last changed this Control Measure's coordinate.</td>
+  <!--''''''Note:'''''' For qnet use the user name instead of "qnet"-->
+  </tr>
+  <tr><td> <b>DateTime</b></td>
+      <td>  No </td>
+      <td>  Omitted if not set</td>
+      <td> Indicates the date/time the Control Measure's line/sample coordinates were last changed.
+      </td>
+  <!-- '''AI''' Add updating this automatically to control measure class if possible -->
+  </tr>
+  <tr><td> <b>EditLock</b></td>
+      <td>  No</td>
+      <td>  False</td>
+      <td> Indicates that the measure is not to be edited. This includes the Ignore and Reference flag for any measure.
+      </td>
+      <!--If the reference measure EditLock=False and the Point-EditLock=TRUE, then the reference measure is implicitly Editlock=TRUE.
+
+If any non-reference measure is EditLock=True and the Reference measure EditLock=False, this is an ERROR and the application needs to report to the user.  There can be more than one measure with EditLock=True (reference + any other measures).-->
+  </tr>
+  <tr><td> <b>Ignore</b></td>
+      <td>  No</td>
+      <td>  False</td>
+      <td> Flag (True/False) to indicate whether this Control Measure should be Ignored. When a measurement is ignored it should not be used by a program unless the program is explicitly working with ignored measurements.
+      </td>
+  </tr>
+  <tr><td> <b>Sample</b></td>
+      <td>  No</td>
+      <td>  0.0?</td>
+      <td> Sample coordinate of the Control Measure within the cube. The value of the keyword is a floating point number.
+      </td>
+  </tr>
+ <tr><td> <b>Line</b></td>
+      <td>  No</td>
+      <td>  0.0?</td>
+      <td> Line coordinate of the Control Measure within the cube. The value of the keyword is a floating point number.
+      </td>
+  </tr>
+ <tr><td> <b>Diameter</b></td>
+      <td>  No</td>
+      <td>  0.0</td>
+      <td> The diameter of the crater in meters, if the control measure is associated with a crater.
+      </td>
+ <!-- '''AI''' Check qnet to see if this is being set and used as need by users. -->
+  </tr>
+ <tr><td> <b>AprioriSample</b></td>
+      <td>  No</td>
+      <td>  None</td>
+      <td> The first identified sample coordinate of the measure by any application. In this initial state the a priori keyword values are the same as line/sample keyword values.
+      </td>
+  <!--autoseed, cnetadd, qnet (for manual movement), cnetref (with interest),mat2cnet - set this to the new value.
+  pointreg, qnet (with sub-pixel), hijitreg, ALL autoreg apps - leave this alone. They will use it to calculate the pixelshift in the log file -->
+  </tr>
+ <tr><td> <b>AprioriLine</b></td>
+      <td>  No</td>
+      <td>  None</td>
+      <td> The first identified line coordinate of the measure by any application. In this initial state the a priori keyword values are the same as line/sample keyword values.
+      </td>
+  </tr>
+ <tr><td> <b>SampleSigma</b></td>
+      <td>  No</td>
+      <td>  None</td>
+      <td>
+Standard deviation of sample measurement. An indicator of precision used in the weighting of measurements in the bundle adjustment (i.e. Jigsaw). May be determined from experience (e.g., manual point measurement) or perhaps estimated within an automated point measurement technique (e.g., ellipse fitting of crater edges, or through the use of an interest operator). Units are pixels.
+      </td>
+ <!--* Note that the computation of this value by ISIS automated point measurement methods is yet to be determined.
+'''''NOTE:''''' See LINESIGMA-->
+  </tr>
+  <tr><td> <b>LineSigma</b></td>
+       <td>  No</td>
+       <td>  None</td>
+       <td>Standard deviation of line measurement. An indicator of precision used in the weighting of measurements in the bundle adjustment (i.e. Jigsaw). May be determined from experience (e.g., manual point measurement) or perhaps estimated within an automated point measurement technique (e.g., ellipse fitting of crater edges, or through the use of an interest operator). Units are pixels.
+       </td>
+ <tr><td> <b>SampleResidual</b></td>
+      <td>  No</td>
+      <td>  None</td>
+      <td>
+The difference between the 'estimated' sample measurement (as determined at the end of each iteration of the bundle adjustment) and the original sample measurement. Used in the determination of outliers throughout the bundle. Measurement residuals are used upon convergence to compute the reference variance (σ<SUB>0</SUB><SUP>2</SUP>) which in turn is used to scale the inverse of the normal equations matrix for error propagation. Units are pixels.
+      </td>
+<!--''''''Note:'''''' Make sure warp, translate, coreg type apps output a cnet and set these-->
+  </tr>
+ <tr><td> <b>LineResidual</b></td>
+      <td>  No</td>
+      <td>  None</td>
+      <td>
+The difference between the ''estimated'' line measurement (as determined at the end of each iteration of the bundle adjustment) and the original sample measurement. Used in the determination of outliers throughout the bundle. Measurement residuals are used upon convergence to compute the reference variance (σ<SUB>0</SUB><SUP>2</SUP>) which in turn is used to scale the inverse of the normal equations matrix for error propagation. Units are pixels.
+      </td>
+ <!--''''''Note:'''''' See Sample Residual-->
+  </tr>
+  <tr><td> <b>JigsawRejected</b></td>
+       <td>  No</td>
+       <td>  False</td>
+       <td> A flag indicating if this measure has been rejected by jigsaw.
+       </td>
+   </tr>
+  <tr><td><b> MinimumPixelZScore</b></td>
+       <td>  No</td>
+       <td>  None</td>
+       <td> Control measures store z-scores in pairs. A pair contains the z-scores of the minimum and maximum pixels in the pattern chip generated for the given measure during point registration. Each z-score indicates how many standard deviations the given pixel value is above or below the mean DN. This is used when using area-based-matching in ISIS3.
+       </td>
+   </tr>
+  <tr><td><b> MaximumPixelZScore</b></td>
+       <td>  No</td>
+       <td>  None</td>
+       <td> Control measures store z-scores in pairs. A pair contains the z-scores of the minimum and maximum pixels in the pattern chip generated for the given measure during point registration. Each z-score indicates how many standard deviations the given pixel value is above or below the mean DN. This is used when using area-based-matching in ISIS3.
+       </td>
+   </tr>
+  <tr><td> <b>GoodnessOfFit</b></td>
+       <td>  No</td>
+       <td>  None</td>
+       <td> This measures how well the computed fit area matches the pattern area when using applications like pointreg.
+       </td>
+   </tr>
+  <tr><td> <b>Reference</b></td>
+       <td>  No</td>
+       <td>  False(?)</td>
+       <td> A flag indicating if this measure is the reference measure for its parent Control Point.
+       </td>
+   </tr>
+<!--
+''''''Note:'''''' The computation of this value by ISIS automated point measurement methods is yet to be determined. Eventually this should be defined before jigsaw runs such as pointreg setting it based on how well the measurement coregistered.
+
+'''AI''' Can Ken E. look at autoreg output stats to determine an accurate sigma from those stats.
+
+'''''Note:''''' Consider adding this as input to warp/coreg/translate-->
+   </tr>
+</table>
+
+      </body>
+
+      <type>HTML</type>
+
+      <source>
+        <filename>index.html</filename>
+      </source>
+    </file>
+  </files>
+
+  <category>
+    <categoryItem>technicaldoc</categoryItem>
+  </category>
+
+  <audience>
+    <target>administrator</target>
+  </audience>
+
+  <history>
+    <change name="Kristin Berry" date="2018-01-26">Original Version. Migrated information from internal wiki, ControlNetVersioner.h, the pvl template file, and many other header files. Actual original authors include most of the ISIS3 team.</change>
+  </history>
+
+  <bibliography>
+    <title>Control Networks</title>
+    <brief>Control Network format and keyword definitions in ISIS 3</brief>
+    <description>
+      This document describes the format of and defines the keywords that are part of
+      Control Networks in ISIS3.
+    </description>
+    <author>Kristin Berry</author>
+    <date>2018-01-26</date>
+  </bibliography>
+</documentation>
diff --git a/isis/src/docsys/documents/InstallGuide/InstallGuide.xml b/isis/src/docsys/documents/InstallGuide/InstallGuide.xml
index 26cb913ce9e4ade520c9d1ea560205a891b9a9ce..e6baa9a4d41bab1e0d40dfaae9f7ad4f78507746 100644
--- a/isis/src/docsys/documents/InstallGuide/InstallGuide.xml
+++ b/isis/src/docsys/documents/InstallGuide/InstallGuide.xml
@@ -75,7 +75,7 @@ you must <em>not</em> upgrade the ISIS Data Files!!!
         <h3>Recommended Installation Process</h3>
         <p>
           ISIS 3 now features a downloadable Java-based installer.  The installer provides user options for choosing which mission
-          packages and target DEMs (e.g. Mars, Moon) to download. It also includes the sizes of the packages.   During the installation process, 
+          packages and target DEMs (e.g. Mars, Moon) to download. It also includes the sizes of the packages.   During the installation process,
 	  you can choose to use the ISIS SPICE Web service which will eliminate the need to download most of theSPICE data for a mission.
         </p>
         <p>
@@ -212,7 +212,7 @@ you must <em>not</em> upgrade the ISIS Data Files!!!
              <h3>I just can not get ISIS installed.  What can I do?</h3>
              <p>
                If you encounter problems, we monitor our discussion
-               board daily and will respond to any questions as soon as we can.  But, first, please check the discussion board 
+               board daily and will respond to any questions as soon as we can.  But, first, please check the discussion board
 	       as others may have posted the problem with similar issues to you.
              </p>
              <p>
@@ -374,7 +374,7 @@ you must <em>not</em> upgrade the ISIS Data Files!!!
   via the internet. To use this service instead of your local SPICE data, click the WEB check box in
   the spiceinit program GUI or type spiceinit web=yes at the command line. Using the ISIS SPICE Web
   Service will significantly reduce the size of the downloads from our data area.
-  
+
   If you want to use this new service, without having to download all the SPICE data, add the
   following argument to the mission-specific rsync command:
  </p>
@@ -386,12 +386,11 @@ you must <em>not</em> upgrade the ISIS Data Files!!!
         </p>
 
         <span style="font-size:120%; color:red; font-weight:bold">
-          WARNING: Some missions do not currently support calibration when using the SPICE Web
-          Service exclusively: these include LRO, MRO, Viking, MGS, and MER. These calibration
-          programs are lronaccal, lrowaccal, mical, moccal, ctxcal, hical, vikcal, mocevenodd, and
-          mocnoise50. Some programs designed to run an image from ingestion through the mapping
-          phase do not have an option to use the SPICE Web Service. Known programs are thmproc,
-          mocproc, hicalproc, and mdisproc.
+          WARNING: Some instruments require mission data to be present for calibration, which may
+          not be supported by the SPICE Web Server exclusively, and some programs that are designed
+          to run an image from ingestion through the mapping phase do not have an option to use the
+          SPICE Web Service. For information specific to an instrument, see the documentation for
+          radiometric callobration programs.
         </span>
 
           <A NAME="ApolloMission"> </A>
@@ -410,7 +409,7 @@ you must <em>not</em> upgrade the ISIS Data Files!!!
         rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/cassini data/
         </pre>
 <p>
-  Chan1 Mission (kernels can be excluded):
+  Chandrayaan Mission (kernels can be excluded):
 </p>
         <pre>
         rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/chan1 data/
@@ -427,18 +426,43 @@ you must <em>not</em> upgrade the ISIS Data Files!!!
         <pre>
         rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/dawn data/
         </pre>
- <p>
+<p>
+  ExoMars Trace Gas Orbiter Mission (kernels can be excluded):
+</p>
+        <pre>
+        rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/tgo data/
+        </pre>
+<p>
   Galileo Mission (kernels can be excluded):
 </p>
         <pre>
         rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/galileo data/
         </pre>
+<p>
+  Hayabusa Mission (kernels can be excluded):
+</p>
+        <pre>
+        rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/hayabusa data/
+        rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/hayabusa2 data/
+        </pre>
 <p>
   Ideal Mission (kernels can be excluded):
 </p>
         <pre>
         rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/ideal data/
         </pre>
+<p>
+  Juno Mission (kernels can be excluded):
+</p>
+        <pre>
+        rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/juno data/
+        </pre>
+<p>
+  Kaguya Mission (kernels can be excluded):
+</p>
+        <pre>
+        rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/kaguya data/
+        </pre>
 <p>
   Lunar Orbiter Mission (kernels can be excluded):
 </p>
@@ -493,18 +517,36 @@ you must <em>not</em> upgrade the ISIS Data Files!!!
         <pre>
         rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/odyssey data/
         </pre>
+<p>
+  Near Mission (kernels can be excluded):
+</p>
+        <pre>
+        rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/near data/
+        </pre>
 <p>
   New Horizons Mission (kernels can be excluded):
 </p>
         <pre>
         rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/newhorizons data/
         </pre>
+<p>
+  Odyssey Mission (kernels can be excluded):
+</p>
+        <pre>
+        rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/odyssey data/
+        </pre>
 <p>
   Rolo Mission (kernels can be excluded):
 </p>
         <pre>
         rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/rolo data/
         </pre>
+<p>
+  Rosetta Mission (kernels can be excluded):
+</p>
+        <pre>
+        rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/rosetta data/
+        </pre>
 <p>
   Smart1 Mission (kernels can be excluded):
 </p>
@@ -577,7 +619,7 @@ you must <em>not</em> upgrade the ISIS Data Files!!!
         <p>
             Run the startup script for ISIS. This script assumes you installed
             the ISIS 3 data area in the same directory you installed the ISIS 3
-            package. If you did not do this, you will need to modify the script to 
+            package. If you did not do this, you will need to modify the script to
 	    indicatethe proper location.
         </p>
 
@@ -639,6 +681,7 @@ you must <em>not</em> upgrade the ISIS Data Files!!!
     <change name="Ian Humphrey" date="2016-02-26">Updated for latest Fedora version (Fedora21).</change>
     <change name="Adam Paquette" date="2016-06-24">Updated links to the support center.</change>
     <change name="Ian Humphrey" date="2017-01-25">Updated instructions for new supported systems.</change>
+    <change name="Summer Stapleton" date="2017-12-29">Updated SPICE Web Service mission information to include newer missions.</change>
   </history>
 
   <bibliography>
diff --git a/isis/src/hayabusa/apps/amicacal/amicacal.cpp b/isis/src/hayabusa/apps/amicacal/amicacal.cpp
index 3f6876eec9d882f93168fb506f7339f3c6fbc371..aa0bb340703f52592253013d1a850ac5c60c04d7 100644
--- a/isis/src/hayabusa/apps/amicacal/amicacal.cpp
+++ b/isis/src/hayabusa/apps/amicacal/amicacal.cpp
@@ -1,15 +1,15 @@
 // $Id: amicacal.cpp 6045 2015-02-07 02:06:59Z moses@GS.DOI.NET $
 #include "Isis.h"
 
-#include <vector>
 #include <algorithm>
-#include <memory>
-#include <cstdio>
 #include <cmath>
+#include <cstdio>
+#include <memory>
+#include <vector>
 
 #include <QFile>
-#include <QString>
 #include <QScopedPointer>
+#include <QString>
 #include <QTemporaryFile>
 #include <QVector>
 
@@ -21,10 +21,10 @@
 #include "iTime.h"
 #include "LineManager.h"
 #include "Pixel.h"
+#include "ProcessByBoxcar.h"
+#include "ProcessByBrick.h"
 #include "ProcessByLine.h"
 #include "ProcessBySample.h"
-#include "ProcessByBrick.h"
-#include "ProcessByBoxcar.h"
 #include "ProgramLauncher.h"
 #include "Pvl.h"
 #include "PvlGroup.h"
@@ -37,12 +37,16 @@ using namespace Isis;
 using namespace std;
 
 // Calibration support routines
-FileName DetermineFlatFieldFile(const QString &filter, const bool nullPolarPix);
-void Calibrate(vector<Buffer *>& in, vector<Buffer *>& out);
+FileName determineFlatFieldFile(const QString &filter, const bool nullPolarPix);
+void calibrate(vector<Buffer *>& in, vector<Buffer *>& out);
 
 QString loadCalibrationVariables(const QString &config);
+
+#if 0
+// PSF correction is currently not working and has been removed as an option. 
 //void psfCorrection(vector<Buffer *>& in, vector<Buffer *>& out);
 //void psfCorrectionBoxcar(Buffer &in, double &result);
+#endif
 
 // Temporary cube file pointer deleter
 struct TemporaryCubeDeleter {
@@ -58,18 +62,18 @@ struct TemporaryCubeDeleter {
 
 
 //For subimage and binning mapping
-static AlphaCube *alpha(0);
+static AlphaCube *alpha = 0;
 
 QString g_filter = "";
 static QString g_target ="";
-static const int g_HayabusaNaifCode = -130;
+static const int g_hayabusaNaifCode = -130;
 static Pvl g_configFile;
 
 //Bias calculation variables
-static double g_b0(0);
-static double g_b1(0);
-static double g_b2(0);
-static double g_bias(0);
+static double g_b0 = 0;
+static double g_b1 = 0;
+static double g_b2 = 0;
+static double g_bias = 0;
 
 static QString g_launchTimeStr;
 static iTime g_launchTime;
@@ -77,54 +81,56 @@ static QString g_startTime;
 
 
 //Dark Current variables
-static double g_d0(0);
-static double g_d1(0);
-static double g_temp(0);
-static double g_darkCurrent(0);
+static double g_d0 = 0;
+static double g_d1 = 0;
+static double g_temperature = 0;
+static double g_darkCurrent = 0;
 
 //Smear calculation variables
-static double g_Tvct(0);       //!< Vertical charge-transfer period (in seconds).
-static double g_texp(1);       //!< Exposure time.
-static double g_timeRatio(1.0);
+static double g_tvct = 0;         //!< Vertical charge-transfer period  ( in seconds).
+static double g_exposureTime = 1;
+static double g_timeRatio = 1.0;
 
 //Linearity calculation variables
-static double g_Gamma(0);
-static double g_L0(0);
-static double g_L1(0);
+static double g_gamma = 0;
+static double g_L0 = 0;
+static double g_L1 = 0;
 
 
 // Calibration parameters
-static int nsubImages(0);      //!< Number of sub images
-static int binning(1);         //!< The number of samples/lines which are binned
-static bool g_nullPolarizedPixels = true;   /**< Flag which tells us if the Polarized pixels are to
+static int nsubImages = 0;      //!< Number of sub images
+static int binning = 1;         //!< The number of samples/lines which are binned
+static bool g_nullPolarizedPixels = true;   /**< Flag which tells us if the Polarized pixels are
                                                  to be set to ISIS::Null */
-static double g_compfactor(1.0);  // Default if OutputMode = LOSS-LESS; 16.0 for LOSSY
+static double g_compfactor = 1.0;  //!< Default if OutputMode = LOSS-LESS; 16.0 for LOSSY
 
-static QString g_iofCorrection("IOF");  //!< Is I/F correction to be applied?
+static QString g_iofCorrection = "IOF";  //!< Is I/F correction to be applied?
 
 
 //  I/F variables
-static double g_solarDist(1.0);  /**< Distance from the Sun to the target body
-                                 (used to calculate g_iof) */
-static double g_iof(1.0);        //!< I/F conversion value
-static double g_iofScale(1.0);
-static double g_solarFlux(1.0);  //!< The solar flux (used to calculate g_iof).
-static double g_v_standard(3.42E-3);//!< Base conversion for all filters (Tbl. 9)
+static double g_solarDist = 1.0;  /**< Distance from the Sun to the target body
+                                 (used to calculate g_calibrationScale) */
+static double g_calibrationScale = 1.0;        //!< I/F conversion value
+static double g_iofScale = 1.0;
+static double g_solarFlux = 1.0;  //!< The solar flux (used to calculate g_calibrationScale).
+static double g_radStd = 3.42E-3;//!< Base conversion for all filters (Tbl. 9)
 
 
 //Hot pixel vector container
 static QVector<Pixel> hotPixelVector;  //!< A pixel vector that contains the Hot Pixel locations
 
+#if 0
+// PSF correction is currently not working and has been removed as an option. 
 // PSF variables 
-//static bool g_applyPSF(false);
-//static int ns,nl,nb;     //!< Number of samples, lines, bands of the input cube
-//static int g_size(23);   //!< The size of the Boxcar used for calculating the light diffusion model.
+//static bool g_applyPSF = false;
+//static int ns, nl, nb;     //!< Number of samples, lines, bands of the input cube
+//static int g_size = 23;   //!< The size of the Boxcar used for calculating the light diffusion model.
 //static const int g_N = 6;
-//static double g_alpha(0.0);
-//static double * g_psfFilter;
+//static double g_alpha = 0.0;
+//static double *g_psfFilter;
 //static double g_sigma[g_N];
 //static double g_A[g_N];
-
+#endif
 
 void IsisMain() {
 
@@ -133,26 +139,29 @@ void IsisMain() {
   g_nullPolarizedPixels = ui.GetBoolean("NULLPOLARPIX");
   g_iofCorrection = ui.GetString("UNITS");
 
-  const QString amicacal_program = "amicacal";
-  const QString amicacal_version = "1.0";
-  const QString amicacal_revision = "$Revision$";
-  QString amicacal_runtime = Application::DateTime();
+  const QString amicacalProgram = "amicacal";
+  const QString amicacalVersion = "1.0";
+  const QString amicacalRevision = "$Revision$";
+  QString amicacalRuntime = Application::DateTime();
 
-  ProcessBySample p;
+  ProcessBySample process;
 
-  Cube *icube = p.SetInputCube("FROM");  
+  Cube *inputCube = process.SetInputCube("FROM");
+#if 0
+// PSF correction is currently not working and has been removed as an option. 
 //  g_applyPSF = ui.GetBoolean("APPLYPSF");
-
+#endif
 
   // Basic assurances...
-  if (icube->bandCount() != 1) {
-    throw IException(IException::User,
-                     "AMICA images may only contain one band", _FILEINFO_);
+  if (inputCube->bandCount() != 1) {
+    throw IException(IException::User, 
+                     "AMICA images may only contain one band", 
+                     _FILEINFO_);
   }
 
-  PvlGroup& inst = icube->group("Instrument");
-  PvlGroup &bandbin = icube->group("BandBin");
-  PvlGroup &archive = icube->group("Archive");
+  PvlGroup& inst = inputCube->group("Instrument");
+  PvlGroup &bandbin = inputCube->group("BandBin");
+  PvlGroup &archive = inputCube->group("Archive");
 
   QString filter = bandbin["Name"];
   g_filter=filter;
@@ -165,28 +174,32 @@ void IsisMain() {
 
   //Set up binning and image subarea mapping
 
-  AlphaCube myAlpha(1024,1024,icube->sampleCount(), icube->lineCount(),
-                    startSample+1,startLine+1,lastSample+1,lastLine+1);
+  AlphaCube myAlpha(1024, 1024, inputCube->sampleCount(), 
+                    inputCube->lineCount(), 
+                    startSample + 1, 
+                    startLine + 1, 
+                    lastSample + 1, 
+                    lastLine + 1);
 
-  alpha=&myAlpha;
+  alpha = &myAlpha;
 
   try {
-    g_texp = inst["ExposureDuration"] ; 
+    g_exposureTime = inst["ExposureDuration"] ; 
   }
   catch(IException &e) {
     QString msg = "Unable to read [ExposureDuration] keyword in the Instrument group "
-                  "from input file [" + icube->fileName() + "]";
-    throw IException(e, IException::Io,msg, _FILEINFO_);
+                  "from input file [" + inputCube->fileName() + "]";
+    throw IException(e, IException::Io, msg, _FILEINFO_);
   }
 
 
   try {
-    g_temp = inst["CcdTemperature"] ;
+    g_temperature = inst["CcdTemperature"] ;
   }
   catch(IException &e) {
     QString msg = "Unable to read [CcdTemperature] keyword in the Instrument group "
-                  "from input file [" + icube->fileName() + "]";
-    throw IException(e, IException::Io,msg, _FILEINFO_);
+                  "from input file [" + inputCube->fileName() + "]";
+    throw IException(e, IException::Io, msg, _FILEINFO_);
 
   }
 
@@ -194,7 +207,7 @@ void IsisMain() {
 
   g_startTime = startTime;
   binning = inst["Binning"];
-  int startline = inst["FirstLine"];
+  int firstLine = inst["FirstLine"];
   int startsample = inst["FirstSample"];
   int lastline = inst["LastLine"];
   int lastsample = inst["LastSample"];
@@ -213,12 +226,12 @@ void IsisMain() {
   // Determine if we need to subsample the flat field should pixel binning
   // occurred
   QScopedPointer<Cube, TemporaryCubeDeleter> flatcube;
-  FileName flatfile= DetermineFlatFieldFile(g_filter,g_nullPolarizedPixels);
+  FileName flatfile = determineFlatFieldFile(g_filter, g_nullPolarizedPixels);
 
-  QString reducedFlat(flatfile.expanded());
+  QString reducedFlat = flatfile.expanded();
 
   // Image is not cropped
-  if (startline ==0 && startsample == 0){
+  if (firstLine ==0 && startsample == 0){
 
     if (binning > 1) {
       QString scale(toString(binning));
@@ -244,82 +257,108 @@ void IsisMain() {
 
     // Set up processing for flat field as a second input file
     CubeAttributeInput att;
-    p.SetInputCube(reducedFlat, att);
+    process.SetInputCube(reducedFlat, att);
   }
   else {
     // Image is cropped so we have to deal with it
-    FileName transFlat =
-      FileName::createTempFile("$TEMPORARY/" + flatfile.baseName() + "_translated.cub");
+    FileName transFlat = FileName::createTempFile("$TEMPORARY/" 
+                                                  + flatfile.baseName() 
+                                                  + "_translated.cub");
 
     Cube *flatOriginal = new Cube(flatfile.expanded() );
     
-    int transform[5] = {binning,startsample,startline,lastsample,lastline};
+    int transform[5] = {binning, startsample, firstLine, lastsample, lastline};
     
     // Translates and scales the flatfield image.  Scaling
     // might be necessary in the event that the raw image was also binned.
 
-    translate(flatOriginal,transform,transFlat.expanded());
+    translate(flatOriginal, transform, transFlat.expanded());
 
     QScopedPointer<Cube, TemporaryCubeDeleter> translated(new Cube(transFlat.expanded(), "r"));
     flatcube.swap(translated);
     
     CubeAttributeInput att;
-    p.SetInputCube(transFlat.expanded(),att);
+    process.SetInputCube(transFlat.expanded(), att);
   }
 
-  Cube *ocube  = p.SetOutputCube("TO");
-  QString fname = ocube->fileName();
+  Cube *outputCube  = process.SetOutputCube("TO");
+  QString fname = outputCube->fileName();
 
-  //ns = icube->sampleCount();
-  //nl = icube->lineCount();
-  //nb = icube->bandCount();
+#if 0
+// PSF correction is currently not working and has been removed as an option. 
+  //ns = inputCube->sampleCount();
+  //nl = inputCube->lineCount();
+  //nb = inputCube->bandCount();
+#endif
 
   QString calfile = loadCalibrationVariables(ui.GetAsString("CONFIG"));
 
-  g_timeRatio = g_Tvct/(g_texp + g_Tvct);
-
-  g_darkCurrent = g_d0*exp(g_d1*g_temp);
-
-  g_iof = 1.0;  // Units of DN
-
+  g_timeRatio = g_tvct / (g_exposureTime + g_tvct);
+  g_darkCurrent = g_d0 * exp(g_d1 * g_temperature);
   QString g_units = "DN";
-  if ( "radiance" == g_iofCorrection.toLower() ) {
-    // Units of RADIANCE 
-    g_iof = g_iof * g_v_standard * g_iofScale; 
-    g_units = "W / (m**2 micrometer sr)";
-  }
 
   if ( !sunDistanceAU(startTime, target, g_solarDist) ) {
-     throw IException(IException::Programmer, "Cannot calculated distance to sun!",
-                       _FILEINFO_);
+     throw IException(IException::Programmer, 
+                      "Cannot calculated distance to sun!", 
+                      _FILEINFO_);
   }
 
-  if ( "iof" == g_iofCorrection.toLower() ) {
-    // Units of I/F
-    g_iof = pi_c() * (g_solarDist * g_solarDist) * 
-            (g_v_standard * g_iofScale) / g_solarFlux / g_texp;
-    g_units = "I over F";
-  }
+  if ( QString::compare(g_iofCorrection, "dn", Qt::CaseInsensitive) != 0 ) {
+    /* Note - this radiance calibration scaling factor is applied to both radiance and iof
+     * 
+     * Units of RADIANCE
+     * equation:
+     *     Rad(i)=image(DN/s) * C * S(i) where
+     *         C = radStd = 3.42.10^-3 
+     *         S(i) = iofScale, 
+     *             with S(v) = 1, 
+     *             S(zs)=3.286 (factor computed by Lucille Le Corre of PSI),
+     *             and the remaining scale factors from table 9 of the Ishiguro et al. 2010 paper
+     */ 
+    g_calibrationScale = g_radStd * g_iofScale / g_exposureTime; 
+    g_units = "W / (m**2 micrometer sr)";
 
+    if ( QString::compare(g_iofCorrection, "iof", Qt::CaseInsensitive) == 0 ) {
+      /* Note: iof (i.e. reflectance) equation described below is just
+       *       Ref(i) = Rad(i) * pi * d^2 /Fv
+       *       so this if-statement is nested 
+       *
+       * Units of I/F (reflectance)
+       * equation:
+       *     Ref(v)=image(DN/s) * C * S(i) * pi * d^2/F(v) where 
+       *         C, S(i) are as described above,
+       *         d is the solar distance from the label of the v filter image,
+       *         Fv = solarflux(v) = 1861.145142 is the solar flux 
+       *             resampled to V filter bandpass with Quantum Efficiency
+       */
+      g_calibrationScale = g_calibrationScale 
+                           * Isis::PI 
+                           * (g_solarDist * g_solarDist) 
+                           / g_solarFlux;
+      g_units = "I over F";
+    }
+  }
 
   // Calibrate!
   try {
-    p.Progress()->SetText("Calibrating Hayabusa Cube");
-    p.StartProcess(Calibrate);
+    process.Progress()->SetText("Calibrating Hayabusa Cube");
+    process.StartProcess(calibrate);
   }
   catch (IException &ie) {
-    throw IException(ie, IException::Programmer, 
-                     "Radiometric calibration failed!", _FILEINFO_);
+    throw IException(ie, 
+                     IException::Programmer, 
+                     "Radiometric calibration failed!", 
+                     _FILEINFO_);
   }
 
   // Log calibration activity performed so far
   PvlGroup calibrationLog("RadiometricCalibration");
-  calibrationLog.addKeyword(PvlKeyword("SoftwareName", amicacal_program));
-  calibrationLog.addKeyword(PvlKeyword("SoftwareVersion", amicacal_version));
-  calibrationLog.addKeyword(PvlKeyword("ProcessDate", amicacal_runtime));
+  calibrationLog.addKeyword(PvlKeyword("SoftwareName", amicacalProgram));
+  calibrationLog.addKeyword(PvlKeyword("SoftwareVersion", amicacalVersion));
+  calibrationLog.addKeyword(PvlKeyword("ProcessDate", amicacalRuntime));
   calibrationLog.addKeyword(PvlKeyword("CalibrationFile", calfile));
   calibrationLog.addKeyword(PvlKeyword("FlatFieldFile", flatfile.originalPath()
-                                       + "/" + flatfile.name()));
+                                                        + "/" + flatfile.name()));
   calibrationLog.addKeyword(PvlKeyword("CompressionFactor", toString(g_compfactor, 2)));
 
   // Parameters
@@ -334,75 +373,77 @@ void IsisMain() {
   key.addValue(toString(g_L0, 8));
   key.addValue(toString(g_L1, 8));
   calibrationLog.addKeyword(key);
-  calibrationLog.addKeyword(PvlKeyword("Linearity_Gamma", toString(g_Gamma, 16)));
+  calibrationLog.addKeyword(PvlKeyword("Linearity_Gamma", toString(g_gamma, 16)));
 
-  calibrationLog.addKeyword(PvlKeyword("Smear_Tvct", toString(g_Tvct, 16)));
+  calibrationLog.addKeyword(PvlKeyword("Smear_tvct", toString(g_tvct, 16)));
 
   calibrationLog.addKeyword(PvlKeyword("CalibrationUnits", g_iofCorrection));
-  calibrationLog.addKeyword(PvlKeyword("RadianceStandard", toString(g_v_standard, 16)));
+  calibrationLog.addKeyword(PvlKeyword("RadianceStandard", toString(g_radStd, 16)));
   calibrationLog.addKeyword(PvlKeyword("RadianceScaleFactor", toString(g_iofScale, 16)));
   calibrationLog.addKeyword(PvlKeyword("SolarDistance", toString(g_solarDist, 16), "AU"));
   calibrationLog.addKeyword(PvlKeyword("SolarFlux", toString(g_solarFlux, 16)));
-  calibrationLog.addKeyword(PvlKeyword("IOFFactor", toString(g_iof, 16)));
+  calibrationLog.addKeyword(PvlKeyword("IOFFactor", toString(g_calibrationScale, 16)));
   calibrationLog.addKeyword(PvlKeyword("Units", g_units));
 
-// PSF correction is currently not working and has been removed as an option. 
 #if 0 
+// PSF correction is currently not working and has been removed as an option. 
   // This section will apply the PSF correction
   if ( g_applyPSF ) {
     //PSF correction
     CubeAttributeInput attInput;
     CubeAttributeOutput attOutput;
 
-    ProcessByBoxcar pDiffusionModel;
+    ProcessByBoxcar processDiffusionModel;
 
     QScopedPointer<Cube, TemporaryCubeDeleter> diffusionModel;
 
-    FileName oname(ocube->fileName());
+    FileName oname(outputCube->fileName());
     FileName psfModel = FileName::createTempFile("$TEMPORARY/" + oname.baseName() + "_psfmodel.cub");
 
 
-    pDiffusionModel.SetInputCube(ocube);
-    pDiffusionModel.SetOutputCube(psfModel.name(),attOutput,
-                                  ocube->sampleCount(),
-                                  ocube->lineCount(),
-                                  ocube->bandCount());
+    processDiffusionModel.SetInputCube(outputCube);
+    processDiffusionModel.SetOutputCube(psfModel.name(), attOutput, 
+                                        outputCube->sampleCount(), 
+                                        outputCube->lineCount(), 
+                                        outputCube->bandCount());
 
-    pDiffusionModel.SetBoxcarSize(g_size,g_size);
+    processDiffusionModel.SetBoxcarSize(g_size, g_size);
 
-    g_psfFilter = setPSFFilter(g_size, g_A,g_sigma, g_alpha,g_N,binning);
+    g_psfFilter = setPSFFilter(g_size, g_A, g_sigma, g_alpha, g_N, binning);
 
     try {
 
-         pDiffusionModel.StartProcess(psfCorrectionBoxcar);  //Determine the diffusion model.
+         processDiffusionModel.StartProcess(psfCorrectionBoxcar);  //Determine the diffusion model.
 
       }
 
       catch(IException &ie) {
-        pDiffusionModel.EndProcess();
-        ocube->putGroup(calibrationLog);
-        p.EndProcess();
+        processDiffusionModel.EndProcess();
+        outputCube->putGroup(calibrationLog);
+        process.EndProcess();
         remove( psfModel.expanded().toLatin1().data() );
-        throw IException(ie, IException::Programmer,
-                         "Calculating the diffusion model failed!", _FILEINFO_);
+        throw IException(ie, 
+                         IException::Programmer, 
+                         "Calculating the diffusion model failed!", 
+                         _FILEINFO_);
       }
 
-      pDiffusionModel.EndProcess();
+      processDiffusionModel.EndProcess();
 
      //Apply the PSF correction
-      ProcessByLine pPSFCorrection;
+      ProcessByLine processPSFCorrection;
 
       //The diffusion model
-      pPSFCorrection.SetInputCube(psfModel.name(),attInput);
+      processPSFCorrection.SetInputCube(psfModel.name(), attInput);
 
       //The original output cube.
-      pPSFCorrection.SetInputCube(ocube);
-      pPSFCorrection.AddOutputCube(ocube, false);
+      processPSFCorrection.SetInputCube(outputCube);
+      processPSFCorrection.AddOutputCube(outputCube, false);
 
 
       try {
 
-        pPSFCorrection.StartProcess(psfCorrection);
+        processPSFCorrection.StartProcess(psfCorrection);
 
         // Add PSF parameter to the calibration reporting
         key = PvlKeyword("PSF_KernelSize");
@@ -413,25 +454,31 @@ void IsisMain() {
         calibrationLog.addKeyword(PvlKeyword("PSF_Focused", toString(g_alpha, 6)));
 
         key = PvlKeyword("PSF_Sigma");
-        for (int i = 0 ; i < g_N ; i++ ) { key.addValue(toString(g_sigma[i])); }
+        for (int i = 0 ; i < g_N ; i++ ) { 
+          key.addValue(toString(g_sigma[i])); 
+        }
         calibrationLog.addKeyword(key);
 
         key = PvlKeyword("PSF_Diffuse");
-        for (int i = 0 ; i < g_N ; i++ ) { key.addValue(toString(g_A[i])); }
+        for (int i = 0 ; i < g_N ; i++ ) { 
+          key.addValue(toString(g_A[i])); 
+        }
 
       }
 
       catch(IException &ie){
-        pPSFCorrection.EndProcess();
-        ocube->putGroup(calibrationLog);
-        p.EndProcess();
+        processPSFCorrection.EndProcess();
+        outputCube->putGroup(calibrationLog);
+        process.EndProcess();
         remove( psfModel.expanded().toLatin1().data() );
-        throw IException(ie, IException::Programmer,
-                         "Applying the PSF correction failed!", _FILEINFO_);
+        throw IException(ie, 
+                         IException::Programmer, 
+                         "Applying the PSF correction failed!", 
+                         _FILEINFO_);
 
       }  
       
-      pPSFCorrection.EndProcess();
+      processPSFCorrection.EndProcess();
 
       // Remove the PSF file  
       remove( psfModel.expanded().toLatin1().data() );
@@ -439,10 +486,10 @@ void IsisMain() {
 #endif 
 
   // Write Calibration group to output file
-  ocube->putGroup(calibrationLog);
+  outputCube->putGroup(calibrationLog);
   Application::Log(calibrationLog);
   //configFile.clear();
-  p.EndProcess();
+  process.EndProcess();
 
 }
 
@@ -453,7 +500,7 @@ void IsisMain() {
  * @param filter  Name of AMICA filter
  * @return FileName Path and name of flat file file
  */
-FileName DetermineFlatFieldFile(const QString &filter, const bool nullPolarPix) {
+FileName determineFlatFieldFile(const QString &filter, const bool nullPolarPix) {
 
   QString fileName = "$hayabusa/calibration/flatfield/";
 
@@ -477,6 +524,7 @@ FileName DetermineFlatFieldFile(const QString &filter, const bool nullPolarPix)
 
 
 #if 0
+// PSF correction is currently not working and has been removed as an option. 
 /**
  * @brief This function moves the PSF kernel through each pixel of the input cube and approximates
  * the amount of light diffusion produced by that pixel.
@@ -488,16 +536,16 @@ FileName DetermineFlatFieldFile(const QString &filter, const bool nullPolarPix)
 void psfCorrectionBoxcar(Buffer &in, double &result) {
 
     result = 0;
-    int center = (int)(g_size*g_size -1)/2;
+    int center = (int)((g_size * g_size - 1) / 2);
 
     Statistics stats;
 
     for (int i = 0; i < in.size(); i++) {
 
-      if(!IsSpecial(in[i])) {
-        //stats.AddData(in[i]*g_psfFilter[i]);
-        stats.AddData(in[center]*g_psfFilter[i]);
-        //result += in[i]*g_psfFilter[i];
+      if (!IsSpecial(in[i])) {
+        //stats.AddData(in[i] * g_psfFilter[i]);
+        stats.AddData(in[center] * g_psfFilter[i]);
+        //result += in[i] * g_psfFilter[i];
       }
 
     }
@@ -521,7 +569,7 @@ void psfCorrection(vector<Buffer *> &in, vector<Buffer *> &out) {
   for (int i = 0; i < nopsf.size(); i++) {
     if (!IsSpecial(psfVals[i])) {
 
-      imageOut[i] = nopsf[i]-psfVals[i];
+      imageOut[i] = nopsf[i] - psfVals[i];
       //imageOut[i] = psfVals[i];
 
     }
@@ -550,46 +598,50 @@ QString loadCalibrationVariables(const QString &config)  {
   g_configFile.read(calibFile.expanded());
 
   // Load the groups
-  PvlGroup &Bias = g_configFile.findGroup("Bias");
-  PvlGroup &DarkCurrent = g_configFile.findGroup("DarkCurrent");
-  PvlGroup &Smear = g_configFile.findGroup("SmearRemoval");
-  PvlGroup &Linearity = g_configFile.findGroup("Linearity");
-  PvlGroup &hotPixels = g_configFile.findGroup("HotPixels");
+  PvlGroup &biasGroup = g_configFile.findGroup("Bias");
+  PvlGroup &darkCurrentGroup = g_configFile.findGroup("DarkCurrent");
+  PvlGroup &smearGroup = g_configFile.findGroup("SmearRemoval");
+  PvlGroup &linearityGroup = g_configFile.findGroup("Linearity");
+  PvlGroup &hotPixelsGroup = g_configFile.findGroup("HotPixels");
+  PvlGroup &radGroup = g_configFile.findGroup("Rad");
+  PvlGroup &solarFluxGroup = g_configFile.findGroup("SolarFlux");
+
+#if 0
+// PSF correction is currently not working and has been removed as an option. 
 //  PvlGroup &psfDiffuse = g_configFile.findGroup("PSFDiffuse");
 //  PvlGroup &psfFocused = g_configFile.findGroup("PSFFocused");
-  PvlGroup &solar = g_configFile.findGroup("SOLARFLUX");
-  PvlGroup &iof = g_configFile.findGroup("RAD");
+#endif
 
   // Load the hot pixels into a vector
-  for (int i = 0; i< hotPixels.keywords(); i++ ){
+  for (int i = 0; i< hotPixelsGroup.keywords(); i++ ){
 
-    int samp(hotPixels[i][0].toInt());
-    int line (hotPixels[i][1].toInt());
+    int samp(hotPixelsGroup[i][0].toInt());
+    int line (hotPixelsGroup[i][1].toInt());
 
-    hotPixelVector.append( Pixel(alpha->BetaSample(samp),alpha->BetaLine(line),1,0));
+    hotPixelVector.append( Pixel(alpha->BetaSample(samp), alpha->BetaLine(line), 1, 0));
   }
 
   // Load linearity variables
-  g_Gamma = Linearity["Gamma"];
-  g_Gamma = 1.0-g_Gamma;
+  g_gamma = linearityGroup["Gamma"];
+  g_gamma = 1.0 - g_gamma;
 
-  g_L0 = Linearity["L"][0].toDouble();
-  g_L1 = Linearity["L"][1].toDouble();
+  g_L0 = linearityGroup["L"][0].toDouble();
+  g_L1 = linearityGroup["L"][1].toDouble();
 
   // Load Smear Removal Variables
-  g_Tvct = Smear["Tvct"];
+  g_tvct = smearGroup["tvct"];
 
   // Load DarkCurrent variables
-  g_d0 = DarkCurrent["D"][0].toDouble();
-  g_d1 = DarkCurrent["D"][1].toDouble();
+  g_d0 = darkCurrentGroup["D"][0].toDouble();
+  g_d1 = darkCurrentGroup["D"][1].toDouble();
 
   // Load Bias variables
-  g_b0 = Bias["B"][0].toDouble();
-  g_b1 = Bias["B"][1].toDouble();
-  g_b2 = Bias["B"][2].toDouble();
+  g_b0 = biasGroup["B"][0].toDouble();
+  g_b1 = biasGroup["B"][1].toDouble();
+  g_b2 = biasGroup["B"][2].toDouble();
 
 
-  g_launchTimeStr=QString(Bias["launchTime"]);
+  g_launchTimeStr=QString(biasGroup["launchTime"]);
 
   //cout << g_launchTimeStr << endl;
 
@@ -605,11 +657,15 @@ QString loadCalibrationVariables(const QString &config)  {
 
   loadNaifTiming();  // Ensure the proper kernels are loaded
 
-  scs2e_c(g_HayabusaNaifCode,g_startTime.toLatin1().data(), &obsStartTime);  
+  scs2e_c(g_hayabusaNaifCode, g_startTime.toLatin1().data(), &obsStartTime);  
   tsecs = obsStartTime - g_launchTime.Et();
-  tdays = tsecs/86400;
-  g_bias = g_b0+g_b1*tdays+g_b2*(tdays*tdays);
+  tdays = tsecs / 86400;
+  g_bias = g_b0 
+           + g_b1 * tdays 
+           + g_b2 * (tdays * tdays);
 
+#if 0
+// PSF correction is not working and is temporarily removed. 
   //g_bias = 0;
   //cout << "g_bias = "  << g_bias << endl;
 
@@ -622,7 +678,6 @@ QString loadCalibrationVariables(const QString &config)  {
 
   //Commenting out this code and making it a user parameter
   //to make it easier to try out optimum values
- #if 0
   if (psfFocused.hasKeyword("KernelSize") ) {
     g_size = psfFocused["KernelSize"];
   }
@@ -630,10 +685,6 @@ QString loadCalibrationVariables(const QString &config)  {
     g_size = 23;
   }
 
-#endif
-
-// PSF correction is not working and is temporarily removed. 
-#if 0 
   g_alpha = psfFocused[g_filter.toLower()];
 
    for (int i =0; i < g_N; i++) {
@@ -643,13 +694,10 @@ QString loadCalibrationVariables(const QString &config)  {
 #endif
 
   // Load the Solar Flux for the specific filter
-  g_solarFlux=solar[g_filter.toLower()];
-
-  // radiance = g_v_standard * g_iofScale
-  // iof      = radiance * pi *dist_au^2
+  g_solarFlux = solarFluxGroup["v"];
 
-  g_v_standard = iof["iof_standard"];
-  g_iofScale   = iof[g_filter];
+  g_radStd = radGroup["iof_standard"];
+  g_iofScale   = radGroup[g_filter];
 
   return ( calibFile.original() );
 }
@@ -661,7 +709,7 @@ QString loadCalibrationVariables(const QString &config)  {
  * @param in   Raw image and flat field
  * @param out  Radometrically corrected image
  */
-void Calibrate(vector<Buffer *>& in, vector<Buffer *>& out) {
+void calibrate(vector<Buffer *>& in, vector<Buffer *>& out) {
 
   Buffer& imageIn   = *in[0];
   Buffer& flatField = *in[1];
@@ -682,12 +730,12 @@ void Calibrate(vector<Buffer *>& in, vector<Buffer *>& out) {
 
 
   // Compute smear component here as its a constant for the entire sample
-  double t1 = g_timeRatio/imageIn.size();
+  double t1 = g_timeRatio / imageIn.size();
   double b = binning;
-  double c1(1.0);  //default if no binning
+  double c1 = 1.0;  //default if no binning
 
   if (binning > 1) {
-    c1 = 1.0/(1.0 + t1*((b -1.0)/(2.0*b) ) );
+    c1 = 1.0 / (1.0 + t1 * ((b - 1.0) / (2.0 * b) ) );
   }
 
   double smear = 0;
@@ -725,12 +773,12 @@ void Calibrate(vector<Buffer *>& in, vector<Buffer *>& out) {
     }
 
     // 2) LINEARITY Correction - always done
-    imageOut[i] = pow(imageOut[i],g_Gamma) + g_L0*imageOut[i]*exp(g_L1*imageOut[i]);
+    imageOut[i] = pow(imageOut[i], g_gamma) + g_L0 * imageOut[i] * exp(g_L1 * imageOut[i]);
 
 
     // 3) DARK Current - Currently negligible and removed
 #if 0
-      imageOut[i] = imageOut[i]-g_darkCurrent;
+      imageOut[i] = imageOut[i] - g_darkCurrent;
 #endif
 
     // 4) HOT Pixel Removal
@@ -751,7 +799,7 @@ void Calibrate(vector<Buffer *>& in, vector<Buffer *>& out) {
     // 5) READOUT Smear Removal - Not needed if on-board corrected.  Binning is
     //    accounted for in computation of c1 before loop.
     if (nsubImages <= 1) {
-      imageOut[i] = c1*(imageOut[i] - smear);
+      imageOut[i] = c1 * (imageOut[i] - smear);
     }
 
     // 6) FLATFIELD correction
@@ -764,8 +812,8 @@ void Calibrate(vector<Buffer *>& in, vector<Buffer *>& out) {
       imageOut[i] /= flatField[i];
     }
 
-    // 7) I/F or Radiance Conversion (or g_iof might = 1, in which case the output will be in DNs)
-    imageOut[i] *= g_iof;
+    // 7) I/F or Radiance Conversion (or g_calibrationScale might = 1, in which case the output will be in DNs)
+    imageOut[i] *= g_calibrationScale;
   }
   return;
 }
diff --git a/isis/src/hayabusa/apps/amicacal/amicacal.xml b/isis/src/hayabusa/apps/amicacal/amicacal.xml
index b4d795e2bdcad089fd6631e270ae18f702ca703b..2efdee260d3469b38181f6eb003aef73a1d123f1 100644
--- a/isis/src/hayabusa/apps/amicacal/amicacal.xml
+++ b/isis/src/hayabusa/apps/amicacal/amicacal.xml
@@ -522,16 +522,24 @@ xsi:noNamespaceSchemaLocation="http://isis.astrogeology.usgs.gov/Schemas/Applica
     </change>
     <change name="Kristin Berry" date="2017-02-07">
        Removed the "APPLYSMEAR" option as a user-specifiable parameter. The smear correction
-       will still be applied automatically when an image is being processed for which on-board smear 
-       correction was not applied (NSUB &lt;= 1). Also updated application code for conformity with ISIS3
-       Coding Standards. Backward Compatibility Issue: The APPLYSMEAR parameter was removed. The smear
-       correction will automatically be applied to images with 1 sub-image. 
+       will still be applied automatically when an image is being processed for which on-board 
+       smear correction was not applied (NSUB &lt;= 1). Also updated application code for 
+       conformity with ISIS3 Coding Standards. Backward Compatibility Issue: The APPLYSMEAR
+       parameter was removed. The smear correction will automatically be applied to images with
+       1 sub-image. 
     </change>
     <change name="Kristin Berry" date="2017-02-08">
-       Removed the "PSF" correction option, since the PSF correction is not yet working. Related code has been commented-
-       out rather than removed entirely so that this work can potentially be resumed at a later date. 
-       Backward Compatibility Issue: The PSF parameter was removed, since it is not yet working. 
-       amicacal cannot apply a PSF correction anymore.
+       Removed the "PSF" correction option, since the PSF correction is not yet working. Related 
+       code has been commented out rather than removed entirely so that this work can potentially
+       be resumed at a later date. Backward Compatibility Issue: The PSF parameter was removed
+       since it is not yet working. The amicacal program cannot apply a PSF correction anymore.
+    </change>
+    <change name="Jeannie Backer" date="2017-11-28 ">
+       Updated radiance calibration to divide by exposure duration, as done with reflectance. 
+       Updated amicaCalibration????.trn file with latest radiance scale factor for sz 
+       (value provided by L. LeCorre, PSI).
+       Updated to use filter V solar flux on all calculations. 
+       Brought code closer to ISIS3 coding standards. Fixes #5243
     </change>
   </history>
 
diff --git a/isis/src/hayabusa/apps/amicacal/tsts/iof/Makefile b/isis/src/hayabusa/apps/amicacal/tsts/iof/Makefile
index 87af6af201e9e6a1272f4b59826f144a48d487c8..04b9e273cf6e3ef272d2c58147f0ef0d4838ee9d 100644
--- a/isis/src/hayabusa/apps/amicacal/tsts/iof/Makefile
+++ b/isis/src/hayabusa/apps/amicacal/tsts/iof/Makefile
@@ -1,12 +1,17 @@
+# history 2017-11-28 Jeannie Backer - Updated truth data for corrected_iof_st_2459265790_w.cub.
+#                        Cube dn differences up to 0.08 difference after update of solar flux value.
+#                        (See amicacal history).  
 APPNAME = amicacal
 
 include $(ISISROOT)/make/isismake.tsts
 
 commands:
 	$(APPNAME) \
-        FROM=$(INPUT)/st_2459265790_w.cub \
-        TO=$(OUTPUT)/corrected_iof_st_2459265790_w.cub > /dev/null;\
-        $(APPNAME) \
-        FROM=$(INPUT)/st_2459265790_w.cub \
-        TO=$(OUTPUT)/corrected_noiof_st_2459265790_w.cub \
-        units=dn > /dev/null;
+	    FROM=$(INPUT)/st_2459265790_w.cub \
+	    TO=$(OUTPUT)/corrected_iof_st_2459265790_w.cub \
+	    > /dev/null;
+	$(APPNAME) \
+	    FROM=$(INPUT)/st_2459265790_w.cub \
+	    TO=$(OUTPUT)/corrected_noiof_st_2459265790_w.cub \
+	    units=dn \
+	    > /dev/null;
diff --git a/isis/src/hayabusa/apps/amicacal/tsts/nullpolarpix/Makefile b/isis/src/hayabusa/apps/amicacal/tsts/nullpolarpix/Makefile
index af01484f08c354ffcaedfe82e47d0688ee8c89bf..9a982b7dfdc97259a207bbe8f98abcac6ee69ad0 100644
--- a/isis/src/hayabusa/apps/amicacal/tsts/nullpolarpix/Makefile
+++ b/isis/src/hayabusa/apps/amicacal/tsts/nullpolarpix/Makefile
@@ -1,12 +1,19 @@
+# history 2017-11-28 Jeannie Backer - Updated truth data for 
+#                        corrected_polarpixnulled_st_2459265790_w.cub.
+#                        and corrected_polarpixnotnulled_st_2459265790_w.cub.
+#                        Cube dn differences up to 0.08 difference after update of solar flux value.
+#                        (See amicacal history).
 APPNAME = amicacal
 
 include $(ISISROOT)/make/isismake.tsts
 
 commands:
 	$(APPNAME) \
-        FROM=$(INPUT)/st_2459265790_w.cub \
-        TO=$(OUTPUT)/corrected_polarpixnulled_st_2459265790_w.cub >/dev/null;\
-        $(APPNAME) \
-        FROM=$(INPUT)/st_2459265790_w.cub \
-        TO=$(OUTPUT)/corrected_polarpixnotnulled_st_2459265790_w.cub \
-        nullpolarpix=no > /dev/null;
+	    FROM=$(INPUT)/st_2459265790_w.cub \
+	    TO=$(OUTPUT)/corrected_polarpixnulled_st_2459265790_w.cub \
+	    >/dev/null;
+	$(APPNAME) \
+	    FROM=$(INPUT)/st_2459265790_w.cub \
+	    TO=$(OUTPUT)/corrected_polarpixnotnulled_st_2459265790_w.cub \
+	    nullpolarpix=no \
+	    > /dev/null;
diff --git a/isis/src/hayabusa/apps/amicacal/tsts/smearCorrection/Makefile b/isis/src/hayabusa/apps/amicacal/tsts/smearCorrection/Makefile
index ad1af965f6d5dae6130e1218695891cb2bbdd593..0753d698da736307317fe7361393ecdca1240f6b 100644
--- a/isis/src/hayabusa/apps/amicacal/tsts/smearCorrection/Makefile
+++ b/isis/src/hayabusa/apps/amicacal/tsts/smearCorrection/Makefile
@@ -1,3 +1,7 @@
+# history 2017-11-28 Jeannie Backer - Updated truth data for 
+#                        notSmearCorrected_nsubimages2_st_2433548889_w.cub.
+#                        Cube dn differences up to 0.06 difference after update of solar flux value.
+#                        (See amicacal history).  
 APPNAME = amicacal
 
 include $(ISISROOT)/make/isismake.tsts
@@ -5,13 +9,15 @@ include $(ISISROOT)/make/isismake.tsts
 commands:
 	# Test application of smear removal for SubImageCount = 1
 	$(APPNAME) \
-	FROM=$(INPUT)/st_2539482843_v.cub \
-	TO=$(OUTPUT)/smearCorrected_nsubimages1_st_2539482843_v.cub.cub \
-	nullpolarpix=no > /dev/null;
+	    FROM=$(INPUT)/st_2539482843_v.cub \
+	    TO=$(OUTPUT)/smearCorrected_nsubimages1_st_2539482843_v.cub.cub \
+	    nullpolarpix=no \
+	    > /dev/null;
 
 	# Test NON-application of smear removal for SubImageCount = 2
 	$(APPNAME) \
-	FROM=$(INPUT)/st_2433548889_w.cub \
-	TO=$(OUTPUT)/notSmearCorrected_nsubimages2_st_2433548889_w.cub \
-	nullpolarpix=no >/dev/null;\
+	    FROM=$(INPUT)/st_2433548889_w.cub \
+	    TO=$(OUTPUT)/notSmearCorrected_nsubimages2_st_2433548889_w.cub \
+	    nullpolarpix=no \
+	    >/dev/null;\
 
diff --git a/isis/src/hayabusa2/apps/hyb2onccal/hyb2onccal.xml b/isis/src/hayabusa2/apps/hyb2onccal/hyb2onccal.xml
index caebb06edc1f6b7533e38519e9cc52a46705e1eb..05f0df1f76199992252ad4d8ecb0c292c2128338 100644
--- a/isis/src/hayabusa2/apps/hyb2onccal/hyb2onccal.xml
+++ b/isis/src/hayabusa2/apps/hyb2onccal/hyb2onccal.xml
@@ -257,7 +257,7 @@ values for each band for Hayabusa2 ONC.
   </description>
 
   <category>
-    <missionItem>Hayabusa</missionItem>
+    <missionItem>Hayabusa2</missionItem>
   </category>
 
   <seeAlso>
diff --git a/isis/src/kaguya/apps/mimap2isis/mimap2isis.cpp b/isis/src/kaguya/apps/mimap2isis/mimap2isis.cpp
index 82a8bccf1edfc5975dc71acfcd76bd61aa0416d3..1387b20b9aa589f14d59779efd2da16adf47c2f9 100644
--- a/isis/src/kaguya/apps/mimap2isis/mimap2isis.cpp
+++ b/isis/src/kaguya/apps/mimap2isis/mimap2isis.cpp
@@ -31,7 +31,7 @@ void IsisMain() {
   FileName tempFileName = FileName::createTempFile("TEMPORARYlabel.pvl").name();
   QString fn(tempFileName.expanded());
   label.write(fn);
-  p.SetPdsFile(fn, labelFile, label);
+  p.SetPdsFile(label, labelFile);
   QFile::remove(fn);
 
   Cube *ocube = p.SetOutputCube("TO");
diff --git a/isis/src/kaguya/apps/mimap2isis/mimap2isis.xml b/isis/src/kaguya/apps/mimap2isis/mimap2isis.xml
index ea049261028ab00bb7ef826e01368a2640d20e04..79322f2a3686ed938a065cba63c899e3d61bac53 100644
--- a/isis/src/kaguya/apps/mimap2isis/mimap2isis.xml
+++ b/isis/src/kaguya/apps/mimap2isis/mimap2isis.xml
@@ -91,6 +91,10 @@
       Added conditional to check whether default offsets and multipliers where changed from their
       default values and log them if so.
     </change>
+    <change name="Christopher Combs" date ="2018-01-19">
+      Changed call to SetPdsFile to reflect changes to PvlToPvlTranslationManager. Fixes #4345, 
+      #4421.
+    </change>
   </history>
 
   <category>
diff --git a/isis/src/messenger/apps/mdis2isis/mdis2isis.xml b/isis/src/messenger/apps/mdis2isis/mdis2isis.xml
index 58f7a05d3873dc0339b5bc5a3db34205330f645e..39b03e22dd27ccd1e098e5efab2658ce73d0de2f 100644
--- a/isis/src/messenger/apps/mdis2isis/mdis2isis.xml
+++ b/isis/src/messenger/apps/mdis2isis/mdis2isis.xml
@@ -3,27 +3,28 @@
 
 <application name="mdis2isis" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://isis.astrogeology.usgs.gov/Schemas/Application/application.xsd">
   <brief>
-    Import MESSENGER/MIDS EDR/RDR products into ISIS cubes
+    Import MESSENGER/MDIS EDR/RDR products into ISIS cubes
   </brief>
 
   <description>
     <p>
-       mdis2isis converts PDS labelled MESSENGER/MDIS EDRs to ISIS labels.
-      MDIS has a narrow angle camera (MDIS-NAC) and a wide angel camera (MDIS-WAC)
-      with twelve filters.  This application will convert all these observations to ISIS format.
-      The resulting ISIS cubes are ready for SPICE initialization and projection.
+      This program, mdis2isis, converts PDS-labelled Mercury Dual Imaging (MDIS)
+      Experiment Data Records (EDRs) or Reduced Data Records (RDR) to ISIS labels.
+      MDIS has a narrow angle camera (NAC) and a wide angle camera (WAC)
+      with twelve filters. These observations, using mdis2isis, are converted to
+      ISIS format, and the resulting ISIS cubes are ready for SPICE initialization and projection.
     </p>
     <p>
-      Some of the images are compressed onboard the spacecraft.  When this is 
-      detected, they are unlutted and each DN is converted to its precompressed 
-      12-bit DN value.  All output files are created in floating point DN 
-      format.
+      Some MDIS-images are compressed onboard the spacecraft.  When such
+      compression is detected by mdis2isis, each DN is converted to its
+      pre-compressed, 12-bit DN value using the original Lookup Table (LUT).
+      All output files are created in floating point DN format.
     </p>
     <p>
-      There are DN limits that are imposed on the output pixel.  For the NAC 
-      instrument, the valid range is 0 &lt; DN &lt; 3400.  The limit for the WAC 
-      is 0 &lt; DN &lt; 3600.  For both instruments, 0 values are mapped to the 
-      NULL special pixel value.  And values that exceed the maximum are set to 
+      There are DN limits that are imposed on the output pixel.  For the NAC
+      instrument, the valid range is 0 &lt; DN &lt; 3400.  The limit for the WAC
+      is 0 &lt; DN &lt; 3600.  For both instruments, 0 values are mapped to the
+      NULL special pixel value.  Values that exceed the maximum are set to
       the HIS (high instrument saturation) special pixel value.
     </p>
   </description>
@@ -40,43 +41,46 @@
         Added appTest
     </change>
     <change name="Steven Lambright" date="2007-12-10">
-        Added lookup table capabilities
+        Added Lookup Table capabilities
     </change>
     <change name="Steven Lambright" date="2007-12-11">
         Fixed problem where labels went outside the IsisCube object
     </change>
     <change name="Kris Becker" date="2008-01-19">
-        Added validation of filter number here.  The number in the label is 
-        unreliable and requires validation as filter identification is critical 
-        in calibration and camera model (at a minimum).    If it cannot be 
-        determined, the number is set to "Unknown" which renders the file 
+        Added validation of filter number here.  The number in the label is
+        unreliable and requires validation as filter identification is critical
+        in calibration and camera model (at a minimum).    If it cannot be
+        determined, the number is set to "Unknown" which renders the file
         unusable for calibration and geometric operations.
     </change>
     <change name="Christopher Austin" date="2008-03-18">
       Checks if input file is rdr.
     </change>
     <change name="Steven Lambright" date="2008-05-13">
-      Removed references to CubeInfo 
+      Removed references to CubeInfo
     </change>
     <change name="Kris Becker" date="2008-09-03">
-       Reworked the lut inversion implementation to use a different dn table 
-       source.  This altered the resulting DNs a bit.  Also instituted DN limits 
-       for low (0) and high saturation levels for WAC (3600) and NAC (3400).  DN 
-       values that exceed these maximums are set to NULL and HIS (High 
-       Instrument Saturation), respectively.  Started the SOURCE_PRODUCT_ID 
+       Reworked the lut inversion implementation to use a different dn table
+       source.  This altered the resulting DNs a bit.  Also instituted DN limits
+       for low (0) and high saturation levels for WAC (3600) and NAC (3400).  DN
+       values that exceed these maximums are set to NULL and HIS (High
+       Instrument Saturation), respectively.  Started the SOURCE_PRODUCT_ID
        pedigree  chain.
     </change>
     <change name="Steven Lambright" date="2009-12-29">
       Now looking for mdisCalibration????.trn in $messenger/calibration instead of
       $messenger/translations
     </change>
-      <change name="Kris Becker" date="2011-06-15">
-          Added YearDoy keyword to the Archive group. The format is a valid 
-          numerical value.  This value is created from the StartTime, 
-          multiplying the year by 1000 and adding the day-of-year ; added the 
-          OrbitNumber keyword to the translation tables for inclusion in the 
-          Archive group. 
-      </change>
+    <change name="Kris Becker" date="2011-06-15">
+        Added YearDoy keyword to the Archive group. The format is a valid
+        numerical value.  This value is created from the StartTime,
+        multiplying the year by 1000 and adding the day-of-year ; added the
+        OrbitNumber keyword to the translation tables for inclusion in the
+        Archive group.
+    </change>
+    <change name="Kaitlyn Lee" date="2018-01-17">
+        Reworded application description to make it more understandable.
+    </change>
   </history>
 
   <groups>
@@ -104,8 +108,8 @@
         </brief>
         <description>
           Output file converted from PDS EDR format to ISIS.  This ISIS file will have all the
-          information transferred from the PDS EDR file that is necessary to 
-          initialize for geometric processing (see spiceinit, cam2map, etc...).
+          information transferred from the PDS EDR file that is necessary to
+          initialize for geometric processing (see spiceinit, cam2map, etc).
         </description>
         <filter>
           *.cub
@@ -118,20 +122,21 @@
             <type>string</type>
             <brief>Provide observation target if not in EDR</brief>
             <description>
-                This parameter may be necessary as some EDR labels do not adequately defined
-                the TARGET_NAME keyword in the labels.  Messenger takes a very long trip to 
+                This parameter may be necessary as some EDR labels do not adequately define
+                the TARGET_NAME keyword in the labels.  Messenger takes a very long trip to
                 finally arrive at Mercury orbit in 2011.  During cruise, many flybys occur.  The
                 proper specification of the TARGET_NAME is critical to valid instantiation of
-                ISIS camera models.  
+                ISIS camera models.
 
-                At the time of the original writing of this application, NULL was a frequently
-                occuring value of the TARGET_NAME keyword even for flyby encounters.
-                This keyword allows one to specify the observed body explicitiy for these cases.
+                When this application was originally written, NULL was a frequently
+                occurring value of the TARGET_NAME keyword even for flyby encounters.
+                This keyword allows one to specify the observed body,
+                as many flybys occurred, explicitly for these cases.
 
                 The default is to honor the value in the EDR label as it is anticipated this will be
                 corrected in subsequent EDR generation.
             </description>
-            <internalDefault>Label Value</internalDefault> 
+            <internalDefault>Label Value</internalDefault>
         </parameter>
       <parameter name="UNLUT">
         <type>boolean</type>
@@ -139,8 +144,8 @@
           Convert 8-bit values to 12-bit values
         </brief>
         <description>
-          If this is set to true, and the input cube is lutted, a lookup table 
-          will be used to convert the original DN values to their original 
+          If this is set to true, and the input cube is lutted, a Lookup Table
+          will be used to convert the original DN values to their original
           12-bit values. This must be set to true for calibration.
         </description>
         <default>
diff --git a/isis/src/mro/objs/HiLab/unitTest.cpp b/isis/src/mro/objs/HiLab/unitTest.cpp
index 6e15bd49d31852d794515aa1f9f62f7a857fb055..1e4ced6e9f1714b145c660820678fd9568112c9d 100644
--- a/isis/src/mro/objs/HiLab/unitTest.cpp
+++ b/isis/src/mro/objs/HiLab/unitTest.cpp
@@ -11,7 +11,7 @@ int main() {
 
   //create a dummy Isis::Progress object
   Cube cube;
-  cube.open("red3Test.cub");
+  cube.open("$mro/testData/HiLab/red3Test.cub");
 
   cout << "Testing constructor ...\n";
   HiLab hiLab(&cube);
diff --git a/isis/src/qisis/apps/qview/qview.cpp b/isis/src/qisis/apps/qview/qview.cpp
index 8f6c42f81cf4a7d003be73d324890a3d6a7f2501..95253f46c577b247fe09fe950cab6f20c2428e61 100644
--- a/isis/src/qisis/apps/qview/qview.cpp
+++ b/isis/src/qisis/apps/qview/qview.cpp
@@ -196,7 +196,12 @@ int main(int argc, char *argv[]) {
   for (int i = 1; i < argc; i++) {
     if (i != newWindow) {
       try {
-        vw->workspace()->addCubeViewport(QString(argv[i]));
+        QString arg(argv[i]);
+        if (arg.startsWith("-pref")) {
+            i++;
+            continue;
+        }
+        vw->workspace()->addCubeViewport(arg);
         openingAFileSucceeded = true;
       }
       catch (IException &e) {
diff --git a/isis/src/qisis/objs/AdvancedTrackTool/AdvancedTrackTool.cpp b/isis/src/qisis/objs/AdvancedTrackTool/AdvancedTrackTool.cpp
index 8e006acd6a3e50b5baba087afc89af5d87964d0b..1621d71a3f8a3bfabd2a8d3319f77ed48c2cb09c 100644
--- a/isis/src/qisis/objs/AdvancedTrackTool/AdvancedTrackTool.cpp
+++ b/isis/src/qisis/objs/AdvancedTrackTool/AdvancedTrackTool.cpp
@@ -422,7 +422,7 @@ namespace Isis {
         else { // spacecraft azimuth is null
           p_tableWin->table()->item(row, SPACECRAFT_AZIMUTH)->setText("");
         }
-        
+
         // Write out columns solar lon, slant distance, local solar time
         double solarLon = cvp->camera()->solarLongitude().degrees();
         p_tableWin->table()->item(row, SOLAR_LON)->setText(QString::number(solarLon));
@@ -431,7 +431,7 @@ namespace Isis {
         double lst = cvp->camera()->LocalSolarTime();
         p_tableWin->table()->item(row, SOLAR_TIME)->setText(QString::number(lst));
       } // end if set image succeeds
-      
+
       // Always write out the x/y/z of the undistorted focal plane
       CameraDistortionMap *distortedMap = cvp->camera()->DistortionMap();
       double undistortedFocalPlaneX = distortedMap->UndistortedFocalPlaneX();
@@ -566,9 +566,9 @@ namespace Isis {
       int piSample, int &piOrigin, QString &psSrcFileName,
       QString &psSrcSerialNum) {
       try {
-        Cube *cCube = cvp->cube(); 
+        Cube *cCube = cvp->cube();
         int iTrackBand = -1;
-        
+
         if(cCube->hasTable(TABLE_MOSAIC_SRC)) {
           Pvl *cPvl = cCube->label();
           PvlObject cObjIsisCube = cPvl->findObject("IsisCube");
@@ -582,7 +582,7 @@ namespace Isis {
               }
             }
           }
-          
+
           if(iTrackBand > 0 && iTrackBand <= cCube->bandCount()) {
             Portal cOrgPortal(cCube->sampleCount(), 1,
                               cCube->pixelType());
@@ -593,16 +593,16 @@ namespace Isis {
               case 1:
                 piOrigin -= VALID_MIN1;
                 break;
-                
+
               case 2:
                 piOrigin -= VALID_MIN2;
                 break;
-                
+
               case 4:
                 piOrigin -= FLOAT_MIN;
                 break;
             }
-            
+
             // Get the input file name and serial number
             Table cFileTable(TABLE_MOSAIC_SRC);
             cCube->read(cFileTable);
@@ -613,11 +613,11 @@ namespace Isis {
             }
           }
         }
-      } 
+      }
       catch (IException &e) {
           QMessageBox::warning((QWidget *)parent(), "Warning", e.toString());
       }
-      
+
   }
 
 
@@ -673,7 +673,7 @@ namespace Isis {
       connect(okButton, SIGNAL(clicked()), helpDialog, SLOT(accept()));
   }
 
-  
+
   /**
    * This method records data to the current row.
    *
@@ -686,7 +686,9 @@ namespace Isis {
     p_tableWin->setCurrentRow(p_tableWin->currentRow() + p_numRows);
     p_tableWin->setCurrentIndex(p_tableWin->currentIndex() + p_numRows);
     while(p_tableWin->currentRow() >= p_tableWin->table()->rowCount()) {
+
       row = p_tableWin->table()->rowCount();
+
       p_tableWin->table()->insertRow(row);
       for(int c = 0; c < p_tableWin->table()->columnCount(); c++) {
         QTableWidgetItem *item = new QTableWidgetItem("");
@@ -717,14 +719,17 @@ namespace Isis {
    *           added to be connected to the FindTool recordPoint()
    *           signal in qview.
    *  @history 2010-05-07 - Eric Hyer - Now shows the table as well
+   *  @history 2017-11-13 - Adam Goins - Made the call to showTable() first
+   *                            So that the table draws the recorded point if
+   *                            the point is the first point record. Fixes #5143.
    */
   void AdvancedTrackTool::record(QPoint p) {
+    p_tableWin->showTable();
     updateRow(p);
     record();
-    p_tableWin->showTable();
   }
 
-  
+
   /**
    * This method updates the record ID.
    *
@@ -756,13 +761,13 @@ namespace Isis {
    *   close, so you should call this any time you change the preserved state.
    */
   void AdvancedTrackTool::writeSettings() {
-    
+
     QSettings settings(settingsFilePath(), QSettings::NativeFormat);
-  
+
     settings.setValue("showHelpOnStart", m_showHelpOnStart);
   }
 
-  
+
   /**
    * Generate the correct path for the config file.
    *
@@ -775,10 +780,10 @@ namespace Isis {
           "application name before using the Isis::MainWindow class. Window "
           "state and geometry can not be saved and restored", _FILEINFO_);
     }
-    
+
     FileName config(FileName("$HOME/.Isis/" + QApplication::applicationName() + "/").path() + "/" +
                     "advancedTrackTool.config");
-    
+
     return config.expanded();
   }
 }
diff --git a/isis/src/qisis/objs/AdvancedTrackTool/AdvancedTrackTool.h b/isis/src/qisis/objs/AdvancedTrackTool/AdvancedTrackTool.h
index f208450423e1a869f898f9ff6f320c6f6003c5b0..a684ad8481ae034424cef33c9468806830ec82b6 100644
--- a/isis/src/qisis/objs/AdvancedTrackTool/AdvancedTrackTool.h
+++ b/isis/src/qisis/objs/AdvancedTrackTool/AdvancedTrackTool.h
@@ -47,7 +47,7 @@ namespace Isis {
    *  @history 2008-10-14 Noah Hilt - Added Projected X and Y values to the table.
    *  @history 2008-10-17 Noah Hilt - Added tooltips to certain items in the table
    *                          that did not have descriptive names.
-   *  @history 2010-02-17 Sharmila Prasad -Added the attributes TRACK_MOSAIC_INDEX, 
+   *  @history 2010-02-17 Sharmila Prasad -Added the attributes TRACK_MOSAIC_INDEX,
    *                          TRACK_MOSAIC_FILENAME, TRACK_MOSAIC_SERIAL_NUM to track
    *                          mosaic origin
    *  @history 2010-03-08 Jeannie Walldren - Added record() slot to be able to record a
@@ -61,7 +61,7 @@ namespace Isis {
    *                          the menu bar and a help dialog that displays when the
    *                          tool is opened the first time and when the user opens
    *                          it through the help menu. Fixes #772.
-   *  @history 2012-07-06 Debbie A. Cook, Updated Spice members to be more compliant with Isis 
+   *  @history 2012-07-06 Debbie A. Cook, Updated Spice members to be more compliant with Isis
    *                          coding standards. References #972.
    *  @history 2012-11-30 Debbie A. Cook - Changed to use TProjection instead of Projection.
    *                          References #775.
@@ -71,13 +71,17 @@ namespace Isis {
    *  @history 2014-06-17 Jeannie Backer - Modified to print set value to empty strings for
    *                          photometric angles, azimuths, resolutions if not valid.
    *                          References #1659.
-   *  @history 2015-05-13 Makayla Shepherd - Modified to improve handling of 
+   *  @history 2015-05-13 Makayla Shepherd - Modified to improve handling of
    *                          undefined slot behavior. References #2210.
-   *  @history 2015-06-19 Makayla Shepherd - Added distorted Focal Plane and undistorted 
+   *  @history 2015-06-19 Makayla Shepherd - Added distorted Focal Plane and undistorted
    *                          Focal Plane to the table. References #1953.
    *  @history 2015-12-21 Makayla Shepherd - Changed the ordering of the enum to match the order
-   *                          of when the columns are added, in order to fix the incidence and 
+   *                          of when the columns are added, in order to fix the incidence and
    *                          emission angle columns from reporting incorrect numbers. Fixes #2381.
+   *  @history 2017-11-13 Adam Goins - Updated the record(QPoint p) function to call showTable()
+   *                          before it attempts to record a point so that a table is created
+   *                          to record the point into so that the first recorded point is drawn.
+   *                          Fixes #5143.
    */
   class AdvancedTrackTool : public Tool {
       Q_OBJECT
@@ -118,7 +122,7 @@ namespace Isis {
       void readSettings();
       void writeSettings();
       QString settingsFilePath() const;
-      
+
       /**
        * Enum for column values
        */
diff --git a/isis/src/qisis/objs/ConcurrentControlNetReader/ConcurrentControlNetReader.h b/isis/src/qisis/objs/ConcurrentControlNetReader/ConcurrentControlNetReader.h
index fa52cf9da5f7712b9394decf819ab8c11d650b90..697872e584c76e5956cbc27a3daa51ce82fbe8b5 100644
--- a/isis/src/qisis/objs/ConcurrentControlNetReader/ConcurrentControlNetReader.h
+++ b/isis/src/qisis/objs/ConcurrentControlNetReader/ConcurrentControlNetReader.h
@@ -29,7 +29,6 @@
 #include <QString>
 #include <QStringList>
 
-#include "ControlNetFile.h"
 #include "ProgressBar.h"
 
 template<typename A> class QAtomicPointer;
@@ -48,12 +47,12 @@ namespace Isis {
    * This class provides progress for reading a ControlNet.  Reading is done
    * in separate threads using QtConcurrent.  When reading large Pvl networks
    * the progress will hang at zero percent for a while.
-   * 
+   *
    * @author 2012-06-11 Ken Edmundson, Steven Lambright
    *
    * @internal
-   *   @history 2017-08-09 Summer Stapleton - Added a try-catch block to handle invalid control 
-   *                         networks. Fixes #5068.
+   *   @history 2017-08-09 Summer Stapleton - Added a try-catch block to handle invalid control
+   *                          networks. Fixes #5068.
    */
   class ConcurrentControlNetReader : public QObject {
       Q_OBJECT
diff --git a/isis/src/qisis/objs/Directory/RemoveImagesWorkOrder.cpp b/isis/src/qisis/objs/Directory/RemoveImagesWorkOrder.cpp
index 224da1b41c84b6023d8f0e79341b76a68e1a7c62..af6941d4d797cc347a9058e2a75dbce75ed7686c 100644
--- a/isis/src/qisis/objs/Directory/RemoveImagesWorkOrder.cpp
+++ b/isis/src/qisis/objs/Directory/RemoveImagesWorkOrder.cpp
@@ -37,8 +37,13 @@ namespace Isis {
   RemoveImagesWorkOrder::RemoveImagesWorkOrder(Project *project) :  WorkOrder(project) {
 
     m_isUndoable = false;
+<<<<<<< HEAD
     QAction::setText(tr("&Delete images from project..."));
     QUndoCommand::setText(tr("Delete images from project"));
+=======
+
+    QAction::setText("&Delete images from project...");
+>>>>>>> dev
 
     setModifiesDiskState(true);
   }
@@ -76,11 +81,52 @@ namespace Isis {
    * @description Set up the execution.
    *
    * @return bool True if parent WordOrder can set up the execution.
+<<<<<<< HEAD
    * 
+=======
+   *
+>>>>>>> dev
    */
   bool RemoveImagesWorkOrder::setupExecution() {
 
     bool success = WorkOrder::setupExecution();
+
+    QList<ProjectItem *> selectedItems = project()->directory()->model()->selectedItems();
+    long itemCount = selectedItems.count();
+    if (itemCount == 1) {
+      if (selectedItems.at(0)->isImage()) {
+        QUndoCommand::setText("&Delete image " + selectedItems.at(0)->image()->fileName() + " from project...");
+      }
+      else if (selectedItems.at(0)->isImageList()) {
+        QUndoCommand::setText("&Delete " + QString::number(selectedItems.at(0)->imageList()->count(), 10) + " images from project...");
+      }
+    }
+    else {
+      long totalCount = 0;
+      QList<ImageList *> imageListAdded;
+      ImageList images;
+      foreach(ProjectItem *item, selectedItems) {
+        if (item->isImage()) {
+          totalCount++;
+          images.append(item->image());
+        }
+        else if (item->isImageList()) {
+          totalCount += item->imageList()->count();
+          imageListAdded.append(item->imageList());
+        }
+      }
+      // this is needed to be able to get a correct count when a user selects an image and
+      // the imagelist containing that image
+      foreach (ImageList *imageList, imageListAdded) {
+        foreach (Image *image, images) {
+          if (imageList->contains(image)) {
+            totalCount--;
+          }
+        }
+      }
+        QUndoCommand::setText("&Delete " + QString::number(totalCount, 10) + " images from project...");
+    }
+
     return success;
     //TODO: 2016-07-29 TLS Should I ask if files should be deleted from disk also?
   }
@@ -88,26 +134,51 @@ namespace Isis {
 
   /**
    * @description Remove any selected items from the project directory.
+<<<<<<< HEAD
    * 
    * @internal
    *   @history 2017-08-08 Marjorie Hahn - Created a conditional to check if the currently 
    *                           selected item to be deleted is actually an image list, so that
    *                           each image can be removed one by one. Fixes #5074.
+=======
+   *
+   * @internal
+   *   @history 2017-08-08 Marjorie Hahn - Created a conditional to check if the currently
+   *                           selected item to be deleted is actually an image list, so that
+   *                           each image can be removed one by one. Fixes #5074.
+   *   @history 2017-10-04 Cole Neubauer - Moved ImageList to its own loop so images are deleted
+   *                           first and we avoid the issue of attempting to delete an image that
+   *                           is gone
+>>>>>>> dev
    */
   void RemoveImagesWorkOrder::execute() {
 
     QList<ProjectItem *> selectedItems = project()->directory()->model()->selectedItems();
+<<<<<<< HEAD
     QList<ImageList *> projectImageLists = project()->images();
 
     foreach (ProjectItem *selectedItem, selectedItems) {
       
       if (selectedItem->isImage()) {
         Image *selectedImage = selectedItem->image();
+=======
+    QList<ProjectItem *> needToRemoveItems;
+
+
+    QList<ImageList *> projectImageLists = project()->images();
+    QList<ImageList *> imageListToProcess;
+    foreach (ProjectItem *selectedItem, selectedItems) {
+      if (selectedItem->isImage()) {
+        Image *selectedImage = selectedItem->image();
+        project()->directory()->model()->removeItem(selectedItem);
+        
+>>>>>>> dev
         foreach (ImageList* projectImageList, projectImageLists) {
           projectImageList->removeAll(selectedImage);
         }
       }
       else if (selectedItem->isImageList()) {
+<<<<<<< HEAD
         ImageList *selectedImageList = selectedItem->imageList();
         foreach (Image *selectedImage, *selectedImageList) {
           foreach (ImageList* projectImageList, projectImageLists) {
@@ -124,6 +195,27 @@ namespace Isis {
     }
     
     project()->directory()->model()->removeItems(selectedItems);
+=======
+        imageListToProcess.append(selectedItem->imageList());
+        needToRemoveItems.append(selectedItem);
+      }
+      else {
+        throw IException(IException::User,
+                         "Item cannot be removed from the project.",
+                         _FILEINFO_);
+      }
+    }
+    foreach(ImageList *imageList, imageListToProcess) {
+      foreach (Image *selectedImage, *imageList) {
+        foreach (ImageList* projectImageList, projectImageLists) {
+          projectImageList->removeAll(selectedImage);
+        }
+      }
+      project()->removeImages(*imageList);
+    }
+
+    project()->directory()->model()->removeItems(needToRemoveItems);
+>>>>>>> dev
     project()->setClean(false);
   }
 }
diff --git a/isis/src/qisis/objs/Directory/RemoveImagesWorkOrder.h b/isis/src/qisis/objs/Directory/RemoveImagesWorkOrder.h
index b18a44999c6f5c47ae4f24688d16a18ceb02ce2f..ee9727f71514a2fd78a8c545a15d195232bcb3dc 100644
--- a/isis/src/qisis/objs/Directory/RemoveImagesWorkOrder.h
+++ b/isis/src/qisis/objs/Directory/RemoveImagesWorkOrder.h
@@ -46,6 +46,7 @@ namespace Isis {
    *                           each image can be removed one by one. Fixes #5074.
    *   @history 2017-08-11 Cole Neubauer - Removed isUndoable and set parent member variable
    *                          Fixes #5064
+   *   @history 2017-10-01 Cole Neubauer - Reimplemented remove images count Fixes #4998
    */
   class RemoveImagesWorkOrder : public WorkOrder {
       Q_OBJECT
diff --git a/isis/src/qisis/objs/FeatureNomenclature/FeatureNomenclature.cpp b/isis/src/qisis/objs/FeatureNomenclature/FeatureNomenclature.cpp
index a1689c855affeacc7bad82e92050b8fd3535d24e..3ae8c6aaf2ea20b3c9c48d2ee2246d1f075484b8 100644
--- a/isis/src/qisis/objs/FeatureNomenclature/FeatureNomenclature.cpp
+++ b/isis/src/qisis/objs/FeatureNomenclature/FeatureNomenclature.cpp
@@ -22,7 +22,7 @@
 #include "Longitude.h"
 
 namespace Isis {
-  
+
   /**
    * Instantiate a feature nomenclature. This prepares to make network requests.
    */
@@ -37,7 +37,7 @@ namespace Isis {
 
     m_request = new QNetworkRequest;
     m_request->setUrl(
-        QUrl("http://planetarynames.wr.usgs.gov/nomenclature/SearchResults"));
+        QUrl("https://planetarynames.wr.usgs.gov/nomenclature/SearchResults"));
     m_request->setRawHeader("User-Agent",
                             "Mozilla/5.0 (X11; Linux i686; rv:6.0) "
                             "Gecko/20100101 Firefox/6.0");
@@ -85,7 +85,7 @@ namespace Isis {
     m_features = NULL;
   }
 
-  
+
    /**
    * Makes sure the longitudinal ranges are correct. If the range intersects with the 0 line the
    *   range is split into two ranges, the minimum to 360 and 0 to the maximum. Then it runs a
@@ -100,19 +100,19 @@ namespace Isis {
   void FeatureNomenclature::queryFeatures(QString target,
                                           Latitude startLat, Longitude startLon,
                                           Latitude endLat, Longitude endLon) {
-    
+
     QList< QPair<Longitude, Longitude> > range = Longitude::to360Range(startLon, endLon);
 
     if (!range.isEmpty()) {
       startLon = range[0].first;
       endLon = range[0].second;
     }
-      
+
     if (range.size() > 1) {
 
       Longitude startLon2 = range[1].first;
       Longitude endLon2 = range[1].second;
-      
+
       runQuery(target, startLat, startLon, endLat, endLon);
       runQuery(target, startLat, startLon2, endLat, endLon2);
 
@@ -120,7 +120,7 @@ namespace Isis {
     }
     else {
       runQuery(target, startLat, startLon, endLat, endLon);
-      
+
       m_lastQuery = true;
     }
   }
@@ -454,7 +454,7 @@ namespace Isis {
 
     if (nameString != cleanNameString)
       displayNameString = nameString + " (" + cleanNameString + ")";
-    
+
     return displayNameString;
   }
 
@@ -741,7 +741,7 @@ namespace Isis {
     return m_approvalStatus;
   }
 
-  
+
   /**
    * Swap the member data of this feature with another feature.
    *
@@ -750,7 +750,7 @@ namespace Isis {
   void FeatureNomenclature::Feature::swap(Feature &other) {
     std::swap(m_xmlRepresenation, other.m_xmlRepresenation);
     std::swap(m_approvalStatus, other.m_approvalStatus);
-    
+
   }
 
 
@@ -786,7 +786,7 @@ namespace Isis {
       if (nodes.count())
         text = nodes.at(0).toElement().text().trimmed();
     }
-    
+
     return text;
   }
 
@@ -817,6 +817,12 @@ namespace Isis {
           }
         }
       }
+      else if (reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() == 301) {
+        IString msg = "The URL has been permanently moved to " +
+                      reply->attribute(QNetworkRequest::RedirectionTargetAttribute)
+                      .toUrl().toString();
+        throw IException(IException::Programmer, msg, _FILEINFO_);
+      }
       else {
       QMessageBox::warning(NULL, "Failed to read nomenclature database result",
                            "An error occurred when parsing the data sent back "
@@ -853,7 +859,7 @@ namespace Isis {
    */
   void FeatureNomenclature::readSearchResults(QDomElement xmlSearchResults) {
     ASSERT(xmlSearchResults.tagName() == "searchresults");
-    
+
     if (!m_features)
       m_features = new QList<Feature>;
 
@@ -864,7 +870,7 @@ namespace Isis {
       QString approvalID = element.childNodes().item(15).toElement().attribute("id");
 
       if (element.tagName() == "feature") {
-        
+
         if(approvalID == "5") {
            m_statusApproval = Approved;
         }
@@ -883,7 +889,7 @@ namespace Isis {
     }
   }
 
-  
+
    /**
    * Query the nomenclature database for features inside the given range on the
    *   target. When the last query for the cube is done, featuresIdentified()
@@ -957,6 +963,6 @@ namespace Isis {
     formQuery.addQueryItem("southernLatitude",
                                  QString::number(startLat.degrees()));
 
-    m_networkMgr->post(*m_request, formQuery.query(QUrl::FullyEncoded).toUtf8()); 
+    m_networkMgr->post(*m_request, formQuery.query(QUrl::FullyEncoded).toUtf8());
   }
 }
diff --git a/isis/src/qisis/objs/FeatureNomenclature/FeatureNomenclature.h b/isis/src/qisis/objs/FeatureNomenclature/FeatureNomenclature.h
index cf1956cbc83e0e013509b6cf3be57d8792a34f23..0ddaabac680f47546155d1e8c104ec640e3c4516 100644
--- a/isis/src/qisis/objs/FeatureNomenclature/FeatureNomenclature.h
+++ b/isis/src/qisis/objs/FeatureNomenclature/FeatureNomenclature.h
@@ -44,6 +44,9 @@ namespace Isis {
    *                           1) queryFeatures(), which makes sure the longitude range is between
    *                           0 and 360 and that it is in the 360 domain, and calls the request
    *                           method, and 2) runQuery(), which makes the request. Fixes #958.
+   *   @history 2018-01-05 Cole Neubauer - The URL for request was moved. Updated the URL to the
+   *                           new URL and added an error to be thrown if it is moved again
+   *                           Fixes #4963.
    */
   class FeatureNomenclature : public QObject {
       Q_OBJECT
@@ -56,7 +59,7 @@ namespace Isis {
          * When this status is assigned to a feature, there will be no status displayed and
          * the feature will not be shown if the IAU approved only checkbox is checked.
          */
-        NoStatus, 
+        NoStatus,
         /**
          * When this status is assigned to a feature, the displayed status will be "Adopted
          * by the IAU" and the feature will always be shown.
@@ -74,11 +77,11 @@ namespace Isis {
          * checkbox checked.
          */
         Unapproved };
-      
+
       FeatureNomenclature();
       FeatureNomenclature(const FeatureNomenclature &other);
       ~FeatureNomenclature();
-      
+
       void queryFeatures(QString target,
                          Latitude startLat, Longitude startLon,
                          Latitude endLat, Longitude endLon);
@@ -112,7 +115,7 @@ namespace Isis {
        *                           to find the features for the feature nomenclature tool (Qt5).
        */
       class Feature {
-      public:          
+      public:
           Feature();
           Feature(QDomElement searchResultFeature, IAUStatus status);
           Feature(const Feature &other);
diff --git a/isis/src/qisis/objs/MatchTool/MatchTool.cpp b/isis/src/qisis/objs/MatchTool/MatchTool.cpp
index be3e6501f775912f4ac254011e48d3d1389f4c07..f7e4622208ecfcd4b18146b98adbfb666c6d08d5 100644
--- a/isis/src/qisis/objs/MatchTool/MatchTool.cpp
+++ b/isis/src/qisis/objs/MatchTool/MatchTool.cpp
@@ -1391,8 +1391,13 @@ namespace Isis {
 
   /**
    * Signal to save the control net.
+   *
+   * @internal
+   * @history 2017-11-22 Adam Goins - Set the MatchTool window title and
+   *                         the CNet file name label to the newly saved file.
+   *                         Fixes #3922.
    */
-  void MatchTool::saveAsNet () {
+  void MatchTool::saveAsNet() {
 
     QString fn = QFileDialog::getSaveFileName(m_matchTool,
                  "Choose filename to save under",
@@ -1410,6 +1415,8 @@ namespace Isis {
         return;
       }
       m_cnetFileName = fn;
+      m_matchTool->setWindowTitle("Match Tool - Control Network File: " + m_cnetFileName);
+      m_cnetFileNameLabel->setText("Control Network: " + m_cnetFileName);
     }
     //The user cancelled, or the filename is empty
     else {
diff --git a/isis/src/qisis/objs/MatchTool/MatchTool.h b/isis/src/qisis/objs/MatchTool/MatchTool.h
index e7c7c31563fb9d92d2fc3a47a586f206d1f4d3f7..93dd98975f5e8b19ab8fe12dcc3465222706dfd9 100644
--- a/isis/src/qisis/objs/MatchTool/MatchTool.h
+++ b/isis/src/qisis/objs/MatchTool/MatchTool.h
@@ -209,6 +209,9 @@ namespace Isis {
    *                         in clang. Part of porting to OS X 10.11
    * @history 2017-08-09 Adam Goins - Changed method references of SerialNumberList.Delete() to
    *                           SerialNumberList.remove()
+   * @history 2017-11-22 Adam Goins - Set the MatchTool window title and
+   *                          the CNet file name label to the newly saved file.
+   *                          Fixes #3922.
    */
   class MatchTool : public Tool {
     Q_OBJECT
diff --git a/isis/src/qisis/objs/QIsisApplication/QIsisApplication.cpp b/isis/src/qisis/objs/QIsisApplication/QIsisApplication.cpp
index fe0ebc162ddb080bf4612e3b9d3d6f8c31060385..6881dfa2c78d84605dd13b3e6bbe50a52661dab0 100644
--- a/isis/src/qisis/objs/QIsisApplication/QIsisApplication.cpp
+++ b/isis/src/qisis/objs/QIsisApplication/QIsisApplication.cpp
@@ -3,6 +3,7 @@
 #include <locale.h>
 
 #include <QDesktopServices>
+#include <QFileInfo>
 #include <QObject>
 #include <QMessageBox>
 #include <QUrl>
@@ -13,6 +14,7 @@
 #endif
 
 #include "FileName.h"
+#include "Preference.h"
 #include "IException.h"
 #include "IString.h"
 
@@ -22,11 +24,36 @@ namespace Isis {
    *
    * @param argc Pass this in from main(argc, argv)
    * @param argv Pass this in from main(argc, argv)
+   * 
+   * @internal
+   * @history 2017-10-06 Adam Goins - QIsisApplication now checks for a "-pref" flag 
+   *                        in the command-line arguments and loads the following 
+   *                        preference file if it exists. Fixes # 814
    */
   QIsisApplication::QIsisApplication(int &argc, char *argv[]) :
     QApplication(argc, argv) {
     // try to use US locale for numbers so we don't end up printing "," instead
     //   of "." where it might count.
+        
+    
+    for (int i = 1; i < argc; i++) {
+        QString arg(argv[i]);
+        if (arg.startsWith("-pref")) {
+            
+            // So that we can grab the file located after the current '-pref' flag.
+            int nextIndex = i + 1;
+            
+            if (nextIndex < argc) {
+                FileName preferenceFile(argv[nextIndex]);
+                QString filePath = preferenceFile.expanded();
+                Preference::Preferences().clear();
+                Preference::Preferences().Load(filePath);
+            }
+            else {
+                QMessageBox::warning(NULL, "Warning", "Preference flag set but no preference file given.");
+            }
+        }
+    } 
     setlocale(LC_NUMERIC, "en_US");
 
     QDesktopServices::setUrlHandler("http", this, "openUrl");
diff --git a/isis/src/qisis/objs/QnetTools/QnetNavTool.cpp b/isis/src/qisis/objs/QnetTools/QnetNavTool.cpp
index 622c84d26bdb185e02e2f81f954b17a30a9814de..8c836e4f9c32e598ca4efa1523a98bf2cfb8016d 100644
--- a/isis/src/qisis/objs/QnetTools/QnetNavTool.cpp
+++ b/isis/src/qisis/objs/QnetTools/QnetNavTool.cpp
@@ -11,10 +11,12 @@
 #include <QListWidgetItem>
 #include <QMessageBox>
 #include <QPushButton>
+#include <QScrollArea>
 #include <QSettings>
 #include <QStackedWidget>
 #include <QString>
 #include <QTabWidget>
+#include <QVBoxLayout>
 #include <QWidget>
 
 #include "QnetCubeDistanceFilter.h"
@@ -79,6 +81,8 @@ namespace Isis {
 
     createNavigationDialog(parent);
     connect(this, SIGNAL(deletedPoints()), this, SLOT(refreshList()));
+    connect(this, SIGNAL( activityUpdate(QString) ),
+            this, SLOT( updateActivityHistory(QString) ) );
   }
 
   /**
@@ -225,7 +229,7 @@ namespace Isis {
         FileName("$HOME/.Isis/" + QApplication::applicationName() + "/NavTool.config").expanded();
     QSettings settings(settingsFileName, QSettings::NativeFormat);
     m_navDialog->resize(settings.value("size").toSize());
-    
+
     // View the dialog - we need this to get the size of the dialog which we're using
     // for positioning it.
     m_navDialog->setVisible(true);
@@ -268,6 +272,10 @@ namespace Isis {
    *                           "Properties". Updated "What's This?" documentation
    *                           for Measure Properties to explain use of ignore
    *                           status and measure type filters.
+   *   @history  2018-01-10 Adam Goins - Added the Activity History tab to the window.
+   *                           This tab will keep track of edits made to control points/measures.
+   *                           More history entries can be kept track of
+   *                           by emitting the activityUpdate(QString message) signal.
    */
   void QnetNavTool::createFilters() {
     // Set up the point filters
@@ -419,8 +427,31 @@ namespace Isis {
     // Add widgets to the filter stack
     m_filterStack->addWidget(pointFilters);
     m_filterStack->addWidget(cubeFilters);
+
+
+    // Create the Activity History Tab
+    QScrollArea *scrollArea = new QScrollArea();
+
+    QWidget *historyWidget = new QWidget();
+    QWidget *innerWidget = new QWidget();
+
+    QVBoxLayout *innerLayout = new QVBoxLayout();
+    QLabel *title = new QLabel("<b>History</b>");
+    innerLayout->addWidget(title);
+    innerLayout->addWidget(scrollArea);
+
+    m_historyLayout = new QVBoxLayout(scrollArea);
+    m_historyLayout->setAlignment(Qt::AlignTop);
+
+    innerWidget->setLayout(innerLayout);
+    historyWidget->setLayout(m_historyLayout);
+    scrollArea->setWidget(historyWidget);
+    scrollArea->setWidgetResizable(true);
+
+    pointFilters->addTab(innerWidget, QString("&Activity History") );
+
   }
-  
+
 
   QList<int> &QnetNavTool::filteredImages() {
     return m_filteredImages;
@@ -430,8 +461,8 @@ namespace Isis {
   const QList<int> &QnetNavTool::filteredImages() const {
     return m_filteredImages;
   }
-  
-  
+
+
   QList<int> &QnetNavTool::filteredPoints() {
     return m_filteredPoints;
   }
@@ -441,7 +472,7 @@ namespace Isis {
     return m_filteredPoints;
   }
 
-  
+
   ControlNet *QnetNavTool::controlNet() {
     return m_qnetTool->controlNet();
   }
@@ -574,10 +605,32 @@ namespace Isis {
     else {
       m_listBox->setCurrentItem(items.at(0));
     }
+    QString activityMessage("Point selected: " + pointId);
+    emit(activityUpdate(activityMessage));
     return;
   }
 
+  /**
+  *   Slot to update the history tab with current edits.
+  *   It is deisgned not to allow duplicate history entries back to back.
+  *
+  *   @internal
+  *     @history 2018-01-10 Adam Goins - Slot was created.
+  */
+  void QnetNavTool::updateActivityHistory(QString activityMessage) {
+
+    // Check to ensure duplicate entries aren't added back to back.
+    if (m_historyLayout->count() > 0) {
+      QWidget *firstEntry = m_historyLayout->layout()->itemAt(0)->widget();
+      QLabel *firstLabel = dynamic_cast<QLabel*>(firstEntry);
+      if (firstLabel->text() == activityMessage) {
+        return;
+      }
+    }
 
+    QLabel *historyEntry = new QLabel(activityMessage);
+    m_historyLayout->insertWidget(0, historyEntry);
+  }
 
   /**
    *   Slot to refresh the listBox
@@ -628,7 +681,7 @@ namespace Isis {
           this, SLOT(load(QListWidgetItem *)));
       connect(m_listBox, SIGNAL(itemDoubleClicked(QListWidgetItem *)),
           this, SLOT(editPoint(QListWidgetItem *)), Qt::UniqueConnection);
-          
+
       for (int i = 0; i < m_filteredPoints.size(); i++) {
         QString cNetId = (*controlNet())[m_filteredPoints[i]]->GetId();
         QString itemString = cNetId;
@@ -724,9 +777,9 @@ namespace Isis {
 
 
   /**
-   * Slot for double-clicking cube list.  Needed this slot because the signal 
-   * has a QListWidgetItem parameter.  TODO:  Clean this up by possibly combining 
-   * the two different load slots??? 
+   * Slot for double-clicking cube list.  Needed this slot because the signal
+   * has a QListWidgetItem parameter.  TODO:  Clean this up by possibly combining
+   * the two different load slots???
    *
    * @author 2010-11-04 Tracie Sucharski
    *
@@ -850,7 +903,7 @@ namespace Isis {
    * @internal
    *   @history 2008-12-29 Jeannie Walldren - Added question box to verify that
    *                          the user wants to delete the selected points.
-   *   @history 2011-07-25 Tracie Sucharski - Fixed bug in refreshing list 
+   *   @history 2011-07-25 Tracie Sucharski - Fixed bug in refreshing list
    *                          changed to delete starting at end of list so
    *                          indices stay accurate.
    *   @history 2011-10-20 Tracie Sucharski - Fixed bug with filter list not
@@ -935,21 +988,21 @@ namespace Isis {
     return;
   }
 
-  
+
   /**
    * Bring up apriori dialog
    *
-   * @author 2011-04-19 Tracie Sucharski 
-   *  
-   * @internal 
+   * @author 2011-04-19 Tracie Sucharski
+   *
+   * @internal
    *   @history 2016-11-18 Makayla Shepherd - Added a connection to disconnectAprioriDialog() which
    *                           will disconnect the dialog and delete it.
-   * 
-   * @todo  This method should be temporary until the control point editor 
+   *
+   * @todo  This method should be temporary until the control point editor
    *           comes online.  If this stick around, needs to be re-designed-
    *           put in a separate class??
-   *  
-   */ 
+   *
+   */
   void QnetNavTool::aprioriDialog() {
     // If no cubes are loaded, simply return
     if (serialNumberList() == NULL)
@@ -969,13 +1022,13 @@ namespace Isis {
     }
     m_aprioriDialog->setVisiblity();
   }
-  
-  
+
+
   /**
-   * Slot to pass points selected in Nav List Widget to Apriori Dialog 
-   *  
-   * @internal 
-   * @history 2011-05-04 Tracie Sucharski - Do not print error if no pts 
+   * Slot to pass points selected in Nav List Widget to Apriori Dialog
+   *
+   * @internal
+   * @history 2011-05-04 Tracie Sucharski - Do not print error if no pts
    *                        selected, simply return.
    */
   void QnetNavTool::setAprioriDialogPoints() {
@@ -992,12 +1045,12 @@ namespace Isis {
     m_aprioriDialog->setPoints(selected);
 
   }
-  
-  
+
+
   /**
-   * Apriori dialog has been closed and needs to be disconnected and deleted so a new dialog can 
+   * Apriori dialog has been closed and needs to be disconnected and deleted so a new dialog can
    * be brought up next time.
-   * 
+   *
    * @author 2016-11-14 Makayla Shepherd
    *
    */
@@ -1010,7 +1063,7 @@ namespace Isis {
     }
   }
 
-  
+
   /**
    * Figures out what type of widget the filter was selected for and calls the
    * filter method for that filter class
@@ -1033,7 +1086,7 @@ namespace Isis {
    *
    */
   void QnetNavTool::filter() {
-    
+
     m_filtered = true;
     QApplication::setOverrideCursor(Qt::WaitCursor);
     m_filter->setEnabled(false);
@@ -1243,4 +1296,3 @@ namespace Isis {
   }
 #endif
 }
-
diff --git a/isis/src/qisis/objs/QnetTools/QnetNavTool.h b/isis/src/qisis/objs/QnetTools/QnetNavTool.h
index 8b3bffbef7761c190e67590546a1cd8ddc8db409..cbd7fffa8edfcaedd07cdbd9abd4844cccada15c 100644
--- a/isis/src/qisis/objs/QnetTools/QnetNavTool.h
+++ b/isis/src/qisis/objs/QnetTools/QnetNavTool.h
@@ -22,7 +22,6 @@
 
 
 #include "Tool.h"
-
 // forward declarations
 class QComboBox;
 class QDialog;
@@ -32,6 +31,7 @@ class QListWidgetItem;
 class QPushButton;
 class QStackedWidget;
 class QString;
+class QVBoxLayout;
 class QWidget;
 
 
@@ -116,16 +116,17 @@ namespace Isis {
    *                          in ::resetList to prevent multiple connections between the ListWidget
    *                          and edit point slot and load cube slot.  Fixes #1655.
    *   @history 2015-05-28 Makayla Shepherd and Ian Humphrey - When changing navigation types from
-   *                          Points to Cubes, and vice versa, and then back to the original type, 
+   *                          Points to Cubes, and vice versa, and then back to the original type,
    *                          the filtered data is saved rather than forcing the user to refilter
    *                          the data. Fixes #2144.
    *   @history 2016-11-18 Makayla Shepherd - Added disconnection and deletion of the Set Apriori
    *                          Dialog on close. Fixes #4490.
    *   @history 2017-01-04 Makayla Shepherd - Made showNavTool() public in order to fix a window
-   *                          management issue that caused the NavTool to go behind the 
+   *                          management issue that caused the NavTool to go behind the
    *                          ViewportMainWindow (parent widget) when using Gnome or Cinnamon. Fixes
    *                          #4541.
-   *
+   *   @history 2018-01-10 Adam Goins - Added the m_historyLayout member variable the class to keep
+   *                          a running history tab of edits made to points.
    *
    */
   class QnetNavTool : public Tool {
@@ -188,11 +189,12 @@ namespace Isis {
       void ignorePoints();
       void deletePoints();
       void resetCubeList();
-      
+      void updateActivityHistory(QString activityMessage);
       void aprioriDialog();
       void setAprioriDialogPoints();
 
     signals:
+      void activityUpdate(QString);
       void loadPointImages (ControlPoint *);
       void loadImage(const QString &);
       void modifyPoint(ControlPoint *);
@@ -219,6 +221,7 @@ namespace Isis {
       QComboBox *m_listCombo;
       QListWidget *m_listBox;
       QLabel *m_filterCountLabel;
+      QVBoxLayout *m_historyLayout;
       int m_filterCount;
 
       QString m_editPointId;
diff --git a/isis/src/qisis/objs/SpatialPlotTool/SpatialPlotTool.cpp b/isis/src/qisis/objs/SpatialPlotTool/SpatialPlotTool.cpp
index 56e1f804355395aad3bf48c5f9bdbff063b3c5ea..263d07480c83dc049a017335fd9f1acdfdd8c8f8 100644
--- a/isis/src/qisis/objs/SpatialPlotTool/SpatialPlotTool.cpp
+++ b/isis/src/qisis/objs/SpatialPlotTool/SpatialPlotTool.cpp
@@ -118,7 +118,7 @@ namespace Isis {
     m_interpolationCombo->addItem("Cubic Convolution",
         Interpolator::CubicConvolutionType);
     m_interpolationCombo->setCurrentIndex(
-        m_interpolationCombo->findText("BiLinear"));
+        m_interpolationCombo->findText("Nearest Neighbor"));
     connect(m_interpolationCombo, SIGNAL(currentIndexChanged(int)),
             this, SLOT(refreshPlot()));
 
@@ -420,21 +420,21 @@ namespace Isis {
         /*
          * We have a rotated rectangle:
          *
-         *    --across-->
-         *  --------------
-         *  |A          B|
-         *  |            | |
-         *  |            | |
-         *  |            | |
-         *  |            | |
-         *  |            | | length
-         *  |            | |
-         *  |            | |
-         *  |            | |
-         *  |            | |
-         *  |            | V
-         *  |D          C|
-         *  --------------
+         *    --acrossLength-->
+         *  --------------------
+         *  |A                B|
+         *  |                  | |
+         *  |                  | |
+         *  |                  | |
+         *  |                  | |
+         *  |                  | | rectangleLength
+         *  |                  | |
+         *  |                  | |
+         *  |                  | |
+         *  |                  | |
+         *  |                  | V
+         *  |D                C|
+         *  -------------------
          *
          * A is the point where the user initially clicked to start drawing the
          * rectangle. A is clickSample, clickLine.
@@ -463,15 +463,24 @@ namespace Isis {
         double acrossVectorX = acrossSample - clickSample;
         double acrossVectorY = acrossLine - clickLine;
 
+        // Get length of "green" line on the screen
         int acrossLength = qRound(sqrt(acrossVectorX * acrossVectorX +
                                        acrossVectorY * acrossVectorY));
+        
         double sampleStepAcross = (1.0 / (double)acrossLength) * acrossVectorX;
         double lineStepAcross = (1.0 / (double)acrossLength) * acrossVectorY;
 
         double lengthVectorSample = endSample - clickSample;
         double lengthVectorLine = endLine - clickLine;
+        
+        // Get length of "red" line on the screen
         int rectangleLength = qRound(sqrt(lengthVectorSample * lengthVectorSample +
                                           lengthVectorLine * lengthVectorLine));
+                                          
+        // Prevent length of zero for later calculations
+        if (rectangleLength == 0) {
+          rectangleLength = 1;
+        }
 
         SurfacePoint startPoint;
         UniversalGroundMap *groundMap = cvp->universalGroundMap();
@@ -491,7 +500,7 @@ namespace Isis {
           }
         }
 
-        // walk the "green" line on the screen
+        // walk the "red" line on the screen
         for(int index = 0; index <= rectangleLength; index++) {
           Statistics acrossStats;
 
@@ -508,6 +517,8 @@ namespace Isis {
           double sampleMid = sample + (acrossLength / 2.0) * sampleStepAcross;
           double lineMid = line + (acrossLength / 2.0) * lineStepAcross;
 
+          // For each pixel length in the red line direction, we are now recursing through each 
+          // pixel length in the green line's direction and adding the pixel values
           for(int acrossPixel = 0;
               acrossPixel <= acrossLength;
               acrossPixel++) {
diff --git a/isis/src/qisis/objs/SpatialPlotTool/SpatialPlotTool.h b/isis/src/qisis/objs/SpatialPlotTool/SpatialPlotTool.h
index 1530f924f4c812f564f924461efc5ac4e8d83cef..f13945c3d06bdd7a996eb4f5f6f5dc403873bdc2 100644
--- a/isis/src/qisis/objs/SpatialPlotTool/SpatialPlotTool.h
+++ b/isis/src/qisis/objs/SpatialPlotTool/SpatialPlotTool.h
@@ -46,14 +46,18 @@ namespace Isis {
    *   @history 2013-01-24 Steven Lambright - Fixed positioning of portal/interpolator used
    *                           when reading DN data to create a plot. Fixes #997.
    *   @history 2014-04-15 Tracie Sucharski - Reset defaults for plots to the following:
-   *                         SolidLine, Width=1, NoSymbols.  This is a temporary fix until
-   *                         the defaults can be saved on a user basis.  Fixes #2062.
+   *                           SolidLine, Width=1, NoSymbols.  This is a temporary fix until
+   *                           the defaults can be saved on a user basis.  Fixes #2062.
    *   @history 2014-06-20 Janet Barrett - Fixed SpatialPlotTool::getSpatialStatistics to
-   *                         check for length of line used to draw profile to make sure it
-   *                         is greater than zero to avoid divide by zero error. Fixes #1921
-   *                         and #1950.
+   *                           check for length of line used to draw profile to make sure it
+   *                           is greater than zero to avoid divide by zero error. Fixes #1921
+   *                           and #1950.
    *   @history 2014-07-31 Ian Humphrey - Added What's This help for SpatialPlotTool.
    *                           References #2089.
+   *   @history 2018-01-12 Summer Stapleton - Prevented lengths of zero for the rotated rectangle 
+   *                           selection to address segfault. Fixes #4953.
+   *   @history 2018-01-18 Summer Stapleton - Modified the default interpolation mode to
+   *                           "Nearest Neighbor". Fixes #1949, 5257.
    */
   class SpatialPlotTool : public AbstractPlotTool {
       Q_OBJECT
diff --git a/isis/src/qisis/objs/TableMainWindow/TableMainWindow.cpp b/isis/src/qisis/objs/TableMainWindow/TableMainWindow.cpp
index 245b0e10eedd8d3beee69537ec10854ee72a202a..29887569f19df34b90a4f1669c52e43d113c065e 100644
--- a/isis/src/qisis/objs/TableMainWindow/TableMainWindow.cpp
+++ b/isis/src/qisis/objs/TableMainWindow/TableMainWindow.cpp
@@ -3,12 +3,13 @@
 #include <iostream>
 
 #include <QAction>
-#include <QStatusBar>
 #include <QDockWidget>
 #include <QFileDialog>
+#include <QHeaderView>
 #include <QMenuBar>
 #include <QMessageBox>
 #include <QSettings>
+#include <QStatusBar>
 #include <QTableWidget>
 #include <QToolBar>
 
@@ -28,14 +29,15 @@ namespace Isis {
     p_visibleColumns = -1;
     p_currentRow = 0;
     p_currentIndex = 0;
-    createTable();
-
     setObjectName(title);
+    createTable();
     readSettings(QSize(500, 300));
+    readColumnSettings();
   }
 
 
   TableMainWindow::~TableMainWindow() {
+    writeSettings();
   }
 
 
@@ -57,6 +59,23 @@ namespace Isis {
     return result;
   }
 
+  void TableMainWindow::resizeColumn(int columnIndex) {
+    QHeaderView* header = p_table->horizontalHeader();
+
+    QString columnName(p_table->model()->headerData(columnIndex, Qt::Horizontal).toString());
+
+    if (columnName.isEmpty())
+    {
+      return;
+    }
+
+    if (header->sectionResizeMode(columnIndex) == QHeaderView:: ResizeToContents) {
+      header->setSectionResizeMode(columnIndex, QHeaderView::Interactive);
+    }
+    else {
+      header->setSectionResizeMode(columnIndex, QHeaderView::ResizeToContents);
+    }
+  }
 
   /**
    * This creates the table main window.  The table and docking
@@ -77,6 +96,12 @@ namespace Isis {
     // Create the table widget
     p_table = new QTableWidget(this);
     p_table->setAlternatingRowColors(true);
+    //
+    QHeaderView* columnHeader = p_table->horizontalHeader();
+    columnHeader->setSectionResizeMode(QHeaderView::ResizeToContents);
+    connect ( columnHeader, SIGNAL( sectionPressed(int) ),
+              this, SLOT( resizeColumn(int) ) );
+
     setCentralWidget(p_table);
 
     // Create the dock area
@@ -151,7 +176,6 @@ namespace Isis {
     cols->setText("Columns");
     connect(cols, SIGNAL(triggered()), p_dock, SLOT(show()));
     viewMenu->addAction(cols);
-
     this->setMenuBar(menuBar);
     installEventFilter(this);
   }
@@ -198,7 +222,7 @@ namespace Isis {
         destinationColumn = startCol + i;
         p_table->insertColumn(startCol + i);
       }
-      
+
       QTableWidgetItem *header = new QTableWidgetItem(htext);
       if (insertAt >= 0) {
 
@@ -255,6 +279,7 @@ namespace Isis {
 
       readItemSettings(heading, item, setOn);
     }
+    readColumnSettings();
   }
 
 
@@ -350,6 +375,10 @@ namespace Isis {
    *                        this->show() so that it hides the unselected columns appropriately.
    *                        Fixes #5141.
    *
+   * @history 2017-10-06 Adam Goins - showTable() now calls syncColumns() after it calls
+   *                        this->show() so that it hides the unselected columns appropriately.
+   *                        Fixes #5141.
+   *
    */
   void TableMainWindow::showTable() {
     if (p_table == NULL) createTable();
@@ -550,6 +579,35 @@ namespace Isis {
     item->setCheckState(state);
   }
 
+  /**
+   * This method reads the columns in the table and sets their size
+   * to the appropriate size, or the size to auto based on what they were
+   * stored as.
+   *
+   */
+  void TableMainWindow::readColumnSettings() {
+
+    QHeaderView *header = p_table->horizontalHeader();
+    QSettings settings(settingsFileName(), QSettings::NativeFormat);
+
+    for (int columnIndex = 0; columnIndex < p_table->model()->columnCount(); columnIndex++) {
+
+       QString headerName = p_table->model()->headerData(columnIndex, Qt::Horizontal).toString();
+       QString settingName = "column-" + headerName;
+       QString value = settings.value(settingName, "auto").toString();
+
+       if (value == "auto" || value == "0") {
+          header->setSectionResizeMode(columnIndex, QHeaderView::ResizeToContents);
+       }
+       else {
+         int width = value.toInt();
+
+         header->setSectionResizeMode(columnIndex, QHeaderView::Interactive);
+         p_table->setColumnWidth(columnIndex, width);
+       }
+    }
+  }
+
 
   /**
    * This overriden method is called when the Tablemainwindow
@@ -557,6 +615,11 @@ namespace Isis {
    * (and dock widget settings) to a config file in the user's
    * home directory.
    *
+   *  @internal
+   *    @history 2017-11-13 Adam Goins - Added the behavior of columns sizes to be written
+   *                            to the settings file so that they can be persistent through
+   *                            new instances of qview.
+   *
    */
   void TableMainWindow::writeSettings() const {
     if (p_listWidget) {
@@ -566,6 +629,22 @@ namespace Isis {
         QString itemTitle = "item-" + item->text();
         settings.setValue(itemTitle, item->checkState());
       }
+
+      QHeaderView *header = p_table->horizontalHeader();
+      for(int columnIndex = 0; columnIndex < p_table->model()->columnCount(); columnIndex++)
+      {
+         QString headerName = p_table->model()->headerData(columnIndex, Qt::Horizontal).toString();
+         QString settingName = "column-" + headerName;
+
+         if (header->sectionResizeMode(columnIndex) == QHeaderView::ResizeToContents)
+         {
+           settings.setValue(settingName, "auto");
+         }
+         else
+         {
+           settings.setValue( settingName, header->sectionSize(columnIndex) );
+         }
+      }
     }
   }
 
diff --git a/isis/src/qisis/objs/TableMainWindow/TableMainWindow.h b/isis/src/qisis/objs/TableMainWindow/TableMainWindow.h
index 89091b0062980f00665ede89b1c6ac347c1d3b65..e7f849b2c74574bcacff517385d386074ab1637e 100644
--- a/isis/src/qisis/objs/TableMainWindow/TableMainWindow.h
+++ b/isis/src/qisis/objs/TableMainWindow/TableMainWindow.h
@@ -44,6 +44,13 @@ namespace Isis {
   *   @history 2017-10-06 Adam Goins - showTable() now calls syncColumns() after it calls
   *                          this->show() so that it hides the unselected columns appropriately.
   *                          Fixes #5141.
+  *   @history 2017-11-13 Adam Goins - Afforded TableMainWindow the ability to toggle between auto
+  *                          resizing columns or setting a specific column size for each column.
+  *                          modified createTable() to set the resize property of the columns to
+  *                          resize automatically based on the content inside of the column.
+  *                          Added resizeColumn() slot and readColumnSettings().
+  *                          modified writeSettings() to write updated settings on destroy.
+  *                          Fixes #5142.
   */
   class TableMainWindow : public MainWindow {
       Q_OBJECT
@@ -129,6 +136,7 @@ namespace Isis {
       bool trackListItems();
       void loadTable();
       void writeSettings() const;
+      void resizeColumn(int columnIndex);
 
     signals:
       /**
@@ -143,6 +151,8 @@ namespace Isis {
       void readItemSettings(QString heading, QListWidgetItem *item,
                             bool defaultChecked);
 
+      void readColumnSettings();
+
     private:
       std::string p_appName; //!< The application name
       QWidget *p_parent; //!< The parent widget
diff --git a/isis/src/qisis/objs/WindowTool/WindowTool.cpp b/isis/src/qisis/objs/WindowTool/WindowTool.cpp
index ab421195d7ebe47bf3f75205ec1d4c7d8094a466..43f41e22485d2adea04c7c3b250cf3f6eef34a9d 100644
--- a/isis/src/qisis/objs/WindowTool/WindowTool.cpp
+++ b/isis/src/qisis/objs/WindowTool/WindowTool.cpp
@@ -162,11 +162,19 @@ namespace Isis {
     else {
       sy = mdiHeight/py;
     }
+<<<<<<< HEAD
     
     return std::max(sx,sy); 
   }
 
   
+=======
+
+    return std::max(sx,sy);
+  }
+
+
+>>>>>>> dev
   /**
    * Tiles the cube viewports over the Cube DN View.
    *
@@ -177,6 +185,7 @@ namespace Isis {
     int vpSize = viewportSize();
 
     QPoint position(0, 0);
+<<<<<<< HEAD
     
     QList<QMdiSubWindow *> windowList = p_mdiArea->subWindowList();
     
@@ -186,12 +195,28 @@ namespace Isis {
       window->setGeometry(rect);
       window->move(position);
      
+=======
+
+    QList<QMdiSubWindow *> windowList = p_mdiArea->subWindowList();
+
+    for (int i = windowList.size() - 1; i >= 0; i--) {
+      QMdiSubWindow *window = windowList[i];
+      window->showNormal();
+      QRect rect(0, 0, vpSize, vpSize);
+      window->setGeometry(rect);
+      window->move(position);
+
+>>>>>>> dev
       position.setX(position.x() + window->width());
       if (position.x() + window->width() > p_mdiArea->width()) {
         position.setX(0);
         position.setY(position.y() + window->height());
       }
+<<<<<<< HEAD
     }  
+=======
+    }
+>>>>>>> dev
   }
 
 
diff --git a/isis/src/qisis/objs/WindowTool/WindowTool.h b/isis/src/qisis/objs/WindowTool/WindowTool.h
index 9472a016e23e2805c4a76f37fd4bf88d67a16462..a05242159b4957d70b4fa5afa405e05695902ce6 100644
--- a/isis/src/qisis/objs/WindowTool/WindowTool.h
+++ b/isis/src/qisis/objs/WindowTool/WindowTool.h
@@ -19,6 +19,8 @@ namespace Isis {
    *                           between all viewports now. Fixes #195.
    *   @history 2017-07-19 Marjorie Hahn and Tracie Sucharski - Implemented new
    *                           viewport tiling scheme.
+   *   @history 2018-01-09 Cole Neubauer - Returns windows to normal state before they are tiled to
+   *                           fix fullscreen tiling issue Fixes #5262
    */
   class WindowTool : public Tool {
       Q_OBJECT
@@ -29,7 +31,7 @@ namespace Isis {
       void addTo(Workspace *ws);
       void addToPermanent(QToolBar *toolbar);
 
-      /** 
+      /**
        * @return the menu name
        */
       QString menuName() const {
@@ -69,4 +71,3 @@ namespace Isis {
 };
 
 #endif
-
diff --git a/isis/src/system/apps/kerneldbgen/SpiceDbGen.cpp b/isis/src/system/apps/kerneldbgen/SpiceDbGen.cpp
index 326aa589cfdcf05f293f11ce021e94c32ffa17c8..ab4949f2f8dbcea6543df32d957abc4eabb272ad 100644
--- a/isis/src/system/apps/kerneldbgen/SpiceDbGen.cpp
+++ b/isis/src/system/apps/kerneldbgen/SpiceDbGen.cpp
@@ -71,7 +71,7 @@ SpiceDbGen::SpiceDbGen(QString type) {
  * @throws Isis::iException::Message
 */
 PvlObject SpiceDbGen::Direct(QString quality, QString location,
-                             std::vector<QString> &filter) {
+                             std::vector<QString> &filter, double startOffset, double endOffset) {
   PvlObject result;
   QString type = "none";
 
@@ -90,7 +90,7 @@ PvlObject SpiceDbGen::Direct(QString quality, QString location,
 
     for (int fileNum = 0 ; fileNum < files.size() ; fileNum++) {
       FileName currFile((QString) location + "/" + files[fileNum]);
-      PvlGroup selection = AddSelection(currFile);
+      PvlGroup selection = AddSelection(currFile, startOffset, endOffset);
       selection += PvlKeyword("Type", quality);
       result.addGroup(selection);
     }
@@ -164,7 +164,7 @@ QStringList SpiceDbGen::GetFiles(FileName location, QString filter) {
   *
   * @throws Isis::iException::Message
   */
-PvlGroup SpiceDbGen::AddSelection(FileName fileIn) {
+PvlGroup SpiceDbGen::AddSelection(FileName fileIn, double startOffset, double endOffset) {
   NaifStatus::CheckErrors();
 
   //finalize the filename so that it may be used in spice routines
@@ -220,7 +220,7 @@ PvlGroup SpiceDbGen::AddSelection(FileName fileIn) {
 
         NaifStatus::CheckErrors();
 
-        result = FormatIntervals(cover, currFile);
+        result = FormatIntervals(cover, currFile, startOffset, endOffset);
       }
       else if (currFile == "CK") {
         //  200,000 is the max coverage window size for a CK kernel
@@ -231,7 +231,7 @@ PvlGroup SpiceDbGen::AddSelection(FileName fileIn) {
 
         NaifStatus::CheckErrors();
 
-        result = FormatIntervals(cover, currFile);
+        result = FormatIntervals(cover, currFile, startOffset, endOffset);
       }
     }
   }
@@ -248,7 +248,8 @@ PvlGroup SpiceDbGen::AddSelection(FileName fileIn) {
 }
 
 
-PvlGroup SpiceDbGen::FormatIntervals(SpiceCell &coverage, QString type) {
+PvlGroup SpiceDbGen::FormatIntervals(SpiceCell &coverage, QString type,
+                                     double startOffset, double endOffset) {
   NaifStatus::CheckErrors();
 
   PvlGroup result(type);
@@ -261,8 +262,11 @@ PvlGroup SpiceDbGen::FormatIntervals(SpiceCell &coverage, QString type) {
     //Get the endpoints of the jth interval.
     wnfetd_c(&coverage, j, &begin, &end);
     //Convert the endpoints to TDB calendar
+    begin -= startOffset;
+    end += endOffset;
     timout_c(begin, calForm, 35, begStr);
     timout_c(end, calForm, 35, endStr);
+    
     result += PvlKeyword("Time", "(\"" + (QString)begStr +
                          "\", \"" + (QString)endStr + "\")");
   }
diff --git a/isis/src/system/apps/kerneldbgen/SpiceDbGen.h b/isis/src/system/apps/kerneldbgen/SpiceDbGen.h
index ec1eb630e667f776a279d01ac3fe818b137d4b23..616ff25a1993793043bb960cea165f6baf65f71e 100644
--- a/isis/src/system/apps/kerneldbgen/SpiceDbGen.h
+++ b/isis/src/system/apps/kerneldbgen/SpiceDbGen.h
@@ -45,6 +45,8 @@
  *   @history 2010-04-27 Stuart Sides - Modified Direct member to use a vector
  *                           of filters instead of a single QString
  *   @history 2013-02-15 Steven Lambright - Added support for extra kernel dependencies
+ *   @history 2018-01-10 Christopher Combs - Added passing startOffset and endOffset to allow
+ *                           the passing of time offsets to to FormatIntervals. Fixes #5272.
  *
  */
 class SpiceDbGen {
@@ -52,14 +54,14 @@ class SpiceDbGen {
   public:
     SpiceDbGen(QString type);
     Isis::PvlObject Direct(QString quality, QString location,
-                           std::vector<QString> & filter);
+                           std::vector<QString> & filter, double startOffset, double endOffset);
     void FurnishDependencies(QList<Isis::FileName> sclks, QList<Isis::FileName> fks,
                              QList<Isis::FileName> extras);
 
   private:
     QStringList GetFiles(Isis::FileName location, QString filter);
-    Isis::PvlGroup AddSelection(Isis::FileName fileIn);
-    Isis::PvlGroup FormatIntervals(SpiceCell &coverage, QString type);
+    Isis::PvlGroup AddSelection(Isis::FileName fileIn, double startOffset, double endOffset);
+    Isis::PvlGroup FormatIntervals(SpiceCell &coverage, QString type, double startOffset, double endOffset);
     Isis::PvlGroup GetIntervals(SpiceCell &cover);
     //private instance variables
     QString p_type;
diff --git a/isis/src/system/apps/kerneldbgen/kerneldbgen.cpp b/isis/src/system/apps/kerneldbgen/kerneldbgen.cpp
index cefa22000e0e71e592f7955a1ff0f49ba5bc9eb0..fd69b7b53c4dea8b876a6394581b3a815718cd3b 100644
--- a/isis/src/system/apps/kerneldbgen/kerneldbgen.cpp
+++ b/isis/src/system/apps/kerneldbgen/kerneldbgen.cpp
@@ -52,6 +52,9 @@ void IsisMain() {
   //  PvlObject::PvlGroupIterator grp = result.beginGroup();
   //  while(grp != result.endGroup()){ selections.addGroup(*grp);grp++;}
   //}
+  double startOffset = ui.GetDouble("STARTOFFSET");
+  double endOffset = ui.GetDouble("ENDOFFSET");
+  
   if (ui.GetString("PREDICTFILTER") != "none" &&
       ui.GetString("PREDICTDIR") != "none") {
     QString location = "";
@@ -59,7 +62,7 @@ void IsisMain() {
     location.remove("\\");
     std::vector<QString> filter;
     ui.GetString("PREDICTFILTER", filter);
-    PvlObject result = sdg.Direct("Predicted", location, filter);
+    PvlObject result = sdg.Direct("Predicted", location, filter, startOffset, endOffset);
     PvlObject::PvlGroupIterator grp = result.beginGroup();
     while(grp != result.endGroup()) {
       selections.addGroup(*grp);
@@ -74,7 +77,7 @@ void IsisMain() {
     location.remove("\\");
     std::vector<QString> filter;
     ui.GetString("RECONFILTER", filter);
-    PvlObject result = sdg.Direct("Reconstructed", location, filter);
+    PvlObject result = sdg.Direct("Reconstructed", location, filter, startOffset, endOffset);
     PvlObject::PvlGroupIterator grp = result.beginGroup();
     while(grp != result.endGroup()) {
       selections.addGroup(*grp);
@@ -89,7 +92,7 @@ void IsisMain() {
     location.remove("\\");
     std::vector<QString> filter;
     ui.GetString("SMITHEDFILTER", filter);
-    PvlObject result = sdg.Direct("Smithed", location, filter);
+    PvlObject result = sdg.Direct("Smithed", location, filter, startOffset, endOffset);
     PvlObject::PvlGroupIterator grp = result.beginGroup();
     while(grp != result.endGroup()) {
       selections.addGroup(*grp);
diff --git a/isis/src/system/apps/kerneldbgen/kerneldbgen.xml b/isis/src/system/apps/kerneldbgen/kerneldbgen.xml
index 0bc3ed913495bdedb517b77aa4d1cdc6e3cbc368..e12f3e126f9c02ae1df5f72435d0901933fad840 100644
--- a/isis/src/system/apps/kerneldbgen/kerneldbgen.xml
+++ b/isis/src/system/apps/kerneldbgen/kerneldbgen.xml
@@ -148,6 +148,10 @@
       Added three additional decimal places to the output of the TIME keyword in output
       kernel database file.  Fixes #2236.
     </change>
+    <change name="Christopher Combs" date="2018-01-11">
+      Added STARTOFFSET and ENDOFFSET parameters to allow for slight editing to start and end times.
+      Fixes #5272.
+    </change>
   </history>
 
   <groups>
@@ -325,6 +329,40 @@
         </default>
       </parameter>
     </group>
+    <group name="Offset">
+      <parameter name="STARTOFFSET">
+        <type>double</type>
+        <brief>
+          Seconds to subtract from each start time in the kernel.
+        </brief>
+        <minimum inclusive="yes">0.0</minimum>
+        <description>
+          This parameter is used to specify the amount of offset (in seconds) to apply to the 
+          StartTime value for each kernel that is used to populate the db file. This value will be
+          subtracted from the value found in the kernel. If left as 0.0, no offset will be applied, and 
+          the Time will be copied over as written in the kernel.
+        </description>
+        <default>
+          <item>0.0</item>
+        </default>
+      </parameter>
+      <parameter name="ENDOFFSET">
+        <type>double</type>
+        <brief>
+           Seconds to add to each end time in the kernel.
+        </brief>
+        <minimum inclusive="yes">0.0</minimum>
+        <description>
+          This parameter is used to specify the amount of offset (in seconds) to apply to the 
+          EndTime value for each kernel that is used to populate the db file. This value will be
+          added to the value found in the kernel. If left as 0.0, no offset will be applied, and the
+          Time will be copied over as written in the kernel.
+        </description>
+        <default>
+          <item>0.0</item>
+        </default>
+      </parameter>
+    </group>
     <!-- Removed because NADIR kerels are not specifed by files, instead NADIR pointing is caluculated as normal to the surface from the current spacecraft position
     <group name="Nadir">
       <parameter name="NADIRDIR">
@@ -611,10 +649,5 @@
         </dataFile>
       </dataFiles>
     </example>
-
-
-
-
-
   </examples>
 </application>
diff --git a/isis/src/tgo/apps/stitch/Makefile b/isis/src/tgo/apps/stitch/Makefile
deleted file mode 100644
index 7578f0b21d038db6a5042c095cda9b34b6bb2570..0000000000000000000000000000000000000000
--- a/isis/src/tgo/apps/stitch/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-ifeq ($(ISISROOT), $(BLANK))
-.SILENT:
-error:
-	echo "Please set ISISROOT";
-else
-	include $(ISISROOT)/make/isismake.apps
-endif
\ No newline at end of file
diff --git a/isis/src/tgo/apps/tgocassis2isis/tgocassis2isis.cpp b/isis/src/tgo/apps/tgocassis2isis/tgocassis2isis.cpp
index 2fa90206f2168cc5503e4d1f98e6791e8f5a44bd..6754aded2bed19b1dcfbabe4c12542d4537b0686 100644
--- a/isis/src/tgo/apps/tgocassis2isis/tgocassis2isis.cpp
+++ b/isis/src/tgo/apps/tgocassis2isis/tgocassis2isis.cpp
@@ -27,26 +27,26 @@ void IsisMain() {
   try {
     ProcessImport importer;
     translateCoreInfo(xmlFileName, importer);
-
+    // fails 
     importer.SetInputFile(xmlFileName.removeExtension().addExtension("dat").expanded());
     Cube *outputCube = importer.SetOutputCube("TO");
-
+    // fails above
     translateLabels(xmlFileName, outputCube);
-  
+
     FileName outputCubeFileName(ui.GetFileName("TO"));
-  
+
     OriginalXmlLabel xmlLabel;
     xmlLabel.readFromXmlFile(xmlFileName);
-  
+
     importer.StartProcess();
-  
+
     // Write out original label before closing the cube
     outputCube->write(xmlLabel);
-  
+
     importer.EndProcess();
   }
   catch (IException &e) {
-    QString msg = "Given file does not appear to be a valid TGO CaSSIS product.";
+    QString msg = "Given file [" + xmlFileName.expanded() + "] does not appear to be a valid TGO CaSSIS label.";
       throw IException(e, IException::User, msg, _FILEINFO_);
   }
 
@@ -145,11 +145,14 @@ void translateLabels(FileName &inputLabel, Cube *outputCube) {
 
   // Create the Archive Group
   FileName archiveTransFile(missionDir + "/translations/tgoCassisArchive.trn");
+  FileName subTransFile(missionDir + "/translations/tgoCassisSubWindow.trn");
   XmlToPvlTranslationManager archiveXlater(inputLabel, archiveTransFile.expanded());
+  XmlToPvlTranslationManager subXlater(inputLabel, subTransFile.expanded());
 
   // Pvl output label
   outputLabel = outputCube->label();
   archiveXlater.Auto(*(outputLabel));
+  subXlater.Auto(*(outputLabel));
 
   // Create YearDoy keyword in Archive group
   iTime stime(outputLabel->findGroup("Instrument", Pvl::Traverse)["StartTime"][0]);
@@ -235,17 +238,12 @@ void translateLabels(FileName &inputLabel, Cube *outputCube) {
   outputCube->putGroup(kern);
 
   // Add an alpha cube group based on the subwindowing
-  FileName alphaTransFile(missionDir + "/translations/tgoCassisSubWindow.trn");
-  XmlToPvlTranslationManager alphaXlater(inputLabel, alphaTransFile.expanded());
-  Pvl alphaPvl;
-  alphaXlater.Auto(alphaPvl);
-  PvlObject subWindow = alphaPvl.findObject("SubWindow");
-  int windowNumber = (int) subWindow["Window_Count"] + 1;
+  int windowNumber = (int) archive["Window_Count"] + 1;
   QString windowString = "Window_" + toString(windowNumber);
-  int frameletStartSample = (int) subWindow[windowString + "_Start_Sample"] + 1;
-  int frameletEndSample   = (int) subWindow[windowString + "_End_Sample"] + 1;
-  int frameletStartLine   = (int) subWindow[windowString + "_Start_Line"] + 1;
-  int frameletEndLine     = (int) subWindow[windowString + "_End_Line"] + 1;
+  int frameletStartSample = (int) archive[windowString + "_Start_Sample"] + 1;
+  int frameletEndSample   = (int) archive[windowString + "_End_Sample"] + 1;
+  int frameletStartLine   = (int) archive[windowString + "_Start_Line"] + 1;
+  int frameletEndLine     = (int) archive[windowString + "_End_Line"] + 1;
   AlphaCube frameletArea(2048, 2048,
                          frameletEndSample - frameletStartSample + 1,
                          frameletEndLine - frameletStartLine + 1,
diff --git a/isis/src/tgo/apps/tgocassis2isis/tsts/blu/Makefile b/isis/src/tgo/apps/tgocassis2isis/tsts/blu/Makefile
index 6f62064218c720e59513e204cb5df9f30e9c47f2..4f041f557e0473b2093951c4631f6f83ad0331b5 100644
--- a/isis/src/tgo/apps/tgocassis2isis/tsts/blu/Makefile
+++ b/isis/src/tgo/apps/tgocassis2isis/tsts/blu/Makefile
@@ -5,8 +5,8 @@ APPNAME = tgocassis2isis
 include $(ISISROOT)/make/isismake.tsts
 
 commands: 
-	$(APPNAME) from=$(INPUT)/CAS-MCO-2016-11-26T22.32.39.582-BLU-03025-00.xml \
-	           to=$(OUTPUT)/CAS-MCO-2016-11-26T22.32.39.582-BLU-03025-00.cub > /dev/null;
+	$(APPNAME) from=$(INPUT)/CAS-MCO-2016-11-22T15.45.50.984-BLU-03000-B1.xml \
+	           to=$(OUTPUT)/CAS-MCO-2016-11-22T15.45.50.984-BLU-03000-B1.cub > /dev/null;
 
-	catlab from=$(OUTPUT)/CAS-MCO-2016-11-26T22.32.39.582-BLU-03025-00.cub \
+	catlab from=$(OUTPUT)/CAS-MCO-2016-11-22T15.45.50.984-BLU-03000-B1.cub \
 	       to=$(OUTPUT)/labels.pvl > /dev/null;
diff --git a/isis/src/tgo/apps/tgocassis2isis/tsts/errors/Makefile b/isis/src/tgo/apps/tgocassis2isis/tsts/errors/Makefile
index 3f1f684ba0520e1cb4bb56da948e0d03d9648378..f554ed1c65ddfe4644fb8a03b8fb59db01b816ee 100644
--- a/isis/src/tgo/apps/tgocassis2isis/tsts/errors/Makefile
+++ b/isis/src/tgo/apps/tgocassis2isis/tsts/errors/Makefile
@@ -2,6 +2,7 @@
 #
 # history 2016-12-21 Kristin Berry - Original version. References # 4584
 # history 2017-09-18 Jeannie Backer - Added checks for Instrument and Filter.
+# history 2017-11-26 Kristin Berry - Strip filenames out of output. 
 
 APPNAME = tgocassis2isis
 
@@ -13,7 +14,7 @@ commands:
 	if [ `$(APPNAME) \
 	  from=$(INPUT)/CAS-MCO-2016-11-26T22.35.51.907-RED-01033-B1-SpacecraftError.xml \
 	  to=$(OUTPUT)/BROKEN.cub \
-	  2>> $(OUTPUT)/errors.txt > /dev/null` ]; \
+	  2>> $(OUTPUT)/errors_temp.txt > /dev/null` ]; \
 	  then true; \
 	  fi; 
 # TEST: Throws an error for a bad instrument name
@@ -22,7 +23,7 @@ commands:
 	if [ `$(APPNAME) \
 	  from=$(INPUT)/CAS-MCO-2016-11-26T22.35.51.907-RED-01033-B1-InstrumentError.xml \
 	  to=$(OUTPUT)/BROKEN.cub \
-	  2>> $(OUTPUT)/errors.txt > /dev/null` ]; \
+	  2>> $(OUTPUT)/errors_temp.txt > /dev/null` ]; \
 	  then true; \
 	  fi; 
 # TEST: Throws an error for a bad filter name
@@ -31,10 +32,16 @@ commands:
 	if [ `$(APPNAME) \
 	  from=$(INPUT)/CAS-MCO-2016-11-20T15.30.00.349-DMP-00000-00.xml \
 	  to=$(OUTPUT)/BROKEN.cub \
-	  2>> $(OUTPUT)/errors.txt > /dev/null` ]; \
+	  2>> $(OUTPUT)/errors_temp.txt > /dev/null` ]; \
 	  then true; \
 	  fi; 
+# Remove everything in brackets like filenames/paths from error messages
+	$(SED) 's/\[\([^"]*\)\]//g' $(OUTPUT)/errors_temp.txt \
+	> $(OUTPUT)/errors.txt; 
+
 # Cleanup
+	$(RM) $(OUTPUT)/errors_temp.txt;
 	$(RM) $(OUTPUT)/BROKEN.cub; 
+
      
 
diff --git a/isis/src/tgo/apps/tgocassis2isis/tsts/nir/Makefile b/isis/src/tgo/apps/tgocassis2isis/tsts/nir/Makefile
index a358f76473361a319890496debeb15aa6cd5c1f9..edfc26f260fca321be0a4e57e461e6de7ecbd57f 100644
--- a/isis/src/tgo/apps/tgocassis2isis/tsts/nir/Makefile
+++ b/isis/src/tgo/apps/tgocassis2isis/tsts/nir/Makefile
@@ -1,12 +1,14 @@
-# Updated by Kristin Berry 2017-12-21 for new test data and significant updates to tgocassisi2isis
+# history: 
+# 2017-12-21 Kristin Berry - Updated for new test data and significant updates to tgocassisi2isis
+# 2017-11-20 Kristin Berry - Updated to use new test data released in November 2017.  
 
 APPNAME = tgocassis2isis
 
 include $(ISISROOT)/make/isismake.tsts
 
 commands: 
-	$(APPNAME) from=$(INPUT)/CAS-MCO-2016-11-26T22.32.39.582-NIR-02025-00.xml \
-	           to=$(OUTPUT)/CAS-MCO-2016-11-26T22.32.39.582-NIR-02025-00.cub > /dev/null;
+	$(APPNAME) from=$(INPUT)/CAS-MCO-2016-11-22T15.45.50.984-NIR-02000-B1.xml \
+	           to=$(OUTPUT)/CAS-MCO-2016-11-22T15.45.50.984-NIR-02000-B1.cub > /dev/null;
 
-	catlab from=$(OUTPUT)/CAS-MCO-2016-11-26T22.32.39.582-NIR-02025-00.cub \
+	catlab from=$(OUTPUT)/CAS-MCO-2016-11-22T15.45.50.984-NIR-02000-B1.cub \
 	       to=$(OUTPUT)/labels.pvl > /dev/null;
diff --git a/isis/src/tgo/apps/tgocassis2isis/tsts/pan/Makefile b/isis/src/tgo/apps/tgocassis2isis/tsts/pan/Makefile
index a60650fbd42bd2da756c5991dcc2f88515a65b2f..58058825c401cd9acdddbdc0891c1dd7368b9294 100644
--- a/isis/src/tgo/apps/tgocassis2isis/tsts/pan/Makefile
+++ b/isis/src/tgo/apps/tgocassis2isis/tsts/pan/Makefile
@@ -1,12 +1,14 @@
-# Updated by Kristin Berry 2017-12-21 for new test data and significant updates to tgocassisi2isis
+# history:
+# 2017-12-21 Kristin Berry - Updated for new test data and significant updates to tgocassisi2isis
+# 2017-11-20 Kristin Bery - Updated with new test data released Nov 2017. 
 
 APPNAME = tgocassis2isis
 
 include $(ISISROOT)/make/isismake.tsts
 
 commands: 
-	$(APPNAME) from=$(INPUT)/CAS-MCO-2016-11-26T22.32.39.582-PAN-00025-00.xml \
-	           to=$(OUTPUT)/CAS-MCO-2016-11-26T22.32.39.582-PAN-00025-00.cub > /dev/null;
+	$(APPNAME) from=$(INPUT)/CAS-MCO-2016-11-22T15.45.50.984-PAN-00000-B1.xml \
+	           to=$(OUTPUT)/CAS-MCO-2016-11-22T15.45.50.984-PAN-00000-B1.cub > /dev/null;
 
-	catlab from=$(OUTPUT)/CAS-MCO-2016-11-26T22.32.39.582-PAN-00025-00.cub \
+	catlab from=$(OUTPUT)/CAS-MCO-2016-11-22T15.45.50.984-PAN-00000-B1.cub \
 	       to=$(OUTPUT)/labels.pvl > /dev/null;
diff --git a/isis/src/tgo/apps/tgocassis2isis/tsts/red/Makefile b/isis/src/tgo/apps/tgocassis2isis/tsts/red/Makefile
index 2f076301f70be0723e90192c5142b1d6f7547214..855b92b42d37a4734af010e92b52fd01b9e76523 100644
--- a/isis/src/tgo/apps/tgocassis2isis/tsts/red/Makefile
+++ b/isis/src/tgo/apps/tgocassis2isis/tsts/red/Makefile
@@ -1,12 +1,14 @@
-# Updated by Kristin Berry 2017-12-21 for new test data and significant updates to tgocassisi2isis
+# history:
+# 2017-12-21 Kristin Berry - Updated for new test data and significant updates to tgocassisi2isis
+# 2017-11-20 Kristin Berry - Updated to use new test data released in November 2017.
 
 APPNAME = tgocassis2isis
 
 include $(ISISROOT)/make/isismake.tsts
 
 commands: 
-	$(APPNAME) from=$(INPUT)/CAS-MCO-2016-11-26T22.32.39.582-RED-01025-00.xml \
-	           to=$(OUTPUT)/CAS-MCO-2016-11-26T22.32.39.582-RED-01025-00.cub > /dev/null;
+	$(APPNAME) from=$(INPUT)/CAS-MCO-2016-11-22T15.45.50.984-RED-01000-B1.xml \
+	           to=$(OUTPUT)/CAS-MCO-2016-11-22T15.45.50.984-RED-01000-B1.cub > /dev/null;
 
-	catlab from=$(OUTPUT)/CAS-MCO-2016-11-26T22.32.39.582-RED-01025-00.cub \
+	catlab from=$(OUTPUT)/CAS-MCO-2016-11-22T15.45.50.984-RED-01000-B1.cub \
 	       to=$(OUTPUT)/labels.pvl > /dev/null;
diff --git a/isis/src/tgo/apps/tgocassisrdrgen/Makefile b/isis/src/tgo/apps/tgocassisrdrgen/Makefile
deleted file mode 100644
index 7578f0b21d038db6a5042c095cda9b34b6bb2570..0000000000000000000000000000000000000000
--- a/isis/src/tgo/apps/tgocassisrdrgen/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-ifeq ($(ISISROOT), $(BLANK))
-.SILENT:
-error:
-	echo "Please set ISISROOT";
-else
-	include $(ISISROOT)/make/isismake.apps
-endif
\ No newline at end of file
diff --git a/isis/src/tgo/apps/tgocassisrdrgen/tgocassisrdrgen.cpp b/isis/src/tgo/apps/tgocassisrdrgen/tgocassisrdrgen.cpp
index 984cb783919fda9d6dc1e449832e266d9e03df19..5983257fb70a440c6d7bbb9da28e349e59173ec2 100644
--- a/isis/src/tgo/apps/tgocassisrdrgen/tgocassisrdrgen.cpp
+++ b/isis/src/tgo/apps/tgocassisrdrgen/tgocassisrdrgen.cpp
@@ -1,5 +1,6 @@
 #include "Isis.h"
 
+#include <QRegularExpression>
 #include <QString>
 #include <QDomDocument>
 
@@ -27,8 +28,8 @@ void IsisMain() {
   }
 
   // Setup the process and set the input cube
-  ProcessExportPds4 p;
-  Cube *icube = p.SetInputCube("FROM");
+  ProcessExportPds4 process;
+  Cube *icube = process.SetInputCube("FROM");
 
   PvlObject *label= icube->label();
   PvlKeyword &instrument = label->findObject("IsisCube").findGroup("Instrument").findKeyword("InstrumentId");
@@ -46,14 +47,28 @@ void IsisMain() {
   * Add additional pds label data here
   */
 
-  QDomDocument &pdsLabel = p.GetLabel();
+  QDomDocument &pdsLabel = process.GetLabel();
   PvlToXmlTranslationManager cubeLab(*(icube->label()),
                                     "$tgo/translations/tgoCassisExport.trn");
   cubeLab.Auto(pdsLabel);
 
-  p.StandardPds4Label();
+  process.StandardPds4Label();
+
+  // This regular expression matches the pipe followed by the date from
+  // the ISIS version string that Application returns.
+  QRegularExpression versionRegex(" \\| \\d{4}\\-\\d{2}\\-\\d{2}");
+  QString historyDescription = "Created PDS4 output product from ISIS cube with tgocassisrdrgen "
+                               "application from ISIS version "
+                               + Application::Version().remove(versionRegex) + ".";
+  // This regular expression matches the time from the date and time string
+  // that Application returns.
+  QRegularExpression dateRegex("T\\d{2}:\\d{2}:\\d{2}");
+  QString historyDate = Application::DateTime().remove(dateRegex);
+  process.addHistory(historyDescription, historyDate);
+
+  ProcessExportPds4::translateUnits(pdsLabel);
   
   QString outFile = ui.GetFileName("TO");
   
-  p.WritePds4(outFile);
+  process.WritePds4(outFile);
 }
diff --git a/isis/src/tgo/apps/tgocassisrdrgen/tsts/default/Makefile b/isis/src/tgo/apps/tgocassisrdrgen/tsts/default/Makefile
index 0707448791eb360431f43a622ccf4919f4d42755..51212eb085e3b49ab59ca66ed7aa2b1819e39837 100644
--- a/isis/src/tgo/apps/tgocassisrdrgen/tsts/default/Makefile
+++ b/isis/src/tgo/apps/tgocassisrdrgen/tsts/default/Makefile
@@ -31,8 +31,13 @@ commands:
 	       > $(OUTPUT)/templabel2.txt;
 	$(SED) 's+\PEHK_HEADER.*>+\PEHK_HEADER>+' \
 	       $(OUTPUT)/templabel2.txt \
+	       > $(OUTPUT)/templabel3.txt;
+	$(SED) 's+\Modification_Detail.*>+\Modification_Detail>+' \
+	       $(OUTPUT)/templabel3.txt \
 	       > $(OUTPUT)/CAS-MCO-2016-11-26T22.32.39.582-BLU-03025-00.xmlLabel.txt;
 
+
 	$(RM) $(OUTPUT)/CAS-MCO-2016-11-26T22.32.39.582-BLU-03025-00.xml \
 	      $(OUTPUT)/templabel1.txt \
-	      $(OUTPUT)/templabel2.txt;
+	      $(OUTPUT)/templabel2.txt \
+	      $(OUTPUT)/templabel3.txt;
diff --git a/isis/src/hayabusa2/apps/hyb2onc2isis/Makefile b/isis/src/tgo/apps/tgocassisstitch/Makefile
similarity index 100%
rename from isis/src/hayabusa2/apps/hyb2onc2isis/Makefile
rename to isis/src/tgo/apps/tgocassisstitch/Makefile
diff --git a/isis/src/tgo/apps/stitch/stitch.cpp b/isis/src/tgo/apps/tgocassisstitch/tgocassisstitch.cpp
similarity index 96%
rename from isis/src/tgo/apps/stitch/stitch.cpp
rename to isis/src/tgo/apps/tgocassisstitch/tgocassisstitch.cpp
index 79926ed9c09bcd70862168a409bf6798fb2d9977..006881993b196072b7e447a0470d77d71aff9267 100644
--- a/isis/src/tgo/apps/stitch/stitch.cpp
+++ b/isis/src/tgo/apps/tgocassisstitch/tgocassisstitch.cpp
@@ -62,8 +62,8 @@ void IsisMain() {
   }
 
   // Stitch together the individual frames
-  FileName outputFileName(ui.GetFileName("TO"));
-  QString outputBaseName = outputFileName.removeExtension().expanded();
+  FileName outputFileName(ui.GetFileName("OUTPUTPREFIX"));
+  QString outputBaseName = outputFileName.expanded();
   QStringList frameKeys = frameMap.uniqueKeys();
   Progress stitchProgress;
   stitchProgress.SetText("Stitching Frames");
@@ -72,7 +72,7 @@ void IsisMain() {
   foreach(QString frameKey, frameKeys) {
     try {
       QString frameIdentifier = frameKey.split("/").last();
-      FileName frameFileName(outputBaseName + "_" + frameIdentifier + ".cub");
+      FileName frameFileName(outputBaseName + "-" + frameIdentifier + ".cub");
       stitchFrame( frameMap.values(frameKey), frameFileName );
       stitchProgress.CheckStatus();
     }
@@ -143,6 +143,9 @@ void stitchFrame(QList<FileName> frameletList, FileName frameFileName) {
   if ( archGroup.hasKeyword("FileName") ) {
     archGroup.deleteKeyword("FileName");
   }
+  if ( archGroup.hasKeyword("Window_Count") ) {
+    archGroup.deleteKeyword("Window_Count");
+  }
   bandBinGroup += PvlKeyword("FilterName", "FULLCCD");
 
   // Setup Stitch group keywords
@@ -155,7 +158,6 @@ void stitchFrame(QList<FileName> frameletList, FileName frameFileName) {
   stitchGroup += PvlKeyword("FilterSamples");
   stitchGroup += PvlKeyword("FilterStartLines");
   stitchGroup += PvlKeyword("FilterLines");
-  stitchGroup += PvlKeyword("FilterProductIds");
   stitchGroup += PvlKeyword("FilterFileNames");
 
   // Propagate tables and spice
@@ -208,7 +210,6 @@ void stitchFrame(QList<FileName> frameletList, FileName frameFileName) {
     stitchGroup["FilterLines"]        += toString(frameletAlphaCube.BetaLines());
 
     PvlGroup frameletArchGroup = frameletCube->group("Archive");
-    stitchGroup["FilterProductIds"] += frameletArchGroup["ProductId"];
     stitchGroup["FilterFileNames"]  += frameletArchGroup["FileName"];
 
     
@@ -268,8 +269,6 @@ Cube *StitchFunctor::outputCube() const {
  * frame cube.
  * 
  * @param in A line of data from the input cube.
- * 
- * @TODO handle summing
  */
 void StitchFunctor::operator()(Isis::Buffer &in) const {
   // Setup the line manager to write to the frame cube
diff --git a/isis/src/tgo/apps/stitch/stitch.xml b/isis/src/tgo/apps/tgocassisstitch/tgocassisstitch.xml
similarity index 82%
rename from isis/src/tgo/apps/stitch/stitch.xml
rename to isis/src/tgo/apps/tgocassisstitch/tgocassisstitch.xml
index 93876e006ef132ec24f44e31f1340045afd8caa8..af0af8caad336da34a057b4e5776d57e90f0d32c 100644
--- a/isis/src/tgo/apps/stitch/stitch.xml
+++ b/isis/src/tgo/apps/tgocassisstitch/tgocassisstitch.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
-<application name="stitch" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://isis.astrogeology.usgs.gov/Schemas/Application/application.xsd">
+<application name="tgocassisstitch" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://isis.astrogeology.usgs.gov/Schemas/Application/application.xsd">
 
   <brief>
     Stitch together multiple TGO CaSSIS framelets into full frame images.
@@ -22,6 +22,10 @@
     <change name="Jesse Mapel" date="2017-09-15">
       Changed name from tgostitch to stitch. Still only works with TGO CaSSIS images. References #5156.
     </change>
+    <change name="Kristin Berry" date="2017-11-14">
+      Backward Compatibility Issue: Changed name from stitch to tgocassisstitch and
+      changed output parameter name "TO" to "OUTPUTPREFIX."
+    </change>
   </history>
 
   <category>
@@ -47,7 +51,7 @@
         </filter>
       </parameter>
 
-      <parameter name="TO">
+      <parameter name="OUTPUTPREFIX">
          <type>cube</type>
          <fileMode>output</fileMode>
          <brief>
diff --git a/isis/src/tgo/apps/stitch/tsts/Makefile b/isis/src/tgo/apps/tgocassisstitch/tsts/Makefile
similarity index 100%
rename from isis/src/tgo/apps/stitch/tsts/Makefile
rename to isis/src/tgo/apps/tgocassisstitch/tsts/Makefile
diff --git a/isis/src/tgo/apps/stitch/tsts/singleframe/Makefile b/isis/src/tgo/apps/tgocassisstitch/tsts/multiframe/Makefile
similarity index 71%
rename from isis/src/tgo/apps/stitch/tsts/singleframe/Makefile
rename to isis/src/tgo/apps/tgocassisstitch/tsts/multiframe/Makefile
index 485ecb68888d30cae681ce7224196a5ed776f380..929cde45b2e3e5185c9f6378d8948f5c228e8d94 100644
--- a/isis/src/tgo/apps/stitch/tsts/singleframe/Makefile
+++ b/isis/src/tgo/apps/tgocassisstitch/tsts/multiframe/Makefile
@@ -1,11 +1,11 @@
-APPNAME = stitch
+APPNAME = tgocassisstitch
 
 include $(ISISROOT)/make/isismake.tsts
 
 commands:
 	ls $(INPUT)/*.cub > $(OUTPUT)/framelets.lis
-	stitch fromlist=$(OUTPUT)/framelets.lis \
-	to=$(OUTPUT)/CAS-MCO.cub > /dev/null;
+	$(APPNAME) fromlist=$(OUTPUT)/framelets.lis \
+	outputprefix=$(OUTPUT)/CAS-MCO > /dev/null;
 	ls $(OUTPUT)/*.cub | sed 's/\.cub//' > $(OUTPUT)/frames.lis
 	catlab from=$\$$\1.cub to=\$$\1.pvl -batchlist=$(OUTPUT)/frames.lis > /dev/null;
 	rm $(OUTPUT)/framelets.lis
diff --git a/isis/src/tgo/apps/stitch/tsts/multiframe/Makefile b/isis/src/tgo/apps/tgocassisstitch/tsts/singleframe/Makefile
similarity index 71%
rename from isis/src/tgo/apps/stitch/tsts/multiframe/Makefile
rename to isis/src/tgo/apps/tgocassisstitch/tsts/singleframe/Makefile
index 485ecb68888d30cae681ce7224196a5ed776f380..929cde45b2e3e5185c9f6378d8948f5c228e8d94 100644
--- a/isis/src/tgo/apps/stitch/tsts/multiframe/Makefile
+++ b/isis/src/tgo/apps/tgocassisstitch/tsts/singleframe/Makefile
@@ -1,11 +1,11 @@
-APPNAME = stitch
+APPNAME = tgocassisstitch
 
 include $(ISISROOT)/make/isismake.tsts
 
 commands:
 	ls $(INPUT)/*.cub > $(OUTPUT)/framelets.lis
-	stitch fromlist=$(OUTPUT)/framelets.lis \
-	to=$(OUTPUT)/CAS-MCO.cub > /dev/null;
+	$(APPNAME) fromlist=$(OUTPUT)/framelets.lis \
+	outputprefix=$(OUTPUT)/CAS-MCO > /dev/null;
 	ls $(OUTPUT)/*.cub | sed 's/\.cub//' > $(OUTPUT)/frames.lis
 	catlab from=$\$$\1.cub to=\$$\1.pvl -batchlist=$(OUTPUT)/frames.lis > /dev/null;
 	rm $(OUTPUT)/framelets.lis
diff --git a/isis/src/juno/apps/junocam2isis/Makefile b/isis/src/tgo/apps/tgocassisunstitch/Makefile
similarity index 100%
rename from isis/src/juno/apps/junocam2isis/Makefile
rename to isis/src/tgo/apps/tgocassisunstitch/Makefile
diff --git a/isis/src/tgo/apps/unstitch/unstitch.cpp b/isis/src/tgo/apps/tgocassisunstitch/tgocassisunstitch.cpp
similarity index 93%
rename from isis/src/tgo/apps/unstitch/unstitch.cpp
rename to isis/src/tgo/apps/tgocassisunstitch/tgocassisunstitch.cpp
index 95e0e9c52e8c766199eb03a4ccb18af84e4e096b..b18d80f37513f2b76ceea000bd05e845dccbc2e9 100644
--- a/isis/src/tgo/apps/unstitch/unstitch.cpp
+++ b/isis/src/tgo/apps/tgocassisunstitch/tgocassisunstitch.cpp
@@ -105,8 +105,14 @@ void IsisMain() {
   // Determine sizes of framelets in input fullframe images
 
   // Allocate this number of total cubes of the correct size
-  FileName outputFileName(ui.GetFileName("TO"));
-  QString outputBaseName = outputFileName.removeExtension().expanded();
+  FileName outputFileName(ui.GetFileName("OUTPUTPREFIX"));
+
+  // Sometimes there will be '.'s in an OUTPUT prefix that could 
+  // be confused with a file extension
+  QString outputBaseName = outputFileName.expanded(); 
+  if (outputFileName.extension() == "cub") {
+   outputBaseName = outputFileName.removeExtension().expanded(); 
+  }
 
   // Create and output a list of 
   QFile allCubesListFile(outputBaseName + ".lis");
@@ -154,10 +160,10 @@ void IsisMain() {
     
     PvlGroup &bandBin = frameletLabel->findGroup("BandBin", PvlObject::Traverse);
 
-    bandBin.addKeyword(PvlKeyword("FilterName", g_frameletInfoList[i].m_filterName), 
+    bandBin.addKeyword(PvlKeyword("Name", g_frameletInfoList[i].m_filterName), 
                                                 PvlObject::Replace);
-    bandBin.addKeyword(PvlKeyword("FilterCenter", toString(g_frameletInfoList[i].m_wavelength)));
-    bandBin.addKeyword(PvlKeyword("FilterWidth", toString(g_frameletInfoList[i].m_width)));
+    bandBin.addKeyword(PvlKeyword("Center", toString(g_frameletInfoList[i].m_wavelength)));
+    bandBin.addKeyword(PvlKeyword("Width", toString(g_frameletInfoList[i].m_width)));
     bandBin.addKeyword(PvlKeyword("NaifIkCode", toString(g_frameletInfoList[i].m_frameId)));
 
     // Add the alpha cube
diff --git a/isis/src/tgo/apps/unstitch/unstitch.xml b/isis/src/tgo/apps/tgocassisunstitch/tgocassisunstitch.xml
similarity index 56%
rename from isis/src/tgo/apps/unstitch/unstitch.xml
rename to isis/src/tgo/apps/tgocassisunstitch/tgocassisunstitch.xml
index 7a79d591ca4ee8d5378b302d4e874e1eba0377c4..775db7d75d9236ad0e64d017031d5eb8ca4404bb 100644
--- a/isis/src/tgo/apps/unstitch/unstitch.xml
+++ b/isis/src/tgo/apps/tgocassisunstitch/tgocassisunstitch.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
-<application name="unstitch" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://isis.astrogeology.usgs.gov/Schemas/Application/application.xsd">
+<application name="tgocassisunstitch" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://isis.astrogeology.usgs.gov/Schemas/Application/application.xsd">
 
   <brief>
     Unstitch a  TGO CaSSIS full frame image into several TGO CaSSIS framelets.
@@ -14,6 +14,16 @@
     <change name="Kristin Berry" date="2017-09-15">
       Original version
     </change>
+    <change name="Kristin Berry" date="2017-11-14">
+      Backward Compatibility Issue:  changed application name from unstitch to tgocassisunstitch and
+      changed the output parameter name "TO" to "OUTPUTPREFIX" to more accurately reflect its use.
+    </change> 
+     <change name="Kristin Berry" date="2017-11-23">
+      Updated the behavior of the application when the user inputs an OUTPUTPREFIX without the .cub extension, 
+      but containing other '.'s  in the string to not strip off everything after the last period. For example, if the 
+      user inputs CAS-MCO-2016-11-22T16:10:43.505 as the OUTPUTPREFIX, now the 505 will now be retained. 
+    </change>
+
   </history>
 
   <category>
@@ -36,7 +46,7 @@
         </filter>
       </parameter>
 
-      <parameter name="TO">
+      <parameter name="OUTPUTPREFIX">
          <type>cube</type>
          <fileMode>output</fileMode>
          <brief>
@@ -45,6 +55,9 @@
          <description>
            The output ISIS cubes will be of the form basename_filter_frameletNumber.cub
            There will also be a list produced with the same name. 
+	   
+	   This prefix can either be specified in the form "name.cub" or simply "name" without the .cub
+	   extension.  
          </description>
          <filter>
            *.cub
diff --git a/isis/src/tgo/apps/tgocassisrdrgen/tsts/Makefile b/isis/src/tgo/apps/tgocassisunstitch/tsts/Makefile
similarity index 100%
rename from isis/src/tgo/apps/tgocassisrdrgen/tsts/Makefile
rename to isis/src/tgo/apps/tgocassisunstitch/tsts/Makefile
diff --git a/isis/src/tgo/apps/tgocassisunstitch/tsts/default/Makefile b/isis/src/tgo/apps/tgocassisunstitch/tsts/default/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..5468d332956b83fed9b1e2e259be3e52f17a8f66
--- /dev/null
+++ b/isis/src/tgo/apps/tgocassisunstitch/tsts/default/Makefile
@@ -0,0 +1,13 @@
+APPNAME = tgocassisunstitch
+
+include $(ISISROOT)/make/isismake.tsts
+
+commands:
+        # Test output prefix with standard extension (will be removed)
+	$(APPNAME) from=$(INPUT)/CAS-MCO-2016-11-22T16:10:43.505.cub \
+	           outputprefix=$(OUTPUT)/CAS-MCO_2016-11-22T16:10:43.505.cub > /dev/null;
+	mv $(OUTPUT)/CAS-MCO_2016-11-22T16:10:43.505.lis \
+	   $(OUTPUT)/CAS-MCO_2016-11-22T16:10:43.505.txt;
+
+
+
diff --git a/isis/src/tgo/apps/tgocassisunstitch/tsts/spiced/Makefile b/isis/src/tgo/apps/tgocassisunstitch/tsts/spiced/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..83f4f7de47e45a843bff4f0f7c3d02baf9d2e4d0
--- /dev/null
+++ b/isis/src/tgo/apps/tgocassisunstitch/tsts/spiced/Makefile
@@ -0,0 +1,9 @@
+APPNAME = tgocassisunstitch
+
+include $(ISISROOT)/make/isismake.tsts
+
+commands:
+	$(APPNAME) from=$(INPUT)/CAS-MCO-2016-11-22T16:10:43.505.cub \
+	           outputprefix=$(OUTPUT)/CAS-MCO-2016-11-22T16:10:43.505.cub > /dev/null;
+	mv $(OUTPUT)/CAS-MCO-2016-11-22T16:10:43.505.lis \
+	   $(OUTPUT)/CAS-MCO-2016-11-22T16:10:43.505.txt;
diff --git a/isis/src/tgo/apps/unstitch/Makefile b/isis/src/tgo/apps/unstitch/Makefile
deleted file mode 100644
index 7578f0b21d038db6a5042c095cda9b34b6bb2570..0000000000000000000000000000000000000000
--- a/isis/src/tgo/apps/unstitch/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-ifeq ($(ISISROOT), $(BLANK))
-.SILENT:
-error:
-	echo "Please set ISISROOT";
-else
-	include $(ISISROOT)/make/isismake.apps
-endif
\ No newline at end of file
diff --git a/isis/src/tgo/apps/unstitch/tsts/Makefile b/isis/src/tgo/apps/unstitch/tsts/Makefile
deleted file mode 100644
index 46d84c74c297304e943452a44e06b111f179a92b..0000000000000000000000000000000000000000
--- a/isis/src/tgo/apps/unstitch/tsts/Makefile
+++ /dev/null
@@ -1,4 +0,0 @@
-BLANKS = "%-6s"    
-LENGTH = "%-40s"
-
-include $(ISISROOT)/make/isismake.tststree
diff --git a/isis/src/tgo/apps/unstitch/tsts/default/Makefile b/isis/src/tgo/apps/unstitch/tsts/default/Makefile
deleted file mode 100644
index 455f0ab25ef276abcfe12e43a6dee91220222458..0000000000000000000000000000000000000000
--- a/isis/src/tgo/apps/unstitch/tsts/default/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
-APPNAME = unstitch
-
-include $(ISISROOT)/make/isismake.tsts
-
-commands:
-	$(APPNAME) from=$(INPUT)/CAS-MCO_2016-11-22T16:10:43.505.cub \
-	           to=$(OUTPUT)/CAS-MCO_2016-11-22T16:10:43.505.cub > /dev/null;
-	mv $(OUTPUT)/CAS-MCO_2016-11-22T16:10:43.505.lis \
-	   $(OUTPUT)/CAS-MCO_2016-11-22T16:10:43.505.txt;
diff --git a/isis/src/tgo/apps/unstitch/tsts/spiced/Makefile b/isis/src/tgo/apps/unstitch/tsts/spiced/Makefile
deleted file mode 100644
index 455f0ab25ef276abcfe12e43a6dee91220222458..0000000000000000000000000000000000000000
--- a/isis/src/tgo/apps/unstitch/tsts/spiced/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
-APPNAME = unstitch
-
-include $(ISISROOT)/make/isismake.tsts
-
-commands:
-	$(APPNAME) from=$(INPUT)/CAS-MCO_2016-11-22T16:10:43.505.cub \
-	           to=$(OUTPUT)/CAS-MCO_2016-11-22T16:10:43.505.cub > /dev/null;
-	mv $(OUTPUT)/CAS-MCO_2016-11-22T16:10:43.505.lis \
-	   $(OUTPUT)/CAS-MCO_2016-11-22T16:10:43.505.txt;
diff --git a/isis/src/tgo/objs/TgoCassisCamera/TgoCassisCamera.cpp b/isis/src/tgo/objs/TgoCassisCamera/TgoCassisCamera.cpp
index 52dd0db68e031a66242efab56c3305fe91d03617..fa4758fcd9a27f5af5936e9cc0484b80b4cfadeb 100644
--- a/isis/src/tgo/objs/TgoCassisCamera/TgoCassisCamera.cpp
+++ b/isis/src/tgo/objs/TgoCassisCamera/TgoCassisCamera.cpp
@@ -101,8 +101,15 @@ namespace Isis {
     focalMap->SetDetectorOrigin(bsSample, bsLine);
 
     // Setup distortion map
-    new TgoCassisDistortionMap(this, naifIkCode());
-
+    try {
+      new TgoCassisDistortionMap(this, naifIkCode());
+    }
+    catch (IException &e) {
+      // Set NULL so that cameras destructor wont seg fault trying to delete
+      SetDistortionMap(NULL, false);
+      QString msg = "Unable to Create TgoCassisDistortionMap";
+      throw IException(e, IException::Unknown, msg, _FILEINFO_);
+    }
     // Setup the ground and sky map
     new CameraGroundMap(this);
     new CameraSkyMap(this);
diff --git a/isis/src/tgo/objs/TgoCassisCamera/TgoCassisCamera.h b/isis/src/tgo/objs/TgoCassisCamera/TgoCassisCamera.h
index acb58eb1f455808992bcb1fb64f6b6c31cd00451..b77f1b82d7bc2558ddfaebd193754e9bc371e0ee 100644
--- a/isis/src/tgo/objs/TgoCassisCamera/TgoCassisCamera.h
+++ b/isis/src/tgo/objs/TgoCassisCamera/TgoCassisCamera.h
@@ -71,6 +71,9 @@ namespace Isis {
    *   @history 2017-09-15 Jesse Mapel - Removed setting the detector start line
    *                           because it is now being handled by the alpha
    *                           cube group. Fixes #5156.
+   *   @history 2018-01-11 Christopher Combs - Added try/catch around creation of
+   *                           cameras distortion map to prevent segfault when 
+   *                           destructing. Fixes #5163.
    */
   class TgoCassisCamera : public FramingCamera {
     public:
diff --git a/isis/src/voyager/apps/voy2isis/voy2isis.cpp b/isis/src/voyager/apps/voy2isis/voy2isis.cpp
index 9eeb1cfc82eb0b4fd8711be7e7c80605f4ec7b9d..5c6b6002a26a500c22156d1801eee0f4f4db2791 100644
--- a/isis/src/voyager/apps/voy2isis/voy2isis.cpp
+++ b/isis/src/voyager/apps/voy2isis/voy2isis.cpp
@@ -4,13 +4,20 @@
 #include <fstream>
 #include <iostream>
 #include <iomanip>
+#include <istream>
+#include <sstream>
+#include <string>
 
+#include <QByteArray>
 #include <QFile>
+#include <QFileInfo>
 #include <QString>
+#include <QTextStream>
 
 #include <SpiceUsr.h>
 
 #include "FileName.h"
+#include "History.h"
 #include "IException.h"
 #include "IString.h"
 #include "NaifStatus.h"
@@ -18,14 +25,16 @@
 #include "ProgramLauncher.h"
 #include "Pvl.h"
 #include "PvlGroup.h"
+#include "PvlKeyword.h"
 #include "PvlToPvlTranslationManager.h"
 #include "UserInterface.h"
 
 using namespace std;
 using namespace Isis;
 
-void TranslateVoyagerLabels(Pvl &inputLabel, Cube *ocube);
+void TranslateVoyagerLabels(Pvl &inputLab, Cube *ocube);
 void ConvertComments(FileName file);
+QByteArray fixLabels(QString fileName, History *hist);
 
 void IsisMain() {
   // We should be processing a PDS file
@@ -40,7 +49,7 @@ void IsisMain() {
 
   // input files are compressed, use vdcomp to decompress
   QString ext = in.extension().toUpper();
-  if(ext == "IMQ") {
+  if (ext == "IMQ") {
     try {
       QString command = "$ISISROOT/bin/vdcomp " + in.expanded() + " " + temp.expanded();
       // don't pretend vdcomp is a standard Isis program, just run it
@@ -49,37 +58,62 @@ void IsisMain() {
       ConvertComments(in);
       tempFile = true;
     }
-    catch(IException &e) {
+    catch (IException &e) {
       throw IException(IException::Io,
                        "Unable to decompress input file ["
                        + in.name() + "].", _FILEINFO_);
     }
   }
-  else if (ext == "IMG") {
-    // Do nothing
+  
+  // Convert the pds file to a cube
+  Pvl *pdsLabel = new Pvl();
+
+  // Preparse the IMG to fix messed up labels
+
+  History *hist = new History("IsisCube");
+  QByteArray pdsData = fixLabels(in.expanded(), hist);
+
+  QTextStream pdsTextStream(&pdsData);
+  istringstream pdsStream(pdsTextStream.readAll().toStdString());
+
+  pdsStream >> *pdsLabel;
+
+  if (pdsLabel->hasKeyword("LBL") &&
+      pdsLabel->findKeyword("LBL").isNull()) {
+    QString msg = "No label information.";
+    throw IException(IException::User, msg, _FILEINFO_);
   }
-  else {
-    QString msg = "Input file [" + in.name() +
-                 "] does not appear to be a Voyager EDR";
+
+  if (pdsLabel->hasKeyword("PRODUCT_TYPE") &&
+  !pdsLabel->findKeyword("PRODUCT_TYPE").isEquivalent("DECOMPRESSED_RAW_IMAGE")) {
+    QString msg = "ISIS does not currently support images of product types other than raw.";
     throw IException(IException::User, msg, _FILEINFO_);
   }
-  // Convert the pds file to a cube
-  Pvl pdsLabel;
+
   try {
-    p.SetPdsFile(in.expanded(), "", pdsLabel);
+    p.SetPdsFile(*pdsLabel, in.expanded());
   }
-  catch(IException &e) {
-    QString msg = "Unable to set PDS file.  Decompressed input file ["
+  catch (IException &e) {
+    QString msg = "Unable to set PDS file. Decompressed input file ["
                  + in.name() + "] does not appear to be a PDS product";
     throw IException(IException::User, msg, _FILEINFO_);
   }
 
   Cube *ocube = p.SetOutputCube("TO");
   p.StartProcess();
-  TranslateVoyagerLabels(pdsLabel, ocube);
-  p.EndProcess();
+  try  {
+    TranslateVoyagerLabels(*pdsLabel, ocube);
+  }
+  catch (IException e) {
+    e.print();
+  }
+
+  ocube->write(*hist);
 
-  if(tempFile) QFile::remove(temp.expanded());
+  p.EndProcess();
+  
+  delete pdsLabel;
+  if (tempFile) QFile::remove(temp.expanded());
 }
 
 /**
@@ -128,10 +162,26 @@ void ConvertComments(FileName file) {
  *   @history 2009-03-11 Jeannie Walldren - Original Version
  *   @history 2015-07-22 Kristin Berry - Added NaifStatus::CheckErrors()
  */
-void TranslateVoyagerLabels(Pvl &inputLabel, Cube *ocube) {
+void TranslateVoyagerLabels(Pvl &inputLab, Cube *ocube) {
+  Pvl inputLabel(inputLab);
+
   // Get the directory where the Voyager translation tables are
   PvlGroup &dataDir = Preference::Preferences().findGroup("DataDirectory");
-  QString missionDir = (QString) dataDir[(QString)inputLabel["SpacecraftName"]];
+  QString missionDir;
+  if (inputLabel.hasKeyword("SPACECRAFT_NAME")) {
+    missionDir = (QString) dataDir[(QString)inputLabel["SPACECRAFT_NAME"]];
+  }
+  else if (inputLabel.hasKeyword("INSTRUMENT_HOST_NAME")) {
+    if ((QString)inputLabel["INSTRUMENT_HOST_NAME"] == "VOYAGER 1") {
+      missionDir = (QString) dataDir["VOYAGER_1"];
+    }
+    else if ((QString)inputLabel["INSTRUMENT_HOST_NAME"] == "VOYAGER 2") {
+      missionDir = (QString) dataDir["VOYAGER_2"];
+    }
+    else {
+      missionDir = (QString) dataDir[(QString)inputLabel["INSTRUMENT_HOST_NAME"]];
+    }
+  }
   FileName transFile(missionDir + "/translations/voyager.trn");
 
   // Get the translation manager ready
@@ -198,8 +248,8 @@ void TranslateVoyagerLabels(Pvl &inputLabel, Cube *ocube) {
       instId = "isswa";
     }
     else {
-      QString msg = "Instrument ID [" + instId + "] does not match Narrow or" +
-                   "Wide angle camera";
+      QString msg = "Instrument ID [" + instId + "] does not match Narrow or " +
+                    "Wide angle camera. The cube was created, but the labels were not translated.";
       throw IException(IException::User, msg, _FILEINFO_);
     }
   }
@@ -216,8 +266,8 @@ void TranslateVoyagerLabels(Pvl &inputLabel, Cube *ocube) {
       instId = "isswa";
     }
     else {
-      QString msg = "Instrument ID [" + instId + "] does not match Narrow or" +
-                   "Wide angle camera";
+      QString msg = "Instrument ID [" + instId + "] does not match Narrow or " +
+                    "Wide angle camera. The cube was created, but the labels were not translated.";
       throw IException(IException::User, msg, _FILEINFO_);
     }
   }
@@ -401,3 +451,83 @@ void TranslateVoyagerLabels(Pvl &inputLabel, Cube *ocube) {
   NaifStatus::CheckErrors();   
 }
 
+
+/**
+ * @brief   Fixes the broken tags in the IMG file. The IMG file is loaded into memory,
+ *          and after the fixes are applied, the corrected labels are returned as
+ *          a QByteArray.
+ * @param   fileName The full path to the Voyager input IMG
+ * @return  A QByteArray containing the modified Voyager labels. This is fed to
+ *          a QTextStream which is then fed to a Pvl object.
+ * @internal
+ *   @history 2017-06-28 Marjorie Hahn - Original Version
+ */
+QByteArray fixLabels(QString fileName, History *hist){
+
+  QByteArray null;
+  QFile imgFile;
+
+  imgFile.setFileName(fileName);
+
+  if (!imgFile.open(QFile::ReadOnly|QIODevice::Text))
+    return null;
+
+  // Read the IMG file into a byte array
+  QByteArray fileData = imgFile.readAll();
+  QByteArray labels;
+
+  QString labelEnd("\nEND");
+  int ix = fileData.lastIndexOf(labelEnd);
+
+  labels = fileData.left(ix + labelEnd.size());
+  PvlObject hEntry = Isis::iApp->History();
+
+  // Check if the instrument name is valid
+  if (labels.contains(QByteArray("INSTRUMENT_NAME\n"))) {
+    labels.replace("INSTRUMENT_NAME", "INSTRUMENT_NAME                  = Unknown");
+
+    PvlGroup insNameWarning("Warning");
+    PvlKeyword insNameMsg("Message", "The INSTRUMENT_NAME for [" + fileName + "] is empty."
+                              + "The InstrumentId in the output cube will instead be set to "
+                              + "[Unknown] and the labels will not translate.");
+    insNameWarning += insNameMsg;
+    Application::Log(insNameWarning);
+
+    hEntry += insNameWarning;
+  }
+
+  // Check if image id is valid
+  int imageIdIndex = labels.indexOf(QByteArray("IMAGE_ID"));
+  int i = imageIdIndex;
+  char c;
+  bool replaceImageId = false;
+  while (c != '\n' && i != -1) {
+    c = labels[i];
+
+    // If character is out of range, image id is corrupt and must be replaced
+    if (c < 0 || c > 127) {
+      replaceImageId = true;
+    }
+    i++;
+  }
+
+  QFileInfo fi(fileName);
+  QString baseName = fi.baseName();
+
+
+  if (replaceImageId == true) {
+    labels.replace(imageIdIndex,
+                   i - imageIdIndex - 1,
+                   QByteArray("IMAGE_ID                         = ").append(baseName));
+    PvlGroup insIdWarning("Warning");
+    PvlKeyword insIdMsg("Message", "The IMAGE_ID for [" + fileName + "] is corrupted. The ProductId "
+                              + "in the output cube will instead be set to [" + baseName + "].");
+    insIdWarning += insIdMsg;
+    Application::Log(insIdWarning);
+
+    hEntry += insIdWarning;
+  }
+  hist->AddEntry(hEntry);
+
+  return labels;
+}
diff --git a/isis/src/voyager/apps/voy2isis/voy2isis.xml b/isis/src/voyager/apps/voy2isis/voy2isis.xml
index b3485f95f3d01565452c3bc7562e0d1ff9839c45..8c90997ee817ad2e2e5403a1c73153df17e74eb4 100644
--- a/isis/src/voyager/apps/voy2isis/voy2isis.xml
+++ b/isis/src/voyager/apps/voy2isis/voy2isis.xml
@@ -46,6 +46,15 @@
     <change name="Kristin Berry" date="2015-07-22">
       Added NaifStatus::CheckErrors() to see if any NAIF errors were signaled. References #2248
     </change>
+    <change name="Adam Pacquette" date="2017-06-23">
+      Added support for inputting files as decompressed LBL/IMG pairs. Fixes #4345
+    </change>
+    <change name="Marjorie Hahn" date="2017-08-09">
+      Added label preparsing to modify corrupt labels. Fixes #4421.
+    </change>
+    <change name="Christopher Combs" date="2018-01-19">
+      Made changes to allow merge of two voy2isis tickets. References #4421, #4345.
+    </change>
   </history>
 
   <category>
@@ -92,9 +101,11 @@
           Input Voyager EDR image file
         </brief>
         <description>
-          Use this parameter to select the Voyager PDS EDR file to be imported.  
-          These files are in compressed format and have the form cnnnnnnn.imq 
-          where "nnnnnnn" is the FDS count.
+          Use this parameter to select the Voyager PDS EDR file to be imported.
+          These files are in compressed format and have the form cnnnnnnn.imq
+          where "nnnnnnn" is the FDS count. When selecting input files that are
+          decompressed, set this parameter to the LBL file that points to the
+          corresponding IMG.
         </description>
         <filter>
           *.imq