diff --git a/niflib.cpp b/niflib.cpp
index efe6885875f1bb0f821ad57b3821db660d7c5a32..a906b6d394addbe047fd851ee52d7e7af6e9cd72 100644
--- a/niflib.cpp
+++ b/niflib.cpp
@@ -37,7 +37,6 @@ map<string, blk_factory_func> global_block_map;
 
 //Utility Functions
 void EnumerateObjects( NiObjectRef const & root, map<Type*,uint> & type_map, map<NiObjectRef, uint> & link_map );
-//void BuildUpBindPositions( const NiAVObjectRef & root );
 NiObjectRef FindRoot( vector<NiObjectRef> const & blocks );
 void RegisterBlockFactories ();
 NiObjectRef GetObjectByType( const NiObjectRef & root, const Type & block_type );
@@ -279,15 +278,6 @@ vector<NiObjectRef> ReadNifList( istream & in ) {
 		blocks[i]->FixLinks( blocks, link_stack, header.version, header.userVersion );
 	}
 
-	//TODO:  Make this an optional step?
-	////Send all skeleton roots to bind position
-	//for (uint i = 0; i < blocks.size(); ++i) {
-	//	NiNodeRef node = DynamicCast<NiNode>(blocks[i]);
-	//	if ( node != NULL && node->IsSkeletonRoot() ) {
-	//		node->GoToSkeletonBindPosition();
-	//	}
-	//}
-
 	//Return completed block list
 	return blocks;
 }
@@ -922,4 +912,26 @@ Ref<NiObject> CloneNifTree( Ref<NiObject> const & root, unsigned int version, un
 	return ReadNifTree( tmp );
 }
 
+void SendNifTreeToBindPos( const Ref<NiNode> & root ) {
+	//If this node is a skeleton root, send its children to the bind
+	//position
+
+	if ( root == NULL ) {
+		throw runtime_error( "Attempted to call SendNifTreeToBindPos on a null reference." );
+	}
+
+	if ( root->IsSkeletonRoot() ) {
+		root->GoToSkeletonBindPosition();
+	}
+
+	//Call this function on any NiNode children
+	vector<NiAVObjectRef> children = root->GetChildren();
+	for ( uint i = 0; i < children.size(); ++i ) {
+		NiNodeRef child = DynamicCast<NiNode>(children[i]);
+		if ( child != NULL ) {
+			SendNifTreeToBindPos( child );
+		}
+	}
+}
+
 } // namespace NifLib
\ No newline at end of file
diff --git a/niflib.h b/niflib.h
index f39e2f648eb64a768f38855a7d4e51773ec9d108..3fca3a49799d756b5aa9222e2421dc1c2403b7b3 100644
--- a/niflib.h
+++ b/niflib.h
@@ -230,6 +230,14 @@ NIFLIB_API Ref<NiObject> CloneNifTree( Ref<NiObject> const & root, unsigned int
 //NIFLIB_API void MergeNifTrees( NiNodeRef target, NiAVObjectRef right, unsigned int version = 0xFFFFFFFF );
 NIFLIB_API void MergeNifTrees( const Ref<NiNode> & target, const Ref<NiControllerSequence> & right, unsigned int version = 0xFFFFFFFF, unsigned int user_version = 0 );
 
+/*! 
+ * Traverses a tree of NIF objects, attempting to move each skeleton root
+ * to the natural bind position where no meshes are distorted by skin
+ * influences.  This is not always successful and only affects nodes that
+ * are skin influences.
+ * \param root The root NiNode of the tree.
+ */
+NIFLIB_API void SendNifTreeToBindPos( const Ref<NiNode> & root );
 
 //// Returns list of all blocks in the tree rooted by root block.
 //list<NiObjectRef> GetNifTree( NiObjectRef const & root_block );