Index: OpenSceneGraph/trunk/include/osg/State
===================================================================
--- OpenSceneGraph/trunk/include/osg/State (revision 9447)
+++ OpenSceneGraph/trunk/include/osg/State (revision 9549)
@@ -20,4 +20,5 @@
 #include <osg/Uniform>
 #include <osg/BufferObject>
+#include <osg/observer_ptr>
 
 #include <osg/FrameStamp>
@@ -85,5 +86,5 @@
   *   \c captureCurrentState() and \c getModelViewMatrix()).
   */
-class OSG_EXPORT State : public Referenced
+class OSG_EXPORT State : public Referenced, public Observer
 {
     public :
@@ -961,6 +962,17 @@
 
 
-        void setLastAppliedProgramObject(const Program::PerContextProgram* program) { if (_lastAppliedProgramObject!=program) { _lastAppliedProgramObject = program; if (program) _appliedProgramObjectSet.insert(program); } }
-        const Program::PerContextProgram* getLastAppliedProgramObject() const { return _lastAppliedProgramObject; }
+        inline void setLastAppliedProgramObject(const Program::PerContextProgram* program)
+        {
+            if (_lastAppliedProgramObject!=program)
+            {
+                _lastAppliedProgramObject = program; 
+                if (program && _appliedProgramObjectSet.count(program)==0)
+                {
+                    _appliedProgramObjectSet.insert(program); 
+                    program->addObserver(this);
+                }
+            }
+        }
+        inline const Program::PerContextProgram* getLastAppliedProgramObject() const { return _lastAppliedProgramObject; }
 
         inline GLint getUniformLocation( const std::string& name ) const { return _lastAppliedProgramObject ? _lastAppliedProgramObject->getUniformLocation(name) : -1; }
@@ -1065,4 +1077,6 @@
         void initializeExtensionProcs();
 
+        virtual void objectDeleted(void* object);
+
     protected:
 
@@ -1207,5 +1221,5 @@
         typedef std::vector<ref_ptr<const Matrix> >                     MatrixStack;
         
-        typedef std::set<osg::ref_ptr<const Program::PerContextProgram> > AppliedProgramObjectSet;
+        typedef std::set<const Program::PerContextProgram* >            AppliedProgramObjectSet;
 
         ModeMap                                                         _modeMap;
