diff --git a/NifImport/ImportMeshAndSkin.cpp b/NifImport/ImportMeshAndSkin.cpp
index 5083e019ef810f6a42493a887ecaaff16cb38ed2..5287ba3630f7b2c907202d471dcfdbc6fb551037 100644
--- a/NifImport/ImportMeshAndSkin.cpp
+++ b/NifImport/ImportMeshAndSkin.cpp
@@ -105,7 +105,8 @@ bool NifImporter::ImportMesh(ImpNode *node, TriObject *o, NiTriBasedGeomRef triG
 {
    Mesh& mesh = o->GetMesh();
 
-   node->SetTransform(0,TOMATRIX3(triGeom->GetLocalTransform()));  
+   Matrix44 baseTM = (importBones) ? triGeom->GetLocalTransform() : triGeom->GetWorldTransform();
+   node->SetTransform(0,TOMATRIX3(baseTM));  
 
    // Vertex info
    {
@@ -311,39 +312,32 @@ bool NifImporter::ImportSkin(ImpNode *node, NiTriBasedGeomRef triGeom)
    if (ISkin *skin = (ISkin *) skinMod->GetInterface(I_SKIN)){
       ISkinImportData* iskinImport = (ISkinImportData*) skinMod->GetInterface(I_SKINIMPORTDATA);
 
-      Matrix3 m3;
+      Matrix3 m3(TRUE);
       if (applyOverallTransformToSkinAndBones) {
-         Matrix3 initNodeTM, initObjTM;
-         initNodeTM.IdentityMatrix(), initObjTM.IdentityMatrix();
-         skin->GetSkinInitTM(tnode, initNodeTM, false);
-         skin->GetSkinInitTM(tnode, initObjTM, true);
          m3 = TOMATRIX3(data->GetOverallTransform());
-         iskinImport->SetSkinTm(tnode, initNodeTM * m3, initObjTM * m3);
+         Matrix3 im3 = Inverse(m3);
+         iskinImport->SetSkinTm(tnode, im3, im3); // ???
       }
       // Create Bone List
       Tab<INode*> bones;
-      int i=0;
-      for (vector<NiNodeRef>::iterator itr = nifBones.begin(), end = nifBones.end(); itr != end; ++itr, ++i){
-         string name = (*itr)->GetName();
+      for (size_t i=0; i<nifBones.size(); ++i){
+         NiNodeRef bone = nifBones[i];
+         Matrix3 b3 = TOMATRIX3(data->GetBoneTransform(i));
+         Matrix3 ib3 = Inverse(b3);
+
+         string name = bone->GetName();
          if (INode *boneRef = gi->GetINodeByName(name.c_str())) {
             bones.Append(1, &boneRef);
             iskinImport->AddBoneEx(boneRef, TRUE);
 
             // Set Bone Transform
             if (applyOverallTransformToSkinAndBones) {
-               Matrix3 initNodeTM, initBoneTM;
-               initNodeTM.IdentityMatrix(), initBoneTM.IdentityMatrix();
-               skin->GetBoneInitTM(boneRef, initNodeTM, false);
-               skin->GetBoneInitTM(boneRef, initBoneTM, true);
-               iskinImport->SetBoneTm(boneRef, initNodeTM * m3, initBoneTM * m3);
+               iskinImport->SetBoneTm(boneRef, ib3, ib3);
             }
          }
       }
       ObjectState os = tnode->EvalWorldState(0);
 
-      // Need to trigger ModifyObject in BonesDefMod prior to adding vertices or nothing is added
-      GetCOREInterface()->ForceCompleteRedraw();
-
       // Need to get a list of bones and weights for each vertex.
       vector<VertexHolder> vertexHolders;
       vertexHolders.resize(m.numVerts);
@@ -372,6 +366,11 @@ bool NifImporter::ImportSkin(ImpNode *node, NiTriBasedGeomRef triGeom)
             add = add;
          }
       }
+      // This is a kludge to get skin transforms to update and avoid jumping around after modifying the transforms.
+      //   Initially they show up incorrectly but magically fix up if you go to the modifier roll up.
+      //   There is still an outstanding issue with skeleton and GetObjectTMBeforeWSM.
+      skinMod->DisableModInViews();
+      skinMod->EnableModInViews();
    }
    return ok;
 }
diff --git a/NifImport/MaxNifTools.ini b/NifImport/MaxNifTools.ini
index b40bf05f8b3d26b533d61d9ae71eee534debf604..b2fbbe20b94d19a848d981157b148a09cc8727f2 100644
--- a/NifImport/MaxNifTools.ini
+++ b/NifImport/MaxNifTools.ini
@@ -33,6 +33,8 @@ RemoveIllegalFaces=1
 EnableSkinSupport=1
 
 [BipedImport]
+; Top level bone import setting. Default:1
+ImportBones=1
 ; Biped Height. Default: 131.90
 BipedHeight=131.90
 ; Biped initial rotation. Default: 90.0
@@ -71,7 +73,7 @@ RequireMultipleKeys=1
 ; Replace TCB Rotation with Bezier (workaround for unexpected behavior with TCB rotations)
 ReplaceTCBRotationWithBezier=1
 ; Apply the overall transform to skin and bones. Default: 0
-ApplyOverallTransformToSkinAndBones=0
+ApplyOverallTransformToSkinAndBones=1
 
 ; [Applications]
 ; RootPaths - Semicolon separated list of base directories to use when determining which app the imported file is from
@@ -99,7 +101,6 @@ TextureRootPaths=${RootPath};${TextureRootPath}
 TextureExtensions=.dds;
 TextureSearchPaths=${RootPath}\Textures;${TextureRootPath}\Textures\Characters;${TextureRootPath}\Textures\Armor
 GoToSkeletonBindPosition=1
-ApplyOverallTransformToSkinAndBones=0
 
 [Morrowind]
 InstallPath=[HKLM\SOFTWARE\Bethesda Softworks\Morrowind]=@"Installed Path"
@@ -110,7 +111,6 @@ TextureRootPaths=${RootPath}\Textures;${ExtractFolder}\Textures
 TextureExtensions=.tga;
 TextureSearchPaths=${RootPath}\Textures
 GoToSkeletonBindPosition=1
-ApplyOverallTransformToSkinAndBones=1
 
 [Civ4]
 InstallPath=[HKEY_LOCAL_MACHINE\SOFTWARE\Firaxis Games\Sid Meier's Civilization 4]=@"INSTALLDIR"
@@ -122,7 +122,6 @@ TextureExtensions=.dds;.bmp
 TextureSearchPaths=
 GoToSkeletonBindPosition=1
 DummyNodeMatches=MD;Bip;Bip??;* NonAccum;Effect*;Sound*;Dummy*
-ApplyOverallTransformToSkinAndBones=0
 
 [DAoC]
 Isles_InstallPath=[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Dark Age of Camelot - Shrouded Isles_is1]=@"InstallLocation"
@@ -133,4 +132,4 @@ TextureRootPaths=$(ExtractFolder)
 TextureExtensions=.dds;.bmp;.tga
 TextureSearchPaths=
 GoToSkeletonBindPosition=1
-ApplyOverallTransformToSkinAndBones=1
+
diff --git a/NifImport/NIFImport.cpp b/NifImport/NIFImport.cpp
index c9dc00e5a76e4585b999b5556e5aff6e35cbe8fc..b686e7896840d37445c2139c48b332a25aa921e4 100644
--- a/NifImport/NIFImport.cpp
+++ b/NifImport/NIFImport.cpp
@@ -62,7 +62,7 @@ void NifImporter::Initialize()
 {
    // Apply post processing checks after reading blocks
    if (isValid()){
-      if (goToSkeletonBindPosition && !nodes.empty())
+      if (goToSkeletonBindPosition && !nodes.empty() && importBones)
          GoToSkeletonBindPosition(nodes);
 
       // Only support biped if CreateNewBiped can be found.
@@ -124,6 +124,7 @@ void NifImporter::LoadIniSettings()
    flipUVTextures = GetIniValue<bool>(NifImportSection, "FlipUVTextures", true);
    enableSkinSupport = GetIniValue<bool>(NifImportSection, "EnableSkinSupport", true);
 
+   importBones = GetIniValue<bool>(BipedImportSection, "ImportBones", true);
    bipedHeight = GetIniValue<float>(BipedImportSection, "BipedHeight", 131.90f);
    bipedAngle = GetIniValue<float>(BipedImportSection, "BipedAngle", 90.0f);
    bipedAnkleAttach = GetIniValue<float>(BipedImportSection, "BipedAnkleAttach", 0.2f);
@@ -192,7 +193,7 @@ bool NifImporter::DoImport()
    else
    {
       vector<string> importedBones;
-      if (importSkeleton)
+      if (importSkeleton && importBones)
       {
          if (browseForSkeleton)
          {
@@ -239,15 +240,17 @@ bool NifImporter::DoImport()
                }
             }
          }
-      } else if (hasSkeleton && useBiped) {
+      } else if (hasSkeleton && useBiped && importBones) {
          ImportBipeds(nodes);
       }
 
       if (isValid()) {
-         if (strmatch(rootNode->GetName(), "Scene Root"))
-            ImportBones(DynamicCast<NiNode>(rootNode->GetChildren()));
-         else
-            ImportBones(rootNode);
+         if (importBones) {
+            if (strmatch(rootNode->GetName(), "Scene Root"))
+               ImportBones(DynamicCast<NiNode>(rootNode->GetChildren()));
+            else
+               ImportBones(rootNode);
+         }
 
          ok = ImportMeshes(rootNode);
 
diff --git a/NifImport/NIFImporter.h b/NifImport/NIFImporter.h
index e570592ff955b5f8a53c15e6d520547eabe652dd..c268b4499e9ac6ee61950ab090c10cdc2856b184 100644
--- a/NifImport/NIFImporter.h
+++ b/NifImport/NIFImporter.h
@@ -30,6 +30,7 @@ public:
    bool goToSkeletonBindPosition;
 
    // Biped/Bones related settings
+   bool importBones;
    string skeleton;
    float bipedHeight;
    string skeletonCheck;
diff --git a/NifImport/niutils.cpp b/NifImport/niutils.cpp
index 5c7cc39742d2e0a46f5a2e4e4b72a7da70e3eae3..cd680d361f3182080807116bc41be96f61f62222 100644
--- a/NifImport/niutils.cpp
+++ b/NifImport/niutils.cpp
@@ -494,3 +494,37 @@ void FindImages(NameValueCollection& images, const string& rootPath, const strin
 }
 
 
+// Debugger Trace Window Utilities
+TSTR PrintMatrix3(Matrix3& m)
+{
+   Point3 pt = m.GetTrans();
+   float y,p,r;
+   m.GetYawPitchRoll(&y,&p,&r);
+   return FormatText("Matrix3: [%g,%g,%g] <%g,%g,%g>\n"
+      ,pt.x, pt.y, pt.z
+      ,TODEG(y), TODEG(p), TODEG(r)
+      );
+}
+
+void DumpMatrix3(Matrix3& m)
+{
+   OutputDebugString(PrintMatrix3(m));
+}
+
+TSTR PrintMatrix44(Matrix44& m)
+{
+   Vector3 p; Matrix33 rot; float sc;
+   m.Decompose(p, rot, sc);
+   Quaternion q = rot.AsQuaternion();
+   Float3 f = q.AsEulerYawPitchRoll();
+
+   return FormatText("Matrix3: [%g,%g,%g] <%g,%g,%g> (%g)\n"
+      ,p.x, p.y, p.z
+      ,TODEG(f[0]), TODEG(f[1]), TODEG(f[2])
+      ,sc
+      );
+}
+void DumpMatrix44(Matrix44& m)
+{
+   OutputDebugString(PrintMatrix44(m));
+}
\ No newline at end of file
diff --git a/NifImport/niutils.h b/NifImport/niutils.h
index 1035cc63d3b0c796168b7a066cb1931d23396980..56685f368553feaa74a0d9145c29f0fb887c37c3 100644
--- a/NifImport/niutils.h
+++ b/NifImport/niutils.h
@@ -303,4 +303,7 @@ inline Niflib::Ref<U> SelectFirstObjectOfType( list<Niflib::Ref<T> > const & obj
    return Niflib::Ref<U>();
 }
 
+TSTR PrintMatrix3(Matrix3& m);
+TSTR PrintMatrix44(Niflib::Matrix44& m);
+
 #endif // _NIUTILS_H_
\ No newline at end of file