Index: /OpenSceneGraph/trunk/include/osg/View
===================================================================
--- /OpenSceneGraph/trunk/include/osg/View (revision 8624)
+++ /OpenSceneGraph/trunk/include/osg/View (revision 9554)
@@ -17,4 +17,5 @@
 #include <osg/Camera>
 #include <osg/Light>
+#include <osg/Stats>
 
 #include <OpenThreads/Mutex>
@@ -38,4 +39,15 @@
         /** Take all the settings, Camera and Slaves from the passed in view, leaving it empty. */
         virtual void take(View& rhs);
+
+
+        /** Set the Stats object used for collect various frame related timing and scene graph stats.*/
+        void setStats(osg::Stats* stats) { _stats = stats; }
+
+        /** Get the Viewers Stats object.*/
+        osg::Stats* getStats() { return _stats.get(); }
+
+        /** Get the Viewers Stats object.*/
+        const osg::Stats* getStats() const { return _stats.get(); }
+
 
         /** Options for controlling the global lighting used for the view.*/
@@ -140,4 +152,6 @@
         virtual osg::GraphicsOperation* createRenderer(osg::Camera*) { return 0; }
 
+        osg::ref_ptr<osg::Stats>        _stats;
+
         LightingMode                    _lightingMode;
         osg::ref_ptr<osg::Light>        _light;
Index: /OpenSceneGraph/trunk/include/osgViewer/Viewer
===================================================================
--- /OpenSceneGraph/trunk/include/osgViewer/Viewer (revision 8893)
+++ /OpenSceneGraph/trunk/include/osgViewer/Viewer (revision 9554)
@@ -41,4 +41,15 @@
         /** Take all the settings, Camera and Slaves from the passed in view(er), leaving it empty. */
         virtual void take(View& rhs);
+
+
+        /** Set the Stats object used for collect various frame related timing and scene graph stats.*/
+        virtual void setViewerStats(osg::Stats* stats) { setStats(stats); }
+
+        /** Get the Viewers Stats object.*/
+        virtual osg::Stats* getViewerStats() { return getStats(); }
+
+        /** Get the Viewers Stats object.*/
+        virtual const osg::Stats* getViewerStats() const { return getStats(); }
+
 
         /** read the viewer configuration from a configuration file.*/
Index: /OpenSceneGraph/trunk/include/osgViewer/CompositeViewer
===================================================================
--- /OpenSceneGraph/trunk/include/osgViewer/CompositeViewer (revision 8971)
+++ /OpenSceneGraph/trunk/include/osgViewer/CompositeViewer (revision 9554)
@@ -39,4 +39,15 @@
         /** read the viewer configuration from a configuration file.*/
         bool readConfiguration(const std::string& filename);
+
+
+        /** Set the Stats object used for collect various frame related timing and scene graph stats.*/
+        virtual void setViewerStats(osg::Stats* stats) { _stats = stats; }
+
+        /** Get the Viewers Stats object.*/
+        virtual osg::Stats* getViewerStats() { return _stats.get(); }
+
+        /** Get the Viewers Stats object.*/
+        virtual const osg::Stats* getViewerStats() const { return _stats.get(); }
+
 
         void addView(osgViewer::View* view);
@@ -115,4 +126,6 @@
         bool _firstFrame;
         
+        osg::ref_ptr<osg::Stats>            _stats;
+
         osg::Timer_t                        _startTick;
         osg::ref_ptr<osg::FrameStamp>       _frameStamp;
Index: /OpenSceneGraph/trunk/include/osgViewer/ViewerBase
===================================================================
--- /OpenSceneGraph/trunk/include/osgViewer/ViewerBase (revision 9186)
+++ /OpenSceneGraph/trunk/include/osgViewer/ViewerBase (revision 9554)
@@ -42,11 +42,11 @@
         
         /** Set the Stats object used for collect various frame related timing and scene graph stats.*/
-        void setStats(osg::Stats* stats) { _stats = stats; }
+        virtual void setViewerStats(osg::Stats* stats) = 0;
 
         /** Get the Viewers Stats object.*/
-        osg::Stats* getStats() { return _stats.get(); }
+        virtual osg::Stats* getViewerStats() = 0;
 
         /** Get the Viewers Stats object.*/
-        const osg::Stats* getStats() const { return _stats.get(); }
+        virtual const osg::Stats* getViewerStats() const = 0;
 
             
@@ -260,7 +260,4 @@
 
         virtual void viewerInit() = 0;
-        
-
-        osg::ref_ptr<osg::Stats>                    _stats;
 
         bool                                        _firstFrame;
Index: /OpenSceneGraph/trunk/src/osgViewer/Viewer.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgViewer/Viewer.cpp (revision 9475)
+++ /OpenSceneGraph/trunk/src/osgViewer/Viewer.cpp (revision 9554)
@@ -178,5 +178,5 @@
     _updateVisitor->setFrameStamp(_frameStamp.get());
 
-    setStats(new osg::Stats("Viewer"));
+    setViewerStats(new osg::Stats("Viewer"));
 }
 
@@ -517,13 +517,13 @@
     }
     
-    if (getStats() && getStats()->collectStats("frame_rate"))
+    if (getViewerStats() && getViewerStats()->collectStats("frame_rate"))
     {
         // update previous frame stats
         double deltaFrameTime = _frameStamp->getReferenceTime() - prevousReferenceTime;
-        getStats()->setAttribute(previousFrameNumber, "Frame duration", deltaFrameTime);
-        getStats()->setAttribute(previousFrameNumber, "Frame rate", 1.0/deltaFrameTime);
+        getViewerStats()->setAttribute(previousFrameNumber, "Frame duration", deltaFrameTime);
+        getViewerStats()->setAttribute(previousFrameNumber, "Frame rate", 1.0/deltaFrameTime);
 
         // update current frames stats
-        getStats()->setAttribute(_frameStamp->getFrameNumber(), "Reference time", _frameStamp->getReferenceTime());
+        getViewerStats()->setAttribute(_frameStamp->getFrameNumber(), "Reference time", _frameStamp->getReferenceTime());
     }
 
@@ -855,12 +855,12 @@
     }
     
-    if (getStats() && getStats()->collectStats("event"))
+    if (getViewerStats() && getViewerStats()->collectStats("event"))
     {
         double endEventTraversal = osg::Timer::instance()->delta_s(_startTick, osg::Timer::instance()->tick());
 
         // update current frames stats
-        getStats()->setAttribute(_frameStamp->getFrameNumber(), "Event traversal begin time", beginEventTraversal);
-        getStats()->setAttribute(_frameStamp->getFrameNumber(), "Event traversal end time", endEventTraversal);
-        getStats()->setAttribute(_frameStamp->getFrameNumber(), "Event traversal time taken", endEventTraversal-beginEventTraversal);
+        getViewerStats()->setAttribute(_frameStamp->getFrameNumber(), "Event traversal begin time", beginEventTraversal);
+        getViewerStats()->setAttribute(_frameStamp->getFrameNumber(), "Event traversal end time", endEventTraversal);
+        getViewerStats()->setAttribute(_frameStamp->getFrameNumber(), "Event traversal time taken", endEventTraversal-beginEventTraversal);
     }
 
@@ -927,12 +927,12 @@
     updateSlaves();
 
-    if (getStats() && getStats()->collectStats("update"))
+    if (getViewerStats() && getViewerStats()->collectStats("update"))
     {
         double endUpdateTraversal = osg::Timer::instance()->delta_s(_startTick, osg::Timer::instance()->tick());
 
         // update current frames stats
-        getStats()->setAttribute(_frameStamp->getFrameNumber(), "Update traversal begin time", beginUpdateTraversal);
-        getStats()->setAttribute(_frameStamp->getFrameNumber(), "Update traversal end time", endUpdateTraversal);
-        getStats()->setAttribute(_frameStamp->getFrameNumber(), "Update traversal time taken", endUpdateTraversal-beginUpdateTraversal);
+        getViewerStats()->setAttribute(_frameStamp->getFrameNumber(), "Update traversal begin time", beginUpdateTraversal);
+        getViewerStats()->setAttribute(_frameStamp->getFrameNumber(), "Update traversal end time", endUpdateTraversal);
+        getViewerStats()->setAttribute(_frameStamp->getFrameNumber(), "Update traversal time taken", endUpdateTraversal-beginUpdateTraversal);
     }
 }
Index: /OpenSceneGraph/trunk/src/osgViewer/CompositeViewer.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgViewer/CompositeViewer.cpp (revision 9462)
+++ /OpenSceneGraph/trunk/src/osgViewer/CompositeViewer.cpp (revision 9554)
@@ -73,5 +73,5 @@
     _updateVisitor->setFrameStamp(_frameStamp.get());
 
-    setStats(new osg::Stats("CompsiteViewer"));
+    setViewerStats(new osg::Stats("CompsiteViewer"));
 }
 
@@ -565,13 +565,13 @@
     }
     
-    if (getStats() && getStats()->collectStats("frame_rate"))
+    if (getViewerStats() && getViewerStats()->collectStats("frame_rate"))
     {
         // update previous frame stats
         double deltaFrameTime = _frameStamp->getReferenceTime() - prevousReferenceTime;
-        getStats()->setAttribute(previousFrameNumber, "Frame duration", deltaFrameTime);
-        getStats()->setAttribute(previousFrameNumber, "Frame rate", 1.0/deltaFrameTime);
+        getViewerStats()->setAttribute(previousFrameNumber, "Frame duration", deltaFrameTime);
+        getViewerStats()->setAttribute(previousFrameNumber, "Frame rate", 1.0/deltaFrameTime);
 
         // update current frames stats
-        getStats()->setAttribute(_frameStamp->getFrameNumber(), "Reference time", _frameStamp->getReferenceTime());
+        getViewerStats()->setAttribute(_frameStamp->getFrameNumber(), "Reference time", _frameStamp->getReferenceTime());
     }
 
@@ -945,12 +945,12 @@
     
 
-    if (getStats() && getStats()->collectStats("event"))
+    if (getViewerStats() && getViewerStats()->collectStats("event"))
     {
         double endEventTraversal = osg::Timer::instance()->delta_s(_startTick, osg::Timer::instance()->tick());
 
         // update current frames stats
-        getStats()->setAttribute(_frameStamp->getFrameNumber(), "Event traversal begin time", beginEventTraversal);
-        getStats()->setAttribute(_frameStamp->getFrameNumber(), "Event traversal end time", endEventTraversal);
-        getStats()->setAttribute(_frameStamp->getFrameNumber(), "Event traversal time taken", endEventTraversal-beginEventTraversal);
+        getViewerStats()->setAttribute(_frameStamp->getFrameNumber(), "Event traversal begin time", beginEventTraversal);
+        getViewerStats()->setAttribute(_frameStamp->getFrameNumber(), "Event traversal end time", endEventTraversal);
+        getViewerStats()->setAttribute(_frameStamp->getFrameNumber(), "Event traversal time taken", endEventTraversal-beginEventTraversal);
     }
 }
@@ -1035,12 +1035,12 @@
     }
     
-    if (getStats() && getStats()->collectStats("update"))
+    if (getViewerStats() && getViewerStats()->collectStats("update"))
     {
         double endUpdateTraversal = osg::Timer::instance()->delta_s(_startTick, osg::Timer::instance()->tick());
 
         // update current frames stats
-        getStats()->setAttribute(_frameStamp->getFrameNumber(), "Update traversal begin time", beginUpdateTraversal);
-        getStats()->setAttribute(_frameStamp->getFrameNumber(), "Update traversal end time", endUpdateTraversal);
-        getStats()->setAttribute(_frameStamp->getFrameNumber(), "Update traversal time taken", endUpdateTraversal-beginUpdateTraversal);
+        getViewerStats()->setAttribute(_frameStamp->getFrameNumber(), "Update traversal begin time", beginUpdateTraversal);
+        getViewerStats()->setAttribute(_frameStamp->getFrameNumber(), "Update traversal end time", endUpdateTraversal);
+        getViewerStats()->setAttribute(_frameStamp->getFrameNumber(), "Update traversal time taken", endUpdateTraversal-beginUpdateTraversal);
     }
 
Index: /OpenSceneGraph/trunk/src/osgViewer/StatsHandler.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgViewer/StatsHandler.cpp (revision 9552)
+++ /OpenSceneGraph/trunk/src/osgViewer/StatsHandler.cpp (revision 9554)
@@ -25,5 +25,4 @@
 #include <osg/PolygonMode>
 #include <osg/Geometry>
-#include <osgUtil/Statistics>
 
 namespace osgViewer
@@ -71,5 +70,5 @@
             if (ea.getKey()==_keyEventTogglesOnScreenStats)
             {
-                if (viewer->getStats())
+                if (viewer->getViewerStats())
                 {
                     if (!_initialized)
@@ -90,7 +89,7 @@
                         case(NO_STATS):
                         {
-                            viewer->getStats()->collectStats("frame_rate",false);
-                            viewer->getStats()->collectStats("event",false);
-                            viewer->getStats()->collectStats("update",false);
+                            viewer->getViewerStats()->collectStats("frame_rate",false);
+                            viewer->getViewerStats()->collectStats("event",false);
+                            viewer->getViewerStats()->collectStats("update",false);
 
                             for(osgViewer::ViewerBase::Cameras::iterator itr = cameras.begin();
@@ -107,5 +106,5 @@
                             }
                             
-                            viewer->getStats()->collectStats("scene",false);
+                            viewer->getViewerStats()->collectStats("scene",false);
 
                             _camera->setNodeMask(0x0); 
@@ -115,5 +114,5 @@
                         case(FRAME_RATE):
                         {
-                            viewer->getStats()->collectStats("frame_rate",true);
+                            viewer->getViewerStats()->collectStats("frame_rate",true);
                             
                             _camera->setNodeMask(0xffffffff);
@@ -137,6 +136,6 @@
                             }
                         
-                            viewer->getStats()->collectStats("event",true);
-                            viewer->getStats()->collectStats("update",true);
+                            viewer->getViewerStats()->collectStats("event",true);
+                            viewer->getViewerStats()->collectStats("update",true);
 
                             for(osgViewer::ViewerBase::Cameras::iterator itr = cameras.begin();
@@ -175,5 +174,5 @@
                             _switch->setValue(_viewerSceneChildNum, true);
 
-                            viewer->getStats()->collectStats("scene",true);
+                            viewer->getViewerStats()->collectStats("scene",true);
 
                             break;
@@ -189,10 +188,10 @@
             if (ea.getKey()==_keyEventPrintsOutStats)
             {
-                if (viewer->getStats())
+                if (viewer->getViewerStats())
                 {
                     osg::notify(osg::NOTICE)<<std::endl<<"Stats report:"<<std::endl;
                     typedef std::vector<osg::Stats*> StatsList;
                     StatsList statsList;
-                    statsList.push_back(viewer->getStats());
+                    statsList.push_back(viewer->getViewerStats());
 
                     osgViewer::ViewerBase::Contexts contexts;
@@ -214,5 +213,5 @@
                     }
 
-                    for(int i = viewer->getStats()->getEarliestFrameNumber(); i<= viewer->getStats()->getLatestFrameNumber()-1; ++i)
+                    for(int i = viewer->getViewerStats()->getEarliestFrameNumber(); i<= viewer->getViewerStats()->getLatestFrameNumber()-1; ++i)
                     {
                         for(StatsList::iterator itr = statsList.begin();
@@ -387,5 +386,5 @@
                         viewStr << std::setw(7) << value << std::endl; \
                     else \
-                        viewStr << std::setw(7) << "no value" << std::endl; \
+                        viewStr << std::setw(7) << "." << std::endl; \
 
                 double value = 0.0;
@@ -445,11 +444,7 @@
         {
             _tickLastUpdated = tick;
-            osg::ref_ptr<osg::Node> sceneRoot = _view.valid() ? _view->getScene()->getSceneData() : 0;
-
-            if (sceneRoot.valid())
-            {
-                osgUtil::StatsVisitor statsVisitor;
-                sceneRoot->accept(statsVisitor);
-
+            osg::Stats* stats = _view->getStats();
+            if (stats)
+            {
                 std::ostringstream viewStr;
                 viewStr.clear();
@@ -466,31 +461,33 @@
                 viewStr << std::endl;
 
-                unsigned int unique_primitives = 0;
-                osgUtil::Statistics::PrimitiveCountMap::iterator pcmitr;
-                for(pcmitr = statsVisitor._uniqueStats.GetPrimitivesBegin();
-                    pcmitr != statsVisitor._uniqueStats.GetPrimitivesEnd();
-                    ++pcmitr)
+                int frameNumber = renderInfo.getState()->getFrameStamp()->getFrameNumber();
+                // if (!(renderer->getGraphicsThreadDoesCull()))
                 {
-                    unique_primitives += pcmitr->second;
+                    --frameNumber;
                 }
-
-                unsigned int instanced_primitives = 0;
-                for(pcmitr = statsVisitor._instancedStats.GetPrimitivesBegin();
-                    pcmitr != statsVisitor._instancedStats.GetPrimitivesEnd();
-                    ++pcmitr)
-                {
-                    instanced_primitives += pcmitr->second;
-                }
-
-                viewStr << std::setw(10) << statsVisitor._statesetSet.size()       << std::setw(10) << statsVisitor._numInstancedStateSet << std::endl;
-                viewStr << std::setw(10) << statsVisitor._groupSet.size()          << std::setw(10) << statsVisitor._numInstancedGroup << std::endl;
-                viewStr << std::setw(10) << statsVisitor._transformSet.size()      << std::setw(10) << statsVisitor._numInstancedTransform << std::endl;
-                viewStr << std::setw(10) << statsVisitor._lodSet.size()            << std::setw(10) << statsVisitor._numInstancedLOD << std::endl;
-                viewStr << std::setw(10) << statsVisitor._switchSet.size()         << std::setw(10) << statsVisitor._numInstancedSwitch << std::endl;
-                viewStr << std::setw(10) << statsVisitor._geodeSet.size()          << std::setw(10) << statsVisitor._numInstancedGeode << std::endl;
-                viewStr << std::setw(10) << statsVisitor._drawableSet.size()       << std::setw(10) << statsVisitor._numInstancedDrawable << std::endl;
-                viewStr << std::setw(10) << statsVisitor._geometrySet.size()       << std::setw(10) << statsVisitor._numInstancedGeometry << std::endl;
-                viewStr << std::setw(10) << statsVisitor._uniqueStats._vertexCount << std::setw(10) << statsVisitor._instancedStats._vertexCount << std::endl;
-                viewStr << std::setw(10) << unique_primitives                        << std::setw(10) << instanced_primitives << std::endl;
+                
+                #define STATS_ATTRIBUTE_PAIR(str1, str2) \
+                    if (stats->getAttribute(frameNumber, str1, value)) \
+                        viewStr << std::setw(10) << value; \
+                    else \
+                        viewStr << std::setw(10) << "."; \
+                    if (stats->getAttribute(frameNumber, str2, value)) \
+                        viewStr << std::setw(10) << value << std::endl; \
+                    else \
+                        viewStr << std::setw(10) << "." << std::endl; \
+
+                double value = 0.0;
+
+                STATS_ATTRIBUTE_PAIR("Number of unique StateSet","Number of instanced Stateset")
+                STATS_ATTRIBUTE_PAIR("Number of unique Group","Number of instanced Group")
+                STATS_ATTRIBUTE_PAIR("Number of unique Transform","Number of instanced Transform")
+                STATS_ATTRIBUTE_PAIR("Number of unique LOD","Number of instanced LOD")
+                STATS_ATTRIBUTE_PAIR("Number of unique Switch","Number of instanced Switch")
+                STATS_ATTRIBUTE_PAIR("Number of unique Geode","Number of instanced Geode")
+                STATS_ATTRIBUTE_PAIR("Number of unique Drawable","Number of instanced Drawable")
+                STATS_ATTRIBUTE_PAIR("Number of unique Geometry","Number of instanced Geometry")
+                STATS_ATTRIBUTE_PAIR("Number of unique Vertices","Number of instanced Vertices")
+                STATS_ATTRIBUTE_PAIR("Number of unique Primitives","Number of instanced Primitives")
+
 
                 text->setText(viewStr.str());
@@ -1051,5 +1048,5 @@
         frameRateValue->setText("0.0");
 
-        frameRateValue->setDrawCallback(new AveragedValueTextDrawCallback(viewer->getStats(),"Frame rate",-1, true, 1.0));
+        frameRateValue->setDrawCallback(new AveragedValueTextDrawCallback(viewer->getViewerStats(),"Frame rate",-1, true, 1.0));
 
         pos.y() -= characterSize*1.5f;
@@ -1120,9 +1117,9 @@
             eventValue->setText("0.0");
 
-            eventValue->setDrawCallback(new AveragedValueTextDrawCallback(viewer->getStats(),"Event traversal time taken",-1, false, 1000.0));
+            eventValue->setDrawCallback(new AveragedValueTextDrawCallback(viewer->getViewerStats(),"Event traversal time taken",-1, false, 1000.0));
 
             pos.x() = startBlocks;
             osg::Geometry* geometry = createGeometry(pos, characterSize *0.8, colorUpdateAlpha, _numBlocks);
-            geometry->setDrawCallback(new BlockDrawCallback(this, startBlocks, viewer->getStats(), viewer->getStats(), "Event traversal begin time", "Event traversal end time", -1, _numBlocks));
+            geometry->setDrawCallback(new BlockDrawCallback(this, startBlocks, viewer->getViewerStats(), viewer->getViewerStats(), "Event traversal begin time", "Event traversal end time", -1, _numBlocks));
             geode->addDrawable(geometry);
 
@@ -1153,9 +1150,9 @@
             updateValue->setText("0.0");
 
-            updateValue->setDrawCallback(new AveragedValueTextDrawCallback(viewer->getStats(),"Update traversal time taken",-1, false, 1000.0));
+            updateValue->setDrawCallback(new AveragedValueTextDrawCallback(viewer->getViewerStats(),"Update traversal time taken",-1, false, 1000.0));
 
             pos.x() = startBlocks;
             osg::Geometry* geometry = createGeometry(pos, characterSize *0.8, colorUpdateAlpha, _numBlocks);
-            geometry->setDrawCallback(new BlockDrawCallback(this, startBlocks, viewer->getStats(), viewer->getStats(), "Update traversal begin time", "Update traversal end time", -1, _numBlocks));
+            geometry->setDrawCallback(new BlockDrawCallback(this, startBlocks, viewer->getViewerStats(), viewer->getViewerStats(), "Update traversal begin time", "Update traversal end time", -1, _numBlocks));
             geode->addDrawable(geometry);
 
@@ -1170,5 +1167,5 @@
             ++citr)
         {
-            group->addChild(createCameraTimeStats(font, pos, startBlocks, acquireGPUStats, characterSize, viewer->getStats(), *citr));
+            group->addChild(createCameraTimeStats(font, pos, startBlocks, acquireGPUStats, characterSize, viewer->getViewerStats(), *citr));
         }
 
@@ -1188,5 +1185,5 @@
 
             osg::Geometry* frameMarkers = createFrameMarkers(pos, height, colourTicks, _numBlocks + 1);
-            frameMarkers->setDrawCallback(new FrameMarkerDrawCallback(this, startBlocks, viewer->getStats(), 0, _numBlocks + 1));
+            frameMarkers->setDrawCallback(new FrameMarkerDrawCallback(this, startBlocks, viewer->getViewerStats(), 0, _numBlocks + 1));
             geode->addDrawable(frameMarkers);
 
@@ -1204,7 +1201,7 @@
             group->addChild(statsGraph);
 
-            statsGraph->addStatGraph(viewer->getStats(), viewer->getStats(), colorFR, 100, "Frame rate");
-            statsGraph->addStatGraph(viewer->getStats(), viewer->getStats(), colorEvent, 0.016, "Event traversal time taken");
-            statsGraph->addStatGraph(viewer->getStats(), viewer->getStats(), colorUpdate, 0.016, "Update traversal time taken");
+            statsGraph->addStatGraph(viewer->getViewerStats(), viewer->getViewerStats(), colorFR, 100, "Frame rate");
+            statsGraph->addStatGraph(viewer->getViewerStats(), viewer->getViewerStats(), colorEvent, 0.016, "Event traversal time taken");
+            statsGraph->addStatGraph(viewer->getViewerStats(), viewer->getViewerStats(), colorUpdate, 0.016, "Update traversal time taken");
             
             for(ViewerBase::Cameras::iterator citr = cameras.begin();
@@ -1212,7 +1209,7 @@
                 ++citr)
             {
-                statsGraph->addStatGraph(viewer->getStats(), (*citr)->getStats(), colorCull, 0.016, "Cull traversal time taken");
-                statsGraph->addStatGraph(viewer->getStats(), (*citr)->getStats(), colorDraw, 0.016, "Draw traversal time taken");
-                statsGraph->addStatGraph(viewer->getStats(), (*citr)->getStats(), colorGPU, 0.016, "GPU draw time taken");
+                statsGraph->addStatGraph(viewer->getViewerStats(), (*citr)->getStats(), colorCull, 0.016, "Cull traversal time taken");
+                statsGraph->addStatGraph(viewer->getViewerStats(), (*citr)->getStats(), colorDraw, 0.016, "Draw traversal time taken");
+                statsGraph->addStatGraph(viewer->getViewerStats(), (*citr)->getStats(), colorGPU, 0.016, "GPU draw time taken");
             }
 
Index: /OpenSceneGraph/trunk/src/osgViewer/ViewerBase.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgViewer/ViewerBase.cpp (revision 9131)
+++ /OpenSceneGraph/trunk/src/osgViewer/ViewerBase.cpp (revision 9554)
@@ -28,4 +28,5 @@
 #include <osgUtil/Optimizer>
 #include <osgUtil/IntersectionVisitor>
+#include <osgUtil/Statistics>
 
 static osg::ApplicationUsageProxy ViewerBase_e0(osg::ApplicationUsage::ENVIRONMENTAL_VARIABLE,"OSG_CONFIG_FILE <filename>","Specify a viewer configuration file to load by default.");
@@ -640,4 +641,64 @@
     osg::FrameStamp* frameStamp = getViewerFrameStamp();
 
+    if (getViewerStats() && getViewerStats()->collectStats("scene"))
+    {
+        int frameNumber = frameStamp ? frameStamp->getFrameNumber() : 0;
+    
+        Views views;
+        getViews(views);
+        for(Views::iterator vitr = views.begin();
+            vitr != views.end();
+            ++vitr)
+        {
+            View* view = *vitr;
+            osg::Stats* stats = view->getStats();            
+            osg::Node* sceneRoot = view->getSceneData();
+            if (sceneRoot)
+            {
+                osgUtil::StatsVisitor statsVisitor;
+                sceneRoot->accept(statsVisitor);
+                
+                unsigned int unique_primitives = 0;
+                osgUtil::Statistics::PrimitiveCountMap::iterator pcmitr;
+                for(pcmitr = statsVisitor._uniqueStats.GetPrimitivesBegin();
+                    pcmitr != statsVisitor._uniqueStats.GetPrimitivesEnd();
+                    ++pcmitr)
+                {
+                    unique_primitives += pcmitr->second;
+                }
+
+                stats->setAttribute(frameNumber, "Number of unique StateSet", static_cast<double>(statsVisitor._statesetSet.size()));
+                stats->setAttribute(frameNumber, "Number of unique Group", static_cast<double>(statsVisitor._groupSet.size()));
+                stats->setAttribute(frameNumber, "Number of unique Transform", static_cast<double>(statsVisitor._transformSet.size()));
+                stats->setAttribute(frameNumber, "Number of unique LOD", static_cast<double>(statsVisitor._lodSet.size()));
+                stats->setAttribute(frameNumber, "Number of unique Switch", static_cast<double>(statsVisitor._switchSet.size()));
+                stats->setAttribute(frameNumber, "Number of unique Geode", static_cast<double>(statsVisitor._geodeSet.size()));
+                stats->setAttribute(frameNumber, "Number of unique Drawable", static_cast<double>(statsVisitor._drawableSet.size()));
+                stats->setAttribute(frameNumber, "Number of unique Geometry", static_cast<double>(statsVisitor._geometrySet.size()));
+                stats->setAttribute(frameNumber, "Number of unique Vertices", static_cast<double>(statsVisitor._uniqueStats._vertexCount));
+                stats->setAttribute(frameNumber, "Number of unique Primitives", static_cast<double>(unique_primitives));
+
+                unsigned int instanced_primitives = 0;
+                for(pcmitr = statsVisitor._instancedStats.GetPrimitivesBegin();
+                    pcmitr != statsVisitor._instancedStats.GetPrimitivesEnd();
+                    ++pcmitr)
+                {
+                    instanced_primitives += pcmitr->second;
+                }
+
+                stats->setAttribute(frameNumber, "Number of instanced Stateset", static_cast<double>(statsVisitor._numInstancedStateSet));
+                stats->setAttribute(frameNumber, "Number of instanced Group", static_cast<double>(statsVisitor._numInstancedGroup));
+                stats->setAttribute(frameNumber, "Number of instanced Transform", static_cast<double>(statsVisitor._numInstancedTransform));
+                stats->setAttribute(frameNumber, "Number of instanced LOD", static_cast<double>(statsVisitor._numInstancedLOD));
+                stats->setAttribute(frameNumber, "Number of instanced Switch", static_cast<double>(statsVisitor._numInstancedSwitch));
+                stats->setAttribute(frameNumber, "Number of instanced Geode", static_cast<double>(statsVisitor._numInstancedGeode));
+                stats->setAttribute(frameNumber, "Number of instanced Drawable", static_cast<double>(statsVisitor._numInstancedDrawable));
+                stats->setAttribute(frameNumber, "Number of instanced Geometry", static_cast<double>(statsVisitor._numInstancedGeometry));
+                stats->setAttribute(frameNumber, "Number of instanced Vertices", static_cast<double>(statsVisitor._instancedStats._vertexCount));
+                stats->setAttribute(frameNumber, "Number of instanced Primitives", static_cast<double>(instanced_primitives));
+           }
+        }
+    }
+
     Scenes scenes;
     getScenes(scenes);
@@ -757,13 +818,13 @@
     }
 
-    if (getStats() && getStats()->collectStats("update"))
+    if (getViewerStats() && getViewerStats()->collectStats("update"))
     {
         double endRenderingTraversals = elapsedTime();
 
         // update current frames stats
-        getStats()->setAttribute(frameStamp->getFrameNumber(), "Rendering traversals begin time ", beginRenderingTraversals);
-        getStats()->setAttribute(frameStamp->getFrameNumber(), "Rendering traversals end time ", endRenderingTraversals);
-        getStats()->setAttribute(frameStamp->getFrameNumber(), "Rendering traversals time taken", endRenderingTraversals-beginRenderingTraversals);
-    }
-}
-
+        getViewerStats()->setAttribute(frameStamp->getFrameNumber(), "Rendering traversals begin time ", beginRenderingTraversals);
+        getViewerStats()->setAttribute(frameStamp->getFrameNumber(), "Rendering traversals end time ", endRenderingTraversals);
+        getViewerStats()->setAttribute(frameStamp->getFrameNumber(), "Rendering traversals time taken", endRenderingTraversals-beginRenderingTraversals);
+    }
+}
+
Index: /OpenSceneGraph/trunk/src/osgWrappers/osgUtil/Statistics.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgWrappers/osgUtil/Statistics.cpp (revision 9402)
+++ /OpenSceneGraph/trunk/src/osgWrappers/osgUtil/Statistics.cpp (revision 9554)
@@ -208,13 +208,23 @@
 	          "",
 	          "");
+	I_Method0(osgUtil::Statistics::PrimitiveCountMap &, getPrimitiveCountMap,
+	          Properties::NON_VIRTUAL,
+	          __PrimitiveCountMap_R1__getPrimitiveCountMap,
+	          "",
+	          "");
+	I_Method0(const osgUtil::Statistics::PrimitiveCountMap &, getPrimitiveCountMap,
+	          Properties::NON_VIRTUAL,
+	          __C5_PrimitiveCountMap_R1__getPrimitiveCountMap,
+	          "",
+	          "");
 	I_Method0(osgUtil::Statistics::PrimitiveCountMap::iterator, GetPrimitivesBegin,
 	          Properties::NON_VIRTUAL,
 	          __PrimitiveCountMap_iterator__GetPrimitivesBegin,
-	          "",
+	          "deprecated ",
 	          "");
 	I_Method0(osgUtil::Statistics::PrimitiveCountMap::iterator, GetPrimitivesEnd,
 	          Properties::NON_VIRTUAL,
 	          __PrimitiveCountMap_iterator__GetPrimitivesEnd,
-	          "",
+	          "deprecated ",
 	          "");
 	I_SimpleProperty(int, BinNo, 
@@ -227,4 +237,7 @@
 	                 0, 
 	                 __void__setDepth__int);
+	I_SimpleProperty(osgUtil::Statistics::PrimitiveCountMap &, PrimitiveCountMap, 
+	                 __PrimitiveCountMap_R1__getPrimitiveCountMap, 
+	                 0);
 	I_SimpleProperty(osgUtil::Statistics::StatsType, Type, 
 	                 0, 
Index: /OpenSceneGraph/trunk/src/osgWrappers/osg/View.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgWrappers/osg/View.cpp (revision 8625)
+++ /OpenSceneGraph/trunk/src/osgWrappers/osg/View.cpp (revision 9554)
@@ -18,4 +18,5 @@
 #include <osg/Matrixd>
 #include <osg/Object>
+#include <osg/Stats>
 #include <osg/View>
 
@@ -74,4 +75,19 @@
 	          __void__take__View_R1,
 	          "Take all the settings, Camera and Slaves from the passed in view, leaving it empty. ",
+	          "");
+	I_Method1(void, setStats, IN, osg::Stats *, stats,
+	          Properties::NON_VIRTUAL,
+	          __void__setStats__osg_Stats_P1,
+	          "Set the Stats object used for collect various frame related timing and scene graph stats. ",
+	          "");
+	I_Method0(osg::Stats *, getStats,
+	          Properties::NON_VIRTUAL,
+	          __osg_Stats_P1__getStats,
+	          "Get the Viewers Stats object. ",
+	          "");
+	I_Method0(const osg::Stats *, getStats,
+	          Properties::NON_VIRTUAL,
+	          __C5_osg_Stats_P1__getStats,
+	          "Get the Viewers Stats object. ",
 	          "");
 	I_Method1(void, setLightingMode, IN, osg::View::LightingMode, lightingMode,
@@ -205,4 +221,7 @@
 	                0, 
 	                __bool__removeSlave__unsigned_int);
+	I_SimpleProperty(osg::Stats *, Stats, 
+	                 __osg_Stats_P1__getStats, 
+	                 __void__setStats__osg_Stats_P1);
 END_REFLECTOR
 
Index: /OpenSceneGraph/trunk/src/osgWrappers/osgViewer/Viewer.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgWrappers/osgViewer/Viewer.cpp (revision 8895)
+++ /OpenSceneGraph/trunk/src/osgWrappers/osgViewer/Viewer.cpp (revision 9554)
@@ -18,4 +18,5 @@
 #include <osg/Node>
 #include <osg/Object>
+#include <osg/Stats>
 #include <osg/Timer>
 #include <osgViewer/GraphicsWindow>
@@ -77,4 +78,19 @@
 	          __void__take__View_R1,
 	          "Take all the settings, Camera and Slaves from the passed in view(er), leaving it empty. ",
+	          "");
+	I_Method1(void, setViewerStats, IN, osg::Stats *, stats,
+	          Properties::VIRTUAL,
+	          __void__setViewerStats__osg_Stats_P1,
+	          "Set the Stats object used for collect various frame related timing and scene graph stats. ",
+	          "");
+	I_Method0(osg::Stats *, getViewerStats,
+	          Properties::VIRTUAL,
+	          __osg_Stats_P1__getViewerStats,
+	          "Get the Viewers Stats object. ",
+	          "");
+	I_Method0(const osg::Stats *, getViewerStats,
+	          Properties::VIRTUAL,
+	          __C5_osg_Stats_P1__getViewerStats,
+	          "Get the Viewers Stats object. ",
 	          "");
 	I_Method1(bool, readConfiguration, IN, const std::string &, filename,
@@ -220,4 +236,7 @@
 	                 __osg_FrameStamp_P1__getViewerFrameStamp, 
 	                 0);
+	I_SimpleProperty(osg::Stats *, ViewerStats, 
+	                 __osg_Stats_P1__getViewerStats, 
+	                 __void__setViewerStats__osg_Stats_P1);
 END_REFLECTOR
 
Index: /OpenSceneGraph/trunk/src/osgWrappers/osgViewer/CompositeViewer.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgWrappers/osgViewer/CompositeViewer.cpp (revision 8980)
+++ /OpenSceneGraph/trunk/src/osgWrappers/osgViewer/CompositeViewer.cpp (revision 9554)
@@ -17,4 +17,5 @@
 #include <osg/FrameStamp>
 #include <osg/Object>
+#include <osg/Stats>
 #include <osg/Timer>
 #include <osgViewer/CompositeViewer>
@@ -75,4 +76,19 @@
 	          __bool__readConfiguration__C5_std_string_R1,
 	          "read the viewer configuration from a configuration file. ",
+	          "");
+	I_Method1(void, setViewerStats, IN, osg::Stats *, stats,
+	          Properties::VIRTUAL,
+	          __void__setViewerStats__osg_Stats_P1,
+	          "Set the Stats object used for collect various frame related timing and scene graph stats. ",
+	          "");
+	I_Method0(osg::Stats *, getViewerStats,
+	          Properties::VIRTUAL,
+	          __osg_Stats_P1__getViewerStats,
+	          "Get the Viewers Stats object. ",
+	          "");
+	I_Method0(const osg::Stats *, getViewerStats,
+	          Properties::VIRTUAL,
+	          __C5_osg_Stats_P1__getViewerStats,
+	          "Get the Viewers Stats object. ",
 	          "");
 	I_Method1(void, addView, IN, osgViewer::View *, view,
@@ -258,4 +274,7 @@
 	                 __osg_FrameStamp_P1__getViewerFrameStamp, 
 	                 0);
+	I_SimpleProperty(osg::Stats *, ViewerStats, 
+	                 __osg_Stats_P1__getViewerStats, 
+	                 __void__setViewerStats__osg_Stats_P1);
 END_REFLECTOR
 
Index: /OpenSceneGraph/trunk/src/osgWrappers/osgViewer/ViewerBase.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgWrappers/osgViewer/ViewerBase.cpp (revision 8895)
+++ /OpenSceneGraph/trunk/src/osgWrappers/osgViewer/ViewerBase.cpp (revision 9554)
@@ -71,17 +71,17 @@
 	               "",
 	               "");
-	I_Method1(void, setStats, IN, osg::Stats *, stats,
-	          Properties::NON_VIRTUAL,
-	          __void__setStats__osg_Stats_P1,
+	I_Method1(void, setViewerStats, IN, osg::Stats *, stats,
+	          Properties::PURE_VIRTUAL,
+	          __void__setViewerStats__osg_Stats_P1,
 	          "Set the Stats object used for collect various frame related timing and scene graph stats. ",
 	          "");
-	I_Method0(osg::Stats *, getStats,
-	          Properties::NON_VIRTUAL,
-	          __osg_Stats_P1__getStats,
+	I_Method0(osg::Stats *, getViewerStats,
+	          Properties::PURE_VIRTUAL,
+	          __osg_Stats_P1__getViewerStats,
 	          "Get the Viewers Stats object. ",
 	          "");
-	I_Method0(const osg::Stats *, getStats,
-	          Properties::NON_VIRTUAL,
-	          __C5_osg_Stats_P1__getStats,
+	I_Method0(const osg::Stats *, getViewerStats,
+	          Properties::PURE_VIRTUAL,
+	          __C5_osg_Stats_P1__getViewerStats,
 	          "Get the Viewers Stats object. ",
 	          "");
@@ -375,7 +375,4 @@
 	                 __bool__getReleaseContextAtEndOfFrameHint, 
 	                 __void__setReleaseContextAtEndOfFrameHint__bool);
-	I_SimpleProperty(osg::Stats *, Stats, 
-	                 __osg_Stats_P1__getStats, 
-	                 __void__setStats__osg_Stats_P1);
 	I_SimpleProperty(osgViewer::ViewerBase::ThreadingModel, ThreadingModel, 
 	                 __ThreadingModel__getThreadingModel, 
@@ -390,4 +387,7 @@
 	                 __osg_FrameStamp_P1__getViewerFrameStamp, 
 	                 0);
+	I_SimpleProperty(osg::Stats *, ViewerStats, 
+	                 __osg_Stats_P1__getViewerStats, 
+	                 __void__setViewerStats__osg_Stats_P1);
 END_REFLECTOR
 
