Index: /OpenSceneGraph/trunk/src/osgPlugins/fbx/ReaderWriterFBX.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgPlugins/fbx/ReaderWriterFBX.cpp (revision 11252)
+++ /OpenSceneGraph/trunk/src/osgPlugins/fbx/ReaderWriterFBX.cpp (revision 11262)
@@ -98,4 +98,28 @@
 };
 
+//Some files don't correctly mark their skeleton nodes, so this function infers
+//them from the nodes that skin deformers linked to.
+void findLinkedFbxSkeletonNodes(KFbxNode* pNode, std::set<const KFbxNode*>& fbxSkeletons)
+{
+    if (const KFbxGeometry* pMesh = dynamic_cast<const KFbxGeometry*>(pNode->GetNodeAttribute()))
+    {
+        for (int i = 0; i < pMesh->GetDeformerCount(KFbxDeformer::eSKIN); ++i)
+        {
+            const KFbxSkin* pSkin = (const KFbxSkin*)pMesh->GetDeformer(i, KFbxDeformer::eSKIN);
+
+            for (int j = 0; j < pSkin->GetClusterCount(); ++j)
+            {
+                const KFbxNode* pSkeleton = pSkin->GetCluster(j)->GetLink();
+                fbxSkeletons.insert(pSkeleton);
+            }
+        }
+    }
+
+    for (int i = 0; i < pNode->GetChildCount(); ++i)
+    {
+        findLinkedFbxSkeletonNodes(pNode->GetChild(i), fbxSkeletons);
+    }
+}
+
 void resolveBindMatrices(
     osg::Node& root,
@@ -142,5 +166,5 @@
 
                     osgAnimation::RigGeometry* pRigGeometry = it->first.second;
-                    
+
                     osgAnimation::VertexInfluenceMap* vertexInfluences = pRigGeometry->getInfluenceMap();
 
@@ -262,4 +286,7 @@
             FbxMaterialToOsgStateSet fbxMaterialToOsgStateSet(filePath, localOptions.get());
 
+            std::set<const KFbxNode*> fbxSkeletons;
+            findLinkedFbxSkeletonNodes(pNode, fbxSkeletons);
+
             std::map<KFbxNode*, osg::Node*> nodeMap;
             BindMatrixMap boneBindMatrices;
@@ -267,5 +294,5 @@
             ReadResult res = readFbxNode(*pSdkManager, pNode, pAnimationManager,
                 bIsBone, nLightCount, fbxMaterialToOsgStateSet, nodeMap,
-                boneBindMatrices, skeletonMap, localOptions.get());
+                boneBindMatrices, fbxSkeletons, skeletonMap, localOptions.get());
 
             if (res.success())
Index: /OpenSceneGraph/trunk/src/osgPlugins/fbx/fbxRNode.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgPlugins/fbx/fbxRNode.cpp (revision 11153)
+++ /OpenSceneGraph/trunk/src/osgPlugins/fbx/fbxRNode.cpp (revision 11262)
@@ -325,4 +325,5 @@
     std::map<KFbxNode*, osg::Node*>& nodeMap,
     BindMatrixMap& boneBindMatrices,
+    const std::set<const KFbxNode*>& fbxSkeletons,
     std::map<KFbxNode*, osgAnimation::Skeleton*>& skeletonMap,
     const osgDB::Options* options)
@@ -349,4 +350,9 @@
             bIsBone = true;
         }
+    }
+
+    if (!bIsBone && fbxSkeletons.find(pNode) != fbxSkeletons.end())
+    {
+        bIsBone = true;
     }
 
@@ -378,5 +384,5 @@
             pSdkManager, pChildNode, pAnimationManager,
             bChildIsBone, nLightCount, fbxMaterialToOsgStateSet, nodeMap,
-            boneBindMatrices, skeletonMap, options);
+            boneBindMatrices, fbxSkeletons, skeletonMap, options);
         if (childResult.error())
         {
@@ -426,5 +432,6 @@
             size_t bindMatrixCount = boneBindMatrices.size();
             osgDB::ReaderWriter::ReadResult meshRes = readFbxMesh(pSdkManager,
-                pNode, pAnimationManager, stateSetList, boneBindMatrices, skeletonMap);
+                pNode, pAnimationManager, stateSetList, boneBindMatrices,
+                fbxSkeletons, skeletonMap);
             if (meshRes.error())
             {
@@ -491,5 +498,5 @@
     if (bCreateSkeleton)
     {
-        osgAnimation::Skeleton* osgSkeleton = getSkeleton(pNode, skeletonMap);
+        osgAnimation::Skeleton* osgSkeleton = getSkeleton(pNode, fbxSkeletons, skeletonMap);
         osgSkeleton->setDefaultUpdateCallback();
         pAddChildrenTo->addChild(osgSkeleton);
@@ -511,10 +518,12 @@
 
 osgAnimation::Skeleton* getSkeleton(KFbxNode* fbxNode,
+    const std::set<const KFbxNode*>& fbxSkeletons,
     std::map<KFbxNode*, osgAnimation::Skeleton*>& skeletonMap)
 {
     //Find the first non-skeleton ancestor of the node.
     while (fbxNode &&
-        fbxNode->GetNodeAttribute() &&
-        fbxNode->GetNodeAttribute()->GetAttributeType() == KFbxNodeAttribute::eSKELETON)
+        ((fbxNode->GetNodeAttribute() &&
+        fbxNode->GetNodeAttribute()->GetAttributeType() == KFbxNodeAttribute::eSKELETON) ||
+        fbxSkeletons.find(fbxNode) != fbxSkeletons.end()))
     {
         fbxNode = fbxNode->GetParent();
Index: /OpenSceneGraph/trunk/src/osgPlugins/fbx/fbxRNode.h
===================================================================
--- /OpenSceneGraph/trunk/src/osgPlugins/fbx/fbxRNode.h (revision 11153)
+++ /OpenSceneGraph/trunk/src/osgPlugins/fbx/fbxRNode.h (revision 11262)
@@ -11,5 +11,7 @@
 typedef std::map<std::pair<KFbxNode*, osgAnimation::RigGeometry*>, osg::Matrix> BindMatrixMap;
 
-osgAnimation::Skeleton* getSkeleton(KFbxNode*, std::map<KFbxNode*, osgAnimation::Skeleton*>&);
+osgAnimation::Skeleton* getSkeleton(KFbxNode*,
+    const std::set<const KFbxNode*>& fbxSkeletons,
+    std::map<KFbxNode*, osgAnimation::Skeleton*>&);
 
 osgDB::ReaderWriter::ReadResult readFbxNode(
@@ -22,4 +24,5 @@
     std::map<KFbxNode*, osg::Node*>& nodeMap,
     BindMatrixMap& boneBindMatrices,
+    const std::set<const KFbxNode*>& fbxSkeletons,
     std::map<KFbxNode*, osgAnimation::Skeleton*>& skeletonMap,
     const osgDB::Options* options = NULL);
Index: /OpenSceneGraph/trunk/src/osgPlugins/fbx/fbxRMesh.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgPlugins/fbx/fbxRMesh.cpp (revision 11154)
+++ /OpenSceneGraph/trunk/src/osgPlugins/fbx/fbxRMesh.cpp (revision 11262)
@@ -293,4 +293,5 @@
     const char* szName,
     BindMatrixMap& boneBindMatrices,
+    const std::set<const KFbxNode*>& fbxSkeletons,
     std::map<KFbxNode*, osgAnimation::Skeleton*>& skeletonMap)
 {
@@ -300,5 +301,5 @@
     pGeode->setName(szName);
 
-    const KFbxLayer* pFbxLayer = 0;
+    const KFbxLayer* pFbxLayer = fbxMesh->GetLayer(0);
     const KFbxLayerElementNormal* pFbxNormals = 0;
     const KFbxLayerElementUV* pFbxUVs = 0;
@@ -308,5 +309,5 @@
     const KFbxVector4* pFbxVertices = fbxMesh->GetControlPoints();
 
-    if (pFbxLayer = fbxMesh->GetLayer(0))
+    if (pFbxLayer)
     {
         pFbxNormals = pFbxLayer->GetNormals();
@@ -615,5 +616,6 @@
         if (pSkin->GetClusterCount())
         {
-            osgAnimation::Skeleton* pSkeleton = getSkeleton(pSkin->GetCluster(0)->GetLink(), skeletonMap);
+            osgAnimation::Skeleton* pSkeleton = getSkeleton(
+                pSkin->GetCluster(0)->GetLink(), fbxSkeletons, skeletonMap);
             pSkeleton->addChild(pResult);
             return osgDB::ReaderWriter::ReadResult::FILE_LOADED;
@@ -629,4 +631,5 @@
     std::vector<StateSetContent>& stateSetList,
     BindMatrixMap& boneBindMatrices,
+    const std::set<const KFbxNode*>& fbxSkeletons,
     std::map<KFbxNode*, osgAnimation::Skeleton*>& skeletonMap)
 {
@@ -639,4 +642,4 @@
 
     return readMesh(pSdkManager, pNode, lMesh, pAnimationManager, stateSetList,
-        pNode->GetName(), boneBindMatrices, skeletonMap);
-}
+        pNode->GetName(), boneBindMatrices, fbxSkeletons, skeletonMap);
+}
Index: /OpenSceneGraph/trunk/src/osgPlugins/fbx/fbxRMesh.h
===================================================================
--- /OpenSceneGraph/trunk/src/osgPlugins/fbx/fbxRMesh.h (revision 11153)
+++ /OpenSceneGraph/trunk/src/osgPlugins/fbx/fbxRMesh.h (revision 11262)
@@ -12,4 +12,5 @@
     std::vector<StateSetContent>&,
     BindMatrixMap& boneBindMatrices,
+    const std::set<const KFbxNode*>& fbxSkeletons,
     std::map<KFbxNode*, osgAnimation::Skeleton*>& skeletonMap);
 
