Index: /OpenSceneGraph/trunk/include/osg/Image
===================================================================
--- /OpenSceneGraph/trunk/include/osg/Image (revision 10866)
+++ /OpenSceneGraph/trunk/include/osg/Image (revision 10924)
@@ -20,4 +20,5 @@
 #include <osg/Vec4>
 #include <osg/FrameStamp>
+#include <osg/StateAttribute>
 
 #include <string>
@@ -321,6 +322,19 @@
         /** Get the const PixelBufferObject.*/
         const PixelBufferObject* getPixelBufferObject() const { return dynamic_cast<const PixelBufferObject*>(_bufferObject.get()); }
-       
+
+        /** return whether the update(NodeVisitor* nv) should be required on each frame to enable proper working of osg::Image.*/
+        virtual bool requiresUpdateCall() const { return false; }
+
+        /** update method for osg::Image subclasses that update themselves during the update traversal.*/
         virtual void update(NodeVisitor* /*nv*/) {}
+
+        /** convience update callback class that can be attached to StateAttribute (such as Textures) to ensure
+          * that the Image::update(NodeVisitor*) method is called during the update traversal.  This callback
+          * is automatically attached when Image::requiresUpdateCall() is true (it's false by default.)
+          */
+        struct OSG_EXPORT UpdateCallback : public osg::StateAttributeCallback
+        {
+            virtual void operator () (osg::StateAttribute* attr, osg::NodeVisitor* nv);
+        };
 
         /** method for sending pointer events to images that are acting as front ends to interactive surfaces such as a vnc or browser window.  Return true if handled. */
Index: /OpenSceneGraph/trunk/include/osg/ImageSequence
===================================================================
--- /OpenSceneGraph/trunk/include/osg/ImageSequence (revision 10671)
+++ /OpenSceneGraph/trunk/include/osg/ImageSequence (revision 10924)
@@ -17,5 +17,4 @@
 #include <OpenThreads/Mutex>
 #include <osg/ImageStream>
-#include <osg/StateAttribute>
 
 #include <list>
@@ -102,12 +101,10 @@
         Images& getImages() { return _images; }
         const Images& getImages() const { return _images; }
-        
 
+        /** ImageSequence requires a call to update(NodeVisitor*) during the update traversal so return true.*/
+        virtual bool requiresUpdateCall() const { return true; }
+
+        /** update method for osg::Image subclasses that update themselves during the update traversal.*/
         virtual void update(NodeVisitor* nv);
-
-        struct OSG_EXPORT UpdateCallback : public osg::StateAttributeCallback
-        {
-            virtual void operator () (osg::StateAttribute* attr, osg::NodeVisitor* nv);
-        };
 
     protected:
Index: /OpenSceneGraph/trunk/src/osg/ImageSequence.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osg/ImageSequence.cpp (revision 9062)
+++ /OpenSceneGraph/trunk/src/osg/ImageSequence.cpp (revision 10924)
@@ -23,18 +23,4 @@
 using namespace osg;
 
-void ImageSequence::UpdateCallback::operator () (osg::StateAttribute* attr, osg::NodeVisitor* nv)
-{
-    osg::Texture* texture = attr ? attr->asTexture() : 0;
-    
-    // osg::notify(osg::NOTICE)<<"ImageSequence::UpdateCallback::"<<texture<<std::endl;
-    if (texture)
-    {
-        for(unsigned int i=0; i<texture->getNumImages(); ++i)
-        {
-            texture->getImage(i)->update(nv);
-        }
-    }
-}
-
 ImageSequence::ImageSequence()
 {
Index: /OpenSceneGraph/trunk/src/osg/Image.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osg/Image.cpp (revision 10866)
+++ /OpenSceneGraph/trunk/src/osg/Image.cpp (revision 10924)
@@ -63,4 +63,18 @@
 using namespace osg;
 using namespace std;
+
+void Image::UpdateCallback::operator () (osg::StateAttribute* attr, osg::NodeVisitor* nv)
+{
+    osg::Texture* texture = attr ? attr->asTexture() : 0;
+
+    // osg::notify(osg::NOTICE)<<"ImageSequence::UpdateCallback::"<<texture<<std::endl;
+    if (texture)
+    {
+        for(unsigned int i=0; i<texture->getNumImages(); ++i)
+        {
+            texture->getImage(i)->update(nv);
+        }
+    }
+}
 
 Image::Image()
Index: /OpenSceneGraph/trunk/src/osg/TextureRectangle.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osg/TextureRectangle.cpp (revision 10867)
+++ /OpenSceneGraph/trunk/src/osg/TextureRectangle.cpp (revision 10924)
@@ -14,5 +14,4 @@
 #include <osg/GLExtensions>
 #include <osg/TextureRectangle>
-#include <osg/ImageSequence>
 #include <osg/State>
 #include <osg/GLU>
@@ -127,5 +126,5 @@
     if (_image == image) return;
 
-    if (dynamic_cast<osg::ImageSequence*>(_image.get()))
+    if (_image.valid() && _image->requiresUpdateCall())
     {
         setUpdateCallback(0);
@@ -137,8 +136,8 @@
 
     _image = image;
-    
-    if (dynamic_cast<osg::ImageSequence*>(_image.get()))
-    {
-        setUpdateCallback(new ImageSequence::UpdateCallback());
+
+    if (_image.valid() && _image->requiresUpdateCall())
+    {
+        setUpdateCallback(new Image::UpdateCallback());
         setDataVariance(osg::Object::DYNAMIC);
     }
Index: /OpenSceneGraph/trunk/src/osg/Texture1D.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osg/Texture1D.cpp (revision 10867)
+++ /OpenSceneGraph/trunk/src/osg/Texture1D.cpp (revision 10924)
@@ -13,5 +13,4 @@
 #include <osg/GLExtensions>
 #include <osg/Texture1D>
-#include <osg/ImageSequence>
 #include <osg/State>
 #include <osg/GLU>
@@ -98,5 +97,5 @@
     if (_image == image) return;
 
-    if (dynamic_cast<osg::ImageSequence*>(_image.get()))
+    if (_image.valid() && _image->requiresUpdateCall())
     {
         setUpdateCallback(0);
@@ -110,7 +109,7 @@
     _modifiedCount.setAllElementsTo(0);
     
-    if (dynamic_cast<osg::ImageSequence*>(_image.get()))
-    {
-        setUpdateCallback(new ImageSequence::UpdateCallback());
+    if (_image.valid() && _image->requiresUpdateCall())
+    {
+        setUpdateCallback(new Image::UpdateCallback());
         setDataVariance(osg::Object::DYNAMIC);
     }
Index: /OpenSceneGraph/trunk/src/osg/Texture3D.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osg/Texture3D.cpp (revision 10867)
+++ /OpenSceneGraph/trunk/src/osg/Texture3D.cpp (revision 10924)
@@ -14,5 +14,4 @@
 #include <osg/Texture3D>
 #include <osg/State>
-#include <osg/ImageSequence>
 #include <osg/GLU>
 #include <osg/Notify>
@@ -110,5 +109,5 @@
     if (_image == image) return;
 
-    if (dynamic_cast<osg::ImageSequence*>(_image.get()))
+    if (_image.valid() && _image->requiresUpdateCall())
     {
         setUpdateCallback(0);
@@ -122,8 +121,8 @@
 
     _image = image;
-    
-    if (dynamic_cast<osg::ImageSequence*>(_image.get()))
-    {
-        setUpdateCallback(new ImageSequence::UpdateCallback());
+
+    if (_image.valid() && _image->requiresUpdateCall())
+    {
+        setUpdateCallback(new Image::UpdateCallback());
         setDataVariance(osg::Object::DYNAMIC);
     }
Index: /OpenSceneGraph/trunk/src/osg/TextureCubeMap.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osg/TextureCubeMap.cpp (revision 10867)
+++ /OpenSceneGraph/trunk/src/osg/TextureCubeMap.cpp (revision 10924)
@@ -16,5 +16,4 @@
 #include <osg/State>
 #include <osg/TextureCubeMap>
-#include <osg/ImageSequence>
 #include <osg/Notify>
 
@@ -132,9 +131,8 @@
     if (_images[face] == image) return;
 
-    unsigned numImageSequencesBefore = 0;
+    unsigned numImageRequireUpdateBefore = 0;
     for (unsigned int i=0; i<getNumImages(); ++i)
     {
-        osg::ImageSequence* is = dynamic_cast<osg::ImageSequence*>(_images[i].get());
-        if (is) ++numImageSequencesBefore;
+        if (_images[i].valid() && _images[i]->requiresUpdateCall()) ++numImageRequireUpdateBefore;
     }
 
@@ -143,15 +141,14 @@
 
 
-    // find out if we need to reset the update callback to handle the animation of ImageSequence
-    unsigned numImageSequencesAfter = 0;
+    // find out if we need to reset the update callback to handle the animation of image
+    unsigned numImageRequireUpdateAfter = 0;
     for (unsigned int i=0; i<getNumImages(); ++i)
     {
-        osg::ImageSequence* is = dynamic_cast<osg::ImageSequence*>(_images[i].get());
-        if (is) ++numImageSequencesAfter;
-    }
-
-    if (numImageSequencesBefore>0)
-    {
-        if (numImageSequencesAfter==0)
+        if (_images[i].valid() && _images[i]->requiresUpdateCall()) ++numImageRequireUpdateAfter;
+    }
+
+    if (numImageRequireUpdateBefore>0)
+    {
+        if (numImageRequireUpdateAfter==0)
         {
             setUpdateCallback(0);
@@ -159,7 +156,7 @@
         }
     }
-    else if (numImageSequencesAfter>0)
-    {
-        setUpdateCallback(new ImageSequence::UpdateCallback());
+    else if (numImageRequireUpdateAfter>0)
+    {
+        setUpdateCallback(new Image::UpdateCallback());
         setDataVariance(osg::Object::DYNAMIC);
     }
Index: /OpenSceneGraph/trunk/src/osg/Texture2DArray.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osg/Texture2DArray.cpp (revision 10867)
+++ /OpenSceneGraph/trunk/src/osg/Texture2DArray.cpp (revision 10924)
@@ -14,5 +14,4 @@
 #include <osg/Texture2DArray>
 #include <osg/State>
-#include <osg/ImageSequence>
 #include <osg/Notify>
 
@@ -114,9 +113,8 @@
     if (_images[layer] == image) return;
 
-    unsigned numImageSequencesBefore = 0;
+    unsigned numImageRequireUpdateBefore = 0;
     for (unsigned int i=0; i<getNumImages(); ++i)
     {
-        osg::ImageSequence* is = dynamic_cast<osg::ImageSequence*>(_images[i].get());
-        if (is) ++numImageSequencesBefore;
+        if (_images[i].valid() && _images[i]->requiresUpdateCall()) ++numImageRequireUpdateBefore;
     }
 
@@ -125,15 +123,14 @@
    _modifiedCount[layer].setAllElementsTo(0);
 
-    // find out if we need to reset the update callback to handle the animation of ImageSequence
-    unsigned numImageSequencesAfter = 0;
+    // find out if we need to reset the update callback to handle the animation of image
+    unsigned numImageRequireUpdateAfter = 0;
     for (unsigned int i=0; i<getNumImages(); ++i)
     {
-        osg::ImageSequence* is = dynamic_cast<osg::ImageSequence*>(_images[i].get());
-        if (is) ++numImageSequencesAfter;
-    }
-
-    if (numImageSequencesBefore>0)
-    {
-        if (numImageSequencesAfter==0)
+        if (_images[i].valid() && _images[i]->requiresUpdateCall()) ++numImageRequireUpdateAfter;
+    }
+
+    if (numImageRequireUpdateBefore>0)
+    {
+        if (numImageRequireUpdateAfter==0)
         {
             setUpdateCallback(0);
@@ -141,7 +138,7 @@
         }
     }
-    else if (numImageSequencesAfter>0)
-    {
-        setUpdateCallback(new ImageSequence::UpdateCallback());
+    else if (numImageRequireUpdateAfter>0)
+    {
+        setUpdateCallback(new Image::UpdateCallback());
         setDataVariance(osg::Object::DYNAMIC);
     }
Index: /OpenSceneGraph/trunk/src/osg/Texture2D.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osg/Texture2D.cpp (revision 10865)
+++ /OpenSceneGraph/trunk/src/osg/Texture2D.cpp (revision 10924)
@@ -14,5 +14,4 @@
 #include <osg/GLExtensions>
 #include <osg/Texture2D>
-#include <osg/ImageSequence>
 #include <osg/State>
 #include <osg/Notify>
@@ -111,5 +110,5 @@
     if (_image == image) return;
 
-    if (dynamic_cast<osg::ImageSequence*>(_image.get()))
+    if (_image.valid() && _image->requiresUpdateCall())
     {
         setUpdateCallback(0);
@@ -119,8 +118,8 @@
     _image = image;
     _modifiedCount.setAllElementsTo(0);
-    
-    if (dynamic_cast<osg::ImageSequence*>(_image.get()))
-    {
-        setUpdateCallback(new ImageSequence::UpdateCallback());
+
+    if (_image.valid() && _image->requiresUpdateCall())
+    {
+        setUpdateCallback(new Image::UpdateCallback());
         setDataVariance(osg::Object::DYNAMIC);
     }
Index: /OpenSceneGraph/trunk/src/osgWrappers/osg/ImageSequence.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgWrappers/osg/ImageSequence.cpp (revision 10863)
+++ /OpenSceneGraph/trunk/src/osgWrappers/osg/ImageSequence.cpp (revision 10924)
@@ -16,5 +16,4 @@
 #include <osg/NodeVisitor>
 #include <osg/Object>
-#include <osg/StateAttribute>
 
 // Must undefine IN and OUT macros defined in Windows headers
@@ -207,8 +206,13 @@
 	          "",
 	          "");
+	I_Method0(bool, requiresUpdateCall,
+	          Properties::VIRTUAL,
+	          __bool__requiresUpdateCall,
+	          "ImageSequence requires a call to update(NodeVisitor*) during the update traversal so return true. ",
+	          "");
 	I_Method1(void, update, IN, osg::NodeVisitor *, nv,
 	          Properties::VIRTUAL,
 	          __void__update__NodeVisitor_P1,
-	          "",
+	          "update method for osg::Image subclasses that update themselves during the update traversal. ",
 	          "");
 	I_ProtectedMethod0(void, applyLoopingMode,
@@ -270,12 +274,4 @@
 END_REFLECTOR
 
-BEGIN_OBJECT_REFLECTOR(osg::ImageSequence::UpdateCallback)
-	I_DeclaringFile("osg/ImageSequence");
-	I_BaseType(osg::StateAttributeCallback);
-	I_Constructor0(____UpdateCallback,
-	               "",
-	               "");
-END_REFLECTOR
-
 BEGIN_VALUE_REFLECTOR(osg::ref_ptr< osg::Image >)
 	I_DeclaringFile("osg/ref_ptr");
Index: /OpenSceneGraph/trunk/src/osgWrappers/osg/Image.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgWrappers/osg/Image.cpp (revision 10876)
+++ /OpenSceneGraph/trunk/src/osgWrappers/osg/Image.cpp (revision 10924)
@@ -17,4 +17,5 @@
 #include <osg/NodeVisitor>
 #include <osg/Object>
+#include <osg/StateAttribute>
 #include <osg/Vec2>
 #include <osg/Vec3>
@@ -376,8 +377,13 @@
 	          "Get the const PixelBufferObject. ",
 	          "");
+	I_Method0(bool, requiresUpdateCall,
+	          Properties::VIRTUAL,
+	          __bool__requiresUpdateCall,
+	          "return whether the update(NodeVisitor* nv) should be required on each frame to enable proper working of osg::Image. ",
+	          "");
 	I_Method1(void, update, IN, osg::NodeVisitor *, x,
 	          Properties::VIRTUAL,
 	          __void__update__NodeVisitor_P1,
-	          "",
+	          "update method for osg::Image subclasses that update themselves during the update traversal. ",
 	          "");
 	I_Method3(bool, sendPointerEvent, IN, int, x, IN, int, x, IN, int, x,
@@ -499,4 +505,12 @@
 END_REFLECTOR
 
+BEGIN_OBJECT_REFLECTOR(osg::Image::UpdateCallback)
+	I_DeclaringFile("osg/Image");
+	I_BaseType(osg::StateAttributeCallback);
+	I_Constructor0(____UpdateCallback,
+	               "",
+	               "");
+END_REFLECTOR
+
 STD_VECTOR_REFLECTOR(std::vector< unsigned int >)
 
