Index: /OpenSceneGraph/trunk/include/osg/Referenced
===================================================================
--- /OpenSceneGraph/trunk/include/osg/Referenced (revision 9343)
+++ /OpenSceneGraph/trunk/include/osg/Referenced (revision 9549)
@@ -90,8 +90,8 @@
 
         /** Add a Observer that is observing this object, notify the Observer when this object gets deleted.*/
-        void addObserver(Observer* observer);
+        void addObserver(Observer* observer) const;
 
         /** Add a Observer that is observing this object, notify the Observer when this object gets deleted.*/
-        void removeObserver(Observer* observer);
+        void removeObserver(Observer* observer) const;
 
     public:
@@ -122,5 +122,5 @@
         struct ObserverSetData;
 
-        OpenThreads::AtomicPtr _observerSetDataPtr;
+        mutable OpenThreads::AtomicPtr _observerSetDataPtr;
 
         mutable OpenThreads::Atomic     _refCount;
@@ -131,5 +131,5 @@
         mutable int                     _refCount;
         
-        void*                           _observers;
+        mutable void*                   _observers;
 #endif
 };
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;
Index: /OpenSceneGraph/trunk/src/osg/Referenced.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osg/Referenced.cpp (revision 9343)
+++ /OpenSceneGraph/trunk/src/osg/Referenced.cpp (revision 9549)
@@ -310,5 +310,5 @@
 }
 
-void Referenced::addObserver(Observer* observer)
+void Referenced::addObserver(Observer* observer) const
 {
 #if defined(_OSG_REFERENCED_USE_ATOMIC_OPERATIONS)
@@ -338,5 +338,5 @@
 }
 
-void Referenced::removeObserver(Observer* observer)
+void Referenced::removeObserver(Observer* observer) const
 {
 #if defined(_OSG_REFERENCED_USE_ATOMIC_OPERATIONS)
Index: /OpenSceneGraph/trunk/src/osg/State.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osg/State.cpp (revision 9469)
+++ /OpenSceneGraph/trunk/src/osg/State.cpp (revision 9549)
@@ -91,4 +91,21 @@
 State::~State()
 {
+    for(AppliedProgramObjectSet::iterator itr = _appliedProgramObjectSet.begin();
+        itr != _appliedProgramObjectSet.end();
+        ++itr)
+    {
+        (*itr)->removeObserver(this);
+    }
+}
+
+void State::objectDeleted(void* object)
+{
+    const Program::PerContextProgram* ppcp = reinterpret_cast<const Program::PerContextProgram*>(object);
+    AppliedProgramObjectSet::iterator itr = _appliedProgramObjectSet.find(ppcp);
+    if (itr != _appliedProgramObjectSet.end()) 
+    {
+        osg::notify(osg::NOTICE)<<"Removing _appliedProgramObjectSet entry "<<ppcp<<std::endl;
+        _appliedProgramObjectSet.erase(itr);
+    }
 }
 
Index: /OpenSceneGraph/trunk/src/osgWrappers/osg/State.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgWrappers/osg/State.cpp (revision 9449)
+++ /OpenSceneGraph/trunk/src/osgWrappers/osg/State.cpp (revision 9549)
@@ -44,4 +44,5 @@
 	I_DeclaringFile("osg/State");
 	I_BaseType(osg::Referenced);
+	I_BaseType(osg::Observer);
 	I_Constructor0(____State,
 	               "",
@@ -716,4 +717,9 @@
 	          __void__initializeExtensionProcs,
 	          "Initialize extension used by osg:State. ",
+	          "");
+	I_Method1(void, objectDeleted, IN, void *, object,
+	          Properties::VIRTUAL,
+	          __void__objectDeleted__void_P1,
+	          "",
 	          "");
 
