Index: /OpenSceneGraph/trunk/src/osgPlugins/ive/ReaderWriterIVE.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgPlugins/ive/ReaderWriterIVE.cpp (revision 10762)
+++ /OpenSceneGraph/trunk/src/osgPlugins/ive/ReaderWriterIVE.cpp (revision 10819)
@@ -29,4 +29,5 @@
             supportsOption("TerrainMaximumErrorToSizeRatio=value","Export option that controls error matric used to determine terrain HieghtField storage precision.");
             supportsOption("noLoadExternalReferenceFiles","Import option");
+            supportsOption("OutputTextureFiles","Write out the texture images to file");
         }
     
@@ -69,5 +70,5 @@
             osg::ref_ptr<Options> local_opt = options ? static_cast<Options*>(options->clone(osg::CopyOp::SHALLOW_COPY)) : new Options;
             local_opt->getDatabasePathList().push_front(osgDB::getFilePath(fileName));
-            
+
             osgDB::ifstream istream(fileName.c_str(), std::ios::in | std::ios::binary);
             return readNode(istream,local_opt.get());
@@ -119,4 +120,7 @@
             if(local_opt->getDatabasePathList().empty())
                 local_opt->setDatabasePath(osgDB::getFilePath(fileName));
+
+            local_opt->setPluginStringData("filename",fileName);
+
             osgDB::ofstream fout(fileName.c_str(), std::ios::out | std::ios::binary);
             if (!fout) return WriteResult::ERROR_IN_WRITING_FILE;
@@ -135,4 +139,6 @@
             if(local_opt->getDatabasePathList().empty())
                 local_opt->setDatabasePath(osgDB::getFilePath(fileName));
+
+            local_opt->setPluginStringData("filename",fileName);
 
             osgDB::ofstream fout(fileName.c_str(), std::ios::out | std::ios::binary);
Index: /OpenSceneGraph/trunk/src/osgPlugins/ive/DataOutputStream.h
===================================================================
--- /OpenSceneGraph/trunk/src/osgPlugins/ive/DataOutputStream.h (revision 10762)
+++ /OpenSceneGraph/trunk/src/osgPlugins/ive/DataOutputStream.h (revision 10819)
@@ -131,4 +131,13 @@
     bool getUseOriginalExternalReferences() const {return _useOriginalExternalReferences;};
 
+    // Set and get if export texture files during write
+    void setOutputTextureFiles(bool flag) { _outputTextureFiles = flag; }
+    bool getOutputTextureFiles() const { return _outputTextureFiles; }
+
+    // support code for OutputTextureFiles
+    virtual std::string getTextureFileNameForOutput();
+    void setFileName(std::string newFileName) {_filename = newFileName;}
+    std::string getFileName(void) const {return(_filename);}
+
     void setTerrainMaximumErrorToSizeRatio(double ratio) { _maximumErrorToSizeRatio = ratio; }
     double getTerrainMaximumErrorToSizeRatio() const { return _maximumErrorToSizeRatio; }
@@ -151,4 +160,5 @@
     std::ostream* _ostream;
     std::ostream* _output_ostream;
+    std::string _filename; // not necessary, but optional for use in texture export
     
     std::stringstream _compressionStream;
@@ -189,5 +199,8 @@
 
     IncludeImageMode    _includeImageMode;
-    
+
+    bool _outputTextureFiles;
+    unsigned int _textureFileNameNumber;
+
     osg::ref_ptr<const osgDB::ReaderWriter::Options> _options;
 
Index: /OpenSceneGraph/trunk/src/osgPlugins/ive/DataOutputStream.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgPlugins/ive/DataOutputStream.cpp (revision 10762)
+++ /OpenSceneGraph/trunk/src/osgPlugins/ive/DataOutputStream.cpp (revision 10819)
@@ -124,5 +124,7 @@
 #include <osg/io_utils>
 #include <osgDB/FileUtils>
+#include <osgDB/FileNameUtils>
 #include <osgDB/fstream>
+#include <osgDB/WriteFile>
 
 #include <stdlib.h>
@@ -143,7 +145,20 @@
     _maximumErrorToSizeRatio       = 0.001;
 
+    _outputTextureFiles = false;
+    _textureFileNameNumber = 0;
+
     _options = options;
 
     _compressionLevel = 0;
+
+    if (options) _filename = options->getPluginStringData("filename");
+
+    if (_filename.empty())
+    {
+        // initialize _filename to a unique identifier in case a real filename is not supplied
+        std::ostringstream filenameBuilder;
+        filenameBuilder << "file" << ostream; // use address of ostream to formulate unique filename
+        _filename = filenameBuilder.str();
+    }
 
     if (_options.get())
@@ -158,17 +173,20 @@
             setIncludeImageMode(IMAGE_COMPRESS_DATA);
         }
-        osg::notify(osg::DEBUG_INFO) << "ive::DataOutpouStream.setIncludeImageMode()=" << getIncludeImageMode() << std::endl;
+        osg::notify(osg::DEBUG_INFO) << "ive::DataOutputStream.setIncludeImageMode()=" << getIncludeImageMode() << std::endl;
 
         setIncludeExternalReferences(optionsString.find("inlineExternalReferencesInIVEFile")!=std::string::npos);
-        osg::notify(osg::DEBUG_INFO) << "ive::DataOutpouStream.setIncludeExternalReferences()=" << getIncludeExternalReferences() << std::endl;
+        osg::notify(osg::DEBUG_INFO) << "ive::DataOutputStream.setIncludeExternalReferences()=" << getIncludeExternalReferences() << std::endl;
 
         setWriteExternalReferenceFiles(optionsString.find("noWriteExternalReferenceFiles")==std::string::npos);
-        osg::notify(osg::DEBUG_INFO) << "ive::DataOutpouStream.setWriteExternalReferenceFiles()=" << getWriteExternalReferenceFiles() << std::endl;
+        osg::notify(osg::DEBUG_INFO) << "ive::DataOutputStream.setWriteExternalReferenceFiles()=" << getWriteExternalReferenceFiles() << std::endl;
 
         setUseOriginalExternalReferences(optionsString.find("useOriginalExternalReferences")!=std::string::npos);
-        osg::notify(osg::DEBUG_INFO) << "ive::DataOutpouStream.setUseOriginalExternalReferences()=" << getUseOriginalExternalReferences() << std::endl;
+        osg::notify(osg::DEBUG_INFO) << "ive::DataOutputStream.setUseOriginalExternalReferences()=" << getUseOriginalExternalReferences() << std::endl;
+
+        setOutputTextureFiles(optionsString.find("OutputTextureFiles")!=std::string::npos);
+        osg::notify(osg::DEBUG_INFO) << "ive::DataOutputStream.setOutputTextureFiles()=" << getOutputTextureFiles() << std::endl;
 
         _compressionLevel =  (optionsString.find("compressed")!=std::string::npos) ? 1 : 0;
-        osg::notify(osg::DEBUG_INFO) << "ive::DataOutpouStream._compressionLevel=" << _compressionLevel << std::endl;
+        osg::notify(osg::DEBUG_INFO) << "ive::DataOutputStream._compressionLevel=" << _compressionLevel << std::endl;
 
         std::string::size_type terrainErrorPos = optionsString.find("TerrainMaximumErrorToSizeRatio=");
@@ -1440,12 +1458,26 @@
             break;
         case IMAGE_REFERENCE_FILE:
-            // Only include image name in stream
-            if (image && !(image->getFileName().empty())){
-                writeString(image->getFileName());
+        {
+            if (image)
+            {
+                // Only include image name in stream
+                std::string fileName = image->getFileName();
+                // Export an image, if requested
+                if (getOutputTextureFiles())
+                {
+                    if (fileName.empty())
+                    { // synthesize a new faux filename
+                        fileName = getTextureFileNameForOutput();
+                    }
+                    osgDB::writeImageFile(*image, fileName);
+                }
+                writeString(fileName);
             }
-            else{
+            else
+            {
                 writeString("");
             }
             break;
+        }
         case IMAGE_INCLUDE_FILE:
             // Include image file in stream
@@ -1840,4 +1872,22 @@
 }
 
+std::string DataOutputStream::getTextureFileNameForOutput()
+{
+    std::string fileName = osgDB::getNameLessExtension(_filename);
+    if (_textureFileNameNumber>0)
+    {
+        std::ostringstream o;
+        o << '_' << _textureFileNameNumber;
+        fileName += o.str();
+    }
+    
+    fileName += ".dds";
+    ++_textureFileNameNumber;
+    
+    return fileName;
+}
+
+
+
 void DataOutputStream::setExternalFileWritten(const std::string& filename, bool hasBeenWritten)
 {
Index: /OpenSceneGraph/trunk/src/osgPlugins/osgTerrain/ImageLayer.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgPlugins/osgTerrain/ImageLayer.cpp (revision 8840)
+++ /OpenSceneGraph/trunk/src/osgPlugins/osgTerrain/ImageLayer.cpp (revision 10819)
@@ -12,4 +12,5 @@
 #include <osgDB/Input>
 #include <osgDB/Output>
+#include <osgDB/WriteFile>
 #include <osgDB/ParameterOutput>
 
@@ -65,8 +66,18 @@
 {
     const osgTerrain::ImageLayer& layer = static_cast<const osgTerrain::ImageLayer&>(obj);
+
+    std::string fileName = layer.getFileName();
     
-    if (!layer.getFileName().empty())
+    if (fw.getOutputTextureFiles())
     {
-        fw.indent()<<"file "<< layer.getFileName() << std::endl;
+        if (fileName.empty())
+        {
+            fileName = fw.getTextureFileNameForOutput();
+        }
+        osgDB::writeImageFile(*layer.getImage(), fileName);
+    }
+    if (!fileName.empty())
+    {
+        fw.indent()<<"file "<< fw.wrapString(fileName) << std::endl;
     }
 
