diff --git a/Ref.h b/Ref.h
index 36144b97b6d70a873275777eb35106fa1452bdf7..34eb40676b42722fa55e278b7bf6ff80109dc025 100644
--- a/Ref.h
+++ b/Ref.h
@@ -7,6 +7,10 @@ All rights reserved.  Please see niflib.h for licence. */
 /**
  * Smart Pointer Template
  */
+
+template<class T> class Ref;
+template<class T> ostream & operator<<(ostream &, const Ref<T> &);
+
 template <class T> class Ref {
 public:
 	Ref( T * object = NULL );
@@ -27,6 +31,7 @@ public:
 	bool operator==(const Ref & ref) const;
 	bool operator!=(const Ref & ref) const;
 
+        friend ostream & operator<< <T>(ostream & os, const Ref & ref);
 protected:
 	//The shared object
 	T* _object;
@@ -82,7 +87,7 @@ Ref<T> & Ref<T>::operator=( T * object ) {
 	//Change reference to new object
 	_object = object;
 
-	//Increment reerence count on new object if it is not NULL
+	//Increment reference count on new object if it is not NULL
 	if ( _object != NULL ) {
 		_object->AddRef();
 	}
@@ -105,7 +110,7 @@ Ref<T> & Ref<T>::operator=( const Ref & ref ) {
 	//Change reference to new object
 	_object = ref._object;
 
-	//Increment reerence count on new object if it is not NULL
+	//Increment reference count on new object if it is not NULL
 	if ( _object != NULL ) {
 		_object->AddRef();
 	}
@@ -144,4 +149,14 @@ bool Ref<T>::operator!=(const Ref & ref) const {
 	return ( _object != ref._object );
 }
 
+
+template <class T>
+ostream & operator<<(ostream & os, const Ref<T> & ref) {
+	if (ref._object)
+		os << ref._object << "(" << ref._object->GetType().GetTypeName() << ")";
+	else
+		os << "NULL";
+	return os;
+}
+
 #endif
diff --git a/gen/obj_defines.h b/gen/obj_defines.h
index 91ee0b72b6dcc13f5bfd1ccef6260f9b7f604a04..c4588a3a86d1f92f5ec2b70d799ef73529ee3d63 100644
--- a/gen/obj_defines.h
+++ b/gen/obj_defines.h
@@ -80,8 +80,8 @@ NifStream( link_map[StaticCast<NiObject>(controller)], out, version ); \
 #define A_PARTICLE_MODIFIER_STRING \
 stringstream out; \
 out << NiObject::asString(); \
-out << "Next Modifier:  " << "AParticleModifier" << endl; \
-out << "Controller:  " << "NiParticleSystemController" << endl; \
+out << "Next Modifier:  " << nextModifier << endl; \
+out << "Controller:  " << controller << endl; \
 return out.str(); \
 
 #define A_PARTICLE_MODIFIER_FIXLINKS \
@@ -181,7 +181,7 @@ stringstream out; \
 out << bhkSerializable::asString(); \
 out << "Num Bodies:  " << numBodies << endl; \
 for (uint i0 = 0; i0 < bodies.size(); i0++) { \
-  out << "  Bodies[" << i0 << "]:  " << "bhkShape" << endl; \
+  out << "  Bodies[" << i0 << "]:  " << bodies[i0] << endl; \
 }; \
 out << "Priority:  " << priority << endl; \
 return out.str(); \
@@ -410,7 +410,7 @@ NifStream( layer, out, version ); \
 #define BHK_ENTITY_STRING \
 stringstream out; \
 out << bhkWorldObject::asString(); \
-out << "Shape:  " << "bhkShape" << endl; \
+out << "Shape:  " << shape << endl; \
 out << "Layer:  " << layer << endl; \
 return out.str(); \
 
@@ -454,9 +454,9 @@ NifStream( link_map[StaticCast<NiObject>(body)], out, version ); \
 #define NI_COLLISION_OBJECT_STRING \
 stringstream out; \
 out << NiObject::asString(); \
-out << "Parent:  " << "NiAVObject" << endl; \
+out << "Parent:  " << parent << endl; \
 out << "Unknown Short:  " << unknownShort << endl; \
-out << "Body:  " << "NiObject" << endl; \
+out << "Body:  " << body << endl; \
 return out.str(); \
 
 #define NI_COLLISION_OBJECT_FIXLINKS \
@@ -511,7 +511,7 @@ if ( version <= 0x04020200 ) { \
 stringstream out; \
 out << NiObject::asString(); \
 out << "Name:  " << name << endl; \
-out << "Next Extra Data:  " << "NiExtraData" << endl; \
+out << "Next Extra Data:  " << nextExtraData << endl; \
 return out.str(); \
 
 #define NI_EXTRA_DATA_FIXLINKS \
@@ -661,12 +661,12 @@ NifStream( link_map[StaticCast<NiObject>(controller)], out, version ); \
 stringstream out; \
 out << NiObject::asString(); \
 out << "Name:  " << name << endl; \
-out << "Extra Data:  " << "NiExtraData" << endl; \
+out << "Extra Data:  " << extraData << endl; \
 out << "Num Extra Data List:  " << numExtraDataList << endl; \
 for (uint i0 = 0; i0 < extraDataList.size(); i0++) { \
-  out << "  Extra Data List[" << i0 << "]:  " << "NiExtraData" << endl; \
+  out << "  Extra Data List[" << i0 << "]:  " << extraDataList[i0] << endl; \
 }; \
-out << "Controller:  " << "NiTimeController" << endl; \
+out << "Controller:  " << controller << endl; \
 return out.str(); \
 
 #define NI_OBJECT_N_E_T_FIXLINKS \
@@ -792,7 +792,7 @@ out << "Scale:  " << scale << endl; \
 out << "Velocity:  " << velocity << endl; \
 out << "Num Properties:  " << numProperties << endl; \
 for (uint i0 = 0; i0 < properties.size(); i0++) { \
-  out << "  Properties[" << i0 << "]:  " << "NiProperty" << endl; \
+  out << "  Properties[" << i0 << "]:  " << properties[i0] << endl; \
 }; \
 out << "Has Bounding Box:  " << hasBoundingBox << endl; \
 if ( (hasBoundingBox != 0) ) { \
@@ -801,8 +801,8 @@ if ( (hasBoundingBox != 0) ) { \
   out << "  Rotation:  " << boundingBox.rotation << endl; \
   out << "  Radius:  " << boundingBox.radius << endl; \
 }; \
-out << "Collision Data:  " << "NiCollisionData" << endl; \
-out << "Collision Object:  " << "NiCollisionObject" << endl; \
+out << "Collision Data:  " << collisionData << endl; \
+out << "Collision Object:  " << collisionObject << endl; \
 return out.str(); \
 
 #define NI_A_V_OBJECT_FIXLINKS \
@@ -898,7 +898,7 @@ if ( (hasAffectedNodeList_ != 0) ) { \
 out << "Switch State:  " << switchState << endl; \
 out << "Num Affected Nodes:  " << numAffectedNodes << endl; \
 for (uint i0 = 0; i0 < affectedNodes.size(); i0++) { \
-  out << "  Affected Nodes[" << i0 << "]:  " << "NiAVObject" << endl; \
+  out << "  Affected Nodes[" << i0 << "]:  " << affectedNodes[i0] << endl; \
 }; \
 return out.str(); \
 
@@ -1011,7 +1011,7 @@ stringstream out; \
 out << NiObject::asString(); \
 out << "Name:  " << name << endl; \
 out << "Order:  " << order << endl; \
-out << "Target:  " << "NiParticleSystem" << endl; \
+out << "Target:  " << target << endl; \
 out << "Active:  " << active << endl; \
 return out.str(); \
 
@@ -1119,7 +1119,7 @@ if ( version >= 0x14000004 ) { \
 #define NI_P_SYS_VOLUME_EMITTER_STRING \
 stringstream out; \
 out << NiPSysEmitter::asString(); \
-out << "Emitter Object:  " << "NiNode" << endl; \
+out << "Emitter Object:  " << emitterObject << endl; \
 return out.str(); \
 
 #define NI_P_SYS_VOLUME_EMITTER_FIXLINKS \
@@ -1176,13 +1176,13 @@ NifStream( link_map[StaticCast<NiObject>(target)], out, version ); \
 #define NI_TIME_CONTROLLER_STRING \
 stringstream out; \
 out << NiObject::asString(); \
-out << "Next Controller:  " << "NiTimeController" << endl; \
+out << "Next Controller:  " << nextController << endl; \
 out << "Flags:  " << flags << endl; \
 out << "Frequency:  " << frequency << endl; \
 out << "Phase:  " << phase << endl; \
 out << "Start Time:  " << startTime << endl; \
 out << "Stop Time:  " << stopTime << endl; \
-out << "Target:  " << "NiObject" << endl; \
+out << "Target:  " << target << endl; \
 return out.str(); \
 
 #define NI_TIME_CONTROLLER_FIXLINKS \
@@ -1252,7 +1252,7 @@ out << "Unknown Int 2:  " << unknownInt2 << endl; \
 for (uint i0 = 0; i0 < nodeGroups.size(); i0++) { \
   out << "  Num Nodes:  " << nodeGroups[i0].numNodes << endl; \
   for (uint i1 = 0; i1 < nodeGroups[i0].nodes.size(); i1++) { \
-    out << "    Nodes[" << i1 << "]:  " << "NiNode" << endl; \
+    out << "    Nodes[" << i1 << "]:  " << nodeGroups[i0].nodes[i1] << endl; \
   }; \
 }; \
 return out.str(); \
@@ -1298,7 +1298,7 @@ if ( version >= 0x0A020000 ) { \
 #define NI_SINGLE_INTERPOLATOR_CONTROLLER_STRING \
 stringstream out; \
 out << NiTimeController::asString(); \
-out << "Interpolator:  " << "NiInterpolator" << endl; \
+out << "Interpolator:  " << interpolator << endl; \
 return out.str(); \
 
 #define NI_SINGLE_INTERPOLATOR_CONTROLLER_FIXLINKS \
@@ -1384,12 +1384,12 @@ if ( version >= 0x0A000100 ) { \
 #define NI_TRI_BASED_GEOM_STRING \
 stringstream out; \
 out << NiAVObject::asString(); \
-out << "Data:  " << "NiTriBasedGeomData" << endl; \
-out << "Skin Instance:  " << "NiSkinInstance" << endl; \
+out << "Data:  " << data << endl; \
+out << "Skin Instance:  " << skinInstance << endl; \
 out << "Has Shader:  " << hasShader << endl; \
 if ( (hasShader != 0) ) { \
   out << "  Shader Name:  " << shaderName << endl; \
-  out << "  Unknown Link:  " << "NiObject" << endl; \
+  out << "  Unknown Link:  " << unknownLink << endl; \
 }; \
 return out.str(); \
 
@@ -1647,7 +1647,7 @@ for (uint i0 = 0; i0 < uvSets2.size(); i0++) { \
   }; \
 }; \
 out << "Unknown Short 2:  " << unknownShort2 << endl; \
-out << "Unknown Link:  " << "NiObject" << endl; \
+out << "Unknown Link:  " << unknownLink << endl; \
 return out.str(); \
 
 #define NI_TRI_BASED_GEOM_DATA_FIXLINKS \
@@ -2133,7 +2133,7 @@ stringstream out; \
 out << AbhkShapeCollection::asString(); \
 out << "Num Sub Shapes:  " << numSubShapes << endl; \
 for (uint i0 = 0; i0 < subShapes.size(); i0++) { \
-  out << "  Sub Shapes[" << i0 << "]:  " << "bhkShape" << endl; \
+  out << "  Sub Shapes[" << i0 << "]:  " << subShapes[i0] << endl; \
 }; \
 out << "Material:  " << material << endl; \
 for (uint i0 = 0; i0 < 6; i0++) { \
@@ -2255,8 +2255,8 @@ stringstream out; \
 out << AbhkConstraint::asString(); \
 out << "Type:  " << type << endl; \
 out << "Unknown Int 2:  " << unknownInt2 << endl; \
-out << "Unknown Link 1:  " << "NiObject" << endl; \
-out << "Unknown Link 2:  " << "NiObject" << endl; \
+out << "Unknown Link 1:  " << unknownLink1 << endl; \
+out << "Unknown Link 2:  " << unknownLink2 << endl; \
 out << "Unknown Int 3:  " << unknownInt3 << endl; \
 if ( (type == 7) ) { \
   out << "  Pivot A:  " << ragdoll.pivotA << endl; \
@@ -2358,7 +2358,7 @@ NifStream( unknownFloat2, out, version ); \
 #define BHK_MOPP_BV_TREE_SHAPE_STRING \
 stringstream out; \
 out << bhkShape::asString(); \
-out << "Shape:  " << "bhkShape" << endl; \
+out << "Shape:  " << shape << endl; \
 out << "Material:  " << material << endl; \
 for (uint i0 = 0; i0 < 8; i0++) { \
   out << "  Unknown Bytes 1[" << i0 << "]:  " << unknownBytes1[i0] << endl; \
@@ -2509,7 +2509,7 @@ for (uint i0 = 0; i0 < 3; i0++) { \
 out << "Unknown Int 2:  " << unknownInt2 << endl; \
 out << "Num Strips Data:  " << numStripsData << endl; \
 for (uint i0 = 0; i0 < stripsData.size(); i0++) { \
-  out << "  Strips Data[" << i0 << "]:  " << "NiTriStripsData" << endl; \
+  out << "  Strips Data[" << i0 << "]:  " << stripsData[i0] << endl; \
 }; \
 out << "Num Unknown Ints 3:  " << numUnknownInts3 << endl; \
 for (uint i0 = 0; i0 < unknownInts3.size(); i0++) { \
@@ -2597,7 +2597,7 @@ out << "Scale:  " << scale << endl; \
 for (uint i0 = 0; i0 < 3; i0++) { \
   out << "  Unknown Floats 2[" << i0 << "]:  " << unknownFloats2[i0] << endl; \
 }; \
-out << "Data:  " << "hkPackedNiTriStripsData" << endl; \
+out << "Data:  " << data << endl; \
 return out.str(); \
 
 #define BHK_PACKED_NI_TRI_STRIPS_SHAPE_FIXLINKS \
@@ -2858,7 +2858,7 @@ out << "Unknown Int 7:  " << unknownInt7 << endl; \
 out << "Unknown Int 8:  " << unknownInt8 << endl; \
 out << "Num Constraints:  " << numConstraints << endl; \
 for (uint i0 = 0; i0 < constraints.size(); i0++) { \
-  out << "  Constraints[" << i0 << "]:  " << "AbhkConstraint" << endl; \
+  out << "  Constraints[" << i0 << "]:  " << constraints[i0] << endl; \
 }; \
 return out.str(); \
 
@@ -3343,7 +3343,7 @@ if ( version <= 0x0A010000 ) { \
 #define NI_ALPHA_CONTROLLER_STRING \
 stringstream out; \
 out << NiSingleInterpolatorController::asString(); \
-out << "Data:  " << "NiFloatData" << endl; \
+out << "Data:  " << data << endl; \
 return out.str(); \
 
 #define NI_ALPHA_CONTROLLER_FIXLINKS \
@@ -3689,13 +3689,13 @@ out << "Num Shape Groups:  " << numShapeGroups << endl; \
 for (uint i0 = 0; i0 < shapeGroups1.size(); i0++) { \
   out << "  Num Link Pairs:  " << shapeGroups1[i0].numLinkPairs << endl; \
   for (uint i1 = 0; i1 < shapeGroups1[i0].linkPairs.size(); i1++) { \
-    out << "    Shape:  " << "NiTriShape" << endl; \
-    out << "    Skin Instance:  " << "NiSkinInstance" << endl; \
+    out << "    Shape:  " << shapeGroups1[i0].linkPairs[i1].shape << endl; \
+    out << "    Skin Instance:  " << shapeGroups1[i0].linkPairs[i1].skinInstance << endl; \
   }; \
 }; \
 out << "Num Shape Groups 2:  " << numShapeGroups2 << endl; \
 for (uint i0 = 0; i0 < shapeGroups2.size(); i0++) { \
-  out << "  Shape Groups 2[" << i0 << "]:  " << "NiTriShape" << endl; \
+  out << "  Shape Groups 2[" << i0 << "]:  " << shapeGroups2[i0] << endl; \
 }; \
 return out.str(); \
 
@@ -3828,7 +3828,7 @@ NifStream( link_map[StaticCast<NiObject>(data)], out, version ); \
 stringstream out; \
 out << NiInterpolator::asString(); \
 out << "Bool Value:  " << boolValue << endl; \
-out << "Data:  " << "NiBoolData" << endl; \
+out << "Data:  " << data << endl; \
 return out.str(); \
 
 #define NI_BOOL_INTERPOLATOR_FIXLINKS \
@@ -3868,7 +3868,7 @@ NifStream( link_map[StaticCast<NiObject>(data)], out, version ); \
 stringstream out; \
 out << NiInterpolator::asString(); \
 out << "Bool Value:  " << boolValue << endl; \
-out << "Data:  " << "NiBoolData" << endl; \
+out << "Data:  " << data << endl; \
 return out.str(); \
 
 #define NI_BOOL_TIMELINE_INTERPOLATOR_FIXLINKS \
@@ -3996,8 +3996,8 @@ for (uint i0 = 0; i0 < 6; i0++) { \
 #define NI_B_SPLINE_COMP_POINT3_INTERPOLATOR_STRING \
 stringstream out; \
 out << NiBSplineInterpolator::asString(); \
-out << "Data:  " << "NiBSplineData" << endl; \
-out << "Unknown Link:  " << "NiObject" << endl; \
+out << "Data:  " << data << endl; \
+out << "Unknown Link:  " << unknownLink << endl; \
 for (uint i0 = 0; i0 < 6; i0++) { \
   out << "  Unknown Floats[" << i0 << "]:  " << unknownFloats[i0] << endl; \
 }; \
@@ -4054,8 +4054,8 @@ for (uint i0 = 0; i0 < 17; i0++) { \
 #define NI_B_SPLINE_COMP_TRANSFORM_INTERPOLATOR_STRING \
 stringstream out; \
 out << NiBSplineInterpolator::asString(); \
-out << "Data:  " << "NiBSplineData" << endl; \
-out << "Basis Data:  " << "NiBSplineBasisData" << endl; \
+out << "Data:  " << data << endl; \
+out << "Basis Data:  " << basisData << endl; \
 for (uint i0 = 0; i0 < 17; i0++) { \
   out << "  Unknown4[" << i0 << "]:  " << unknown4[i0] << endl; \
 }; \
@@ -4219,7 +4219,7 @@ out << "Viewport Right:  " << viewportRight << endl; \
 out << "Viewport Top:  " << viewportTop << endl; \
 out << "Viewport Bottom:  " << viewportBottom << endl; \
 out << "LOD Adjust:  " << lodAdjust << endl; \
-out << "Unknown Link?:  " << "NiObject" << endl; \
+out << "Unknown Link?:  " << unknownLink_ << endl; \
 out << "Unknown Int:  " << unknownInt << endl; \
 out << "Unknown Int 2:  " << unknownInt2 << endl; \
 return out.str(); \
@@ -4298,7 +4298,7 @@ if ( (collisionType == 1) ) { \
 #define NI_COLLISION_DATA_STRING \
 stringstream out; \
 out << NiObject::asString(); \
-out << "Target Node:  " << "NiNode" << endl; \
+out << "Target Node:  " << targetNode << endl; \
 out << "Unknown2:  " << unknown2 << endl; \
 out << "Unknown3:  " << unknown3 << endl; \
 out << "Collision Type:  " << collisionType << endl; \
@@ -4440,9 +4440,9 @@ out << NiTimeController::asString(); \
 out << "Cumulative:  " << cumulative << endl; \
 out << "Num Controller Sequences:  " << numControllerSequences << endl; \
 for (uint i0 = 0; i0 < controllerSequences.size(); i0++) { \
-  out << "  Controller Sequences[" << i0 << "]:  " << "NiControllerSequence" << endl; \
+  out << "  Controller Sequences[" << i0 << "]:  " << controllerSequences[i0] << endl; \
 }; \
-out << "Object Palette:  " << "NiDefaultAVObjectPalette" << endl; \
+out << "Object Palette:  " << objectPalette << endl; \
 return out.str(); \
 
 #define NI_CONTROLLER_MANAGER_FIXLINKS \
@@ -4772,12 +4772,12 @@ stringstream out; \
 out << NiObject::asString(); \
 out << "Name:  " << name << endl; \
 out << "Name:  " << textKeys.name << endl; \
-out << "Interpolator:  " << "NiInterpolator" << endl; \
-out << "Unknown Link 1:  " << "NiObject" << endl; \
-out << "Unknown Link 2:  " << "NiObject" << endl; \
+out << "Interpolator:  " << textKeys.interpolator << endl; \
+out << "Unknown Link 1:  " << textKeys.unknownLink1 << endl; \
+out << "Unknown Link 2:  " << textKeys.unknownLink2 << endl; \
 out << "Unknown Short 0:  " << textKeys.unknownShort0 << endl; \
 out << "Priority?:  " << textKeys.priority_ << endl; \
-out << "String Palette:  " << "NiStringPalette" << endl; \
+out << "String Palette:  " << textKeys.stringPalette << endl; \
 out << "Node Name:  " << textKeys.nodeName << endl; \
 out << "Node Name Offset:  " << textKeys.nodeNameOffset << endl; \
 out << "Property Type:  " << textKeys.propertyType << endl; \
@@ -4792,12 +4792,12 @@ out << "Num Controlled Blocks:  " << numControlledBlocks << endl; \
 out << "Unknown Int 1:  " << unknownInt1 << endl; \
 for (uint i0 = 0; i0 < controlledBlocks.size(); i0++) { \
   out << "  Name:  " << controlledBlocks[i0].name << endl; \
-  out << "  Interpolator:  " << "NiInterpolator" << endl; \
-  out << "  Unknown Link 1:  " << "NiObject" << endl; \
-  out << "  Unknown Link 2:  " << "NiObject" << endl; \
+  out << "  Interpolator:  " << controlledBlocks[i0].interpolator << endl; \
+  out << "  Unknown Link 1:  " << controlledBlocks[i0].unknownLink1 << endl; \
+  out << "  Unknown Link 2:  " << controlledBlocks[i0].unknownLink2 << endl; \
   out << "  Unknown Short 0:  " << controlledBlocks[i0].unknownShort0 << endl; \
   out << "  Priority?:  " << controlledBlocks[i0].priority_ << endl; \
-  out << "  String Palette:  " << "NiStringPalette" << endl; \
+  out << "  String Palette:  " << controlledBlocks[i0].stringPalette << endl; \
   out << "  Node Name:  " << controlledBlocks[i0].nodeName << endl; \
   out << "  Node Name Offset:  " << controlledBlocks[i0].nodeNameOffset << endl; \
   out << "  Property Type:  " << controlledBlocks[i0].propertyType << endl; \
@@ -4810,7 +4810,7 @@ for (uint i0 = 0; i0 < controlledBlocks.size(); i0++) { \
   out << "  Variable Offset 2:  " << controlledBlocks[i0].variableOffset2 << endl; \
 }; \
 out << "Weight:  " << weight << endl; \
-out << "Text Keys 2:  " << "NiTextKeyExtraData" << endl; \
+out << "Text Keys 2:  " << textKeys2 << endl; \
 out << "Cycle Type:  " << cycleType << endl; \
 out << "Unknown Int 0:  " << unknownInt0 << endl; \
 out << "Frequency:  " << frequency << endl; \
@@ -4818,9 +4818,9 @@ out << "Start Time:  " << startTime << endl; \
 out << "Stop Time:  " << stopTime << endl; \
 out << "Unknown Float 2:  " << unknownFloat2 << endl; \
 out << "Unknown Byte:  " << unknownByte << endl; \
-out << "Manager:  " << "NiControllerManager" << endl; \
+out << "Manager:  " << manager << endl; \
 out << "Unknown String:  " << unknownString << endl; \
-out << "String Palette:  " << "NiStringPalette" << endl; \
+out << "String Palette:  " << stringPalette << endl; \
 return out.str(); \
 
 #define NI_CONTROLLER_SEQUENCE_FIXLINKS \
@@ -4963,7 +4963,7 @@ out << "Unknown Int:  " << unknownInt << endl; \
 out << "Num Objs:  " << numObjs << endl; \
 for (uint i0 = 0; i0 < objs.size(); i0++) { \
   out << "  Name:  " << objs[i0].name << endl; \
-  out << "  Object:  " << "NiAVObject" << endl; \
+  out << "  Object:  " << objs[i0].object << endl; \
 }; \
 return out.str(); \
 
@@ -5077,7 +5077,7 @@ out << "Unknown Int 2:  " << unknownInt2 << endl; \
 out << "Delta:  " << delta << endl; \
 out << "Num Sources:  " << numSources << endl; \
 for (uint i0 = 0; i0 < sources.size(); i0++) { \
-  out << "  Sources[" << i0 << "]:  " << "NiSourceTexture" << endl; \
+  out << "  Sources[" << i0 << "]:  " << sources[i0] << endl; \
 }; \
 return out.str(); \
 
@@ -5195,7 +5195,7 @@ if ( version >= 0x14000004 ) { \
 #define NI_FLOAT_EXTRA_DATA_CONTROLLER_STRING \
 stringstream out; \
 out << NiTimeController::asString(); \
-out << "Unknown Link:  " << "NiObject" << endl; \
+out << "Unknown Link:  " << unknownLink << endl; \
 out << "Unknown String:  " << unknownString << endl; \
 return out.str(); \
 
@@ -5238,7 +5238,7 @@ NifStream( link_map[StaticCast<NiObject>(data)], out, version ); \
 stringstream out; \
 out << NiInterpolator::asString(); \
 out << "Float Value:  " << floatValue << endl; \
-out << "Data:  " << "NiFloatData" << endl; \
+out << "Data:  " << data << endl; \
 return out.str(); \
 
 #define NI_FLOAT_INTERPOLATOR_FIXLINKS \
@@ -5397,11 +5397,11 @@ stringstream out; \
 out << NiTimeController::asString(); \
 out << "Unknown:  " << unknown << endl; \
 out << "Unknown 2:  " << unknown2 << endl; \
-out << "Data:  " << "NiMorphData" << endl; \
+out << "Data:  " << data << endl; \
 out << "Unknown Byte:  " << unknownByte << endl; \
 out << "Num Interpolators:  " << numInterpolators << endl; \
 for (uint i0 = 0; i0 < interpolators.size(); i0++) { \
-  out << "  Interpolators[" << i0 << "]:  " << "NiInterpolator" << endl; \
+  out << "  Interpolators[" << i0 << "]:  " << interpolators[i0] << endl; \
 }; \
 out << "Num Unknown Ints:  " << numUnknownInts << endl; \
 for (uint i0 = 0; i0 < unknownInts.size(); i0++) { \
@@ -5561,7 +5561,7 @@ NifStream( link_map[StaticCast<NiObject>(data)], out, version ); \
 #define NI_KEYFRAME_CONTROLLER_STRING \
 stringstream out; \
 out << NiTimeController::asString(); \
-out << "Data:  " << "NiKeyframeData" << endl; \
+out << "Data:  " << data << endl; \
 return out.str(); \
 
 #define NI_KEYFRAME_CONTROLLER_FIXLINKS \
@@ -5597,7 +5597,7 @@ NifStream( link_map[StaticCast<NiObject>(data2)], out, version ); \
 #define B_S_KEYFRAME_CONTROLLER_STRING \
 stringstream out; \
 out << NiKeyframeController::asString(); \
-out << "Data 2:  " << "NiKeyframeData" << endl; \
+out << "Data 2:  " << data2 << endl; \
 return out.str(); \
 
 #define B_S_KEYFRAME_CONTROLLER_FIXLINKS \
@@ -5802,8 +5802,8 @@ if ( version >= 0x0A020000 ) { \
 stringstream out; \
 out << NiTimeController::asString(); \
 out << "Unknown Short:  " << unknownShort << endl; \
-out << "Data:  " << "NiPosData" << endl; \
-out << "Interpolator:  " << "NiPoint3Interpolator" << endl; \
+out << "Data:  " << data << endl; \
+out << "Interpolator:  " << interpolator << endl; \
 return out.str(); \
 
 #define NI_LIGHT_COLOR_CONTROLLER_FIXLINKS \
@@ -5850,7 +5850,7 @@ NifStream( link_map[StaticCast<NiObject>(unknownLink)], out, version ); \
 #define NI_LIGHT_DIMMER_CONTROLLER_STRING \
 stringstream out; \
 out << NiTimeController::asString(); \
-out << "Unknown Link:  " << "NiInterpolator" << endl; \
+out << "Unknown Link:  " << unknownLink << endl; \
 return out.str(); \
 
 #define NI_LIGHT_DIMMER_CONTROLLER_FIXLINKS \
@@ -5894,7 +5894,7 @@ NifStream( link_map[StaticCast<NiObject>(lookAtNode)], out, version ); \
 stringstream out; \
 out << NiTimeController::asString(); \
 out << "Unknown1:  " << unknown1 << endl; \
-out << "Look At Node:  " << "NiNode" << endl; \
+out << "Look At Node:  " << lookAtNode << endl; \
 return out.str(); \
 
 #define NI_LOOK_AT_CONTROLLER_FIXLINKS \
@@ -5958,14 +5958,14 @@ NifStream( link_map[StaticCast<NiObject>(unknownLink3)], out, version ); \
 stringstream out; \
 out << NiInterpolator::asString(); \
 out << "Unknown Short:  " << unknownShort << endl; \
-out << "Look At:  " << "NiNode" << endl; \
+out << "Look At:  " << lookAt << endl; \
 out << "Unknown Float:  " << unknownFloat << endl; \
 out << "Translation:  " << translation << endl; \
 out << "Rotation:  " << rotation << endl; \
 out << "Scale:  " << scale << endl; \
-out << "Unknown Link 1:  " << "NiPoint3Interpolator" << endl; \
-out << "Unknown Link 2:  " << "NiFloatInterpolator" << endl; \
-out << "Unknown Link 3:  " << "NiFloatInterpolator" << endl; \
+out << "Unknown Link 1:  " << unknownLink1 << endl; \
+out << "Unknown Link 2:  " << unknownLink2 << endl; \
+out << "Unknown Link 3:  " << unknownLink3 << endl; \
 return out.str(); \
 
 #define NI_LOOK_AT_INTERPOLATOR_FIXLINKS \
@@ -6034,7 +6034,7 @@ if ( version <= 0x0A010000 ) { \
 stringstream out; \
 out << NiSingleInterpolatorController::asString(); \
 out << "Unknown:  " << unknown << endl; \
-out << "Data:  " << "NiPosData" << endl; \
+out << "Data:  " << data << endl; \
 return out.str(); \
 
 #define NI_MATERIAL_COLOR_CONTROLLER_FIXLINKS \
@@ -6248,18 +6248,18 @@ for (uint i0 = 0; i0 < unknownFloats5.size(); i0++) { \
   }; \
 }; \
 out << "Unknown Int 1:  " << unknownInt1 << endl; \
-out << "Modifier:  " << "AParticleModifier" << endl; \
+out << "Modifier:  " << modifier << endl; \
 out << "Unknown Byte 2:  " << unknownByte2 << endl; \
 out << "Num Unknown Links:  " << numUnknownLinks << endl; \
 for (uint i0 = 0; i0 < unknownLinks.size(); i0++) { \
-  out << "  Unknown Links[" << i0 << "]:  " << "AParticleModifier" << endl; \
+  out << "  Unknown Links[" << i0 << "]:  " << unknownLinks[i0] << endl; \
 }; \
 out << "Unknown Short 4:  " << unknownShort4 << endl; \
 out << "Unknown Int 2:  " << unknownInt2 << endl; \
 out << "Unknown Byte 12:  " << unknownByte12 << endl; \
 out << "Unknown Int 3:  " << unknownInt3 << endl; \
 out << "Unknown Int 4:  " << unknownInt4 << endl; \
-out << "Unknown Link 2:  " << "NiNode" << endl; \
+out << "Unknown Link 2:  " << unknownLink2 << endl; \
 return out.str(); \
 
 #define NI_MESH_P_SYS_DATA_FIXLINKS \
@@ -6414,7 +6414,7 @@ stringstream out; \
 out << NiTimeController::asString(); \
 out << "Num Extra Targets:  " << numExtraTargets << endl; \
 for (uint i0 = 0; i0 < extraTargets.size(); i0++) { \
-  out << "  Extra Targets[" << i0 << "]:  " << "NiNode" << endl; \
+  out << "  Extra Targets[" << i0 << "]:  " << extraTargets[i0] << endl; \
 }; \
 return out.str(); \
 
@@ -6475,11 +6475,11 @@ stringstream out; \
 out << NiAVObject::asString(); \
 out << "Num Children:  " << numChildren << endl; \
 for (uint i0 = 0; i0 < children.size(); i0++) { \
-  out << "  Children[" << i0 << "]:  " << "NiAVObject" << endl; \
+  out << "  Children[" << i0 << "]:  " << children[i0] << endl; \
 }; \
 out << "Num Effects:  " << numEffects << endl; \
 for (uint i0 = 0; i0 < effects.size(); i0++) { \
-  out << "  Effects[" << i0 << "]:  " << "NiDynamicEffect" << endl; \
+  out << "  Effects[" << i0 << "]:  " << effects[i0] << endl; \
 }; \
 return out.str(); \
 
@@ -6630,7 +6630,7 @@ out << "Unknown Int  2:  " << unknownInt2 << endl; \
 out << "Unknown Int 3:  " << unknownInt3 << endl; \
 out << "Num Unknown Links:  " << numUnknownLinks << endl; \
 for (uint i0 = 0; i0 < unknownLinks.size(); i0++) { \
-  out << "  Unknown Links[" << i0 << "]:  " << "NiObject" << endl; \
+  out << "  Unknown Links[" << i0 << "]:  " << unknownLinks[i0] << endl; \
 }; \
 return out.str(); \
 
@@ -6785,7 +6785,7 @@ if ( (lodType == 0) ) { \
 }; \
 if ( (lodType == 1) ) { \
   out << "  Unknown Short:  " << unknownShort << endl; \
-  out << "  Range Data:  " << "NiRangeLODData" << endl; \
+  out << "  Range Data:  " << rangeData << endl; \
 }; \
 return out.str(); \
 
@@ -6942,7 +6942,7 @@ NifStream( link_map[StaticCast<NiObject>(colorData)], out, version ); \
 #define NI_PARTICLE_COLOR_MODIFIER_STRING \
 stringstream out; \
 out << AParticleModifier::asString(); \
-out << "Color Data:  " << "NiColorData" << endl; \
+out << "Color Data:  " << colorData << endl; \
 return out.str(); \
 
 #define NI_PARTICLE_COLOR_MODIFIER_FIXLINKS \
@@ -7013,7 +7013,7 @@ NifStream( link_map[StaticCast<NiObject>(particleMeshes)], out, version ); \
 stringstream out; \
 out << AParticleModifier::asString(); \
 out << "Num Particle Meshes:  " << numParticleMeshes << endl; \
-out << "Particle Meshes:  " << "NiTriBasedGeom" << endl; \
+out << "Particle Meshes:  " << particleMeshes << endl; \
 return out.str(); \
 
 #define NI_PARTICLE_MESH_MODIFIER_FIXLINKS \
@@ -7231,7 +7231,7 @@ NifStream( link_map[StaticCast<NiObject>(unknownLink2)], out, version ); \
 #define NI_PARTICLE_MESHES_DATA_STRING \
 stringstream out; \
 out << NiParticlesData::asString(); \
-out << "Unknown Link 2:  " << "NiTriBasedGeom" << endl; \
+out << "Unknown Link 2:  " << unknownLink2 << endl; \
 return out.str(); \
 
 #define NI_PARTICLE_MESHES_DATA_FIXLINKS \
@@ -7285,7 +7285,7 @@ out << NiParticles::asString(); \
 out << "Unknown Bool:  " << unknownBool << endl; \
 out << "Num Modifiers:  " << numModifiers << endl; \
 for (uint i0 = 0; i0 < modifiers.size(); i0++) { \
-  out << "  Modifiers[" << i0 << "]:  " << "NiPSysModifier" << endl; \
+  out << "  Modifiers[" << i0 << "]:  " << modifiers[i0] << endl; \
 }; \
 return out.str(); \
 
@@ -7492,7 +7492,7 @@ out << "Lifetime:  " << lifetime << endl; \
 out << "Lifetime Random:  " << lifetimeRandom << endl; \
 out << "Emit Flags:  " << emitFlags << endl; \
 out << "Start Random:  " << startRandom << endl; \
-out << "Emitter:  " << "NiObject" << endl; \
+out << "Emitter:  " << emitter << endl; \
 out << "Unknown Short 2?:  " << unknownShort2_ << endl; \
 out << "Unknown Float 13?:  " << unknownFloat13_ << endl; \
 out << "Unknown Int 1?:  " << unknownInt1_ << endl; \
@@ -7509,9 +7509,9 @@ for (uint i0 = 0; i0 < particles.size(); i0++) { \
   out << "  Unknown Short:  " << particles[i0].unknownShort << endl; \
   out << "  Vertex ID:  " << particles[i0].vertexId << endl; \
 }; \
-out << "Unknown Link:  " << "NiObject" << endl; \
-out << "Particle Extra:  " << "AParticleModifier" << endl; \
-out << "Unknown Link 2:  " << "NiObject" << endl; \
+out << "Unknown Link:  " << unknownLink << endl; \
+out << "Particle Extra:  " << particleExtra << endl; \
+out << "Unknown Link 2:  " << unknownLink2 << endl; \
 out << "Trailer:  " << trailer << endl; \
 return out.str(); \
 
@@ -7619,8 +7619,8 @@ out << "Unknown Int 1:  " << unknownInt1 << endl; \
 out << "Unknown Int 2:  " << unknownInt2 << endl; \
 out << "Unknown Int 3:  " << unknownInt3 << endl; \
 out << "Unknown Short:  " << unknownShort << endl; \
-out << "Pos Data:  " << "NiPosData" << endl; \
-out << "Float Data:  " << "NiFloatData" << endl; \
+out << "Pos Data:  " << posData << endl; \
+out << "Float Data:  " << floatData << endl; \
 return out.str(); \
 
 #define NI_PATH_CONTROLLER_FIXLINKS \
@@ -7679,8 +7679,8 @@ out << NiBlendInterpolator::asString(); \
 out << "Unknown Float 1:  " << unknownFloat1 << endl; \
 out << "Unknown Float 2:  " << unknownFloat2 << endl; \
 out << "Unknown Short 2:  " << unknownShort2 << endl; \
-out << "Pos Data:  " << "NiPosData" << endl; \
-out << "Float Data:  " << "NiFloatData" << endl; \
+out << "Pos Data:  " << posData << endl; \
+out << "Float Data:  " << floatData << endl; \
 return out.str(); \
 
 #define NI_PATH_INTERPOLATOR_FIXLINKS \
@@ -7817,7 +7817,7 @@ out << "Unknown Int:  " << unknownInt << endl; \
 for (uint i0 = 0; i0 < 54; i0++) { \
   out << "  Unknown 54 Bytes[" << i0 << "]:  " << unknown54Bytes[i0] << endl; \
 }; \
-out << "Palette:  " << "NiPalette" << endl; \
+out << "Palette:  " << palette << endl; \
 out << "Num Mipmaps:  " << numMipmaps << endl; \
 out << "Bytes Per Pixel:  " << bytesPerPixel << endl; \
 for (uint i0 = 0; i0 < mipmaps.size(); i0++) { \
@@ -7972,7 +7972,7 @@ NifStream( link_map[StaticCast<NiObject>(data)], out, version ); \
 stringstream out; \
 out << NiInterpolator::asString(); \
 out << "Point 3 Value:  " << point3Value << endl; \
-out << "Data:  " << "NiPosData" << endl; \
+out << "Data:  " << data << endl; \
 return out.str(); \
 
 #define NI_POINT3_INTERPOLATOR_FIXLINKS \
@@ -8092,7 +8092,7 @@ NifStream( link_map[StaticCast<NiObject>(spawnModifier)], out, version ); \
 stringstream out; \
 out << NiPSysModifier::asString(); \
 out << "Spawn on Death:  " << spawnOnDeath << endl; \
-out << "Spawn Modifier:  " << "NiPSysSpawnModifier" << endl; \
+out << "Spawn Modifier:  " << spawnModifier << endl; \
 return out.str(); \
 
 #define NI_P_SYS_AGE_DEATH_MODIFIER_FIXLINKS \
@@ -8149,7 +8149,7 @@ for (uint i0 = 0; i0 < 2; i0++) { \
 #define NI_P_SYS_BOMB_MODIFIER_STRING \
 stringstream out; \
 out << NiPSysModifier::asString(); \
-out << "Unknown Link:  " << "NiNode" << endl; \
+out << "Unknown Link:  " << unknownLink << endl; \
 for (uint i0 = 0; i0 < 2; i0++) { \
   out << "  Unknown Ints 1[" << i0 << "]:  " << unknownInts1[i0] << endl; \
 }; \
@@ -8256,7 +8256,7 @@ NifStream( link_map[StaticCast<NiObject>(collider)], out, version ); \
 #define NI_P_SYS_COLLIDER_MANAGER_STRING \
 stringstream out; \
 out << NiPSysModifier::asString(); \
-out << "Collider:  " << "NiPSysPlanarCollider" << endl; \
+out << "Collider:  " << collider << endl; \
 return out.str(); \
 
 #define NI_P_SYS_COLLIDER_MANAGER_FIXLINKS \
@@ -8292,7 +8292,7 @@ NifStream( link_map[StaticCast<NiObject>(data)], out, version ); \
 #define NI_P_SYS_COLOR_MODIFIER_STRING \
 stringstream out; \
 out << NiPSysModifier::asString(); \
-out << "Data:  " << "NiColorData" << endl; \
+out << "Data:  " << data << endl; \
 return out.str(); \
 
 #define NI_P_SYS_COLOR_MODIFIER_FIXLINKS \
@@ -8504,7 +8504,7 @@ NifStream( rangeFalloff, out, version ); \
 #define NI_P_SYS_DRAG_MODIFIER_STRING \
 stringstream out; \
 out << NiPSysModifier::asString(); \
-out << "Parent:  " << "NiObject" << endl; \
+out << "Parent:  " << parent << endl; \
 out << "Drag Axis:  " << dragAxis << endl; \
 out << "Percentage:  " << percentage << endl; \
 out << "Range:  " << range << endl; \
@@ -8544,7 +8544,7 @@ NifStream( link_map[StaticCast<NiObject>(visibilityInterpolator)], out, version
 #define NI_P_SYS_EMITTER_CTLR_STRING \
 stringstream out; \
 out << APSysCtlr::asString(); \
-out << "Visibility Interpolator:  " << "NiInterpolator" << endl; \
+out << "Visibility Interpolator:  " << visibilityInterpolator << endl; \
 return out.str(); \
 
 #define NI_P_SYS_EMITTER_CTLR_FIXLINKS \
@@ -8769,7 +8769,7 @@ NifStream( turbulenceScale, out, version ); \
 #define NI_P_SYS_GRAVITY_MODIFIER_STRING \
 stringstream out; \
 out << NiPSysModifier::asString(); \
-out << "Gravity Object:  " << "NiNode" << endl; \
+out << "Gravity Object:  " << gravityObject << endl; \
 out << "Gravity Axis:  " << gravityAxis << endl; \
 out << "Decay:  " << decay << endl; \
 out << "Strength:  " << strength << endl; \
@@ -8891,7 +8891,7 @@ stringstream out; \
 out << NiPSysEmitter::asString(); \
 out << "Num Emitter Meshes:  " << numEmitterMeshes << endl; \
 for (uint i0 = 0; i0 < emitterMeshes.size(); i0++) { \
-  out << "  Emitter Meshes[" << i0 << "]:  " << "NiTriBasedGeom" << endl; \
+  out << "  Emitter Meshes[" << i0 << "]:  " << emitterMeshes[i0] << endl; \
 }; \
 out << "Initial Velocity Type:  " << initialVelocityType << endl; \
 out << "Emission Type:  " << emissionType << endl; \
@@ -8943,7 +8943,7 @@ stringstream out; \
 out << NiPSysModifier::asString(); \
 out << "Num Meshes:  " << numMeshes << endl; \
 for (uint i0 = 0; i0 < meshes.size(); i0++) { \
-  out << "  Meshes[" << i0 << "]:  " << "NiNode" << endl; \
+  out << "  Meshes[" << i0 << "]:  " << meshes[i0] << endl; \
 }; \
 return out.str(); \
 
@@ -9040,10 +9040,10 @@ out << NiObject::asString(); \
 out << "Bounce:  " << bounce << endl; \
 out << "Spawn on Collide:  " << spawnOnCollide << endl; \
 out << "Die on Collide:  " << dieOnCollide << endl; \
-out << "Spawn Modifier:  " << "NiPSysSpawnModifier" << endl; \
-out << "Parent:  " << "NiObject" << endl; \
-out << "Unknown Link?:  " << "NiObject" << endl; \
-out << "Collider Object:  " << "NiNode" << endl; \
+out << "Spawn Modifier:  " << spawnModifier << endl; \
+out << "Parent:  " << parent << endl; \
+out << "Unknown Link?:  " << unknownLink_ << endl; \
+out << "Collider Object:  " << colliderObject << endl; \
 out << "Width:  " << width << endl; \
 out << "Height:  " << height << endl; \
 out << "X Axis:  " << xAxis << endl; \
@@ -9549,7 +9549,7 @@ out << "Rotation:  " << rotation << endl; \
 out << "Translation:  " << translation << endl; \
 out << "Scale:  " << scale << endl; \
 out << "Num Bones:  " << numBones << endl; \
-out << "Skin Partition:  " << "NiSkinPartition" << endl; \
+out << "Skin Partition:  " << skinPartition << endl; \
 out << "Unknown Byte:  " << unknownByte << endl; \
 for (uint i0 = 0; i0 < boneList.size(); i0++) { \
   out << "  Rotation:  " << boneList[i0].rotation << endl; \
@@ -9624,12 +9624,12 @@ for (uint i0 = 0; i0 < bones.bones.size(); i0++) { \
 #define NI_SKIN_INSTANCE_STRING \
 stringstream out; \
 out << NiObject::asString(); \
-out << "Data:  " << "NiSkinData" << endl; \
-out << "Skin Partition:  " << "NiSkinPartition" << endl; \
-out << "Skeleton Root:  " << "NiNode" << endl; \
+out << "Data:  " << data << endl; \
+out << "Skin Partition:  " << skinPartition << endl; \
+out << "Skeleton Root:  " << skeletonRoot << endl; \
 out << "Num Bones:  " << bones.numBones << endl; \
 for (uint i0 = 0; i0 < bones.bones.size(); i0++) { \
-  out << "  Bones[" << i0 << "]:  " << "NiNode" << endl; \
+  out << "  Bones[" << i0 << "]:  " << bones.bones[i0] << endl; \
 }; \
 return out.str(); \
 
@@ -10000,12 +10000,12 @@ out << NiObjectNET::asString(); \
 out << "Use External:  " << useExternal << endl; \
 if ( (useExternal == 1) ) { \
   out << "  File Name:  " << fileName << endl; \
-  out << "  Unknown Link:  " << "NiObject" << endl; \
+  out << "  Unknown Link:  " << unknownLink << endl; \
 }; \
 if ( (useExternal == 0) ) { \
   out << "  Unknown Byte:  " << unknownByte << endl; \
   out << "  Original File Name?:  " << originalFileName_ << endl; \
-  out << "  Pixel Data:  " << "NiPixelData" << endl; \
+  out << "  Pixel Data:  " << pixelData << endl; \
 }; \
 out << "Pixel Layout:  " << pixelLayout << endl; \
 out << "Use Mipmaps:  " << useMipmaps << endl; \
@@ -10425,7 +10425,7 @@ out << "Texture Filtering:  " << textureFiltering << endl; \
 out << "Texture Clamping:  " << textureClamping << endl; \
 out << "Texture Type:  " << textureType << endl; \
 out << "Coordinate Generation Type:  " << coordinateGenerationType << endl; \
-out << "Source Texture:  " << "NiSourceTexture" << endl; \
+out << "Source Texture:  " << sourceTexture << endl; \
 out << "Clipping Plane:  " << clippingPlane << endl; \
 out << "Unknown Vector:  " << unknownVector << endl; \
 out << "Unknown Float:  " << unknownFloat << endl; \
@@ -10483,7 +10483,7 @@ out << NiSingleInterpolatorController::asString(); \
 out << "Unknown2:  " << unknown2 << endl; \
 out << "Texture Slot:  " << textureSlot << endl; \
 out << "Operation:  " << operation << endl; \
-out << "Data:  " << "NiFloatData" << endl; \
+out << "Data:  " << data << endl; \
 return out.str(); \
 
 #define NI_TEXTURE_TRANSFORM_CONTROLLER_FIXLINKS \
@@ -11024,7 +11024,7 @@ out << "Apply Mode:  " << applyMode << endl; \
 out << "Texture Count:  " << textureCount << endl; \
 out << "Has Base Texture:  " << hasBaseTexture << endl; \
 if ( (hasBaseTexture != 0) ) { \
-  out << "  Source:  " << "NiSourceTexture" << endl; \
+  out << "  Source:  " << baseTexture.source << endl; \
   out << "  Clamp Mode:  " << baseTexture.clampMode << endl; \
   out << "  Filter Mode:  " << baseTexture.filterMode << endl; \
   out << "  Texture Set:  " << baseTexture.textureSet << endl; \
@@ -11042,7 +11042,7 @@ if ( (hasBaseTexture != 0) ) { \
 }; \
 out << "Has Dark Texture:  " << hasDarkTexture << endl; \
 if ( (hasDarkTexture != 0) ) { \
-  out << "  Source:  " << "NiSourceTexture" << endl; \
+  out << "  Source:  " << darkTexture.source << endl; \
   out << "  Clamp Mode:  " << darkTexture.clampMode << endl; \
   out << "  Filter Mode:  " << darkTexture.filterMode << endl; \
   out << "  Texture Set:  " << darkTexture.textureSet << endl; \
@@ -11060,7 +11060,7 @@ if ( (hasDarkTexture != 0) ) { \
 }; \
 out << "Has Detail Texture:  " << hasDetailTexture << endl; \
 if ( (hasDetailTexture != 0) ) { \
-  out << "  Source:  " << "NiSourceTexture" << endl; \
+  out << "  Source:  " << detailTexture.source << endl; \
   out << "  Clamp Mode:  " << detailTexture.clampMode << endl; \
   out << "  Filter Mode:  " << detailTexture.filterMode << endl; \
   out << "  Texture Set:  " << detailTexture.textureSet << endl; \
@@ -11078,7 +11078,7 @@ if ( (hasDetailTexture != 0) ) { \
 }; \
 out << "Has Gloss Texture:  " << hasGlossTexture << endl; \
 if ( (hasGlossTexture != 0) ) { \
-  out << "  Source:  " << "NiSourceTexture" << endl; \
+  out << "  Source:  " << glossTexture.source << endl; \
   out << "  Clamp Mode:  " << glossTexture.clampMode << endl; \
   out << "  Filter Mode:  " << glossTexture.filterMode << endl; \
   out << "  Texture Set:  " << glossTexture.textureSet << endl; \
@@ -11096,7 +11096,7 @@ if ( (hasGlossTexture != 0) ) { \
 }; \
 out << "Has Glow Texture:  " << hasGlowTexture << endl; \
 if ( (hasGlowTexture != 0) ) { \
-  out << "  Source:  " << "NiSourceTexture" << endl; \
+  out << "  Source:  " << glowTexture.source << endl; \
   out << "  Clamp Mode:  " << glowTexture.clampMode << endl; \
   out << "  Filter Mode:  " << glowTexture.filterMode << endl; \
   out << "  Texture Set:  " << glowTexture.textureSet << endl; \
@@ -11114,7 +11114,7 @@ if ( (hasGlowTexture != 0) ) { \
 }; \
 out << "Has Bump Map Texture:  " << hasBumpMapTexture << endl; \
 if ( (hasBumpMapTexture != 0) ) { \
-  out << "  Source:  " << "NiSourceTexture" << endl; \
+  out << "  Source:  " << bumpMapTexture.source << endl; \
   out << "  Clamp Mode:  " << bumpMapTexture.clampMode << endl; \
   out << "  Filter Mode:  " << bumpMapTexture.filterMode << endl; \
   out << "  Texture Set:  " << bumpMapTexture.textureSet << endl; \
@@ -11135,7 +11135,7 @@ if ( (hasBumpMapTexture != 0) ) { \
 }; \
 out << "Has Decal 0 Texture:  " << hasDecal0Texture << endl; \
 if ( (hasDecal0Texture != 0) ) { \
-  out << "  Source:  " << "NiSourceTexture" << endl; \
+  out << "  Source:  " << decal0Texture.source << endl; \
   out << "  Clamp Mode:  " << decal0Texture.clampMode << endl; \
   out << "  Filter Mode:  " << decal0Texture.filterMode << endl; \
   out << "  Texture Set:  " << decal0Texture.textureSet << endl; \
@@ -11155,7 +11155,7 @@ if ( (textureCount == 8) ) { \
   out << "  Has Decal 1 Texture:  " << hasDecal1Texture << endl; \
 }; \
 if ( (((textureCount == 8)) && ((hasDecal1Texture != 0))) ) { \
-  out << "  Source:  " << "NiSourceTexture" << endl; \
+  out << "  Source:  " << decal1Texture.source << endl; \
   out << "  Clamp Mode:  " << decal1Texture.clampMode << endl; \
   out << "  Filter Mode:  " << decal1Texture.filterMode << endl; \
   out << "  Texture Set:  " << decal1Texture.textureSet << endl; \
@@ -11175,7 +11175,7 @@ out << "Num Shader Textures:  " << numShaderTextures << endl; \
 for (uint i0 = 0; i0 < shaderTextures.size(); i0++) { \
   out << "  Is Used:  " << shaderTextures[i0].isUsed << endl; \
   if ( (shaderTextures[i0].isUsed != 0) ) { \
-    out << "    Source:  " << "NiSourceTexture" << endl; \
+    out << "    Source:  " << shaderTextures[i0].textureData.source << endl; \
     out << "    Clamp Mode:  " << shaderTextures[i0].textureData.clampMode << endl; \
     out << "    Filter Mode:  " << shaderTextures[i0].textureData.filterMode << endl; \
     out << "    Texture Set:  " << shaderTextures[i0].textureData.textureSet << endl; \
@@ -11378,7 +11378,7 @@ out << "Scale:  " << scale << endl; \
 for (uint i0 = 0; i0 < 3; i0++) { \
   out << "  Unknown Bytes[" << i0 << "]:  " << unknownBytes[i0] << endl; \
 }; \
-out << "Data:  " << "NiTransformData" << endl; \
+out << "Data:  " << data << endl; \
 return out.str(); \
 
 #define NI_TRANSFORM_INTERPOLATOR_FIXLINKS \
@@ -11648,7 +11648,7 @@ NifStream( link_map[StaticCast<NiObject>(data)], out, version ); \
 stringstream out; \
 out << NiTimeController::asString(); \
 out << "Unknown Short:  " << unknownShort << endl; \
-out << "Data:  " << "NiUVData" << endl; \
+out << "Data:  " << data << endl; \
 return out.str(); \
 
 #define NI_U_V_CONTROLLER_FIXLINKS \
@@ -11847,7 +11847,7 @@ if ( version <= 0x0A010000 ) { \
 #define NI_VIS_CONTROLLER_STRING \
 stringstream out; \
 out << NiSingleInterpolatorController::asString(); \
-out << "Data:  " << "NiVisData" << endl; \
+out << "Data:  " << data << endl; \
 return out.str(); \
 
 #define NI_VIS_CONTROLLER_FIXLINKS \