Index: /OpenSceneGraph/trunk/include/osg/NodeVisitor
===================================================================
--- /OpenSceneGraph/trunk/include/osg/NodeVisitor (revision 13041)
+++ /OpenSceneGraph/trunk/include/osg/NodeVisitor (revision 13191)
@@ -309,5 +309,5 @@
             virtual osg::Image* readImageFile(const std::string& fileName) = 0;
 
-            virtual void requestImageFile(const std::string& fileName,osg::Object* attachmentPoint, int attachmentIndex, double timeToMergeBy, const FrameStamp* framestamp) = 0;
+            virtual void requestImageFile(const std::string& fileName,osg::Object* attachmentPoint, int attachmentIndex, double timeToMergeBy, const FrameStamp* framestamp, osg::ref_ptr<osg::Referenced>& imageRequest, const osg::Referenced* options=0) = 0;
 
         protected:
Index: /OpenSceneGraph/trunk/include/osg/PagedLOD
===================================================================
--- /OpenSceneGraph/trunk/include/osg/PagedLOD (revision 13041)
+++ /OpenSceneGraph/trunk/include/osg/PagedLOD (revision 13191)
@@ -45,11 +45,11 @@
 
 
-        /** Set the optional database osgDB::Options object to use when loaded children.*/
+        /** Set the optional database osgDB::Options object to use when reading children.*/
         void setDatabaseOptions(osg::Referenced* options) { _databaseOptions = options; }
 
-        /** Get the optional database osgDB::Options object used when loaded children.*/
+        /** Get the optional database osgDB::Options object used when reading children.*/
         osg::Referenced* getDatabaseOptions() { return _databaseOptions.get(); }
 
-        /** Get the optional database osgDB::Options object used when loaded children.*/
+        /** Get the optional database osgDB::Options object used when reading children.*/
         const osg::Referenced* getDatabaseOptions() const { return _databaseOptions.get(); }
 
Index: /OpenSceneGraph/trunk/include/osg/ImageSequence
===================================================================
--- /OpenSceneGraph/trunk/include/osg/ImageSequence (revision 13041)
+++ /OpenSceneGraph/trunk/include/osg/ImageSequence (revision 13191)
@@ -49,6 +49,16 @@
         virtual double getTimeMultiplier() const { return _timeMultiplier; }
 
-        typedef std::vector< osg::ref_ptr<osg::Image> >   Images;
-        typedef std::vector< std::string >                FileNames;
+        struct OSG_EXPORT ImageData
+        {
+            ImageData();
+            ImageData(const ImageData& id);
+            ImageData& operator = (const ImageData& id);
+
+            std::string                     _filename;
+            osg::ref_ptr<osg::Image>        _image;
+            osg::ref_ptr<osg::Referenced>   _imageRequest;
+        };
+
+        typedef std::vector<ImageData> ImageDataList;
 
         virtual void seek(double time);
@@ -79,9 +89,4 @@
         std::string getImageFile(unsigned int pos) const;
 
-        unsigned int getNumImageFiles() const { return _fileNames.size(); }
-
-        FileNames& getFileNames() { return _fileNames; }
-        const FileNames& getFileNames() const { return _fileNames; }
-
         void addImage(osg::Image* image);
 
@@ -97,9 +102,10 @@
         const Image* getImage(unsigned int pos) const;
 
-        unsigned int getNumImages() const { return _images.size(); }
+        unsigned int getNumImageData() const { return _imageDataList.size(); }
 
-        Images& getImages() { return _images; }
-        const Images& getImages() const { return _images; }
+        ImageDataList& getImageDataList() { return _imageDataList; }
+        const ImageDataList& getImageDataList() const { return _imageDataList; }
 
+        
         /** ImageSequence requires a call to update(NodeVisitor*) during the update traversal so return true.*/
         virtual bool requiresUpdateCall() const { return true; }
@@ -108,5 +114,15 @@
         virtual void update(NodeVisitor* nv);
 
-    protected:
+
+        /** Set the optional osgDB::Options object to use when reading images.*/
+        void setReadOptions(osg::Referenced* options) { _readOptions = options; }
+
+        /** Get the optional osgDB::Options object used when reading images.*/
+        osg::Referenced* getReadOptions() { return _readOptions.get(); }
+
+        /** Get the optional osgDB::Options object used when reading images.*/
+        const osg::Referenced* getReadOptions() const { return _readOptions.get(); }
+
+protected:
 
         virtual ~ImageSequence() {}
@@ -114,5 +130,5 @@
         virtual void applyLoopingMode();
 
-        void setImageToChild(const osg::Image* image);
+        void setImageToChild(int pos);
 
         void computeTimePerImage();
@@ -130,10 +146,6 @@
 
         mutable OpenThreads::Mutex      _mutex;
-        FileNames                       _fileNames;
 
-        Images                          _images;
-
-        typedef std::set< std::string > FilesRequested;
-        FilesRequested                  _filesRequested;
+        ImageDataList                   _imageDataList;
 
         int                             _previousAppliedImageIndex;
@@ -143,5 +155,5 @@
         double                          _seekTime;
 
-
+        osg::ref_ptr<osg::Referenced>       _readOptions;
 
 };
Index: /OpenSceneGraph/trunk/include/osgDB/ImagePager
===================================================================
--- /OpenSceneGraph/trunk/include/osgDB/ImagePager (revision 13144)
+++ /OpenSceneGraph/trunk/include/osgDB/ImagePager (revision 13191)
@@ -61,8 +61,8 @@
             virtual ~ImageThread();
 
-            bool            _done;
-            Mode            _mode;
-            ImagePager*     _pager;
-            std::string     _name;
+            bool                                _done;
+            Mode                                _mode;
+            ImagePager*                         _pager;
+            std::string                         _name;
         };
 
@@ -80,6 +80,5 @@
         virtual osg::Image* readImageFile(const std::string& fileName);
 
-        virtual void requestImageFile(const std::string& fileName,osg::Object* attachmentPoint, int attachmentIndex, double timeToMergeBy, const osg::FrameStamp* framestamp);
-
+        virtual void requestImageFile(const std::string& fileName, osg::Object* attachmentPoint, int attachmentIndex, double timeToMergeBy, const osg::FrameStamp* framestamp, osg::ref_ptr<osg::Referenced>& imageRequest, const osg::Referenced* options);
 
         /** Return true if there are pending updates to the scene graph that require a call to updateSceneGraph(double). */
@@ -114,4 +113,5 @@
             osg::ref_ptr<osg::Image>            _loadedImage;
             RequestQueue*                       _requestQueue;
+            osg::ref_ptr<osgDB::Options>        _readOptions;
 
         };
Index: /OpenSceneGraph/trunk/src/osgPresentation/SlideShowConstructor.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgPresentation/SlideShowConstructor.cpp (revision 13179)
+++ /OpenSceneGraph/trunk/src/osgPresentation/SlideShowConstructor.cpp (revision 13191)
@@ -1000,4 +1000,28 @@
         }
 
+#if 0
+        if (imageSequence->getMode()==osg::ImageSequence::PAGE_AND_DISCARD_USED_IMAGES)
+        {
+
+            if (_options.valid())
+            {
+                OSG_NOTICE<<"Object cache usage _options "<<options->getObjectCacheHint()<<std::endl;
+            }
+            else
+            {
+                OSG_NOTICE<<"No Object _options assigned"<<std::endl;
+            }
+
+            
+            osg::ref_ptr<osgDB::Options> options = _options.valid() ? _options->cloneOptions() : (new osgDB::Options);
+            if (!imageData.options.empty())
+            {
+                options->setOptionString(imageData.options);
+            }
+            OSG_NOTICE<<"Disabling object cache usage"<<std::endl;
+            options->setObjectCacheHint(osgDB::Options::CACHE_NONE);
+            imageSequence->setReadOptions(options);
+        }
+#endif
         if (imageData.duration>0.0)
         {
@@ -1006,7 +1030,5 @@
         else
         {
-            unsigned int maxNum = osg::maximum(imageSequence->getFileNames().size(),
-                                               imageSequence->getImages().size());
-
+            unsigned int maxNum = imageSequence->getNumImageData();
             imageSequence->setLength(double(maxNum)*(1.0/imageData.fps));
         }
Index: /OpenSceneGraph/trunk/src/osg/ImageSequence.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osg/ImageSequence.cpp (revision 13186)
+++ /OpenSceneGraph/trunk/src/osg/ImageSequence.cpp (revision 13191)
@@ -23,4 +23,26 @@
 using namespace osg;
 
+ImageSequence::ImageData::ImageData()
+{
+}
+
+ImageSequence::ImageData::ImageData(const ImageData& id):
+    _filename(id._filename),
+    _image(id._image),
+    _imageRequest(id._imageRequest)
+{
+}
+
+ImageSequence::ImageData& ImageSequence::ImageData::operator = (const ImageSequence::ImageData& rhs)
+{
+    if (&rhs!=this)
+    {
+        _filename = rhs._filename;
+        _image = rhs._image;
+        _imageRequest = rhs._imageRequest;
+    }
+    return *this;
+}
+
 ImageSequence::ImageSequence()
 {
@@ -97,6 +119,5 @@
 void ImageSequence::computeTimePerImage()
 {
-    if (!_fileNames.empty()) _timePerImage = _length / double(_fileNames.size());
-    else if (!_images.empty()) _timePerImage = _length / double(_images.size());
+    if (!_imageDataList.empty()) _timePerImage = _length / double(_imageDataList.size());
     else _timePerImage = _length;
 }
@@ -106,6 +127,6 @@
     OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
 
-    if (pos>=_fileNames.size()) _fileNames.resize(pos);
-    _fileNames[pos] = fileName;
+    if (pos>=_imageDataList.size()) _imageDataList.resize(pos);
+    _imageDataList[pos]._filename = fileName;
 }
 
@@ -113,5 +134,5 @@
 {
     OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
-    return pos<_fileNames.size() ? _fileNames[pos] : std::string();
+    return pos<_imageDataList.size() ? _imageDataList[pos]._filename : std::string();
 }
 
@@ -119,5 +140,6 @@
 {
     OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
-    _fileNames.push_back(fileName);
+    _imageDataList.push_back(ImageData());
+    _imageDataList.back()._filename = fileName;
     computeTimePerImage();
 }
@@ -127,13 +149,8 @@
     OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
 
-    OSG_INFO<<"ImageSequence::setImage("<<pos<<","<<image->getFileName()<<")"<<std::endl;
-
-    if (pos>=_images.size()) _images.resize(pos+1);
-
-    _images[pos] = image;
-
-    // prune from file requested list.
-    FilesRequested::iterator itr = _filesRequested.find(image->getFileName());
-    if (itr!=_filesRequested.end()) _filesRequested.erase(itr);
+    if (pos>=_imageDataList.size()) _imageDataList.resize(pos+1);
+
+    _imageDataList[pos]._image = image;
+    _imageDataList[pos]._filename = image->getFileName();
 }
 
@@ -141,5 +158,5 @@
 {
     OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
-    return pos<_images.size() ? _images[pos].get() : 0;
+    return pos<_imageDataList.size() ? _imageDataList[pos]._image.get() : 0;
 }
 
@@ -147,5 +164,5 @@
 {
     OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
-    return pos<_images.size() ? _images[pos].get() : 0;
+    return pos<_imageDataList.size() ? _imageDataList[pos]._image.get() : 0;
 }
 
@@ -157,5 +174,6 @@
 
     // OSG_NOTICE<<"merging image in order expected : "<<image->getFileName()<<std::endl;
-    _images.push_back(image);
+    _imageDataList.push_back(ImageData());
+    _imageDataList.back()._image = image;
 
     computeTimePerImage();
@@ -163,16 +181,47 @@
     if (data()==0)
     {
-        setImageToChild(_images.front().get());
-    }
-}
-
-void ImageSequence::setImageToChild(const osg::Image* image)
-{
-    // OSG_NOTICE<<"setImageToChild("<<image<<")"<<std::endl;
-
+        setImageToChild(_imageDataList.size()-1);
+    }
+}
+
+void ImageSequence::setImageToChild(int pos)
+{
+    
+    const osg::Image* image = (pos>=0 && pos<static_cast<int>(_imageDataList.size())) ? _imageDataList[pos]._image.get() : 0;
     if (image==0) return;
 
     // check to see if data is changing, if not don't apply
-    if (image->data() == data()) return;
+    if (image->data() == data())
+    {
+        return;
+    }
+
+
+    if (_mode==PAGE_AND_DISCARD_USED_IMAGES && _previousAppliedImageIndex>=0)
+    {
+        if (_previousAppliedImageIndex<pos)
+        {
+            OSG_INFO<<"Moving forward from "<<_previousAppliedImageIndex<<" to "<<pos<<std::endl;
+            while(_previousAppliedImageIndex<pos)
+            {
+                _imageDataList[_previousAppliedImageIndex]._image = 0;
+                OSG_INFO<<"   deleting "<<_previousAppliedImageIndex<<std::endl;
+                ++_previousAppliedImageIndex;
+            }
+        }
+        else if (_previousAppliedImageIndex>pos)
+        {
+            OSG_INFO<<"Moving back from "<<_previousAppliedImageIndex<<" to "<<pos<<std::endl;
+            while(_previousAppliedImageIndex>pos)
+            {
+                _imageDataList[_previousAppliedImageIndex]._image = 0;
+                OSG_INFO<<"   deleting "<<_previousAppliedImageIndex<<std::endl;
+                --_previousAppliedImageIndex;
+            }
+        }        
+    }
+    
+
+    _previousAppliedImageIndex = pos;
 
     setImage(image->s(),image->t(),image->r(),
@@ -198,5 +247,5 @@
     if (time<0.0) return 0;
     int index = int(time/_timePerImage);
-    if (index>=int(_images.size())) return int(_images.size())-1;
+    if (index>=int(_imageDataList.size())) return int(_imageDataList.size())-1;
     return index;
 }
@@ -223,4 +272,5 @@
     {
         time = _seekTime;
+        useDirectTimeRequest = true;
         _referenceTime =  fs->getSimulationTime() - time/_timeMultiplier;
     }
@@ -248,33 +298,14 @@
     _seekTimeSet = false;
 
-    bool pruneOldImages = false;
-
-    switch(_mode)
-    {
-        case(PRE_LOAD_ALL_IMAGES):
-        {
-            if (irh && _fileNames.size()>_images.size())
-            {
-                FileNames::iterator itr = _fileNames.begin();
-                for(unsigned int i=0;i<_images.size();++i) ++itr;
-
-                for(; itr!=_fileNames.end(); ++itr)
-                {
-                    osg::Image* image = irh->readImageFile(*itr);
-                    _images.push_back(image);
-                }
-            }
-
-            irh = 0;
-            break;
-        }
-        case(PAGE_AND_RETAIN_IMAGES):
-        {
-            break;
-        }
-        case(PAGE_AND_DISCARD_USED_IMAGES):
-        {
-            pruneOldImages = true;
-            break;
+    if (irh && _mode==PRE_LOAD_ALL_IMAGES)
+    {
+        for(ImageDataList::iterator itr = _imageDataList.begin();
+            itr != _imageDataList.end();
+            ++itr)
+        {
+            if (!(itr->_image) && !(itr->_filename.empty()))
+            {
+                itr->_image = irh->readImageFile(itr->_filename);
+            }
         }
     }
@@ -283,14 +314,15 @@
     // OSG_NOTICE<<"time= "<<time<<" _timePerImage="<<_timePerImage<<" index="<<index<<" _length="<<_length<<std::endl;
 
-    if (index>=int(_images.size())) index = int(_images.size())-1;
-
-    if (index>=0 && index<int(_images.size()))
-    {
-        if (pruneOldImages)
-        {
+    if (index>=int(_imageDataList.size())) index = int(_imageDataList.size())-1;
+
+    if (index>=0 && index<int(_imageDataList.size()))
+    {
+        // need to find the nearest relevant change.
+        if (!_imageDataList[index]._image)
+        {            
             if (_previousAppliedImageIndex<index)
             {
                 OSG_DEBUG<<"ImageSequence::update(..) Moving forward by "<<index-_previousAppliedImageIndex<<std::endl;
-                while (index>=0 && !_images[index].valid())
+                while (index>=0 && !_imageDataList[index]._image.valid())
                 {
                     --index;
@@ -300,89 +332,63 @@
             {
                 OSG_DEBUG<<"ImageSequence::update(..) Moving back by "<<_previousAppliedImageIndex-index<<std::endl;
-                while (index<static_cast<int>(_images.size()) && !_images[index].valid())
+                while (index<static_cast<int>(_imageDataList.size()) && !_imageDataList[index]._image.valid())
                 {
                     ++index;
                 }
             }
+        }
+        
+        if (index>=0 && index!=_previousAppliedImageIndex)
+        {
+            setImageToChild(index);
+        }
+    }
+
+    // OSG_NOTICE<<"time = "<<time<<std::endl;
+
+    if (!irh) return;
+
+    if (useDirectTimeRequest)
+    {
+        int i = int(time/_timePerImage);
+        if ((i>=int(_imageDataList.size()) || !_imageDataList[i]._image))
+        {
+             i = osg::clampTo<int>(i, 0, _imageDataList.size()-1);
+
+             OSG_INFO<<"Requesting file, entry="<<i<<" : _fileNames[i]="<<_imageDataList[i]._filename<<std::endl;
+             irh->requestImageFile(_imageDataList[i]._filename, this, i, time, fs, _imageDataList[i]._imageRequest, _readOptions.get());
+        }
+    }
+    else
+    {
+        double preLoadTime = time + osg::minimum(irh->getPreLoadTime()*_timeMultiplier, _length);
+
+        int startLoadIndex = int(time/_timePerImage);
+        if (startLoadIndex>=int(_imageDataList.size())) startLoadIndex = int(_imageDataList.size())-1;
+        if (startLoadIndex<0) startLoadIndex = 0;
+
+        int endLoadIndex = int(preLoadTime/_timePerImage);
+        if (endLoadIndex>=int(_imageDataList.size()))
+        {
+            if (looping)
+            {
+                endLoadIndex -= int(_imageDataList.size());
+            }
             else
             {
-                // OSG_NOTICE<<"ImageSequence::update(..) Same index."<<std::endl;
-            }
-        }
-
-        if (index>=0)
-        {
-            // OSG_NOTICE<<"at time "<<time<<" setting child = "<<index<<std::endl;
-
-            if (_previousAppliedImageIndex!=index)
-            {
-                if (_previousAppliedImageIndex >= 0 &&
-                    _previousAppliedImageIndex<int(_images.size()) &&
-                    pruneOldImages)
+                endLoadIndex = int(_imageDataList.size())-1;
+            }
+        }
+        if (endLoadIndex<0) endLoadIndex = 0;
+
+        double requestTime = time;
+
+        if (endLoadIndex<startLoadIndex)
+        {
+            for(int i=startLoadIndex; i<int(_imageDataList.size()); ++i)
+            {
+                if (!_imageDataList[i]._image)
                 {
-                    _images[_previousAppliedImageIndex] = 0;
-                }
-
-                setImageToChild(_images[index].get());
-
-                _previousAppliedImageIndex = index;
-            }
-        }
-    }
-
-    // OSG_NOTICE<<"time = "<<time<<std::endl;
-
-    if (!irh) return;
-
-    if (useDirectTimeRequest)
-    {
-        int i = int(time/_timePerImage);
-        if ((i>=int(_images.size()) || !_images[i]))
-        {
-             i = osg::clampTo<int>(i, 0, _fileNames.size()-1);
-             if (_filesRequested.count(_fileNames[i])==0)
-             {
-                 OSG_INFO<<"Requesting file, entry="<<i<<" : _fileNames[i]="<<_fileNames[i]<<std::endl;
-                //_filesRequested.insert(_fileNames[i]);
-                irh->requestImageFile(_fileNames[i], this, i, time, fs);
-             }
-             else
-             {
-                 OSG_DEBUG<<"File already requested, entry="<<i<<" : _fileNames[i]="<<_fileNames[i]<<std::endl;
-             }
-        }
-    }
-    else
-    {
-        double preLoadTime = time + osg::minimum(irh->getPreLoadTime()*_timeMultiplier, _length);
-
-        int startLoadIndex = int(time/_timePerImage);
-        if (startLoadIndex>=int(_images.size())) startLoadIndex = int(_images.size())-1;
-        if (startLoadIndex<0) startLoadIndex = 0;
-
-        int endLoadIndex = int(preLoadTime/_timePerImage);
-        if (endLoadIndex>=int(_fileNames.size()))
-        {
-            if (looping)
-            {
-                endLoadIndex -= int(_fileNames.size());
-            }
-            else
-            {
-                endLoadIndex = int(_fileNames.size())-1;
-            }
-        }
-        if (endLoadIndex<0) endLoadIndex = 0;
-
-        double requestTime = time;
-
-        if (endLoadIndex<startLoadIndex)
-        {
-            for(int i=startLoadIndex; i<int(_fileNames.size()); ++i)
-            {
-                if ((i>=int(_images.size()) || !_images[i]) && _filesRequested.count(_fileNames[i])==0)
-                {
-                    //_filesRequested.insert(_fileNames[i]);
-                    irh->requestImageFile(_fileNames[i], this, i, requestTime, fs);
+                    irh->requestImageFile(_imageDataList[i]._filename, this, i, requestTime, fs, _imageDataList[i]._imageRequest, _readOptions.get());
                 }
                 requestTime += _timePerImage;
@@ -391,8 +397,7 @@
             for(int i=0; i<=endLoadIndex; ++i)
             {
-                if ((i>=int(_images.size()) || !_images[i]) && _filesRequested.count(_fileNames[i])==0)
+                if (!_imageDataList[i]._image)
                 {
-                    //_filesRequested.insert(_fileNames[i]);
-                    irh->requestImageFile(_fileNames[i], this, i, requestTime, fs);
+                    irh->requestImageFile(_imageDataList[i]._filename, this, i, requestTime, fs, _imageDataList[i]._imageRequest, _readOptions.get());
                 }
                 requestTime += _timePerImage;
@@ -403,8 +408,7 @@
             for(int i=startLoadIndex; i<=endLoadIndex; ++i)
             {
-                if ((i>=int(_images.size()) || !_images[i]) && _filesRequested.count(_fileNames[i])==0)
+                if (!_imageDataList[i]._image)
                 {
-                    //_filesRequested.insert(_fileNames[i]);
-                    irh->requestImageFile(_fileNames[i], this, i, requestTime, fs);
+                    irh->requestImageFile(_imageDataList[i]._filename, this, i, requestTime, fs, _imageDataList[i]._imageRequest, _readOptions.get());
                 }
                 requestTime += _timePerImage;
@@ -412,6 +416,5 @@
         }
 
-
-    }
-
-}
+    }
+
+}
Index: /OpenSceneGraph/trunk/src/osgPlugins/ive/ImageSequence.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgPlugins/ive/ImageSequence.cpp (revision 13041)
+++ /OpenSceneGraph/trunk/src/osgPlugins/ive/ImageSequence.cpp (revision 13191)
@@ -38,21 +38,15 @@
     out->writeDouble(getLength());
 
-    out->writeUInt(getFileNames().size());
-    for(FileNames::iterator itr = getFileNames().begin();
-        itr != getFileNames().end();
+    out->writeUInt(getImageDataList().size());
+    for(ImageDataList::iterator itr = getImageDataList().begin();
+        itr != getImageDataList().end();
         ++itr)
     {
-        out->writeString(*itr);
+        out->writeString(itr->_filename);
     }
 
-    if (getFileNames().empty())
+    if (getImageDataList().empty())
     {
-        out->writeUInt(getImages().size());
-        for(Images::iterator itr = getImages().begin();
-            itr != getImages().end();
-            ++itr)
-        {
-            out->writeImage(itr->get());
-        }
+        out->writeUInt(0);
     }
 
Index: /OpenSceneGraph/trunk/src/osgDB/Registry.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgDB/Registry.cpp (revision 13156)
+++ /OpenSceneGraph/trunk/src/osgDB/Registry.cpp (revision 13191)
@@ -1300,4 +1300,5 @@
         useObjectCache=options ? (options->getObjectCacheHint()&cacheHint)!=0: false;
     }
+
     if (useObjectCache)
     {
@@ -1308,5 +1309,5 @@
             if (oitr!=_objectCache.end())
             {
-                OSG_NOTIFY(INFO)<<"returning cached instanced of "<<file<<std::endl;
+                OSG_INFO<<"returning cached instanced of "<<file<<std::endl;
                 if (readFunctor.isValid(oitr->second.first.get())) return ReaderWriter::ReadResult(oitr->second.first.get(), ReaderWriter::ReadResult::FILE_LOADED_FROM_CACHE);
                 else return ReaderWriter::ReadResult("Error file does not contain an osg::Object");
@@ -1318,10 +1319,10 @@
         {
             // update cache with new entry.
-            OSG_NOTIFY(INFO)<<"Adding to object cache "<<file<<std::endl;
+            OSG_INFO<<"Adding to object cache "<<file<<std::endl;
             addEntryToObjectCache(file,rr.getObject());
         }
         else
         {
-            OSG_NOTIFY(INFO)<<"No valid object found for "<<file<<std::endl;
+            OSG_INFO<<"No valid object found for "<<file<<std::endl;
         }
 
Index: /OpenSceneGraph/trunk/src/osgDB/ImagePager.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgDB/ImagePager.cpp (revision 13159)
+++ /OpenSceneGraph/trunk/src/osgDB/ImagePager.cpp (revision 13191)
@@ -84,5 +84,5 @@
     // note this will mean that only one ImageSequence can be properly managed at one time,
     // this hack will be removed once a better system for managing expiry of requests is introduced.
-    clear();
+    // clear();
 
     OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_requestMutex);
@@ -91,5 +91,5 @@
     databaseRequest->_requestQueue = this;
 
-    OSG_INFO<<"ImagePager::ReadQueue::add(..), size()="<<_requestList.size()<<std::endl;
+    OSG_INFO<<"ImagePager::ReadQueue::add("<<databaseRequest->_fileName<<"), size()="<<_requestList.size()<<std::endl;
 
     updateBlock();
@@ -207,7 +207,10 @@
         if (imageRequest.valid())
         {
-            osg::ref_ptr<osg::Image> image = osgDB::readImageFile(imageRequest->_fileName);
+            // OSG_NOTICE<<"doing readImageFile("<<imageRequest->_fileName<<") index to assign = "<<imageRequest->_attachmentIndex<<std::endl;
+            osg::ref_ptr<osg::Image> image = osgDB::readImageFile(imageRequest->_fileName, imageRequest->_readOptions.get());
             if (image.valid())
             {
+                // OSG_NOTICE<<"   successful readImageFile("<<imageRequest->_fileName<<") index to assign = "<<imageRequest->_attachmentIndex<<std::endl;
+                
                 osg::ImageSequence* is = dynamic_cast<osg::ImageSequence*>(imageRequest->_attachmentPoint.get());
                 if (is)
@@ -267,4 +270,5 @@
     _completedQueue = new RequestQueue;
     _imageThreads.push_back(new ImageThread(this, ImageThread::HANDLE_ALL_REQUESTS, "Image Thread 1"));
+#if 1
     _imageThreads.push_back(new ImageThread(this, ImageThread::HANDLE_ALL_REQUESTS, "Image Thread 2"));
     _imageThreads.push_back(new ImageThread(this, ImageThread::HANDLE_ALL_REQUESTS, "Image Thread 3"));
@@ -272,5 +276,5 @@
     _imageThreads.push_back(new ImageThread(this, ImageThread::HANDLE_ALL_REQUESTS, "Image Thread 5"));
     _imageThreads.push_back(new ImageThread(this, ImageThread::HANDLE_ALL_REQUESTS, "Image Thread 6"));
-
+#endif
     // 1 second
     _preLoadTime = 1.0;
@@ -315,7 +319,19 @@
 }
 
-void ImagePager::requestImageFile(const std::string& fileName,osg::Object* attachmentPoint, int attachmentIndex, double timeToMergeBy, const osg::FrameStamp*)
-{
-    OSG_INFO<<"ImagePager::requestNodeFile("<<fileName<<")"<<std::endl;
+void ImagePager::requestImageFile(const std::string& fileName, osg::Object* attachmentPoint, int attachmentIndex, double timeToMergeBy, const osg::FrameStamp* framestamp, osg::ref_ptr<osg::Referenced>& imageRequest, const osg::Referenced* options)
+{
+
+    osgDB::Options* readOptions = dynamic_cast<osgDB::Options*>(const_cast<osg::Referenced*>(options));
+    if (!readOptions)
+    {
+       readOptions = Registry::instance()->getOptions();
+    }
+
+    bool alreadyAssigned = dynamic_cast<ImageRequest*>(imageRequest.get()) && (imageRequest->referenceCount()>1);
+    if (alreadyAssigned)
+    {
+        // OSG_NOTICE<<"ImagePager::requestImageFile("<<fileName<<") alreadyAssigned"<<std::endl;
+        return;
+    }
 
     osg::ref_ptr<ImageRequest> request = new ImageRequest;
@@ -325,4 +341,9 @@
     request->_attachmentIndex = attachmentIndex;
     request->_requestQueue = _readQueue.get();
+    request->_readOptions = readOptions;
+
+    imageRequest = request;
+
+    // OSG_NOTICE<<"ImagePager::requestImageFile("<<fileName<<") new request."<<std::endl;
 
     _readQueue->add(request.get());
Index: /OpenSceneGraph/trunk/src/osgWrappers/serializers/osg/ImageSequence.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgWrappers/serializers/osg/ImageSequence.cpp (revision 13058)
+++ /OpenSceneGraph/trunk/src/osgWrappers/serializers/osg/ImageSequence.cpp (revision 13191)
@@ -7,5 +7,5 @@
 static bool checkFileNames( const osg::ImageSequence& image )
 {
-    return image.getNumImageFiles()>0;
+    return image.getNumImageData()>0;
 }
 
@@ -24,10 +24,11 @@
 static bool writeFileNames( osgDB::OutputStream& os, const osg::ImageSequence& image )
 {
-    const osg::ImageSequence::FileNames& files = image.getFileNames();
-    os.writeSize(files.size()); os << os.BEGIN_BRACKET << std::endl;
-    for ( osg::ImageSequence::FileNames::const_iterator itr=files.begin();
-          itr!=files.end(); ++itr )
+    const osg::ImageSequence::ImageDataList& imageDataList = image.getImageDataList();
+    os.writeSize(imageDataList.size()); os << os.BEGIN_BRACKET << std::endl;
+    for ( osg::ImageSequence::ImageDataList::const_iterator itr=imageDataList.begin();
+          itr!=imageDataList.end();
+          ++itr )
     {
-        os.writeWrappedString( *itr );
+        os.writeWrappedString( itr->_filename );
         os << std::endl;
     }
@@ -39,5 +40,5 @@
 static bool checkImages( const osg::ImageSequence& image )
 {
-    return image.getNumImages()>0;
+    return false;
 }
 
@@ -54,12 +55,13 @@
 }
 
-static bool writeImages( osgDB::OutputStream& os, const osg::ImageSequence& image )
+static bool writeImages( osgDB::OutputStream& os, const osg::ImageSequence& image)
 {
-    const osg::ImageSequence::Images& images = image.getImages();
-    os.writeSize(images.size()); os << os.BEGIN_BRACKET << std::endl;
-    for ( osg::ImageSequence::Images::const_iterator itr=images.begin();
-          itr!=images.end(); ++itr )
+    const osg::ImageSequence::ImageDataList& imageDataList = image.getImageDataList();
+    os.writeSize(imageDataList.size()); os << os.BEGIN_BRACKET << std::endl;
+    for ( osg::ImageSequence::ImageDataList::const_iterator itr=imageDataList.begin();
+          itr!=imageDataList.end();
+          ++itr )
     {
-        os.writeObject( (*itr).get() );
+        os.writeObject( (*itr)._image.get() );
     }
     os << os.END_BRACKET << std::endl;
Index: /OpenSceneGraph/trunk/src/osgWrappers/deprecated-dotosg/osg/ImageSequence.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgWrappers/deprecated-dotosg/osg/ImageSequence.cpp (revision 13041)
+++ /OpenSceneGraph/trunk/src/osgWrappers/deprecated-dotosg/osg/ImageSequence.cpp (revision 13191)
@@ -108,31 +108,15 @@
     fw.indent()<<"Length "<<is.getLength()<<std::endl;
 
-    if (!is.getFileNames().empty())
+    if (is.getNumImageData()>0)
     {
         fw.indent()<<"FileNames {"<<std::endl;
         fw.moveIn();
 
-        const osg::ImageSequence::FileNames& names = is.getFileNames();
-        for(osg::ImageSequence::FileNames::const_iterator itr = names.begin();
-            itr != names.end();
+        const osg::ImageSequence::ImageDataList& id = is.getImageDataList();
+        for(osg::ImageSequence::ImageDataList::const_iterator itr = id.begin();
+            itr != id.end();
             ++itr)
         {
-            fw.indent()<<fw.wrapString(*itr)<<std::endl;
-        }
-
-        fw.moveOut();
-        fw.indent()<<"}"<<std::endl;
-    }
-    else
-    {
-        fw.indent()<<"Images {"<<std::endl;
-        fw.moveIn();
-
-        const osg::ImageSequence::Images& images = is.getImages();
-        for(osg::ImageSequence::Images::const_iterator itr = images.begin();
-            itr != images.end();
-            ++itr)
-        {
-            if (!(*itr)->getFileName().empty()) fw.indent()<<fw.wrapString((*itr)->getFileName())<<std::endl;
+            fw.indent()<<fw.wrapString(itr->_filename)<<std::endl;
         }
 
Index: /OpenSceneGraph/trunk/examples/osgimagesequence/osgimagesequence.cpp
===================================================================
--- /OpenSceneGraph/trunk/examples/osgimagesequence/osgimagesequence.cpp (revision 13158)
+++ /OpenSceneGraph/trunk/examples/osgimagesequence/osgimagesequence.cpp (revision 13191)
@@ -131,7 +131,5 @@
         else
         {
-            unsigned int maxNum = osg::maximum(imageSequence->getFileNames().size(),
-                                               imageSequence->getImages().size());
-                                               
+            unsigned int maxNum = imageSequence->getNumImageData();
             imageSequence->setLength(double(maxNum)*(1.0/fps));
         }
