protected override void OnSave(Stream outStrm)
        {
            if (_setupOp == null)
            {
                return;
            }

            // NOTE: Do not close or dispose BinaryWriter, as this will close the Stream
            BinaryWriter writer  = new BinaryWriter(outStrm);
            int          version = 3;

            writer.Write(version);

            // ************** VERSION 3 **************

            //// Item 1: FeatureClassName: The orphan junction feature class of the Geometric Network for the underground conveyance system.
            FeatureClassName networkDataset = null;

            if (_setupOp.GeometricNetwork != null)
            {
                networkDataset = ((IDataset)_setupOp.GeometricNetwork.OrphanJunctionFeatureClass).FullName as FeatureClassName;
            }

            PersistenceHelper.Save <FeatureClassName>(outStrm, networkDataset);

            //// Item 2: FeatureClassName: The inlet feature class
            FeatureClassName inletClass = null;

            if (_setupOp.InletClass != null)
            {
                inletClass = ((IDataset)_setupOp.InletClass).FullName as FeatureClassName;
            }

            PersistenceHelper.Save <FeatureClassName>(outStrm, inletClass);

            //// Item 3: RasterDatasetName: The DEM dataset
            RasterDatasetName demDataset = null;

            if (_setupOp.DEM != null)
            {
                IDataset dem = ((IRasterAnalysisProps)_setupOp.DEM).RasterDataset as IDataset;
                if (dem != null)
                {
                    demDataset = dem.FullName as RasterDatasetName;
                }
            }

            PersistenceHelper.Save <RasterDatasetName>(outStrm, demDataset);

            //// Item 4: Boolean: Whether to smooth boundaries
            writer.Write(_setupOp.SmoothBoundaries);

            //// Item 5: Boolean: Whether to include upstream pipe ends
            writer.Write(_setupOp.IncludeUpstreamPipeEnds);

            //// Item 6: Boolean: Whether to exclude downstream pipe ends
            writer.Write(_setupOp.ExcludeDownstreamPipeEnds);

            //// Item 7: RasterDatasetName: The flow direction dataset
            RasterDatasetName flowDirDataset = null;

            if (_setupOp.FlowDirection != null)
            {
                IDataset flowDir = ((IRasterAnalysisProps)_setupOp.FlowDirection).RasterDataset as IDataset;
                if (flowDir != null)
                {
                    flowDirDataset = flowDir.FullName as RasterDatasetName;
                }
            }

            PersistenceHelper.Save <RasterDatasetName>(outStrm, flowDirDataset);

            //// Item 8: FeatureClassName: The catchment feature class
            FeatureClassName catchmentClass = null;

            if (_setupOp.Catchments != null)
            {
                catchmentClass = ((IDataset)_setupOp.Catchments).FullName as FeatureClassName;
            }

            PersistenceHelper.Save <FeatureClassName>(outStrm, catchmentClass);

            //// Item 9: Boolean: Whether to exclude disabled nodes
            writer.Write(_setupOp.ExcludeDisabledNodes);
        }
        //TODO: Implement load and save

        protected override void OnLoad(Stream inStrm)
        {
            SetupOp setupOp = null;

            try
            {
                // NOTE: Do not close or dispose BinaryReader, as this will close the Stream
                BinaryReader reader  = new BinaryReader(inStrm);
                int          version = reader.ReadInt32();

                // NOTE: With change to Add-In architecture, this extension is NOT backwards compatible with versions 1 and 2

                if (version == 3)
                {
                    //// Version 3:
                    //// Item 1: FeatureClassName: The orphan junction feature class of the Geometric Network for the underground conveyance system.
                    //// Item 2: FeatureClassName: The inlet feature class
                    //// Item 3: RasterDatasetName: The DEM dataset
                    //// Item 4: Boolean: Whether to smooth boundaries
                    //// Item 5: Boolean: Whether to include upstream pipe ends
                    //// Item 6: Boolean: Whether to exclude downstream pipe ends
                    //// Item 7: RasterDatasetName: The flow direction dataset
                    //// Item 8: FeatureClassName: The catchment feature class
                    //// Item 9: Boolean: Whether to exclude disabled nodes

                    setupOp = new SetupOp();
                    setupOp.ResultsDirectory = this.MxDocDirectoryName;
                    setupOp.ScratchDirectory = this.TemporaryDirectory;

                    FeatureClassName networkJunctionName = null;
                    PersistenceHelper.Load <FeatureClassName>(inStrm, ref networkJunctionName);
                    INetworkClass junctionClass = _SafeOpen(networkJunctionName) as INetworkClass;
                    if (junctionClass != null)
                    {
                        setupOp.GeometricNetwork = junctionClass.GeometricNetwork;
                    }

                    FeatureClassName inletClassName = null;
                    PersistenceHelper.Load <FeatureClassName>(inStrm, ref inletClassName);
                    setupOp.InletClass = _SafeOpen(inletClassName) as IFeatureClass;

                    RasterDatasetName demName = null;
                    PersistenceHelper.Load <RasterDatasetName>(inStrm, ref demName);
                    IRasterDataset demDataset = _SafeOpen(demName) as IRasterDataset;
                    if (demDataset != null)
                    {
                        setupOp.DEM = demDataset.CreateDefaultRaster();
                    }

                    setupOp.SmoothBoundaries          = reader.ReadBoolean();
                    setupOp.IncludeUpstreamPipeEnds   = reader.ReadBoolean();
                    setupOp.ExcludeDownstreamPipeEnds = reader.ReadBoolean();

                    RasterDatasetName flowDirName = null;
                    PersistenceHelper.Load <RasterDatasetName>(inStrm, ref flowDirName);
                    IRasterDataset flowDirDataset = _SafeOpen(flowDirName) as IRasterDataset;
                    if (flowDirDataset != null)
                    {
                        setupOp.FlowDirection = flowDirDataset.CreateDefaultRaster();
                    }

                    FeatureClassName catchmentClassName = null;
                    PersistenceHelper.Load <FeatureClassName>(inStrm, ref catchmentClassName);
                    setupOp.Catchments = _SafeOpen(catchmentClassName) as IFeatureClass;

                    setupOp.ExcludeDisabledNodes = reader.ReadBoolean();
                }

                _setupOp = setupOp;
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.GetType().FullName + ": " + ex.Message);
            }
        }