diff --git a/include/usgscsm/UsgsAstroPlugin.h b/include/usgscsm/UsgsAstroPlugin.h
index acdad1a81a846c8f20a7ad8d9b73e5eb99de0cf4..93ba1a69bd2b667eb2f57eec1a7dbc35cd890504 100644
--- a/include/usgscsm/UsgsAstroPlugin.h
+++ b/include/usgscsm/UsgsAstroPlugin.h
@@ -55,7 +55,6 @@ private:
     static const std::string _MANUFACTURER_NAME;
     static const std::string _RELEASE_DATE;
     static const int         _N_SENSOR_MODELS;
-    static const std::string _ISD_KEYWORD[];
 
     typedef csm::Model* (*sensorConstructor)(void);
     static std::map<std::string, sensorConstructor> MODELS;
diff --git a/include/usgscsm/UsgsAstroSarSensorModel.h b/include/usgscsm/UsgsAstroSarSensorModel.h
index 021203a259d9c3f6c50e8121960dbb37bc9f7296..ed72d66f3d6dad260b126cbc644ced61614bbfe2 100644
--- a/include/usgscsm/UsgsAstroSarSensorModel.h
+++ b/include/usgscsm/UsgsAstroSarSensorModel.h
@@ -11,7 +11,9 @@ class UsgsAstroSarSensorModel : public csm::RasterGM, virtual public csm::Settab
   public:
 
     UsgsAstroSarSensorModel();
-    ~UsgsAstroSarSensorModel();
+    ~UsgsAstroSarSensorModel() {}
+
+    void reset();
 
     virtual void replaceModelState(const std::string& argState);
 
@@ -206,6 +208,7 @@ class UsgsAstroSarSensorModel : public csm::RasterGM, virtual public csm::Settab
     // Model state variables //
     ///////////////////////////
     std::string  m_imageIdentifier;
+    std::string  m_platformName;
     std::string  m_sensorName;
     int          m_nLines;
     int          m_nSamples;
@@ -215,7 +218,6 @@ class UsgsAstroSarSensorModel : public csm::RasterGM, virtual public csm::Settab
     double       m_centerEphemerisTime;
     double       m_majorAxis;
     double       m_minorAxis;
-    std::string  m_referenceDateAndTime;
     std::string  m_platformIdentifier;
     std::string  m_sensorIdentifier;
     std::string  m_trajectoryIdentifier;
diff --git a/src/UsgsAstroPlugin.cpp b/src/UsgsAstroPlugin.cpp
index 71ec8b4ddb508ecb8c480cf901df8eaea98fa505..be20a7c5c20d330e3e0f30b70fe873c18c4dc6ed 100644
--- a/src/UsgsAstroPlugin.cpp
+++ b/src/UsgsAstroPlugin.cpp
@@ -2,6 +2,7 @@
 
 #include "UsgsAstroFrameSensorModel.h"
 #include "UsgsAstroLsSensorModel.h"
+#include "UsgsAstroSarSensorModel.h"
 
 #include <algorithm>
 #include <cstdlib>
@@ -29,33 +30,7 @@ using json = nlohmann::json;
 const std::string UsgsAstroPlugin::_PLUGIN_NAME = "UsgsAstroPluginCSM";
 const std::string UsgsAstroPlugin::_MANUFACTURER_NAME = "UsgsAstrogeology";
 const std::string UsgsAstroPlugin::_RELEASE_DATE = "20190222";
-const int         UsgsAstroPlugin::_N_SENSOR_MODELS = 2;
-
-const std::string UsgsAstroPlugin::_ISD_KEYWORD[] =
-{
-   "name_model",
-   "center_ephemeris_time",
-   "dt_ephemeris",
-   "focal2pixel_lines",
-   "focal2pixel_samples",
-   "focal_length_model",
-   "image_lines",
-   "image_samples",
-   "interpolation_method",
-   "number_of_ephemerides",
-   "optical_distortion",
-   "radii",
-   "reference_height",
-   "sensor_location_unit",
-   "sensor_location",
-   "sensor_orientation",
-   "sensor_velocity",
-   "detector_center",
-   "starting_detector_line",
-   "starting_detector_sample",
-   "starting_ephemeris_time",
-   "sun_position"
-};
+const int         UsgsAstroPlugin::_N_SENSOR_MODELS = 3;
 
 // Static Instance of itself
 const UsgsAstroPlugin UsgsAstroPlugin::m_registeredPlugin;
@@ -96,7 +71,8 @@ size_t UsgsAstroPlugin::getNumModels() const {
 std::string UsgsAstroPlugin::getModelName(size_t modelIndex) const {
   std::vector<std::string> supportedModelNames = {
     UsgsAstroFrameSensorModel::_SENSOR_MODEL_NAME,
-    UsgsAstroLsSensorModel::_SENSOR_MODEL_NAME
+    UsgsAstroLsSensorModel::_SENSOR_MODEL_NAME,
+    UsgsAstroSarSensorModel::_SENSOR_MODEL_NAME
   };
   return supportedModelNames[modelIndex];
 }
@@ -321,6 +297,23 @@ csm::Model *UsgsAstroPlugin::constructModelFromISD(const csm::Isd &imageSupportD
       }
       return model;
     }
+    else if (modelName == UsgsAstroSarSensorModel::_SENSOR_MODEL_NAME) {
+      UsgsAstroSarSensorModel *model =  new UsgsAstroSarSensorModel();
+      try {
+        model->replaceModelState(model->constructStateFromIsd(stringIsd, warnings));
+      }
+      catch (std::exception& e) {
+        csm::Error::ErrorType aErrorType = csm::Error::SENSOR_MODEL_NOT_CONSTRUCTIBLE;
+        std::string aMessage = "Could not construct model [";
+        aMessage += modelName;
+        aMessage += "] with error [";
+        aMessage += e.what();
+        aMessage += "]";
+        std::string aFunction = "UsgsAstroPlugin::constructModelFromISD()";
+        throw csm::Error(aErrorType, aMessage, aFunction);
+      }
+      return model;
+    }
     else {
       csm::Error::ErrorType aErrorType = csm::Error::SENSOR_MODEL_NOT_SUPPORTED;
       std::string aMessage = "Model [" + modelName + "] not supported: ";
@@ -346,6 +339,11 @@ csm::Model *UsgsAstroPlugin::constructModelFromState(const std::string& modelSta
         model->replaceModelState(modelState);
         return model;
     }
+    else if (modelName == UsgsAstroSarSensorModel::_SENSOR_MODEL_NAME) {
+        UsgsAstroSarSensorModel* model = new UsgsAstroSarSensorModel();
+        model->replaceModelState(modelState);
+        return model;
+    }
     else {
       csm::Error::ErrorType aErrorType = csm::Error::ISD_NOT_SUPPORTED;
       std::string aMessage = "Model" + modelName + " not supported: ";
diff --git a/src/UsgsAstroSarSensorModel.cpp b/src/UsgsAstroSarSensorModel.cpp
index b3716f5fe1b0e6b4f35e55eeb38438c367ddff06..6b8dd0894d909494802c1fc21b7ed7782b1cd3b4 100644
--- a/src/UsgsAstroSarSensorModel.cpp
+++ b/src/UsgsAstroSarSensorModel.cpp
@@ -39,15 +39,13 @@ const csm::param::Type
 
 string UsgsAstroSarSensorModel::constructStateFromIsd(
     const string imageSupportData,
-    csm::WarningList *warnings
-) {
+    csm::WarningList *warnings)
+{
   json isd = json::parse(imageSupportData);
   json state = {};
 
   csm::WarningList* parsingWarnings = new csm::WarningList;
 
-  int num_params = NUM_PARAMETERS;
-
   state["m_modelName"] = getSensorModelName(isd, parsingWarnings);
   state["m_imageIdentifier"] = getImageId(isd, parsingWarnings);
   state["m_sensorName"] = getSensorName(isd, parsingWarnings);
@@ -57,11 +55,11 @@ string UsgsAstroSarSensorModel::constructStateFromIsd(
   state["m_nSamples"] = getTotalSamples(isd, parsingWarnings);
 
   // Zero computed state values
-  state["m_referencePointXyz"] = std::vector<double>(3, 0.0);
+  state["m_referencePointXyz"] = vector<double>(3, 0.0);
 
   // sun_position and velocity are required for getIlluminationDirection
-  state["m_sunPosition"]= getSunPositions(isd, parsingWarnings);
-  state["m_sunVelocity"]= getSunVelocities(isd, parsingWarnings);
+  state["m_sunPosition"] = getSunPositions(isd, parsingWarnings);
+  state["m_sunVelocity"] = getSunVelocities(isd, parsingWarnings);
 
   state["m_centerEphemerisTime"] = getCenterTime(isd, parsingWarnings);
   state["m_startingEphemerisTime"] = getStartingTime(isd, parsingWarnings);
@@ -93,7 +91,7 @@ string UsgsAstroSarSensorModel::constructStateFromIsd(
   state["m_positions"] = getSensorPositions(isd, parsingWarnings);
   state["m_velocities"] = getSensorVelocities(isd, parsingWarnings);
 
-  state["m_currentParameterValue"] = std::vector<double>(NUM_PARAMETERS, 0.0);
+  state["m_currentParameterValue"] = vector<double>(NUM_PARAMETERS, 0.0);
 
   // get radii
   state["m_minorAxis"] = getSemiMinorRadius(isd, parsingWarnings);
@@ -113,7 +111,7 @@ string UsgsAstroSarSensorModel::constructStateFromIsd(
 
   // Default to identity covariance
   state["m_covariance"] =
-       std::vector<double>(NUM_PARAMETERS * NUM_PARAMETERS, 0.0);
+       vector<double>(NUM_PARAMETERS * NUM_PARAMETERS, 0.0);
   for (int i = 0; i < NUM_PARAMETERS; i++) {
    state["m_covariance"][i * NUM_PARAMETERS + i] = 1.0;
   }
@@ -136,3 +134,526 @@ string UsgsAstroSarSensorModel::constructStateFromIsd(
   // some state data is not in the ISD and requires a SM to compute them.
   return state.dump();
 }
+
+string UsgsAstroSarSensorModel::getModelNameFromModelState(const string& model_state)
+{
+   // Parse the string to JSON
+   auto j = json::parse(model_state);
+   // If model name cannot be determined, return a blank string
+   string model_name;
+
+   if (j.find("m_modelName") != j.end()) {
+       model_name = j["m_modelName"];
+   } else {
+       csm::Error::ErrorType aErrorType = csm::Error::INVALID_SENSOR_MODEL_STATE;
+       string aMessage = "No 'm_modelName' key in the model state object.";
+       string aFunction = "UsgsAstroSarSensorModel::getModelNameFromModelState";
+       csm::Error csmErr(aErrorType, aMessage, aFunction);
+       throw(csmErr);
+   }
+   if (model_name != _SENSOR_MODEL_NAME){
+       csm::Error::ErrorType aErrorType = csm::Error::SENSOR_MODEL_NOT_SUPPORTED;
+       string aMessage = "Sensor model not supported.";
+       string aFunction = "UsgsAstroSarSensorModel::getModelNameFromModelState()";
+       csm::Error csmErr(aErrorType, aMessage, aFunction);
+       throw(csmErr);
+   }
+   return model_name;
+
+}
+
+UsgsAstroSarSensorModel::UsgsAstroSarSensorModel()
+{
+  reset();
+}
+
+void UsgsAstroSarSensorModel::reset()
+{
+  m_imageIdentifier = "Unknown";
+  m_sensorName = "Unknown";
+  m_platformIdentifier = "Unknown";
+  m_nLines = 0;
+  m_nSamples = 0;
+  m_exposureDuration = 0;
+  m_scaledPixelWidth = 0;
+  m_startingEphemerisTime = 0;
+  m_centerEphemerisTime = 0;
+  m_majorAxis = 0;
+  m_minorAxis = 0;
+  m_platformIdentifier = "Unknown";
+  m_sensorIdentifier = "Unknown";
+  m_trajectoryIdentifier = "Unknown";
+  m_collectionIdentifier = "Unknown";
+  m_minElevation = -1000;
+  m_maxElevation = 1000;
+  m_dtEphem = 0;
+  m_t0Ephem = 0;
+  m_scaleConversionCoefficients.clear();
+  m_positions.clear();
+  m_velocities.clear();
+  m_currentParameterValue = vector<double>(NUM_PARAMETERS, 0.0);
+  m_parameterType = vector<csm::param::Type>(NUM_PARAMETERS, csm::param::REAL);
+  m_referencePointXyz.x = 0.0;
+  m_referencePointXyz.y = 0.0;
+  m_referencePointXyz.z = 0.0;
+  m_covariance = vector<double>(NUM_PARAMETERS * NUM_PARAMETERS,0.0);
+  m_sunPosition.clear();
+  m_sunVelocity.clear();
+}
+
+void UsgsAstroSarSensorModel::replaceModelState(const string& argState)
+{
+  reset();
+
+  auto stateJson = json::parse(argState);
+
+  m_imageIdentifier = stateJson["m_imageIdentifier"].get<string>();
+  m_platformIdentifier = stateJson["m_platformIdentifier"].get<string>();
+  m_sensorName = stateJson["m_sensorName"].get<string>();
+  m_nLines = stateJson["m_nLines"];
+  m_nSamples = stateJson["m_nSamples"];
+  m_exposureDuration = stateJson["m_exposureDuration"];
+  m_scaledPixelWidth = stateJson["m_scaledPixelWidth"];
+  m_startingEphemerisTime = stateJson["m_startingEphemerisTime"];
+  m_centerEphemerisTime = stateJson["m_centerEphemerisTime"];
+  m_majorAxis = stateJson["m_majorAxis"];
+  m_minorAxis = stateJson["m_minorAxis"];
+  m_platformIdentifier = stateJson["m_platformIdentifier"].get<string>();
+  m_sensorIdentifier = stateJson["m_sensorIdentifier"].get<string>();
+  m_minElevation = stateJson["m_minElevation"];
+  m_maxElevation = stateJson["m_maxElevation"];
+  m_dtEphem = stateJson["m_dtEphem"];
+  m_t0Ephem = stateJson["m_t0Ephem"];
+  m_scaleConversionCoefficients = stateJson["m_scaleConversionCoefficients"].get<vector<double>>();
+  m_positions = stateJson["m_positions"].get<vector<double>>();
+  m_velocities = stateJson["m_velocities"].get<vector<double>>();
+  m_currentParameterValue = stateJson["m_currentParameterValue"].get<vector<double>>();
+  m_referencePointXyz.x = stateJson["m_referencePointXyz"][0];
+  m_referencePointXyz.y = stateJson["m_referencePointXyz"][1];
+  m_referencePointXyz.z = stateJson["m_referencePointXyz"][2];
+  m_covariance = stateJson["m_covariance"].get<vector<double>>();
+  m_sunPosition = stateJson["m_sunPosition"].get<vector<double>>();
+  m_sunVelocity = stateJson["m_sunVelocity"].get<vector<double>>();
+}
+
+string UsgsAstroSarSensorModel::getModelState() const
+{
+  json state = {};
+
+  state["m_modelName"] = _SENSOR_MODEL_NAME;
+  state["m_imageIdentifier"] = m_imageIdentifier;
+  state["m_sensorName"] = m_sensorName;
+  state["m_platformName"] = m_platformName;
+  state["m_nLines"] = m_nLines;
+  state["m_nSamples"] = m_nSamples;
+  state["m_referencePointXyz"] = {
+      m_referencePointXyz.x,
+      m_referencePointXyz.y,
+      m_referencePointXyz.z
+  };
+  state["m_sunPosition"] = m_sunPosition;
+  state["m_sunVelocity"] = m_sunVelocity;
+  state["m_centerEphemerisTime"] = m_centerEphemerisTime;
+  state["m_startingEphemerisTime"] = m_startingEphemerisTime;
+  state["m_exposureDuration"] = m_exposureDuration;
+  state["m_dtEphem"] = m_dtEphem;
+  state["m_t0Ephem"] = m_t0Ephem;
+  state["m_positions"] = m_positions;
+  state["m_velocities"] = m_velocities;
+  state["m_currentParameterValue"] = m_currentParameterValue;
+  state["m_minorAxis"] = m_minorAxis;
+  state["m_majorAxis"] = m_majorAxis;
+  state["m_platformIdentifier"] = m_platformIdentifier;
+  state["m_sensorIdentifier"] = m_sensorIdentifier;
+  state["m_minElevation"] = m_minElevation;
+  state["m_maxElevation"] = m_maxElevation;
+  state["m_scaledPixelWidth"] = m_scaledPixelWidth;
+  state["m_scaleConversionCoefficients"] = m_scaleConversionCoefficients;
+  state["m_covariance"] = m_covariance;
+
+  return state.dump();
+}
+
+
+
+csm::ImageCoord UsgsAstroSarSensorModel::groundToImage(
+    const csm::EcefCoord& groundPt,
+    double desiredPrecision,
+    double* achievedPrecision,
+    csm::WarningList* warnings) const
+{
+  return csm::ImageCoord(0.0, 0.0);
+}
+
+csm::ImageCoordCovar UsgsAstroSarSensorModel::groundToImage(
+    const csm::EcefCoordCovar& groundPt,
+    double desiredPrecision,
+    double* achievedPrecision,
+    csm::WarningList* warnings) const
+{
+  return csm::ImageCoordCovar(0.0, 0.0,
+                              1.0, 0.0,
+                                   1.0);
+}
+
+csm::EcefCoord UsgsAstroSarSensorModel::imageToGround(
+    const csm::ImageCoord& imagePt,
+    double height,
+    double desiredPrecision,
+    double* achievedPrecision,
+    csm::WarningList* warnings) const
+{
+  return csm::EcefCoord(0.0, 0.0, 0.0);
+}
+
+csm::EcefCoordCovar UsgsAstroSarSensorModel::imageToGround(
+    const csm::ImageCoordCovar& imagePt,
+    double height,
+    double heightVariance,
+    double desiredPrecision,
+    double* achievedPrecision,
+    csm::WarningList* warnings) const
+{
+  return csm::EcefCoordCovar(0.0, 0.0, 0.0,
+                             1.0, 0.0, 0.0,
+                                  1.0, 0.0,
+                                       1.0);
+}
+
+csm::EcefLocus UsgsAstroSarSensorModel::imageToProximateImagingLocus(
+    const csm::ImageCoord& imagePt,
+    const csm::EcefCoord& groundPt,
+    double desiredPrecision,
+    double* achievedPrecision,
+    csm::WarningList* warnings) const
+{
+  return csm::EcefLocus(0.0, 0.0, 0.0,
+                        0.0, 0.0, 0.0);
+}
+
+csm::EcefLocus UsgsAstroSarSensorModel::imageToRemoteImagingLocus(
+    const csm::ImageCoord& imagePt,
+    double desiredPrecision,
+    double* achievedPrecision,
+    csm::WarningList* warnings) const
+{
+  return csm::EcefLocus(0.0, 0.0, 0.0,
+                        0.0, 0.0, 0.0);
+}
+
+csm::ImageCoord UsgsAstroSarSensorModel::getImageStart() const
+{
+  return csm::ImageCoord(0.0, 0.0);
+}
+
+csm::ImageVector UsgsAstroSarSensorModel::getImageSize() const
+{
+  return csm::ImageVector(0.0, 0.0);
+}
+
+pair<csm::ImageCoord, csm::ImageCoord> UsgsAstroSarSensorModel::getValidImageRange() const
+{
+  return make_pair(csm::ImageCoord(0.0, 0.0), csm::ImageCoord(0.0, 0.0));
+}
+
+pair<double, double> UsgsAstroSarSensorModel::getValidHeightRange() const
+{
+  return make_pair(0.0, 0.0);
+}
+
+csm::EcefVector UsgsAstroSarSensorModel::getIlluminationDirection(const csm::EcefCoord& groundPt) const
+{
+  return csm::EcefVector(0.0, 0.0, 0.0);
+}
+
+double UsgsAstroSarSensorModel::getImageTime(const csm::ImageCoord& imagePt) const
+{
+  return 0.0;
+}
+
+csm::EcefCoord UsgsAstroSarSensorModel::getSensorPosition(const csm::ImageCoord& imagePt) const
+{
+  return csm::EcefCoord(0.0, 0.0, 0.0);
+}
+
+csm::EcefCoord UsgsAstroSarSensorModel::getSensorPosition(double time) const
+{
+  return csm::EcefCoord(0.0, 0.0, 0.0);
+}
+
+csm::EcefVector UsgsAstroSarSensorModel::getSensorVelocity(const csm::ImageCoord& imagePt) const
+{
+  return csm::EcefVector(0.0, 0.0, 0.0);
+}
+
+csm::EcefVector UsgsAstroSarSensorModel::getSensorVelocity(double time) const
+{
+  return csm::EcefVector(0.0, 0.0, 0.0);
+}
+
+csm::RasterGM::SensorPartials UsgsAstroSarSensorModel::computeSensorPartials(
+    int index,
+    const csm::EcefCoord& groundPt,
+    double desiredPrecision,
+    double* achievedPrecision,
+    csm::WarningList* warnings) const
+{
+  return csm::RasterGM::SensorPartials(0.0, 0.0);
+}
+
+csm::RasterGM::SensorPartials UsgsAstroSarSensorModel::computeSensorPartials(
+    int index,
+    const csm::ImageCoord& imagePt,
+    const csm::EcefCoord& groundPt,
+    double desiredPrecision,
+    double* achievedPrecision,
+    csm::WarningList* warnings) const
+{
+  return csm::RasterGM::SensorPartials(0.0, 0.0);
+}
+
+vector<csm::RasterGM::SensorPartials> UsgsAstroSarSensorModel::computeAllSensorPartials(
+    const csm::EcefCoord& groundPt,
+    csm::param::Set pSet,
+    double desiredPrecision,
+    double* achievedPrecision,
+    csm::WarningList* warnings) const
+{
+  return vector<csm::RasterGM::SensorPartials>(NUM_PARAMETERS, csm::RasterGM::SensorPartials(0.0, 0.0));
+}
+
+vector<double> UsgsAstroSarSensorModel::computeGroundPartials(const csm::EcefCoord& groundPt) const
+{
+  return vector<double>(6, 0.0);
+}
+
+const csm::CorrelationModel& UsgsAstroSarSensorModel::getCorrelationModel() const
+{
+  return _NO_CORR_MODEL;
+}
+
+vector<double> UsgsAstroSarSensorModel::getUnmodeledCrossCovariance(
+    const csm::ImageCoord& pt1,
+    const csm::ImageCoord& pt2) const
+{
+  return vector<double>(4, 0.0);
+}
+
+csm::EcefCoord UsgsAstroSarSensorModel::getReferencePoint() const
+{
+  return m_referencePointXyz;
+}
+
+void UsgsAstroSarSensorModel::setReferencePoint(const csm::EcefCoord& groundPt)
+{
+  m_referencePointXyz = groundPt;
+}
+
+int UsgsAstroSarSensorModel::getNumParameters() const
+{
+  return NUM_PARAMETERS;
+}
+
+string UsgsAstroSarSensorModel::getParameterName(int index) const
+{
+  return PARAMETER_NAME[index];
+}
+
+string UsgsAstroSarSensorModel::getParameterUnits(int index) const
+{
+  return "m";
+}
+
+bool UsgsAstroSarSensorModel::hasShareableParameters() const
+{
+  return false;
+}
+
+bool UsgsAstroSarSensorModel::isParameterShareable(int index) const
+{
+  return false;
+}
+
+csm::SharingCriteria UsgsAstroSarSensorModel::getParameterSharingCriteria(int index) const
+{
+  return csm::SharingCriteria();
+}
+
+double UsgsAstroSarSensorModel::getParameterValue(int index) const
+{
+  return m_currentParameterValue[index];
+}
+
+void UsgsAstroSarSensorModel::setParameterValue(int index, double value)
+{
+  m_currentParameterValue[index] = value;
+}
+
+csm::param::Type UsgsAstroSarSensorModel::getParameterType(int index) const
+{
+  return m_parameterType[index];
+}
+
+void UsgsAstroSarSensorModel::setParameterType(int index, csm::param::Type pType)
+{
+  m_parameterType[index] = pType;
+}
+
+double UsgsAstroSarSensorModel::getParameterCovariance(
+    int index1,
+    int index2) const
+{
+  return m_covariance[index1 * NUM_PARAMETERS + index2];
+}
+
+
+void UsgsAstroSarSensorModel::setParameterCovariance(
+    int index1,
+    int index2,
+    double covariance)
+
+{
+  m_covariance[index1 * NUM_PARAMETERS + index2] = covariance;
+}
+
+int UsgsAstroSarSensorModel::getNumGeometricCorrectionSwitches() const
+{
+  return 0;
+}
+
+string UsgsAstroSarSensorModel::getGeometricCorrectionName(int index) const
+{
+  throw csm::Error(
+     csm::Error::INDEX_OUT_OF_RANGE,
+     "Index is out of range.",
+     "UsgsAstroSarSensorModel::getGeometricCorrectionName");
+}
+
+void UsgsAstroSarSensorModel::setGeometricCorrectionSwitch(int index,
+    bool value,
+    csm::param::Type pType)
+{
+  throw csm::Error(
+     csm::Error::INDEX_OUT_OF_RANGE,
+     "Index is out of range.",
+     "UsgsAstroSarSensorModel::setGeometricCorrectionSwitch");
+}
+
+bool UsgsAstroSarSensorModel::getGeometricCorrectionSwitch(int index) const
+{
+  throw csm::Error(
+     csm::Error::INDEX_OUT_OF_RANGE,
+     "Index is out of range.",
+     "UsgsAstroSarSensorModel::getGeometricCorrectionSwitch");
+}
+
+vector<double> UsgsAstroSarSensorModel::getCrossCovarianceMatrix(
+    const csm::GeometricModel& comparisonModel,
+    csm::param::Set pSet,
+    const csm::GeometricModel::GeometricModelList& otherModels) const
+{
+  // Return covariance matrix
+  if (&comparisonModel == this) {
+    vector<int> paramIndices = getParameterSetIndices(pSet);
+    int numParams = paramIndices.size();
+    vector<double> covariances(numParams * numParams, 0.0);
+    for (int i = 0; i < numParams; i++) {
+      for (int j = 0; j < numParams; j++) {
+        covariances[i * numParams + j] = getParameterCovariance(paramIndices[i], paramIndices[j]);
+      }
+    }
+    return covariances;
+  }
+  // No correlation between models.
+  const vector<int>& indices = getParameterSetIndices(pSet);
+  size_t num_rows = indices.size();
+  const vector<int>& indices2 = comparisonModel.getParameterSetIndices(pSet);
+  size_t num_cols = indices.size();
+
+  return vector<double>(num_rows * num_cols, 0.0);
+}
+
+csm::Version UsgsAstroSarSensorModel::getVersion() const
+{
+  return csm::Version(1, 0, 0);
+}
+
+string UsgsAstroSarSensorModel::getModelName() const
+{
+  return _SENSOR_MODEL_NAME;
+}
+
+string UsgsAstroSarSensorModel::getPedigree() const
+{
+  return "USGS_SAR";
+}
+
+string UsgsAstroSarSensorModel::getImageIdentifier() const
+{
+  return m_imageIdentifier;
+}
+
+void UsgsAstroSarSensorModel::setImageIdentifier(
+    const string& imageId,
+    csm::WarningList* warnings)
+{
+  m_imageIdentifier = imageId;
+}
+
+string UsgsAstroSarSensorModel::getSensorIdentifier() const
+{
+  return m_sensorIdentifier;
+}
+
+string UsgsAstroSarSensorModel::getPlatformIdentifier() const
+{
+  return m_platformIdentifier;
+}
+
+string UsgsAstroSarSensorModel::getCollectionIdentifier() const
+{
+  return m_collectionIdentifier;
+}
+
+string UsgsAstroSarSensorModel::getTrajectoryIdentifier() const
+{
+  return m_trajectoryIdentifier;
+}
+
+string UsgsAstroSarSensorModel::getSensorType() const
+{
+  return "SAR";
+}
+
+string UsgsAstroSarSensorModel::getSensorMode() const
+{
+  return "STRIP";
+}
+
+string UsgsAstroSarSensorModel::getReferenceDateAndTime() const
+{
+  csm::ImageCoord referencePointImage = groundToImage(m_referencePointXyz);
+  double relativeTime = getImageTime(referencePointImage);
+  time_t ephemTime = m_centerEphemerisTime + relativeTime;
+  struct tm t = {0};  // Initalize to all 0's
+  t.tm_year = 100;  // This is year-1900, so 100 = 2000
+  t.tm_mday = 1;
+  time_t timeSinceEpoch = mktime(&t);
+  time_t finalTime = ephemTime + timeSinceEpoch;
+  char buffer [16];
+  strftime(buffer, 16, "%Y%m%dT%H%M%S", localtime(&finalTime));
+  buffer[15] = '\0';
+
+  return buffer;
+}
+
+csm::Ellipsoid UsgsAstroSarSensorModel::getEllipsoid() const
+{
+   return csm::Ellipsoid(m_majorAxis, m_minorAxis);
+}
+
+void UsgsAstroSarSensorModel::setEllipsoid(const csm::Ellipsoid &ellipsoid)
+{
+   m_majorAxis = ellipsoid.getSemiMajorRadius();
+   m_minorAxis = ellipsoid.getSemiMinorRadius();
+}
diff --git a/tests/PluginTests.cpp b/tests/PluginTests.cpp
index 62da7c5cc0890eecb42e03c7bfe86fe8fa06e680..5f5f9fe848592cd9cb1ce68679b81f665ba6af77 100644
--- a/tests/PluginTests.cpp
+++ b/tests/PluginTests.cpp
@@ -26,7 +26,7 @@ TEST(PluginTests, ReleaseDate) {
 
 TEST(PluginTests, NumModels) {
    UsgsAstroPlugin testPlugin;
-   EXPECT_EQ(2, testPlugin.getNumModels());
+   EXPECT_EQ(3, testPlugin.getNumModels());
 }
 
 TEST(PluginTests, BadISDFile) {
@@ -200,6 +200,85 @@ TEST_F(ConstVelLineScanIsdTest, ConstructInValidCamera) {
    }
 }
 
+TEST_F(SarIsdTest, Constructible) {
+  UsgsAstroPlugin testPlugin;
+  csm::WarningList warnings;
+  EXPECT_TRUE(testPlugin.canModelBeConstructedFromISD(
+              isd,
+              "USGS_ASTRO_SAR_SENSOR_MODEL",
+              &warnings));
+  for (auto &warn: warnings) {
+    std::cerr << "Warning in " << warn.getFunction() << std::endl;
+    std::cerr << "  " << warn.getMessage() << std::endl;
+  }
+}
+
+TEST_F(SarIsdTest, ConstructibleFromState) {
+   UsgsAstroPlugin testPlugin;
+   csm::WarningList warnings;
+   std::string modelState = testPlugin.getStateFromISD(isd);
+   EXPECT_TRUE(testPlugin.canModelBeConstructedFromState(
+         "USGS_ASTRO_SAR_SENSOR_MODEL",
+         modelState,
+         &warnings));
+  for (auto &warn: warnings) {
+    std::cerr << "Warning in " << warn.getFunction() << std::endl;
+    std::cerr << "  " << warn.getMessage() << std::endl;
+  }
+}
+
+TEST_F(SarIsdTest, NotConstructible) {
+   UsgsAstroPlugin testPlugin;
+   isd.setFilename("data/simpleFramerISD.img");
+   EXPECT_FALSE(testPlugin.canModelBeConstructedFromISD(
+               isd,
+               "USGS_ASTRO_SAR_SENSOR_MODEL"));
+}
+
+TEST_F(SarIsdTest, ConstructValidCamera) {
+   UsgsAstroPlugin testPlugin;
+   csm::WarningList warnings;
+   csm::Model *cameraModel = NULL;
+   EXPECT_NO_THROW(
+         cameraModel = testPlugin.constructModelFromISD(
+               isd,
+               "USGS_ASTRO_SAR_SENSOR_MODEL",
+               &warnings)
+   );
+   for (auto &warn: warnings) {
+     std::cerr << "Warning in " << warn.getFunction() << std::endl;
+     std::cerr << "  " << warn.getMessage() << std::endl;
+   }
+   UsgsAstroSarSensorModel *sarModel = dynamic_cast<UsgsAstroSarSensorModel *>(cameraModel);
+   EXPECT_NE(sarModel, nullptr);
+   if (cameraModel) {
+      delete cameraModel;
+   }
+}
+
+TEST_F(SarIsdTest, ConstructInValidCamera) {
+   UsgsAstroPlugin testPlugin;
+   isd.setFilename("data/empty.img");
+   csm::Model *cameraModel = NULL;
+   try {
+      testPlugin.constructModelFromISD(
+            isd,
+            "USGS_ASTRO_SAR_SENSOR_MODEL",
+            nullptr);
+      FAIL() << "Expected an error";
+
+   }
+   catch(csm::Error &e) {
+      EXPECT_EQ(e.getError(), csm::Error::SENSOR_MODEL_NOT_CONSTRUCTIBLE);
+   }
+   catch(...) {
+      FAIL() << "Expected csm SENSOR_MODEL_NOT_CONSTRUCTIBLE error";
+   }
+   if (cameraModel) {
+      delete cameraModel;
+   }
+}
+
 int main(int argc, char **argv) {
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
diff --git a/tests/data/orbitalSar.json b/tests/data/orbitalSar.json
index dd8dfdd2872d75f46af7807a14f29d6c893c9642..8e07ccd1d8251f05e1b380ee56f7f9f28ac0e1a5 100644
--- a/tests/data/orbitalSar.json
+++ b/tests/data/orbitalSar.json
@@ -1,5 +1,5 @@
 {
-  "name_model": "USGS_ASTRO_SAR_MODEL",
+  "name_model": "USGS_ASTRO_SAR_SENSOR_MODEL",
   "image_identifier" : "test_sar.img",
   "name_platform": "TEST LUNAR PLATFORM",
   "name_sensor": "TEST SAR",