diff --git a/.gitignore b/.gitignore
index 2dbc8aed8e3ded5aacb8c53f319fb0921bbef860..a0f8196a2169944cc0d3de2e3017a91c46a6e11d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -58,6 +58,9 @@ install/
 !isis/tests/data/near/msi2isis/*.lbl
 !isis/tests/data/near/msicamera/*.cub
 
+# Ensure the contents of ISISDATA mockup tests are preserved
+!isis/tests/data/isisdata/mockup/**/*
+
 # Ignore vs code
 .vscode
 
diff --git a/CHANGELOG.md b/CHANGELOG.md
index da4f2a30a340c34736bebae7086e4f1dd4e235bd..15f2be4e0eda7871fe6525a01f50196b0c8c5f34 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -55,13 +55,14 @@ release.
 
 ### Added
 - Added LatLonGrid Tool to Qview to view latitude and longitude lines if camera model information is present.
+- Added a new application, _isisdataeval_, that validates/verifies ISISDATA installations and aids in the development and management of this resource. Users can use _isisdataeval_ to help resolve runtime problems related to ISIS kernels and calibration processing. In fact, it is designed to be used on any directory as it will create a detailed install volume inventory with file/volume hashes and is not restricted to ISIS use. [#5110](https://github.com/USGS-Astrogeology/ISIS3/issues/5110) [#5111](https://github.com/USGS-Astrogeology/ISIS3/pull/5111)
 
 ### Deprecated
 
 ### Fixed
 - Fixed some wrong parameter types [#4780](https://github.com/USGS-Astrogeology/ISIS3/issues/4780)
 - Added mapping group to track cube via processmosaic [#4810](https://github.com/USGS-Astrogeology/ISIS3/issues/4810)
-- Fixed bugs in downloadIsisData script [#5024](https://github.com/USGS-Astrogeology/ISIS3/issues/5024) 
+- Fixed bugs in downloadIsisData script [#5024](https://github.com/USGS-Astrogeology/ISIS3/issues/5024)
 - Fixed shadow shifting image by 2 pixels to the upper left corner. [#5035](https://github.com/USGS-Astrogeology/ISIS3/issues/5035)
 - Fixed compiler warnings on ubuntu [#4911](https://github.com/USGS-Astrogeology/ISIS3/issues/4911)
 - Fixes embree shape models not being from .BDS extension files [5064](https://github.com/USGS-Astrogeology/ISIS3/issues/5064)
diff --git a/isis/src/system/apps/isisdataeval/IsisDataModel.cpp b/isis/src/system/apps/isisdataeval/IsisDataModel.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..42297b09be9204d90efc0c8b1decd3807123dc71
--- /dev/null
+++ b/isis/src/system/apps/isisdataeval/IsisDataModel.cpp
@@ -0,0 +1,813 @@
+/** This is free and unencumbered software released into the public domain.
+
+The authors of ISIS do not claim copyright on the contents of this file.
+For more details about the LICENSE terms and the AUTHORS, you will
+find files of those names at the top level of this repository. **/
+
+/* SPDX-License-Identifier: CC0-1.0 */
+
+#include <vector>
+#include <tuple>
+#include <algorithm>
+#include <iomanip>
+
+#include <Qt>
+#include <QString>
+#include <QStringList>
+#include <QDir>
+#include <QDirIterator>
+#include <QFile>
+#include <QFileInfo>
+#include <QIODevice>
+#include <QCryptographicHash>
+
+#include "FileName.h"
+#include "IException.h"
+#include "IsisDataModel.h"
+#include "IString.h"
+#include "iTime.h"
+#include "Preference.h"
+#include "Pvl.h"
+#include "PvlKeyword.h"
+#include "PvlGroup.h"
+
+namespace Isis {
+  namespace Data {
+
+
+    //***********************************************************************************
+    // DBTimeCoverage Implementations
+    //***********************************************************************************
+    DBTimeCoverage::DBTimeCoverage() : m_starttime( ), m_stoptime( ),
+                                       m_isvalid ( false ) { }
+    DBTimeCoverage::DBTimeCoverage( const iTime &start_t, const iTime &stop_t ) :
+                                    m_starttime( start_t ), m_stoptime( stop_t ),
+                                    m_isvalid ( true ) { }
+
+    DBTimeCoverage::DBTimeCoverage( const QString &start_s, const QString &stop_s ) :
+                                    m_starttime( ), m_stoptime( ),
+                                    m_isvalid ( false ) {
+
+      QString start_t = ( !start_s.isEmpty() ) ? start_s : stop_s;
+      QString stop_t  = ( !stop_s.isEmpty() )  ? stop_s : start_t;
+
+      if ( !start_t.isEmpty() && !stop_t.isEmpty() ) {
+        setTime( iTime( start_t) , iTime( stop_t ) );
+      }
+    }
+
+    DBTimeCoverage::DBTimeCoverage( const iTime &start_t ) :
+                                    m_starttime( start_t ), m_stoptime( start_t ),
+                                    m_isvalid ( true ) { }
+    DBTimeCoverage::DBTimeCoverage( const QString &start_s ) :
+                                    m_starttime(  ), m_stoptime(  ),
+                                    m_isvalid ( false ) {
+      if ( !start_s.isEmpty() ) {
+        iTime time_s( start_s );
+        setTime( time_s, time_s );
+      }
+    }
+
+      /** Check if a time is in the coverage timestamp */
+    bool DBTimeCoverage::contains( const DBTimeCoverage &t_time,
+                                   const bool partial ) const {
+      if ( t_time.isvalid() ) {
+        if ( this->isvalid() ) {
+          if ( t_time.starttime().Et() <= this->stoptime().Et() ) {
+            if ( t_time.stoptime().Et() >= this->starttime().Et() ) {
+              if ( partial ) {
+                return ( true );
+              }
+              else {
+                if ( t_time.starttime().Et()   >= this->starttime().Et() ) {
+                  if ( t_time.stoptime().Et() <= this->stoptime().Et() ) {
+                    return ( true );
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+
+      return ( false );
+    }
+
+    isisdata_json DBTimeCoverage::to_json( const DBTimeCoverage &dbtimecoverage ) {
+      isisdata_json js_dbtcov;
+
+      if ( dbtimecoverage.isvalid() ) {
+        js_dbtcov["starttime"]   = dbtimecoverage.starttime().UTC().toStdString();
+        js_dbtcov["stoptime"]    = dbtimecoverage.stoptime().UTC().toStdString();
+        js_dbtcov["starttimeet"] = dbtimecoverage.starttime().Et();
+        js_dbtcov["stoptimeet"]  = dbtimecoverage.stoptime().Et();
+      }
+      else {
+        isisdata_json is_null;
+        js_dbtcov["starttime"]   = is_null;
+        js_dbtcov["stoptime"]    = is_null;
+        js_dbtcov["starttimeet"] = is_null;
+        js_dbtcov["stoptimeet"]  = is_null;
+      }
+
+      return ( js_dbtcov );
+    }
+
+
+    //***********************************************************************************
+    // DBFileStatus Implementations
+    //***********************************************************************************
+    DBFileStatus::DBFileStatus() : m_file() { }
+    DBFileStatus::DBFileStatus( const DBFileStatus::DBFileData &dbfile ) : m_file ( dbfile ) { }
+    DBFileStatus::DBFileStatus( const FileName &dbfile, const QFileInfo &dbfileinfo ) :
+                                m_file(dbfile.original(), dbfile , dbfileinfo, "DBFileStatus" ) { }
+
+    DBFileStatus::DBFileStatus( const FileName &dbfile, const bool versionIt ) :
+                                m_file( dbfile.original(), dbfile, QFileInfo( dbfile.expanded() ), "DBFileStatus") {
+      if ( versionIt ) versionize();
+    }
+
+    DBFileStatus::DBFileStatus( const QString &dbfile, const bool versionIt ) : m_file() {
+      FileName v_file( dbfile );
+      m_file = DBFileData( dbfile, v_file, QFileInfo( v_file.expanded() ), "DBFileStatus");
+      if ( versionIt ) versionize();
+    }
+
+    bool DBFileStatus::versionize( ) {
+
+      if ( !file().isVersioned() ) return ( false );
+
+      // Attempt versioning
+      bool isversioned( false) ;
+      try {
+        m_file.m_key = file().highestVersion();
+        m_file.m_data.setFile( file().expanded() );
+        isversioned = true;
+      }
+      catch (...) {
+        // NOOP - return expanded version
+        isversioned = false;
+
+      }
+
+      return ( isversioned );
+    }
+
+    DBFileStatus versionize( const FileName &dbname ) {
+      const bool versionIt = true;
+      return ( DBFileStatus( dbname, versionIt ) );
+    }
+
+    /**
+     * @brief Translates a File keyword using ISIS rules returning status
+     *
+     * @param key
+     * @param prefdata
+     * @param doVersioning
+     * @return DBFileStatus
+     */
+    DBFileStatus DBFileStatus::translate( const PvlKeyword &key,
+                                          const PvlGroup &prefdata,
+                                          const bool doVersioning ) {
+      QString fname, dbfile;
+      bool isGoodToGo( doVersioning );
+      try {
+        if ( key.size() == 2 ) {
+          dbfile = fname = "$" + key[0] + "/" + key[1];  // In case the translation fails...
+          dbfile = prefdata[key[0]][0] + "/" + key[1];
+        }
+        else if ( key.size() == 1 ) {
+          dbfile = fname = key[0];
+        }
+        else {
+          // Ill-formed string, prepare a return string
+          QString bad;
+          for ( int v = 0 ; v < key.size() ; v++) {
+            bad += "[" + key[v] + "]";
+          }
+
+          // If its an empty PvlKeyword...
+          fname  = bad;
+          dbfile = bad;
+          isGoodToGo = false;
+        }
+      } catch ( ... ) {
+        // This can only occur because the missing data lookup failed.
+        // The $ above indicates its a failed mission translation in Preferences
+        isGoodToGo = false;
+      }
+
+      DBFileStatus f_status( dbfile, isGoodToGo );
+      f_status.setName( fname );
+
+      return ( f_status );
+    }
+
+    isisdata_json DBFileStatus::to_json( const DBFileStatus &dbfilestatus ) {
+
+      isisdata_json js_dbfile;
+      isisdata_json is_null;
+
+
+      if ( !dbfilestatus.file().toString().isEmpty() ) {
+        js_dbfile["filespec"] = dbfilestatus.name().toStdString();
+        js_dbfile["filepath"] = dbfilestatus.expanded().toStdString();
+        js_dbfile["exists"]   = json_bool( dbfilestatus.exists() ).toStdString();
+      }
+      else {
+        js_dbfile["filespec"] = is_null;
+        js_dbfile["filepath"] = is_null;
+        js_dbfile["exists"]   = is_null;
+      }
+
+      if ( dbfilestatus.exists() ) {
+        // js_dbfile["file"]     = dbfilestatus.absolute().toStdString();
+        js_dbfile["file"]     = dbfilestatus.info().absoluteFilePath().toStdString();
+        js_dbfile["symlink"]  = json_bool( dbfilestatus.isSymbolicLink() ).toStdString();
+        js_dbfile["target"]   = dbfilestatus.target().toStdString();
+
+        // This will ensure both are valid times
+        DBTimeCoverage  created_t( DBFileStatus::toUTC( dbfilestatus.created() ) );
+        DBTimeCoverage modified_t( DBFileStatus::toUTC( dbfilestatus.modified() ) );
+
+        if ( created_t.isvalid() ) {
+          js_dbfile["created"]    = created_t.starttime().UTC().toStdString();
+          js_dbfile["createdet"]  = created_t.starttime().Et();
+        }
+        else {
+          js_dbfile["created"]    = is_null;
+          js_dbfile["createdet"]  = is_null;
+        }
+
+        if ( modified_t.isvalid() ) {
+          js_dbfile["modified"]   = modified_t.starttime().UTC().toStdString();
+          js_dbfile["modifiedet"] = modified_t.starttime().Et();
+        }
+        else {
+          js_dbfile["modified"]   = is_null;
+          js_dbfile["modifiedet"] = is_null;
+        }
+
+        js_dbfile["size"]       = dbfilestatus.info().size();
+      }
+      else {
+        isisdata_json is_null;
+        js_dbfile["file"]       = is_null;
+        js_dbfile["symlink"]    = is_null;
+        js_dbfile["target"]     = is_null;
+        js_dbfile["created"]    = is_null;
+        js_dbfile["createdet"]  = is_null;
+        js_dbfile["modified"]   = is_null;
+        js_dbfile["modifiedet"] = is_null;
+        js_dbfile["size"]       = is_null;
+      }
+
+      return ( js_dbfile );
+    }
+
+    QByteArray DBFileStatus::hash( const QCryptographicHash::Algorithm hashAlgorithm ) const {
+      if ( !exists() ) {
+        return ( QByteArray() );
+      }
+
+      // File exists, lets open it and compute the hash
+      QFile v_file( expanded() );
+      if ( !v_file.open( QIODevice::ReadOnly ) ) {
+        QString mess = "Could not open file " + expanded() +  " to compute hash";
+        throw IException( IException::User, mess, _FILEINFO_ );
+      }
+
+      // Compute the hash!
+      QCryptographicHash q_hash( hashAlgorithm );
+      if ( !q_hash.addData( &v_file ) ) {
+        QString mess = "Could not compute hash for  " + expanded();
+        throw IException( IException::User, mess, _FILEINFO_ );
+      }
+
+      // NOTE: The QCryptograhicHash API is different in 6.x!
+      return ( q_hash.result() );
+    }
+
+    DBFileStatus::DBFileHash DBFileStatus::compute_hash( const QString &dbfile,
+                                                         const QCryptographicHash::Algorithm hashAlgorithm ) {
+
+      DBFileStatus v_file( dbfile );
+      return ( DBFileHash( v_file.expanded(), v_file, v_file.hash( hashAlgorithm ), "FileHash") );
+    }
+
+
+    //***********************************************************************************
+    // DBMatch Implementations
+    //***********************************************************************************
+    DBMatch::DBMatch() : m_group( ), m_keyword( ), m_match ( ), m_id() { }
+    DBMatch::DBMatch( const QString &groupname,
+                      const QString &keyword,
+                      const QString &match) :
+                      m_group( groupname ),
+                      m_keyword( keyword ),
+                      m_match( match ),
+                      m_id( db_null() ) {
+      // Make the unique id
+       m_id = makeMatchid();
+    }
+
+    /** Make a (unique) identifier */
+    QString DBMatch::makeMatchid() const {
+
+      // Construct only if valid
+      if ( isvalid() ) {
+        return ( QString( group()+"/"+keyword()+"/"+value() ).toLower() );
+      }
+
+      // If invalid, return null
+      return ( db_null() );
+    }
+
+    DBMatch DBMatch::fromMatchid( const QString &mid ) {
+      QStringList m_fields = mid.split( "/" );   // , Qt::SkipEmptyParts );
+      if ( m_fields.size() != 3 ) return ( DBMatch() );
+      return ( DBMatch( m_fields[0], m_fields[1], m_fields[2] ) );
+    }
+
+    isisdata_json DBMatch::to_json( const DBMatch &dbmatch ) {
+      isisdata_json js_dbmatch;
+
+      if ( dbmatch.isvalid() ) {
+        js_dbmatch["group"]   = dbmatch.group().toStdString();
+        js_dbmatch["keyword"] = dbmatch.keyword().toStdString();
+        js_dbmatch["value"]   = dbmatch.value().toStdString();
+        js_dbmatch["matchid"]   = dbmatch.matchid().toStdString();
+      }
+      else {
+        isisdata_json is_null;
+        js_dbmatch["group"]   = is_null;
+        js_dbmatch["keyword"] = is_null;
+        js_dbmatch["value"]   = is_null;
+        js_dbmatch["matchid"]   = is_null;
+      }
+      return ( js_dbmatch );
+    }
+
+
+    //***********************************************************************************
+    // DBSelection Implementations
+    //***********************************************************************************
+    DBSelection::DBSelection() : m_source(), m_kernelset (), m_coverage(),
+                                 m_matches(), m_type( db_null() ) { }
+    DBSelection::DBSelection( const DBFileStatus &dbsource ) :
+                              m_source( dbsource ),
+                              m_kernelset( ),
+                              m_coverage( ),
+                              m_matches( ),
+                              m_type( db_null() )  { }
+    DBSelection::DBSelection(const DBFileStatus &dbsource,
+                             const DBFileStatusList &dbfilestatus,
+                             const DBTimeCoverage &dbcoverage,
+                             const DBMatchList &dbmatches,
+                             const QString &ktype) :
+                             m_source( dbsource ),
+                             m_kernelset( dbfilestatus ),
+                             m_coverage( dbcoverage ),
+                             m_matches( dbmatches ),
+                             m_type( ktype )  { }
+
+      /** Retrive contents of a section */
+    DBSelection DBSelection::read( const PvlGroup &selection,
+                                   const DBFileStatus &dbsource,
+                                   const PvlGroup &prefdata ) {
+
+
+      DBSelection dbselection( dbsource );
+
+      // Consolidate all coverage times to a span that my have gaps
+      iTime s_starttime;
+      iTime s_stoptime;
+      const bool doVersioning = true;  // get highest versions of kernel names
+
+      for ( int kndx = 0 ; kndx < selection.keywords() ; kndx++ ) {
+        const PvlKeyword &key = selection[kndx];
+
+        if ( key.isNamed("File") ) {
+          dbselection.addFile( DBFileStatus::translate( key, prefdata, doVersioning ) );
+        }
+        else if ( key.isNamed("Time") ) {
+          if ( dbselection.hasTime() == false ) {
+            // Set first time coverage
+            s_starttime = iTime( key[0] );
+            s_stoptime   = iTime( key[1] );
+          }
+          else {
+            // Test limits of current span
+            iTime start_time_t( key[0] );
+            iTime  stop_time_t( key[1] );
+
+            if ( start_time_t < s_starttime ) s_starttime = start_time_t;
+            if (  stop_time_t > s_stoptime  ) s_stoptime  = stop_time_t;
+          }
+
+          // Update the span
+          dbselection.setTime( s_starttime, s_stoptime );
+        }
+        else if ( key.isNamed( "Match") ) {
+          // Add a match keyword
+          dbselection.addMatch( DBMatch( key[0], key[1], key[2] ) );
+        }
+        else if ( key.isNamed( "Type" ) ) {
+          // Update the type which will be "Reconstructed", "Smithed", etc...
+          dbselection.setType( key[0] );
+        }
+      }
+
+      return ( dbselection );
+    }
+
+    DBSelection DBSelection::read( const PvlGroup &selection,
+                                   const DBFileStatus &dbsource ) {
+        const PvlGroup &preferences = Preference::Preferences().findGroup("DataDirectory");
+        return  ( read( selection, dbsource,  preferences ) );
+    }
+
+     int DBSelection::validate( DBFileDispositionList &dbstatus,
+                               const DBFileStatusSet &inventory ) const {
+      int nbad = 0;
+
+      for ( auto const &dbfile : files()  ) {
+
+        if ( !dbfile.exists() ) {
+          dbstatus.push_back( DBFileDisposition( "Missing", dbfile.name(), source(), type() ) );
+          nbad++;
+        }
+        else {
+          if ( dbfile.isSymbolicLink() ) {
+            dbstatus.push_back( DBFileDisposition( "Symlink", dbfile.name(), source(), type() ) );
+            nbad++;
+          }
+
+          // Check if file is in inventory
+          if ( !inventory.contains( dbfile.expanded() ) ) {
+            dbstatus.push_back( DBFileDisposition( "External", dbfile.expanded(), source(), type() ) );
+            nbad++;
+          }
+        }
+      }
+      return ( nbad );
+    }
+
+    isisdata_json DBSelection::to_json( const DBSelection &dbselection,
+                                       const bool addSource ) {
+
+      isisdata_json js_dbmatches = isisdata_json::array();
+      for ( auto &dbmatch : dbselection.matches() ) {
+        js_dbmatches.push_back( dbmatch.to_json() );
+      }
+
+      isisdata_json js_dbkernels = isisdata_json::array();
+      for ( auto &dbkernel : dbselection.files() ) {
+        js_dbkernels.push_back( dbkernel.to_json() );
+      }
+
+      isisdata_json js_dbselection;
+      if ( addSource ) {
+        js_dbselection["source"] = dbselection.source().expanded().toStdString();
+      }
+
+      js_dbselection["time"]   = dbselection.time().to_json();
+      js_dbselection["match"]  = js_dbmatches;
+      js_dbselection["files"]  = js_dbkernels;
+      js_dbselection["type"]   = dbselection.type().toStdString();
+
+      return ( js_dbselection );
+    }
+
+
+    //***********************************************************************************
+    // DBKernelDb Implementations
+    //************]***********************************************************************
+    DBKernelDb::DBKernelDb() :  m_kerneldb(), m_category( db_null() ),
+                                m_runtime(), m_selections()  { }
+    DBKernelDb::DBKernelDb( const QString &category ) :
+                            m_kerneldb(), m_category( category ),
+                            m_runtime(), m_selections() { }
+    DBKernelDb::DBKernelDb( const DBFileStatus &dbkerneldbfile,
+                            const QString &category ) :
+                            m_kerneldb( dbkerneldbfile ),
+                            m_category( category ),
+                            m_runtime(),
+                            m_selections() { }
+
+
+    DBFileStatus DBKernelDb::dbFileStatus( const DBFileStatus &dbdir )  {
+      QString kerneldb = dbdir.expanded();
+      if ( dbdir.isDirectory() ) {
+        kerneldb += "/kernels.????.db";
+      }
+
+      const bool doVersioning = true;
+      return ( DBFileStatus( kerneldb, doVersioning ) );
+    }
+
+    DBKernelDb DBKernelDb::read( const DBFileStatus &dbfile,
+                                 const PvlGroup &prefdata,
+                                 const QString &source ) {
+
+      if ( !dbfile.exists() ) {
+        return ( DBKernelDb ( dbfile, source) );
+      }
+
+      // Got a kerneldb file
+      Pvl db( dbfile.expanded() );
+
+      // Check if there are any specs in the file
+      if ( db.objects() < 1 ) {
+        return ( DBKernelDb ( dbfile, source ) );
+      }
+
+      PvlObject &inst = db.object(0);  // Get first object of .db or .conf
+      DBKernelDb dbkernel( dbfile, inst.name() );
+
+      // Check for a Runtime keyword
+      if ( inst.hasKeyword("Runtime") ) {
+        dbkernel.setRuntime( iTime( inst["Runtime"][0] ) );
+      }
+
+      // Set up the data dir translation for the files
+      for ( int gndx = 0 ; gndx < inst.groups() ; gndx++ ) {
+        PvlGroup &grp = inst.group(gndx);
+
+        if ( grp.isNamed("Selection") ) {
+          dbkernel.addSelection( DBSelection::read( grp, dbkernel.kerneldb(), prefdata ) );
+        }
+      }
+
+      return ( dbkernel );
+    }
+
+    int DBKernelDb::validate(  const DBSelection &dbselection,
+                               DBFileDispositionList &dbstatus,
+                               const DBFileStatusSet &inventory ) const {
+      return ( dbselection.validate( dbstatus, inventory ) );
+    }
+
+    int DBKernelDb::validate( DBFileDispositionList &dbstatus,
+                               const DBFileStatusSet &inventory ) const {
+      int nbad = 0;
+
+      // Check if the kerneldbd actually exists
+      if ( !isvalid() ) {
+        dbstatus.push_back( DBFileDisposition( "Missing", kerneldb().name(), kerneldb(), category() ) );
+        nbad++;
+      }
+      else {
+        if ( 0 >= size() ) {
+          dbstatus.push_back( DBFileDisposition( "Empty", kerneldb().name(), kerneldb().original(), category() ) );
+          nbad++;
+        }
+        else {
+          // Vaidate Selection kernels
+          for ( auto const &dbselection : selections() ) {
+            nbad += validate( dbselection, dbstatus, inventory );
+          }
+        }
+
+        // Check the location of the DB file (it does exist at this point)
+        if ( !inventory.contains( kerneldb().expanded() ) ) {
+          // std::cout << "External_S, " << kerneldb().name() << ", " << source().name() << std::endl;
+          dbstatus.push_back( DBFileDisposition( "External", kerneldb().expanded(), kerneldb(), category() ) );
+          nbad++;
+        }
+      }
+
+      return ( nbad );
+    }
+
+
+    isisdata_json DBKernelDb::to_json( const DBKernelDb &dbkerneldb ) {
+
+      isisdata_json js_dbkerneldb;
+      js_dbkerneldb             += dbkerneldb.kerneldb().to_json();
+      js_dbkerneldb["category"] = dbkerneldb.category().toStdString();
+
+      auto js_dbruntime = dbkerneldb.coverage().to_json();
+      js_dbkerneldb["runtime"]    = js_dbruntime["starttime"];
+      js_dbkerneldb["runtimeet"]  = js_dbruntime["starttimeet"];
+
+      isisdata_json js_selections = isisdata_json::array();
+      for ( auto &dbselection : dbkerneldb.m_selections ) {
+        js_selections.push_back( dbselection.to_json() );
+      }
+
+      js_dbkerneldb["selections"] = js_selections;
+
+      return ( js_dbkerneldb );
+    }
+
+
+    //***********************************************************************************
+    // DBKernelConf Implementations
+    //***********************************************************************************
+    DBKernelConf::DBKernelConf() : m_kerneldb( "none" ), m_selectionsets() { }
+
+    DBKernelConf::DBKernelConf( const DBFileStatus &dbconfig ) :
+                                m_kerneldb( dbconfig ),
+                                m_selectionsets() { }
+
+    DBKernelConf::DBKernelConf( const DBKernelDb &dbkernel,
+                                const PvlGroup &preferences ) :
+                                m_kerneldb( dbkernel ),
+                                m_selectionsets() {
+       addKernelDb( m_kerneldb, preferences );
+    }
+
+    DBFileStatus DBKernelConf::dbFileStatus( const DBFileStatus &dbdir )  {
+      QString kerneldb = dbdir.expanded();
+      if ( dbdir.isDirectory() ) {
+        kerneldb += "/kernels.????.conf";
+      }
+
+      const bool doVersioning = true;
+      return ( DBFileStatus( kerneldb, doVersioning ) );
+    }
+
+    DBKernelConf DBKernelConf::read( const DBFileStatus &dbconfig,
+                                     const PvlGroup &preferences ) {
+     return ( DBKernelConf( DBKernelDb::read( dbconfig, preferences), preferences ) );
+    }
+
+    void DBKernelConf::addConfigSelection( const DBSelection &selection,
+                                           const PvlGroup &preferences ) {
+
+      // Add the contents of the referred database here
+      QString source = selection.source().expanded();
+
+      DBKernelDbList kerneldbs;
+      for ( auto const &file : selection.files() ) {
+        kerneldbs.push_back( DBKernelDb::read( file, preferences ) );
+      }
+
+      // Add to the selection sets
+      m_selectionsets.push_back( DBSelectionSet( selection, kerneldbs ) );
+
+      return;
+    }
+
+    isisdata_json DBKernelConf::to_json( const DBKernelConf &dbconfig ) {
+
+      isisdata_json js_dbconfig;
+      js_dbconfig            += dbconfig.config().to_json();
+
+      isisdata_json js_selections = isisdata_json::array();
+      for ( auto &dbselection : dbconfig.kernelsets() ) {
+        isisdata_json js_confselect;
+
+        js_confselect["config"] = dbselection.m_selection.to_json();
+
+        isisdata_json js_confkernels = isisdata_json::array();
+        for ( auto &db : dbselection.m_kerneldbs ) {
+          js_confkernels += db.to_json();
+        }
+
+        js_confselect["kernels"] = js_confkernels;
+        js_selections += js_confselect;;
+      }
+
+      js_dbconfig["selectionsets"] = js_selections;
+
+      return ( js_dbconfig );
+    }
+
+    void DBKernelConf::addKernelDb( const DBKernelDb &dbconfig,
+                                    const PvlGroup &preferences ) {
+
+      if ( dbconfig.size() > 0 ) {
+        for ( auto const &dbselection : dbconfig.selections() ) {
+          addConfigSelection( dbselection, preferences );
+        }
+      }
+
+      return;
+    }
+
+    int DBKernelConf::validate(const DBSelectionSet &dbset,
+                               DBFileDispositionList &dbstatus,
+                               const DBFileStatusSet &inventory ) const {
+      int nbad = 0;
+      for ( auto const &dbkernel : dbset.m_kerneldbs ) {
+        nbad += dbkernel.validate( dbstatus, inventory );
+      }
+      return ( nbad );
+    }
+
+
+    int DBKernelConf::validate( DBFileDispositionList &dbstatus,
+                               const DBFileStatusSet &inventory )const {
+      int nbad = config().validate( dbstatus, inventory );
+
+      for ( auto const &dbset : kernelsets() ) {
+        nbad += this->validate( dbset, dbstatus, inventory );
+      }
+      return ( nbad );
+    }
+
+    //***********************************************************************************
+    // IsisDataModel Implementations
+    //***********************************************************************************
+    IsisDataModel::IsisDataModel() : m_isisdata(QString("$ISISDATA")),
+                                     m_dataroot(QString("$ISISDATA")),
+                                     m_allfiles(),
+                                     m_kerneldbs(),
+                                     m_configs() { }
+    IsisDataModel::IsisDataModel(const QString &dataroot, const QString &isisdata ) :
+                                 m_isisdata( ), m_dataroot(),
+                                 m_allfiles(), m_kerneldbs(),
+                                 m_configs() {
+      setDataRoot( dataroot );
+      setIsisData( isisdata );
+    }
+
+    size_t IsisDataModel::evaluate( ) {
+
+      // Check for validity of datadir and isisdata
+      if ( !hasIsisData() ) {
+        QString mess = "ISISDATA (" + isisdata().original() + ") does not not exist/invalid!";
+        throw IException( IException::User, mess, _FILEINFO_ );
+      }
+
+      // Check for validity of datadir and isisdata
+      if ( !hasDataRoot() ) {
+        QString mess = "DATAROOT (" + dataroot().original() + ") does not not exist/invalid!";
+        throw IException( IException::User, mess, _FILEINFO_ );
+      }
+
+      // Check for validity of datadir and isisdata
+      if ( !dataroot().isDirectory() ) {
+        QString mess = "DATAROOT (" + dataroot().original() + ") is not a directory!";
+        throw IException( IException::User, mess, _FILEINFO_ );
+      }
+
+      // Set up the directory traversal
+      QDirIterator ddir( dataroot().expanded(),
+                          QDir::NoDotAndDotDot | QDir::Dirs | QDir::AllDirs | QDir::Files | QDir::System,
+                          QDirIterator::Subdirectories | QDirIterator::FollowSymlinks );
+
+      // Get the DataDirectory from the Preferences file
+      PvlGroup &prefdata = Preference::Preferences().findGroup("DataDirectory");
+
+      size_t t_size(0);
+      while ( ddir.hasNext() ) {
+        QString ddfile = ddir.next();
+        QFileInfo f_ddfile = ddir.fileInfo();
+        DBFileStatus d_file( DBFileStatus::DBFileData( givenPath( ddfile ), FileName( ddfile ), f_ddfile, "inventory" ) );
+
+        m_allfiles.insert( d_file.name(), d_file );
+
+        // Determine any kernels that are referenced in a directory
+        if ( d_file.isDirectory() ) {
+
+          // Check for config first
+          DBFileStatus configdb = DBKernelConf::dbFileStatus( d_file );
+          if ( configdb.exists() ) {
+            m_configs.push_back( DBKernelConf::read( configdb, prefdata ) );
+          }
+
+          // Now check for kernel DB files
+          DBFileStatus kerneldb = DBKernelDb::dbFileStatus( d_file );
+          if ( kerneldb.exists() ) {
+            m_kerneldbs.push_back( DBKernelDb::read( kerneldb, prefdata ) );
+          }
+        }
+        else {
+          // Update total file size
+          t_size += d_file.size();
+        }
+      }
+      // QDirIterator traverses directories in random order so sort here
+      // std::sort( m_allfiles.begin(), m_allfiles.end() );
+      std::sort( m_kerneldbs.begin(), m_kerneldbs.end(), DBKernelDb::compare );
+      std::sort( m_configs.begin(), m_configs.end(), DBKernelConf::compare );
+
+      return ( t_size);
+    }
+
+    int IsisDataModel::validate( DBFileDispositionList &dbstatus ) const {
+      return ( this->validate( dbstatus, allfiles() ) );
+    }
+
+    int IsisDataModel::validate( DBFileDispositionList &dbstatus,
+                                 const DBFileStatusSet &inventory ) const {
+      int n_bad = 0;
+
+      // Do all the DB files
+     for ( auto const &db : dbs() ) {
+        n_bad += db.validate( dbstatus, inventory );
+      }
+
+      // Now do kernel conf dbs
+      for ( auto const &dbconf : configs() ) {
+        n_bad += dbconf.validate( dbstatus, inventory );
+      }
+
+      return ( n_bad );
+    }
+
+  } // namespace Data
+} // namespace Isis
diff --git a/isis/src/system/apps/isisdataeval/IsisDataModel.h b/isis/src/system/apps/isisdataeval/IsisDataModel.h
new file mode 100644
index 0000000000000000000000000000000000000000..a1a7981c979d5a7b40b61494ca5f566dc2d58fb4
--- /dev/null
+++ b/isis/src/system/apps/isisdataeval/IsisDataModel.h
@@ -0,0 +1,887 @@
+/** This is free and unencumbered software released into the public domain.
+
+The authors of ISIS do not claim copyright on the contents of this file.
+For more details about the LICENSE terms and the AUTHORS, you will
+find files of those names at the top level of this repository. **/
+
+/* SPDX-License-Identifier: CC0-1.0 */
+#ifndef IsisDataModel_h
+#define IsisDataModel_h
+
+#include <map>
+#include <set>
+#include <vector>
+#include <tuple>
+#include <algorithm>
+#include <iomanip>
+
+#include <nlohmann/json.hpp>
+using isisdata_json = nlohmann::ordered_json;
+
+#include <QByteArray>
+#include <QCryptographicHash>
+#include <QDateTime>
+#include <QList>
+#include <QString>
+#include <QStringList>
+#include <QFileInfo>
+
+#include "FileName.h"
+#include "IException.h"
+#include "IString.h"
+#include "iTime.h"
+#include "Preference.h"
+#include "Pvl.h"
+#include "PvlKeyword.h"
+#include "PvlGroup.h"
+
+namespace Isis {
+  namespace Data {
+
+
+    /** Generic key (header) retrival from a JSON object */
+    inline QStringList header_from_json( const isisdata_json &dbjson )  {
+
+      QStringList header;
+      for ( auto &jkey : dbjson.items() ) {
+        header.append( QString::fromStdString( jkey.key() ) );
+      }
+
+      return ( header );
+    }
+
+    /** Generic value retrival from a JSON object */
+     inline QStringList values_from_json( const isisdata_json &dbjson )  {
+
+        QStringList values;
+        for ( auto &jdata : dbjson.items() ) {
+          values.append( QString::fromStdString( to_string( jdata.value() ) ).remove('\"') );
+        }
+
+        return ( values );
+      }
+
+    /** Declare a single constant for database  */
+    inline QString db_null( ) {
+      return ( QString("null") );
+    }
+
+    /** Declare a single constant for database  */
+    inline isisdata_json json_null( ) {
+      return ( isisdata_json() );
+    }
+
+    /** Declare a single constant for database  */
+    inline QString json_bool( const bool &t_or_f ) {
+      if ( true == t_or_f ) return ( QString("true") );
+      return ( QString("false") );
+    }
+
+
+    /**
+     * @brief Generic DB container/column algorithm usage
+     *
+     * This is designed to be used as part of the IsisData model container
+     * system. It may be sufficient to use as generic column container.
+     *
+     * @tparam Key    Key type that is designed to be sortable on operator<()
+     * @tparam Datum  Stored data
+     */
+    template<typename Key, typename Datum>
+      class DBContainer {
+        public:
+          QString m_name;
+          QString m_header;
+
+          Key     m_key;
+          Datum   m_data;
+
+          DBContainer() : m_name("column"), m_header(""),
+                          m_key(), m_data() { }
+          DBContainer(const QString &column,
+                      const QString &header = "" ) :
+                      m_name(column), m_header(header),
+                      m_key(), m_data() { }
+          DBContainer(const QString &column,
+                      const Key &key, const Datum &datum,
+                      const QString &header = "" ) :
+                      m_name(column), m_header ( header ),
+                      m_key( key ), m_data( datum ) { }
+
+          virtual ~DBContainer() { }
+
+          const QString &name( ) const {
+            return ( m_name );
+          }
+
+          void setName( const QString &name ) {
+            m_name = name;
+          }
+
+          const QString &header( ) const {
+            if ( m_header.isEmpty() ) return ( name() );
+            return ( m_header );
+          }
+
+          const QString &status() const {
+            return ( header() );
+          }
+
+          const Key &key() const {
+            return ( m_key );
+          }
+
+          const Datum &datum() const {
+            return ( m_data );
+          }
+
+          Datum &datum() {
+            return ( m_data );
+          }
+
+          bool operator<( const DBContainer &dbcontainer) const {
+            return ( this->compare( this->key(), dbcontainer.key() ) );
+          }
+
+          bool operator==( const DBContainer &dbcontainer) const {
+            bool isEqual = ( !this->compare( this->key(), dbcontainer.key() ) ) &&
+                           ( !this->compare( dbcontainer.key(), this->key() ) );
+            return ( isEqual );
+          }
+
+          bool compare( const Key &key1, const Key &key2 ) const {
+            return ( key1 < key2);
+          }
+      };
+
+
+    /**
+     * @brief DBTimeCoverage provides that time span of a KernelDB entry
+     *
+     * This class is a container for the Time keywords that are found in
+     * the Selection groups of ISIS kernel config and DB files.
+     *
+     */
+    class DBTimeCoverage {
+      public:
+        // Datum
+        iTime  m_starttime;
+        iTime  m_stoptime;
+        bool   m_isvalid;
+
+        DBTimeCoverage();
+        DBTimeCoverage( const iTime &start_t,   const iTime &stop_t );
+        DBTimeCoverage( const QString &start_s, const QString &stop_s );
+        DBTimeCoverage( const iTime &start_t );
+        DBTimeCoverage( const QString &start_s );
+        virtual ~DBTimeCoverage() { }
+
+        /** Validity is tracked and status provided by this method */
+        inline bool isvalid() const {
+          return ( m_isvalid );
+        }
+
+        /** Set the time with iTimes */
+        inline void setTime( const iTime &starttime,  const iTime &endtime ) {
+          m_starttime = starttime;
+          m_stoptime   = endtime;
+          m_isvalid = true;
+        }
+
+        /** Get the start time as an iTime */
+        inline const iTime &starttime() const {
+          return ( m_starttime );
+        }
+        /** Get the stop time as an iTime */
+        inline const iTime &stoptime() const {
+          return ( m_stoptime );
+        }
+
+        /** Check if a time is fully in the coverage timespan */
+        bool contains( const DBTimeCoverage &t_time,
+                       const bool partial = false ) const;
+
+        /** Check if a time is partiallty in the coverage timespan */
+        inline bool intersects( const DBTimeCoverage &t_time ) const {
+          const bool includePartial = true;
+          return ( contains( t_time, includePartial ) );
+        }
+
+        static isisdata_json to_json( const DBTimeCoverage &dbtimecoverage );
+
+        /** Get the JSON structure of this object */
+        inline isisdata_json to_json( ) const {
+          return ( DBTimeCoverage::to_json ( *this ) );
+        }
+
+        /** Get the header for this object */
+        inline QStringList header( ) const {
+          return ( header_from_json ( this->to_json()) );
+        }
+
+        /** Get the values for this object */
+        inline QStringList values( ) const {
+          return ( values_from_json ( this->to_json() ) );
+        }
+    };
+
+
+    /**
+     * @brief DBFileStatus contains the state of a file from a storage resource
+     *
+     * This container provides details regarding any file or directory from a
+     * disk resource.
+     *
+     */
+    class DBFileStatus {
+      public:
+        // Types
+        typedef DBContainer<FileName, QFileInfo>       DBFileData;
+        typedef DBContainer<DBFileStatus, QByteArray>  DBFileHash;
+
+        // Datum
+        DBFileData   m_file;
+
+        DBFileStatus();
+        DBFileStatus( const DBFileData &dbfile );
+        DBFileStatus( const FileName &dbfile, const QFileInfo &dbfileinfo );
+        DBFileStatus( const FileName &dbfile, const bool versionIt = false );
+        DBFileStatus( const QString &dbfile,  const bool versionIt = false );
+        virtual ~DBFileStatus() { }
+
+
+        inline const DBFileData &data() const {
+          return ( m_file );
+        }
+
+        inline const FileName &file() const {
+          return ( m_file.key() );
+        }
+
+        inline const QFileInfo &info() const {
+          return ( m_file.datum() );
+        }
+
+        inline const QString &name() const {
+          return ( m_file.name() );
+        }
+
+        void setName( const QString &name ) {
+          m_file.setName( name );
+        }
+
+        inline bool exists() const {
+          return ( info().exists() );
+        }
+
+        inline size_t size() const {
+          return ( info().size() );
+        }
+
+        inline bool isDirectory() const {
+          return ( info().isDir() );
+        }
+
+        inline bool isSymbolicLink() const {
+          return ( info().isSymLink() );
+        }
+
+        inline QString original() const {
+          return ( file().original() );
+        }
+
+        inline QString expanded() const {
+          return ( file().expanded() );
+        }
+
+        inline QString absolute() const {
+          return ( info().absoluteFilePath() );
+        }
+
+        inline QString target() const {
+          QString symlink = info().symLinkTarget();
+          if ( symlink.isEmpty() ) symlink = absolute();
+          return ( symlink );
+        }
+
+        inline QDateTime created() const {
+          return ( info().created() );
+        }
+
+        inline QDateTime modified() const {
+          return ( info().lastModified() );
+        }
+
+        static QString toUTC( const QDateTime ftime ) {
+          QString format = "yyyy-MM-ddThh:mm:ss.zzz";
+          return ( ftime.toUTC().toString( format ) );
+        }
+
+        bool versionize( );
+
+        static DBFileStatus versionize( const FileName &dbname );
+
+        static DBFileStatus translate( const PvlKeyword &key,
+                                       const PvlGroup &prefdata,
+                                       const bool doVersioning = true );
+
+
+        static bool compare( const DBFileStatus &db1,
+                             const DBFileStatus &db2 ) {
+          return ( db1 < db2 );
+        }
+
+        /** Provides sorting capabilties */
+        inline bool operator<( const DBFileStatus &other ) const {
+          return ( this->original() < other.original() );
+        }
+
+        bool operator==( const DBFileStatus &dbfile_lhs ) const {
+          return (this->original() == dbfile_lhs.original() );
+        }
+
+        static isisdata_json to_json( const DBFileStatus &dbfilestatus );
+
+        inline isisdata_json to_json( ) const {
+          return ( DBFileStatus::to_json ( *this ) );
+        }
+
+        inline QStringList header( ) const {
+          return ( header_from_json ( this->to_json() ) );
+        }
+
+        inline QStringList values( ) const {
+          return ( values_from_json ( this->to_json() ) );
+        }
+
+        static DBFileHash compute_hash( const QString &dbfile,
+                                        const QCryptographicHash::Algorithm hashAlgorithm = QCryptographicHash::Md5 );
+        QByteArray hash( const QCryptographicHash::Algorithm hashAlgorithm = QCryptographicHash::Md5 ) const;
+    };
+
+    // Some DBFileStatus definitions
+    typedef std::vector<DBFileStatus>                   DBFileStatusList;
+    typedef DBContainer<QString, DBFileStatus>          DBFileDisposition;
+    typedef std::vector<DBFileDisposition>              DBFileDispositionList;
+
+    typedef QMap<QString, DBFileStatus>                 DBFileStatusSet;
+    typedef DBContainer<DBFileStatus, DBFileStatusSet>  DBDirectory;
+
+    typedef DBContainer<QString, DBFileDispositionList> DBConfigStatus;
+    typedef DBContainer<QString, DBFileStatusList>      DBFileList;
+    typedef DBContainer<DBFileStatus, DBFileStatusList> DBFileSet;
+
+    typedef std::map<QString, DBFileStatusList>         DBFileListMap;
+    typedef DBContainer<QString, DBFileListMap>         DBFileStatusMap;
+    typedef DBContainer<DBFileStatus, DBFileStatusMap>  DBFileMap;
+
+    /**
+     * @brief Class DBMatch maintains Match occurrances in DB Selection groups
+     *
+     * This class is a container for the Match keywords found in all Selection
+     * groups contained in a kernel DB. This functions on both the DB and config
+     * specifications.
+     *
+     * Note it could also support any other scalar valued ISIS keyword in a pinch.
+     */
+    class DBMatch {
+      public:
+        // Datum
+        QString  m_group;
+        QString  m_keyword;
+        QString  m_match;
+        QString  m_id;
+
+        DBMatch();
+        DBMatch( const QString &groupname, const QString &keyword,
+                 const QString &match);
+        virtual ~DBMatch() { }
+
+        static DBMatch fromMatchid( const QString &mid );
+
+        /** Determines if the Match is valid */
+        inline bool isvalid() const {
+          // Group could be empty and still valid...theoretically
+          if ( m_keyword.isEmpty() ) return (false );
+          if ( m_group.isEmpty()   ) return (false );
+          if ( m_match.isEmpty()   ) return (false );
+          return ( true );
+        }
+
+        inline const QString &group() const {
+          return ( m_group );
+        }
+
+        inline const QString &keyword() const {
+          return ( m_keyword );
+        }
+
+        inline const QString &value() const {
+          return ( m_match );
+        }
+
+        QString makeMatchid() const;
+
+        inline const QString &matchid() const {
+          return ( m_id );
+        }
+
+        bool operator==( const DBMatch &other ) const {
+          return ( other.matchid() == this->matchid() );
+        }
+
+        static isisdata_json to_json( const DBMatch &dbmatch );
+
+        inline isisdata_json to_json( ) const {
+          return ( DBMatch::to_json ( *this ) );
+        }
+
+        inline QStringList header( ) const {
+          return ( header_from_json ( this->to_json() ) );
+        }
+
+        inline QStringList values( ) const {
+          return ( values_from_json ( this->to_json() ) );
+        }
+    };
+
+    /**
+     * @brief DBSelection contains the contents of a kernel DB Selection group
+     *
+     * This class is a container for the contents of a Selection group found in
+     * both ISISDATA DB and config files.
+     *
+     */
+    class DBSelection {
+      public:
+        // Datum
+        typedef std::vector<DBMatch>      DBMatchList;
+
+        DBFileStatus      m_source;
+        DBFileStatusList  m_kernelset;
+        DBTimeCoverage    m_coverage;
+        DBMatchList       m_matches;
+        QString           m_type;
+
+        DBSelection();
+        DBSelection( const DBFileStatus &dbsource );
+        DBSelection( const DBFileStatus &dbsource,
+                     const DBFileStatusList &dbfilestatus,
+                     const DBTimeCoverage &dbcoverage,
+                     const DBMatchList &dbmatches,
+                     const QString &ktype = db_null() );
+        virtual ~DBSelection() { }
+
+        static DBSelection read( const PvlGroup &selection,
+                                 const DBFileStatus &dbsource,
+                                 const PvlGroup &prefdata );
+
+        static DBSelection read( const PvlGroup &selection,
+                                 const DBFileStatus &dbsource );
+
+        inline size_t size() const {
+          return ( m_kernelset.size() );
+        }
+
+        inline void setSource( const DBFileStatus &dbsource ) {
+          m_source = dbsource;
+        }
+
+        inline const DBFileStatus &source( ) const {
+          return ( m_source );
+        }
+
+        inline void addFile( const DBFileStatus &dbfilestatus ) {
+          m_kernelset.push_back( dbfilestatus );
+        }
+
+        inline const DBFileStatusList &files() const {
+          return ( m_kernelset );
+        }
+
+        inline size_t sizeMatches() const {
+          return ( matches().size() );
+        }
+
+        inline bool hasMatches() const {
+          return ( sizeMatches() != 0);
+        }
+
+        inline void addMatch( const DBMatch &dbmatch ) {
+          m_matches.push_back( dbmatch);
+        }
+
+        inline const DBMatchList &matches() const {
+          return ( m_matches );
+        }
+
+        inline bool hasTime( ) const {
+          return ( m_coverage.isvalid() );
+        }
+
+        inline void setTime( const iTime &starttime,  const iTime &endtime ) {
+          m_coverage.setTime( starttime, endtime );
+        }
+
+        inline void setTime( const DBTimeCoverage &dbcoverage ) {
+          m_coverage = dbcoverage;
+        }
+
+        inline const DBTimeCoverage &time( ) const {
+          return ( m_coverage );
+        }
+
+        inline void setType( const QString &ktype ) {
+          m_type = ktype;
+        }
+
+        inline const QString &type( ) const {
+          return ( m_type );
+        }
+
+        int validate( DBFileDispositionList &dbstatus,
+                      const DBFileStatusSet &inventory = DBFileStatusSet() ) const;
+
+        static isisdata_json to_json( const DBSelection &dbselection,
+                                     const bool addSource = false );
+
+        inline isisdata_json to_json( const bool addSource = false ) const {
+          return ( DBSelection::to_json ( *this, addSource ) );
+        }
+
+        inline QStringList header( const bool addSource = false ) const {
+          return ( header_from_json ( this->to_json( addSource ) ) );
+        }
+
+        inline QStringList values( const bool addSource = false ) const {
+          return ( values_from_json ( this->to_json( addSource ) ) );
+        }
+
+
+    };
+
+    /**
+     * @brief DBKernelDb contains the contents of kernel DB/conf files
+     *
+     * This class provides an internalization of the contents of a ISISDATA
+     * kernel database (kernels.????.db) or configuration (kernels.????.conf)
+     * file.
+     */
+    class DBKernelDb {
+      public:
+        // Datum
+        typedef std::vector<DBSelection> DBSelectionList;
+
+        DBFileStatus    m_kerneldb;
+        QString         m_category;
+        DBTimeCoverage  m_runtime;
+        DBSelectionList m_selections;
+
+        DBKernelDb();
+        DBKernelDb( const QString &category );
+        DBKernelDb( const DBFileStatus &dbkerneldbfile,
+                    const QString &category = "db" );
+        virtual ~DBKernelDb() { }
+
+        static DBFileStatus dbFileStatus( const DBFileStatus &dbdir );
+
+        static DBKernelDb read( const DBFileStatus &dbkernel,
+                                const PvlGroup &prefdata,
+                                const QString &source = "" );
+
+        inline bool isvalid() const {
+          return ( m_kerneldb.exists() );
+        }
+
+        inline const DBFileStatus &kerneldb() const {
+          return ( m_kerneldb );
+        }
+
+        inline size_t size() const {
+          return ( m_selections.size() );
+        }
+
+        inline virtual void addSelection( const DBSelection &selection ) {
+          m_selections.push_back ( selection );
+        }
+
+        inline const DBSelectionList &selections() const {
+          return ( m_selections );
+        }
+
+        inline void setCategory( const QString &category ) {
+          m_category = category;
+        }
+
+        inline const QString &category() const {
+          return ( m_category );
+        }
+
+        inline void setRuntime( const DBTimeCoverage &runtime ) {
+          m_runtime = DBTimeCoverage( runtime );
+        }
+
+        inline void setRuntime( const iTime &runtime ) {
+          m_runtime = DBTimeCoverage( runtime );
+        }
+
+        inline const DBTimeCoverage &coverage() const {
+          return ( m_runtime );
+        }
+
+        static isisdata_json to_json( const DBKernelDb &dbkerneldb );
+
+        inline isisdata_json to_json( ) const {
+          return ( DBKernelDb::to_json( *this ) );
+        }
+
+        /** Confirm valid selection*/
+        int validate( DBFileDispositionList &dbstatus,
+                      const DBFileStatusSet &inventory = DBFileStatusSet() ) const;
+        int validate( const DBSelection &dbselection,
+                      DBFileDispositionList &dbstatus,
+                      const DBFileStatusSet &inventory = DBFileStatusSet() ) const;
+
+        static bool compare( const DBKernelDb &db1,
+                             const DBKernelDb &db2 ) {
+
+          return ( DBFileStatus::compare( db1.kerneldb(), db2.kerneldb() ) );
+        }
+    };
+
+    /**
+     * @brief A specialization of an ISISDATA kernel config file
+     *
+     * This class is designed to manage the more complex ISISDATA kernel
+     * config (kernels.????.conf) files.
+     *
+     */
+    class DBKernelConf {
+      public:
+        // Datum
+        typedef std::vector<DBKernelDb>  DBKernelDbList;
+        typedef struct dbSelectionSet {
+                  dbSelectionSet(const DBSelection &dbselection,
+                                 const DBKernelDbList &dbkernellist) :
+                                 m_selection( dbselection),
+                                 m_kerneldbs( dbkernellist ) { }
+                  ~dbSelectionSet( ) { }
+                  DBSelection    m_selection;
+                  DBKernelDbList m_kerneldbs;
+                } DBSelectionSet;
+
+        typedef std::vector<DBSelectionSet> DBSelectionKernels;
+
+        DBKernelDb         m_kerneldb;   /// The kernel.????.conf contents
+        DBSelectionKernels m_selectionsets;
+
+
+        DBKernelConf();
+        DBKernelConf( const DBFileStatus &dbconfig );
+        DBKernelConf( const DBKernelDb &dbkernel,
+                      const PvlGroup &preferences = Preference::Preferences().findGroup("DataDirectory") );
+
+        virtual ~DBKernelConf() { }
+
+        static DBKernelConf read( const DBFileStatus &dbconfig,
+                                  const PvlGroup &preferences = Preference::Preferences().findGroup("DataDirectory"));
+
+
+        inline bool isvalid() const {
+          return ( this->config().isvalid() );
+        }
+
+        inline const DBKernelDb &config() const {
+          return ( m_kerneldb );
+        }
+
+        inline size_t size() const {
+          return ( m_selectionsets.size() );
+        }
+
+        inline const DBSelectionKernels &kernelsets() const {
+          return ( m_selectionsets );
+        }
+
+
+        void clear() {
+          m_kerneldb = DBKernelDb( db_null() );
+          m_selectionsets.clear( );
+        }
+
+        static DBFileStatus dbFileStatus( const DBFileStatus &dbdir );
+
+        void addConfigSelection( const DBSelection &dbselection,
+                                 const PvlGroup &preferences = Preference::Preferences().findGroup("DataDirectory") );
+
+        static isisdata_json to_json( const DBKernelConf &dbkernelconfig );
+
+        static bool compare( const DBKernelConf &db1,
+                             const DBKernelConf &db2 ) {
+
+          return ( DBKernelDb::compare( db1.config(),  db2.config() ) );
+        }
+
+        /** Confirm valid selection*/
+        int validate( DBFileDispositionList &dbstatus,
+                      const DBFileStatusSet &inventory = DBFileStatusSet() )const;
+        int validate( const DBSelectionSet &dbset, DBFileDispositionList &dbstatus,
+                      const DBFileStatusSet &inventory = DBFileStatusSet() ) const;
+
+      protected:
+        void addKernelDb( const DBKernelDb &dbconfig,
+                          const PvlGroup &preferences = Preference::Preferences().findGroup("DataDirectory") );
+
+    };
+
+    /**
+     * @brief ISISDATA model defining kernel structure
+     *
+     * This class contains the complete contents of the ISISDATA directory
+     * structure. It provides algorithms to traverse and construct the
+     * contents of the complete ISISDATA directory structure. It also
+     * provides analysis and search algorithms to help categorize and
+     * evaluate the kernel data maps.
+     *
+     */
+    class IsisDataModel {
+
+      public:
+
+        DBFileStatus m_isisdata;   // $ISISDATA
+        DBFileStatus m_dataroot;   // Directory source to check
+
+        typedef std::vector<DBKernelDb>   DBKernelDbList;
+        typedef std::vector<DBKernelConf> DBKernelConfList;
+
+        DBFileStatusSet   m_allfiles;
+        DBKernelDbList    m_kerneldbs;
+        DBKernelConfList  m_configs;
+
+        IsisDataModel();
+        IsisDataModel(const QString &dataroot,
+                      const QString &isisdata = "$ISISDATA");
+        virtual ~IsisDataModel() { }
+
+        inline size_t allFilesCount(size_t *n_directories = nullptr  ) const {
+
+          // Only do this if requested
+          if ( nullptr != n_directories ) {
+            size_t n_dirs = 0;
+            for ( auto const &file : m_allfiles ) {
+              if ( file.isDirectory() ) {
+                n_dirs++;
+              }
+            }
+
+            *n_directories = n_dirs;
+          }
+          return ( m_allfiles.size() );
+        }
+
+        inline size_t justFilesCount( size_t *install_size = nullptr ) const {
+          size_t n_files(0);
+          size_t n_bytes(0);
+          for ( auto const &file : m_allfiles ) {
+            if ( !file.isDirectory() ) {
+              n_files++;
+              n_bytes += file.size();
+            }
+          }
+
+          // If they want the size, set it here
+          if ( nullptr != install_size ) {
+            *install_size = n_bytes;
+          }
+          return ( n_files );
+        }
+
+        inline size_t size() const {
+          return ( m_allfiles.size() );
+        }
+
+        inline size_t dbCount() const {
+          return ( m_kerneldbs.size() );
+        }
+
+        inline size_t configCount() const {
+          return ( m_configs.size() );
+        }
+
+        inline const DBKernelDbList &dbs() const {
+          return ( m_kerneldbs );
+        }
+
+        inline const DBKernelConfList &configs() const {
+          return ( m_configs );
+        }
+
+        inline size_t installSize() const {
+          size_t n_bytes(0);
+          for ( auto const &file : m_allfiles ) {
+            if ( !file.isDirectory() ) n_bytes += file.size();
+          }
+          return ( n_bytes );
+        }
+
+        inline const DBFileStatus &dataroot( ) const {
+          return ( m_dataroot );
+        }
+
+        inline const DBFileStatus &isisdata( ) const {
+          return ( m_isisdata );
+        }
+
+        inline bool setIsisData( const QString &isisdata ) {
+          m_isisdata = DBFileStatus( isisdata );
+          return ( m_isisdata.exists() );
+        }
+
+        inline QString givenPath( const QString &dbfilespec ) const {
+          QString t_dbfile = QString( dbfilespec ).replace( isisdata().expanded(), isisdata().original() );
+          t_dbfile.replace( dataroot().expanded(), dataroot().original() );
+          return ( t_dbfile );
+        }
+
+        inline const DBFileStatusSet &allfiles() const {
+          return ( m_allfiles );
+        }
+
+        inline bool hasIsisData( ) const {
+          return ( m_isisdata.exists() );
+        }
+
+        inline bool setDataRoot( const QString &dataroot ) {
+          m_dataroot = DBFileStatus( dataroot );
+          return ( m_dataroot.exists() );
+        }
+
+        inline bool hasDataRoot( ) const  {
+          return ( m_dataroot.exists() );
+        }
+
+        inline void clear() {
+          m_allfiles.clear();
+          m_kerneldbs.clear();
+          m_configs.clear();
+        }
+
+        size_t evaluate( );
+
+        size_t evaluate( const QString &dataroot,
+                         const QString &isisdata = "$ISISDATA" ) {
+          setDataRoot( dataroot );
+          setIsisData( isisdata );
+          return ( evaluate() );
+        }
+
+        int validate( DBFileDispositionList &dbstatus ) const;
+
+        int validate( DBFileDispositionList &dbstatus,
+                      const DBFileStatusSet &inventory ) const;
+
+    };
+
+  } // namespace Data
+} // namespace Isis
+#endif
diff --git a/isis/src/system/apps/isisdataeval/Makefile b/isis/src/system/apps/isisdataeval/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..7578f0b21d038db6a5042c095cda9b34b6bb2570
--- /dev/null
+++ b/isis/src/system/apps/isisdataeval/Makefile
@@ -0,0 +1,7 @@
+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/system/apps/isisdataeval/isisdataeval.cpp b/isis/src/system/apps/isisdataeval/isisdataeval.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..51791990729743753b7b2a167172bdf5dcb6254d
--- /dev/null
+++ b/isis/src/system/apps/isisdataeval/isisdataeval.cpp
@@ -0,0 +1,432 @@
+/** This is free and unencumbered software released into the public domain.
+
+The authors of ISIS do not claim copyright on the contents of this file.
+For more details about the LICENSE terms and the AUTHORS, you will
+find files of those names at the top level of this repository. **/
+
+/* SPDX-License-Identifier: CC0-1.0 */
+
+#include "isisdataeval.h"
+
+#include <array>
+#include <vector>
+#include <tuple>
+#include <algorithm>
+#include <fstream>
+#include <iomanip>
+
+#include <QString>
+#include <QStringList>
+#include <QDir>
+#include <QDirIterator>
+#include <QFile>
+#include <QFileInfo>
+#include <QIODevice>
+#include <QCryptographicHash>
+
+#include "Application.h"
+#include "FileName.h"
+#include "IException.h"
+#include "IsisDataModel.h"
+#include "IString.h"
+#include "iTime.h"
+#include "Preference.h"
+#include "Process.h"
+#include "Progress.h"
+#include "Pvl.h"
+#include "PvlKeyword.h"
+#include "PvlGroup.h"
+#include "UserInterface.h"
+
+
+namespace Isis {
+
+  // Might be able to use brackets here but the main may not be callable
+  // because its not in the Isis namespace. This should suffice.
+  using namespace Data;
+
+  //********************************************************************
+  // Helper functions and datatypes
+  //********************************************************************
+
+  /** Struct to capture inventory counts */
+  struct validation_counts {
+    validation_counts() {
+      m_missing = m_empty = m_symlinks = m_externals = m_errors = 0;
+    }
+    ~validation_counts() { }
+
+    inline int sum() const {
+      int total = m_missing + m_empty + m_symlinks + m_externals + m_errors;
+      return ( total );
+    }
+
+    int m_missing;
+    int m_empty;
+    int m_symlinks;
+    int m_externals;
+    int m_errors;
+  };
+  typedef struct validation_counts ValidationCounts;
+
+  /** Add log Group to log file and console for backward compatability */
+  inline void db_addLogGroup( Pvl *log, PvlGroup &group ) {
+    // Report translations...
+    // Emulates: pvl->addLogGroup( group );
+    log->addGroup( group );
+    Application::Log( group );
+    return;
+  }
+
+  /** Report evaluation data consistently */
+  inline void report_issues( std::ostream &db_os,
+                             const Data::DBFileDispositionList &db_status,
+                             ValidationCounts &counts ) {
+
+
+    if ( db_status.size() > 0) {
+      db_os << "status, filespec, sourcespec, source, target, category" << std::endl;
+
+      for ( auto const &db_file : db_status ) {
+        QString v_status = db_file.name().toLower();
+        db_os << v_status << ","
+              << db_file.key()  << ","
+              << db_file.datum().name() << ","
+              << db_file.datum().expanded() << ","
+              << db_file.datum().target() << ","
+              << db_file.status()
+              << std::endl;
+
+        if ( "missing"  == v_status ) counts.m_missing++;
+        if ( "empty"    == v_status ) counts.m_empty++;
+        if ( "symlink"  == v_status ) counts.m_symlinks++;
+        if ( "external" == v_status ) counts.m_externals++;
+        if ( "error"    == v_status ) counts.m_errors++;
+      }
+    }
+  }
+
+//*******************************************************************
+// isisdataeval main
+//*******************************************************************
+  void isisdataeval( UserInterface &ui, Pvl *log ) {
+
+    Process eval_proc;
+
+    // Load any preferences file if requested. Note this is the same as adding
+    // adding a "-pref=PREFERENCES" except this logs the preferences file used.
+    if ( ui.WasEntered( "PREFERENCES" ) ) {
+      Preference::Preferences().Load( ui.GetAsString( "PREFERENCES" ) );
+    }
+
+    // Get a reference to the DataDirectory group for translations
+    PvlGroup &prefdir = Preference::Preferences().findGroup("DataDirectory");
+
+    // Determine the DATADIR to evaluate
+    QString datadir = ui.GetString( "DATADIR" );
+    FileName file_datadir( datadir );
+    DBFileStatus f_info( datadir );
+    QString dataroot = datadir;
+
+    std::cout << std::endl;
+    std::cout << "DATAROOT = " << f_info.original() << std::endl;
+    std::cout << "DATAROOT = " << f_info.expanded() << std::endl;
+
+    if ( !f_info.isDirectory() ) {
+        throw IException( IException::User,
+                        "DATADIR (" + datadir + ") is not a directory!",
+                        _FILEINFO_ );
+    }
+
+    // Get the DataDirectory from the Preferences file
+    FileName isisdata( "$ISISDATA" );
+    std::cout << std::endl;
+    std::cout << "ISISDATA = " << isisdata.expanded() << std::endl;
+
+    // Now reset ISISDATA if requested by user
+    if ( ui.WasEntered( "ISISDATA" ) ) {
+      isisdata = ui.GetAsString("ISISDATA");
+      PvlKeyword iroot( "ISISDATA", isisdata.expanded() );
+      prefdir.addKeyword( iroot, PvlContainer::Replace );
+      std::cout << "ISISDATA = " << isisdata.expanded() << std::endl;
+      std::cout << "ISISDATA reset by user!" << std::endl;
+      std::cout << std::endl;
+    }
+
+    // Report translations...
+    // pvl->addLogGroup( prefdir );
+    db_addLogGroup( log, prefdir );
+
+    //*******************************************************************
+    // Process DATADIR which will collect the inventory and evaluate
+    // the kernel kernel_????.db and kernel_????.conf
+    // Traverse DATADIR using ISISDATA as $ISISDATA volume translations.
+    //*******************************************************************
+    IsisDataModel v_isisdatadir( datadir, isisdata.expanded() );
+
+    // Run the evaluation of the kernel db/conf configuration
+    BigInt t_install_size = v_isisdatadir.evaluate();
+    double t_volume_size = (double) t_install_size / (1024.0 * 1024.0 * 1024.0);
+
+    // Collect evaluation data
+    size_t s_dirs;  // total directories in dataroot
+    BigInt t_allfiles = v_isisdatadir.allFilesCount( &s_dirs );
+    BigInt t_dirs = s_dirs;
+    BigInt t_files = t_allfiles - t_dirs;
+
+    // The counts for *.db and *.conf files found
+    BigInt t_kerneldbs = v_isisdatadir.dbCount();
+    BigInt t_configs   = v_isisdatadir.configCount();
+
+    // Problem areas
+    DBFileDispositionList kernel_status;
+    int v_bad = v_isisdatadir.validate( kernel_status );
+    std::cout << "\nValidation Complete..." << v_bad << " issues found!" << std::endl;
+
+    // Report kernel validation status to console
+    ValidationCounts inventory_counts;
+    report_issues(std::cout, kernel_status, inventory_counts );
+
+    // Generate the result log
+    std::cout << std::endl;
+    PvlGroup results("Results");
+    results.addKeyword( PvlKeyword( "ISISDATA",            isisdata.expanded() ) );
+    results.addKeyword( PvlKeyword( "DATADIR",             datadir ) );
+    results.addKeyword( PvlKeyword( "EmptyKernelDBs",      toString( inventory_counts.m_empty ) ) );
+    results.addKeyword( PvlKeyword( "MissingKernelDBs",    toString( inventory_counts.m_missing ) ) );
+    results.addKeyword( PvlKeyword( "SymlinkKernelFiles",  toString( inventory_counts.m_symlinks ) ) );
+    results.addKeyword( PvlKeyword( "ExternalKernelFiles", toString( inventory_counts.m_externals ) ) );
+    results.addKeyword( PvlKeyword( "ErrorKernelFiles",    toString( inventory_counts.m_errors ) ) );
+    results.addKeyword( PvlKeyword( "TotalDBConfigFiles",  toString( t_configs ), "conf" ) );
+    results.addKeyword( PvlKeyword( "TotalKernelDBFiles",  toString( t_kerneldbs ), "db" ) );
+    results.addKeyword( PvlKeyword( "TotalDirectories",    toString( t_dirs ) ) );
+    results.addKeyword( PvlKeyword( "TotalDataFiles",      toString( t_files ) ) );
+    results.addKeyword( PvlKeyword( "TotalInstallSize",    toString( t_install_size ), "bytes" ) );
+    results.addKeyword( PvlKeyword( "TotalVolumeSize",     toString( t_volume_size ), "GB" ) );
+
+    // If users wants kernel issues reported, write it out here
+    if ( ui.WasEntered( "TOISSUES" ) ) {
+      FileName toissues = ui.GetFileName( "TOISSUES" );
+
+      // Only write the file if there are missing files
+      if ( kernel_status.size() > 0 ) {
+        std::ofstream os;
+        os.open( toissues.expanded().toLatin1().data(), std::ios::out );
+        if (!os ) {
+          QString mess = "Unable to open/create " + toissues.expanded();
+          throw IException( IException::User, mess, _FILEINFO_ );
+        }
+
+        // Write the results
+        ValidationCounts issue_counts;
+        report_issues( os, kernel_status, issue_counts );
+
+        // All done...
+        os.close();
+      }
+    }
+
+    //*******************************************************************
+    // Process all the data found in DATADIR. If DATADIR = ISISDATA,
+    // the complete ISISDATA install is validated.
+    //*******************************************************************
+    // If user wants to validate the whole of DATADIR, this is it.
+    const bool needInventory = ui.WasEntered( "TOINVENTORY" );
+    const bool doVerify      = ui.GetBoolean( "VERIFY" );
+
+    // Set up default hash and determine if requested by user
+    QCryptographicHash::Algorithm hash_algorithm = QCryptographicHash::Md5;
+    QString  hashtype = ui.GetString( "HASH" ).toLower();
+    const bool needHash = ( "nohash" != hashtype );
+
+    // Either case will kick off the inventory.
+    if ( needInventory || needHash || doVerify ) {
+
+      // Check if user wants detailed log of DATADIR
+      QString inventory_file( "/dev/null" );
+      if ( needInventory ) {
+        FileName toinventory = ui.GetFileName( "TOINVENTORY" );
+        inventory_file = toinventory.expanded();
+      }
+
+      if ( needHash ) {
+        // Get the algorithm of choice
+        if ( "md5"    == hashtype ) hash_algorithm = QCryptographicHash::Md5;
+        if ( "sha1"   == hashtype ) hash_algorithm = QCryptographicHash::Sha1;
+        if ( "sha256" == hashtype ) hash_algorithm = QCryptographicHash::Sha256;
+      }
+
+      // Only write the file if there are missing files
+      ValidationCounts error_counts_t;
+      if ( v_isisdatadir.size() > 0 ) {
+
+        std::ofstream os;
+        os.open( inventory_file.toLatin1().data(), std::ios::out );
+        if (!os ) {
+          QString mess = "Unable to open/create " + inventory_file;
+          throw IException( IException::User, mess, _FILEINFO_ );
+        }
+
+        // Create the header output from the first file in the inventory.
+        // Note its assured to exist.  Add the hash field if requested.
+        QStringList header = v_isisdatadir.allfiles().cbegin()->header();
+
+        // Set the hashtag
+        QString hashtag( hashtype );
+        if ( needHash ) {
+          hashtag = hashtype + "hash";
+          header.append( hashtag );
+        }
+
+        // Write header to output file
+        os << header.join(",") << std::endl;
+
+        std::cout << "Running inventory ..." << std::endl;
+        Progress v_progress;
+        v_progress.SetText("inventory+"+hashtag);
+        v_progress.SetMaximumSteps( v_isisdatadir.size() );
+        v_progress.CheckStatus();
+        BigInt n_symlinks = 0;
+        QCryptographicHash volume_hash( hash_algorithm );
+
+        // Determine size (MB) of file buffer for hashing only if requested
+        std::unique_ptr<char[]>  file_data;
+        qint64 HashBufferSizeBytes = 1024 * 1024 * 256;  // Default size
+        if ( needHash ) {
+          HashBufferSizeBytes = 1024 * 1024 * ui.GetInteger("HASHBUFFER");
+          // Consistent with the Qt 5.15 API
+          file_data.reset( new char[HashBufferSizeBytes] );
+        }
+
+        DBFileDispositionList inventory_errors;
+        const qint64 MaxBytesToRead = HashBufferSizeBytes;
+
+        for ( auto const &dbfile : v_isisdatadir.allfiles()  ) {
+
+          if ( !dbfile.isDirectory() ) {
+
+            // Check for symbolic links
+            if ( dbfile.isSymbolicLink() ) {
+              n_symlinks++;
+
+              QString symtarget = dbfile.info().symLinkTarget();
+              DBFileStatus symfile( symtarget );
+
+              // Report symlink
+              inventory_errors.push_back( DBFileDisposition( "symlink", dbfile.name(), symfile, "inventory" ) );
+
+              if ( !symfile.exists() ) {
+                inventory_errors.push_back( DBFileDisposition( "missing", dbfile.info().symLinkTarget(), dbfile, "nosymlink" ) );
+              }
+              else {
+                if ( !v_isisdatadir.allfiles().contains( symfile.original() ) ) {
+                  inventory_errors.push_back( DBFileDisposition( "external", symfile.name(), dbfile, "symlink" ) );
+                }
+              }
+            }
+            else {
+
+              // Create and write the values array from json object
+              // Don't terminate the row here in case hashing is needed
+              os << dbfile.values().join(",");
+
+              // If hashing has been requested, do it here. We are computing two
+              // hashes - one is individual file hash, the other is the complete
+              // volume hash. Otherwise, check the file for errors.
+              QFile v_file( dbfile.expanded() );
+              if ( needHash ) {
+                QCryptographicHash file_hash( hash_algorithm );
+
+                // File exists, lets open it and compute the hash
+                if ( !v_file.open( QIODevice::ReadOnly ) ) {
+                  inventory_errors.push_back( DBFileDisposition( "error", dbfile.expanded(), dbfile, "openfailed" ) );
+                  // Write a null as the hash
+                  os << "," << db_null();
+                }
+                else {
+                  // Read (in (1MB * HASHBUFFER) chunks) bytes and add to hashes
+                  while ( !v_file.atEnd() ) {
+                    qint64 nread = v_file.read(file_data.get(), MaxBytesToRead );
+
+                    // Add to hashes
+                    file_hash.addData(   file_data.get(), nread );
+                    volume_hash.addData( file_data.get(), nread );
+                  }
+
+                  // Write the file hash to the output file row
+                  os << "," << QString::fromUtf8( file_hash.result().toHex() );
+                }
+              }
+              else {
+                // Check for existance of expanded version of file
+                if ( !v_file.exists() ) {
+                  inventory_errors.push_back( DBFileDisposition( "error", dbfile.expanded(), dbfile, "badfilename" ) );
+                }
+              }
+
+              // Terminate the line and on to the next one
+              os << std::endl;
+            }
+          }
+
+          v_progress.CheckStatus();
+        }
+
+        // Report any issues found with inventory...
+        std::cout << "\nInventory Complete..." << inventory_errors.size() << " issues found!" << std::endl;
+        if ( inventory_errors.size() > 0) {
+          report_issues( std::cout, inventory_errors, error_counts_t );
+
+
+          // If users wants the missing reported, write it out here
+          if ( ui.WasEntered( "TOERRORS" ) ) {
+
+            FileName toerrors = ui.GetFileName( "TOERRORS" );
+
+            // Only write the file if there are missing files
+            std::ofstream error_os;
+            error_os.open( toerrors.expanded().toLatin1().data(), std::ios::out );
+            if (!error_os ) {
+              QString mess = "Unable to open/create " + toerrors.expanded();
+              throw IException( IException::User, mess, _FILEINFO_ );
+            }
+
+            // Write the results
+            ValidationCounts counts_t;
+            report_issues( error_os, inventory_errors, counts_t );
+
+            // All done...
+            error_os.close();
+          }
+
+        }
+
+        // Report results
+        results.addKeyword( PvlKeyword( "MissingInInventory",  toString( error_counts_t.m_missing ) ) );
+        results.addKeyword( PvlKeyword( "SymlinkInInventory",  toString( error_counts_t.m_symlinks ) ) );
+        results.addKeyword( PvlKeyword( "ExternalToInventory", toString( error_counts_t.m_externals ) ) );
+        results.addKeyword( PvlKeyword( "ErrorInInventory",    toString( error_counts_t.m_errors ) ) );
+
+        if ( needHash ) {
+          QByteArray v_hash_data = volume_hash.result();
+          QString volume_hash_str = QString::fromUtf8( v_hash_data.toHex() );
+          BigInt hbsize = HashBufferSizeBytes;
+
+          results.addKeyword( PvlKeyword( "HashBufferSize",  toString(hbsize), "bytes" ) );
+          results.addKeyword( PvlKeyword( "TotalVolumeHash", volume_hash_str, hashtype ) );
+        }
+
+        // All done...
+        os.close();
+      }
+    }
+
+    // Final log
+    // pvl->addLogGroup( results );
+    db_addLogGroup( log, results );
+
+    eval_proc.Finalize();
+    return;
+  }
+
+} // namespace Isis
diff --git a/isis/src/system/apps/isisdataeval/isisdataeval.h b/isis/src/system/apps/isisdataeval/isisdataeval.h
new file mode 100644
index 0000000000000000000000000000000000000000..de8890845f8a845368188ba5340a2c363efb9a91
--- /dev/null
+++ b/isis/src/system/apps/isisdataeval/isisdataeval.h
@@ -0,0 +1,19 @@
+#ifndef isisdataeval_h
+#define isisdataeval_h
+
+/** This is free and unencumbered software released into the public domain.
+
+The authors of ISIS do not claim copyright on the contents of this file.
+For more details about the LICENSE terms and the AUTHORS, you will
+find files of those names at the top level of this repository. **/
+
+/* SPDX-License-Identifier: CC0-1.0 */
+
+#include "Pvl.h"
+#include "UserInterface.h"
+
+namespace Isis {
+  extern void isisdataeval( UserInterface &ui, Pvl *log );
+}
+
+#endif
diff --git a/isis/src/system/apps/isisdataeval/isisdataeval.xml b/isis/src/system/apps/isisdataeval/isisdataeval.xml
new file mode 100644
index 0000000000000000000000000000000000000000..aa9591aaea3bb0f0fad7b33cf11d829adfe437b6
--- /dev/null
+++ b/isis/src/system/apps/isisdataeval/isisdataeval.xml
@@ -0,0 +1,894 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<application name="isisdataeval"
+xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:noNamespaceSchemaLocation="http://isis.astrogeology.usgs.gov/Schemas/Application/application.xsd">
+
+  <brief>
+    Evaluate ISISDATA structure and validity
+  </brief>
+  <description>
+    <p>
+      <em>isisdataeval</em> reads the contents of an ISISDATA area and
+      verifies its contents. This is done by traversing the DATADIR directory
+      and finding all <b>kernel.????.db</b> and <b>kernel.????.conf</b>. The
+      contents of these files contain configurations of kernel file patterns
+      that are used by <em>spiceinit</em> to attach/associate all required
+      NAIF SPICE kernels to individual image cubes after ingestion into ISIS.
+      Every <b>File</b> keyword found in a <b>Selection</b> group in databases
+      is <em>expanded</em> using the same process  applied in <em>spiceinit</em>.
+      <em>spiceinit</em> translates (environment) variables using special ISIS
+      translation values (e.g., mission names) and numerical versioning to
+      resolve file naming patterns into absolute path references. A valid
+      ISISDATA setup will result in valid formulations of absolute file name
+      paths in <b>File</b> keyword values to exising files.
+    </p>
+    <p>
+      The second aspect of this application is use this as a tool to help
+      assess problems encountered with user installations of ISISDATA. There
+      are numerous occurances of users having problems with local ISISDATA
+      installations. Many of these problems are related to the integrity of
+      the local installation. <em>isisdataeval</em> computes a file hash value
+      for each file in the DATADIR directory and all its subdirectories.
+      This means it will also inspect calibration files that are in the
+      ISISDATA installation. It will also calculate a volume hash. This
+      hash is a running hash of all the files combined into a single
+      hash value. If the <em>TotalVolumeHash</em> value does not match
+      values computed in others, particularly the USGS ISISDATA source,
+      then its likely the installation failed and/or files are
+      corrupted/missing.
+    </p>
+    <h3>Goals and Objectives</h3>
+    <p>
+      Motivation for this tool is to validate the ISISDATA installation on a local
+      processing system.
+      <a href="https://astrodiscuss.usgs.gov/t/replacing-the-usgs-isis-rsync-server/924">Recent changes</a>
+      to how the USGS provides ISISDATA to ISIS users separates the kernel
+      configuration (USGS/AWS) from the kernel download resources (typically NAIF).
+
+      This can be a useful tool to quickly determine if <em>spiceinit</em> failures
+      may be due to missing files or improper local ISIS installation. It can also be
+      used to validate a local ISISDATA install where kernel file download filters
+      have been applied to ISISDATA installation processing. For example, AWS S3
+      storage does not support symbolic links to files, so a great deal of effort
+      has been made to identify and report these types of files (they lead to
+      copies/redundancy of the linked file). When given the $ISISDATA
+      directory (the default), this tool will inspect all files and directories
+      contained in the installation for a valid ISISDATA configuration. As it pertains
+      to <em>isisdataeval</em>, a valid ISISDATA installation is confirmed when
+      all the contents of the kernel database (DB) and configuration files are
+      translated into files that exist in the system. <em>isisdataeval</em>
+      <b>does not</b>, however, confirm all necessary or required files have been
+      downloaded to the local system, but it can be verified by comparing
+      results of the application on each install of ISISDATA.
+    </p>
+    <h3>ISISDATA Kernel Architecture</h3>
+    <p>
+      There are two types of kernel DB files that are evaluated - the <b>kernel.????.db</b>
+      database lookup file and the <b>kernel.????.conf</b> configuration file.The kernel DB
+      files contain a sequence of <b>Selection</b> groups that have one or
+      more <b>File</b> PVL keyword/values entries. Each of the <b>File</b> keywords may
+      have one or two values. These values, when combined properly, must resolve to an
+      existing file within the ISISDATA directory structure to be valid. For the value
+      in the keyword form <b>File = "file_spec"</b>, <b>"file_spec"</b> may start with a "$"
+      indicating a special value that ISIS translates to an absolute path, or an
+      absolute path to a file. <b>"file_spec"</b> may also contain a contiguous series of
+      <b>"????"</b> that corresponds directly to the position of characters in the file name
+      that are numerical values indicating a version of the file referenced. ISIS will
+      search for files that satisfy the pattern and then choose the highest version of
+      that file pattern.
+    </p>
+    <p>
+      In the two value case, the general form is <b>File = ("mission", "file_spec")</b>
+      where <b>"mission"</b> refers to a keyword in the <b>DataDictionary</b> group of
+      an <em>IsisPreferences</em> file. The value of this keyword is a path that may
+      contain an environment variable, such as "$ISISDATA", and additional path
+      specifications. The second value of this keyword contains the remaining portion
+      of a valid path that may or may not contain a file pattern such as
+      <em><b>"kernels/pck/moon_pa_de421_1900-????.bpc"</b></em>. A valid
+      two value <b>File</b> keyword may look like
+      <b>File = ("osirisrex", "kernels/pck/moon_pa_de421_1900-????.bpc")</b>.
+      If the environment variable $ISISDATA is set to <b>ISISDATA=/opt/isis/data</b>,
+      the fully resolved file name will have the form
+      <b>/opt/isis/data/osirisrex/kernels/pck/moon_pa_de421_1900-2050.bpc</b>. Here is
+      an example of a Mariner10 CK <b>kernel.?????.db</b> file:
+    </p>
+    <PRE>
+# The times in this file come from the naif toolkit application "spacit", with
+#  a 1 minute padding on the start and end times.
+
+Object = SpacecraftPointing
+  RunTime = 2010-03-03T16:25:09
+
+  Group = Dependencies
+    SpacecraftClockKernel = $mariner10/kernels/sclk/mariner10.0001.tsc
+    LeapsecondKernel      = $base/kernels/lsk/naif0009.tls
+  End_Group
+
+  Group = Selection
+    Time = ("1974 MAR 28 19:17:26.574 TDB", "1975 MAR 17 09:57:46.641 TDB")
+    Match = ("Instrument","InstrumentId","M10_VIDICON_A")
+    File = $mariner10/kernels/ck/MERCURY_MARINER_10_A.bc
+    Type = Smithed
+  End_Group
+
+  Group = Selection
+    Time = ("1974 MAR 28 19:17:26.574 TDB", "1975 MAR 17 09:57:46.641 TDB")
+    Match = ("Instrument","InstrumentId","M10_VIDICON_B")
+    File = $mariner10/kernels/ck/MERCURY_MARINER_10_B.bc
+    Type = Smithed
+  End_Group
+
+  Group = Selection
+    Time = ("1973 NOV 03 21:04:54.460 TDB", "1975 MAR 17 10:13:56.517 TDB")
+    Match = ("Instrument","InstrumentId","M10_VIDICON_A")
+    File = $mariner10/kernels/ck/MARINER_10_A_gem.bc
+    Type = Reconstructed
+  End_Group
+
+  Group = Selection
+    Time = ("1973 NOV 03 21:05:36.460 TDB", "1975 MAR 17 10:14:38.517 TDB")
+    Match = ("Instrument","InstrumentId","M10_VIDICON_B")
+    File = $mariner10/kernels/ck/MARINER_10_B_gem.bc
+    Type = Reconstructed
+  End_Group
+
+End_Object
+End
+
+    </PRE>
+    <p>
+      Kernel configuration files are of the form <b>"kernel.????.conf"</b> where
+      <b>"????"</b> corresponds to an ordered version number sequence that specifies
+      the versions of a kernel configuration file. These types of kernel
+      configuration files typically contain patterns of alternative kernel
+      DB file names thus providing support for more complex NAIF SPICE kernel
+      configurations. They often contain more than one kernel DB <b>File</b>
+      pattern specification in <b>Selection</b> groups.
+      When utilized in the camera kernels (CK) mission directory, it can be used to specify
+      two or more independent kernel DB files that are required to compute
+      spacecraft/instrument attitude/pointing epoch states. below is an
+      example of a multi-kernel CK specification for the MESSENGER MDIS instruments.
+      The <b>File</b> keywords are the two-valued form where "messenger" must map
+      to an entry in the <b>DataDictionary</b> group of a loaded
+      <em>IsisPreferences</em> file.
+    </p>
+    <PRE>
+Object = Instrument
+
+  Group = Selection
+    Match = ("Instrument","InstrumentId","MDIS-WAC")
+    File = ("messenger", "kernels/ck/mdis_kernels.????.db")
+    File = ("messenger", "kernels/ck/messenger_mdis_att_kernels.????.db")
+    File = ("messenger", "kernels/ck/messenger_kernels.????.db")
+  End_Group
+
+  Group = Selection
+    Match = ("Instrument","InstrumentId","MDIS-NAC")
+    File = ("messenger", "kernels/ck/mdis_kernels.????.db")
+    File = ("messenger", "kernels/ck/messenger_mdis_att_kernels.????.db")
+    File = ("messenger", "kernels/ck/messenger_kernels.????.db")
+  End_Group
+
+End_Object
+End
+    </PRE>
+    <p>
+      Note the <b>Dependencies</b> group, or any other group/keyword section, are
+      ignored and not evaluated/validated by this application.
+    </p>
+    <h3>Validation</h3>
+    <p>
+      The procedure to validate the ISISDATA area will start with the DATADIR
+      directory provided by the user. The default refers to the top level ISIS
+      ancillary data istallation directory specifed by the environment
+      variable $ISISDATA. However, this can be any existing directory in the
+      $ISISDATA hierarchy, such as DATADIR=$ISISDATA/osirisrex.
+      <em>isisdataeval</em> will evaluate every file in that directory
+      and all subdirectories for validity.
+    </p>
+    <p>
+      The total number files are counted and sizes of every file is accumulated
+      as the top directory is traversed. The algorithm to validate ISISDATA
+      searches for two basic file patterns in each directory. First, all kernel
+      configurations are searched for using the file pattern form
+      <b>kernel.????.conf</b>. For all configurations found, the highest
+      verson of the config file is selected and its contents read. The highest
+      version of each file pattern found in all <b>File</b> keywords in
+      <b>Selection</b> groups are determined. These files are treated as
+      kernel DB files and evaluated as described below. Note these file names
+      are strongly recommended <b>not</b> to be of the generic form
+      <b>kernel.????.db</b> to minimize confusion and erroneous behavior.
+    </p>
+    <p>
+      After the configuration files are processed, a second search is made
+      for kernel DB files using the form <b>kernels.????.db</b>. The
+      highest version of these files are selected and its contents are read.
+      For every <b>File</b> specification in a <b>Selection</b> group,
+      the highest version is determined and then checked for existance.
+      If no files are found, which typically occurs when looking for the
+      highest version, it is reported as missing. The missing file, the
+      file that contains the reference to it, and the status of the file
+      are written to the file name specifed in the TOISSUES parameter.
+    </p>
+    <p>
+      There are occurances of kernel DB files that contain no specification
+      or content at all. These are oddball files in the system and are also
+      reported as invalid. All files contained in the TOISSUES output file
+      would lead to errors in <em>spiceinit</em> for images obtained from that
+      particular mission.
+    </p>
+  </description>
+
+  <history>
+    <change name="Kris J. Becker" date="2023-01-09">
+      Original version
+    </change>
+  </history>
+
+  <seeAlso>
+    <applications>
+      <item>kerneldbgen</item>
+      <item>spiceinit</item>
+    </applications>
+  </seeAlso>
+
+  <category>
+    <categoryItem>System</categoryItem>
+    <categoryItem>Utility</categoryItem>
+  </category>
+
+  <groups>
+    <group name="Files">
+      <parameter name="PREFERENCES">
+        <type>string</type>
+        <brief>
+          IsisPreferences file contents overrides defaults
+        </brief>
+        <description>
+           Defines data directory substitutions that is assumed to be
+           part of the ISISDATA directory hierachy. Specifying an ISIS
+           Preferences file using "-pref=PREFERENCES" is equivalent to
+           using this parameter except that using this parameter will
+           log the Preferences file used. If both are options are given,
+           the contents of this PREFERENCES file overrides them all
+           loaded before it. <em>isisdataeval</em> uses the contents
+           of the DataDictionary group for ISIS mission and environment
+           variable file path translations. This DataDictionary
+           group is reported to the user and logged to the
+           print.prt file.
+        </description>
+        <internalDefault>
+           None
+        </internalDefault>
+      </parameter>
+
+      <parameter name="DATADIR">
+        <type>string</type>
+        <brief>
+          Top data directory to evaluate
+        </brief>
+        <description>
+           Top data directory that is assumed to be part of the
+           ISISDATA directory hierachy. The default value of this
+           parameter will evaluate all of ISISDATA that is installed
+           in the specified directory.
+        </description>
+        <default><item>
+           $ISISDATA
+        </item></default>
+      </parameter>
+
+
+      <parameter name="ISISDATA">
+        <type>string</type>
+        <brief>
+          Specify root data directory to use for ISISDATA
+        </brief>
+        <description>
+         This may be required to efficiently switch to different installations
+         of ISISDATA. It is needed because the translations within the kernel DB
+         and config files will eventually translate $ISISDATA to an absolute directory
+         name. It can be altered easily by manually adding the translation of ISISDATA
+         into the <b>DataDictionary</b> after reading all the
+         <em>IsisPreferences</em> files (several versions may be read for each
+         ISIS application ran). This essentially replaces the current value of
+         $ISISDATA without the need to expressly set an environment variable.
+         This is accomplished by adding the value given to the <b>DataDictionary</b>
+         which will be used to fully expand ISIS file names.
+        </description>
+        <internalDefault>
+           $ISISDATA
+        </internalDefault>
+      </parameter>
+
+      <parameter name="TOISSUES">
+        <type>filename</type>
+        <brief>
+           Filename to write names of problematic kernels files in DATADIR
+        </brief>
+        <description>
+          <p>
+            Provide the name of a file to write problematic (e.g., missing,
+            symlinks, etc...) kernels encountered during
+            validation. There will be six columns separated by a comma. The columes
+            are "status, filespec, sourcespec, source, target, category". where the
+            <em>status</em> indicates the issue/problem with the file,
+            <em>filespec</em> is the original form of the name,
+            <em>sourcespec</em> is the name of the versioned patterned source db/conf,
+            <em>target</em> is the fully expanded filespec, and
+            <em>category</em> is the type or category of the source reference.
+            An brief example of the contents:
+          </p>
+<PRE>
+status, filespec, sourcespec, source, target, category
+missing,$apollo17/kernels/ik/apollo17_panoramic.????.ti,/opt/isisdatafull/apollo17/kernels/ik/kernels.????.db,/opt/isisdatafull/apollo17/kernels/ik/kernels.0002.db,/opt/isisdatafull/apollo17/kernels/ik/kernels.0002.db,null
+missing,$base/kernels/spk/nep096.bsp,/opt/isisdatafull/base/kernels/spk/kernels.????.db,/opt/isisdatafull/base/kernels/spk/kernels.0006.db,/opt/isisdatafull/base/kernels/spk/kernels.0006.db,null
+missing,$base/kernels/spk/nep096.bsp,/opt/isisdatafull/base/kernels/spk/kernels.????.db,/opt/isisdatafull/base/kernels/spk/kernels.0006.db,/opt/isisdatafull/base/kernels/spk/kernels.0006.db,null
+empty,/opt/isisdatafull/cassini/kernels/ik/kernels.????.db,/opt/isisdatafull/cassini/kernels/ik/kernels.0001.db,/opt/isisdatafull/cassini/kernels/ik/kernels.0001.db,/opt/isisdatafull/cassini/kernels/ik/kernels.0001.db,Instrument
+</PRE>
+        </description>
+        <internalDefault>
+           None
+        </internalDefault>
+      </parameter>
+
+      <parameter name="TOINVENTORY">
+        <type>filename</type>
+        <brief>
+           Filename to write all files in DATADIR inventory volume
+        </brief>
+        <description>
+        <p>
+          Provide the name of a file to results of the inventory volumn in DATADIR.
+          validation. There will be six columns separated by a comma. The columns
+          are "status, filespec, sourcespec, source, target, category". where the
+          <em>status</em> indicates the issue/problem with the file,
+          <em>filespec</em> is the original form of the name,
+          <em>sourcespec</em> is the name of the versioned patterned source db/conf,
+          <em>target</em> is the fully expanded filespec, and
+          <em>category</em> is the type or category of the source reference.
+          An brief example of the contents:
+          </p>
+<PRE>
+filespec,filepath,exists,file,symlink,target,created,createdet,modified,modifiedet,size,md5hash
+/opt/isisdatafull/apollo15/calibration/ApolloPanFiducialMark.cub,/opt/isisdatafull/apollo15/calibration/ApolloPanFiducialMark.cub,true,/opt/isisdatafull/apollo15/calibration/ApolloPanFiducialMark.cub,false,/opt/isisdatafull/apollo15/calibration/ApolloPanFiducialMark.cub,2022-12-02T14:10:29,723262298.1831114,2022-08-12T22:10:19,713614288.1829929,330891,9336f9b68d0686004b0f4bdc0633ccf6
+/opt/isisdatafull/apollo15/calibration/METRIC_flatfield.cub,/opt/isisdatafull/apollo15/calibration/METRIC_flatfield.cub,true,/opt/isisdatafull/apollo15/calibration/METRIC_flatfield.cub,false,/opt/isisdatafull/apollo15/calibration/METRIC_flatfield.cub,2022-12-02T14:11:58,723262387.1831114,2022-08-12T22:10:19,713614288.1829929,2099909504,c28e9708cd4b99db50e43b91faa28cc1
+/opt/isisdatafull/apollo15/kernels/ck/AS15_M_REV04_SMITHED_V01.bc,/opt/isisdatafull/apollo15/kernels/ck/AS15_M_REV04_SMITHED_V01.bc,true,/opt/isisdatafull/apollo15/kernels/ck/AS15_M_REV04_SMITHED_V01.bc,false,/opt/isisdatafull/apollo15/kernels/ck/AS15_M_REV04_SMITHED_V01.bc,2022-12-02T14:10:31,723262300.1831114,2022-08-12T22:10:19,713614288.1829929,49152,44743a36fba4b394752fbf5749c626ec
+</PRE>
+        </description>
+        <internalDefault>
+           None
+        </internalDefault>
+      </parameter>
+
+      <parameter name="TOERRORS">
+        <type>filename</type>
+        <brief>
+           Filename to write errors found in the DATADIR inventory volume
+        </brief>
+        <description>
+          Provide the name of a file to write errors (e.g., missing,
+          symlinks, etc...) files during the inventory. Errors in the
+          inventory are defined as any symlink (file), symlinks that
+          reference non-existant files or files external to the
+          DATADIR directory. And any file that cannot be opened/read
+          are also reported. The format of this file will be as follows:
+<PRE>
+status, filespec, sourcespec, source, target, category
+error,/opt/isisdatafull/mex/kernels/dsk/MEX_SC_SA,/opt/isisdatafull/mex/kernels/dsk/MEX_SC_SA+Y_V00.OBJ,/opt/isisdatafull/mex/kernels/dsk/MEX_SC_SA,/opt/isisdatafull/mex/kernels/dsk/MEX_SC_SA+Y_V00.OBJ,openfailed
+error,/opt/isisdatafull/rosetta/kernels/dsk/ROS_SC_SA,/opt/isisdatafull/rosetta/kernels/dsk/ROS_SC_SA+Y_V00.BDS,/opt/isisdatafull/rosetta/kernels/dsk/ROS_SC_SA,/opt/isisdatafull/rosetta/kernels/dsk/ROS_SC_SA+Y_V00.BDS,openfailed
+</PRE>
+        </description>
+        <internalDefault>
+           None
+        </internalDefault>
+      </parameter>
+    </group>
+
+    <group name= "Options">
+      <parameter name="VERIFY">
+        <type>boolean</type>
+        <brief>Run verification of inventory</brief>
+        <description>
+          <p>
+            This parameter is provided to explicity turn on the process
+            of verification of the ISISDATA FILE inventory. This is not
+            needed if HASH!=None and/or a file is provided in the
+            TOINVENTORY parameter.
+          </p>
+          <p>
+            Basic vertification of ISISDATA inventory will run through
+            all the files in ISISDATA and ensure that the expanded version
+            of the filename exists. There is at least one case this option
+            will reveal is if a `+` character exists in a file name. It is
+            flagged as an error here.
+          </p>
+        </description>
+        <default><item>false</item></default>
+      </parameter>
+      <parameter name= "HASH">
+        <type>string</type>
+        <default><item>NOHASH</item></default>
+        <brief>Type of hash algorithm to use for computing file hashes</brief>
+        <description>
+          <p>
+            Compute file hash values for all files found in the ISISDATA
+            directory. Note if this parameter is given, it will invoke a
+            complete inventory of the DATADIR directory and compute the
+            HASH for the file using the specified algorithm. Not only
+            does it compute the hash for the file, it also computes a
+            a complete volume hash of all files in the inventory.
+            This option can be most useful for verifying ISISDATA
+            installations are valid.
+          </p>
+          <p>
+            BE FOREWARNED!! Appling this option will significantly slow down the
+            the execution of this application. It essentially reads all the
+            files in the DATADIR path and all subdirectories
+            (i.e., the <em>volume</em>) and reports a single hash value for the
+            complete DATADIR contents. If DATADIR = ISISDATA, the hash value
+            for the complete ISISDATA volume is computed as a single value
+            and reports it to the console and in the ISIS log file.
+          </p>
+          <p>
+            The short description of hash algorithms below are provided from this
+            <a href="https://www.freecodecamp.org/news/md5-vs-sha-1-vs-sha-2-which-is-the-most-secure-encryption-hash-and-how-to-check-them/">
+            link</a>. As such, each file that has a hash value can easily compared
+            for the same contents using programs provided by most computer operating
+            systems. Linux provides the <em>md5sum</em> application. On the Mac platform,
+            it is just <em>md5</em>.
+          </p>
+          <p>
+            The TOINVENTORY file will contain a <em>md5hash</em> column similar
+            to this example:
+<PRE>
+filespec,size,md5hash
+/opt/isisdatafiltered/apollo15/calibration/ApolloPanFiducialMark.cub,330891,9336f9b68d0686004b0f4bdc0633ccf6
+</PRE>
+             To compare this file directly, you can use the command:
+<PRE>
+md5  /opt/isisdatafiltered/apollo15/calibration/ApolloPanFiducialMark.cub
+</PRE>
+          </p>
+        </description>
+        <list>
+            <option value="NOHASH">
+               <brief>
+                  Hashes will not be computed
+               </brief>
+               <description>
+                  This indicates that no hash values will be computed for the
+                  the ISISDATA inventory (default).
+               </description>
+           </option>
+           <option value="MD5">
+               <brief>
+                  Compute a crypto hash using the MD5 algorithm
+               </brief>
+               <description>
+                   The MD5 hash function produces a 128-bit hash value.
+                   It was designed for use in cryptography, but vulnerabilities
+                   were discovered over the course of time, so it is no longer
+                   recommended for that purpose. However, it is still used
+                   for database partitioning and computing checksums to
+                   validate files transfers.
+               </description>
+           </option>
+           <option value="SHA1">
+               <brief>
+                 Compute a crypto hash using the SHA-1 algorithm
+               </brief>
+               <description>
+                  <p>
+                    SHA stands for Secure Hash Algorithm. The first version of
+                    the algorithm was SHA-1, and was later followed by SHA-2
+                    (see below).
+                  </p>
+                  <p>
+                    Whereas MD5 produces a 128-bit hash, SHA1 generates
+                    160-bit hash (20 bytes). In hexadecimal format, it is an
+                    integer 40 digits long. Like MD5, it was designed for
+                    cryptology applications, but was soon found to have
+                    vulnerabilities also. As of today, it is no longer
+                    considered to be any less resistant to attack than MD5.
+                  </p>
+               </description>
+           </option>
+
+           <option value="SHA256">
+               <brief>
+                   Compute a crypto hash using the SHA-256 algorithm
+               </brief>
+               <description>
+                  <p>
+                    The second version of SHA, called SHA-2, has many variants.
+                    Probably the one most commonly used is SHA-256, which the
+                    National Institute of Standards and Technology (NIST)
+                    recommends using instead of MD5 or SHA-1.
+                  </p>
+                  <p>
+                    The SHA-256 algorithm returns hash value of 256-bits, or
+                    64 hexadecimal digits. While not quite perfect, current
+                    research indicates it is considerably more secure than
+                    either MD5 or SHA-1.
+                  </p>
+                  <p>
+                    Performance-wise, a SHA-256 hash is about 20-30% slower
+                    to calculate than either MD5 or SHA-1 hashes.
+                  </p>
+               </description>
+           </option>
+        </list>
+      </parameter>
+      <parameter name="HASHBUFFER">
+        <type>integer</type>
+        <default><item>256</item></default>
+        <brief>Size of the buffer (MB) to read files for hash processing</brief>
+        <description>
+          This allows users to have more control of the size of
+          buffer to read inventory file data to compute hashes.
+          Specify this value in megabytes ( 1024 * 1024 * HASHBUFFER).
+          The buffer is not allocated if HASH=NOHASH.
+        </description>
+      </parameter>
+    </group>
+  </groups>
+
+  <examples>
+    <example>
+      <brief>
+        General usage that evaluates the complete ISISDATA installation
+      </brief>
+      <description>
+        <p>
+          This example shows the complete installation of the full ISISDATA
+          download and install using the USGS
+          <a href="https://github.com/USGS-Astrogeology/ISIS3/blob/dev/isis/scripts/downloadIsisData">downloadIsisData</a>
+          utility and the
+          <a href="https://github.com/USGS-Astrogeology/ISIS3/blob/dev/isis/config/rclone.conf">rclone.conf</a> file.
+<PRE>
+mkdir -p /opt/isisdatafull
+./downloadIsisData all /opt/isisdatafull --config=rclone.conf  -vv --log-file=isisdata_full.log
+
+isisdataeval isisdata=/opt/isisdatafull \
+             datadir=/opt/isisdatafull \
+             toissues=isisdata_full_download_issues.csv \
+             toinventory=isisdata_full_download_inventory.csv \
+             toerrors=isisdata_full_download_inventory_errors.csv \
+             hash=md5 \
+             preference=IsisPreferences | tee -a isisdata_full_evaluation.log
+</PRE>
+        </p>
+        <p>
+          This run produces the following results that was current state of the
+          ISISDATA volume on or about December 2, 2022. Note a more comprehensive
+          set of results are available
+          <a href="https://gist.github.com/KrisBecker/327976baa7ce10f80cbc7ba3b8b8e9e7">here</a>:
+<PRE>
+DATAROOT = /opt/isisdatafull
+DATAROOT = /opt/isisdatafull
+
+ISISDATA = $ISISDATA
+ISISDATA = /opt/isisdatafull
+ISISDATA reset by user!
+
+########################################################
+# Customize the location of mission specific data
+# files (calibration and spice kernels).  Usually this
+# should be left to the Isis administrator
+########################################################
+Group = DataDirectory
+  # Backwards compatability for versions prior to 4.1.0
+  ISIS3DATA    = $ISISDATA
+  Apollo15     = $ISISDATA/apollo15
+  Apollo16     = $ISISDATA/apollo16
+  Apollo17     = $ISISDATA/apollo17
+  Base         = $ISISDATA/base
+  Cassini      = $ISISDATA/cassini
+  Chan1        = $ISISDATA/chan1
+  Chandrayaan1 = $ISISDATA/chandrayaan1
+  Clementine1  = $ISISDATA/clementine1
+  Clipper      = $ISISDATA/../datalocal/clipper
+  Control      = $ISISDATA/control
+  Dawn         = $ISISDATA/dawn
+  Galileo      = $ISISDATA/galileo
+  Hayabusa     = $ISISDATA/hayabusa
+  Hayabusa2    = $ISISDATA/hayabusa2
+  Juno         = $ISISDATA/juno
+  Kaguya       = $ISISDATA/kaguya
+  Lo           = $ISISDATA/lo
+  Lro          = $ISISDATA/lro
+  Mariner10    = $ISISDATA/mariner10
+  Mer          = $ISISDATA/mer
+  Mex          = $ISISDATA/mex
+  Messenger    = $ISISDATA/messenger
+  Mgs          = $ISISDATA/mgs
+  Mro          = $ISISDATA/mro
+  Near         = $ISISDATA/near
+  NewHorizons  = $ISISDATA/newhorizons
+  Odyssey      = $ISISDATA/odyssey
+  OsirisRex    = $ISISDATA/osirisrex
+  Rolo         = $ISISDATA/rolo
+  Rosetta      = $ISISDATA/rosetta
+  Smart1       = $ISISDATA/smart1
+  Tgo          = $ISISDATA/tgo
+  Viking1      = $ISISDATA/viking1
+  Viking2      = $ISISDATA/viking2
+  Voyager1     = $ISISDATA/voyager1
+  Voyager2     = $ISISDATA/voyager2
+  Temporary    = .
+  ISISDATA     = /opt/isisdatafull
+End_Group
+
+Validation Complete...45 issues found!
+status, filespec, sourcespec, source, target, category
+missing,$apollo17/kernels/ik/apollo17_panoramic.????.ti,/opt/isisdatafull/apollo17/kernels/ik/kernels.????.db,/opt/isisdatafull/apollo17/kernels/ik/kernels.0002.db,/opt/isisdatafull/apollo17/kernels/ik/kernels.0002.db,null
+missing,$base/kernels/spk/nep096.bsp,/opt/isisdatafull/base/kernels/spk/kernels.????.db,/opt/isisdatafull/base/kernels/spk/kernels.0006.db,/opt/isisdatafull/base/kernels/spk/kernels.0006.db,null
+missing,$base/kernels/spk/nep096.bsp,/opt/isisdatafull/base/kernels/spk/kernels.????.db,/opt/isisdatafull/base/kernels/spk/kernels.0006.db,/opt/isisdatafull/base/kernels/spk/kernels.0006.db,null
+empty,/opt/isisdatafull/cassini/kernels/ik/kernels.????.db,/opt/isisdatafull/cassini/kernels/ik/kernels.0001.db,/opt/isisdatafull/cassini/kernels/ik/kernels.0001.db,/opt/isisdatafull/cassini/kernels/ik/kernels.0001.db,Instrument
+missing,$Clementine1/kernels/ck/MOON0056-060111.3s.bc,/opt/isisdatafull/clementine1/kernels/ck/save/kernels.????.db,/opt/isisdatafull/clementine1/kernels/ck/save/kernels.0003.db,/opt/isisdatafull/clementine1/kernels/ck/save/kernels.0003.db,Smithed
+missing,$Clementine1/kernels/iak/lwirAddendum???.ti,/opt/isisdatafull/clementine1/kernels/iak/kernels.????.db,/opt/isisdatafull/clementine1/kernels/iak/kernels.0002.db,/opt/isisdatafull/clementine1/kernels/iak/kernels.0002.db,null
+empty,/opt/isisdatafull/clementine1/kernels/pck/kernels.????.db,/opt/isisdatafull/clementine1/kernels/pck/kernels.0001.db,/opt/isisdatafull/clementine1/kernels/pck/kernels.0001.db,/opt/isisdatafull/clementine1/kernels/pck/kernels.0001.db,TargetAttitudeShape
+empty,/opt/isisdatafull/galileo/kernels/fk/kernels.????.db,/opt/isisdatafull/galileo/kernels/fk/kernels.0001.db,/opt/isisdatafull/galileo/kernels/fk/kernels.0001.db,/opt/isisdatafull/galileo/kernels/fk/kernels.0001.db,Frame
+empty,/opt/isisdatafull/galileo/kernels/ik/kernels.????.db,/opt/isisdatafull/galileo/kernels/ik/kernels.0001.db,/opt/isisdatafull/galileo/kernels/ik/kernels.0001.db,/opt/isisdatafull/galileo/kernels/ik/kernels.0001.db,Instrument
+missing,$galileo/kernels/spk/s000407a.bsp,/opt/isisdatafull/galileo/kernels/spk/kernels.????.db,/opt/isisdatafull/galileo/kernels/spk/kernels.0003.db,/opt/isisdatafull/galileo/kernels/spk/kernels.0003.db,Reconstructed
+missing,$galileo/kernels/spk/s000615a.bsp,/opt/isisdatafull/galileo/kernels/spk/kernels.????.db,/opt/isisdatafull/galileo/kernels/spk/kernels.0003.db,/opt/isisdatafull/galileo/kernels/spk/kernels.0003.db,Reconstructed
+missing,$galileo/kernels/spk/s020128a.bsp,/opt/isisdatafull/galileo/kernels/spk/kernels.????.db,/opt/isisdatafull/galileo/kernels/spk/kernels.0003.db,/opt/isisdatafull/galileo/kernels/spk/kernels.0003.db,Reconstructed
+missing,$galileo/kernels/spk/s021119a.bsp,/opt/isisdatafull/galileo/kernels/spk/kernels.????.db,/opt/isisdatafull/galileo/kernels/spk/kernels.0003.db,/opt/isisdatafull/galileo/kernels/spk/kernels.0003.db,Reconstructed
+missing,$galileo/kernels/spk/s030129a.bsp,/opt/isisdatafull/galileo/kernels/spk/kernels.????.db,/opt/isisdatafull/galileo/kernels/spk/kernels.0003.db,/opt/isisdatafull/galileo/kernels/spk/kernels.0003.db,Reconstructed
+missing,$galileo/kernels/spk/s980326b.bsp,/opt/isisdatafull/galileo/kernels/spk/kernels.????.db,/opt/isisdatafull/galileo/kernels/spk/kernels.0003.db,/opt/isisdatafull/galileo/kernels/spk/kernels.0003.db,Reconstructed
+missing,$galileo/kernels/spk/s990114a.bsp,/opt/isisdatafull/galileo/kernels/spk/kernels.????.db,/opt/isisdatafull/galileo/kernels/spk/kernels.0003.db,/opt/isisdatafull/galileo/kernels/spk/kernels.0003.db,Reconstructed
+external,/opt/isisdatafull/kaguya/kernels/spk//SELMAINGRGM900CL660DIRALT2008103020090610.bsp,/opt/isisdatafull/kaguya/kernels/spk/kernels.????.db,/opt/isisdatafull/kaguya/kernels/spk/kernels.0005.db,/opt/isisdatafull/kaguya/kernels/spk/kernels.0005.db,Smithed
+empty,/opt/isisdatafull/lo/kernels/fk/kernels.????.db,/opt/isisdatafull/lo/kernels/fk/kernels.0001.db,/opt/isisdatafull/lo/kernels/fk/kernels.0001.db,/opt/isisdatafull/lo/kernels/fk/kernels.0001.db,Frame
+empty,/opt/isisdatafull/mariner10/kernels/ik/kernels.????.db,/opt/isisdatafull/mariner10/kernels/ik/kernels.0001.db,/opt/isisdatafull/mariner10/kernels/ik/kernels.0001.db,/opt/isisdatafull/mariner10/kernels/ik/kernels.0001.db,Instrument
+empty,/opt/isisdatafull/mgs/kernels/fk/kernels.????.db,/opt/isisdatafull/mgs/kernels/fk/kernels.0001.db,/opt/isisdatafull/mgs/kernels/fk/kernels.0001.db,/opt/isisdatafull/mgs/kernels/fk/kernels.0001.db,Frame
+empty,/opt/isisdatafull/odyssey/kernels/ik/kernels.????.db,/opt/isisdatafull/odyssey/kernels/ik/kernels.0001.db,/opt/isisdatafull/odyssey/kernels/ik/kernels.0001.db,/opt/isisdatafull/odyssey/kernels/ik/kernels.0001.db,Instrument
+missing,$osirisrex/kernels/pck/moon_pa_de421_1900-????.bpc,/opt/isisdatafull/osirisrex/kernels/dsk/kernels.????.db,/opt/isisdatafull/osirisrex/kernels/dsk/kernels.0001.db,/opt/isisdatafull/osirisrex/kernels/dsk/kernels.0001.db,null
+missing,$osirisrex/kernels/fk/moon_??????.tf,/opt/isisdatafull/osirisrex/kernels/dsk/kernels.????.db,/opt/isisdatafull/osirisrex/kernels/dsk/kernels.0001.db,/opt/isisdatafull/osirisrex/kernels/dsk/kernels.0001.db,null
+missing,$osirisrex/kernels/fk/moon_assoc_me.tf,/opt/isisdatafull/osirisrex/kernels/dsk/kernels.????.db,/opt/isisdatafull/osirisrex/kernels/dsk/kernels.0001.db,/opt/isisdatafull/osirisrex/kernels/dsk/kernels.0001.db,null
+missing,$osirisrex/kernels/pck/earth_latest_high_prec.bpc,/opt/isisdatafull/osirisrex/kernels/dsk/kernels.????.db,/opt/isisdatafull/osirisrex/kernels/dsk/kernels.0001.db,/opt/isisdatafull/osirisrex/kernels/dsk/kernels.0001.db,null
+missing,$osirisrex/kernels/fk/earth_assoc_itrf??.tf,/opt/isisdatafull/osirisrex/kernels/dsk/kernels.????.db,/opt/isisdatafull/osirisrex/kernels/dsk/kernels.0001.db,/opt/isisdatafull/osirisrex/kernels/dsk/kernels.0001.db,null
+missing,$osirisrex/kernels/pck/moon_pa_de421_1900-????.bpc,/opt/isisdatafull/osirisrex/kernels/pck/kernels.????.db,/opt/isisdatafull/osirisrex/kernels/pck/kernels.0001.db,/opt/isisdatafull/osirisrex/kernels/pck/kernels.0001.db,null
+missing,$osirisrex/kernels/fk/moon_??????.tf,/opt/isisdatafull/osirisrex/kernels/pck/kernels.????.db,/opt/isisdatafull/osirisrex/kernels/pck/kernels.0001.db,/opt/isisdatafull/osirisrex/kernels/pck/kernels.0001.db,null
+missing,$osirisrex/kernels/fk/moon_assoc_me.tf,/opt/isisdatafull/osirisrex/kernels/pck/kernels.????.db,/opt/isisdatafull/osirisrex/kernels/pck/kernels.0001.db,/opt/isisdatafull/osirisrex/kernels/pck/kernels.0001.db,null
+missing,$osirisrex/kernels/pck/earth_latest_high_prec.bpc,/opt/isisdatafull/osirisrex/kernels/pck/kernels.????.db,/opt/isisdatafull/osirisrex/kernels/pck/kernels.0001.db,/opt/isisdatafull/osirisrex/kernels/pck/kernels.0001.db,null
+missing,$osirisrex/kernels/fk/earth_assoc_itrf??.tf,/opt/isisdatafull/osirisrex/kernels/pck/kernels.????.db,/opt/isisdatafull/osirisrex/kernels/pck/kernels.0001.db,/opt/isisdatafull/osirisrex/kernels/pck/kernels.0001.db,null
+missing,$smart1/kernels/fk/SMART1_V????.TF,/opt/isisdatafull/smart1/kernels/fk/kernels.????.db,/opt/isisdatafull/smart1/kernels/fk/kernels.0001.db,/opt/isisdatafull/smart1/kernels/fk/kernels.0001.db,null
+empty,/opt/isisdatafull/smart1/kernels/iak/kernels.????.db,/opt/isisdatafull/smart1/kernels/iak/kernels.0001.db,/opt/isisdatafull/smart1/kernels/iak/kernels.0001.db,/opt/isisdatafull/smart1/kernels/iak/kernels.0001.db,Empty
+empty,/opt/isisdatafull/viking1/kernels/ik/kernels.????.db,/opt/isisdatafull/viking1/kernels/ik/kernels.0001.db,/opt/isisdatafull/viking1/kernels/ik/kernels.0001.db,/opt/isisdatafull/viking1/kernels/ik/kernels.0001.db,Instrument
+empty,/opt/isisdatafull/viking2/kernels/ik/kernels.????.db,/opt/isisdatafull/viking2/kernels/ik/kernels.0001.db,/opt/isisdatafull/viking2/kernels/ik/kernels.0001.db,/opt/isisdatafull/viking2/kernels/ik/kernels.0001.db,Instrument
+external,/opt/isisdatafull/voyager1/kernels/spk//vg1_sat.bsp,/opt/isisdatafull/voyager1/kernels/spk/kernels.????.db,/opt/isisdatafull/voyager1/kernels/spk/kernels.0002.db,/opt/isisdatafull/voyager1/kernels/spk/kernels.0002.db,Reconstructed
+external,/opt/isisdatafull/voyager1/kernels/spk//vgr1_jup230.bsp,/opt/isisdatafull/voyager1/kernels/spk/kernels.????.db,/opt/isisdatafull/voyager1/kernels/spk/kernels.0002.db,/opt/isisdatafull/voyager1/kernels/spk/kernels.0002.db,Reconstructed
+external,/opt/isisdatafull/voyager1/kernels/spk//vgr1_sat336.bsp,/opt/isisdatafull/voyager1/kernels/spk/kernels.????.db,/opt/isisdatafull/voyager1/kernels/spk/kernels.0002.db,/opt/isisdatafull/voyager1/kernels/spk/kernels.0002.db,Reconstructed
+external,/opt/isisdatafull/voyager2/kernels/spk//vg2_nep.bsp,/opt/isisdatafull/voyager2/kernels/spk/kernels.????.db,/opt/isisdatafull/voyager2/kernels/spk/kernels.0002.db,/opt/isisdatafull/voyager2/kernels/spk/kernels.0002.db,Reconstructed
+external,/opt/isisdatafull/voyager2/kernels/spk//vg2_sat.bsp,/opt/isisdatafull/voyager2/kernels/spk/kernels.????.db,/opt/isisdatafull/voyager2/kernels/spk/kernels.0002.db,/opt/isisdatafull/voyager2/kernels/spk/kernels.0002.db,Reconstructed
+external,/opt/isisdatafull/voyager2/kernels/spk//vg2_ura.bsp,/opt/isisdatafull/voyager2/kernels/spk/kernels.????.db,/opt/isisdatafull/voyager2/kernels/spk/kernels.0002.db,/opt/isisdatafull/voyager2/kernels/spk/kernels.0002.db,Reconstructed
+external,/opt/isisdatafull/voyager2/kernels/spk//vgr2_jup230.bsp,/opt/isisdatafull/voyager2/kernels/spk/kernels.????.db,/opt/isisdatafull/voyager2/kernels/spk/kernels.0002.db,/opt/isisdatafull/voyager2/kernels/spk/kernels.0002.db,Reconstructed
+external,/opt/isisdatafull/voyager2/kernels/spk//vgr2_nep081.bsp,/opt/isisdatafull/voyager2/kernels/spk/kernels.????.db,/opt/isisdatafull/voyager2/kernels/spk/kernels.0002.db,/opt/isisdatafull/voyager2/kernels/spk/kernels.0002.db,Reconstructed
+external,/opt/isisdatafull/voyager2/kernels/spk//vgr2_sat336.bsp,/opt/isisdatafull/voyager2/kernels/spk/kernels.????.db,/opt/isisdatafull/voyager2/kernels/spk/kernels.0002.db,/opt/isisdatafull/voyager2/kernels/spk/kernels.0002.db,Reconstructed
+external,/opt/isisdatafull/voyager2/kernels/spk//vgr2_ura083.bsp,/opt/isisdatafull/voyager2/kernels/spk/kernels.????.db,/opt/isisdatafull/voyager2/kernels/spk/kernels.0002.db,/opt/isisdatafull/voyager2/kernels/spk/kernels.0002.db,Reconstructed
+
+Running inventory ...
+isisdataeval: inventory+md5hash
+100% Processed
+
+Inventory Complete...10 issues found!
+status, filespec, sourcespec, source, target, category
+error,/opt/isisdatafull/mex/kernels/dsk/MEX_SC_SA,/opt/isisdatafull/mex/kernels/dsk/MEX_SC_SA+Y_V00.OBJ,/opt/isisdatafull/mex/kernels/dsk/MEX_SC_SA,/opt/isisdatafull/mex/kernels/dsk/MEX_SC_SA+Y_V00.OBJ,openfailed
+error,/opt/isisdatafull/rosetta/kernels/dsk/ROS_SC_SA,/opt/isisdatafull/rosetta/kernels/dsk/ROS_SC_SA+Y_V00.BDS,/opt/isisdatafull/rosetta/kernels/dsk/ROS_SC_SA,/opt/isisdatafull/rosetta/kernels/dsk/ROS_SC_SA+Y_V00.BDS,openfailed
+error,/opt/isisdatafull/rosetta/kernels/dsk/ROS_SC_SA,/opt/isisdatafull/rosetta/kernels/dsk/ROS_SC_SA+Y_V00.OBJ,/opt/isisdatafull/rosetta/kernels/dsk/ROS_SC_SA,/opt/isisdatafull/rosetta/kernels/dsk/ROS_SC_SA+Y_V00.OBJ,openfailed
+error,/opt/isisdatafull/tgo/kernels/dsk/em16_tgo_sc_sa,/opt/isisdatafull/tgo/kernels/dsk/em16_tgo_sc_sa+z_v00.bds,/opt/isisdatafull/tgo/kernels/dsk/em16_tgo_sc_sa,/opt/isisdatafull/tgo/kernels/dsk/em16_tgo_sc_sa+z_v00.bds,openfailed
+error,/opt/isisdatafull/tgo/kernels/dsk/em16_tgo_sc_sa,/opt/isisdatafull/tgo/kernels/dsk/em16_tgo_sc_sa+z_v00.obj,/opt/isisdatafull/tgo/kernels/dsk/em16_tgo_sc_sa,/opt/isisdatafull/tgo/kernels/dsk/em16_tgo_sc_sa+z_v00.obj,openfailed
+error,/opt/isisdatafull/tgo/kernels/dsk/em16_tgo_sc_sa,/opt/isisdatafull/tgo/kernels/dsk/em16_tgo_sc_sa+z_v00.png,/opt/isisdatafull/tgo/kernels/dsk/em16_tgo_sc_sa,/opt/isisdatafull/tgo/kernels/dsk/em16_tgo_sc_sa+z_v00.png,openfailed
+error,/opt/isisdatafull/voyager1/kernels/spk/voyager_1.ST,/opt/isisdatafull/voyager1/kernels/spk/voyager_1.ST+1991_a54418u.merged.bsp,/opt/isisdatafull/voyager1/kernels/spk/voyager_1.ST,/opt/isisdatafull/voyager1/kernels/spk/voyager_1.ST+1991_a54418u.merged.bsp,openfailed
+error,/opt/isisdatafull/voyager1/kernels/spk/voyager_2.ST,/opt/isisdatafull/voyager1/kernels/spk/voyager_2.ST+1992_m05208u.merged.bsp,/opt/isisdatafull/voyager1/kernels/spk/voyager_2.ST,/opt/isisdatafull/voyager1/kernels/spk/voyager_2.ST+1992_m05208u.merged.bsp,openfailed
+error,/opt/isisdatafull/voyager2/kernels/spk/voyager_1.ST,/opt/isisdatafull/voyager2/kernels/spk/voyager_1.ST+1991_a54418u.merged.bsp,/opt/isisdatafull/voyager2/kernels/spk/voyager_1.ST,/opt/isisdatafull/voyager2/kernels/spk/voyager_1.ST+1991_a54418u.merged.bsp,openfailed
+error,/opt/isisdatafull/voyager2/kernels/spk/voyager_2.ST,/opt/isisdatafull/voyager2/kernels/spk/voyager_2.ST+1992_m05208u.merged.bsp,/opt/isisdatafull/voyager2/kernels/spk/voyager_2.ST,/opt/isisdatafull/voyager2/kernels/spk/voyager_2.ST+1992_m05208u.merged.bsp,openfailed
+
+Group = Results
+  ISISDATA            = /opt/isisdatafull
+  DATADIR             = /opt/isisdatafull
+  EmptyKernelDBs      = 11
+  MissingKernelDBs    = 23
+  SymlinkKernelFiles  = 0
+  ExternalKernelFiles = 11
+  TotalDBConfigFiles  = 10 &lt;conf&gt;
+  TotalKernelDBFiles  = 219 &lt;db&gt;
+  TotalDirectories    = 565
+  TotalDataFiles      = 101452
+  TotalInstallSize    = 1947030252490 &lt;bytes&gt;
+  TotalVolumeSize     = 1813.3132276032 &lt;GB&gt;
+  InventorySymLinks   = 0
+  HashBufferSize      = 268435456 &lt;bytes&gt;
+  TotalVolumeHash     = 6cd919230b88ba0fa68d71d9942f3894 &lt;md5&gt;
+End_Group
+</PRE>
+          The files labeled <em>missing</em> are kernel files contained in
+          either a kernels.????.db or kernels.????.conf ISIS kernel database
+          configuration file. Files with <em>empty</em> status have no
+          content or do not specify any kernels. This may be needed to
+          satisfy spiceinit requirements. A status of <em>external</em>
+          may have several potential reasons for this categorization.
+          One case identifiesa  file that is referred to in a kernel
+          DB/conf file, but is not found in the full ISISDATA file
+          inventory. If a kernel file path specification contains
+          extra characters, such as '//' in a file path specification.
+          And finally, if you run <em>isisdataeval</em> on a mission
+          directory, it will identify any kernels that are referenced
+          outside that directory. This can be very helpful to finding
+          files that are external dependencies to a mission kernels
+          configuration.
+        </p>
+      </description>
+    </example>
+
+    <example>
+      <brief>
+        Evaluation of an ISISDATA mission kernel installation directory
+      </brief>
+      <description>
+        <p>
+          <em>isisdataeval</em> can be helpful to evaluate the condition of
+          a single mission dataset, such as $ISISDATA/smart1, the one we are
+          using in this example. By setting datadir=/opt/isis/data/smart1,
+          a subdirectory of $ISISDATA, it will only evaluate the contents
+          of that directory. Note this is also the recommended way to
+          confirm an ISISDATA installation by using the <em>TotalVolumeHash</em>
+          hash value to compare with others that produce the same run on the
+          SMART1 dataset.
+<PRE>
+isisdataeval isisdata=/opt/isis/data datadir=/opt/isis/data/smart1 hash=md5 preferences=IsisPreferences
+</PRE>
+        </p>
+        <p>
+          This run produces the following results that was current state of the
+          ISISDATA volume on or about December 2, 2022. Note a more comprehensive
+          set of results are available
+          <a href="https://gist.github.com/KrisBecker/327976baa7ce10f80cbc7ba3b8b8e9e7">here</a>:
+<PRE>
+
+
+DATAROOT = /opt/isis/data/smart1
+DATAROOT = /opt/isis/data/smart1
+
+ISISDATA = $ISISDATA
+ISISDATA = /opt/isis/data
+ISISDATA reset by user!
+
+########################################################
+# Customize the location of mission specific data
+# files (calibration and spice kernels).  Usually this
+# should be left to the Isis administrator
+########################################################
+Group = DataDirectory
+  # Backwards compatability for versions prior to 4.1.0
+  ISIS3DATA    = $ISISDATA
+  Apollo15     = $ISISDATA/apollo15
+  Apollo16     = $ISISDATA/apollo16
+  Apollo17     = $ISISDATA/apollo17
+  Base         = $ISISDATA/base
+  Cassini      = $ISISDATA/cassini
+  Chan1        = $ISISDATA/chan1
+  Chandrayaan1 = $ISISDATA/chandrayaan1
+  Clementine1  = $ISISDATA/clementine1
+  Clipper      = $ISISDATA/../datalocal/clipper
+  Control      = $ISISDATA/control
+  Dawn         = $ISISDATA/dawn
+  Galileo      = $ISISDATA/galileo
+  Hayabusa     = $ISISDATA/hayabusa
+  Hayabusa2    = $ISISDATA/hayabusa2
+  Juno         = $ISISDATA/juno
+  Kaguya       = $ISISDATA/kaguya
+  Lo           = $ISISDATA/lo
+  Lro          = $ISISDATA/lro
+  Mariner10    = $ISISDATA/mariner10
+  Mer          = $ISISDATA/mer
+  Mex          = $ISISDATA/mex
+  Messenger    = $ISISDATA/messenger
+  Mgs          = $ISISDATA/mgs
+  Mro          = $ISISDATA/mro
+  Near         = $ISISDATA/near
+  NewHorizons  = $ISISDATA/newhorizons
+  Odyssey      = $ISISDATA/odyssey
+  OsirisRex    = $ISISDATA/osirisrex
+  Rolo         = $ISISDATA/rolo
+  Rosetta      = $ISISDATA/rosetta
+  Smart1       = $ISISDATA/smart1
+  Tgo          = $ISISDATA/tgo
+  Viking1      = $ISISDATA/viking1
+  Viking2      = $ISISDATA/viking2
+  Voyager1     = $ISISDATA/voyager1
+  Voyager2     = $ISISDATA/voyager2
+  Temporary    = .
+  ISISDATA     = /opt/isis/data
+End_Group
+
+Validation Complete...2 issues found!
+status, filespec, sourcespec, source, target, category
+missing,$smart1/kernels/fk/SMART1_V????.TF,/opt/isis/data/smart1/kernels/fk/kernels.????.db,/opt/isis/data/smart1/kernels/fk/kernels.0001.db,/opt/isis/data/smart1/kernels/fk/kernels.0001.db,null
+empty,/opt/isis/data/smart1/kernels/iak/kernels.????.db,/opt/isis/data/smart1/kernels/iak/kernels.0001.db,/opt/isis/data/smart1/kernels/iak/kernels.0001.db,/opt/isis/data/smart1/kernels/iak/kernels.0001.db,Empty
+
+Running inventory ...
+isisdataeval: inventory+md5hash
+100% Processed
+
+Inventory Complete...0 issues found!
+
+Group = Results
+  ISISDATA            = /opt/isis/data
+  DATADIR             = /opt/isis/data/smart1
+  EmptyKernelDBs      = 1
+  MissingKernelDBs    = 1
+  SymlinkKernelFiles  = 0
+  ExternalKernelFiles = 0
+  TotalDBConfigFiles  = 0 &lt;conf&gt;
+  TotalKernelDBFiles  = 7 &lt;db&gt;
+  TotalDirectories    = 19
+  TotalDataFiles      = 2821
+  TotalInstallSize    = 12774236932 &lt;bytes&gt;
+  TotalVolumeSize     = 11.896935228258 &lt;GB&gt;
+  InventorySymLinks   = 0
+  HashBufferSize      = 268435456 &lt;bytes&gt;
+  TotalVolumeHash     = e152f4636dedaa40e2d66630036336ce &lt;md5&gt;
+End_Group
+
+</PRE>
+          The file labeled <em>missing</em> in this run is actually
+          a typo in the /opt/isis/data/smart1/kernels/fk/kernels.0001.db
+          database file.
+          The <em>empty</em> file has no no content and its size is
+          actually 0.
+        </p>
+      </description>
+    </example>
+
+    <example>
+      <brief>
+        Using file hash values effectively
+      </brief>
+      <description>
+        <p>
+          <em>isisdataeval</em> is intended to provide a means
+          to help support users and developers to determine
+          if processing errors are due to ISISDATA installation
+          problems. The individual file hash values are a useful
+          tool to ensure the contents of the installed ISISDATA
+          files match the ISISDATA source hash. Users can run
+          <em>isisdataeval</em> on a directory and determine
+          the hash values for all files in the that directory
+          and all subdirectories. This includes calibration
+          and any/all files that exist in the directories. By
+          choosing to compute the file hash (i.e., HASH=MD5),
+          and save the results to a file specified in
+          TOINVENTORY, the hash file is provided in that
+          output file as the last column. The column name
+          will be a composite of the value supplied in the
+          HASH parameter with "hash" appended. So if
+          HASH=MD5, the column will be "md5hash" as shown below.
+<PRE>
+filespec,filepath,exists,file,symlink,target,created,createdet,modified,modifiedet,size,md5hash
+ /opt/isis/data/osirisrex/kernels/spk/orx_201020_201020_201020_od294_v1.bsp,/opt/isis/data/osirisrex/kernels/spk/orx_201020_201020_201020_od294_v1.bsp,true,/opt/isis/data/osirisrex/kernels/spk/orx_201020_201020_201020_od294_v1.bsp,false,/opt/isis/data/osirisrex/kernels/spk/orx_201020_201020_201020_od294_v1.bsp,2022-12-02T03:45:35,723224804.1831008,2021-05-14T17:52:17,674286806.1852669,32768,57729ccd8fe7c44ad3ac887a80846413
+</PRE>
+        </p>
+        <p>
+          In this example, it shows the OSIRIS-REx kernel, /opt/isis/data/osirisrex/kernels/spk/orx_201020_201020_201020_od294_v1.bsp,
+          is 32768 bytes in size and has a hash value of "57729ccd8fe7c44ad3ac887a80846413".
+          You can now run the equivalent MD5 command, available on most OSes, on the file
+          and it should directly compare with the hash value in the ISISDATA inventory
+          file. The Linux application, <em>md5sum</em>, can be used to compute the MD5 hash
+          of any file.
+<PRE>
+ls -l /opt/isis/data/osirisrex/kernels/spk/orx_201020_201020_201020_od294_v1.bsp
+-rw-rw-r--+ 1 kbecker kbecker 32768 May 14  2021 /opt/isis/data/osirisrex/kernels/spk/orx_201020_201020_201020_od294_v1.bsp
+
+
+md5sum /opt/isis/data/osirisrex/kernels/spk/orx_201020_201020_201020_od294_v1.bsp
+57729ccd8fe7c44ad3ac887a80846413  /opt/isis/data/osirisrex/kernels/spk/orx_201020_201020_201020_od294_v1.bsp
+</PRE>
+          In this particular example, the size, actual date created (in the
+          <em>modified</em> column) and the hash value all compare precisely.
+        </p>
+      </description>
+    </example>
+  </examples>
+</application>
diff --git a/isis/src/system/apps/isisdataeval/main.cpp b/isis/src/system/apps/isisdataeval/main.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..115879fb4e298fd1b1e35e9ba7779aa5f4c7e95b
--- /dev/null
+++ b/isis/src/system/apps/isisdataeval/main.cpp
@@ -0,0 +1,23 @@
+/** This is free and unencumbered software released into the public domain.
+
+The authors of ISIS do not claim copyright on the contents of this file.
+For more details about the LICENSE terms and the AUTHORS, you will
+find files of those names at the top level of this repository. **/
+
+/* SPDX-License-Identifier: CC0-1.0 */
+
+#include "Isis.h"
+
+#include "isisdataeval.h"
+
+#include "Application.h"
+#include "Pvl.h"
+
+using namespace Isis;
+
+void IsisMain() {
+  UserInterface &ui = Application::GetUserInterface();
+  Pvl appLog;
+  isisdataeval(ui, &appLog);
+}
+
diff --git a/isis/src/system/apps/isisdataeval/tools/README.md b/isis/src/system/apps/isisdataeval/tools/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..3f53eed23ec1a348aced21d3b04a7a62daefdb4a
--- /dev/null
+++ b/isis/src/system/apps/isisdataeval/tools/README.md
@@ -0,0 +1,115 @@
+# <a name="#testingisisdataeval">ISISDATA Mockup Procedures for Testing isisdataeval</a>
+
+Proper, thorough testing of ISIS application `isisdataeval` is difficult due to the requirements of having a stable and flexible ISISDATA directory structure to test with. It is unfeasible to rely on the real $ISISDATA due to its volitile and every changing content. One solution is to create a mockup of the ISISDATA directory but mimimize the resources to emulate a real, functioning ISISDATA installation. The system presented here generates a complete ISISDATA directory structure at a signification fraction of the actual dataset. By careful selective culling of many of the existing files in the selection mission datasets, it creates a real time snapshot of ISISDATA to help test `isisdataeval`.
+
+The ISISDATA mockup system is a complete copy of every directory and every file in an existing ISISDATA install. However, the contents of every file has been replaced with information about that file, keeping the size of every file to about 300 bytes each. Here is the format of a file prepared by this system:
+
+`cat  isisdatamockup/base/kernels/spk/de118.bsp`
+```
+{
+    "source": "$ISISDATA/base/kernels/spk/de118.bsp",
+    "filesize": 4097024,
+    "createtime": "2022-08-12T22:13:17.000000",
+    "modifiedtime": "2022-11-24T12:24:04.449174",
+    "md5hash": "24a225d8262be0e0a7140dd40c708428",
+    "sha256hash": "118774c31125cf0051faeb340532d03cab1b81adb63369db5842daefc1684a3c",
+    "sha1hash": "dd6071b1a47193fe7abd6e9fc9db808408ef0429"
+}
+```
+
+The size of this file has been reduced to 376 bytes from 4,097,024 bytes. Each file will contain JSON text with details about the original file. The files size, creation and modified dates, and hash values for the md5, sha1 and sha256 hash algorithms computed from the contents of the file using Python tools - and independt. The hash values are expressly provided to provide comparisons of the Qt algorithms used in `isisdataeval`. Note it is possible, but cannot be guaranteed, the _source_ for the file will exists in every ISISDATA install, or even be the same file. But this is a good thing to test.
+
+# <a name="#isisdatamockuptool">ISISDATA Mockup Tool - isisdata_mockup.py</a>
+
+A tool has been provided with the `isisdataeval` application that generates ISISDATA mockups for this and potentially other purposes. This Python tool will convert an ISISDATA installation into a mockup that is suitable to test the database lookup system and verify the contents and structure of mission kernel configurations in $ISISDATA. However, it has been generalized to use for any directory structure. Here is the application documentation:
+
+`isisdata_mockup.py -h`
+
+```
+usage: isisdata_mockup.py [-h] --isisdata ISISDATA --outpath OUTPATH [--ghostdir GHOSTDIR]
+                          [--saveconfig] [--dryrun] [--verbose]
+
+Convert ISISDATA directory to test format
+
+optional arguments:
+  -h, --help           show this help message and exit
+  --isisdata ISISDATA  ISISDATA directory root
+  --outpath OUTPATH    NEW ISISDATA directory to create
+  --ghostdir GHOSTDIR  Replaces the --isisdata path with this string to ghost the actual input
+                       directory path
+  --saveconfig, -s     Retain *.db, *.conf files rather than replace with processs info
+  --dryrun, -n         Only print actions but do not execute
+  --verbose, -v        Verbose output
+
+isisdata_mockup.py will create a copy of all the files found in the directory specified by
+the --isisdata parameter. All files and directories contained in --isisdata will
+be copied to the --outpath destination, which specifies a new directory. This
+directory will be created if it does not exist.
+
+All *.db and *.conf files are copied as is, fully intact. Also needed to use this
+mock up of ISISDATA is the NAIF LSK. This LSK kernel is always loaded by the iTime
+class to concert UTC and Et times. Otherwise, all other files encountered will
+be created but the contents are replaced by information regarding the --isisdata
+source file. This information includes the original file opath, creation and
+modification dates in UTC format, the size of the file and its hash values.
+
+This app sets up a full data directory structure that mimics the contents of
+ISISDATA (or any directory for that matter). The size of the file, its creation
+and last modification dates and the md5, sha1 and sha256 hash values are created
+in a dict which is then written to the new output file if its not a special ISIS
+kernel db/conf file or LSK.
+
+Finally, by setting --ghostdir '$ISISDATA', this now provides a connection to
+the source file in the ISISDATA directory. This can be used to compare hash values
+compute by other sources.
+
+Example:
+
+To provide a full mock up of ISISDATA directory:
+
+isisdata_mockup.py --saveconfig --isisdata /opt/isis/data --outpath $PWD/mockisisdata --ghostdir '$ISISDATA'
+
+Author: Kris J. Becker, University of Arizona
+        kbecker@orex.lpl.arizona.edu
+
+History 2023-03-15 Kris Becker - Original verison
+```
+
+You can also choose to process only a single directory, as shown in the following example:
+
+```
+isisdata_mockup.py --saveconfig --isisdata /opt/isis/data/voyager1  --outpath $PWD/mockisisdata/voyager1 --ghostdir '$ISISDATA/voyager1'
+```
+Processing times can be significant since this script is computing 3 different hash values per file.
+
+
+# <a name="#isisdatamockupinstall">ISISDATA Mockup Test Data Preparation</a>
+
+With this tool and the files listed in `isisdataeval_isisdata_mockup_files.lis`, the test for isisdataeval can be recreated from any ISISDATA installation. Note that from time to time, the files used in this ISISDATA test could change which would cause failures. Here are the commands to create the `isisdataeval` test ISISDATA mockup directory - from the Git install directory:
+
+```
+# Create the test data area for isisdata
+cd ISIS3/isis/test/isisdata
+mkdir -p mockup mockprocessing
+
+# Produce the mockup data. Its assumed isisdata_mockup.py is in a runtime path.
+isisdata_mockup.py --saveconfig --isisdata $ISISDATA/base     --outpath mockprocessing/isisdatamockup/base     --ghostdir '$ISISDATA/base'
+isisdata_mockup.py --saveconfig --isisdata $ISISDATA/hayabusa --outpath mockprocessing/isisdatamockup/hayabusa --ghostdir '$ISISDATA/hayabusa'
+isisdata_mockup.py --saveconfig --isisdata $ISISDATA/smart1   --outpath mockprocessing/isisdatamockup/smart1   --ghostdir '$ISISDATA/smart1'
+isisdata_mockup.py --saveconfig --isisdata $ISISDATA/voyager1 --outpath mockprocessing/isisdatamockup/voyager1 --ghostdir '$ISISDATA/voyager1'
+
+# Copy/install the desired files for the test
+rsync -av --files-from=isisdataeval_isisdata_mockup_files.lis mockprocessing/isisdatamockup/  mockup/
+/bin/rm -rf mockprocessing
+
+# Run an inventory test for the mockup
+isisdataeval isisdata=mockup datadir=mockup toinventory=isisdata_mockup_inventory.csv toissues=isisdata_mockup_issues.csv toerrors=isisdata_mockup_errors.csv hash=md5
+
+```
+
+
+# <a name="#isisdatamockuptests">Running ISISDATA Mockup Tests</a>
+Once the test data is installed, the contents ./ISIS3/isis/tests/data/isisisdata/mockup will contain the test data created above. To explicitly run the `isisdataeval` tests, use `ctest -R IsisData`. If an error occurs, rerun with the command `ctest --rerun-failed --output-on-failure` to get specific information about which tests failed and why.
+
+Note that during this test, the contents of files with less than 102400 bytes will have all three hash values compute in the tests and compared with the values stored in hash keywords, _md5hash_, _sha1hash_ and _sha256hash_ for an external validation hashing. Note also that the all files $ISISDATA/base/kernels/lsk are retained since Isis::iTime requires an LSK and it always loads one from $ISISDATA/base/lsk/naif????.tls.
+
diff --git a/isis/src/system/apps/isisdataeval/tools/isisdata_mockup.py b/isis/src/system/apps/isisdataeval/tools/isisdata_mockup.py
new file mode 100755
index 0000000000000000000000000000000000000000..ff7018dab04b98b279878deb9d6f864fbba7b535
--- /dev/null
+++ b/isis/src/system/apps/isisdataeval/tools/isisdata_mockup.py
@@ -0,0 +1,319 @@
+#!/usr/bin/env python
+# coding: utf-8
+
+# In[ ]:
+
+
+import time
+import calendar
+import datetime
+
+import math
+import os
+import io
+import pathlib
+import hashlib
+
+import re
+import glob
+import fnmatch
+import shutil
+
+import json
+from collections import OrderedDict
+
+import argparse
+
+
+# In[ ]:
+
+
+def parse_arguments():
+    """
+    Parse command line arguments for the application
+
+    Parameters
+    ----------
+    none
+
+    Returns
+    -------
+    Namespace object
+        This object contains parameters that were gathered from the users
+        command line. It can be converted to dict using vars(args).
+    """
+    full_doc = '''\
+%(prog)s will create a copy of all the files found in the directory specified by
+the --isisdata parameter. All files and directories contained in --isisdata will
+be copied to the --outpath destination, which specifies a new directory. This
+directory will be created if it does not exist.
+
+All *.db and *.conf files are copied as is, fully intact. Also needed to use this
+mock up of ISISDATA is the NAIF LSK. This LSK kernel is always loaded by the iTime
+class to concert UTC and Et times. Otherwise, all other files encountered will
+be created but the contents are replaced by information regarding the --isisdata
+source file. This information includes the original file opath, creation and
+modification dates in UTC format, the size of the file and its hash values.
+
+This app sets up a full data directory structure that mimics the contents of
+ISISDATA (or any directory for that matter). The size of the file, its creation
+and last modification dates and the md5, sha1 and sha256 hash values are created
+in a dict which is then written to the new output file if its not a special ISIS
+kernel db/conf file or LSK.
+
+Finally, by setting --ghostdir '$ISISDATA', this now provides a connection to
+the source file in the ISISDATA directory. This can be used to compare hash values
+compute by other sources.
+
+Example:
+
+To provide a full mock up of ISISDATA directory:
+
+%(prog)s --saveconfig --isisdata /opt/isis4/data --outpath $PWD/mockisisdata --ghostdir '$ISISDATA'
+
+
+Author: Kris J. Becker, University of Arizona
+        kbecker@orex.lpl.arizona.edu
+
+History 2023-03-15 Kris Becker - Original verison
+    '''
+    # Set to None for notebook mode or True for applicaton
+    is_app = True
+
+    if is_app is True:
+        parser = argparse.ArgumentParser(description="Convert ISISDATA directory to test format",
+                                         add_help=True,
+                                         formatter_class=argparse.RawDescriptionHelpFormatter,
+                                         epilog=full_doc)
+
+        parser.add_argument('--isisdata', help="ISISDATA directory root",
+                            required=True, action='store', default=None)
+        parser.add_argument('--outpath', help="NEW ISISDATA directory to create",
+                            required=True, action='store', default=None)
+        parser.add_argument('--ghostdir',
+                            help="Replaces the --isisdata path with this string to ghost the actual input directory path ($ISISDATA is highly recommended)",
+                            required=False, action='store', default=None)
+        parser.add_argument('--saveconfig','-s',
+                            help='Retain *.db, *.conf files rather than replace with processs inf (for isisdataeval testing)',
+                            action='store_true')
+
+        parser.add_argument('--dryrun','-n',help='Only print actions but do not execute', action='store_true')
+        parser.add_argument('--verbose','-v',help='Verbose output', action='store_true')
+        args = parser.parse_args()
+
+    else:
+        # This is ran when ( is_app is None )
+        isisdata   = '/opt/isis/data/base/dems'
+        outpath    = '/tmp/MOCKISISDATA/base/dems'
+        ghostdir   = '$ISISDATA/base/dems'
+        saveconfig = True
+        dryrun     = True
+        verbose    = True
+
+        args = argparse.Namespace(isisdata=isisdata, outpath=outpath, ghostdir=ghostdir,
+                                  saveconfig=saveconfig, dryrun=dryrun, verbose=verbose)
+
+    return args
+
+
+
+# In[ ]:
+
+
+def compute_hash( filepath, method='md5', dryrun=False, verbose=False, **kwargs):
+    """
+    Compute md5, sha1 or sha256 hashes from a file
+
+    Parameters
+    ----------
+    filepath : string
+        Source file to conpute hash values for
+
+    method : string
+        Specifies the hash algorithm to apply:
+        md5, sha1 or sha256
+
+
+    Returns
+    -------
+    string
+        Returns the hex value of the compute hash for the file
+    """
+    if 'sha256' in method:
+        hasher = hashlib.sha256()
+    elif 'sha1' in method:
+        hasher = hashlib.sha1()
+    else:
+        hasher = hashlib.md5()
+
+    with open( filepath, "rb" ) as fb:
+        for data in iter( lambda: fb.read(4096), b""):
+            hasher.update( data )
+
+    return hasher.hexdigest()
+
+
+
+# In[ ]:
+
+
+def preserve_file_contents( filepath, **kwargs ):
+    """
+    Determine if the file content should be preserved. This particular
+    implemenatation satisfies requirements for mocking the ISISDATA
+    directly to be used for testing of isisdataeval.
+
+    This function preserves all files that end with a .db suffix. These
+    are ISIS kernel databases.
+
+    Files that have a .conf suffix are also ISIS kernel config file.
+    However, MRO/HiRISE calibration application uses files that end with
+    the .conf suffix.
+
+    And the $base/kernels/lsk LSK kernels are preserved. This is because
+    isisdataeval uses the ISIS iTime class to convert UTC times to ephemeris
+    times and vice versa.
+
+    All other file types are not preserved.
+
+    Parameters
+    ----------
+    filepath : Path object
+        Source file to check for perservation
+
+    kwargs : args
+        Additional parameters
+
+
+    Returns
+    -------
+    bool
+        Returns True if the conditions to preserve the contents is met.
+        Otherwise, returns False.
+    """
+
+    if filepath.suffix == '.db': return True
+    if filepath.suffix == '.conf':
+        if 'kernels' in filepath.as_posix(): return True
+
+    if 'base/kernels/lsk/naif00' in filepath.as_posix(): return True
+
+    # All other cases
+    return False
+
+
+# In[ ]:
+
+
+def main():
+    """
+    Read ISISDATA contents and create a new directory structure
+    that maps the files but replaces contents with file information
+    for testing purposes. Files that end with ".db" or ".conf" file
+    suffixes are copied as is. All other files are replaced with
+    data file info.
+
+    Parameters
+    ----------
+    See parse_arguments()
+
+    Returns
+    -------
+    None
+    """
+
+    #  Get the application parameters as provided by user
+    args = parse_arguments()
+    kwargs = vars(args)
+
+    # Consolidate some parameters
+    verbose  = args.verbose
+    dryrun   = args.dryrun
+    report   = verbose or dryrun
+
+    isisdatadir = args.isisdata
+    ghostdir    = args.ghostdir
+    outpath     = args.outpath
+    saveconfig  = args.saveconfig
+
+    allfiles = sorted( pathlib.Path( isisdatadir ).glob('**/*') )
+    if report: print("\nTotalFilesDirsFound: ", len(allfiles) )
+
+    missing = [ ]
+
+    for fpath in allfiles:
+        if report:  print("\n*** Processing: ", fpath.as_posix() )
+        isisdatapos = fpath.as_posix().find( isisdatadir )
+
+        # Ghost the input dir if requested
+        if ghostdir is not None:
+            isisfile = fpath.as_posix().replace( isisdatadir, ghostdir, 1 )
+        else:
+            isisfile = fpath.as_posix()
+
+        if  isisdatapos != 0:
+            if report: print("FileNotInIsisDataIgnored: ", fpath.as_posix() )
+            missing.append( fpath.as_posix() )
+        else:
+
+            jsondata = OrderedDict()
+            jsondata["source"] = isisfile
+
+            newisisdata = pathlib.Path( fpath.as_posix().replace( isisdatadir, outpath, 1 ) )
+            # jsondata['source'] = newisisdata.as_posix()
+
+            if fpath.is_dir():
+                if not dryrun: newisisdata.mkdir( parents=True )
+
+            else:   # its a real file
+                outdir = pathlib.Path( newisisdata.parent )
+                finfo = fpath.stat()
+
+                create_ts   = os.path.getctime( fpath.as_posix() )
+                modified_ts = finfo.st_mtime
+
+                # This is actually needed on some systems
+                if modified_ts < create_ts:
+                    create_ts, modified_ts = modified_ts, create_ts
+
+                # This one does not work on Linux systems (gotta be root to get the correct datetime!)
+                #createtime   = datetime.datetime.fromtimestamp( finfo.st_birthtime, tz=datetime.timezone.utc ).strftime('%Y-%m-%dT%H:%M:%S.%f')
+                createtime   = datetime.datetime.fromtimestamp( create_ts,   tz=datetime.timezone.utc ).strftime('%Y-%m-%dT%H:%M:%S.%f')
+                modifiedtime = datetime.datetime.fromtimestamp( modified_ts, tz=datetime.timezone.utc ).strftime('%Y-%m-%dT%H:%M:%S.%f')
+
+                #  Compute the file hashes
+                md5hash    = compute_hash( fpath.as_posix(), method='md5',    **kwargs)
+                sha256hash = compute_hash( fpath.as_posix(), method='sha256', **kwargs)
+                sha1hash   = compute_hash( fpath.as_posix(), method='sha1',   **kwargs)
+
+                # The rest of the data for this file
+                jsondata["filesize"]     = finfo.st_size
+                jsondata["createtime"]   = createtime
+                jsondata["modifiedtime"] = modifiedtime
+                jsondata["md5hash"]      = md5hash
+                jsondata["sha256hash"]   = sha256hash
+                jsondata["sha1hash"]     = sha1hash
+
+                if report:
+                    print( json.dumps( jsondata, indent=4 ) )
+
+                if not outdir.exists():
+                    if report: print("CreatingDir:    ", outdir.as_posix() )
+                    if not dryrun: outdir.mkdir(parents=True)
+
+                # There are also *.conf in $ISISDATA/mro/calibration so must exclude copying of those files
+                # isisdataeval requires that the LSK be valid (for time conversions) so preserve those kernels
+                if saveconfig and preserve_file_contents( fpath, **kwargs):
+                    if report: print("CopyTo:         ", newisisdata.as_posix() )
+                    if not dryrun: shutil.copy( fpath.as_posix(), newisisdata.as_posix() )
+                else:
+                    if report: print("WriteDataTo:    ", newisisdata.as_posix() )
+                    if not dryrun: newisisdata.write_text( json.dumps( jsondata, indent=4 ) )
+
+
+# In[ ]:
+
+
+# Do it!
+if __name__ == '__main__':
+    main()
diff --git a/isis/tests/FunctionalTestsIsisDataEval.cpp b/isis/tests/FunctionalTestsIsisDataEval.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..aef908a6812be0ae715139fb80ab70529fb6399d
--- /dev/null
+++ b/isis/tests/FunctionalTestsIsisDataEval.cpp
@@ -0,0 +1,260 @@
+#include <cmath>
+#include <algorithm>
+
+#include "QTemporaryDir"
+#include "IsisDataFixtures.h"
+
+
+#include "IsisDataModel.h"
+#include "isisdataeval.h"
+#include "CSVReader.h"
+
+#include "TempFixtures.h"
+#include "TestUtilities.h"
+#include "gtest/gtest.h"
+
+using namespace Isis;
+
+inline CSVReader load_isisdata_csv( const QString &csvfile ) {
+  const bool hasHeader = true;
+  return ( CSVReader( csvfile, hasHeader ) );
+}
+
+inline QStringList row_from_csv( const CSVReader::CSVAxis &row  ) {
+  QStringList rdata;
+  for ( int i = 0 ; i < row.dim1() ; i++ ) {
+    rdata.append( row[i].simplified() );
+  }
+
+  return ( rdata );
+}
+
+inline QStringList get_row( const CSVReader::CSVTable &table, const int rindex = 0 ) {
+  return ( row_from_csv( table[rindex] ) );
+}
+
+inline QStringList get_header( const CSVReader &csv  ) {
+  return ( row_from_csv( csv.getHeader() ) );
+}
+
+static QString APP_XML = FileName("$ISISROOT/bin/xml/isisdataeval.xml").expanded();
+
+TEST_F( IsisDataInventory, ConfirmIsisDataInventory ) {
+  Pvl appLog;
+  const QString isisinventoryfile = tempDir.path() + "/isisdata_inventory.csv";
+  const QString isiserrorsfile    = tempDir.path() + "/isisdata_errors.csv";
+  const QString isisissuesfile    = tempDir.path() + "/isisdata_issues.csv";
+
+  QVector<QString> args = {"isisdata=" + isisdatadir(),
+                           "datadir="  + isisdatadir(),
+                           "verify=true",
+                           "toinventory=" + isisinventoryfile,
+                           "toissues=" + isisissuesfile,
+                           "toerrors=" + isiserrorsfile };
+
+  UserInterface options(APP_XML, args);
+  try {
+    isisdataeval(options, &appLog);
+  }
+  catch (IException &e) {
+    FAIL() << "Unable to process ISISDATA directory:  " << isisdatadir().toStdString()  << std::endl;
+  }
+
+  // Get Results group from output
+  const PvlGroup &results = appLog.findGroup( "Results" );
+  EXPECT_EQ( (int) results["TotalDataFiles"],      this->size() );
+  EXPECT_EQ( (int) results["EmptyKernelDBs"],      1 );
+  EXPECT_EQ( (int) results["MissingKernelDBs"],    4 );
+  EXPECT_EQ( (int) results["ExternalKernelFiles"], 3 );
+  EXPECT_EQ( (int) results["SymlinkKernelFiles"],  0 );
+  EXPECT_EQ( (int) results["TotalDBConfigFiles"],  1 );
+  EXPECT_EQ( (int) results["TotalKernelDBFiles"],  27 );
+  EXPECT_EQ( (int) results["TotalDirectories"],    43 );
+  EXPECT_EQ( (int) results["TotalDataFiles"],      176 );
+  EXPECT_EQ( (int) results["TotalInstallSize"],    118961);
+
+  // Load the inventory file
+  CSVReader  csv_inventory = load_isisdata_csv( isisinventoryfile );
+  EXPECT_EQ( csv_inventory.rows() , this->size() );
+
+  int n_issues = (int) results["EmptyKernelDBs"] +
+                 (int) results["MissingKernelDBs"] +
+                 (int) results["ExternalKernelFiles"] +
+                 (int) results["SymlinkKernelFiles"];
+
+  FileName issues( isisissuesfile );
+  if ( issues.fileExists() ) {
+    CSVReader  csv_issues = load_isisdata_csv( isisissuesfile );
+    EXPECT_EQ( csv_issues.rows() ,n_issues );
+
+
+    // Now loop to determine if isisdataeval correctly identified the issues
+    int n_empty_found     = 0;
+    int n_missing_found   = 0;
+    int n_external_found  = 0;
+    int n_symlinks_found  = 0;
+    int n_errors_found    = 0;
+    int n_undefined_found = 0;
+
+    QStringList issues_header = get_header ( csv_issues );
+    int         status_t      = issues_header.indexOf( "status" );
+    int         filespec_t    = issues_header.indexOf( "filespec" );
+
+    int error_n = csv_issues.rows();
+    for ( int i = 0 ; i < error_n ; i++ ) {
+
+      QStringList rowdata = get_row( csv_issues.getTable(), i );
+
+      const QString status      = rowdata[status_t];
+      QString isisdata_filename = rowdata[filespec_t];
+
+      FileName  fnFile( isisdata_filename );
+      // if ( fnFile.isVersioned() ) fnFile.highestVersion();
+      QFileInfo qfFile( fnFile.expanded() );
+
+      if ( "empty" == status ) {
+        n_empty_found++;
+        EXPECT_EQ ( (int) qfFile.size(), 0 );
+      }
+      else if ( "missing" == status ) {
+        n_missing_found++;
+        EXPECT_EQ( fnFile.fileExists(), false );
+      }
+      else if ( "external" == status ) {
+        n_external_found++;
+      }
+      else if ( "symlink" == status ) {
+        n_symlinks_found++;
+      }
+      else if ( "error" == status ) {
+        n_errors_found++;
+      }
+      else {
+        n_undefined_found++;
+      }
+
+    }
+
+    // Test for contents being consistent with reported status
+    EXPECT_EQ( (int) results["EmptyKernelDBs"],      n_empty_found);
+    EXPECT_EQ( (int) results["MissingKernelDBs"],    n_missing_found);
+    EXPECT_EQ( (int) results["ExternalKernelFiles"], n_external_found);
+    EXPECT_EQ( (int) results["SymlinkKernelFiles"],  n_symlinks_found);
+    EXPECT_EQ( (int) results["ErrorKernelFiles"],    n_errors_found);
+    EXPECT_EQ( n_undefined_found,   0);
+  }
+
+  // There are no errors for this case
+  FileName errors( isiserrorsfile );
+  EXPECT_EQ( errors.fileExists() , true );
+  if ( errors.fileExists() ) {
+    CSVReader  csv_errors = load_isisdata_csv( isiserrorsfile );
+    EXPECT_EQ( csv_errors.rows() ,  (int) results["ErrorInInventory"]);
+  }
+
+  // Process the ISISDATA inventory
+  int nrows              = std::min( (int) csv_inventory.rows(), (int) this->size() );
+  QStringList inv_header = get_header (csv_inventory );
+  int target_t           = inv_header.indexOf( "target" );
+
+  for ( int i = 0 ; i < nrows ; i++ ) {
+    QStringList rowdata = get_row( csv_inventory.getTable(), i );
+    QString isisdata_filename  = rowdata[target_t];
+    isisdata_filename.replace( isisdata_path() , "." );
+
+    EXPECT_EQ( inventory().contains( isisdata_filename ), true );
+  }
+}
+
+TEST_F( IsisDataInventory, CompareHashDataInIsisDataInventory ) {
+
+  const size_t MaxFileHashSize = 100 * 1024;
+
+  Pvl appLog;
+  QVector<QString> args = {"isisdata=" + isisdatadir(),
+                           "datadir="  + isisdatadir(),
+                           "verify=true" };
+
+  UserInterface options(APP_XML, args);
+  try {
+    isisdataeval(options, &appLog);
+  }
+  catch (IException &e) {
+    FAIL() << "Unable to process ISISDATA directory:  " << isisdatadir().toStdString()  << std::endl;
+  }
+
+  int n_md5_compared    = 0;
+  int n_sha1_compared   = 0;
+  int n_sha256_compared = 0;
+
+  // Gota do it this way if its NOT the only test run to find the real ISISDATA
+  PvlGroup &dataDir = Preference::Preferences(true).findGroup("DataDirectory");
+  if ( dataDir.hasKeyword( "ISISDATA") ) dataDir.deleteKeyword( "ISISDATA" );
+
+  IsisDataInventoryMap::const_iterator fileinfo = inventory().begin();
+  while ( fileinfo != inventory().end() ) {
+
+    if ( fileinfo.value().info().exists() ) {
+
+      const json_t &jdata = fileinfo.value().data();
+      QString source = QString::fromStdString( jdata["source"] );
+
+      // Not all of these files will exist in the currently available ISISDATA
+      // To save time only get the smaller ones as set above!
+      Data::DBFileStatus real_isis_file_info( source );
+      if ( real_isis_file_info.exists() && ( real_isis_file_info.size() < MaxFileHashSize ) ) {
+
+        int filesize = jdata["filesize"];
+        EXPECT_EQ( filesize, real_isis_file_info.size() );
+
+        if ( jdata.contains( "md5hash" ) ) {
+          QString md5hash = real_isis_file_info.hash( QCryptographicHash::Md5 ).toHex();
+          EXPECT_EQ( jdata["md5hash"], md5hash.toStdString() );
+          n_md5_compared++;
+        }
+
+        if ( jdata.contains( "sha1hash" ) ) {
+          QString sha1hash = real_isis_file_info.hash( QCryptographicHash::Sha1 ).toHex();
+          EXPECT_EQ( jdata["sha1hash"], sha1hash.toStdString() );
+          n_sha1_compared++;
+
+        }
+
+        if ( jdata.contains( "sha256hash" ) ) {
+          QString sha256hash = real_isis_file_info.hash( QCryptographicHash::Sha256 ).toHex();
+          EXPECT_EQ( jdata["sha256hash"], sha256hash.toStdString() );
+          n_sha256_compared++;
+        }
+      }
+
+    }
+
+    // Next inventory file
+    ++fileinfo;
+  }
+
+  EXPECT_NE( n_md5_compared,    0);
+  EXPECT_NE( n_sha1_compared,   0);
+  EXPECT_NE( n_sha256_compared, 0);
+}
+
+TEST_F( IsisDataInventory, IsisDataEvalBadIsisDataDir ) {
+   Pvl appLog;
+   QString bad_isisdata_path = tempDir.path() + "/DirDoesNotExist";
+   QVector<QString> args = {"isisdata=" + bad_isisdata_path,
+                            "datadir="  + bad_isisdata_path };
+
+   UserInterface options(APP_XML, args);
+
+   // TEST: Bad ISISDATA directory
+   try {
+     isisdataeval(options, &appLog);
+     FAIL() << "Fails when ISISDATA/DATADIR do not exist!" <<std::endl;
+   }
+   catch (IException &e ) {
+     EXPECT_THAT(e.what(), testing::HasSubstr(" is not a directory!"));
+   }
+   catch ( ... ) {
+     FAIL() << "Expected error: ... isisdata directory not found!";
+   }
+}
\ No newline at end of file
diff --git a/isis/tests/IsisDataFixtures.cpp b/isis/tests/IsisDataFixtures.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..187105e4b34b668ecf783a8ba4a449ec13b6e7f0
--- /dev/null
+++ b/isis/tests/IsisDataFixtures.cpp
@@ -0,0 +1,106 @@
+#include "IsisDataFixtures.h"
+
+#include <iostream>
+#include <fstream>
+
+#include <Qt>
+#include <QDateTime>
+#include <QStringList>
+#include <QDir>
+#include <QDirIterator>
+#include <QFile>
+#include <QFileInfo>
+
+namespace Isis {
+
+  QString IsisDataInventory::system_isisdata() const {
+    return ( m_system_isisdata.expanded() );
+  }
+
+  QString IsisDataInventory::isisdatadir() const {
+    return ( m_isisdatadir.expanded() );
+  }
+
+  QString IsisDataInventory::isisdata_path() const {
+    QFileInfo isisdir( isisdatadir() );
+    return ( isisdir.absoluteFilePath()  );
+  }
+
+  size_t IsisDataInventory::size() const {
+    return ( inventory().size() );
+  }
+
+  QString IsisDataInventory::scrub_path_prefix( const QString &fname,
+                                                const QString &path_prefix )
+                                                const {
+    QString t_dbfile = fname;
+    t_dbfile.replace( isisdatadir(), path_prefix );
+    return ( t_dbfile );
+  }
+
+  json_t IsisDataInventory::get_real_file_info( const QString &fname ) const {
+
+    FileName v_fname = FileName( fname );
+    QFileInfo qinfo( fname );
+    json_t file_json;
+    try {
+      std::ifstream inputstream ( v_fname.expanded().toStdString() );
+      file_json = json_t::parse ( inputstream );
+    }
+    catch ( ... ) {
+      file_json["source"]   = fname.toStdString();
+      file_json["filesize"] = qinfo.size();
+      file_json["exists"]   = v_fname.fileExists();
+
+      if ( v_fname.fileExists() ) {
+        file_json["createtime"]   = qinfo.birthTime().toString( Qt::ISODateWithMs ).toStdString();
+        file_json["modifiedtime"] = qinfo.lastModified().toString( Qt::ISODateWithMs ).toStdString();
+      }
+    }
+
+    return ( file_json );
+  }
+
+  void IsisDataInventory::SetUp() {
+    TempTestingFiles::SetUp();
+
+    m_system_isisdata = FileName( "$ISISDATA" ).expanded();
+    m_isisdatadir     = FileName( "data/isisdata/mockup" );
+    m_isisdata_inventory.clear();
+
+    QDirIterator ddir( isisdatadir(),
+                       QDir::NoDotAndDotDot | QDir::Dirs | QDir::AllDirs | QDir::Files | QDir::System,
+                       QDirIterator::Subdirectories | QDirIterator::FollowSymlinks );
+
+    while ( ddir.hasNext() ) {
+
+      // Collect the data
+      QString   ddfile   = ddir.next();
+      QString   v_name   = scrub_path_prefix( ddfile );
+      QFileInfo f_ddfile = ddir.fileInfo();
+      if ( !f_ddfile.isDir() ) {
+        json_t j_data   = get_real_file_info( f_ddfile.absoluteFilePath() );
+
+        // Add to inventory
+        m_isisdata_inventory.insert( v_name, IsisDataInventoryFile( v_name, f_ddfile, j_data ) );
+      }
+      else {
+        QDir dirinfo( ddfile );
+        json_t j_data;
+        j_data["source"] = v_name.toStdString();
+        j_data["files"] =  dirinfo.count();
+
+        // Add to directory inventory
+        m_isisdata_directories.insert( v_name,  IsisDataInventoryFile( v_name, f_ddfile, j_data ) );
+      }
+    }
+  }
+
+  void IsisDataInventory::TearDown() {
+    m_system_isisdata = m_isisdatadir = FileName();
+    m_isisdata_inventory.clear();
+    m_isisdata_directories.clear();
+  }
+
+
+}
\ No newline at end of file
diff --git a/isis/tests/IsisDataFixtures.h b/isis/tests/IsisDataFixtures.h
new file mode 100644
index 0000000000000000000000000000000000000000..bb529cd1c0aa91d04b790f786f0e2bdcf9a3f6f9
--- /dev/null
+++ b/isis/tests/IsisDataFixtures.h
@@ -0,0 +1,102 @@
+#ifndef IsisDataFixtures_h
+#define IsisDataFixtures_h
+
+#include <map>
+#include <string>
+
+#include <QString>
+#include <QMap>
+
+#include "FileName.h"
+#include "TempFixtures.h"
+
+#include <nlohmann/json.hpp>
+using json_t = nlohmann::ordered_json;
+
+
+namespace Isis {
+/**
+ * @brief Provides a simulated ISISDATA directory tree
+ *
+ */
+  class IsisDataInventory : public TempTestingFiles {
+    private:
+      class IsisDataInventoryFile {
+        public:
+          IsisDataInventoryFile( const QString &fname, const QFileInfo &finfo,
+                            const json_t &jsondata = json_t::object() ) {
+            m_filename = fname;
+            m_fileinfo = finfo;
+            m_jsondata = jsondata;
+          }
+          ~IsisDataInventoryFile( ) { }
+
+          inline const QString &name() const {
+            return ( m_filename );
+          }
+
+          inline const QFileInfo &info() const {
+            return ( m_fileinfo );
+          }
+
+          inline const json_t &data() const {
+            return ( m_jsondata );
+          }
+
+          inline bool contains( const QString &key ) const {
+            return ( m_jsondata.contains( key.toStdString() ) );
+          }
+
+          inline size_t size() const {
+            return ( info().size() );
+          }
+
+          inline bool compare( const IsisDataInventoryFile &q1,
+                               const IsisDataInventoryFile &q2 ) const {
+            return ( q1.m_filename  < q2.m_filename );
+          }
+
+        protected:
+          QString    m_filename;
+          QFileInfo  m_fileinfo;
+          json_t     m_jsondata;
+      };
+
+    protected:
+      typedef QMap<QString, IsisDataInventoryFile>  IsisDataInventoryMap;
+      typedef QMap<QString, IsisDataInventoryFile>  IsisDataDirectoryMap;
+
+      QString system_isisdata() const;
+      QString isisdatadir() const;
+      QString isisdata_path() const;
+
+      inline const IsisDataInventoryMap &inventory() const {
+        return ( m_isisdata_inventory );
+      }
+
+      inline const IsisDataDirectoryMap &directories() const {
+        return ( m_isisdata_directories );
+      }
+
+      size_t  size() const;
+
+      QString scrub_path_prefix( const QString &fname,
+                                 const QString &path_prefix = ".") const;
+
+      void SetUp() override;
+      void TearDown() override;
+
+    private:
+      // Data from ISISDATA simulated file setup
+      FileName              m_system_isisdata;
+      FileName              m_isisdatadir;
+      IsisDataInventoryMap  m_isisdata_inventory;
+      IsisDataDirectoryMap  m_isisdata_directories;
+
+      json_t get_real_file_info( const QString &fname ) const;
+
+  };
+
+} // namespace Isis
+
+#endif
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/isisdataeval_isisdata_mockup_files.lis b/isis/tests/data/isisdata/isisdataeval_isisdata_mockup_files.lis
new file mode 100644
index 0000000000000000000000000000000000000000..868dac929b0106bf98e0b7140543052ed09c18bb
--- /dev/null
+++ b/isis/tests/data/isisdata/isisdataeval_isisdata_mockup_files.lis
@@ -0,0 +1,176 @@
+hayabusa/kernels/spk/hayabusa_20051116_20051118_v01.bsp
+hayabusa/kernels/spk/hayabusa_20051114_20051116_v01.bsp
+hayabusa/kernels/spk/amica_kernels.0001.db
+hayabusa/kernels/spk/kernels.0002.db
+hayabusa/kernels/spk/hayabusa_20051109_20051109_v01.bsp
+hayabusa/kernels/spk/itokawa_1989-2010.bsp
+hayabusa/kernels/spk/hayabusa_20051115_20051117_v01.bsp
+hayabusa/kernels/spk/hayabusa_20051108_20051109_v01.bsp
+hayabusa/kernels/spk/hayabusa_20051117_20051119_v01.bsp
+hayabusa/kernels/spk/hay_osbj_050911_051118_v1n.bsp
+hayabusa/kernels/spk/hayabusa_itokawarendezvous_v01.bsp
+hayabusa/kernels/spk/hay_jaxa_050916_051119_v1n.bsp
+hayabusa/kernels/spk/kernels.0001.conf
+hayabusa/kernels/spk/hayabusa_20051111_20051112_v01.bsp
+hayabusa/kernels/spk/hayabusa_20051112_20051114_v01.bsp
+hayabusa/kernels/spk/kernels.0001.db
+hayabusa/kernels/spk/hayabusa_20051110_20051112_v01.bsp
+hayabusa/kernels/fk/itokawa_fixed.tf
+hayabusa/kernels/fk/hayabusa_hp.tf
+hayabusa/kernels/fk/kernels.0001.db
+hayabusa/kernels/lsk/kernels.0001.db
+hayabusa/kernels/lsk/naif0009.tls
+hayabusa/kernels/sclk/hayabusa.tsc
+hayabusa/kernels/sclk/kernels.0001.db
+hayabusa/kernels/iak/amicaAddendum002.ti
+hayabusa/kernels/iak/kernels.0002.db
+hayabusa/kernels/iak/nirsAddendum001.ti
+hayabusa/kernels/iak/nirsAddendum002.ti
+hayabusa/kernels/iak/kernels.0001.db
+hayabusa/kernels/iak/amicaAddendum001.ti
+hayabusa/kernels/pck/itokawa_gaskell.tpc
+hayabusa/kernels/pck/pck00008.tpc
+hayabusa/kernels/pck/kernels.0001.db
+hayabusa/kernels/pck/itokawa_aizu504.tpc
+hayabusa/kernels/pck/itokawa_gaskell_n3.tpc
+hayabusa/kernels/tspk/kernels.0002.db
+hayabusa/kernels/tspk/sb_25143_140.bsp
+hayabusa/kernels/tspk/de403s.bsp
+hayabusa/kernels/tspk/kernels.0001.db
+hayabusa/kernels/ik/kernels.0002.db
+hayabusa/kernels/ik/xrs10.ti
+hayabusa/kernels/ik/amica31.ti
+hayabusa/kernels/ik/nirs10.ti
+hayabusa/kernels/ik/kernels.0001.db
+hayabusa/kernels/ik/lidar10.ti
+hayabusa/kernels/ck/hayabusa_itokawarendezvous_v01.bc
+hayabusa/kernels/ck/kernels.0001.db
+hayabusa/kernels/ck/hayabusa_itokawarendezvous_v02n.bc
+hayabusa/kernels/dsk/hay_a_amica_5_itokawashape_v1_0_512q.bds
+hayabusa/calibration/flatfield/flat_p.cub
+hayabusa/calibration/flatfield/flat_v.cub
+hayabusa/calibration/flatfield/flat_ul.cub
+hayabusa/calibration/amica/amicaCalibration0006.trn
+voyager1/kernels/spk/vgr1_jup230.bsp
+voyager1/kernels/spk/kernels.0002.db
+voyager1/kernels/spk/voyager_2.ST+1992_m05208u.merged.bsp
+voyager1/kernels/spk/vgr1_sat337.bsp
+voyager1/kernels/spk/voyager_1.ST+1991_a54418u.merged.bsp
+voyager1/kernels/spk/vgr1_sat336.bsp
+voyager1/kernels/spk/vg1_sat.bsp
+voyager1/kernels/spk/vg1_jup.bsp
+voyager1/kernels/spk/kernels.0001.db
+voyager1/kernels/aareadme.txt
+voyager1/kernels/fk/vg1_v02.tf
+voyager1/kernels/fk/kernels.0001.db
+voyager1/kernels/fk/vg2_v02.tf
+voyager1/kernels/lsk/aareadme.txt
+voyager1/kernels/sclk/vg100008.tsc
+voyager1/kernels/sclk/vg100043.tsc
+voyager1/kernels/sclk/vg100010.tsc
+voyager1/kernels/sclk/kernels.0001.db
+voyager1/kernels/iak/voyagerAddendum004.ti
+voyager1/kernels/iak/voyagerAddendum003.ti
+voyager1/kernels/iak/kernels.0001.db
+voyager1/kernels/pck/aareadme.txt
+voyager1/kernels/pck/pck00010_msgr_v23_europa2020.tpc
+voyager1/kernels/pck/kernels.0001.db
+voyager1/kernels/ik/vg2_issna_v02.ti
+voyager1/kernels/ik/vg2_isswa_v01.ti
+voyager1/kernels/ik/kernels.0001.db
+voyager1/kernels/ik/vg1_isswa_v01.ti
+voyager1/kernels/ik/vg1_issna_v02.ti
+voyager1/kernels/ck/vg1_sat_qmw_wa_fc-31100_t2.bc
+voyager1/kernels/ck/vg1_jup_qmw_na_fc-31100_t2.bc
+voyager1/kernels/ck/kernels.0002.db
+voyager1/kernels/ck/kernels_europa.0002.db
+voyager1/kernels/ck/vgr1_super_v2.bc
+voyager1/kernels/ck/vg1_jup_qmw_wa_fc-31100.bc
+voyager1/kernels/ck/makedb
+voyager1/kernels/ck/vg1_jup_qmw_wa_fc-31100_t2.bc
+voyager1/kernels/ck/vg1_eur_usgs2020.bc
+voyager1/kernels/ck/kernels_europa.0001.db
+voyager1/kernels/ck/vg1_sat_qmw_na_fc-31100_t2.bc
+voyager1/kernels/ck/kernels.0001.db
+voyager1/calibration/WA1ORG.CAL.cub
+voyager1/calibration/WA1OFF.CAL.cub
+voyager1/calibration/voylin.pvl
+voyager1/calibration/WA1CLR.CAL.cub
+voyager1/calibration/voycal.pvl
+voyager1/calibration/WA1BLU.CAL.cub
+voyager1/calibration/voylin.pvl.0001
+voyager1/calibration/WA1VIO.CAL.cub
+voyager1/calibration/WA1GRN.CAL.cub
+base/dems/kernels.0007.db
+base/dems/ldem_128ppd_Mar2011_clon180_radius_pad.cub
+base/dems/kernels.0006.db
+base/dems/vesta_hst_dem_0001.cub
+base/dems/molaMarsPlanetaryRadius0005.cub
+base/dems/DEIMOS_K005_THO_V01.bds
+base/dems/Ceres_Dawn_FC_HAMO_DTM_DLR_Global_60ppd_Oct2016_prep.cub
+base/dems/Vesta_Dawn_HAMO_DTM_DLR_Global_48ppd.cub
+base/dems/MSGR_DEM_USG_EQ_I_V02_prep.cub
+base/dems/kernels.0005.db
+base/kernels/spk/de118.bsp
+base/kernels/spk/jup310.bsp
+base/kernels/spk/de245.bsp
+base/kernels/spk/kernels.0006.db
+base/kernels/spk/aareadme.txt
+base/kernels/spk/ura112.bsp
+base/kernels/spk/ura111.bsp
+base/kernels/spk/de430.bsp
+base/kernels/spk/ura115.bsp
+base/kernels/spk/mar080.bsp
+base/kernels/spk/sat393.bsp
+base/kernels/spk/mar097.bsp
+base/kernels/spk/de405.bsp
+base/kernels/spk/sat425.bsp
+base/kernels/spk/nep081.bsp
+base/kernels/spk/kernels.0005.db
+base/kernels/spk/nep086.bsp
+base/kernels/spk/nep090.bsp
+base/kernels/fk/moon_assoc_pa.tf
+base/kernels/fk/lunarMeanEarth001.tf
+base/kernels/fk/moon_071218.tf
+base/kernels/fk/lunar_060616.tf
+base/kernels/lsk/naif0011.tls
+base/kernels/lsk/naif0012.tls
+base/kernels/lsk/kernels.0001.db
+base/kernels/pck/kernels.0003.db
+base/kernels/pck/kernels.0002.db
+base/kernels/pck/moon_pa_de418_1950-2050.bpc
+base/kernels/pck/pck00008.tpc
+base/kernels/pck/lunar_de403_1950-2199_pa.bpc
+base/kernels/pck/pck00009.tpc
+base/kernels/pck/pck00010_msgr_v23.tpc
+smart1/kernels/spk/SMART1_STRUCT_V01.BSP
+smart1/kernels/spk/ORMS__041111020517_00206.BSP
+smart1/kernels/spk/makedb
+smart1/kernels/spk/kernels.0001.db
+smart1/kernels/spk/ORMS_______________00233.BSP
+smart1/kernels/aareadme.txt
+smart1/kernels/fk/SMART1_V1.TF
+smart1/kernels/fk/SMART1_V12.TF
+smart1/kernels/fk/kernels.0001.db
+smart1/kernels/lsk/NAIF0010.TLS
+smart1/kernels/lsk/aareadme.txt
+smart1/kernels/lsk/NAIF0012.TLS
+smart1/kernels/sclk/aareadme.txt
+smart1/kernels/sclk/SMART1_070227_STEP.TSC
+smart1/kernels/sclk/kernels.0001.db
+smart1/kernels/iak/kernels.0001.db
+smart1/kernels/pck/PCK00010.TPC
+smart1/kernels/pck/PCK00008.TPC
+smart1/kernels/pck/kernels.0001.db
+smart1/kernels/ik/aareadme.txt
+smart1/kernels/ik/SMART1_DCIXS_V03.TI
+smart1/kernels/ik/SMART1_AMIE_V01.TI
+smart1/kernels/ik/SMART1_SIR_V02.TI
+smart1/kernels/ik/kernels.0001.db
+smart1/kernels/ik/SMART1_SPEDE_V02.TI
+smart1/kernels/ik/SMART1_XSM_V02.TI
+smart1/kernels/ck/ATNS_P030929010023_00188.BC
+smart1/kernels/ck/makedb
+smart1/kernels/ck/ATNS_P060301004212_00233.BC
+smart1/kernels/ck/ATNS_P050930150947_00220.BC
+smart1/kernels/ck/kernels.0001.db
diff --git a/isis/tests/data/isisdata/make_isisdata_mockup.sh b/isis/tests/data/isisdata/make_isisdata_mockup.sh
new file mode 100755
index 0000000000000000000000000000000000000000..cf8d616753246811ff53db1ca645ee28bda95efa
--- /dev/null
+++ b/isis/tests/data/isisdata/make_isisdata_mockup.sh
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+# Create the test data area for isisdata
+# cd ISIS3/isis/test/isisdata
+mkdir -p mockup mockprocessing
+
+# Produce the mockup data. Its assumed isisdata_mockup.py is in a runtime path.
+isisdata_mockup.py --saveconfig --isisdata $ISISDATA/base     --outpath mockprocessing/isisdatamockup/base     --ghostdir '$ISISDATA/base'
+isisdata_mockup.py --saveconfig --isisdata $ISISDATA/hayabusa --outpath mockprocessing/isisdatamockup/hayabusa --ghostdir '$ISISDATA/hayabusa'
+isisdata_mockup.py --saveconfig --isisdata $ISISDATA/smart1   --outpath mockprocessing/isisdatamockup/smart1   --ghostdir '$ISISDATA/smart1'
+isisdata_mockup.py --saveconfig --isisdata $ISISDATA/voyager1 --outpath mockprocessing/isisdatamockup/voyager1 --ghostdir '$ISISDATA/voyager1'
+
+# Copy/install the desired files for the test
+rsync -av --files-from=isisdataeval_isisdata_mockup_files.lis mockprocessing/isisdatamockup/ mockup/
+/bin/rm -rf mockprocessing
+
+# Run an inventory test for the mockup
+isisdataeval isisdata=mockup datadir=mockup toinventory=isisdata_mockup_inventory.csv toissues=isisdata_mockup_issues.csv toerrors=isisdata_mockup_errors.csv hash=md5
+
diff --git a/isis/tests/data/isisdata/mockup/base/dems/Ceres_Dawn_FC_HAMO_DTM_DLR_Global_60ppd_Oct2016_prep.cub b/isis/tests/data/isisdata/mockup/base/dems/Ceres_Dawn_FC_HAMO_DTM_DLR_Global_60ppd_Oct2016_prep.cub
new file mode 100644
index 0000000000000000000000000000000000000000..488342abe72fa586dd184a3df487985020b1d47d
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/dems/Ceres_Dawn_FC_HAMO_DTM_DLR_Global_60ppd_Oct2016_prep.cub
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/base/dems/Ceres_Dawn_FC_HAMO_DTM_DLR_Global_60ppd_Oct2016_prep.cub",
+    "filesize": 467404363,
+    "createtime": "2022-08-12T22:10:44.000000",
+    "modifiedtime": "2022-11-24T12:20:56.522490",
+    "md5hash": "e8e8763630d938caf9cfc52b2820f35b",
+    "sha256hash": "b0433aa9b460bda0a2ce7802acf8895ab6216d525095c9e9dc2ad7fe67a07f75",
+    "sha1hash": "1b4d8c0dcf1054470ff00e32598b93b546ace79f"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/base/dems/DEIMOS_K005_THO_V01.bds b/isis/tests/data/isisdata/mockup/base/dems/DEIMOS_K005_THO_V01.bds
new file mode 100644
index 0000000000000000000000000000000000000000..1b28cd41cd4db32369146b8305e783073fc3b32f
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/dems/DEIMOS_K005_THO_V01.bds
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/base/dems/DEIMOS_K005_THO_V01.bds",
+    "filesize": 395264,
+    "createtime": "2022-09-19T06:12:00.000000",
+    "modifiedtime": "2022-11-24T12:18:04.936926",
+    "md5hash": "8e284a502773766527674c3ec78e86d1",
+    "sha256hash": "dbb21955995e91624df355559580309e4038059850bba23c7feada062f3f6371",
+    "sha1hash": "4477caca7e6c79c86aa76b686d2325381d941e7c"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/base/dems/MSGR_DEM_USG_EQ_I_V02_prep.cub b/isis/tests/data/isisdata/mockup/base/dems/MSGR_DEM_USG_EQ_I_V02_prep.cub
new file mode 100644
index 0000000000000000000000000000000000000000..da41a521faf03ec08e7b507bc2f182c51a7d0a9a
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/dems/MSGR_DEM_USG_EQ_I_V02_prep.cub
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/base/dems/MSGR_DEM_USG_EQ_I_V02_prep.cub",
+    "filesize": 531052027,
+    "createtime": "2022-08-12T22:10:56.000000",
+    "modifiedtime": "2022-11-24T12:20:59.444382",
+    "md5hash": "4e9239e4d394e01cf15024bece226879",
+    "sha256hash": "5acbf0f80cba98c3361ec2df28c5cc3037e61a78cb015de2a941ea4504b5e986",
+    "sha1hash": "6b00ed9be186c89116912aeae4719872a1e140ed"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/base/dems/Vesta_Dawn_HAMO_DTM_DLR_Global_48ppd.cub b/isis/tests/data/isisdata/mockup/base/dems/Vesta_Dawn_HAMO_DTM_DLR_Global_48ppd.cub
new file mode 100644
index 0000000000000000000000000000000000000000..0f2ea54d1ba47e3f4c350262f30eb8301f3c701a
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/dems/Vesta_Dawn_HAMO_DTM_DLR_Global_48ppd.cub
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/base/dems/Vesta_Dawn_HAMO_DTM_DLR_Global_48ppd.cub",
+    "filesize": 601826360,
+    "createtime": "2022-08-12T22:11:00.000000",
+    "modifiedtime": "2022-11-24T12:21:21.742130",
+    "md5hash": "a488e544c685ae511ea0ed355a30fdbc",
+    "sha256hash": "93fec79380f101b6a5b9378b4e1b86ee452abf58ba849abfdae1cb040d8ed929",
+    "sha1hash": "ba8bb28f414909c12c1c910a562c16b0af92ac5f"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/base/dems/kernels.0005.db b/isis/tests/data/isisdata/mockup/base/dems/kernels.0005.db
new file mode 100644
index 0000000000000000000000000000000000000000..5b25c42893193315d011800fac63fa06307b2204
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/dems/kernels.0005.db
@@ -0,0 +1,26 @@
+Object = Dem 
+  Group = Selection
+    Match = ("Instrument","TargetName","Mars")
+    File  = ("base", "dems/molaMarsPlanetaryRadius????.cub")
+  EndGroup
+
+  # Changed to use the LOLA DEM instead of ULCN 2011-04-12 SCS
+  Group = Selection
+    Match = ("Instrument","TargetName","Moon")
+    File  = ("base", "dems/ldem_128ppd_Mar2011_clon180_radius_pad.cub")
+  EndGroup
+
+  #  Added Vesta DEM on 2011-06-24
+  # Comment this one out because a new one was being added
+  #Group = Selection
+  #  Match = ("Instrument","TargetName","Vesta")
+  #  File  = ("base", "dems/vesta_hst_dem_????.cub")
+  #EndGroup
+
+  # New Vesta DEM on 2016-09-23 (Stuart)
+  Group = Selection
+    Match = ("Instrument","TargetName","Vesta")
+    File  = ("base", "dems/Vesta_Dawn_HAMO_DTM_DLR_Global_48ppd.cub")
+  EndGroup
+EndObject
+
diff --git a/isis/tests/data/isisdata/mockup/base/dems/kernels.0006.db b/isis/tests/data/isisdata/mockup/base/dems/kernels.0006.db
new file mode 100644
index 0000000000000000000000000000000000000000..21a68d235da7e0b10f3d40b35f9b612ee426bfbc
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/dems/kernels.0006.db
@@ -0,0 +1,37 @@
+#
+# Database file for DEMs. 
+#
+# history ????-??-?? Unknown - Added Mars MOLA DEM.
+# history 2011-04-12 Stuart Sides - Changed to use the LOLA DEM instead of ULCN. 
+# history 2011-06-24 Unknown - Added Vesta DEM.
+# history 2016-09-23 Stuart Sides - Comment out old Vesta DEM. Added new Vesta DEM.
+# history 2016-10-25 Jeannie Backer - Updated to include Ceres DEM.
+#
+Object = Dem 
+  Group = Selection
+    Match = ("Instrument","TargetName","Mars")
+    File  = ("base", "dems/molaMarsPlanetaryRadius????.cub")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Moon")
+    File  = ("base", "dems/ldem_128ppd_Mar2011_clon180_radius_pad.cub")
+  EndGroup
+
+  # Comment this one out because a new one was being added
+  #Group = Selection
+  #  Match = ("Instrument","TargetName","Vesta")
+  #  File  = ("base", "dems/vesta_hst_dem_????.cub")
+  #EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Vesta")
+    File  = ("base", "dems/Vesta_Dawn_HAMO_DTM_DLR_Global_48ppd.cub")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Ceres")
+    File  = ("base", "dems/Ceres_Dawn_FC_HAMO_DTM_DLR_Global_60ppd_Oct2016_prep.cub")
+  EndGroup
+EndObject
+
diff --git a/isis/tests/data/isisdata/mockup/base/dems/kernels.0007.db b/isis/tests/data/isisdata/mockup/base/dems/kernels.0007.db
new file mode 100644
index 0000000000000000000000000000000000000000..791d257b3ad53d8e0a11f59b012e1a37d25bbee5
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/dems/kernels.0007.db
@@ -0,0 +1,43 @@
+#
+# Database file for DEMs. 
+#
+# history ????-??-?? Unknown - Added Mars MOLA DEM.
+# history 2011-04-12 Stuart Sides - Changed to use the LOLA DEM instead of ULCN. 
+# history 2011-06-24 Unknown - Added Vesta DEM.
+# history 2016-09-23 Stuart Sides - Comment out old Vesta DEM. Added new Vesta DEM.
+# history 2016-10-25 Jeannie Backer - Updated to include Ceres DEM.
+# history 2017-02-09 Kris Becker - Added Mercury DEM shape model.
+#
+Object = Dem 
+  Group = Selection
+    Match = ("Instrument","TargetName","Mars")
+    File  = ("base", "dems/molaMarsPlanetaryRadius????.cub")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Moon")
+    File  = ("base", "dems/ldem_128ppd_Mar2011_clon180_radius_pad.cub")
+  EndGroup
+
+  # Comment this one out because a new one was being added
+  #Group = Selection
+  #  Match = ("Instrument","TargetName","Vesta")
+  #  File  = ("base", "dems/vesta_hst_dem_????.cub")
+  #EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Vesta")
+    File  = ("base", "dems/Vesta_Dawn_HAMO_DTM_DLR_Global_48ppd.cub")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Ceres")
+    File  = ("base", "dems/Ceres_Dawn_FC_HAMO_DTM_DLR_Global_60ppd_Oct2016_prep.cub")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Mercury")
+    File  = ("base", "dems/MSGR_DEM_USG_EQ_I_V02_prep.cub")
+  EndGroup
+EndObject
+
diff --git a/isis/tests/data/isisdata/mockup/base/dems/ldem_128ppd_Mar2011_clon180_radius_pad.cub b/isis/tests/data/isisdata/mockup/base/dems/ldem_128ppd_Mar2011_clon180_radius_pad.cub
new file mode 100644
index 0000000000000000000000000000000000000000..ba2a780b20134517a777688c302df5994407a6f1
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/dems/ldem_128ppd_Mar2011_clon180_radius_pad.cub
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/base/dems/ldem_128ppd_Mar2011_clon180_radius_pad.cub",
+    "filesize": 2141164162,
+    "createtime": "2022-08-12T22:11:16.000000",
+    "modifiedtime": "2022-11-24T12:23:46.593616",
+    "md5hash": "cb36cb569671f4db0badc29d737ed6d5",
+    "sha256hash": "8cec6c47db55adcf12841848862863e0420c3d85697cb8d0311c3a8b32ee6058",
+    "sha1hash": "a4694fa04358dccb3da49fcdbc8ee3e6ef5109f4"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/base/dems/molaMarsPlanetaryRadius0005.cub b/isis/tests/data/isisdata/mockup/base/dems/molaMarsPlanetaryRadius0005.cub
new file mode 100644
index 0000000000000000000000000000000000000000..cf8b9a5f3727237dc778699a39848285d08723f4
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/dems/molaMarsPlanetaryRadius0005.cub
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/base/dems/molaMarsPlanetaryRadius0005.cub",
+    "filesize": 2141168028,
+    "createtime": "2022-08-12T22:12:37.000000",
+    "modifiedtime": "2022-11-24T12:25:05.617457",
+    "md5hash": "816cdc4baf9f381c23b86d58d25ab3a2",
+    "sha256hash": "fd81a5aed577c7c54658b378459c9192c836a56d4f2d7272171944772c95bd4b",
+    "sha1hash": "86884989e829430e6681e182f1c31a67456a9cb6"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/base/dems/vesta_hst_dem_0001.cub b/isis/tests/data/isisdata/mockup/base/dems/vesta_hst_dem_0001.cub
new file mode 100644
index 0000000000000000000000000000000000000000..603bf5e865edfa3518bb85a25c88046416a98f10
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/dems/vesta_hst_dem_0001.cub
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/base/dems/vesta_hst_dem_0001.cub",
+    "filesize": 78316,
+    "createtime": "2022-08-12T22:13:15.000000",
+    "modifiedtime": "2022-11-24T12:24:00.732266",
+    "md5hash": "a2186af2bc310e424a1a45feafbacf98",
+    "sha256hash": "a7c0b308520477b40d701ffecc486f68785d8c52144d30116821f518f290d9a8",
+    "sha1hash": "c5ed9480bb3b2febe38dc899e88e0fb4e9b9ec2e"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/base/kernels/fk/lunarMeanEarth001.tf b/isis/tests/data/isisdata/mockup/base/kernels/fk/lunarMeanEarth001.tf
new file mode 100644
index 0000000000000000000000000000000000000000..5eeb6985bcf2a61e083c856a7289443b5e2077ef
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/kernels/fk/lunarMeanEarth001.tf
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/base/kernels/fk/lunarMeanEarth001.tf",
+    "filesize": 13109,
+    "createtime": "2022-08-12T22:13:15.000000",
+    "modifiedtime": "2022-11-24T12:25:34.348543",
+    "md5hash": "db016b44c73198c3e5a4b58619f2ecc0",
+    "sha256hash": "851fe3f4cb0d9baed112a36269892c65105150a6cc1cec1e12e5e193988071ea",
+    "sha1hash": "22d1ea314924330e740eeec8456637a10c937e73"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/base/kernels/fk/lunar_060616.tf b/isis/tests/data/isisdata/mockup/base/kernels/fk/lunar_060616.tf
new file mode 100644
index 0000000000000000000000000000000000000000..8dc196b3cad96d85496bdf6b833aafd1557ebb74
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/kernels/fk/lunar_060616.tf
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/base/kernels/fk/lunar_060616.tf",
+    "filesize": 12778,
+    "createtime": "2022-08-12T22:13:16.000000",
+    "modifiedtime": "2022-11-24T12:25:34.418713",
+    "md5hash": "4ad524384ba66bf5abcb410775350914",
+    "sha256hash": "e69c6073e460ac3e3cb715a34f2ffc991acabcd33ff18692d45e14ea24148445",
+    "sha1hash": "d1d311514f256ba73ef12a7bc1a81372942f7363"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/base/kernels/fk/moon_071218.tf b/isis/tests/data/isisdata/mockup/base/kernels/fk/moon_071218.tf
new file mode 100644
index 0000000000000000000000000000000000000000..5c5cb28187988b1fe1075f489a5677339ef2b1c1
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/kernels/fk/moon_071218.tf
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/base/kernels/fk/moon_071218.tf",
+    "filesize": 20909,
+    "createtime": "2022-08-12T22:13:16.000000",
+    "modifiedtime": "2022-11-24T12:25:34.514881",
+    "md5hash": "41915359077e6c2fa52e0142fc427016",
+    "sha256hash": "f0aa3796ba9cf73b8617733281f11665316e555299c1314f06f1d273a7dd7371",
+    "sha1hash": "e41ff46eaa7eed77d75fb380a414b1da84d4af7b"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/base/kernels/fk/moon_assoc_pa.tf b/isis/tests/data/isisdata/mockup/base/kernels/fk/moon_assoc_pa.tf
new file mode 100644
index 0000000000000000000000000000000000000000..23d24871f744781f575bd94ee43309e363809fe4
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/kernels/fk/moon_assoc_pa.tf
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/base/kernels/fk/moon_assoc_pa.tf",
+    "filesize": 7948,
+    "createtime": "2022-08-12T22:13:16.000000",
+    "modifiedtime": "2022-11-24T12:25:34.911353",
+    "md5hash": "a4c5eca0cce39377e7e8996a9e34285c",
+    "sha256hash": "8733c0a0665750f9933b21b606377d17f61d621f79bd4b82f08cb51f7f567b9b",
+    "sha1hash": "2e10c4d63ad63cb65f0452ab592db011a9ec6deb"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/base/kernels/lsk/kernels.0001.db b/isis/tests/data/isisdata/mockup/base/kernels/lsk/kernels.0001.db
new file mode 100644
index 0000000000000000000000000000000000000000..7460b6a6cbe99bd89291ca666d882be150ce9813
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/kernels/lsk/kernels.0001.db
@@ -0,0 +1,6 @@
+Object = LeapSecond
+  Group = Selection
+    File = ("base", "kernels/lsk/naif????.tls")
+  EndGroup
+EndObject
+
diff --git a/isis/tests/data/isisdata/mockup/base/kernels/lsk/naif0011.tls b/isis/tests/data/isisdata/mockup/base/kernels/lsk/naif0011.tls
new file mode 100644
index 0000000000000000000000000000000000000000..58fcbcbd7fa92fd34624de92e7acbde11a26a51b
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/kernels/lsk/naif0011.tls
@@ -0,0 +1,148 @@
+KPL/LSK
+
+
+LEAPSECONDS KERNEL FILE
+===========================================================================
+
+Modifications:
+--------------
+
+2015, Jan. 5    NJB  Modified file to account for the leapsecond that
+                     will occur on June 30, 2015.
+
+2012, Jan. 5    NJB  Modified file to account for the leapsecond that
+                     will occur on June 30, 2012.
+                     
+2008, Jul. 7    NJB  Modified file to account for the leapsecond that
+                     will occur on December 31, 2008.
+                     
+2005, Aug. 3    NJB  Modified file to account for the leapsecond that
+                     will occur on December 31, 2005.
+                     
+1998, Jul  17   WLT  Modified file to account for the leapsecond that
+                     will occur on December 31, 1998.
+                     
+1997, Feb  22   WLT  Modified file to account for the leapsecond that
+                     will occur on June 30, 1997.
+                     
+1995, Dec  14   KSZ  Corrected date of last leapsecond from 1-1-95
+                     to 1-1-96.
+
+1995, Oct  25   WLT  Modified file to account for the leapsecond that
+                     will occur on Dec 31, 1995.
+
+1994, Jun  16   WLT  Modified file to account for the leapsecond on
+                     June 30, 1994.
+
+1993, Feb. 22  CHA   Modified file to account for the leapsecond on
+                     June 30, 1993.
+
+1992, Mar. 6   HAN   Modified file to account for the leapsecond on
+                     June 30, 1992.
+
+1990, Oct. 8   HAN   Modified file to account for the leapsecond on 
+                     Dec. 31, 1990.  
+
+
+Explanation:
+------------
+
+The contents of this file are used by the routine DELTET to compute the 
+time difference
+
+[1]       DELTA_ET  =  ET - UTC                                         
+          
+the increment to be applied to UTC to give ET. 
+
+The difference between UTC and TAI,
+
+[2]       DELTA_AT  =  TAI - UTC
+
+is always an integral number of seconds. The value of DELTA_AT was 10
+seconds in January 1972, and increases by one each time a leap second
+is declared. Combining [1] and [2] gives
+
+[3]       DELTA_ET  =  ET - (TAI - DELTA_AT)
+
+                    =  (ET - TAI) + DELTA_AT
+
+The difference (ET - TAI) is periodic, and is given by
+
+[4]       ET - TAI  =  DELTA_T_A  + K sin E 
+
+where DELTA_T_A and K are constant, and E is the eccentric anomaly of the 
+heliocentric orbit of the Earth-Moon barycenter. Equation [4], which ignores 
+small-period fluctuations, is accurate to about 0.000030 seconds.
+
+The eccentric anomaly E is given by 
+
+[5]       E = M + EB sin M
+
+where M is the mean anomaly, which in turn is given by 
+
+[6]       M = M  +  M t
+               0     1
+
+where t is the number of ephemeris seconds past J2000.
+
+Thus, in order to compute DELTA_ET, the following items are necessary.
+
+          DELTA_TA
+          K
+          EB
+          M0
+          M1
+          DELTA_AT      after each leap second.
+
+The numbers, and the formulation, are taken from the following sources.
+
+     1) Moyer, T.D., Transformation from Proper Time on Earth to 
+        Coordinate Time in Solar System Barycentric Space-Time Frame
+        of Reference, Parts 1 and 2, Celestial Mechanics 23 (1981),
+        33-56 and 57-68.
+
+     2) Moyer, T.D., Effects of Conversion to the J2000 Astronomical
+        Reference System on Algorithms for Computing Time Differences
+        and Clock Rates, JPL IOM 314.5--942, 1 October 1985.
+
+The variable names used above are consistent with those used in the 
+Astronomical Almanac.
+
+\begindata
+
+DELTET/DELTA_T_A       =   32.184
+DELTET/K               =    1.657D-3
+DELTET/EB              =    1.671D-2
+DELTET/M               = (  6.239996D0   1.99096871D-7 )
+
+DELTET/DELTA_AT        = ( 10,   @1972-JAN-1
+                           11,   @1972-JUL-1     
+                           12,   @1973-JAN-1     
+                           13,   @1974-JAN-1     
+                           14,   @1975-JAN-1          
+                           15,   @1976-JAN-1          
+                           16,   @1977-JAN-1          
+                           17,   @1978-JAN-1          
+                           18,   @1979-JAN-1          
+                           19,   @1980-JAN-1          
+                           20,   @1981-JUL-1          
+                           21,   @1982-JUL-1          
+                           22,   @1983-JUL-1          
+                           23,   @1985-JUL-1          
+                           24,   @1988-JAN-1 
+                           25,   @1990-JAN-1
+                           26,   @1991-JAN-1 
+                           27,   @1992-JUL-1
+                           28,   @1993-JUL-1
+                           29,   @1994-JUL-1
+                           30,   @1996-JAN-1 
+                           31,   @1997-JUL-1
+                           32,   @1999-JAN-1
+                           33,   @2006-JAN-1
+                           34,   @2009-JAN-1
+                           35,   @2012-JUL-1
+                           36,   @2015-JUL-1 )
+
+\begintext
+
+
diff --git a/isis/tests/data/isisdata/mockup/base/kernels/lsk/naif0012.tls b/isis/tests/data/isisdata/mockup/base/kernels/lsk/naif0012.tls
new file mode 100644
index 0000000000000000000000000000000000000000..e1afdee1b626e01a3f1b04ef8a43154e83972e56
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/kernels/lsk/naif0012.tls
@@ -0,0 +1,152 @@
+KPL/LSK
+
+
+LEAPSECONDS KERNEL FILE
+===========================================================================
+
+Modifications:
+--------------
+
+2016, Jul. 14   NJB  Modified file to account for the leapsecond that
+                     will occur on December 31, 2016.
+
+2015, Jan. 5    NJB  Modified file to account for the leapsecond that
+                     will occur on June 30, 2015.
+
+2012, Jan. 5    NJB  Modified file to account for the leapsecond that
+                     will occur on June 30, 2012.
+                     
+2008, Jul. 7    NJB  Modified file to account for the leapsecond that
+                     will occur on December 31, 2008.
+                     
+2005, Aug. 3    NJB  Modified file to account for the leapsecond that
+                     will occur on December 31, 2005.
+                     
+1998, Jul  17   WLT  Modified file to account for the leapsecond that
+                     will occur on December 31, 1998.
+                     
+1997, Feb  22   WLT  Modified file to account for the leapsecond that
+                     will occur on June 30, 1997.
+                     
+1995, Dec  14   KSZ  Corrected date of last leapsecond from 1-1-95
+                     to 1-1-96.
+
+1995, Oct  25   WLT  Modified file to account for the leapsecond that
+                     will occur on Dec 31, 1995.
+
+1994, Jun  16   WLT  Modified file to account for the leapsecond on
+                     June 30, 1994.
+
+1993, Feb. 22  CHA   Modified file to account for the leapsecond on
+                     June 30, 1993.
+
+1992, Mar. 6   HAN   Modified file to account for the leapsecond on
+                     June 30, 1992.
+
+1990, Oct. 8   HAN   Modified file to account for the leapsecond on 
+                     Dec. 31, 1990.  
+
+
+Explanation:
+------------
+
+The contents of this file are used by the routine DELTET to compute the 
+time difference
+
+[1]       DELTA_ET  =  ET - UTC                                         
+          
+the increment to be applied to UTC to give ET. 
+
+The difference between UTC and TAI,
+
+[2]       DELTA_AT  =  TAI - UTC
+
+is always an integral number of seconds. The value of DELTA_AT was 10
+seconds in January 1972, and increases by one each time a leap second
+is declared. Combining [1] and [2] gives
+
+[3]       DELTA_ET  =  ET - (TAI - DELTA_AT)
+
+                    =  (ET - TAI) + DELTA_AT
+
+The difference (ET - TAI) is periodic, and is given by
+
+[4]       ET - TAI  =  DELTA_T_A  + K sin E 
+
+where DELTA_T_A and K are constant, and E is the eccentric anomaly of the 
+heliocentric orbit of the Earth-Moon barycenter. Equation [4], which ignores 
+small-period fluctuations, is accurate to about 0.000030 seconds.
+
+The eccentric anomaly E is given by 
+
+[5]       E = M + EB sin M
+
+where M is the mean anomaly, which in turn is given by 
+
+[6]       M = M  +  M t
+               0     1
+
+where t is the number of ephemeris seconds past J2000.
+
+Thus, in order to compute DELTA_ET, the following items are necessary.
+
+          DELTA_TA
+          K
+          EB
+          M0
+          M1
+          DELTA_AT      after each leap second.
+
+The numbers, and the formulation, are taken from the following sources.
+
+     1) Moyer, T.D., Transformation from Proper Time on Earth to 
+        Coordinate Time in Solar System Barycentric Space-Time Frame
+        of Reference, Parts 1 and 2, Celestial Mechanics 23 (1981),
+        33-56 and 57-68.
+
+     2) Moyer, T.D., Effects of Conversion to the J2000 Astronomical
+        Reference System on Algorithms for Computing Time Differences
+        and Clock Rates, JPL IOM 314.5--942, 1 October 1985.
+
+The variable names used above are consistent with those used in the 
+Astronomical Almanac.
+
+\begindata
+
+DELTET/DELTA_T_A       =   32.184
+DELTET/K               =    1.657D-3
+DELTET/EB              =    1.671D-2
+DELTET/M               = (  6.239996D0   1.99096871D-7 )
+
+DELTET/DELTA_AT        = ( 10,   @1972-JAN-1
+                           11,   @1972-JUL-1     
+                           12,   @1973-JAN-1     
+                           13,   @1974-JAN-1     
+                           14,   @1975-JAN-1          
+                           15,   @1976-JAN-1          
+                           16,   @1977-JAN-1          
+                           17,   @1978-JAN-1          
+                           18,   @1979-JAN-1          
+                           19,   @1980-JAN-1          
+                           20,   @1981-JUL-1          
+                           21,   @1982-JUL-1          
+                           22,   @1983-JUL-1          
+                           23,   @1985-JUL-1          
+                           24,   @1988-JAN-1 
+                           25,   @1990-JAN-1
+                           26,   @1991-JAN-1 
+                           27,   @1992-JUL-1
+                           28,   @1993-JUL-1
+                           29,   @1994-JUL-1
+                           30,   @1996-JAN-1 
+                           31,   @1997-JUL-1
+                           32,   @1999-JAN-1
+                           33,   @2006-JAN-1
+                           34,   @2009-JAN-1
+                           35,   @2012-JUL-1
+                           36,   @2015-JUL-1 
+                           37,   @2017-JAN-1 )
+
+\begintext
+
+
diff --git a/isis/tests/data/isisdata/mockup/base/kernels/pck/kernels.0002.db b/isis/tests/data/isisdata/mockup/base/kernels/pck/kernels.0002.db
new file mode 100644
index 0000000000000000000000000000000000000000..3d62b4540839009eb535f135d8dd434f5c884403
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/kernels/pck/kernels.0002.db
@@ -0,0 +1,14 @@
+Object = TargetAttitudeShape
+  Group = Selection
+    File = ("base", "kernels/pck/pck?????.tpc")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Moon")
+    File = ("base", "kernels/pck/pck?????.tpc")
+    File = ("base", "kernels/pck/lunar_de403_1950-2199_pa.bpc")
+    File = ("base", "kernels/fk/lunarMeanEarth???.tf")
+  EndGroup
+EndObject
+
+
diff --git a/isis/tests/data/isisdata/mockup/base/kernels/pck/kernels.0003.db b/isis/tests/data/isisdata/mockup/base/kernels/pck/kernels.0003.db
new file mode 100644
index 0000000000000000000000000000000000000000..da9985c56c2af0f1c9114c455d1d90adc251e1f2
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/kernels/pck/kernels.0003.db
@@ -0,0 +1,19 @@
+Object = TargetAttitudeShape
+  Group = Selection
+    File = ("base", "kernels/pck/pck?????.tpc")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Moon")
+    File = ("base", "kernels/pck/pck?????.tpc")
+    File = ("base", "kernels/pck/lunar_de403_1950-2199_pa.bpc")
+    File = ("base", "kernels/fk/lunarMeanEarth???.tf")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Mercury")
+    File = ("base", "kernels/pck/pck00010_msgr_v??.tpc")
+  EndGroup
+EndObject
+
+
diff --git a/isis/tests/data/isisdata/mockup/base/kernels/pck/lunar_de403_1950-2199_pa.bpc b/isis/tests/data/isisdata/mockup/base/kernels/pck/lunar_de403_1950-2199_pa.bpc
new file mode 100644
index 0000000000000000000000000000000000000000..5fa918c0eba67dfa6b6d49dc7c3b86e2017ddebd
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/kernels/pck/lunar_de403_1950-2199_pa.bpc
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/base/kernels/pck/lunar_de403_1950-2199_pa.bpc",
+    "filesize": 2925568,
+    "createtime": "2022-08-12T22:13:16.000000",
+    "modifiedtime": "2022-11-24T12:25:33.327522",
+    "md5hash": "c3a4c8d3b0d6df045f41ff713b4348a5",
+    "sha256hash": "76456c2fd38ec3bc50fbf0378ee8398ba703c341921563c2b047879a8c973816",
+    "sha1hash": "ab7da3465f3e6353ce96fc800274740f03b21a49"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/base/kernels/pck/moon_pa_de418_1950-2050.bpc b/isis/tests/data/isisdata/mockup/base/kernels/pck/moon_pa_de418_1950-2050.bpc
new file mode 100644
index 0000000000000000000000000000000000000000..ff166c0f8b202e6f9e0412afa8b90c5a5c4f06cd
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/kernels/pck/moon_pa_de418_1950-2050.bpc
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/base/kernels/pck/moon_pa_de418_1950-2050.bpc",
+    "filesize": 1186816,
+    "createtime": "2022-08-12T22:13:16.000000",
+    "modifiedtime": "2022-11-24T12:25:33.290957",
+    "md5hash": "3fbed36f4c207341a4295032ad6a47e8",
+    "sha256hash": "60223bce1cffdf228916d160d4d7abed44e14b994226d8316bf9de38c44914ed",
+    "sha1hash": "1fbf3f955b92cbcf50d6d7ce71c978716d105103"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/base/kernels/pck/pck00008.tpc b/isis/tests/data/isisdata/mockup/base/kernels/pck/pck00008.tpc
new file mode 100644
index 0000000000000000000000000000000000000000..f8cbc6230d5000a5d7976a5ca0353ddb3a4dc61f
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/kernels/pck/pck00008.tpc
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/base/kernels/pck/pck00008.tpc",
+    "filesize": 111586,
+    "createtime": "2022-08-12T22:13:16.000000",
+    "modifiedtime": "2022-11-24T12:25:33.357812",
+    "md5hash": "9ae96c883cd4982062d23fbdb49568ec",
+    "sha256hash": "ca07df56e9f1bca85a4c6748b618a46c0bf8e081f96f81e324896f2fdc54ea27",
+    "sha1hash": "1a38ba30903cd08d6a84c95d0b433956b0c9f272"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/base/kernels/pck/pck00009.tpc b/isis/tests/data/isisdata/mockup/base/kernels/pck/pck00009.tpc
new file mode 100644
index 0000000000000000000000000000000000000000..057a8d975b87a06f27154425b0e2cd9e61de0113
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/kernels/pck/pck00009.tpc
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/base/kernels/pck/pck00009.tpc",
+    "filesize": 114011,
+    "createtime": "2022-08-12T22:13:16.000000",
+    "modifiedtime": "2022-11-24T12:25:33.504737",
+    "md5hash": "f4aa3fe2eeb75715175629f99711e687",
+    "sha256hash": "70cadf93951040aa8593f8a052148f660ccf8972868355cffb95f2f8b8b0a973",
+    "sha1hash": "8792c27d4c536b6b09f40f93f83576882b8e5173"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/base/kernels/pck/pck00010_msgr_v23.tpc b/isis/tests/data/isisdata/mockup/base/kernels/pck/pck00010_msgr_v23.tpc
new file mode 100644
index 0000000000000000000000000000000000000000..9aec85fc6513d3092a70a4f4368be221f22e6f23
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/kernels/pck/pck00010_msgr_v23.tpc
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/base/kernels/pck/pck00010_msgr_v23.tpc",
+    "filesize": 141312,
+    "createtime": "2022-08-12T22:13:16.000000",
+    "modifiedtime": "2022-11-24T12:25:33.634842",
+    "md5hash": "53a01ac2fa2cc43c047cda82562b12c2",
+    "sha256hash": "22053addfd96409e927ec2d04b3682f271cc2f77f12cf6f2b74a8f09b3a914f6",
+    "sha1hash": "e1e4b10f432eb408eca593b837737004948a09b8"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/base/kernels/spk/aareadme.txt b/isis/tests/data/isisdata/mockup/base/kernels/spk/aareadme.txt
new file mode 100644
index 0000000000000000000000000000000000000000..dd8e3049eac41e3a7b89fd0179903f0fb7418d49
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/kernels/spk/aareadme.txt
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/base/kernels/spk/aareadme.txt",
+    "filesize": 7027,
+    "createtime": "2022-08-12T22:13:17.000000",
+    "modifiedtime": "2022-11-24T12:24:03.628351",
+    "md5hash": "72aa7125cb69e577845112798fb4622c",
+    "sha256hash": "4ec1c28bcf398de4d84aa9c0bbcfdfcf07c804de3ad5fe2e8a43b289c73ae48f",
+    "sha1hash": "167097fbc73fd22bee89eb53cfa2874b2e59037b"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/base/kernels/spk/de118.bsp b/isis/tests/data/isisdata/mockup/base/kernels/spk/de118.bsp
new file mode 100644
index 0000000000000000000000000000000000000000..22a88819737f30fd1f54391345903f47210fe29f
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/kernels/spk/de118.bsp
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/base/kernels/spk/de118.bsp",
+    "filesize": 4097024,
+    "createtime": "2022-08-12T22:13:17.000000",
+    "modifiedtime": "2022-11-24T12:24:04.449174",
+    "md5hash": "24a225d8262be0e0a7140dd40c708428",
+    "sha256hash": "118774c31125cf0051faeb340532d03cab1b81adb63369db5842daefc1684a3c",
+    "sha1hash": "dd6071b1a47193fe7abd6e9fc9db808408ef0429"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/base/kernels/spk/de245.bsp b/isis/tests/data/isisdata/mockup/base/kernels/spk/de245.bsp
new file mode 100644
index 0000000000000000000000000000000000000000..0fc4f0b0c8a305901b235226d8f539894933e0c4
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/kernels/spk/de245.bsp
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/base/kernels/spk/de245.bsp",
+    "filesize": 117760,
+    "createtime": "2022-08-12T22:13:17.000000",
+    "modifiedtime": "2022-11-24T12:24:03.833895",
+    "md5hash": "2e15d0b4d677ec35c0b595554c2e5b91",
+    "sha256hash": "c5e5e8d210ace1903dc2bb5a96ee75468eba65d27760ef0208ac342ee5c0a54e",
+    "sha1hash": "2d7134c0727df765820731b7af81ac5239e774a6"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/base/kernels/spk/de405.bsp b/isis/tests/data/isisdata/mockup/base/kernels/spk/de405.bsp
new file mode 100644
index 0000000000000000000000000000000000000000..3f424ad05b78a9b1a7e2e0b23840094a1e064f80
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/kernels/spk/de405.bsp
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/base/kernels/spk/de405.bsp",
+    "filesize": 10908672,
+    "createtime": "2022-08-12T22:13:17.000000",
+    "modifiedtime": "2022-11-24T12:24:06.754936",
+    "md5hash": "27cce032b2b598a86e3c88aed41accbf",
+    "sha256hash": "15fd6650aaff8f19f73969856172c284b764fc5658829632992cd38f500d3de4",
+    "sha1hash": "38c52b85a523ae74a7f26f319a8a590a000114e7"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/base/kernels/spk/de430.bsp b/isis/tests/data/isisdata/mockup/base/kernels/spk/de430.bsp
new file mode 100644
index 0000000000000000000000000000000000000000..bd75456b0c96c82d37a31ce04037e15151c5dc0e
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/kernels/spk/de430.bsp
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/base/kernels/spk/de430.bsp",
+    "filesize": 119741440,
+    "createtime": "2022-08-12T22:13:17.000000",
+    "modifiedtime": "2022-11-24T12:24:57.070506",
+    "md5hash": "91e21181f6a96edbfeb1ff5a419ce095",
+    "sha256hash": "6e1b277c5f07135a84950604b83e56b736be696a7f3560bcddb1d4aeb944fca1",
+    "sha1hash": "40c408850d9eb261b9446c655e74e3791216ab04"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/base/kernels/spk/jup310.bsp b/isis/tests/data/isisdata/mockup/base/kernels/spk/jup310.bsp
new file mode 100644
index 0000000000000000000000000000000000000000..d39465ae67f78a0af39ba74b5d8507fb7fa810f0
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/kernels/spk/jup310.bsp
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/base/kernels/spk/jup310.bsp",
+    "filesize": 1220766720,
+    "createtime": "2022-08-12T22:13:18.000000",
+    "modifiedtime": "2022-11-24T12:25:24.251801",
+    "md5hash": "be5c27b3c2d30cefbcee218ff5711807",
+    "sha256hash": "ed64f05431a7da5486f9d00ecff3490213f871c247a293138a798d560fcfdebb",
+    "sha1hash": "77d34eb77b58451cf4064693c906485d07c08e07"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/base/kernels/spk/kernels.0005.db b/isis/tests/data/isisdata/mockup/base/kernels/spk/kernels.0005.db
new file mode 100644
index 0000000000000000000000000000000000000000..5a531a185f960dc516b103af0bb050003f51d659
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/kernels/spk/kernels.0005.db
@@ -0,0 +1,467 @@
+Object = TargetPosition
+  Group = Selection
+    File = ("base", "kernels/spk/de???.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Phobos")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/mar080.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Deimos")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/mar080.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Mars")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/mar097.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Jupiter")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/jup310.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Io")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/jup310.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Europa")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/jup310.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Ganymede")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/jup310.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Callisto")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/jup310.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Amalthea")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/jup310.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Thebe")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/jup310.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Adrastea")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/jup310.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Metis")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/jup310.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Saturn")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat425.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Mimas")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat425.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Enceladus")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat425.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Tethys")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat425.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Dione")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat425.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Rhea")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat425.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Titan")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat425.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Hyperion")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat425.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Iapetus")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat425.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Phoebe")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat425.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Helene")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat425.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Telesto")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat425.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Calypso")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat425.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Methone")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat425.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Polydeuces")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat425.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Janus")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat393.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Epimetheus")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat393.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Atlas")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat393.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Prometheus")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat393.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Pandora")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat393.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Pallene")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat393.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Anthe")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat393.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Aegaeon")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat393.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Neptune")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/nep090.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Naiad")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/nep090.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Thalassa")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/nep090.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Despina")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/nep090.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Galatea")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/nep090.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Larissa")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/nep090.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Proteus")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/nep090.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Halimede")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/nep086.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Psamathe")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/nep086.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Sao")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/nep096.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Laomedeia")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/nep096.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Neso")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/nep086.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Triton")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/nep081.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Nereid")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/nep081.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Ariel")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura111.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Umbriel")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura111.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Titania")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura111.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Oberon")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura111.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Miranda")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura111.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Caliban")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura112.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Sycorax")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura112.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Prospero")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura112.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Setebos")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura112.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Stephano")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura112.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Trinculo")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura112.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Francisco")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura112.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Margaret")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura112.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Ferdinand")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura112.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Cordelia")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura115.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Ophelia")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura115.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Bianca")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura115.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Cressida")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura115.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Desdemona")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura115.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Juliet")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura115.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Portia")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura115.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Rosalind")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura115.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Belinda")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura115.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Puck")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura115.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Perdita")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura115.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Mab")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura115.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Cupid")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura115.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Uranus")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura115.bsp")
+  EndGroup
+EndObject
diff --git a/isis/tests/data/isisdata/mockup/base/kernels/spk/kernels.0006.db b/isis/tests/data/isisdata/mockup/base/kernels/spk/kernels.0006.db
new file mode 100644
index 0000000000000000000000000000000000000000..3123602da4da763a7222e31475bcbd80fdb73f01
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/kernels/spk/kernels.0006.db
@@ -0,0 +1,467 @@
+Object = TargetPosition
+  Group = Selection
+    File = ("base", "kernels/spk/de???.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Phobos")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/mar097.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Deimos")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/mar097.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Mars")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/mar097.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Jupiter")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/jup310.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Io")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/jup310.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Europa")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/jup310.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Ganymede")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/jup310.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Callisto")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/jup310.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Amalthea")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/jup310.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Thebe")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/jup310.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Adrastea")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/jup310.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Metis")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/jup310.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Saturn")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat425.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Mimas")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat425.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Enceladus")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat425.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Tethys")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat425.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Dione")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat425.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Rhea")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat425.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Titan")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat425.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Hyperion")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat425.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Iapetus")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat425.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Phoebe")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat425.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Helene")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat425.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Telesto")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat425.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Calypso")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat425.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Methone")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat425.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Polydeuces")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat425.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Janus")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat393.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Epimetheus")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat393.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Atlas")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat393.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Prometheus")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat393.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Pandora")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat393.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Pallene")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat393.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Anthe")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat393.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Aegaeon")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/sat393.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Neptune")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/nep090.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Naiad")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/nep090.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Thalassa")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/nep090.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Despina")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/nep090.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Galatea")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/nep090.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Larissa")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/nep090.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Proteus")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/nep090.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Halimede")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/nep086.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Psamathe")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/nep086.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Sao")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/nep096.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Laomedeia")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/nep096.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Neso")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/nep086.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Triton")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/nep081.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Nereid")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/nep081.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Ariel")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura111.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Umbriel")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura111.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Titania")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura111.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Oberon")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura111.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Miranda")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura111.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Caliban")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura112.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Sycorax")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura112.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Prospero")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura112.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Setebos")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura112.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Stephano")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura112.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Trinculo")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura112.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Francisco")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura112.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Margaret")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura112.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Ferdinand")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura112.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Cordelia")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura115.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Ophelia")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura115.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Bianca")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura115.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Cressida")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura115.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Desdemona")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura115.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Juliet")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura115.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Portia")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura115.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Rosalind")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura115.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Belinda")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura115.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Puck")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura115.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Perdita")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura115.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Mab")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura115.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Cupid")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura115.bsp")
+  EndGroup
+
+  Group = Selection
+    Match = ("Instrument","TargetName","Uranus")
+    File = ("base", "kernels/spk/de???.bsp")
+    File = ("base", "kernels/spk/ura115.bsp")
+  EndGroup
+EndObject
diff --git a/isis/tests/data/isisdata/mockup/base/kernels/spk/mar080.bsp b/isis/tests/data/isisdata/mockup/base/kernels/spk/mar080.bsp
new file mode 100644
index 0000000000000000000000000000000000000000..b5e06f09ba5e445f584878b3f84e36674f8bf417
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/kernels/spk/mar080.bsp
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/base/kernels/spk/mar080.bsp",
+    "filesize": 269408256,
+    "createtime": "2022-08-12T22:13:19.000000",
+    "modifiedtime": "2022-11-24T12:25:08.222075",
+    "md5hash": "0f85b181b357d5740f2ec44cca6b4fd9",
+    "sha256hash": "955926a4c8609106e427e9bbfcfadf61fee15da9dba0994b2e31c56c0d336e62",
+    "sha1hash": "09395127bac6368aeefc3a380acdf852fc03beb2"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/base/kernels/spk/mar097.bsp b/isis/tests/data/isisdata/mockup/base/kernels/spk/mar097.bsp
new file mode 100644
index 0000000000000000000000000000000000000000..1719fce94014930efa0c778adc1d24bdaeb98bb7
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/kernels/spk/mar097.bsp
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/base/kernels/spk/mar097.bsp",
+    "filesize": 469902336,
+    "createtime": "2022-08-12T22:13:19.000000",
+    "modifiedtime": "2022-11-24T12:25:17.348474",
+    "md5hash": "01d8f3d0348838399ce2b856b7163e56",
+    "sha256hash": "18af4611f536b1bccc07be6bce304b47cf8a829536023972e90097b5cefd902c",
+    "sha1hash": "c1f729fdbb6ccb6c69b968758d6c59c18f9ccd81"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/base/kernels/spk/nep081.bsp b/isis/tests/data/isisdata/mockup/base/kernels/spk/nep081.bsp
new file mode 100644
index 0000000000000000000000000000000000000000..36cfc374020371a2d182df05263a9a3349966a11
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/kernels/spk/nep081.bsp
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/base/kernels/spk/nep081.bsp",
+    "filesize": 157869056,
+    "createtime": "2022-08-12T22:13:22.000000",
+    "modifiedtime": "2022-11-24T12:24:57.081799",
+    "md5hash": "be4d54330186499fb2b976bb0b6c16f1",
+    "sha256hash": "a304baf7e6d853d41a44bea80ea0fb9a0a7e11239d057f618f683602fa8e49cb",
+    "sha1hash": "d2993a3023a7588c3c4ce312a1e3f57372c7e01f"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/base/kernels/spk/nep086.bsp b/isis/tests/data/isisdata/mockup/base/kernels/spk/nep086.bsp
new file mode 100644
index 0000000000000000000000000000000000000000..25efefe67b9a11ffc252aeafd072d8ff4e513bbf
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/kernels/spk/nep086.bsp
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/base/kernels/spk/nep086.bsp",
+    "filesize": 21851136,
+    "createtime": "2022-08-12T22:13:29.000000",
+    "modifiedtime": "2022-11-24T12:25:09.523557",
+    "md5hash": "04b9f944670113b97578efd831b77d58",
+    "sha256hash": "c31e67b518e3bcaa982cc672bcf49bb5f462df8b8da1e5c052d9886b7b3b2f76",
+    "sha1hash": "60b2d6492e940d1e0c6215048a2eed12a025359f"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/base/kernels/spk/nep090.bsp b/isis/tests/data/isisdata/mockup/base/kernels/spk/nep090.bsp
new file mode 100644
index 0000000000000000000000000000000000000000..d93c76a04d96d5d88acf603ee263b82e89769110
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/kernels/spk/nep090.bsp
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/base/kernels/spk/nep090.bsp",
+    "filesize": 2023328768,
+    "createtime": "2022-08-12T22:13:31.000000",
+    "modifiedtime": "2022-11-24T12:27:03.704223",
+    "md5hash": "52f2381ac5c6faf7bfd9810bb70a65f5",
+    "sha256hash": "db743a63e517f2d0f6597ef84ad116c81aba405d28a91f2da33663e226f1b4bb",
+    "sha1hash": "9f88034e6e3326f67a4e03950431c5d30bc293a3"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/base/kernels/spk/sat393.bsp b/isis/tests/data/isisdata/mockup/base/kernels/spk/sat393.bsp
new file mode 100644
index 0000000000000000000000000000000000000000..3c72c23e63330ba83fb37078c15a1aa578ed612b
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/kernels/spk/sat393.bsp
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/base/kernels/spk/sat393.bsp",
+    "filesize": 614725632,
+    "createtime": "2022-08-12T22:13:31.000000",
+    "modifiedtime": "2022-11-24T12:25:58.293944",
+    "md5hash": "b079b29b4510279129749c17e7e40d1e",
+    "sha256hash": "baaf630aa063712349c23e9c9ec53e7cdcb4840773b1b1fc0f4a2a561a1a8c24",
+    "sha1hash": "e0105e48f9e33973dbb76c7997c58d7c679a1011"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/base/kernels/spk/sat425.bsp b/isis/tests/data/isisdata/mockup/base/kernels/spk/sat425.bsp
new file mode 100644
index 0000000000000000000000000000000000000000..901b858a6b8ebee58a95f23e2780c90b534976d9
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/kernels/spk/sat425.bsp
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/base/kernels/spk/sat425.bsp",
+    "filesize": 254218240,
+    "createtime": "2022-08-12T22:13:38.000000",
+    "modifiedtime": "2022-11-24T12:25:28.873070",
+    "md5hash": "9ebc18ef42565274de13119f2dae9caf",
+    "sha256hash": "2120505b93fe2c70f52a399f770a4e75dbb35fb44922ede48a18de71abb2d574",
+    "sha1hash": "5ff7aa22e15b43483918527d1b3d6a579618a79c"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/base/kernels/spk/ura111.bsp b/isis/tests/data/isisdata/mockup/base/kernels/spk/ura111.bsp
new file mode 100644
index 0000000000000000000000000000000000000000..457f46f81bbbf314aa4b3992bdc21b5a56ad3943
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/kernels/spk/ura111.bsp
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/base/kernels/spk/ura111.bsp",
+    "filesize": 169928704,
+    "createtime": "2022-08-12T22:13:49.000000",
+    "modifiedtime": "2022-11-24T12:25:32.177030",
+    "md5hash": "53b6dbc5b1d9c2d15dc1f8a689f25e8a",
+    "sha256hash": "384647ab7fdc085eb573926a8db6326748518d4ad600d5ca6bdaa06f9c0d7bdc",
+    "sha1hash": "b2c9059ca6a0073048b1de3b77e2d1753fcda0a0"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/base/kernels/spk/ura112.bsp b/isis/tests/data/isisdata/mockup/base/kernels/spk/ura112.bsp
new file mode 100644
index 0000000000000000000000000000000000000000..c689f060d32d618fdd481df2ffe560ed4fd6dbfb
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/kernels/spk/ura112.bsp
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/base/kernels/spk/ura112.bsp",
+    "filesize": 30986240,
+    "createtime": "2022-08-12T22:13:53.000000",
+    "modifiedtime": "2022-11-24T12:25:29.346131",
+    "md5hash": "a45eb8003277c1bc8a610215258af796",
+    "sha256hash": "2f55575d8592c9e51493b7249900869e1843cbae76e1da0781d1b442f8a7208d",
+    "sha1hash": "1106e0cc59b7ecb8614b59470594e96cdd5965fd"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/base/kernels/spk/ura115.bsp b/isis/tests/data/isisdata/mockup/base/kernels/spk/ura115.bsp
new file mode 100644
index 0000000000000000000000000000000000000000..b269013e41ea9f90e3a41774a508bd53f35a15f4
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/base/kernels/spk/ura115.bsp
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/base/kernels/spk/ura115.bsp",
+    "filesize": 1531046912,
+    "createtime": "2022-08-12T22:13:54.000000",
+    "modifiedtime": "2022-11-24T12:27:24.975710",
+    "md5hash": "4e62597efe92694f128eb11db4aa1936",
+    "sha256hash": "57eb528d73dde26bbad456e7647f185d0dfcbacaae578756b90f09f0c994ba22",
+    "sha1hash": "3778c5186f925a24044abd5fb58ded90503072c8"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/calibration/amica/amicaCalibration0006.trn b/isis/tests/data/isisdata/mockup/hayabusa/calibration/amica/amicaCalibration0006.trn
new file mode 100644
index 0000000000000000000000000000000000000000..316cca1bd036551fedee802507c694b013fccf4e
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/calibration/amica/amicaCalibration0006.trn
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/hayabusa/calibration/amica/amicaCalibration0006.trn",
+    "filesize": 1899,
+    "createtime": "2022-08-12T22:29:57.000000",
+    "modifiedtime": "2022-11-23T23:37:22.853654",
+    "md5hash": "d3674227ebe153aba078e8d14996f7d2",
+    "sha256hash": "b790ddd9136e53ff817104a4c11c032c4c7906a644a1addbabe98d72d1239722",
+    "sha1hash": "6609844cb30aa3f931ac84576a1054dc715d7a81"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/calibration/flatfield/flat_p.cub b/isis/tests/data/isisdata/mockup/hayabusa/calibration/flatfield/flat_p.cub
new file mode 100644
index 0000000000000000000000000000000000000000..6123e69d03f73a479974a1d857de61ba3fc75b54
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/calibration/flatfield/flat_p.cub
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/hayabusa/calibration/flatfield/flat_p.cub",
+    "filesize": 4263043,
+    "createtime": "2022-08-12T22:29:57.000000",
+    "modifiedtime": "2022-11-23T23:37:19.649590",
+    "md5hash": "da7a0d49a33dae61a929ce405af7cb7f",
+    "sha256hash": "af58f7acc343eb828dcf9a9db75e42c2ac90af981b73cc4755b9247b62b5701d",
+    "sha1hash": "36603f9b9b81500609a08923ca6aa4add2629239"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/calibration/flatfield/flat_ul.cub b/isis/tests/data/isisdata/mockup/hayabusa/calibration/flatfield/flat_ul.cub
new file mode 100644
index 0000000000000000000000000000000000000000..ee2644fb4622ad3383096190c83cae30881ebcb9
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/calibration/flatfield/flat_ul.cub
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/hayabusa/calibration/flatfield/flat_ul.cub",
+    "filesize": 4262748,
+    "createtime": "2022-08-12T22:29:57.000000",
+    "modifiedtime": "2022-11-23T23:37:21.308906",
+    "md5hash": "206c09e4e789e72d932429b15fcf7cb2",
+    "sha256hash": "a8d8d7b6fb8116042271365ec5fe90bc022e933a02e4aaaebd64e6af73f06a73",
+    "sha1hash": "15369437e8c059bd43635724da325e3ecbe0ee2f"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/calibration/flatfield/flat_v.cub b/isis/tests/data/isisdata/mockup/hayabusa/calibration/flatfield/flat_v.cub
new file mode 100644
index 0000000000000000000000000000000000000000..e29f2cdd89ef0d13c6bcdb6a69a9d9423ee4866d
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/calibration/flatfield/flat_v.cub
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/hayabusa/calibration/flatfield/flat_v.cub",
+    "filesize": 4262739,
+    "createtime": "2022-08-12T22:29:57.000000",
+    "modifiedtime": "2022-11-23T23:37:20.307406",
+    "md5hash": "993227ac5b91239498e4d1c60b7d6e3c",
+    "sha256hash": "e0129fba3da4f60dba990eacc3b47dd21878d7f3e74f63fd4e9bf8a524201e93",
+    "sha1hash": "005bd5364523ae71e5d1354ba3096ae8928a37b6"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/ck/hayabusa_itokawarendezvous_v01.bc b/isis/tests/data/isisdata/mockup/hayabusa/kernels/ck/hayabusa_itokawarendezvous_v01.bc
new file mode 100644
index 0000000000000000000000000000000000000000..b9f1f3fda26a2da2e40692539e9cf53c7d18c45e
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/ck/hayabusa_itokawarendezvous_v01.bc
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/hayabusa/kernels/ck/hayabusa_itokawarendezvous_v01.bc",
+    "filesize": 16801792,
+    "createtime": "2006-01-13T08:01:06.000000",
+    "modifiedtime": "2022-11-23T23:37:11.673796",
+    "md5hash": "926409c3ab7ace2bfc67c2845e7eea3f",
+    "sha256hash": "6cf7d1e651502097fd768ec4eec950ef0dd232ecc13a41b8f7c60985e28dea77",
+    "sha1hash": "7fad21e110c3c28b654ea16fda01dd5bf3328a08"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/ck/hayabusa_itokawarendezvous_v02n.bc b/isis/tests/data/isisdata/mockup/hayabusa/kernels/ck/hayabusa_itokawarendezvous_v02n.bc
new file mode 100644
index 0000000000000000000000000000000000000000..97f780975286a85e8dab246c1f3ae68dbca304ea
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/ck/hayabusa_itokawarendezvous_v02n.bc
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/hayabusa/kernels/ck/hayabusa_itokawarendezvous_v02n.bc",
+    "filesize": 27963392,
+    "createtime": "2022-08-12T22:29:57.000000",
+    "modifiedtime": "2022-11-23T23:37:26.373575",
+    "md5hash": "5ce7cb1a6a5bc206fbeae8f0a0ed6b5b",
+    "sha256hash": "363084bb63b0b1d15d5290b180a4316a299a0c894e4e608f12a4d68f75d02829",
+    "sha1hash": "4d03db11eff14b232ec4ffe44192f8c770ab5233"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/ck/kernels.0001.db b/isis/tests/data/isisdata/mockup/hayabusa/kernels/ck/kernels.0001.db
new file mode 100644
index 0000000000000000000000000000000000000000..584cd50aaead9e557f3b0148881d35dbe428ad88
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/ck/kernels.0001.db
@@ -0,0 +1,15 @@
+Object = SpacecraftPointing
+  RunTime = 2013-11-25T15:55:12
+
+  Group = Dependencies
+    SpacecraftClockKernel = $hayabusa/kernels/sclk/hayabusa.tsc
+    LeapsecondKernel      = $base/kernels/lsk/naif0010.tls
+  End_Group
+
+  Group = Selection
+    Time = ("2005 SEP 02 02:01:12.604 TDB", "2005 NOV 26 02:17:34.027 TDB")
+    File = $hayabusa/kernels/ck/hayabusa_itokawarendezvous_v02n.bc
+    Type = Reconstructed
+  End_Group
+End_Object
+End
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/dsk/hay_a_amica_5_itokawashape_v1_0_512q.bds b/isis/tests/data/isisdata/mockup/hayabusa/kernels/dsk/hay_a_amica_5_itokawashape_v1_0_512q.bds
new file mode 100644
index 0000000000000000000000000000000000000000..f3dd2959d6f4e6c6fd848be0fcdfae9251272ebf
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/dsk/hay_a_amica_5_itokawashape_v1_0_512q.bds
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/hayabusa/kernels/dsk/hay_a_amica_5_itokawashape_v1_0_512q.bds",
+    "filesize": 155977728,
+    "createtime": "2022-08-12T22:29:57.000000",
+    "modifiedtime": "2022-11-23T23:37:45.108437",
+    "md5hash": "727ce26981f7ae4b333dc8bdde9b203e",
+    "sha256hash": "f73b9d518dadb8b117a3e5285319e8254f90835dfe80f21b390d718fcf1800c4",
+    "sha1hash": "1ddd591484977846f89996ebaa6099f68ed59d40"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/fk/hayabusa_hp.tf b/isis/tests/data/isisdata/mockup/hayabusa/kernels/fk/hayabusa_hp.tf
new file mode 100644
index 0000000000000000000000000000000000000000..1da8a72a754e5bfc41fcd321ccf0f5696ba222be
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/fk/hayabusa_hp.tf
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/hayabusa/kernels/fk/hayabusa_hp.tf",
+    "filesize": 15493,
+    "createtime": "2022-08-12T22:29:58.000000",
+    "modifiedtime": "2022-11-23T23:37:23.932904",
+    "md5hash": "b298e285507f966b15504c4857bd1daf",
+    "sha256hash": "61792e3b340e8ab7cff594a44c2b5512d2bd9559d95250f051f8acb16d7c5a70",
+    "sha1hash": "a89b7bb2cae920d01576f5217fa77e8deef8fb4b"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/fk/itokawa_fixed.tf b/isis/tests/data/isisdata/mockup/hayabusa/kernels/fk/itokawa_fixed.tf
new file mode 100644
index 0000000000000000000000000000000000000000..6e0eb153ae478c556361a83d1a62616615be32c0
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/fk/itokawa_fixed.tf
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/hayabusa/kernels/fk/itokawa_fixed.tf",
+    "filesize": 3122,
+    "createtime": "2022-08-12T22:29:58.000000",
+    "modifiedtime": "2022-11-23T23:37:24.105341",
+    "md5hash": "87fe3c8a40f8bb2e1072c16ff36f2328",
+    "sha256hash": "7bf456847c617a6f0ff69d90cf707f00e53f1624688d79a9c45c3608df92f105",
+    "sha1hash": "344e013671cb1d57aa615c73dc0a9307f44d319d"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/fk/kernels.0001.db b/isis/tests/data/isisdata/mockup/hayabusa/kernels/fk/kernels.0001.db
new file mode 100644
index 0000000000000000000000000000000000000000..7ffcc644a8789ee2818914d2c24b057fca0cb6f0
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/fk/kernels.0001.db
@@ -0,0 +1,7 @@
+Object = Frame
+  Group = Selection
+    File  = ("hayabusa", "kernels/fk/hayabusa_hp.tf")
+    File  = ("hayabusa", "kernels/fk/itokawa_fixed.tf")
+  EndGroup
+EndObject
+
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/iak/amicaAddendum001.ti b/isis/tests/data/isisdata/mockup/hayabusa/kernels/iak/amicaAddendum001.ti
new file mode 100644
index 0000000000000000000000000000000000000000..545e52cc374a2fc909f458fd298684f8a7062f93
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/iak/amicaAddendum001.ti
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/hayabusa/kernels/iak/amicaAddendum001.ti",
+    "filesize": 1025,
+    "createtime": "2022-08-12T22:29:58.000000",
+    "modifiedtime": "2022-11-23T23:37:23.110995",
+    "md5hash": "0ae0d342b20c02d51b3a115c018b9073",
+    "sha256hash": "f4eab242f33fea8016c69d23a7ac2881ae41eae8f8954a24469f89f225ae6b85",
+    "sha1hash": "40a56fe15de6b21f782b28b9d4dcd68c2fa2cacd"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/iak/amicaAddendum002.ti b/isis/tests/data/isisdata/mockup/hayabusa/kernels/iak/amicaAddendum002.ti
new file mode 100644
index 0000000000000000000000000000000000000000..a50042b07cab6175289aabaa574c983109a9afa5
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/iak/amicaAddendum002.ti
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/hayabusa/kernels/iak/amicaAddendum002.ti",
+    "filesize": 1270,
+    "createtime": "2022-08-12T22:29:58.000000",
+    "modifiedtime": "2022-11-23T23:37:23.198123",
+    "md5hash": "fa7bde57b022d4ff2085ce0a9e1a930e",
+    "sha256hash": "f3426ec2a80420a04279feafa69a2c48c265d987b435318636c7552e68192ba3",
+    "sha1hash": "908487bb0da036562ab39657d11d71bbc2d83bdf"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/iak/kernels.0001.db b/isis/tests/data/isisdata/mockup/hayabusa/kernels/iak/kernels.0001.db
new file mode 100644
index 0000000000000000000000000000000000000000..164311e47b7b3a5c1e5825e581ac9da1a997b362
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/iak/kernels.0001.db
@@ -0,0 +1,7 @@
+Object = InstrumentAddendum
+  Group = Selection
+    Match = ("Instrument","InstrumentId","AMICA")
+    File  = ("hayabusa", "kernels/iak/amicaAddendum???.ti")
+  EndGroup
+EndObject
+
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/iak/kernels.0002.db b/isis/tests/data/isisdata/mockup/hayabusa/kernels/iak/kernels.0002.db
new file mode 100644
index 0000000000000000000000000000000000000000..3339f483829aac68f3ae28dfba1ba68db78d4225
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/iak/kernels.0002.db
@@ -0,0 +1,11 @@
+Object = InstrumentAddendum
+  Group = Selection
+    Match = ("Instrument","InstrumentId","AMICA")
+    File  = ("hayabusa", "kernels/iak/amicaAddendum???.ti")
+  EndGroup
+  Group = Selection
+    Match = ("Instrument","InstrumentId","NIRS")
+    File  = ("hayabusa", "kernels/iak/nirsAddendum???.ti")
+  EndGroup
+EndObject
+
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/iak/nirsAddendum001.ti b/isis/tests/data/isisdata/mockup/hayabusa/kernels/iak/nirsAddendum001.ti
new file mode 100644
index 0000000000000000000000000000000000000000..d4ded2db6ff230b09240842e459fe1254cfa2e9c
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/iak/nirsAddendum001.ti
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/hayabusa/kernels/iak/nirsAddendum001.ti",
+    "filesize": 776,
+    "createtime": "2022-08-12T22:29:58.000000",
+    "modifiedtime": "2022-11-23T23:37:23.899460",
+    "md5hash": "015c767ae925e14edc71314600a27c81",
+    "sha256hash": "3b1be8bd6bfa284d914dfe5c614ff7200e7cbadedcc09a1602b7c0477092f366",
+    "sha1hash": "5278f31aa58d955c71fc3000145dedcfa96cd21b"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/iak/nirsAddendum002.ti b/isis/tests/data/isisdata/mockup/hayabusa/kernels/iak/nirsAddendum002.ti
new file mode 100644
index 0000000000000000000000000000000000000000..469e52f8cb9ecf79d9e4554030f98e7a8716190a
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/iak/nirsAddendum002.ti
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/hayabusa/kernels/iak/nirsAddendum002.ti",
+    "filesize": 1062,
+    "createtime": "2022-08-12T22:29:58.000000",
+    "modifiedtime": "2022-11-23T23:37:23.995250",
+    "md5hash": "b9e72f7a536ac96b27c5107ab1248940",
+    "sha256hash": "d0f399f00845b736258eeed81b17a9abcbbdc4f91e0fed4b4ed57e269ec85881",
+    "sha1hash": "19e0755b4224669e57077157bbe92ed856d3df33"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/ik/amica31.ti b/isis/tests/data/isisdata/mockup/hayabusa/kernels/ik/amica31.ti
new file mode 100644
index 0000000000000000000000000000000000000000..992203ea9b2c7110ac2db50dda6409c80db3c700
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/ik/amica31.ti
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/hayabusa/kernels/ik/amica31.ti",
+    "filesize": 11997,
+    "createtime": "2022-08-12T22:29:58.000000",
+    "modifiedtime": "2022-11-23T23:37:23.008786",
+    "md5hash": "c6b071ecc2ae6083791c04a2cf38a279",
+    "sha256hash": "02f95eca02061cb76a4256dbfedd1083928ff8bd6737fe8c1bcec27f4d3bcfc2",
+    "sha1hash": "8e3f3ed0c4fc7e8569acee8923c986ad85ee5504"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/ik/kernels.0001.db b/isis/tests/data/isisdata/mockup/hayabusa/kernels/ik/kernels.0001.db
new file mode 100644
index 0000000000000000000000000000000000000000..65ffc1ded718ec55491b8a1b8bce2046b4a2143c
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/ik/kernels.0001.db
@@ -0,0 +1,6 @@
+Object = Instrument
+  Group = Selection
+    File  = ("hayabusa", "kernels/ik/amica??.ti")
+  EndGroup
+EndObject
+
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/ik/kernels.0002.db b/isis/tests/data/isisdata/mockup/hayabusa/kernels/ik/kernels.0002.db
new file mode 100644
index 0000000000000000000000000000000000000000..4ff982e5fced089ada12cb2da77d60579c4b9857
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/ik/kernels.0002.db
@@ -0,0 +1,11 @@
+Object = Instrument
+  Group = Selection
+    Match = ("Instrument","InstrumentId","AMICA")
+    File  = ("hayabusa", "kernels/ik/amica??.ti")
+  EndGroup
+  Group = Selection
+    Match = ("Instrument","InstrumentId","NIRS")
+    File  = ("hayabusa", "kernels/ik/nirs??.ti")
+  EndGroup
+EndObject
+
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/ik/lidar10.ti b/isis/tests/data/isisdata/mockup/hayabusa/kernels/ik/lidar10.ti
new file mode 100644
index 0000000000000000000000000000000000000000..2a929f0002fa62d6aeb13f02b80a4fff1d6e6a3d
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/ik/lidar10.ti
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/hayabusa/kernels/ik/lidar10.ti",
+    "filesize": 2839,
+    "createtime": "2007-04-03T05:47:35.000000",
+    "modifiedtime": "2022-11-23T23:36:58.228868",
+    "md5hash": "9408c2a5bb336da66c56c9ada8ac167e",
+    "sha256hash": "7629344cccf78be9e73ec40ad6ae5d94ca742b6c4c0335c21ce656fef881d36a",
+    "sha1hash": "7f5c3ae52db0ef7671796e6774de88d7c39fb874"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/ik/nirs10.ti b/isis/tests/data/isisdata/mockup/hayabusa/kernels/ik/nirs10.ti
new file mode 100644
index 0000000000000000000000000000000000000000..c33ad7e0741b6771504633402280c249d2aa390f
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/ik/nirs10.ti
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/hayabusa/kernels/ik/nirs10.ti",
+    "filesize": 7026,
+    "createtime": "2022-08-12T22:29:58.000000",
+    "modifiedtime": "2022-11-23T23:37:23.008771",
+    "md5hash": "a55ee40c9030d6ae86f188d3558aa9bb",
+    "sha256hash": "3b99a081855bb3e6c6f1b97c3c14d98075e063e2fcdf70c2733d3b8225261be1",
+    "sha1hash": "817ccd0c4b8f19146b440fc576a787bf1335deb0"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/ik/xrs10.ti b/isis/tests/data/isisdata/mockup/hayabusa/kernels/ik/xrs10.ti
new file mode 100644
index 0000000000000000000000000000000000000000..f1d4767cbbc7259201077403f136156dfd5d1f9a
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/ik/xrs10.ti
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/hayabusa/kernels/ik/xrs10.ti",
+    "filesize": 2844,
+    "createtime": "2007-04-03T05:47:56.000000",
+    "modifiedtime": "2022-11-23T23:36:58.319287",
+    "md5hash": "949b6ead01ff7571c689429e7eb9b5dd",
+    "sha256hash": "707fdd672b9a0380affa37829ac18ed0f4830c12662322a1156e8e5af62fb8e8",
+    "sha1hash": "dd62dcba3744fbad56f1dcc4d0656de24367783b"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/lsk/kernels.0001.db b/isis/tests/data/isisdata/mockup/hayabusa/kernels/lsk/kernels.0001.db
new file mode 100644
index 0000000000000000000000000000000000000000..5a0ad3ad4c4ddf1fd894791a6b0193f080f3e0ec
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/lsk/kernels.0001.db
@@ -0,0 +1,6 @@
+Object = LeapSecond
+  Group = Selection
+    File = ("hayabusa", "kernels/lsk/naif????.tls")
+  EndGroup
+EndObject
+
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/lsk/naif0009.tls b/isis/tests/data/isisdata/mockup/hayabusa/kernels/lsk/naif0009.tls
new file mode 100644
index 0000000000000000000000000000000000000000..56dd86943402947b51683d0ec033db92f1b89f70
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/lsk/naif0009.tls
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/hayabusa/kernels/lsk/naif0009.tls",
+    "filesize": 4733,
+    "createtime": "2022-08-12T22:29:58.000000",
+    "modifiedtime": "2022-11-23T23:37:22.671880",
+    "md5hash": "edb3986f6a0e6669a08cc3ef6bf00234",
+    "sha256hash": "374905df51e719026795c3553702b5a4374179d89486af81e12a92ca1e8429cb",
+    "sha1hash": "7c5b0f06324f1df4941ba33b8c7a50b24ff8e769"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/pck/itokawa_aizu504.tpc b/isis/tests/data/isisdata/mockup/hayabusa/kernels/pck/itokawa_aizu504.tpc
new file mode 100644
index 0000000000000000000000000000000000000000..348ee67e7ce4f7b53d88ea4c023e2becef1b0895
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/pck/itokawa_aizu504.tpc
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/hayabusa/kernels/pck/itokawa_aizu504.tpc",
+    "filesize": 1320,
+    "createtime": "2007-10-16T00:49:24.000000",
+    "modifiedtime": "2022-11-23T23:36:57.922283",
+    "md5hash": "ef6066b4fc8320758da9dab16ab9f2be",
+    "sha256hash": "46154bdf46eac1075a53e6cd7861e492c5adf2d50c2f51519940783da1ba73c1",
+    "sha1hash": "7741c0e0dbaa21e81dc2b59d05e577f0e4741f1b"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/pck/itokawa_gaskell.tpc b/isis/tests/data/isisdata/mockup/hayabusa/kernels/pck/itokawa_gaskell.tpc
new file mode 100644
index 0000000000000000000000000000000000000000..e49920f1204ddf903ecc69cadabd785281003093
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/pck/itokawa_gaskell.tpc
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/hayabusa/kernels/pck/itokawa_gaskell.tpc",
+    "filesize": 1375,
+    "createtime": "2007-10-16T00:49:24.000000",
+    "modifiedtime": "2022-11-23T23:36:57.813706",
+    "md5hash": "9a4dc59a40d371ffe72d5f909d0b1cad",
+    "sha256hash": "5a15970e5cef749b2aae07a1b1c9b7f024ef79d0b2326720dd14b71dde233292",
+    "sha1hash": "f2bf17eeba79c635879519af478c9abd46d768f2"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/pck/itokawa_gaskell_n3.tpc b/isis/tests/data/isisdata/mockup/hayabusa/kernels/pck/itokawa_gaskell_n3.tpc
new file mode 100644
index 0000000000000000000000000000000000000000..343f0dcff6e3898bbb5e98d331bdecc2c1532023
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/pck/itokawa_gaskell_n3.tpc
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/hayabusa/kernels/pck/itokawa_gaskell_n3.tpc",
+    "filesize": 3784,
+    "createtime": "2022-08-12T22:29:58.000000",
+    "modifiedtime": "2022-11-23T23:37:24.282146",
+    "md5hash": "fc6f5f9ef9850d698ea8b8087f775472",
+    "sha256hash": "7aea8d6817ed607cc5d57043d1539419cf26ca767387f7a5eb8673f65c6edac0",
+    "sha1hash": "b9691f53f648393a8dc055735f671c46ee21e842"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/pck/kernels.0001.db b/isis/tests/data/isisdata/mockup/hayabusa/kernels/pck/kernels.0001.db
new file mode 100644
index 0000000000000000000000000000000000000000..7f8c2e1e7a3242f273643abe0edb262f20d3ae30
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/pck/kernels.0001.db
@@ -0,0 +1,6 @@
+Object = TargetAttitudeShape
+  Group = Selection
+    File = ("base", "kernels/pck/pck?????.tpc")
+    File = ("hayabusa", "kernels/pck/itokawa_gaskell_n?.tpc")
+  EndGroup
+EndObject
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/pck/pck00008.tpc b/isis/tests/data/isisdata/mockup/hayabusa/kernels/pck/pck00008.tpc
new file mode 100644
index 0000000000000000000000000000000000000000..fb2a674c1e5fe74bbcf2470f2bed62720a4ae22b
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/pck/pck00008.tpc
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/hayabusa/kernels/pck/pck00008.tpc",
+    "filesize": 112932,
+    "createtime": "2022-08-12T22:29:58.000000",
+    "modifiedtime": "2022-11-23T23:37:24.510365",
+    "md5hash": "2b7d2a59982f1c55816777dfe4a53daf",
+    "sha256hash": "1b44a77ba3aed7f1e5c1ef3bf21f831d5a780e3791cf2960a075c7cda38127a7",
+    "sha1hash": "0b408bb5bf3470d65fd90e27301e116ac841f99c"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/sclk/hayabusa.tsc b/isis/tests/data/isisdata/mockup/hayabusa/kernels/sclk/hayabusa.tsc
new file mode 100644
index 0000000000000000000000000000000000000000..ac12de6fd274156ab02fe92ae49ae50e6faf1f1b
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/sclk/hayabusa.tsc
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/hayabusa/kernels/sclk/hayabusa.tsc",
+    "filesize": 246894,
+    "createtime": "2022-08-12T22:29:58.000000",
+    "modifiedtime": "2022-11-23T23:37:22.945352",
+    "md5hash": "d8c9d26f9ce649631cfbae7e5e2f8eb4",
+    "sha256hash": "1f9d37594096158dbb31cf2d1b72322b4752232fd5312b35ea05631814854bd3",
+    "sha1hash": "93659e755a0a52c0065a43aeb221c0de15c02f68"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/sclk/kernels.0001.db b/isis/tests/data/isisdata/mockup/hayabusa/kernels/sclk/kernels.0001.db
new file mode 100644
index 0000000000000000000000000000000000000000..cae6c0b6d6bd8461eddffb5c01fabfaebf8be22f
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/sclk/kernels.0001.db
@@ -0,0 +1,5 @@
+Object = SpacecraftClock
+  Group = Selection
+    File = ("hayabusa", "kernels/sclk/hayabusa.tsc")
+  EndGroup
+EndObject
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/amica_kernels.0001.db b/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/amica_kernels.0001.db
new file mode 100644
index 0000000000000000000000000000000000000000..803af310d47d56933bd4abb145560b58a61fb964
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/amica_kernels.0001.db
@@ -0,0 +1,16 @@
+Object = SpacecraftPosition
+  RunTime = 2013-11-25T15:49:40
+
+  Group = Dependencies
+    LeapsecondKernel = $base/kernels/lsk/naif0010.tls
+  End_Group
+
+  Group = Selection
+    Time = ("2005 SEP 11 05:52:42.327 TDB", "2005 NOV 19 23:55:07.665 TDB")
+    File = $hayabusa/kernels/spk/hay_jaxa_050916_051119_v1n.bsp
+    File = $hayabusa/kernels/spk/hay_osbj_050911_051118_v1n.bsp
+    Type = Reconstructed
+  End_Group
+
+End_Object
+End
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/hay_jaxa_050916_051119_v1n.bsp b/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/hay_jaxa_050916_051119_v1n.bsp
new file mode 100644
index 0000000000000000000000000000000000000000..601dfc4de9fee28994f5d822fd901493a56b4314
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/hay_jaxa_050916_051119_v1n.bsp
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/hayabusa/kernels/spk/hay_jaxa_050916_051119_v1n.bsp",
+    "filesize": 13445120,
+    "createtime": "2022-08-12T22:29:59.000000",
+    "modifiedtime": "2022-11-23T23:37:25.580467",
+    "md5hash": "660d404fe9a8018fee9f71a3be25ecbf",
+    "sha256hash": "89d87303d7f18651e19224c2870673935183a8f3f047892a09a6372ad63bdf48",
+    "sha1hash": "f1d97547551f57c79a37415b1e02c33ef8283db8"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/hay_osbj_050911_051118_v1n.bsp b/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/hay_osbj_050911_051118_v1n.bsp
new file mode 100644
index 0000000000000000000000000000000000000000..96f8a75799627a5b552c2a6c8bb7ef55c772b3f7
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/hay_osbj_050911_051118_v1n.bsp
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/hayabusa/kernels/spk/hay_osbj_050911_051118_v1n.bsp",
+    "filesize": 81458176,
+    "createtime": "2022-08-12T22:29:59.000000",
+    "modifiedtime": "2022-11-23T23:37:37.651359",
+    "md5hash": "bbc5587a59fd5d5d9683ac5d957649ce",
+    "sha256hash": "8577f45d89d376a9bb1351b89e53c8d4e26327e465cc70b3bf361c975db53515",
+    "sha1hash": "072e199a7b2697b97e79c1fa6aa1a186b5e03dc3"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/hayabusa_20051108_20051109_v01.bsp b/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/hayabusa_20051108_20051109_v01.bsp
new file mode 100644
index 0000000000000000000000000000000000000000..009af5cd4a5d9f989a71417ad0ab0d86bd8f2841
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/hayabusa_20051108_20051109_v01.bsp
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/hayabusa/kernels/spk/hayabusa_20051108_20051109_v01.bsp",
+    "filesize": 76800,
+    "createtime": "2022-08-12T22:29:59.000000",
+    "modifiedtime": "2022-11-23T23:37:25.165326",
+    "md5hash": "4f6f49be992793621ea3fa8f9123299f",
+    "sha256hash": "e2b96091e0c80fd6769059f61261d1b1628a20aec7310cfc6429b2351c4ae9aa",
+    "sha1hash": "bc7f97abbdb88a2f848c9d1c329e25a2d090a25d"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/hayabusa_20051109_20051109_v01.bsp b/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/hayabusa_20051109_20051109_v01.bsp
new file mode 100644
index 0000000000000000000000000000000000000000..6af375be8ad1fbf97e4c68c936bccdf2ec002ef2
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/hayabusa_20051109_20051109_v01.bsp
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/hayabusa/kernels/spk/hayabusa_20051109_20051109_v01.bsp",
+    "filesize": 37888,
+    "createtime": "2022-08-12T22:29:59.000000",
+    "modifiedtime": "2022-11-23T23:37:25.076367",
+    "md5hash": "e92018acb2af292d8f455886a89d4d47",
+    "sha256hash": "6eeb70dc989c67c1d66433bd8b7eea0eada51f8534f2a351c51056d282691ae5",
+    "sha1hash": "dbc827c22232a2b985cf1b07d9e2e5f66362dad9"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/hayabusa_20051110_20051112_v01.bsp b/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/hayabusa_20051110_20051112_v01.bsp
new file mode 100644
index 0000000000000000000000000000000000000000..34786c9c2b88b7b1cf81c7ce6fce9d6ba09bd4e3
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/hayabusa_20051110_20051112_v01.bsp
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/hayabusa/kernels/spk/hayabusa_20051110_20051112_v01.bsp",
+    "filesize": 138240,
+    "createtime": "2022-08-12T22:29:59.000000",
+    "modifiedtime": "2022-11-23T23:37:25.706897",
+    "md5hash": "0d7eac3a8eacbd4b902dfe61ea7b4a1f",
+    "sha256hash": "631b30dd26c266cdb22537111d3f029a01c14dd8ba83522cd2ea5376545828dc",
+    "sha1hash": "4b10593161c90e0c95a2060fc3d3d668c6eea984"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/hayabusa_20051111_20051112_v01.bsp b/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/hayabusa_20051111_20051112_v01.bsp
new file mode 100644
index 0000000000000000000000000000000000000000..0b6b0d6648d2ed4603954ef4549be0f35af5ee6b
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/hayabusa_20051111_20051112_v01.bsp
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/hayabusa/kernels/spk/hayabusa_20051111_20051112_v01.bsp",
+    "filesize": 71680,
+    "createtime": "2022-08-12T22:29:59.000000",
+    "modifiedtime": "2022-11-23T23:37:25.076421",
+    "md5hash": "b4d267b86db574e2d78550bfc01ee76c",
+    "sha256hash": "819fcb69437904bae1e1717c8a00231d40fec2ade0890deaa25e358df5096e7f",
+    "sha1hash": "a1466f9fa357dd0435499fbaefdbf986e10b3822"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/hayabusa_20051112_20051114_v01.bsp b/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/hayabusa_20051112_20051114_v01.bsp
new file mode 100644
index 0000000000000000000000000000000000000000..a8eac9024d1f36cf2d6818c55233596c9ce558a2
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/hayabusa_20051112_20051114_v01.bsp
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/hayabusa/kernels/spk/hayabusa_20051112_20051114_v01.bsp",
+    "filesize": 86016,
+    "createtime": "2022-08-12T22:29:59.000000",
+    "modifiedtime": "2022-11-23T23:37:25.706866",
+    "md5hash": "a9143217c7e48a0af806ae94a5bf3217",
+    "sha256hash": "f0b436eb9428d8197eef2b62d9ab0f7ac3c6adf375817a92c947cb2b42c6d520",
+    "sha1hash": "1a0d86c740062a4b67f48aa13d0167afad86bd62"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/hayabusa_20051114_20051116_v01.bsp b/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/hayabusa_20051114_20051116_v01.bsp
new file mode 100644
index 0000000000000000000000000000000000000000..6b49709de0a695e2efd10b0a77801a734f9e7f85
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/hayabusa_20051114_20051116_v01.bsp
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/hayabusa/kernels/spk/hayabusa_20051114_20051116_v01.bsp",
+    "filesize": 112640,
+    "createtime": "2022-08-12T22:29:59.000000",
+    "modifiedtime": "2022-11-23T23:37:25.361549",
+    "md5hash": "ec8d974722808d9fc62a5256f2bd1049",
+    "sha256hash": "66f798e4f0f9c8aa503804ca11a1d9e35d55d77194b3da86dcdeb1283708fc8f",
+    "sha1hash": "cdc905dfadb16fd14ba6772502e7f15d3a58a5db"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/hayabusa_20051115_20051117_v01.bsp b/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/hayabusa_20051115_20051117_v01.bsp
new file mode 100644
index 0000000000000000000000000000000000000000..650ef15d9e76781c7d16385a278f5e4b8394701d
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/hayabusa_20051115_20051117_v01.bsp
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/hayabusa/kernels/spk/hayabusa_20051115_20051117_v01.bsp",
+    "filesize": 334848,
+    "createtime": "2022-08-12T22:29:59.000000",
+    "modifiedtime": "2022-11-23T23:37:25.645575",
+    "md5hash": "8eef36e3a713885ec4500075986f8167",
+    "sha256hash": "3a308e66fc97a3d29d098512e09de0511468e53c7350f0d2bbde3567e9adc290",
+    "sha1hash": "7076de2fbf4945695034457a550249d443112c8c"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/hayabusa_20051116_20051118_v01.bsp b/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/hayabusa_20051116_20051118_v01.bsp
new file mode 100644
index 0000000000000000000000000000000000000000..b0362590e3b24e951c861c014dd5daa98b457322
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/hayabusa_20051116_20051118_v01.bsp
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/hayabusa/kernels/spk/hayabusa_20051116_20051118_v01.bsp",
+    "filesize": 347136,
+    "createtime": "2022-08-12T22:29:59.000000",
+    "modifiedtime": "2022-11-23T23:37:25.361691",
+    "md5hash": "d7fa17bdff8a99520eacc03168389b19",
+    "sha256hash": "210c956a01b829ff5d22ecf908439caa357558e4ba304226ec5523d5220e8a25",
+    "sha1hash": "b06c9f269861de658feffb6f8f480088c86fa625"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/hayabusa_20051117_20051119_v01.bsp b/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/hayabusa_20051117_20051119_v01.bsp
new file mode 100644
index 0000000000000000000000000000000000000000..3f386682ace03a9d0459f235faa342ab5b970284
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/hayabusa_20051117_20051119_v01.bsp
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/hayabusa/kernels/spk/hayabusa_20051117_20051119_v01.bsp",
+    "filesize": 358400,
+    "createtime": "2022-08-12T22:29:59.000000",
+    "modifiedtime": "2022-11-23T23:37:26.371380",
+    "md5hash": "98887e7de33d6e8984056c638b281122",
+    "sha256hash": "475c8fa371975f969ac7763b1efa6133004b7b24f1e2e995e1b5a1c61426dff9",
+    "sha1hash": "2fd70bbc015f569b22553f994c7ba4519b96d055"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/hayabusa_itokawarendezvous_v01.bsp b/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/hayabusa_itokawarendezvous_v01.bsp
new file mode 100644
index 0000000000000000000000000000000000000000..21255b3eefe2cecd976b76a230795a05c553f230
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/hayabusa_itokawarendezvous_v01.bsp
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/hayabusa/kernels/spk/hayabusa_itokawarendezvous_v01.bsp",
+    "filesize": 17321984,
+    "createtime": "2006-01-13T08:03:41.000000",
+    "modifiedtime": "2022-11-23T23:36:55.320880",
+    "md5hash": "caa8b7b91f558e0145683677dcf871d2",
+    "sha256hash": "5223e3e861fcc390a55c979162fc0213093b1903a37e67485cc120450864ec5b",
+    "sha1hash": "31328105a265c5d69ea3e68349a1aa2e2703c293"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/itokawa_1989-2010.bsp b/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/itokawa_1989-2010.bsp
new file mode 100644
index 0000000000000000000000000000000000000000..1732c0a91d3436b7d06fe8113119f38cbb4c68a4
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/itokawa_1989-2010.bsp
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/hayabusa/kernels/spk/itokawa_1989-2010.bsp",
+    "filesize": 487424,
+    "createtime": "2007-10-16T00:50:09.000000",
+    "modifiedtime": "2022-11-23T23:36:49.376283",
+    "md5hash": "f88e1c1bef333cab89e29f49d93eb437",
+    "sha256hash": "1b109c72300da10835752abbcb6d842fef07d64282f58023173388307fa8d03a",
+    "sha1hash": "48c63d7e3a802e62e43ea1537721232f1b034eff"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/kernels.0001.conf b/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/kernels.0001.conf
new file mode 100644
index 0000000000000000000000000000000000000000..2048eb285a94c0f8375a9ac5f1a2237eddfe6dbe
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/kernels.0001.conf
@@ -0,0 +1,13 @@
+Object = Instrument
+  Group = Selection
+    Match = ("Instrument","InstrumentId","AMICA")
+    File = ("hayabusa", "kernels/spk/amica_kernels.????.db")
+  End_Group
+
+  Group = Selection
+    Match = ("Instrument","InstrumentId","NIRS")
+    File = ("hayabusa", "kernels/spk/kernels.????.db")
+  End_Group
+End_Object
+End
+
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/kernels.0001.db b/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/kernels.0001.db
new file mode 100644
index 0000000000000000000000000000000000000000..803af310d47d56933bd4abb145560b58a61fb964
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/kernels.0001.db
@@ -0,0 +1,16 @@
+Object = SpacecraftPosition
+  RunTime = 2013-11-25T15:49:40
+
+  Group = Dependencies
+    LeapsecondKernel = $base/kernels/lsk/naif0010.tls
+  End_Group
+
+  Group = Selection
+    Time = ("2005 SEP 11 05:52:42.327 TDB", "2005 NOV 19 23:55:07.665 TDB")
+    File = $hayabusa/kernels/spk/hay_jaxa_050916_051119_v1n.bsp
+    File = $hayabusa/kernels/spk/hay_osbj_050911_051118_v1n.bsp
+    Type = Reconstructed
+  End_Group
+
+End_Object
+End
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/kernels.0002.db b/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/kernels.0002.db
new file mode 100644
index 0000000000000000000000000000000000000000..7712c22da187f62e7433be07f998e960b1000b46
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/spk/kernels.0002.db
@@ -0,0 +1,99 @@
+Object = SpacecraftPosition
+  RunTime = 2016-12-30T14:03:20
+
+  Group = Dependencies
+    LeapsecondKernel = $hayabusa/kernels/lsk/naif0009.tls
+  End_Group
+
+  Group = Selection
+    Time = ("2005 SEP 16 05:42:48.850734 TDB",
+            "2005 NOV 04 07:05:06.468335 TDB")
+    Time = ("2005 NOV 08 05:02:32.168636 TDB",
+            "2005 NOV 09 02:51:57.910845 TDB")
+    Time = ("2005 NOV 11 15:51:41.248077 TDB",
+            "2005 NOV 12 06:27:24.520770 TDB")
+    Time = ("2005 NOV 19 12:28:24.338207 TDB",
+            "2005 NOV 19 23:55:07.665319 TDB")
+    File = $hayabusa/kernels/spk/hay_jaxa_050916_051119_v1n.bsp
+    Type = Reconstructed
+  End_Group
+
+  Group = Selection
+    Time = ("2005 SEP 11 05:52:42.327481 TDB",
+            "2005 NOV 03 22:19:06.187556 TDB")
+    Time = ("2005 NOV 08 10:06:10.123624 TDB",
+            "2005 NOV 08 20:06:40.509630 TDB")
+    Time = ("2005 NOV 11 12:11:00.691675 TDB",
+            "2005 NOV 11 20:59:54.014682 TDB")
+    Time = ("2005 NOV 16 03:56:39.238760 TDB",
+            "2005 NOV 16 23:20:49.947776 TDB")
+    Time = ("2005 NOV 18 06:09:34.291801 TDB",
+            "2005 NOV 18 21:57:26.398814 TDB")
+    File = $hayabusa/kernels/spk/hay_osbj_050911_051118_v1n.bsp
+    Type = Reconstructed
+  End_Group
+
+  Group = Selection
+    Time = ("2005 NOV 08 21:04:14.210806 TDB",
+            "2005 NOV 09 06:07:53.752332 TDB")
+    File = $hayabusa/kernels/spk/hayabusa_20051108_20051109_v01.bsp
+    Type = Reconstructed
+  End_Group
+
+  Group = Selection
+    Time = ("2005 NOV 09 07:13:21.695059 TDB",
+            "2005 NOV 09 12:01:08.398950 TDB")
+    File = $hayabusa/kernels/spk/hayabusa_20051109_20051109_v01.bsp
+    Type = Reconstructed
+  End_Group
+
+  Group = Selection
+    Time = ("2005 NOV 10 21:49:10.590670 TDB",
+            "2005 NOV 12 14:49:37.134195 TDB")
+    File = $hayabusa/kernels/spk/hayabusa_20051110_20051112_v01.bsp
+    Type = Reconstructed
+  End_Group
+
+  Group = Selection
+    Time = ("2005 NOV 11 21:45:05.994022 TDB",
+            "2005 NOV 12 05:43:29.548014 TDB")
+    File = $hayabusa/kernels/spk/hayabusa_20051111_20051112_v01.bsp
+    Type = Reconstructed
+  End_Group
+
+  Group = Selection
+    Time = ("2005 NOV 12 22:50:58.615165 TDB",
+            "2005 NOV 14 04:58:56.114311 TDB")
+    File = $hayabusa/kernels/spk/hayabusa_20051112_20051114_v01.bsp
+    Type = Reconstructed
+  End_Group
+
+  Group = Selection
+    Time = ("2005 NOV 14 23:22:54.584456 TDB",
+            "2005 NOV 16 05:37:16.086662 TDB")
+    File = $hayabusa/kernels/spk/hayabusa_20051114_20051116_v01.bsp
+    Type = Reconstructed
+  End_Group
+
+  Group = Selection
+    Time = ("2005 NOV 15 23:22:52.596430 TDB",
+            "2005 NOV 17 05:35:06.083202 TDB")
+    File = $hayabusa/kernels/spk/hayabusa_20051115_20051117_v01.bsp
+    Type = Reconstructed
+  End_Group
+
+  Group = Selection
+    Time = ("2005 NOV 16 21:57:30.715444 TDB",
+            "2005 NOV 18 05:39:38.052262 TDB")
+    File = $hayabusa/kernels/spk/hayabusa_20051116_20051118_v01.bsp
+    Type = Reconstructed
+  End_Group
+
+  Group = Selection
+    Time = ("2005 NOV 17 21:59:36.741975 TDB",
+            "2005 NOV 19 05:35:38.704435 TDB")
+    File = $hayabusa/kernels/spk/hayabusa_20051117_20051119_v01.bsp
+    Type = Reconstructed
+  End_Group
+End_Object
+End
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/tspk/de403s.bsp b/isis/tests/data/isisdata/mockup/hayabusa/kernels/tspk/de403s.bsp
new file mode 100644
index 0000000000000000000000000000000000000000..d89120b65f9207d514ef814384fa21d40b4ebf0a
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/tspk/de403s.bsp
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/hayabusa/kernels/tspk/de403s.bsp",
+    "filesize": 3399680,
+    "createtime": "2022-08-12T22:30:00.000000",
+    "modifiedtime": "2022-11-23T23:37:25.361905",
+    "md5hash": "febfe23eb1f27f30b80f2c9ba10fb87d",
+    "sha256hash": "a5b0eb365e773e7c01d051a021d990d460e5cf9edf14d28079cc484bf200d8d3",
+    "sha1hash": "22cf60f77df89aaedc6203705ccd097e7cd0ad3e"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/tspk/kernels.0001.db b/isis/tests/data/isisdata/mockup/hayabusa/kernels/tspk/kernels.0001.db
new file mode 100644
index 0000000000000000000000000000000000000000..095d25b30304ec06d5c82afdab4ab753ece0089c
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/tspk/kernels.0001.db
@@ -0,0 +1,8 @@
+Object = TargetPosition
+  Group = Selection
+    Time = ("2005 SEP 16 00:00:00.000 TDB", "2010 JAN 01 00:00:00.000 TDB")
+    File = ("hayabusa", "kernels/tspk/de403s.bsp")
+    File = ("hayabusa", "kernels/tspk/sb_25143_140.bsp")
+  EndGroup
+EndObject
+
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/tspk/kernels.0002.db b/isis/tests/data/isisdata/mockup/hayabusa/kernels/tspk/kernels.0002.db
new file mode 100644
index 0000000000000000000000000000000000000000..665d79ce18e1b0978f668a27945b5389f62611ff
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/tspk/kernels.0002.db
@@ -0,0 +1,8 @@
+Object = TargetPosition
+  Group = Selection
+    Time = ("2005 SEP 11 00:00:00.000 TDB", "2010 JAN 01 00:00:00.000 TDB")
+    File = ("hayabusa", "kernels/tspk/de403s.bsp")
+    File = ("hayabusa", "kernels/tspk/sb_25143_140.bsp")
+  EndGroup
+EndObject
+
diff --git a/isis/tests/data/isisdata/mockup/hayabusa/kernels/tspk/sb_25143_140.bsp b/isis/tests/data/isisdata/mockup/hayabusa/kernels/tspk/sb_25143_140.bsp
new file mode 100644
index 0000000000000000000000000000000000000000..31cddab9fb41b4eb89d14c36c99ba0e5e6654633
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/hayabusa/kernels/tspk/sb_25143_140.bsp
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/hayabusa/kernels/tspk/sb_25143_140.bsp",
+    "filesize": 137216,
+    "createtime": "2022-08-12T22:30:00.000000",
+    "modifiedtime": "2022-11-23T23:37:24.707532",
+    "md5hash": "6edd266412af4e12f9ac99cc07a52b88",
+    "sha256hash": "4bfb9746545f93832dcc6fc462df583b5283d6271b20f70879cb86cded212c68",
+    "sha1hash": "5a1d6acca355a98a7e4da89454959b96ac648dd2"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/smart1/kernels/aareadme.txt b/isis/tests/data/isisdata/mockup/smart1/kernels/aareadme.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f24d5762f6f9b3e82a649055a9a42007fc28deca
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/smart1/kernels/aareadme.txt
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/smart1/kernels/aareadme.txt",
+    "filesize": 8226,
+    "createtime": "2010-03-23T10:37:55.000000",
+    "modifiedtime": "2022-11-24T05:59:03.675313",
+    "md5hash": "d487f56b40bb8994e857952623240549",
+    "sha256hash": "51f6d40705b046e89824a73414830988be87949a3f67776339e6747c3402d1bc",
+    "sha1hash": "acf5efcd14cd3253b38c9a3f4fdbee05e324f0b5"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/smart1/kernels/ck/ATNS_P030929010023_00188.BC b/isis/tests/data/isisdata/mockup/smart1/kernels/ck/ATNS_P030929010023_00188.BC
new file mode 100644
index 0000000000000000000000000000000000000000..8e59b8f65330c925a3a0be4671a05666c7bfb03c
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/smart1/kernels/ck/ATNS_P030929010023_00188.BC
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/smart1/kernels/ck/ATNS_P030929010023_00188.BC",
+    "filesize": 19554304,
+    "createtime": "2007-03-01T17:36:59.000000",
+    "modifiedtime": "2022-11-24T05:59:44.075230",
+    "md5hash": "b4176eb716d762fe3021f34b442e975b",
+    "sha256hash": "4655b2118a892689a55f835ff80571611464362447e5dbedd54a00afd7174dc6",
+    "sha1hash": "e6f29bdc0f90a847bea50b1536f55ec2aef40f24"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/smart1/kernels/ck/ATNS_P050930150947_00220.BC b/isis/tests/data/isisdata/mockup/smart1/kernels/ck/ATNS_P050930150947_00220.BC
new file mode 100644
index 0000000000000000000000000000000000000000..75a46fcd5542e85cf9d9bd67a5c5ab511119bf98
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/smart1/kernels/ck/ATNS_P050930150947_00220.BC
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/smart1/kernels/ck/ATNS_P050930150947_00220.BC",
+    "filesize": 7058432,
+    "createtime": "2007-03-01T17:08:03.000000",
+    "modifiedtime": "2022-11-24T05:59:16.881807",
+    "md5hash": "2f4691463fea4b5d3f3e83bf1e937d9b",
+    "sha256hash": "11f1c3dcd67f771ee3bdb0493fa837d9c8bac86ce07d69abd9ad1d662e9ac5fe",
+    "sha1hash": "5833eb5d0d0cdec5a58905a662f06cd9280cb270"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/smart1/kernels/ck/ATNS_P060301004212_00233.BC b/isis/tests/data/isisdata/mockup/smart1/kernels/ck/ATNS_P060301004212_00233.BC
new file mode 100644
index 0000000000000000000000000000000000000000..c3423f4e820604f7d32e04474c57009b37c33fc0
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/smart1/kernels/ck/ATNS_P060301004212_00233.BC
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/smart1/kernels/ck/ATNS_P060301004212_00233.BC",
+    "filesize": 4888576,
+    "createtime": "2007-03-01T15:46:11.000000",
+    "modifiedtime": "2022-11-24T05:59:16.231815",
+    "md5hash": "ff18159c7f8a9fea668471cc41be0cf4",
+    "sha256hash": "22c1d4063fd2996af2025e86a7fb97c0de06c1ad9558ae29ebd8fcac0b156140",
+    "sha1hash": "e9d8b23019ebba0d15f3e631a9acadf955948150"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/smart1/kernels/ck/kernels.0001.db b/isis/tests/data/isisdata/mockup/smart1/kernels/ck/kernels.0001.db
new file mode 100644
index 0000000000000000000000000000000000000000..0fbfdf62137e13259b24bbcfc070c1ea5a2fb1fd
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/smart1/kernels/ck/kernels.0001.db
@@ -0,0 +1,27 @@
+Object = SpacecraftPointing
+  RunTime = 2008-09-05T15:48:10
+
+  Group = Dependencies
+    SpacecraftClockKernel = $smart1/kernels/sclk/SMART1_070227_STEP.TSC
+    LeapsecondKernel      = $base/kernels/lsk/naif0008.tls
+  End_Group
+
+  Group = Selection
+    Time = ("2006 MAR 01 00:42:12.668 TDB", "2006 SEP 03 05:43:25.562 TDB")
+    File = $smart1/kernels/ck/ATNS_P060301004212_00233.BC
+    Type = Reconstructed
+  End_Group
+
+  Group = Selection
+    Time = ("2005 SEP 30 15:09:47.181 TDB", "2006 JUL 11 00:01:05.183 TDB")
+    File = $smart1/kernels/ck/ATNS_P050930150947_00220.BC
+    Type = Reconstructed
+  End_Group
+
+  Group = Selection
+    Time = ("2003 SEP 29 01:00:23.182 TDB", "2005 NOV 29 05:26:00.680 TDB")
+    File = $smart1/kernels/ck/ATNS_P030929010023_00188.BC
+    Type = Reconstructed
+  End_Group
+End_Object
+End
diff --git a/isis/tests/data/isisdata/mockup/smart1/kernels/ck/makedb b/isis/tests/data/isisdata/mockup/smart1/kernels/ck/makedb
new file mode 100644
index 0000000000000000000000000000000000000000..fd937fe1b25102ebf5f5154590af57869df35aec
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/smart1/kernels/ck/makedb
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/smart1/kernels/ck/makedb",
+    "filesize": 509,
+    "createtime": "2022-08-12T23:45:22.000000",
+    "modifiedtime": "2022-11-24T06:02:50.879357",
+    "md5hash": "a6b00b7cf61582aff3e70e8b7eba4fd6",
+    "sha256hash": "ef407be8fa3752b50c38c072a33a4f1c1b5dae49da9839b82c8f35b9c18ce580",
+    "sha1hash": "3611c25a8020b2b571202c13b519783cbe92e2b9"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/smart1/kernels/fk/SMART1_V1.TF b/isis/tests/data/isisdata/mockup/smart1/kernels/fk/SMART1_V1.TF
new file mode 100644
index 0000000000000000000000000000000000000000..89284c28c9c763570a3cd3f92a73a976edd2c332
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/smart1/kernels/fk/SMART1_V1.TF
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/smart1/kernels/fk/SMART1_V1.TF",
+    "filesize": 85411,
+    "createtime": "2022-08-12T23:45:22.000000",
+    "modifiedtime": "2022-11-24T06:02:50.891048",
+    "md5hash": "7bbb5485bb92d3156257c9351fad45f3",
+    "sha256hash": "502e897fff1554ada6b59995faaafde6d26e25028ed6c7a621aae88d4d993291",
+    "sha1hash": "b61aa02af1b973531197a1b94ac6c0ae6b38653e"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/smart1/kernels/fk/SMART1_V12.TF b/isis/tests/data/isisdata/mockup/smart1/kernels/fk/SMART1_V12.TF
new file mode 100644
index 0000000000000000000000000000000000000000..94bfdba92eda38a9c146bf22eceecc34700924eb
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/smart1/kernels/fk/SMART1_V12.TF
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/smart1/kernels/fk/SMART1_V12.TF",
+    "filesize": 86254,
+    "createtime": "2010-02-03T11:17:48.000000",
+    "modifiedtime": "2022-11-24T05:59:17.849541",
+    "md5hash": "25f4bfd07565e645cd05dfced03fd95a",
+    "sha256hash": "bcdaebf8c95196149c4781e7e48574370ad8b4bdb37ef4107c4bac41003f62f9",
+    "sha1hash": "20542e2631738f7d58d86e1ec4cf40559afbd0da"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/smart1/kernels/fk/kernels.0001.db b/isis/tests/data/isisdata/mockup/smart1/kernels/fk/kernels.0001.db
new file mode 100644
index 0000000000000000000000000000000000000000..726e25e25b03b46ed354cf629b8d53566c698de7
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/smart1/kernels/fk/kernels.0001.db
@@ -0,0 +1,5 @@
+Object = Frame
+  Group = Selection
+    File = ("smart1", "kernels/fk/SMART1_V????.TF")
+  EndGroup
+EndObject
diff --git a/isis/tests/data/isisdata/mockup/smart1/kernels/iak/kernels.0001.db b/isis/tests/data/isisdata/mockup/smart1/kernels/iak/kernels.0001.db
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/isis/tests/data/isisdata/mockup/smart1/kernels/ik/SMART1_AMIE_V01.TI b/isis/tests/data/isisdata/mockup/smart1/kernels/ik/SMART1_AMIE_V01.TI
new file mode 100644
index 0000000000000000000000000000000000000000..d3f124122ee4a533a60ed94c18032265ccedadae
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/smart1/kernels/ik/SMART1_AMIE_V01.TI
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/smart1/kernels/ik/SMART1_AMIE_V01.TI",
+    "filesize": 24692,
+    "createtime": "2005-01-19T11:46:01.000000",
+    "modifiedtime": "2022-11-24T05:59:08.071883",
+    "md5hash": "9e818b397d1f326967d2f5a2f715f97e",
+    "sha256hash": "0d82cb3cd6f7bba8cce8131a8ce487bae28de89f08fae9def6a9e0a28bb0fb61",
+    "sha1hash": "d0998bf3ce6423c629a8d055581bec4568825080"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/smart1/kernels/ik/SMART1_DCIXS_V03.TI b/isis/tests/data/isisdata/mockup/smart1/kernels/ik/SMART1_DCIXS_V03.TI
new file mode 100644
index 0000000000000000000000000000000000000000..2209696a10f30357a69913af6586e5ebe56b69c8
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/smart1/kernels/ik/SMART1_DCIXS_V03.TI
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/smart1/kernels/ik/SMART1_DCIXS_V03.TI",
+    "filesize": 16384,
+    "createtime": "2005-06-22T08:50:45.000000",
+    "modifiedtime": "2022-11-24T05:59:07.989916",
+    "md5hash": "5b96512022df6e255525dc79e045669b",
+    "sha256hash": "e9ce308966a2b5221d20130d5bb8d8f8508e65582499c8cec66f6a5dd3599082",
+    "sha1hash": "50932f1e838e2d4e54c22485fcda9bb18977468c"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/smart1/kernels/ik/SMART1_SIR_V02.TI b/isis/tests/data/isisdata/mockup/smart1/kernels/ik/SMART1_SIR_V02.TI
new file mode 100644
index 0000000000000000000000000000000000000000..2b1a5a347484048ec7521c408c84abf40175cbbd
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/smart1/kernels/ik/SMART1_SIR_V02.TI
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/smart1/kernels/ik/SMART1_SIR_V02.TI",
+    "filesize": 7442,
+    "createtime": "2005-03-02T16:01:08.000000",
+    "modifiedtime": "2022-11-24T05:59:08.113151",
+    "md5hash": "b7b51ba2b96b3378477778aa4d0e76f4",
+    "sha256hash": "e5bae3cb78f5c33cd859b4b33c02ed871af28dedf512489edf261ad1c9006b8b",
+    "sha1hash": "677d22037cce4c8dc148238a4a1b1343c7c79f60"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/smart1/kernels/ik/SMART1_SPEDE_V02.TI b/isis/tests/data/isisdata/mockup/smart1/kernels/ik/SMART1_SPEDE_V02.TI
new file mode 100644
index 0000000000000000000000000000000000000000..b6280685a736a0d472af2da5c468605d3a30f8e7
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/smart1/kernels/ik/SMART1_SPEDE_V02.TI
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/smart1/kernels/ik/SMART1_SPEDE_V02.TI",
+    "filesize": 44204,
+    "createtime": "2005-12-22T19:25:45.000000",
+    "modifiedtime": "2022-11-24T05:59:08.439853",
+    "md5hash": "4a46c48a2bbee3b9f03b5129cb225843",
+    "sha256hash": "878a3fac9726bd540051bc3bff732824801c9fa9be3e45d87a46d5f70a3aabb6",
+    "sha1hash": "d42ec8185f25a3c2fc3067fe1eb91a65a3b368a7"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/smart1/kernels/ik/SMART1_XSM_V02.TI b/isis/tests/data/isisdata/mockup/smart1/kernels/ik/SMART1_XSM_V02.TI
new file mode 100644
index 0000000000000000000000000000000000000000..f10be334bf8aa6c79d0cdaaf5d29d4331a305318
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/smart1/kernels/ik/SMART1_XSM_V02.TI
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/smart1/kernels/ik/SMART1_XSM_V02.TI",
+    "filesize": 17616,
+    "createtime": "2005-06-09T06:57:00.000000",
+    "modifiedtime": "2022-11-24T05:59:08.298329",
+    "md5hash": "f09fd7cc723afaeb9c508944231a91e8",
+    "sha256hash": "38722c47e6381dac9133608a0ad0de3dbb31557afb9ffb89bcf1c37b24352584",
+    "sha1hash": "4212354b414c36b1d352a9838c6cd49d3b02b04a"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/smart1/kernels/ik/aareadme.txt b/isis/tests/data/isisdata/mockup/smart1/kernels/ik/aareadme.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b4ee10e477f927d0d0da185499b0970e505d3437
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/smart1/kernels/ik/aareadme.txt
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/smart1/kernels/ik/aareadme.txt",
+    "filesize": 3800,
+    "createtime": "2022-08-12T23:45:22.000000",
+    "modifiedtime": "2022-11-24T06:02:50.589459",
+    "md5hash": "8f25b077b216abf2a94bf8ed62c35d87",
+    "sha256hash": "758f4eff34ca475fcd178ee0bfe0efff94b49533b349eb49537dc920d85c8f40",
+    "sha1hash": "d25400c5e267c2dd673e7b3d0cfd54e1b36730a8"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/smart1/kernels/ik/kernels.0001.db b/isis/tests/data/isisdata/mockup/smart1/kernels/ik/kernels.0001.db
new file mode 100644
index 0000000000000000000000000000000000000000..aa3496e2c753daf89c1fbdc364d28bcc2624647c
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/smart1/kernels/ik/kernels.0001.db
@@ -0,0 +1,7 @@
+Object = Instrument
+  Group = Selection
+    Match = ("Instrument","InstrumentId","AMIE")
+    File  = ("smart1", "kernels/ik/SMART1_AMIE_V??.TI")
+  EndGroup
+EndObject
+
diff --git a/isis/tests/data/isisdata/mockup/smart1/kernels/lsk/NAIF0010.TLS b/isis/tests/data/isisdata/mockup/smart1/kernels/lsk/NAIF0010.TLS
new file mode 100644
index 0000000000000000000000000000000000000000..9ac2461903f56fa98bb1ceab733d5d4789451374
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/smart1/kernels/lsk/NAIF0010.TLS
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/smart1/kernels/lsk/NAIF0010.TLS",
+    "filesize": 4920,
+    "createtime": "2012-01-09T09:31:20.000000",
+    "modifiedtime": "2022-11-24T05:59:07.734368",
+    "md5hash": "60c2d3847686f7b0757adc4c468b377d",
+    "sha256hash": "a3826c1f418a9601afdf92be815298aedfd7960b5c00f3a5c469df674e1436b4",
+    "sha1hash": "735834ae8752723c1d9ad1e7d74bb44e6cc2f080"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/smart1/kernels/lsk/NAIF0012.TLS b/isis/tests/data/isisdata/mockup/smart1/kernels/lsk/NAIF0012.TLS
new file mode 100644
index 0000000000000000000000000000000000000000..9b7d90df500bde28d8dd57370134544a4e11390c
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/smart1/kernels/lsk/NAIF0012.TLS
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/smart1/kernels/lsk/NAIF0012.TLS",
+    "filesize": 5257,
+    "createtime": "2022-07-01T07:16:54.000000",
+    "modifiedtime": "2022-11-24T05:59:07.276644",
+    "md5hash": "25a2fff30b0dedb4d76c06727b1895b1",
+    "sha256hash": "678e32bdb5a744117a467cd9601cd6b373f0e9bc9bbde1371d5eee39600a039b",
+    "sha1hash": "09d4bd44f3f72e01d02bc6df06b5db1a6a877351"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/smart1/kernels/lsk/aareadme.txt b/isis/tests/data/isisdata/mockup/smart1/kernels/lsk/aareadme.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1a2dbd05ff32a3ee6c0edac36efd50158178f860
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/smart1/kernels/lsk/aareadme.txt
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/smart1/kernels/lsk/aareadme.txt",
+    "filesize": 3070,
+    "createtime": "2005-08-08T08:25:59.000000",
+    "modifiedtime": "2022-11-24T05:59:07.840309",
+    "md5hash": "ba7c77dcf825d7cff692ec3c8c3bb13f",
+    "sha256hash": "2cbc8bdfb584b331e96c2b7a57f2953ccd893c6e74069e96d59839634a4ca90a",
+    "sha1hash": "670b5fc1148c2b22efa72750bc6d94f3a03602cf"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/smart1/kernels/pck/PCK00008.TPC b/isis/tests/data/isisdata/mockup/smart1/kernels/pck/PCK00008.TPC
new file mode 100644
index 0000000000000000000000000000000000000000..94f25c7d857eea03a0e7e0eefb7671b0e5523377
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/smart1/kernels/pck/PCK00008.TPC
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/smart1/kernels/pck/PCK00008.TPC",
+    "filesize": 111586,
+    "createtime": "2022-08-12T23:45:22.000000",
+    "modifiedtime": "2022-11-24T06:02:50.891075",
+    "md5hash": "9ae96c883cd4982062d23fbdb49568ec",
+    "sha256hash": "ca07df56e9f1bca85a4c6748b618a46c0bf8e081f96f81e324896f2fdc54ea27",
+    "sha1hash": "1a38ba30903cd08d6a84c95d0b433956b0c9f272"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/smart1/kernels/pck/PCK00010.TPC b/isis/tests/data/isisdata/mockup/smart1/kernels/pck/PCK00010.TPC
new file mode 100644
index 0000000000000000000000000000000000000000..01727b91cdc239993e7160c6e17f159ecdb4a1ef
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/smart1/kernels/pck/PCK00010.TPC
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/smart1/kernels/pck/PCK00010.TPC",
+    "filesize": 126143,
+    "createtime": "2011-10-25T08:29:15.000000",
+    "modifiedtime": "2022-11-24T05:59:21.781436",
+    "md5hash": "da153641f7346bd5b6a1226778e0d51b",
+    "sha256hash": "59468328349aa730d18bf1f8d7e86efe6e40b75dfb921908f99321b3a7a701d2",
+    "sha1hash": "cbae4dbfcf6419571f1ab24c7fc2e17e55356f0f"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/smart1/kernels/pck/kernels.0001.db b/isis/tests/data/isisdata/mockup/smart1/kernels/pck/kernels.0001.db
new file mode 100644
index 0000000000000000000000000000000000000000..6489096cac99d5ee4214587142fe7806d7ca387d
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/smart1/kernels/pck/kernels.0001.db
@@ -0,0 +1,5 @@
+Object = TargetAttitudeShape
+  Group = Selection
+    File = ("smart1", "kernels/pck/PCK?????.TPC")
+  EndGroup
+EndObject
diff --git a/isis/tests/data/isisdata/mockup/smart1/kernels/sclk/SMART1_070227_STEP.TSC b/isis/tests/data/isisdata/mockup/smart1/kernels/sclk/SMART1_070227_STEP.TSC
new file mode 100644
index 0000000000000000000000000000000000000000..776d8c4971b3f1cfddba673d0bf503af36788fc2
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/smart1/kernels/sclk/SMART1_070227_STEP.TSC
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/smart1/kernels/sclk/SMART1_070227_STEP.TSC",
+    "filesize": 7769,
+    "createtime": "2007-02-27T17:10:35.000000",
+    "modifiedtime": "2022-11-24T05:59:06.148933",
+    "md5hash": "c3b75c684b61eee7f2517c6a80b04646",
+    "sha256hash": "655d4ab23f08ab1510e1bb5dfb4ee2a3cd18f854776a42500cf8ed592b522403",
+    "sha1hash": "b7cb43601c3f95206aa4911c33fb6c09a51fbfd3"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/smart1/kernels/sclk/aareadme.txt b/isis/tests/data/isisdata/mockup/smart1/kernels/sclk/aareadme.txt
new file mode 100644
index 0000000000000000000000000000000000000000..7f04e603d7c11f1319fc86b120acff7958d4cb28
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/smart1/kernels/sclk/aareadme.txt
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/smart1/kernels/sclk/aareadme.txt",
+    "filesize": 3667,
+    "createtime": "2022-08-12T23:45:22.000000",
+    "modifiedtime": "2022-11-24T06:02:50.710370",
+    "md5hash": "6cf3d1c72e2fb0a71b85776de198ff2f",
+    "sha256hash": "0e9f3e47e3c821386e7a793b8cc53f1a8f3e9368f1cff021049c749ff60b53f2",
+    "sha1hash": "74cd4a5f00063b2960f332b7e65977cdb17f2c38"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/smart1/kernels/sclk/kernels.0001.db b/isis/tests/data/isisdata/mockup/smart1/kernels/sclk/kernels.0001.db
new file mode 100644
index 0000000000000000000000000000000000000000..95029482b251c4d5380faa1044928892bdea055d
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/smart1/kernels/sclk/kernels.0001.db
@@ -0,0 +1,6 @@
+Object = SpacecraftClock
+  Group = Selection
+    File = ("smart1", "kernels/sclk/SMART1_??????_STEP.TSC")
+  EndGroup
+EndObject
+
diff --git a/isis/tests/data/isisdata/mockup/smart1/kernels/spk/ORMS__041111020517_00206.BSP b/isis/tests/data/isisdata/mockup/smart1/kernels/spk/ORMS__041111020517_00206.BSP
new file mode 100644
index 0000000000000000000000000000000000000000..eb038d4b0e7fcc9d4e6b4247d90513f8b215c8d9
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/smart1/kernels/spk/ORMS__041111020517_00206.BSP
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/smart1/kernels/spk/ORMS__041111020517_00206.BSP",
+    "filesize": 59269120,
+    "createtime": "2006-04-24T06:35:53.000000",
+    "modifiedtime": "2022-11-24T06:00:46.588466",
+    "md5hash": "4c16ff86ce3fe01bceb65afa3a93950d",
+    "sha256hash": "bcec01e35e713421a7809410c20942140ffd3781a2f1ac80bd18238e38d72062",
+    "sha1hash": "db329c0fd4b61e3721546488ffe1530f949e0f77"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/smart1/kernels/spk/ORMS_______________00233.BSP b/isis/tests/data/isisdata/mockup/smart1/kernels/spk/ORMS_______________00233.BSP
new file mode 100644
index 0000000000000000000000000000000000000000..0dfac9c46536716a55c6948e3fb9cd7909ed0f78
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/smart1/kernels/spk/ORMS_______________00233.BSP
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/smart1/kernels/spk/ORMS_______________00233.BSP",
+    "filesize": 96624640,
+    "createtime": "2006-09-05T12:58:20.000000",
+    "modifiedtime": "2022-11-24T06:01:48.860734",
+    "md5hash": "ceff5770f3f1af7e004e15996cd982cd",
+    "sha256hash": "f09c05904c886b755021e75dc00a8d641a3bce58e6f74d054c399fad694b2137",
+    "sha1hash": "443228a5bace6cbf7019d09aabbd85bd5702ba6d"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/smart1/kernels/spk/SMART1_STRUCT_V01.BSP b/isis/tests/data/isisdata/mockup/smart1/kernels/spk/SMART1_STRUCT_V01.BSP
new file mode 100644
index 0000000000000000000000000000000000000000..03e8a7859db314711ba766f660ec3d36fd2fcd0d
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/smart1/kernels/spk/SMART1_STRUCT_V01.BSP
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/smart1/kernels/spk/SMART1_STRUCT_V01.BSP",
+    "filesize": 26624,
+    "createtime": "2022-07-01T07:23:32.000000",
+    "modifiedtime": "2022-11-24T05:59:11.364989",
+    "md5hash": "7ad61e0c9cc73c7aab7cf81ae36ef6f9",
+    "sha256hash": "d06c57a570b5e545348471cb237a4d99302069769a77782f6b8a2105b1c663c9",
+    "sha1hash": "6e90eff6cbc8ea972eb3019c12565e501ea2f4f9"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/smart1/kernels/spk/kernels.0001.db b/isis/tests/data/isisdata/mockup/smart1/kernels/spk/kernels.0001.db
new file mode 100644
index 0000000000000000000000000000000000000000..cc12b2c17c26dd1809e26f1ba0412faa3d3f26bb
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/smart1/kernels/spk/kernels.0001.db
@@ -0,0 +1,20 @@
+Object = SpacecraftPosition
+  RunTime = 2008-09-11T16:08:37
+
+  Group = Dependencies
+    LeapsecondKernel = $base/kernels/lsk/naif0009.tls
+  End_Group
+
+  Group = Selection
+    Time = ("2005 AUG 01 00:00:00.000 TDB", "2006 SEP 03 20:00:00.000 TDB")
+    File = $smart1/kernels/spk/ORMS_______________00233.BSP
+    Type = Predicted
+  End_Group
+
+  Group = Selection
+    Time = ("2004 NOV 11 02:05:17.979 TDB", "2005 OCT 01 00:00:00.000 TDB")
+    File = $smart1/kernels/spk/ORMS__041111020517_00206.BSP
+    Type = Reconstructed
+  End_Group
+End_Object
+End
diff --git a/isis/tests/data/isisdata/mockup/smart1/kernels/spk/makedb b/isis/tests/data/isisdata/mockup/smart1/kernels/spk/makedb
new file mode 100644
index 0000000000000000000000000000000000000000..e67690c7538312e5a15196194d1624f8184d3ffa
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/smart1/kernels/spk/makedb
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/smart1/kernels/spk/makedb",
+    "filesize": 368,
+    "createtime": "2022-08-12T23:45:22.000000",
+    "modifiedtime": "2022-11-24T06:02:50.782892",
+    "md5hash": "0ffe92c0dd1ddf396f068aa4297be611",
+    "sha256hash": "cf74f7b78e762db3bb67529162db4098f1f7fad5a779741fe3a21c30ff4d87ec",
+    "sha1hash": "af5da3044b8ee889f43479a5dc56777568e38c69"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/calibration/WA1BLU.CAL.cub b/isis/tests/data/isisdata/mockup/voyager1/calibration/WA1BLU.CAL.cub
new file mode 100644
index 0000000000000000000000000000000000000000..33a24ecf8a58f0f44febaf509e937c36d2fb6f21
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/calibration/WA1BLU.CAL.cub
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/calibration/WA1BLU.CAL.cub",
+    "filesize": 3278825,
+    "createtime": "2022-08-12T23:56:39.000000",
+    "modifiedtime": "2022-11-24T12:14:38.025918",
+    "md5hash": "a368210f98e4277725c5d378941acbfe",
+    "sha256hash": "37d4614afefab668ee7b4fd211696876b5e0b8f645cef2dabbd839d6227ad305",
+    "sha1hash": "a9fa1d178d16ab288d182275dfc3254572e9c444"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/calibration/WA1CLR.CAL.cub b/isis/tests/data/isisdata/mockup/voyager1/calibration/WA1CLR.CAL.cub
new file mode 100644
index 0000000000000000000000000000000000000000..8b90f473b6aeb5f00944a198bf3371e21f76798f
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/calibration/WA1CLR.CAL.cub
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/calibration/WA1CLR.CAL.cub",
+    "filesize": 3278825,
+    "createtime": "2022-08-12T23:56:39.000000",
+    "modifiedtime": "2022-11-24T12:14:37.798781",
+    "md5hash": "5909e9230ce410e654face399ddab875",
+    "sha256hash": "b6326aa0c9adb2119f9148ed97dbb186a4a27fd1a3d452e360a246f7bc311ad0",
+    "sha1hash": "5e11c35d7965115f0bbb8d3d2bdfe8ad152ca4e2"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/calibration/WA1GRN.CAL.cub b/isis/tests/data/isisdata/mockup/voyager1/calibration/WA1GRN.CAL.cub
new file mode 100644
index 0000000000000000000000000000000000000000..952fb4deea23996712179e665fb229fcf0704cbd
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/calibration/WA1GRN.CAL.cub
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/calibration/WA1GRN.CAL.cub",
+    "filesize": 3278825,
+    "createtime": "2022-08-12T23:56:39.000000",
+    "modifiedtime": "2022-11-24T12:14:38.178745",
+    "md5hash": "7c9d630ba974673a2a9f76a2abe3343d",
+    "sha256hash": "c641a133447faf6dce89be380f64efe33f485ea698bee5008a75421619a38a22",
+    "sha1hash": "e534e860f0785582e73d72921a6f1f1292ab6d64"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/calibration/WA1OFF.CAL.cub b/isis/tests/data/isisdata/mockup/voyager1/calibration/WA1OFF.CAL.cub
new file mode 100644
index 0000000000000000000000000000000000000000..67e5c8d201bba50addab78a7763b6d9d6889e982
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/calibration/WA1OFF.CAL.cub
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/calibration/WA1OFF.CAL.cub",
+    "filesize": 3278825,
+    "createtime": "2022-08-12T23:56:39.000000",
+    "modifiedtime": "2022-11-24T12:14:38.115968",
+    "md5hash": "469ab2059ea0a9737d6562c98282af1a",
+    "sha256hash": "7262ce685382f6e5b64c5fd67030b9e2433bbd7cf55fbc7c410efe9b518fe63b",
+    "sha1hash": "8be1f1f435f8aba8ee92625a7a1645c88e72d414"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/calibration/WA1ORG.CAL.cub b/isis/tests/data/isisdata/mockup/voyager1/calibration/WA1ORG.CAL.cub
new file mode 100644
index 0000000000000000000000000000000000000000..2183c3962fae02ade5b71cae251474401206b518
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/calibration/WA1ORG.CAL.cub
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/calibration/WA1ORG.CAL.cub",
+    "filesize": 3278825,
+    "createtime": "2022-08-12T23:56:39.000000",
+    "modifiedtime": "2022-11-24T12:14:37.913981",
+    "md5hash": "a9ebb6f62643364a0a43d4177b981797",
+    "sha256hash": "8e1575245ed225e4d7899722001d0a0e94820a17303d191fc0b13c2eab768425",
+    "sha1hash": "b84ac87634bab0dc37f130565edc3fee9b915bd7"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/calibration/WA1VIO.CAL.cub b/isis/tests/data/isisdata/mockup/voyager1/calibration/WA1VIO.CAL.cub
new file mode 100644
index 0000000000000000000000000000000000000000..965b2bbf81572a36dd509481c73b5b080b00eb68
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/calibration/WA1VIO.CAL.cub
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/calibration/WA1VIO.CAL.cub",
+    "filesize": 3278825,
+    "createtime": "2022-08-12T23:56:40.000000",
+    "modifiedtime": "2022-11-24T12:14:37.327562",
+    "md5hash": "1e59ea54a1458f385a1ae911ad410ce2",
+    "sha256hash": "3ac9cb1d6a2bb699b4b961ca6adc889cfb564972220f4a2a8910930cc5bf4dfd",
+    "sha1hash": "5e436853eaf47e1e4fff2856a0064dcf5fd5a615"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/calibration/voycal.pvl b/isis/tests/data/isisdata/mockup/voyager1/calibration/voycal.pvl
new file mode 100644
index 0000000000000000000000000000000000000000..c6ad74f779b76123e5195ab29fc68f942bc36597
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/calibration/voycal.pvl
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/calibration/voycal.pvl",
+    "filesize": 100345,
+    "createtime": "2022-08-12T23:56:40.000000",
+    "modifiedtime": "2022-11-24T12:14:38.263654",
+    "md5hash": "1370287c54a95f413428d3834500385f",
+    "sha256hash": "d23d0accc753cba228e9960694b4ea2810ff73f508b5d242540f6a58464d9c28",
+    "sha1hash": "b64734e1d9fbea03e241c189e640c94a993e18c5"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/calibration/voylin.pvl b/isis/tests/data/isisdata/mockup/voyager1/calibration/voylin.pvl
new file mode 100644
index 0000000000000000000000000000000000000000..fb93b25b99e8aed0372c71b11107281172d30c4f
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/calibration/voylin.pvl
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/calibration/voylin.pvl",
+    "filesize": 3081,
+    "createtime": "2022-08-12T23:56:40.000000",
+    "modifiedtime": "2022-11-24T12:14:38.380276",
+    "md5hash": "fe1a3506c2bffb9340adc47fd8e0d32a",
+    "sha256hash": "c2be18929678a86daab8506440b24e6fbd564844918d79c68537fa178cc4b231",
+    "sha1hash": "6c18abcb15a6607fafafbf65e2cc2d8a8f9adcff"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/calibration/voylin.pvl.0001 b/isis/tests/data/isisdata/mockup/voyager1/calibration/voylin.pvl.0001
new file mode 100644
index 0000000000000000000000000000000000000000..3ae95d7c0378e6e3be4c65efc41faa9edb5c162a
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/calibration/voylin.pvl.0001
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/calibration/voylin.pvl.0001",
+    "filesize": 51961,
+    "createtime": "2022-08-12T23:56:40.000000",
+    "modifiedtime": "2022-11-24T12:14:38.444725",
+    "md5hash": "1d57b34ba8913bb3e0af5b0f2fd2c5b6",
+    "sha256hash": "4a45d7f830513a6ede63e808a5fbd7da278decac255a4801bab255c82f336afe",
+    "sha1hash": "9deb48db1ac39030d79a2c76d650d7fca795e840"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/aareadme.txt b/isis/tests/data/isisdata/mockup/voyager1/kernels/aareadme.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b33c646842badd53bed843ad42160ac714eb7b93
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/aareadme.txt
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/kernels/aareadme.txt",
+    "filesize": 7092,
+    "createtime": "2022-08-30T15:15:58.000000",
+    "modifiedtime": "2022-11-24T12:13:55.397654",
+    "md5hash": "b43c43eaaced8240151beacbd573e2d9",
+    "sha256hash": "75289b3fd20846e13e3bc540ef9bf9d8929e1109add11f89d6360a371886b8d3",
+    "sha1hash": "622e0892bb1d8bc41c0ec2e96e1208e6d9a2682b"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/ck/kernels.0001.db b/isis/tests/data/isisdata/mockup/voyager1/kernels/ck/kernels.0001.db
new file mode 100644
index 0000000000000000000000000000000000000000..d213b7eeee5291bed2b9617bdc477f7720900eda
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/ck/kernels.0001.db
@@ -0,0 +1,37 @@
+Object = SpacecraftPointing
+  RunTime = 2010-06-22T09:02:08
+
+  Group = Dependencies
+    SpacecraftClockKernel = /usgs/cpkgs/isis3/data/voyager1/kernels/sclk/vg100008.tsc
+    LeapsecondKernel      = /usgs/cpkgs/isis3/data/base/kernels/lsk/naif0009.tls
+  End_Group
+
+  Group = Selection
+    Match = ("Instrument","InstrumentID","WIDE_ANGLE_CAMERA")
+    Time  = ("1980 OCT 25 01:32:35.956 TDB", "1980 DEC 15 23:51:48.341 TDB")
+    File  = ("voyager1", "kernels/ck/vg1_sat_qmw_wa_fc-31100_t2.bc")
+    Type  = Reconstructed
+  End_Group
+
+  Group = Selection
+    Match = ("Instrument","InstrumentID","NARROW_ANGLE_CAMERA")
+    Time  = ("1980 AUG 23 12:44:35.670 TDB", "1980 DEC 15 23:49:24.341 TDB")
+    File  = ("voyager1", "kernels/ck/vg1_sat_qmw_na_fc-31100_t2.bc")
+    Type  = Reconstructed
+  End_Group
+
+  Group = Selection
+    Match = ("Instrument","InstrumentID","WIDE_ANGLE_CAMERA")
+    Time  = ("1979 FEB 04 03:20:35.776 TDB", "1979 APR 13 23:54:20.801 TDB")
+    File  = ("voyager1", "kernels/ck/vg1_jup_qmw_wa_fc-31100_t2.bc")
+    Type  = Reconstructed
+  End_Group
+
+  Group = Selection
+    Match = ("Instrument","InstrumentID","NARROW_ANGLE_CAMERA")
+    Time  = ("1979 JAN 04 23:56:35.135 TDB", "1979 APR 13 23:57:32.801 TDB")
+    File  = ("voyager1", "kernels/ck/vg1_jup_qmw_na_fc-31100_t2.bc")
+    Type  = Reconstructed
+  End_Group
+End_Object
+End
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/ck/kernels.0002.db b/isis/tests/data/isisdata/mockup/voyager1/kernels/ck/kernels.0002.db
new file mode 100644
index 0000000000000000000000000000000000000000..e567d6a74d8ddfd701fde07bfbeffafc0969a5a6
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/ck/kernels.0002.db
@@ -0,0 +1,44 @@
+Object = SpacecraftPointing
+  RunTime = 2010-06-22T09:02:08
+
+  Group = Dependencies
+    SpacecraftClockKernel = /usgs/cpkgs/isis3/data/voyager1/kernels/sclk/vg100008.tsc
+    LeapsecondKernel      = /usgs/cpkgs/isis3/data/base/kernels/lsk/naif0009.tls
+  End_Group
+
+  Group = Selection
+    Match = ("Instrument","InstrumentID","WIDE_ANGLE_CAMERA")
+    Time  = ("1980 OCT 25 01:32:35.956 TDB", "1980 DEC 15 23:51:48.341 TDB")
+    File  = ("voyager1", "kernels/ck/vg1_sat_qmw_wa_fc-31100_t2.bc")
+    Type  = Reconstructed
+  End_Group
+
+  Group = Selection
+    Match = ("Instrument","InstrumentID","NARROW_ANGLE_CAMERA")
+    Time  = ("1980 AUG 23 12:44:35.670 TDB", "1980 DEC 15 23:49:24.341 TDB")
+    File  = ("voyager1", "kernels/ck/vg1_sat_qmw_na_fc-31100_t2.bc")
+    Type  = Reconstructed
+  End_Group
+
+  Group = Selection
+    Match = ("Instrument","InstrumentID","WIDE_ANGLE_CAMERA")
+    Time  = ("1979 FEB 04 03:20:35.776 TDB", "1979 APR 13 23:54:20.801 TDB")
+    File  = ("voyager1", "kernels/ck/vg1_jup_qmw_wa_fc-31100_t2.bc")
+    Type  = Reconstructed
+  End_Group
+
+  Group = Selection
+    Match = ("Instrument","InstrumentID","NARROW_ANGLE_CAMERA")
+    Time  = ("1979 JAN 04 23:56:35.135 TDB", "1979 APR 13 23:57:32.801 TDB")
+    File  = ("voyager1", "kernels/ck/vg1_jup_qmw_na_fc-31100_t2.bc")
+    Type  = Reconstructed
+  End_Group
+
+Group = Selection
+    Time = ("1979 MAR 02 16:20:35.797410 TDB",
+            "1979 MAR 04 19:54:41.392439 TDB")
+    File = $voyager1/kernels/ck/vg1_eur_usgs2020.bc
+    Type = Smithed
+  End_Group
+End_Object
+End
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/ck/kernels_europa.0001.db b/isis/tests/data/isisdata/mockup/voyager1/kernels/ck/kernels_europa.0001.db
new file mode 100644
index 0000000000000000000000000000000000000000..d7866feee338dee3eefb17963521a927e0c5651b
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/ck/kernels_europa.0001.db
@@ -0,0 +1,130 @@
+Object = SpacecraftPointing
+  RunTime = 2021-03-15T19:57:34
+
+  Group = Dependencies
+    SpacecraftClockKernel = $voyager1/kernels/sclk/vg100010.tsc
+    LeapsecondKernel      = $base/kernels/lsk/naif0012.tls
+  End_Group
+
+  Group = Selection
+    Time = ("1979 MAR 02 16:20:35.797410 TDB",
+            "1979 MAR 02 16:20:35.803410 TDB")
+    Time = ("1979 MAR 02 16:22:11.917410 TDB",
+            "1979 MAR 02 16:22:11.923410 TDB")
+    Time = ("1979 MAR 02 16:28:36.067409 TDB",
+            "1979 MAR 02 16:28:36.073410 TDB")
+    Time = ("1979 MAR 02 21:31:48.070410 TDB",
+            "1979 MAR 02 21:31:48.076410 TDB")
+    Time = ("1979 MAR 02 22:46:11.801409 TDB",
+            "1979 MAR 02 22:46:11.807410 TDB")
+    Time = ("1979 MAR 02 22:47:47.921409 TDB",
+            "1979 MAR 02 22:47:47.927410 TDB")
+    Time = ("1979 MAR 02 22:49:23.681409 TDB",
+            "1979 MAR 02 22:49:23.687409 TDB")
+    Time = ("1979 MAR 02 22:50:59.801409 TDB",
+            "1979 MAR 02 22:50:59.807410 TDB")
+    Time = ("1979 MAR 02 22:52:35.441409 TDB",
+            "1979 MAR 02 22:52:35.447409 TDB")
+    Time = ("1979 MAR 02 22:54:12.071409 TDB",
+            "1979 MAR 02 22:54:12.077409 TDB")
+    Time = ("1979 MAR 03 07:09:23.807420 TDB",
+            "1979 MAR 03 07:09:23.813420 TDB")
+    Time = ("1979 MAR 03 07:10:59.447420 TDB",
+            "1979 MAR 03 07:10:59.453420 TDB")
+    Time = ("1979 MAR 03 07:12:36.077419 TDB",
+            "1979 MAR 03 07:12:36.083420 TDB")
+    Time = ("1979 MAR 03 07:14:11.807420 TDB",
+            "1979 MAR 03 07:14:11.813420 TDB")
+    Time = ("1979 MAR 03 07:15:47.927420 TDB",
+            "1979 MAR 03 07:15:47.933420 TDB")
+    Time = ("1979 MAR 03 07:17:23.687420 TDB",
+            "1979 MAR 03 07:17:23.693420 TDB")
+    Time = ("1979 MAR 03 16:24:35.933419 TDB",
+            "1979 MAR 03 16:24:35.939419 TDB")
+    Time = ("1979 MAR 03 16:26:11.453419 TDB",
+            "1979 MAR 03 16:26:11.459419 TDB")
+    Time = ("1979 MAR 03 16:27:48.083420 TDB",
+            "1979 MAR 03 16:27:48.089420 TDB")
+    Time = ("1979 MAR 03 16:29:23.933419 TDB",
+            "1979 MAR 03 16:29:23.939419 TDB")
+    Time = ("1979 MAR 03 16:30:59.933419 TDB",
+            "1979 MAR 03 16:30:59.939419 TDB")
+    Time = ("1979 MAR 03 16:32:35.813419 TDB",
+            "1979 MAR 03 16:32:35.819419 TDB")
+    Time = ("1979 MAR 03 22:19:47.937430 TDB",
+            "1979 MAR 03 22:19:47.943430 TDB")
+    Time = ("1979 MAR 03 22:21:23.457430 TDB",
+            "1979 MAR 03 22:21:23.463430 TDB")
+    Time = ("1979 MAR 03 22:23:00.087430 TDB",
+            "1979 MAR 03 22:23:00.093430 TDB")
+    Time = ("1979 MAR 03 22:24:35.937430 TDB",
+            "1979 MAR 03 22:24:35.943430 TDB")
+    Time = ("1979 MAR 03 22:26:11.937430 TDB",
+            "1979 MAR 03 22:26:11.943430 TDB")
+    Time = ("1979 MAR 03 22:27:47.817430 TDB",
+            "1979 MAR 03 22:27:47.823430 TDB")
+    Time = ("1979 MAR 04 03:57:23.906430 TDB",
+            "1979 MAR 04 03:57:23.912430 TDB")
+    Time = ("1979 MAR 04 03:58:59.426429 TDB",
+            "1979 MAR 04 03:58:59.432430 TDB")
+    Time = ("1979 MAR 04 04:00:36.056429 TDB",
+            "1979 MAR 04 04:00:36.062430 TDB")
+    Time = ("1979 MAR 04 04:02:11.906430 TDB",
+            "1979 MAR 04 04:02:11.912430 TDB")
+    Time = ("1979 MAR 04 04:03:47.905429 TDB",
+            "1979 MAR 04 04:03:47.911430 TDB")
+    Time = ("1979 MAR 04 04:05:23.785429 TDB",
+            "1979 MAR 04 04:05:23.791429 TDB")
+    Time = ("1979 MAR 04 06:13:23.885429 TDB",
+            "1979 MAR 04 06:13:23.891430 TDB")
+    Time = ("1979 MAR 04 06:14:59.405429 TDB",
+            "1979 MAR 04 06:14:59.411430 TDB")
+    Time = ("1979 MAR 04 06:16:36.034430 TDB",
+            "1979 MAR 04 06:16:36.040430 TDB")
+    Time = ("1979 MAR 04 06:18:11.884429 TDB",
+            "1979 MAR 04 06:18:11.890429 TDB")
+    Time = ("1979 MAR 04 06:19:47.884429 TDB",
+            "1979 MAR 04 06:19:47.890429 TDB")
+    Time = ("1979 MAR 04 06:21:23.764429 TDB",
+            "1979 MAR 04 06:21:23.770429 TDB")
+    Time = ("1979 MAR 04 10:15:48.014429 TDB",
+            "1979 MAR 04 10:15:48.020429 TDB")
+    Time = ("1979 MAR 04 10:18:59.864429 TDB",
+            "1979 MAR 04 10:18:59.870429 TDB")
+    Time = ("1979 MAR 04 10:20:35.744429 TDB",
+            "1979 MAR 04 10:20:35.750429 TDB")
+    Time = ("1979 MAR 04 12:55:48.014429 TDB",
+            "1979 MAR 04 12:55:48.020429 TDB")
+    Time = ("1979 MAR 04 12:57:23.864429 TDB",
+            "1979 MAR 04 12:57:23.870429 TDB")
+    Time = ("1979 MAR 04 12:58:59.924430 TDB",
+            "1979 MAR 04 12:58:59.930430 TDB")
+    Time = ("1979 MAR 04 13:00:35.744429 TDB",
+            "1979 MAR 04 13:00:35.750429 TDB")
+    Time = ("1979 MAR 04 13:02:11.864429 TDB",
+            "1979 MAR 04 13:02:11.870429 TDB")
+    Time = ("1979 MAR 04 13:03:47.384429 TDB",
+            "1979 MAR 04 13:03:47.390429 TDB")
+    Time = ("1979 MAR 04 19:41:24.016440 TDB",
+            "1979 MAR 04 19:41:24.022440 TDB")
+    Time = ("1979 MAR 04 19:43:00.016440 TDB",
+            "1979 MAR 04 19:43:00.022440 TDB")
+    Time = ("1979 MAR 04 19:44:36.016440 TDB",
+            "1979 MAR 04 19:44:36.022440 TDB")
+    Time = ("1979 MAR 04 19:46:12.016440 TDB",
+            "1979 MAR 04 19:46:12.022440 TDB")
+    Time = ("1979 MAR 04 19:47:47.866439 TDB",
+            "1979 MAR 04 19:47:47.872439 TDB")
+    Time = ("1979 MAR 04 19:49:23.926440 TDB",
+            "1979 MAR 04 19:49:23.932440 TDB")
+    Time = ("1979 MAR 04 19:50:59.746439 TDB",
+            "1979 MAR 04 19:50:59.752439 TDB")
+    Time = ("1979 MAR 04 19:52:35.866439 TDB",
+            "1979 MAR 04 19:52:35.872439 TDB")
+    Time = ("1979 MAR 04 19:54:11.386439 TDB",
+            "1979 MAR 04 19:54:11.392439 TDB")
+    File = $voyager1/kernels/ck/vg1_eur_usgs2020.bc
+    Type = Smithed
+  End_Group
+End_Object
+End
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/ck/kernels_europa.0002.db b/isis/tests/data/isisdata/mockup/voyager1/kernels/ck/kernels_europa.0002.db
new file mode 100644
index 0000000000000000000000000000000000000000..a8b98a910418e78f3e640bdfbac78d935f567714
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/ck/kernels_europa.0002.db
@@ -0,0 +1,130 @@
+Object = SpacecraftPointing
+  RunTime = 2021-03-15T20:53:09
+
+  Group = Dependencies
+    SpacecraftClockKernel = $voyager1/kernels/sclk/vg100008.tsc
+    LeapsecondKernel      = $base/kernels/lsk/naif0009.tls
+  End_Group
+
+  Group = Selection
+    Time = ("1979 MAR 02 16:20:35.797410 TDB",
+            "1979 MAR 02 16:20:35.803410 TDB")
+    Time = ("1979 MAR 02 16:22:11.917410 TDB",
+            "1979 MAR 02 16:22:11.923410 TDB")
+    Time = ("1979 MAR 02 16:28:36.067409 TDB",
+            "1979 MAR 02 16:28:36.073410 TDB")
+    Time = ("1979 MAR 02 21:31:48.070410 TDB",
+            "1979 MAR 02 21:31:48.076410 TDB")
+    Time = ("1979 MAR 02 22:46:11.801409 TDB",
+            "1979 MAR 02 22:46:11.807410 TDB")
+    Time = ("1979 MAR 02 22:47:47.921409 TDB",
+            "1979 MAR 02 22:47:47.927410 TDB")
+    Time = ("1979 MAR 02 22:49:23.681409 TDB",
+            "1979 MAR 02 22:49:23.687409 TDB")
+    Time = ("1979 MAR 02 22:50:59.801409 TDB",
+            "1979 MAR 02 22:50:59.807410 TDB")
+    Time = ("1979 MAR 02 22:52:35.441409 TDB",
+            "1979 MAR 02 22:52:35.447409 TDB")
+    Time = ("1979 MAR 02 22:54:12.071409 TDB",
+            "1979 MAR 02 22:54:12.077409 TDB")
+    Time = ("1979 MAR 03 07:09:23.807420 TDB",
+            "1979 MAR 03 07:09:23.813420 TDB")
+    Time = ("1979 MAR 03 07:10:59.447420 TDB",
+            "1979 MAR 03 07:10:59.453420 TDB")
+    Time = ("1979 MAR 03 07:12:36.077419 TDB",
+            "1979 MAR 03 07:12:36.083420 TDB")
+    Time = ("1979 MAR 03 07:14:11.807420 TDB",
+            "1979 MAR 03 07:14:11.813420 TDB")
+    Time = ("1979 MAR 03 07:15:47.927420 TDB",
+            "1979 MAR 03 07:15:47.933420 TDB")
+    Time = ("1979 MAR 03 07:17:23.687420 TDB",
+            "1979 MAR 03 07:17:23.693420 TDB")
+    Time = ("1979 MAR 03 16:24:35.933419 TDB",
+            "1979 MAR 03 16:24:35.939419 TDB")
+    Time = ("1979 MAR 03 16:26:11.453419 TDB",
+            "1979 MAR 03 16:26:11.459419 TDB")
+    Time = ("1979 MAR 03 16:27:48.083420 TDB",
+            "1979 MAR 03 16:27:48.089420 TDB")
+    Time = ("1979 MAR 03 16:29:23.933419 TDB",
+            "1979 MAR 03 16:29:23.939419 TDB")
+    Time = ("1979 MAR 03 16:30:59.933419 TDB",
+            "1979 MAR 03 16:30:59.939419 TDB")
+    Time = ("1979 MAR 03 16:32:35.813419 TDB",
+            "1979 MAR 03 16:32:35.819419 TDB")
+    Time = ("1979 MAR 03 22:19:47.937430 TDB",
+            "1979 MAR 03 22:19:47.943430 TDB")
+    Time = ("1979 MAR 03 22:21:23.457430 TDB",
+            "1979 MAR 03 22:21:23.463430 TDB")
+    Time = ("1979 MAR 03 22:23:00.087430 TDB",
+            "1979 MAR 03 22:23:00.093430 TDB")
+    Time = ("1979 MAR 03 22:24:35.937430 TDB",
+            "1979 MAR 03 22:24:35.943430 TDB")
+    Time = ("1979 MAR 03 22:26:11.937430 TDB",
+            "1979 MAR 03 22:26:11.943430 TDB")
+    Time = ("1979 MAR 03 22:27:47.817430 TDB",
+            "1979 MAR 03 22:27:47.823430 TDB")
+    Time = ("1979 MAR 04 03:57:23.906430 TDB",
+            "1979 MAR 04 03:57:23.912430 TDB")
+    Time = ("1979 MAR 04 03:58:59.426429 TDB",
+            "1979 MAR 04 03:58:59.432430 TDB")
+    Time = ("1979 MAR 04 04:00:36.056429 TDB",
+            "1979 MAR 04 04:00:36.062430 TDB")
+    Time = ("1979 MAR 04 04:02:11.906430 TDB",
+            "1979 MAR 04 04:02:11.912430 TDB")
+    Time = ("1979 MAR 04 04:03:47.905429 TDB",
+            "1979 MAR 04 04:03:47.911430 TDB")
+    Time = ("1979 MAR 04 04:05:23.785429 TDB",
+            "1979 MAR 04 04:05:23.791429 TDB")
+    Time = ("1979 MAR 04 06:13:23.885429 TDB",
+            "1979 MAR 04 06:13:23.891430 TDB")
+    Time = ("1979 MAR 04 06:14:59.405429 TDB",
+            "1979 MAR 04 06:14:59.411430 TDB")
+    Time = ("1979 MAR 04 06:16:36.034430 TDB",
+            "1979 MAR 04 06:16:36.040430 TDB")
+    Time = ("1979 MAR 04 06:18:11.884429 TDB",
+            "1979 MAR 04 06:18:11.890429 TDB")
+    Time = ("1979 MAR 04 06:19:47.884429 TDB",
+            "1979 MAR 04 06:19:47.890429 TDB")
+    Time = ("1979 MAR 04 06:21:23.764429 TDB",
+            "1979 MAR 04 06:21:23.770429 TDB")
+    Time = ("1979 MAR 04 10:15:48.014429 TDB",
+            "1979 MAR 04 10:15:48.020429 TDB")
+    Time = ("1979 MAR 04 10:18:59.864429 TDB",
+            "1979 MAR 04 10:18:59.870429 TDB")
+    Time = ("1979 MAR 04 10:20:35.744429 TDB",
+            "1979 MAR 04 10:20:35.750429 TDB")
+    Time = ("1979 MAR 04 12:55:48.014429 TDB",
+            "1979 MAR 04 12:55:48.020429 TDB")
+    Time = ("1979 MAR 04 12:57:23.864429 TDB",
+            "1979 MAR 04 12:57:23.870429 TDB")
+    Time = ("1979 MAR 04 12:58:59.924430 TDB",
+            "1979 MAR 04 12:58:59.930430 TDB")
+    Time = ("1979 MAR 04 13:00:35.744429 TDB",
+            "1979 MAR 04 13:00:35.750429 TDB")
+    Time = ("1979 MAR 04 13:02:11.864429 TDB",
+            "1979 MAR 04 13:02:11.870429 TDB")
+    Time = ("1979 MAR 04 13:03:47.384429 TDB",
+            "1979 MAR 04 13:03:47.390429 TDB")
+    Time = ("1979 MAR 04 19:41:24.016440 TDB",
+            "1979 MAR 04 19:41:24.022440 TDB")
+    Time = ("1979 MAR 04 19:43:00.016440 TDB",
+            "1979 MAR 04 19:43:00.022440 TDB")
+    Time = ("1979 MAR 04 19:44:36.016440 TDB",
+            "1979 MAR 04 19:44:36.022440 TDB")
+    Time = ("1979 MAR 04 19:46:12.016440 TDB",
+            "1979 MAR 04 19:46:12.022440 TDB")
+    Time = ("1979 MAR 04 19:47:47.866439 TDB",
+            "1979 MAR 04 19:47:47.872439 TDB")
+    Time = ("1979 MAR 04 19:49:23.926440 TDB",
+            "1979 MAR 04 19:49:23.932440 TDB")
+    Time = ("1979 MAR 04 19:50:59.746439 TDB",
+            "1979 MAR 04 19:50:59.752439 TDB")
+    Time = ("1979 MAR 04 19:52:35.866439 TDB",
+            "1979 MAR 04 19:52:35.872439 TDB")
+    Time = ("1979 MAR 04 19:54:11.386439 TDB",
+            "1979 MAR 04 19:54:11.392439 TDB")
+    File = $voyager1/kernels/ck/vg1_eur_usgs2020.bc
+    Type = Smithed
+  End_Group
+End_Object
+End
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/ck/makedb b/isis/tests/data/isisdata/mockup/voyager1/kernels/ck/makedb
new file mode 100644
index 0000000000000000000000000000000000000000..604d1aeae50bb1d320e16c6df91e87156b58b604
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/ck/makedb
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/kernels/ck/makedb",
+    "filesize": 403,
+    "createtime": "2022-08-12T23:56:40.000000",
+    "modifiedtime": "2022-11-24T12:14:40.779878",
+    "md5hash": "1825db6e8b82ad5e264e388a4bbcb9d0",
+    "sha256hash": "14ceba6eccaadc3e69170eac580151548b416151de63df100b3456258c1c3d1e",
+    "sha1hash": "e90f3c32c327cca4583ad4fef5d2caad522aae9f"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/ck/vg1_eur_usgs2020.bc b/isis/tests/data/isisdata/mockup/voyager1/kernels/ck/vg1_eur_usgs2020.bc
new file mode 100644
index 0000000000000000000000000000000000000000..8499ee88b497f21aa19ae18d93eb2d979d849f33
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/ck/vg1_eur_usgs2020.bc
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/kernels/ck/vg1_eur_usgs2020.bc",
+    "filesize": 87040,
+    "createtime": "2022-08-12T23:56:40.000000",
+    "modifiedtime": "2022-11-24T12:14:40.873008",
+    "md5hash": "48240ae8ff6a9e6d6b2bb9033b6ee161",
+    "sha256hash": "f90f02939825ecaf0ca747c44056df9145560da9481d2845cfd777e98b7a941f",
+    "sha1hash": "9b577f56fa6bb64f2261e97214a98d526b5bc933"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/ck/vg1_jup_qmw_na_fc-31100_t2.bc b/isis/tests/data/isisdata/mockup/voyager1/kernels/ck/vg1_jup_qmw_na_fc-31100_t2.bc
new file mode 100644
index 0000000000000000000000000000000000000000..b1ef3dd7ec9e988c4d71544cd8df2b0c09a750d0
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/ck/vg1_jup_qmw_na_fc-31100_t2.bc
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/kernels/ck/vg1_jup_qmw_na_fc-31100_t2.bc",
+    "filesize": 1112064,
+    "createtime": "2022-08-12T23:56:40.000000",
+    "modifiedtime": "2022-11-24T12:14:41.066777",
+    "md5hash": "7f98eb42a2849a6cc7d529a0501711c7",
+    "sha256hash": "a99c9692db210cba295be65fa2b7d753aca5fa6a1b63f006aa0c853a08d460ba",
+    "sha1hash": "95149537a21811b53078136baed10b2f5dd21b0f"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/ck/vg1_jup_qmw_wa_fc-31100.bc b/isis/tests/data/isisdata/mockup/voyager1/kernels/ck/vg1_jup_qmw_wa_fc-31100.bc
new file mode 100644
index 0000000000000000000000000000000000000000..c09646c67f5bf128819ab0486f4065e908c0d49b
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/ck/vg1_jup_qmw_wa_fc-31100.bc
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/kernels/ck/vg1_jup_qmw_wa_fc-31100.bc",
+    "filesize": 161792,
+    "createtime": "2022-08-12T23:56:40.000000",
+    "modifiedtime": "2022-11-24T12:14:41.001872",
+    "md5hash": "521627122d0d896a402ee08c112286bd",
+    "sha256hash": "e65b356b2da907e4545ca6b0e2c159f51af7612351bf18b6c167d0c505c4246f",
+    "sha1hash": "78d9c315527b1424b013e9cb23d2820f4ae71c9e"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/ck/vg1_jup_qmw_wa_fc-31100_t2.bc b/isis/tests/data/isisdata/mockup/voyager1/kernels/ck/vg1_jup_qmw_wa_fc-31100_t2.bc
new file mode 100644
index 0000000000000000000000000000000000000000..8276d25edeb37f2225930d536319e076b94f7758
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/ck/vg1_jup_qmw_wa_fc-31100_t2.bc
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/kernels/ck/vg1_jup_qmw_wa_fc-31100_t2.bc",
+    "filesize": 320512,
+    "createtime": "2022-08-12T23:56:40.000000",
+    "modifiedtime": "2022-11-24T12:14:41.215298",
+    "md5hash": "fb70a5b0322489e59de46ee247d3d2ae",
+    "sha256hash": "235084c21640f9024c91a6e93fc3acfc1e4639633964194f2c29cb66ad8fa946",
+    "sha1hash": "840a649467e20060a03e2f06a5eab063d49b1ed0"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/ck/vg1_sat_qmw_na_fc-31100_t2.bc b/isis/tests/data/isisdata/mockup/voyager1/kernels/ck/vg1_sat_qmw_na_fc-31100_t2.bc
new file mode 100644
index 0000000000000000000000000000000000000000..a3169f159cf6be95c5194053a4b49801d6981309
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/ck/vg1_sat_qmw_na_fc-31100_t2.bc
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/kernels/ck/vg1_sat_qmw_na_fc-31100_t2.bc",
+    "filesize": 918528,
+    "createtime": "2022-08-12T23:56:40.000000",
+    "modifiedtime": "2022-11-24T12:14:42.144779",
+    "md5hash": "b16b41e707eaed27b2faabf95f195102",
+    "sha256hash": "d07bd5c07a473326687163f68bee2e8bb58e5dd2f669d53f795fa489e90c4afb",
+    "sha1hash": "49561b7b83bc27c0fe0ec73dc3af150ac918b232"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/ck/vg1_sat_qmw_wa_fc-31100_t2.bc b/isis/tests/data/isisdata/mockup/voyager1/kernels/ck/vg1_sat_qmw_wa_fc-31100_t2.bc
new file mode 100644
index 0000000000000000000000000000000000000000..0ea3acd39f0e841bc24677d11e687fa6a2c07eda
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/ck/vg1_sat_qmw_wa_fc-31100_t2.bc
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/kernels/ck/vg1_sat_qmw_wa_fc-31100_t2.bc",
+    "filesize": 456704,
+    "createtime": "2022-08-12T23:56:40.000000",
+    "modifiedtime": "2022-11-24T12:14:42.364121",
+    "md5hash": "4dee5012d029f66178edbf652b621cc9",
+    "sha256hash": "ff9cb1c555ab31ab46212d4d260f23819f98a362bcc0de225a87e21523db7fd7",
+    "sha1hash": "a7e54e7c69d5a03ef0c18ca17daa219e13903570"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/ck/vgr1_super_v2.bc b/isis/tests/data/isisdata/mockup/voyager1/kernels/ck/vgr1_super_v2.bc
new file mode 100644
index 0000000000000000000000000000000000000000..0d703ef236828bdbc90e7f527ba98266560f7f73
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/ck/vgr1_super_v2.bc
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/kernels/ck/vgr1_super_v2.bc",
+    "filesize": 18109440,
+    "createtime": "2015-11-17T23:09:21.000000",
+    "modifiedtime": "2022-11-24T12:14:01.662231",
+    "md5hash": "eda5bb712dbe8ec9eeda1fd7ce19a160",
+    "sha256hash": "7eca0d844535e9ae71366a0a2dbf791f49819ee554fe88d97f0c77f9f9b47e18",
+    "sha1hash": "ba13466158f2eafd77ed826ac5524cf02fb10976"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/fk/kernels.0001.db b/isis/tests/data/isisdata/mockup/voyager1/kernels/fk/kernels.0001.db
new file mode 100644
index 0000000000000000000000000000000000000000..38d81478f410056b426accdb602cc620a6aede6f
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/fk/kernels.0001.db
@@ -0,0 +1,5 @@
+Object = Frame
+  Group = Selection
+    File = ("voyager1","kernels/fk/vg1_v??.tf")
+  EndGroup
+EndObject
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/fk/vg1_v02.tf b/isis/tests/data/isisdata/mockup/voyager1/kernels/fk/vg1_v02.tf
new file mode 100644
index 0000000000000000000000000000000000000000..ee65cbcb72fb26a2870928a786d092fe53f29f7f
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/fk/vg1_v02.tf
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/kernels/fk/vg1_v02.tf",
+    "filesize": 11752,
+    "createtime": "2022-08-12T23:56:41.000000",
+    "modifiedtime": "2022-11-24T12:14:35.300418",
+    "md5hash": "8e39162117caa531f2b05c0385c2bbe2",
+    "sha256hash": "fbca0c6f48ed373fe3106c972afb013969cade915a53f5fe22d403414fcd5e97",
+    "sha1hash": "c0ee8df3944a75d069b6b9188c83e9a28f187334"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/fk/vg2_v02.tf b/isis/tests/data/isisdata/mockup/voyager1/kernels/fk/vg2_v02.tf
new file mode 100644
index 0000000000000000000000000000000000000000..1a837dc623f8003e13446913f825fbeff7844553
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/fk/vg2_v02.tf
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/kernels/fk/vg2_v02.tf",
+    "filesize": 12008,
+    "createtime": "2001-01-10T15:57:02.000000",
+    "modifiedtime": "2022-11-24T12:13:55.862777",
+    "md5hash": "7d51cf7159169cebab45fb854af4cbb5",
+    "sha256hash": "aa529b2dbf43b7f925b3e81e86a3d7e74a4d99c392113197e5f6d5bf13c37fcb",
+    "sha1hash": "3d5e2314889ccddeb73787b0d6b9877a668dd6c5"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/iak/kernels.0001.db b/isis/tests/data/isisdata/mockup/voyager1/kernels/iak/kernels.0001.db
new file mode 100644
index 0000000000000000000000000000000000000000..e728fe97284b04f88b0defdb0ce3ab541a2b5cf4
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/iak/kernels.0001.db
@@ -0,0 +1,7 @@
+Object = InstrumentAddendum
+  Group = Selection
+    File = ("voyager1","kernels/iak/voyagerAddendum???.ti")
+  EndGroup
+EndObject
+
+
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/iak/voyagerAddendum003.ti b/isis/tests/data/isisdata/mockup/voyager1/kernels/iak/voyagerAddendum003.ti
new file mode 100644
index 0000000000000000000000000000000000000000..8e77ce52d09e0019f779f29cc3063130b36864bf
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/iak/voyagerAddendum003.ti
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/kernels/iak/voyagerAddendum003.ti",
+    "filesize": 1085,
+    "createtime": "2022-08-12T23:56:41.000000",
+    "modifiedtime": "2022-11-24T12:14:39.061992",
+    "md5hash": "aa0695278c4a4bed14ae75cf0c89832f",
+    "sha256hash": "57244f475765fede36f2f8f5300cd4d31e487c44147e67b524a0f8d07ea0202e",
+    "sha1hash": "506df791c08b4418789c8ff8c6f94ff641eceab5"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/iak/voyagerAddendum004.ti b/isis/tests/data/isisdata/mockup/voyager1/kernels/iak/voyagerAddendum004.ti
new file mode 100644
index 0000000000000000000000000000000000000000..774ea5d059b5d045efdee79871ef8a463734e297
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/iak/voyagerAddendum004.ti
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/kernels/iak/voyagerAddendum004.ti",
+    "filesize": 1233,
+    "createtime": "2022-08-12T23:56:41.000000",
+    "modifiedtime": "2022-11-24T12:14:38.994727",
+    "md5hash": "932f49357411040f511bc8a102cf0de2",
+    "sha256hash": "c2d59e0b5dd303b814e62d0f6cf565b4189619d22795fb7de065f252e10ff245",
+    "sha1hash": "7dec0b5ccb43ef4f33d3ee785461da0bec77f87f"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/ik/kernels.0001.db b/isis/tests/data/isisdata/mockup/voyager1/kernels/ik/kernels.0001.db
new file mode 100644
index 0000000000000000000000000000000000000000..ac465af7cd5cd589acfb15a98a3eb68450c51f99
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/ik/kernels.0001.db
@@ -0,0 +1,12 @@
+Object = Instrument
+  Group = Selection
+    Match = ("Instrument","InstrumentId","NARROW_ANGLE_CAMERA")
+    File  = ("voyager1","kernels/ik/vg1_issna_v??.ti")
+  EndGroup
+  Group = Selection
+    Match = ("Instrument","InstrumentId","WIDE_ANGLE_CAMERA")
+    File  = ("voyager1","kernels/ik/vg1_isswa_v??.ti")
+  EndGroup
+EndObject
+
+
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/ik/vg1_issna_v02.ti b/isis/tests/data/isisdata/mockup/voyager1/kernels/ik/vg1_issna_v02.ti
new file mode 100644
index 0000000000000000000000000000000000000000..70eefc1d3d423e185e952e5b74f4d32ab1c396da
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/ik/vg1_issna_v02.ti
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/kernels/ik/vg1_issna_v02.ti",
+    "filesize": 1245,
+    "createtime": "2022-08-12T23:56:41.000000",
+    "modifiedtime": "2022-11-24T12:14:35.255955",
+    "md5hash": "0a9f2d91f8a846091002bd5e9aca3875",
+    "sha256hash": "b21f948cedbab7a7d2f3ed35d77466f114c7067c40a7e80b26b528c9e43ced3f",
+    "sha1hash": "18215377347abaf4ba329fc25608ae9b40749223"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/ik/vg1_isswa_v01.ti b/isis/tests/data/isisdata/mockup/voyager1/kernels/ik/vg1_isswa_v01.ti
new file mode 100644
index 0000000000000000000000000000000000000000..ce8cae2aca6d4e1d9df2cc9b31a22cd6714405f5
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/ik/vg1_isswa_v01.ti
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/kernels/ik/vg1_isswa_v01.ti",
+    "filesize": 1107,
+    "createtime": "2022-08-12T23:56:41.000000",
+    "modifiedtime": "2022-11-24T12:14:35.238314",
+    "md5hash": "a97bc92a088ace29361bb40e989da9a9",
+    "sha256hash": "799bec6e23c274ca32dce068bce1bb1b5015223eafe0b5e02969eca1ec893002",
+    "sha1hash": "a6c80893a9981622c8a71e11681b66d049c94a48"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/ik/vg2_issna_v02.ti b/isis/tests/data/isisdata/mockup/voyager1/kernels/ik/vg2_issna_v02.ti
new file mode 100644
index 0000000000000000000000000000000000000000..4f851397d59f2daf8593f9d86e8d13a156408971
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/ik/vg2_issna_v02.ti
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/kernels/ik/vg2_issna_v02.ti",
+    "filesize": 1246,
+    "createtime": "2001-01-10T15:40:24.000000",
+    "modifiedtime": "2022-11-24T12:13:55.862890",
+    "md5hash": "c41e6458d50fd6885c904c578aa15304",
+    "sha256hash": "0528b1ea7e0f825515f05f07d735611cf49b24de3566d95a88ba91086ee0a8e9",
+    "sha1hash": "b6d349d8585076d96649d5cc12234e9845c2262d"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/ik/vg2_isswa_v01.ti b/isis/tests/data/isisdata/mockup/voyager1/kernels/ik/vg2_isswa_v01.ti
new file mode 100644
index 0000000000000000000000000000000000000000..446e5de0203255a8075785daad48dac9208ec637
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/ik/vg2_isswa_v01.ti
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/kernels/ik/vg2_isswa_v01.ti",
+    "filesize": 1107,
+    "createtime": "2001-01-10T15:40:56.000000",
+    "modifiedtime": "2022-11-24T12:13:56.280555",
+    "md5hash": "8c0e6411acd00c543ea44581bf3ab3da",
+    "sha256hash": "a5f60c6342ac8cc9186eb9eec02d7689404e308d3955b6a2566f7d8d328f0ef2",
+    "sha1hash": "b5d91f05efd00690187982438e51e6e2290619da"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/lsk/aareadme.txt b/isis/tests/data/isisdata/mockup/voyager1/kernels/lsk/aareadme.txt
new file mode 100644
index 0000000000000000000000000000000000000000..871863431f49b79c3099ae22ade50bff507c56ac
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/lsk/aareadme.txt
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/kernels/lsk/aareadme.txt",
+    "filesize": 279,
+    "createtime": "2012-02-14T18:42:44.000000",
+    "modifiedtime": "2022-11-24T12:13:55.581087",
+    "md5hash": "84790549f4457f04e9360004ec72d48f",
+    "sha256hash": "ca2d4f2dc2a3c6d74451d55bd9d38084a6a18a0f0c5ad5a8fbd12becd8fcd280",
+    "sha1hash": "2b5c463124db26b03fba3a137d0dddcce7e85840"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/pck/aareadme.txt b/isis/tests/data/isisdata/mockup/voyager1/kernels/pck/aareadme.txt
new file mode 100644
index 0000000000000000000000000000000000000000..73434d59183d1f670b68c7f3edc811bebd6e6417
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/pck/aareadme.txt
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/kernels/pck/aareadme.txt",
+    "filesize": 361,
+    "createtime": "2012-03-02T20:38:42.000000",
+    "modifiedtime": "2022-11-24T12:13:55.655180",
+    "md5hash": "c8fd70d85a734d2d0e2230d1608bb1ff",
+    "sha256hash": "97325dd927416bc82aa4ab6586d413d9623b7898a4f499a7af29777a37be83e5",
+    "sha1hash": "5c60cdaafaf2b7a03fe0cdf008854ce5bb552d4e"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/pck/kernels.0001.db b/isis/tests/data/isisdata/mockup/voyager1/kernels/pck/kernels.0001.db
new file mode 100644
index 0000000000000000000000000000000000000000..8b36387eb6279d68275537cdc4a1d68f8f0acb6c
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/pck/kernels.0001.db
@@ -0,0 +1,19 @@
+# history:
+#   2021-03-15 Kristin Berry - Original Version. Added to support smithed Europa PCK. 
+
+Object = TargetAttitudeShape
+
+  Group = Selection
+    File = ("base", "kernels/pck/pck?????.tpc")
+  EndGroup
+
+  # This PCK is hardcoded for use with the smithed CKs from the USGS for Europa
+  Group = Selection
+    Match = ("Instrument", "TargetName", "Europa")
+    File = ("base", "kernels/pck/pck?????.tpc")
+    File = ("galileo", "kernels/pck/pck00010_msgr_v23_europa2020.tpc")
+    Type = Smithed
+  End_Group
+  
+End_Object
+End
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/pck/pck00010_msgr_v23_europa2020.tpc b/isis/tests/data/isisdata/mockup/voyager1/kernels/pck/pck00010_msgr_v23_europa2020.tpc
new file mode 100644
index 0000000000000000000000000000000000000000..caaea4d1d2b40a778cac7e9d87ca43439423a354
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/pck/pck00010_msgr_v23_europa2020.tpc
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/kernels/pck/pck00010_msgr_v23_europa2020.tpc",
+    "filesize": 141312,
+    "createtime": "2022-08-12T23:56:41.000000",
+    "modifiedtime": "2022-11-24T12:14:38.994728",
+    "md5hash": "8443f44f50ced8047e2d56544b46f562",
+    "sha256hash": "3d5bc73a07931fea5a4907032f22bf4c1511a69ff6f0a69e588e8079cab85a8b",
+    "sha1hash": "ec5229a92bcc7436f6698071562db093199b3262"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/sclk/kernels.0001.db b/isis/tests/data/isisdata/mockup/voyager1/kernels/sclk/kernels.0001.db
new file mode 100644
index 0000000000000000000000000000000000000000..0daf3c7094819d641151f77e05338e6f2dbae820
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/sclk/kernels.0001.db
@@ -0,0 +1,7 @@
+Object = SpacecraftClock
+  Group = Selection
+    File = ("voyager1","kernels/sclk/vg1?????.tsc")
+  EndGroup
+EndObject
+
+
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/sclk/vg100008.tsc b/isis/tests/data/isisdata/mockup/voyager1/kernels/sclk/vg100008.tsc
new file mode 100644
index 0000000000000000000000000000000000000000..bf223b82d88d14520e814571f2a1dbda58fff83e
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/sclk/vg100008.tsc
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/kernels/sclk/vg100008.tsc",
+    "filesize": 65226,
+    "createtime": "2022-08-12T23:56:41.000000",
+    "modifiedtime": "2022-11-24T12:14:39.829752",
+    "md5hash": "cf63dd4e4d20b077c300622d2f9079ae",
+    "sha256hash": "8ee9ee6bc896b5f29b0edd932044fe51286d8c440d9cf5145114721a3650bace",
+    "sha1hash": "53b6f10d71ce1f3bc5fe2d98d413492f9cd5e387"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/sclk/vg100010.tsc b/isis/tests/data/isisdata/mockup/voyager1/kernels/sclk/vg100010.tsc
new file mode 100644
index 0000000000000000000000000000000000000000..15480a69acf15533d147287df60c4f058494b2a5
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/sclk/vg100010.tsc
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/kernels/sclk/vg100010.tsc",
+    "filesize": 70562,
+    "createtime": "2022-08-12T23:56:41.000000",
+    "modifiedtime": "2022-11-24T12:14:39.909542",
+    "md5hash": "1e629510ddb73bce2560a740179ba5d9",
+    "sha256hash": "f9d8d6ec91d76ac692b22b472682de32262ad7787705c56d559f897fb4d72df4",
+    "sha1hash": "c1ccbd4076a55acf7b8cfe49339d53f7da67a0dd"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/sclk/vg100043.tsc b/isis/tests/data/isisdata/mockup/voyager1/kernels/sclk/vg100043.tsc
new file mode 100644
index 0000000000000000000000000000000000000000..1530642c81c04d7b6dcc5da08b614e1f81274529
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/sclk/vg100043.tsc
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/kernels/sclk/vg100043.tsc",
+    "filesize": 88865,
+    "createtime": "2022-10-05T05:32:14.000000",
+    "modifiedtime": "2022-11-24T12:13:56.111131",
+    "md5hash": "68c896d0e8687c863d876266a437ce20",
+    "sha256hash": "5bba57ad1604d70d81a7110c5845931411b9a76acfcb4654beca44e4704bf716",
+    "sha1hash": "fb23324a89d5065390bc1494e08b19fd5d1a4f2b"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/spk/kernels.0001.db b/isis/tests/data/isisdata/mockup/voyager1/kernels/spk/kernels.0001.db
new file mode 100644
index 0000000000000000000000000000000000000000..1ad2a344e774883dcf618a9a12b0485e471ae714
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/spk/kernels.0001.db
@@ -0,0 +1,28 @@
+Object = SpacecraftPosition
+  RunTime = 2010-07-27T16:35:25
+
+  Group = Dependencies
+    LeapsecondKernel = /usgs/cpkgs/isis3/data/base/kernels/lsk/naif0009.tls
+  End_Group
+
+  Group = Selection
+    Time = ("1979 FEB 06 00:00:50.184 TDB", "1979 APR 09 00:00:50.185 TDB")
+    File = ("voyager1", "kernels/spk/vg1_jup.bsp")
+    Type = Reconstructed
+  End_Group
+
+  Group = Selection
+    Time = ("1980 AUG 23 00:00:51.182 TDB", "1981 JAN 01 00:00:51.183 TDB")
+    File = ("voyager1", "kernels/spk/vg1_sat.bsp")
+    Type = Reconstructed
+  End_Group
+
+
+  Group = Selection
+    Time = ("1980 AUG 23 00:00:51.182 TDB", "1980 NOV 20 00:00:00.000 TDB")
+    File = ("voyager1", "kernels/spk/vg1_sat.bsp")
+    File = ("voyager1", "kernels/spk/vgr1_sat336.bsp")
+    Type = Reconstructed
+  End_Group
+End_Object
+End
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/spk/kernels.0002.db b/isis/tests/data/isisdata/mockup/voyager1/kernels/spk/kernels.0002.db
new file mode 100644
index 0000000000000000000000000000000000000000..35ab7c9ac6c8b0803b5ae61ef5bca9f6ee02536e
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/spk/kernels.0002.db
@@ -0,0 +1,29 @@
+Object = SpacecraftPosition
+  RunTime = 2019-08-06T09:08:39
+
+  Group = Dependencies
+    LeapsecondKernel = $base/kernels/lsk/naif0012.tls
+  End_Group
+
+  Group = Selection
+    Time = ("1980 AUG 23 00:00:51.182766 TDB",
+            "1981 JAN 01 00:00:51.183939 TDB")
+    File = $voyager1/kernels/spk//vg1_sat.bsp
+    Type = Reconstructed
+  End_Group
+
+  Group = Selection
+    Time = ("1979 FEB 01 00:00:00.000000 TDB",
+            "1979 MAR 19 00:00:00.000000 TDB")
+    File = $voyager1/kernels/spk//vgr1_jup230.bsp
+    Type = Reconstructed
+  End_Group
+
+  Group = Selection
+    Time = ("1980 AUG 07 00:00:00.000000 TDB",
+            "1980 NOV 20 00:00:00.000000 TDB")
+    File = $voyager1/kernels/spk//vgr1_sat336.bsp
+    Type = Reconstructed
+  End_Group
+End_Object
+End
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/spk/vg1_jup.bsp b/isis/tests/data/isisdata/mockup/voyager1/kernels/spk/vg1_jup.bsp
new file mode 100644
index 0000000000000000000000000000000000000000..851e36671f542bf50b10f1aee64144ae39ccaa65
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/spk/vg1_jup.bsp
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/kernels/spk/vg1_jup.bsp",
+    "filesize": 719872,
+    "createtime": "2022-08-12T23:56:41.000000",
+    "modifiedtime": "2022-11-24T12:14:39.819238",
+    "md5hash": "a947845cba6ae5f22e422717926226de",
+    "sha256hash": "40819675c44331b375fab4be23ee052483be3220e151e8fb498b76a3051758c7",
+    "sha1hash": "0d4757422cd1cbc51f3aa2ead46a793f42c87c03"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/spk/vg1_sat.bsp b/isis/tests/data/isisdata/mockup/voyager1/kernels/spk/vg1_sat.bsp
new file mode 100644
index 0000000000000000000000000000000000000000..e84cc3416878a8d4d7078a05b55e7307721d41ac
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/spk/vg1_sat.bsp
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/kernels/spk/vg1_sat.bsp",
+    "filesize": 2329600,
+    "createtime": "2022-08-12T23:56:41.000000",
+    "modifiedtime": "2022-11-24T12:14:40.409870",
+    "md5hash": "5263d1c58582f5d42908a22bbc4dbf2b",
+    "sha256hash": "0fb6dff32957f75cc8c053a357b496ff99e4477b93008bc000823662f83a757a",
+    "sha1hash": "f08f6c9941f4d07887bbafe954a4723c5e782331"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/spk/vgr1_jup230.bsp b/isis/tests/data/isisdata/mockup/voyager1/kernels/spk/vgr1_jup230.bsp
new file mode 100644
index 0000000000000000000000000000000000000000..ff1c8743b5de99ca1219f90849676aea2726f653
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/spk/vgr1_jup230.bsp
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/kernels/spk/vgr1_jup230.bsp",
+    "filesize": 325632,
+    "createtime": "2022-08-12T23:56:41.000000",
+    "modifiedtime": "2022-11-24T12:14:35.244265",
+    "md5hash": "56765ff7b51f69b2e55f45d8db02b443",
+    "sha256hash": "e1ea3f72f19b15508bc45979771a36a97d02f33056b76867d444304cb82205c9",
+    "sha1hash": "c217852340caec6476f835c9010c0ecb9a55633d"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/spk/vgr1_sat336.bsp b/isis/tests/data/isisdata/mockup/voyager1/kernels/spk/vgr1_sat336.bsp
new file mode 100644
index 0000000000000000000000000000000000000000..2f440759c3fe79ade56217c99736eb12f7868537
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/spk/vgr1_sat336.bsp
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/kernels/spk/vgr1_sat336.bsp",
+    "filesize": 753664,
+    "createtime": "2022-08-12T23:56:41.000000",
+    "modifiedtime": "2022-11-24T12:14:39.938516",
+    "md5hash": "1de4cae225760ce7b79b5b301637b2d5",
+    "sha256hash": "7d0653851fea89005312756406b6b5a747e2be0a73ceaf3eb4aec0cd8523d441",
+    "sha1hash": "18cd7de34b844e2026322c3d2a5ba2bc9892bd4f"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/spk/vgr1_sat337.bsp b/isis/tests/data/isisdata/mockup/voyager1/kernels/spk/vgr1_sat337.bsp
new file mode 100644
index 0000000000000000000000000000000000000000..fafc73075ff050fa45bb815460581a9df64fb70b
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/spk/vgr1_sat337.bsp
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/kernels/spk/vgr1_sat337.bsp",
+    "filesize": 749568,
+    "createtime": "2012-02-14T18:52:13.000000",
+    "modifiedtime": "2022-11-24T12:13:58.189975",
+    "md5hash": "9622a69e2906a9868995124902c4fbb5",
+    "sha256hash": "f451f9f095bc4ad175cde701367cbf1ccc061dd706ad0008cda75fd939d94efa",
+    "sha1hash": "67e08c05a599b424848084f18c673a0adf080111"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/spk/voyager_1.ST+1991_a54418u.merged.bsp b/isis/tests/data/isisdata/mockup/voyager1/kernels/spk/voyager_1.ST+1991_a54418u.merged.bsp
new file mode 100644
index 0000000000000000000000000000000000000000..30f2f536f9bb9a375eee45879dc680ab3bb54cff
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/spk/voyager_1.ST+1991_a54418u.merged.bsp
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/kernels/spk/voyager_1.ST+1991_a54418u.merged.bsp",
+    "filesize": 5268480,
+    "createtime": "2013-01-26T00:12:37.000000",
+    "modifiedtime": "2022-11-24T12:13:59.964955",
+    "md5hash": "0c8c067f5c96586a5eeffb3005aeb3f8",
+    "sha256hash": "35c471f379c27f2215504be6ed63fce839c6b2ad231110ea91c8355d36ef8a8c",
+    "sha1hash": "9675e55568ed13cb75779e35a979fecb97eadb3a"
+}
\ No newline at end of file
diff --git a/isis/tests/data/isisdata/mockup/voyager1/kernels/spk/voyager_2.ST+1992_m05208u.merged.bsp b/isis/tests/data/isisdata/mockup/voyager1/kernels/spk/voyager_2.ST+1992_m05208u.merged.bsp
new file mode 100644
index 0000000000000000000000000000000000000000..393571f3ab917e25afb7cfd55140efeb7601391e
--- /dev/null
+++ b/isis/tests/data/isisdata/mockup/voyager1/kernels/spk/voyager_2.ST+1992_m05208u.merged.bsp
@@ -0,0 +1,9 @@
+{
+    "source": "$ISISDATA/voyager1/kernels/spk/voyager_2.ST+1992_m05208u.merged.bsp",
+    "filesize": 5330944,
+    "createtime": "2013-01-26T00:12:32.000000",
+    "modifiedtime": "2022-11-24T12:13:59.798072",
+    "md5hash": "88400eabc1aeb603b5a341e0b80b4143",
+    "sha256hash": "727e014fbdbfc398437fcdccd7324df88b1be70faafcce8d2567a12d6ade50cf",
+    "sha1hash": "200baea0bd9f236292c68f3f5cb58055d1397dd0"
+}
\ No newline at end of file