diff --git a/NifCommon/NifVersion.h b/NifCommon/NifVersion.h
index 4f05d36b510dac5a36e09071910439115822dc65..6fb3d1c3ea1688bf83960238d472c356fe332dad 100644
--- a/NifCommon/NifVersion.h
+++ b/NifCommon/NifVersion.h
@@ -18,10 +18,10 @@ HISTORY:
 */
 #define VERSION_MAJOR_INT  0
 #define VERSION_MINOR_INT  2
-#define VERSION_BUILD_INT  10
+#define VERSION_BUILD_INT  11
 #define VERSION_PATCH_INT  0
 
-#define VERSION_STRING "0, 2, 10, 0"
+#define VERSION_STRING "0, 2, 11, 0"
 
 //#define DEF_VERSION_STRING(a,b,c,d) #a ", " #b ", " #c ", " #d
 //#define VERSION_STRING DEF_VERSION_STRING(a,b,c,d)
diff --git a/NifExport/Coll.cpp b/NifExport/Coll.cpp
index 5503d203fc12cd047e0657cb7202159058c01234..8281c68fc2d36af29313d46cc3c2c64ff5596a24 100755
--- a/NifExport/Coll.cpp
+++ b/NifExport/Coll.cpp
@@ -1,4 +1,5 @@
 #include "pch.h"
+#include "../NifProps/bhkRigidBodyInterface.h"
 
 #ifdef _DEBUG
 #include <assert.h>
@@ -9,6 +10,7 @@
 #endif
 
 static Class_ID SCUBA_CLASS_ID(0x6d3d77ac, 0x79c939a9);
+static Class_ID BHKRIGIDBODYMODIFIER_CLASS_ID(0x398fd801, 0x303e44e5);
 
 enum
 {
@@ -252,7 +254,8 @@ Exporter::Result Exporter::exportCollision(NiNodeRef &parent, INode *node)
    ProgressUpdate(Collision, FormatText("'%s' Collision", node->GetName()));
 
 	// marked as collision?
-	bool coll = npIsCollision(node);
+	//bool coll = npIsCollision(node);
+   bool coll = (mCollisionNodes.find(node) != mCollisionNodes.end());
 
    bool local = !mFlattenHierarchy;
    NiNodeRef nodeParent = mFlattenHierarchy ? mNiRoot : parent;
@@ -482,3 +485,38 @@ bhkSphereRepShapeRef Exporter::makeTriStripsShape(INode *node, const Matrix3& tm
 
 	return bhkSphereRepShapeRef(DynamicCast<bhkSphereRepShape>(shape));
 }
+
+
+Exporter::Result Exporter::scanForCollision(INode *node)
+{   
+   if (NULL == node) 
+      return Exporter::Skip;
+   // Get the bhk RigidBody modifier if available and then get the picked node.
+   if (Modifier * mod = GetbhkCollisionModifier(node)){
+      if (IParamBlock2* pblock = (IParamBlock2*)mod->GetReference(0)) {
+         if (INode *collMesh = pblock->GetINode(0, 0)) {
+            mCollisionNodes.insert(collMesh);
+         } else {
+            if (mSceneCollisionNode != NULL) {
+               if (mExportCollision) {
+                  throw runtime_error("There are more than one Collision mesh found at the Scene Level.");
+               }
+            } else {
+               mSceneCollisionNode = node;
+            }
+         }
+      }
+   }
+   // Check self to see if is one of our bhkXXXObject classes
+   if (Object* obj = node->GetObjectRef())
+   {
+      if (obj->SuperClassID() == HELPER_CLASS_ID &&
+         obj->ClassID().PartB() == BHKRIGIDBODYCLASS_DESC.PartB()) {
+         mCollisionNodes.insert(node);
+      }
+   }
+   for (int i=0; i<node->NumberOfChildren(); i++) {
+      scanForCollision(node->GetChildNode(i));
+   }
+   return Exporter::Ok;
+}
diff --git a/NifExport/Exporter.cpp b/NifExport/Exporter.cpp
index 18e18e9eab399aa89d8ca72f6b022f3ac25b1c8c..e7fe0de59b4d3141d97e816c5a2873247f5d5cb7 100755
--- a/NifExport/Exporter.cpp
+++ b/NifExport/Exporter.cpp
@@ -57,7 +57,7 @@ static bool IsNodeOrParentSelected(INode *node) {
 }
 
 Exporter::Exporter(Interface *i, AppSettings *appSettings)
-   : mI(i), mAppSettings(appSettings)
+   : mI(i), mAppSettings(appSettings), mSceneCollisionNode(NULL)
 {
    memset(progressCounters, 0, sizeof(progressCounters));
    memset(progressMax, 0, sizeof(progressMax));
@@ -111,6 +111,9 @@ Exporter::Result Exporter::doExport(NiNodeRef &root, INode *node)
       exportUPB(root, node);
    }
 
+   // Always Scan for Collision Nodes first
+   scanForCollision(node);
+
    mNiRoot = root;
    if (mSelectedOnly) {
       int count = 0;
@@ -137,11 +140,11 @@ Exporter::Result Exporter::doExport(NiNodeRef &root, INode *node)
          Result result = exportNodes(root, selectedRoots[i]);
          if (result != Ok && result != Skip)
             return result;
-         if (mExportCollision) {
-            result = exportCollision(root, selectedRoots[i]);
-            if (result != Ok)
-               return result;
-         }
+         //if (mExportCollision) {
+         //   result = exportCollision(root, selectedRoots[i]);
+         //   if (result != Ok)
+         //      return result;
+         //}
       }
       // Always Zero out root transforms
       vector<NiAVObjectRef> children = root->GetChildren();
@@ -223,10 +226,13 @@ Exporter::Result Exporter::doExport(NiNodeRef &root, INode *node)
 Exporter::Result Exporter::exportNodes(NiNodeRef &parent, INode *node)
 {
    TSTR nodeName = node->GetName();
-   bool coll = npIsCollision(node);
+   //bool coll = npIsCollision(node);
+   bool coll = (mCollisionNodes.find(node) != mCollisionNodes.end());
 
    ProgressUpdate(Geometry, FormatText("'%s' Geometry", nodeName.data()));
-   if (coll ||	(node->IsHidden() && !mExportHidden && !coll))
+
+   // Abort if is a collision node or is hidden and we are not exporting hidden
+   if (coll ||	(node->IsHidden() && !mExportHidden))
       return Skip;
 
    bool local = !mFlattenHierarchy;
diff --git a/NifExport/Exporter.h b/NifExport/Exporter.h
index 3b407d95d775227261d63e0b2e523b7deefe82b0..22ccee5d967e1598816bf4087abd78137d3431da 100755
--- a/NifExport/Exporter.h
+++ b/NifExport/Exporter.h
@@ -139,14 +139,17 @@ public:
 
 	// maps face groups to material ID
 	typedef std::map<int, FaceGroup>	FaceGroups;	
+   typedef std::set<INode*> INodeMap;	
    typedef std::map<string, NiNodeRef>	NodeMap;	
-   typedef std::list<NiCallback*> CallbackList;
+   typedef std::list<NiCallback*> CallbackList; 
    typedef std::list<Ref<NiNode> > NodeList;
    
 	Interface				*mI;
 	NiNodeRef				mNiRoot;
    AppSettings          *mAppSettings;
    NodeMap              mNodeMap;
+   INodeMap             mCollisionNodes;
+   INode*               mSceneCollisionNode;
    CallbackList         mPostExportCallbacks;
    bool                 mIsBethesda;
    Box3                 mBoundingBox;
@@ -154,6 +157,7 @@ public:
 
    Result					exportNodes(NiNodeRef &root, INode *node);
 	Result					exportCollision(NiNodeRef &root, INode *node);
+   Result               scanForCollision(INode *node);
 
 	/* utility functions */
 	Mtl						*getMaterial(INode *node, int subMtl);
diff --git a/NifExport/Util.cpp b/NifExport/Util.cpp
index d45b427e793b31dd65748570893de54c8203d724..6f98c6f9df0c95059d6b83d2ae3d1c68fe66f150 100755
--- a/NifExport/Util.cpp
+++ b/NifExport/Util.cpp
@@ -145,7 +145,8 @@ bool Exporter::isCollisionGroup(INode *maxNode, bool root)
 			return false;
 	} else
 	{
-		if (npIsCollision(maxNode))
+      if (mCollisionNodes.find(maxNode) != mCollisionNodes.end())
+		//if (npIsCollision(maxNode))
 			return true;
 	}
 
@@ -166,7 +167,8 @@ bool Exporter::isMeshGroup(INode *maxNode, bool root)
 			return false;
 	} else
 	{
-		if (!npIsCollision(maxNode))
+      if (mCollisionNodes.find(maxNode) == mCollisionNodes.end())
+		//if (!npIsCollision(maxNode))
 		{
 			TimeValue t = 0;
 			ObjectState os = maxNode->EvalWorldState(t); 
diff --git a/NifPlugins/DllEntry.cpp b/NifPlugins/DllEntry.cpp
index 5cabc3ae46821542c5016ed0bc8d6ae5a75a6728..3beef1029ce9b0960b4bef717f031f0dd46ffd16 100644
--- a/NifPlugins/DllEntry.cpp
+++ b/NifPlugins/DllEntry.cpp
@@ -18,8 +18,8 @@ extern ClassDesc2* GetNifFurnitureDesc();
 extern ClassDesc2* GetKfExportDesc();
 extern ClassDesc2* GetbhkSphereDesc();
 extern ClassDesc2* GetbhkCapsuleDesc();
-//extern ClassDesc2* GetbhkRigidBodyModifierDesc();
-//extern ClassDesc2* GetbhkBoxDesc();
+extern ClassDesc2* GetbhkRigidBodyModifierDesc();
+extern ClassDesc2* GetbhkBoxDesc();
 
 enum ClassDescType
 {
@@ -94,7 +94,7 @@ void InitializeLibSettings()
    }
    if ( GetIniValue<bool>("NifProps", "Enable", true, iniName) ) {
       classDescEnabled[CD_Props] = true;
-      classDescriptions[nClasses++] = GetNifPropsDesc();
+      //classDescriptions[nClasses++] = GetNifPropsDesc();
 #ifdef USE_UNSUPPORTED_CODE
       classDescriptions[nClasses++] = GetbhkRigidBodyModifierDesc();
       classDescriptions[nClasses++] = GetbhkSphereDesc();
diff --git a/NifPlugins_VC80.vcproj b/NifPlugins_VC80.vcproj
index 90fa3b6871adbb3bbb9f94470ba0ad003fac2d4c..0de9f6b8547c9877b76aeddce8612f31bfb9b0fc 100644
--- a/NifPlugins_VC80.vcproj
+++ b/NifPlugins_VC80.vcproj
@@ -1075,6 +1075,10 @@
 			<Filter
 				Name="Source Files"
 				>
+				<File
+					RelativePath=".\NifProps\bhkBoxObj.cpp"
+					>
+				</File>
 				<File
 					RelativePath=".\NifProps\bhkCapsuleObj.cpp"
 					>
@@ -1084,11 +1088,11 @@
 					>
 				</File>
 				<File
-					RelativePath=".\NifProps\bhkSphereObj.cpp"
+					RelativePath=".\NifProps\bhkRigidBodyModifer.cpp"
 					>
 				</File>
 				<File
-					RelativePath=".\NifProps\NifProps.cpp"
+					RelativePath=".\NifProps\bhkSphereObj.cpp"
 					>
 				</File>
 			</Filter>
diff --git a/NifProps/NifProps.rc b/NifProps/NifProps.rc
index d01af50e8e27a952d550c82495516d5bd50bcece..3b4fc5616092507df3c67f83f95919b64ec00aad 100755
--- a/NifProps/NifProps.rc
+++ b/NifProps/NifProps.rc
@@ -35,7 +35,7 @@ LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
 
 3 TEXTINCLUDE 
 BEGIN
-    "\r\n"
+    "\r\0"
 END
 
 #endif    // APSTUDIO_INVOKED
@@ -72,7 +72,7 @@ BEGIN
     "#define DLLNAME ""NifProps.dlu""  // DLL Name\r\n"
     "#define DLLDESCRIPTION ""3ds Max Nif Reactor Properites Plugin""\r\n"
     "#include ""..\\nifcommon\\nifversion.rc""  \r\n"
-    "#endif\r\n"
+    "#endif\r\0"
 END
 
 #endif    // APSTUDIO_INVOKED
@@ -83,56 +83,50 @@ END
 // Dialog
 //
 
-IDD_PANEL DIALOGEX 0, 0, 107, 360
+IDD_PANEL DIALOGEX 0, 0, 112, 333
 STYLE DS_SETFONT | DS_3DLOOK | WS_CHILD | WS_VISIBLE
 FONT 8, "MS Sans Serif", 0, 0, 0x0
 BEGIN
-    COMBOBOX        IDC_CB_MATERIAL,12,58,83,157,CBS_DROPDOWNLIST | WS_DISABLED | WS_VSCROLL | WS_TABSTOP
-    CONTROL         "Material",IDC_LBL_MATERIAL,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_DISABLED | WS_GROUP,12,50,83,8
-    COMBOBOX        IDC_CB_LAYER,12,82,83,171,CBS_DROPDOWNLIST | WS_DISABLED | WS_VSCROLL | WS_TABSTOP
-    CONTROL         "Layer",IDC_LBL_LAYER,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_DISABLED | WS_GROUP,12,74,83,8
-    GROUPBOX        "Havok",IDC_GRP_HAVOK,5,39,95,285,WS_DISABLED
-    GROUPBOX        "Object",IDC_GRP_OBJECT,5,5,95,32
+    GROUPBOX        "Object",IDC_GRP_OBJECT,10,5,95,46
     CONTROL         "Is Collision Mesh",IDC_CHK_ISCOLL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,18,80,10
-    CONTROL         "Center",IDC_LBL_CENTER,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_DISABLED | WS_GROUP,12,98,31,8
-    CONTROL         "Mass",IDC_LBL_MASS,"Static",SS_LEFTNOWORDWRAP | WS_DISABLED | WS_GROUP,12,124,28,8
-    CONTROL         "Friction",IDC_LBL_FRICTION,"Static",SS_LEFTNOWORDWRAP | WS_DISABLED | WS_GROUP,42,124,28,8
-    LTEXT           "Resti-\r\ntution",IDC_LBL_RESTITUTION,70,124,24,15,WS_DISABLED
-    CONTROL         "Motion System",IDC_LBL_MOTION_SYSTEM,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_DISABLED | WS_GROUP,12,263,67,8
-    COMBOBOX        IDC_CB_MOTION_SYSTEM,12,273,83,74,CBS_DROPDOWNLIST | WS_DISABLED | WS_VSCROLL | WS_TABSTOP
-    CONTROL         "Quality Type",IDC_LBL_QUALITY_TYPE,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_DISABLED | WS_GROUP,12,289,43,8
-    COMBOBOX        IDC_CB_QUALITY_TYPE,12,298,83,63,CBS_DROPDOWN | WS_DISABLED | WS_VSCROLL | WS_TABSTOP
-    CONTROL         "",IDC_ED_CENTER_X,"CustEdit",WS_DISABLED | WS_TABSTOP,12,109,20,10
-    CONTROL         "",IDC_SP_CENTER_X,"SpinnerControl",WS_DISABLED,30,109,7,10
-    CONTROL         "",IDC_ED_CENTER_Y,"CustEdit",WS_DISABLED | WS_TABSTOP,42,109,20,10
-    CONTROL         "",IDC_SP_CENTER_Y,"SpinnerControl",WS_DISABLED,60,109,7,10
-    CONTROL         "",IDC_ED_CENTER_Z,"CustEdit",WS_DISABLED | WS_TABSTOP,72,109,20,10
-    CONTROL         "",IDC_SP_CENTER_Z,"SpinnerControl",WS_DISABLED,92,109,7,10
-    CONTROL         "",IDC_ED_MASS,"CustEdit",WS_DISABLED | WS_TABSTOP,12,143,20,10
-    CONTROL         "",IDC_SP_MASS,"SpinnerControl",WS_DISABLED,30,143,7,10
-    CONTROL         "",IDC_ED_FRICTION,"CustEdit",WS_DISABLED | WS_TABSTOP,42,143,20,10
-    CONTROL         "",IDC_SP_FRICTION,"SpinnerControl",WS_DISABLED,60,143,7,10
-    CONTROL         "",IDC_ED_RESTITUTION,"CustEdit",WS_DISABLED | WS_TABSTOP,70,143,20,10
-    CONTROL         "",IDC_SP_RESTITUTION,"SpinnerControl",WS_DISABLED,90,143,7,10
-    LTEXT           "Linear\r\nDamping",IDC_LBL_LINEAR_DAMPING,12,159,30,17,WS_DISABLED
-    CONTROL         "",IDC_ED_LINEAR_DAMPING,"CustEdit",WS_DISABLED | WS_TABSTOP,12,178,35,10
-    CONTROL         "",IDC_SP_LINEAR_DAMPING,"SpinnerControl",WS_DISABLED,45,178,7,10
-    LTEXT           "Angular\r\nDamping",IDC_LBL_ANGULAR_DAMPING,55,159,45,17,WS_DISABLED
-    CONTROL         "",IDC_ED_ANGULAR_DAMPING,"CustEdit",WS_DISABLED | WS_TABSTOP,55,178,35,10
-    CONTROL         "",IDC_SP_ANGULAR_DAMPING,"SpinnerControl",WS_DISABLED,90,178,7,10
-    LTEXT           "Max. Linear\r\nVelocity",IDC_LBL_MAX_LINEAR_VELOCITY,12,194,40,16,WS_DISABLED
-    CONTROL         "",IDC_ED_MAX_LINEAR_VELOCITY,"CustEdit",WS_DISABLED | WS_TABSTOP,12,214,35,10
-    CONTROL         "",IDC_SP_MAX_LINEAR_VELOCITY,"SpinnerControl",WS_DISABLED,45,214,7,10
-    LTEXT           "Max. Angular\r\nVelocity",IDC_LBL_MAX_ANGULAR_VELOCITY,55,194,45,16,WS_DISABLED
-    CONTROL         "",IDC_ED_MAX_ANGULAR_VELOCITY,"CustEdit",WS_DISABLED | WS_TABSTOP,55,214,35,10
-    CONTROL         "",IDC_SP_MAX_ANGULAR_VELOCITY,"SpinnerControl",WS_DISABLED,90,214,7,10
-    LTEXT           "Penetration\r\nDepth",IDC_LBL_PENETRATION_DEPTH,12,229,40,16,WS_DISABLED
-    CONTROL         "",IDC_ED_PENETRATION_DEPTH,"CustEdit",WS_DISABLED | WS_TABSTOP,12,249,35,10
-    CONTROL         "",IDC_SP_PENETRATION_DEPTH,"SpinnerControl",WS_DISABLED,45,249,7,10
-    GROUPBOX        "Animation",IDC_GRP_ANIMATION,7,325,95,28
-    LTEXT           "Priority:",IDC_STATIC,10,338,24,8
-    CONTROL         "",IDC_ED_ANIM_PRIORITY,"CustEdit",WS_DISABLED | WS_TABSTOP,39,337,20,10
-    CONTROL         "",IDC_SP_ANIM_PRIORITY,"SpinnerControl",WS_DISABLED,57,337,7,10
+    GROUPBOX        "Animation",IDC_GRP_ANIMATION,7,290,95,28
+    LTEXT           "Priority:",IDC_STATIC,10,304,24,8
+    CONTROL         "",IDC_ED_ANIM_PRIORITY,"CustEdit",WS_DISABLED | WS_TABSTOP,39,303,20,10
+    CONTROL         "",IDC_SP_ANIM_PRIORITY,"SpinnerControl",WS_DISABLED,60,303,7,10
+    COMBOBOX        IDC_CB_MATERIAL,13,77,83,157,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "Material",IDC_LBL_MATERIAL,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_GROUP,13,69,83,8
+    COMBOBOX        IDC_CB_LAYER,13,101,83,171,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "Layer",IDC_LBL_LAYER,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_GROUP,13,92,83,8
+    GROUPBOX        "Rigid Body",IDC_GRP_HAVOK,7,58,98,230
+    CONTROL         "Mass",IDC_LBL_MASS,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,13,118,56,8
+    CONTROL         "Friction",IDC_LBL_FRICTION,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,13,131,56,8
+    LTEXT           "Restitution",IDC_LBL_RESTITUTION,13,142,56,11
+    CONTROL         "Motion System",IDC_LBL_MOTION_SYSTEM,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_GROUP,13,238,67,8
+    COMBOBOX        IDC_CB_MOTION_SYSTEM,13,247,83,74,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "Quality Type",IDC_LBL_QUALITY_TYPE,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_GROUP,13,263,43,8
+    COMBOBOX        IDC_CB_QUALITY_TYPE,13,272,83,63,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "",IDC_ED_MASS,"CustEdit",WS_TABSTOP,71,118,22,10
+    CONTROL         "",IDC_SP_MASS,"SpinnerControl",0x0,93,118,7,10
+    CONTROL         "",IDC_ED_FRICTION,"CustEdit",WS_TABSTOP,71,130,22,10
+    CONTROL         "",IDC_SP_FRICTION,"SpinnerControl",0x0,93,130,7,10
+    CONTROL         "",IDC_ED_RESTITUTION,"CustEdit",WS_TABSTOP,71,142,22,10
+    CONTROL         "",IDC_SP_RESTITUTION,"SpinnerControl",0x0,93,142,7,10
+    LTEXT           "Linear Damping",IDC_LBL_LINEAR_DAMPING,13,155,56,11
+    CONTROL         "",IDC_ED_LINEAR_DAMPING,"CustEdit",WS_TABSTOP,71,155,22,10
+    CONTROL         "",IDC_SP_LINEAR_DAMPING,"SpinnerControl",0x0,93,155,7,10
+    LTEXT           "Angular Damping",IDC_LBL_ANGULAR_DAMPING,13,167,56,10
+    CONTROL         "",IDC_ED_ANGULAR_DAMPING,"CustEdit",WS_TABSTOP,71,167,22,10
+    CONTROL         "",IDC_SP_ANGULAR_DAMPING,"SpinnerControl",0x0,93,167,7,10
+    LTEXT           "Max. Linear Velocity",IDC_LBL_MAX_LINEAR_VELOCITY,13,179,56,16
+    CONTROL         "",IDC_ED_MAX_LINEAR_VELOCITY,"CustEdit",WS_TABSTOP,71,183,22,10
+    CONTROL         "",IDC_SP_MAX_LINEAR_VELOCITY,"SpinnerControl",0x0,93,183,7,10
+    LTEXT           "Max. Angular Velocity",IDC_LBL_MAX_ANGULAR_VELOCITY,13,198,56,16
+    CONTROL         "",IDC_ED_MAX_ANGULAR_VELOCITY,"CustEdit",WS_TABSTOP,71,202,22,10
+    CONTROL         "",IDC_SP_MAX_ANGULAR_VELOCITY,"SpinnerControl",0x0,93,202,7,10
+    LTEXT           "Penetration Depth",IDC_LBL_PENETRATION_DEPTH,13,217,56,16
+    CONTROL         "",IDC_ED_PENETRATION_DEPTH,"CustEdit",WS_TABSTOP,71,221,22,10
+    CONTROL         "",IDC_SP_PENETRATION_DEPTH,"SpinnerControl",0x0,93,221,7,10
+    PUSHBUTTON      "<None>",IDC_PICK_NODE,29,33,54,13
 END
 
 IDD_ANIM_PANEL DIALOGEX 0, 0, 107, 41
@@ -145,82 +139,133 @@ BEGIN
     CONTROL         "",IDC_SP_ANIM_PRIORITY,"SpinnerControl",WS_DISABLED,55,17,7,10
 END
 
-IDD_SPHEREPARAM2 DIALOGEX 0, 0, 108, 51
+IDD_SPHEREPARAM2 DIALOGEX 0, 0, 107, 74
+STYLE DS_SETFONT | WS_CHILD | WS_VISIBLE
+FONT 8, "MS Sans Serif", 0, 0, 0x0
+BEGIN
+    CONTROL         "",IDC_RADIUS,"CustEdit",WS_TABSTOP,49,31,36,10
+    CONTROL         "",IDC_SEGMENTS,"CustEdit",WS_TABSTOP,49,44,36,10
+    CONTROL         "Smooth",IDC_OBSMOOTH,"Button",BS_AUTOCHECKBOX,49,59,36,10
+    RTEXT           "Radius:",-1,22,32,25,8
+    RTEXT           "Segments:",-1,11,44,36,8
+    CONTROL         "",IDC_SEGSPINNER,"SpinnerControl",0x0,87,44,7,10
+    CONTROL         "",IDC_RADSPINNER,"SpinnerControl",0x0,87,31,7,10
+    COMBOBOX        IDC_CB_MATERIAL,12,13,83,157,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "Material",IDC_LBL_MATERIAL,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_GROUP,12,4,83,8
+END
+
+IDD_RIGIDBODY DIALOGEX 0, 0, 107, 216
+STYLE DS_SETFONT | DS_3DLOOK | WS_CHILD | WS_VISIBLE
+FONT 8, "MS Sans Serif", 0, 0, 0x0
+BEGIN
+    COMBOBOX        IDC_CB_LAYER,9,22,83,171,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "Layer",IDC_LBL_LAYER,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_GROUP,9,13,83,8
+    GROUPBOX        "Rigid Body",IDC_GRP_HAVOK,4,3,98,208
+    CONTROL         "Mass",IDC_LBL_MASS,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,9,39,56,8
+    CONTROL         "Friction",IDC_LBL_FRICTION,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,9,52,56,8
+    LTEXT           "Restitution",IDC_LBL_RESTITUTION,9,63,56,11
+    CONTROL         "Motion System",IDC_LBL_MOTION_SYSTEM,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_GROUP,9,159,67,8
+    COMBOBOX        IDC_CB_MOTION_SYSTEM,9,168,83,74,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "Quality Type",IDC_LBL_QUALITY_TYPE,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_GROUP,9,184,43,8
+    COMBOBOX        IDC_CB_QUALITY_TYPE,9,193,83,63,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "",IDC_ED_MASS,"CustEdit",WS_TABSTOP,67,39,22,10
+    CONTROL         "",IDC_SP_MASS,"SpinnerControl",0x0,90,39,7,10
+    CONTROL         "",IDC_ED_FRICTION,"CustEdit",WS_TABSTOP,67,51,22,10
+    CONTROL         "",IDC_SP_FRICTION,"SpinnerControl",0x0,90,51,7,10
+    CONTROL         "",IDC_ED_RESTITUTION,"CustEdit",WS_TABSTOP,67,63,22,10
+    CONTROL         "",IDC_SP_RESTITUTION,"SpinnerControl",0x0,90,63,7,10
+    LTEXT           "Linear Damping",IDC_LBL_LINEAR_DAMPING,9,76,56,11
+    CONTROL         "",IDC_ED_LINEAR_DAMPING,"CustEdit",WS_TABSTOP,67,76,22,10
+    CONTROL         "",IDC_SP_LINEAR_DAMPING,"SpinnerControl",0x0,90,76,7,10
+    LTEXT           "Angular Damping",IDC_LBL_ANGULAR_DAMPING,9,88,56,10
+    CONTROL         "",IDC_ED_ANGULAR_DAMPING,"CustEdit",WS_TABSTOP,67,88,22,10
+    CONTROL         "",IDC_SP_ANGULAR_DAMPING,"SpinnerControl",0x0,90,88,7,10
+    LTEXT           "Max. Linear Velocity",IDC_LBL_MAX_LINEAR_VELOCITY,9,100,56,16
+    CONTROL         "",IDC_ED_MAX_LINEAR_VELOCITY,"CustEdit",WS_TABSTOP,67,104,22,10
+    CONTROL         "",IDC_SP_MAX_LINEAR_VELOCITY,"SpinnerControl",0x0,90,104,7,10
+    LTEXT           "Max. Angular Velocity",IDC_LBL_MAX_ANGULAR_VELOCITY,9,119,56,16
+    CONTROL         "",IDC_ED_MAX_ANGULAR_VELOCITY,"CustEdit",WS_TABSTOP,67,123,22,10
+    CONTROL         "",IDC_SP_MAX_ANGULAR_VELOCITY,"SpinnerControl",0x0,90,123,7,10
+    LTEXT           "Penetration Depth",IDC_LBL_PENETRATION_DEPTH,9,138,56,16
+    CONTROL         "",IDC_ED_PENETRATION_DEPTH,"CustEdit",WS_TABSTOP,67,142,22,10
+    CONTROL         "",IDC_SP_PENETRATION_DEPTH,"SpinnerControl",0x0,90,142,7,10
+END
+
+IDD_CAPSULEPARAM DIALOGEX 0, 0, 112, 74
 STYLE DS_SETFONT | WS_CHILD | WS_VISIBLE
 FONT 8, "MS Sans Serif", 0, 0, 0x0
 BEGIN
-    CONTROL         "",IDC_RADIUS,"CustEdit",WS_TABSTOP,49,8,36,10
-    CONTROL         "",IDC_SEGMENTS,"CustEdit",WS_TABSTOP,49,21,36,10
-    CONTROL         "Smooth",IDC_OBSMOOTH,"Button",BS_AUTOCHECKBOX,49,36,36,10
-    RTEXT           "Radius:",-1,22,9,25,8
-    RTEXT           "Segments:",-1,11,21,36,8
-    CONTROL         "",IDC_SEGSPINNER,"SpinnerControl",0x0,87,21,7,10
-    CONTROL         "",IDC_RADSPINNER,"SpinnerControl",0x0,87,8,7,10
+    CONTROL         "",IDC_RADIUS1,"CustEdit",WS_TABSTOP,49,31,36,10
+    RTEXT           "Radius 1:",IDC_STATIC,15,32,31,8
+    CONTROL         "",IDC_RADSPINNER1,"SpinnerControl",0x0,87,31,7,10
+    CONTROL         "",IDC_RADIUS2,"CustEdit",WS_TABSTOP,49,44,36,10
+    RTEXT           "Radius 2:",IDC_STATIC,15,44,31,8
+    CONTROL         "",IDC_RADSPINNER2,"SpinnerControl",0x0,87,44,7,10
+    CONTROL         "",IDC_LENGTHEDIT,"CustEdit",WS_TABSTOP,50,56,36,10
+    CONTROL         "",IDC_LENSPINNER,"SpinnerControl",0x0,87,56,7,10
+    RTEXT           "Length:",IDC_STATIC,24,56,25,8
+    COMBOBOX        IDC_CB_MATERIAL,12,13,83,157,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "Material",IDC_LBL_MATERIAL,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_GROUP,12,4,83,8
 END
 
-IDD_RigidBody DIALOGEX 0, 0, 107, 238
+IDD_RB_MOD_PANEL DIALOGEX 0, 0, 107, 76
 STYLE DS_SETFONT | DS_3DLOOK | WS_CHILD | WS_VISIBLE
 FONT 8, "MS Sans Serif", 0, 0, 0x0
 BEGIN
-    COMBOBOX        IDC_CB_MATERIAL,9,22,83,157,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    CONTROL         "Material",IDC_LBL_MATERIAL,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_GROUP,9,14,83,8
-    COMBOBOX        IDC_CB_LAYER,9,46,83,171,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    CONTROL         "Layer",IDC_LBL_LAYER,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_GROUP,9,37,83,8
-    GROUPBOX        "Rigid Body",IDC_GRP_HAVOK,4,3,98,230
-    CONTROL         "Mass",IDC_LBL_MASS,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,9,63,56,8
-    CONTROL         "Friction",IDC_LBL_FRICTION,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,9,76,56,8
-    LTEXT           "Restitution",IDC_LBL_RESTITUTION,9,87,56,11
-    CONTROL         "Motion System",IDC_LBL_MOTION_SYSTEM,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_GROUP,9,183,67,8
-    COMBOBOX        IDC_CB_MOTION_SYSTEM,9,192,83,74,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    CONTROL         "Quality Type",IDC_LBL_QUALITY_TYPE,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_GROUP,9,208,43,8
-    COMBOBOX        IDC_CB_QUALITY_TYPE,9,217,83,63,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP
-    CONTROL         "",IDC_ED_MASS,"CustEdit",WS_TABSTOP,67,63,22,10
-    CONTROL         "",IDC_SP_MASS,"SpinnerControl",0x0,90,63,7,10
-    CONTROL         "",IDC_ED_FRICTION,"CustEdit",WS_TABSTOP,67,75,22,10
-    CONTROL         "",IDC_SP_FRICTION,"SpinnerControl",0x0,90,75,7,10
-    CONTROL         "",IDC_ED_RESTITUTION,"CustEdit",WS_TABSTOP,67,87,22,10
-    CONTROL         "",IDC_SP_RESTITUTION,"SpinnerControl",0x0,90,87,7,10
-    LTEXT           "Linear Damping",IDC_LBL_LINEAR_DAMPING,9,100,56,11
-    CONTROL         "",IDC_ED_LINEAR_DAMPING,"CustEdit",WS_TABSTOP,67,100,22,10
-    CONTROL         "",IDC_SP_LINEAR_DAMPING,"SpinnerControl",0x0,90,100,7,10
-    LTEXT           "Angular Damping",IDC_LBL_ANGULAR_DAMPING,9,112,56,10
-    CONTROL         "",IDC_ED_ANGULAR_DAMPING,"CustEdit",WS_TABSTOP,67,112,22,10
-    CONTROL         "",IDC_SP_ANGULAR_DAMPING,"SpinnerControl",0x0,90,112,7,10
-    LTEXT           "Max. Linear Velocity",IDC_LBL_MAX_LINEAR_VELOCITY,9,124,56,16
-    CONTROL         "",IDC_ED_MAX_LINEAR_VELOCITY,"CustEdit",WS_TABSTOP,67,128,22,10
-    CONTROL         "",IDC_SP_MAX_LINEAR_VELOCITY,"SpinnerControl",0x0,90,128,7,10
-    LTEXT           "Max. Angular Velocity",IDC_LBL_MAX_ANGULAR_VELOCITY,9,143,56,16
-    CONTROL         "",IDC_ED_MAX_ANGULAR_VELOCITY,"CustEdit",WS_TABSTOP,67,147,22,10
-    CONTROL         "",IDC_SP_MAX_ANGULAR_VELOCITY,"SpinnerControl",0x0,90,147,7,10
-    LTEXT           "Penetration Depth",IDC_LBL_PENETRATION_DEPTH,9,162,56,16
-    CONTROL         "",IDC_ED_PENETRATION_DEPTH,"CustEdit",WS_TABSTOP,67,166,22,10
-    CONTROL         "",IDC_SP_PENETRATION_DEPTH,"SpinnerControl",0x0,90,166,7,10
+    CONTROL         "No Collision",IDC_RDO_NO_COLL,"Button",BS_AUTORADIOBUTTON | WS_GROUP,9,10,82,10
+    CONTROL         "Axis Aligned Box",IDC_RDO_AXIS_ALIGNED_BOX,"Button",BS_AUTORADIOBUTTON,9,22,82,10
+    CONTROL         "Sphere",IDC_RDO_SPHERE,"Button",BS_AUTORADIOBUTTON,9,34,80,10
+    GROUPBOX        "Bounding Volume",IDC_STATIC,5,0,97,73
+    CONTROL         "Capsule",IDC_RDO_CAPSULE,"Button",BS_AUTORADIOBUTTON,9,46,80,10
+    CONTROL         "Proxy Mesh",IDC_RDO_PROXY_MESH,"Button",BS_AUTORADIOBUTTON,9,58,80,10
 END
 
-IDD_CAPSULEPARAM DIALOGEX 0, 0, 112, 86
+IDD_BOXPARAM1 DIALOGEX 0, 0, 107, 71
 STYLE DS_SETFONT | WS_CHILD | WS_VISIBLE
 FONT 8, "MS Sans Serif", 0, 0, 0x0
 BEGIN
-    CONTROL         "",IDC_RADIUS1,"CustEdit",WS_TABSTOP,49,5,36,10
-    RTEXT           "Radius 1:",-1,15,6,31,8
-    CONTROL         "",IDC_RADSPINNER1,"SpinnerControl",0x0,87,5,7,10
-    CONTROL         "",IDC_RADIUS2,"CustEdit",WS_TABSTOP,49,18,36,10
-    RTEXT           "Radius 2:",-1,15,18,31,8
-    CONTROL         "",IDC_RADSPINNER2,"SpinnerControl",0x0,87,18,7,10
-    CONTROL         "Cap Pos 1:",IDC_LBL_POS1,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_GROUP,12,31,39,8
-    CONTROL         "",IDC_ED_POS1_X,"CustEdit",WS_TABSTOP,7,42,20,10
-    CONTROL         "",IDC_SP_POS1_X,"SpinnerControl",0x0,28,42,7,10
-    CONTROL         "",IDC_ED_POS1_Y,"CustEdit",WS_TABSTOP,40,42,20,10
-    CONTROL         "",IDC_SP_POS1_Y,"SpinnerControl",0x0,61,42,7,10
-    CONTROL         "",IDC_ED_POS1_Z,"CustEdit",WS_TABSTOP,73,42,20,10
-    CONTROL         "",IDC_SP_POS1_Z,"SpinnerControl",0x0,94,42,7,10
-    CONTROL         "Cap Pos 2:",IDC_LBL_POS2,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_GROUP,12,56,39,8
-    CONTROL         "",IDC_ED_POS2_X,"CustEdit",WS_TABSTOP,7,68,20,10
-    CONTROL         "",IDC_SP_POS2_X,"SpinnerControl",0x0,28,68,7,10
-    CONTROL         "",IDC_ED_POS2_Y,"CustEdit",WS_TABSTOP,40,68,20,10
-    CONTROL         "",IDC_SP_POS2_Y,"SpinnerControl",0x0,61,68,7,10
-    CONTROL         "",IDC_ED_POS2_Z,"CustEdit",WS_TABSTOP,73,68,20,10
-    CONTROL         "",IDC_SP_POS2_Z,"SpinnerControl",0x0,94,68,7,10
+    CONTROL         "",IDC_LENGTHEDIT,"CustEdit",WS_TABSTOP,50,29,36,10
+    CONTROL         "",IDC_WIDTHEDIT,"CustEdit",WS_TABSTOP,50,42,36,10
+    CONTROL         "",IDC_HEIGHTEDIT,"CustEdit",WS_TABSTOP,50,55,36,10
+    CONTROL         "",IDC_LENSPINNER,"SpinnerControl",0x0,87,29,7,10
+    CONTROL         "",IDC_WIDTHSPINNER,"SpinnerControl",0x0,87,42,7,10
+    CONTROL         "",IDC_HEIGHTSPINNER,"SpinnerControl",0x0,87,55,7,10
+    RTEXT           "Length:",IDC_STATIC,24,29,25,8
+    RTEXT           "Height:",IDC_STATIC,25,55,24,8
+    RTEXT           "Width:",IDC_STATIC,26,42,23,8
+    COMBOBOX        IDC_CB_MATERIAL,12,13,83,157,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "Material",IDC_LBL_MATERIAL,"Static",SS_LEFTNOWORDWRAP | SS_CENTERIMAGE | WS_GROUP,12,4,83,8
+END
+
+IDD_RB_MOD_PANEL1 DIALOGEX 0, 0, 107, 15
+STYLE DS_SETFONT | DS_3DLOOK | WS_CHILD | WS_VISIBLE
+FONT 8, "MS Sans Serif", 0, 0, 0x0
+BEGIN
+    LTEXT           "Box",IDC_STATIC,7,2,77,8
+END
+
+IDD_RB_MOD_PANEL2 DIALOGEX 0, 0, 107, 22
+STYLE DS_SETFONT | DS_3DLOOK | WS_CHILD | WS_VISIBLE
+FONT 8, "MS Sans Serif", 0, 0, 0x0
+BEGIN
+    LTEXT           "Sphere",IDC_STATIC,7,2,77,8
+END
+
+IDD_RB_MOD_PANEL3 DIALOGEX 0, 0, 107, 21
+STYLE DS_SETFONT | DS_3DLOOK | WS_CHILD | WS_VISIBLE
+FONT 8, "MS Sans Serif", 0, 0, 0x0
+BEGIN
+    LTEXT           "Capsule",IDC_STATIC,7,2,77,8
+END
+
+IDD_RB_MOD_PANEL4 DIALOGEX 0, 0, 107, 105
+STYLE DS_SETFONT | DS_3DLOOK | WS_CHILD | WS_VISIBLE
+FONT 8, "MS Sans Serif", 0, 0, 0x0
+BEGIN
+    LISTBOX         IDC_LIST1,6,12,94,71,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "Add",IDC_ADD,"CustButton",WS_TABSTOP,6,86,47,12
+    CONTROL         "Remove",IDC_REMOVE,"CustButton",WS_TABSTOP,55,86,46,12
+    LTEXT           "Collision Meshes:",IDC_STATIC,7,2,77,8
 END
 
 
@@ -235,9 +280,9 @@ BEGIN
     IDD_PANEL, DIALOG
     BEGIN
         LEFTMARGIN, 7
-        RIGHTMARGIN, 100
+        RIGHTMARGIN, 105
         TOPMARGIN, 7
-        BOTTOMMARGIN, 353
+        BOTTOMMARGIN, 326
     END
 
     IDD_ANIM_PANEL, DIALOG
@@ -248,18 +293,24 @@ BEGIN
         BOTTOMMARGIN, 34
     END
 
-    IDD_RigidBody, DIALOG
+    IDD_RIGIDBODY, DIALOG
     BEGIN
         LEFTMARGIN, 4
         RIGHTMARGIN, 102
         TOPMARGIN, 7
-        BOTTOMMARGIN, 233
+        BOTTOMMARGIN, 211
     END
 
     IDD_CAPSULEPARAM, DIALOG
     BEGIN
         RIGHTMARGIN, 108
-        BOTTOMMARGIN, 85
+        BOTTOMMARGIN, 73
+    END
+
+    IDD_BOXPARAM1, DIALOG
+    BEGIN
+        RIGHTMARGIN, 106
+        BOTTOMMARGIN, 46
     END
 END
 #endif    // APSTUDIO_INVOKED
@@ -454,73 +505,8 @@ BEGIN
     0
 END
 
-IDD_RigidBody DLGINIT
+IDD_RIGIDBODY DLGINIT
 BEGIN
-    IDC_CB_MATERIAL, 0x403, 6, 0
-0x7453, 0x6e6f, 0x0065, 
-    IDC_CB_MATERIAL, 0x403, 6, 0
-0x6c43, 0x746f, 0x0068, 
-    IDC_CB_MATERIAL, 0x403, 5, 0
-0x6944, 0x7472, "\000" 
-    IDC_CB_MATERIAL, 0x403, 6, 0
-0x6c47, 0x7361, 0x0073, 
-    IDC_CB_MATERIAL, 0x403, 6, 0
-0x7247, 0x7361, 0x0073, 
-    IDC_CB_MATERIAL, 0x403, 6, 0
-0x654d, 0x6174, 0x006c, 
-    IDC_CB_MATERIAL, 0x403, 8, 0
-0x724f, 0x6167, 0x696e, 0x0063, 
-    IDC_CB_MATERIAL, 0x403, 5, 0
-0x6b53, 0x6e69, "\000" 
-    IDC_CB_MATERIAL, 0x403, 6, 0
-0x6157, 0x6574, 0x0072, 
-    IDC_CB_MATERIAL, 0x403, 5, 0
-0x6f57, 0x646f, "\000" 
-    IDC_CB_MATERIAL, 0x403, 12, 0
-0x6548, 0x7661, 0x2079, 0x7453, 0x6e6f, 0x0065, 
-    IDC_CB_MATERIAL, 0x403, 12, 0
-0x6548, 0x7661, 0x2079, 0x654d, 0x6174, 0x006c, 
-    IDC_CB_MATERIAL, 0x403, 11, 0
-0x6548, 0x7661, 0x2079, 0x6f57, 0x646f, "\000" 
-    IDC_CB_MATERIAL, 0x403, 6, 0
-0x6843, 0x6961, 0x006e, 
-    IDC_CB_MATERIAL, 0x403, 5, 0
-0x6e53, 0x776f, "\000" 
-    IDC_CB_MATERIAL, 0x403, 13, 0
-0x7453, 0x6e6f, 0x2065, 0x7453, 0x6961, 0x7372, "\000" 
-    IDC_CB_MATERIAL, 0x403, 13, 0
-0x6c43, 0x746f, 0x2068, 0x7453, 0x6961, 0x7372, "\000" 
-    IDC_CB_MATERIAL, 0x403, 12, 0
-0x6944, 0x7472, 0x5320, 0x6174, 0x7269, 0x0073, 
-    IDC_CB_MATERIAL, 0x403, 13, 0
-0x6c47, 0x7361, 0x2073, 0x7453, 0x6961, 0x7372, "\000" 
-    IDC_CB_MATERIAL, 0x403, 13, 0
-0x7247, 0x7361, 0x2073, 0x7453, 0x6961, 0x7372, "\000" 
-    IDC_CB_MATERIAL, 0x403, 13, 0
-0x654d, 0x6174, 0x206c, 0x7453, 0x6961, 0x7372, "\000" 
-    IDC_CB_MATERIAL, 0x403, 15, 0
-0x724f, 0x6167, 0x696e, 0x2063, 0x7453, 0x6961, 0x7372, "\000" 
-    IDC_CB_MATERIAL, 0x403, 12, 0
-0x6b53, 0x6e69, 0x5320, 0x6174, 0x7269, 0x0073, 
-    IDC_CB_MATERIAL, 0x403, 13, 0
-0x6157, 0x6574, 0x2072, 0x7453, 0x6961, 0x7372, "\000" 
-    IDC_CB_MATERIAL, 0x403, 12, 0
-0x6f57, 0x646f, 0x5320, 0x6174, 0x7269, 0x0073, 
-    IDC_CB_MATERIAL, 0x403, 19, 0
-0x6548, 0x7661, 0x2079, 0x7453, 0x6e6f, 0x2065, 0x7453, 0x6961, 0x7372, 
-"\000" 
-    IDC_CB_MATERIAL, 0x403, 19, 0
-0x6548, 0x7661, 0x2079, 0x654d, 0x6174, 0x206c, 0x7453, 0x6961, 0x7372, 
-"\000" 
-    IDC_CB_MATERIAL, 0x403, 18, 0
-0x6548, 0x7661, 0x2079, 0x6f57, 0x646f, 0x5320, 0x6174, 0x7269, 0x0073, 
-
-    IDC_CB_MATERIAL, 0x403, 13, 0
-0x6843, 0x6961, 0x206e, 0x7453, 0x6961, 0x7372, "\000" 
-    IDC_CB_MATERIAL, 0x403, 12, 0
-0x6e53, 0x776f, 0x5320, 0x6174, 0x7269, 0x0073, 
-    IDC_CB_MATERIAL, 0x403, 9, 0
-0x6c45, 0x7665, 0x7461, 0x726f, "\000" 
     IDC_CB_LAYER, 0x403, 13, 0
 0x6e55, 0x6469, 0x6e65, 0x6974, 0x6966, 0x6465, "\000" 
     IDC_CB_LAYER, 0x403, 7, 0
@@ -638,6 +624,216 @@ BEGIN
     0
 END
 
+IDD_SPHEREPARAM2 DLGINIT
+BEGIN
+    IDC_CB_MATERIAL, 0x403, 6, 0
+0x7453, 0x6e6f, 0x0065, 
+    IDC_CB_MATERIAL, 0x403, 6, 0
+0x6c43, 0x746f, 0x0068, 
+    IDC_CB_MATERIAL, 0x403, 5, 0
+0x6944, 0x7472, "\000" 
+    IDC_CB_MATERIAL, 0x403, 6, 0
+0x6c47, 0x7361, 0x0073, 
+    IDC_CB_MATERIAL, 0x403, 6, 0
+0x7247, 0x7361, 0x0073, 
+    IDC_CB_MATERIAL, 0x403, 6, 0
+0x654d, 0x6174, 0x006c, 
+    IDC_CB_MATERIAL, 0x403, 8, 0
+0x724f, 0x6167, 0x696e, 0x0063, 
+    IDC_CB_MATERIAL, 0x403, 5, 0
+0x6b53, 0x6e69, "\000" 
+    IDC_CB_MATERIAL, 0x403, 6, 0
+0x6157, 0x6574, 0x0072, 
+    IDC_CB_MATERIAL, 0x403, 5, 0
+0x6f57, 0x646f, "\000" 
+    IDC_CB_MATERIAL, 0x403, 12, 0
+0x6548, 0x7661, 0x2079, 0x7453, 0x6e6f, 0x0065, 
+    IDC_CB_MATERIAL, 0x403, 12, 0
+0x6548, 0x7661, 0x2079, 0x654d, 0x6174, 0x006c, 
+    IDC_CB_MATERIAL, 0x403, 11, 0
+0x6548, 0x7661, 0x2079, 0x6f57, 0x646f, "\000" 
+    IDC_CB_MATERIAL, 0x403, 6, 0
+0x6843, 0x6961, 0x006e, 
+    IDC_CB_MATERIAL, 0x403, 5, 0
+0x6e53, 0x776f, "\000" 
+    IDC_CB_MATERIAL, 0x403, 13, 0
+0x7453, 0x6e6f, 0x2065, 0x7453, 0x6961, 0x7372, "\000" 
+    IDC_CB_MATERIAL, 0x403, 13, 0
+0x6c43, 0x746f, 0x2068, 0x7453, 0x6961, 0x7372, "\000" 
+    IDC_CB_MATERIAL, 0x403, 12, 0
+0x6944, 0x7472, 0x5320, 0x6174, 0x7269, 0x0073, 
+    IDC_CB_MATERIAL, 0x403, 13, 0
+0x6c47, 0x7361, 0x2073, 0x7453, 0x6961, 0x7372, "\000" 
+    IDC_CB_MATERIAL, 0x403, 13, 0
+0x7247, 0x7361, 0x2073, 0x7453, 0x6961, 0x7372, "\000" 
+    IDC_CB_MATERIAL, 0x403, 13, 0
+0x654d, 0x6174, 0x206c, 0x7453, 0x6961, 0x7372, "\000" 
+    IDC_CB_MATERIAL, 0x403, 15, 0
+0x724f, 0x6167, 0x696e, 0x2063, 0x7453, 0x6961, 0x7372, "\000" 
+    IDC_CB_MATERIAL, 0x403, 12, 0
+0x6b53, 0x6e69, 0x5320, 0x6174, 0x7269, 0x0073, 
+    IDC_CB_MATERIAL, 0x403, 13, 0
+0x6157, 0x6574, 0x2072, 0x7453, 0x6961, 0x7372, "\000" 
+    IDC_CB_MATERIAL, 0x403, 12, 0
+0x6f57, 0x646f, 0x5320, 0x6174, 0x7269, 0x0073, 
+    IDC_CB_MATERIAL, 0x403, 19, 0
+0x6548, 0x7661, 0x2079, 0x7453, 0x6e6f, 0x2065, 0x7453, 0x6961, 0x7372, 
+"\000" 
+    IDC_CB_MATERIAL, 0x403, 19, 0
+0x6548, 0x7661, 0x2079, 0x654d, 0x6174, 0x206c, 0x7453, 0x6961, 0x7372, 
+"\000" 
+    IDC_CB_MATERIAL, 0x403, 18, 0
+0x6548, 0x7661, 0x2079, 0x6f57, 0x646f, 0x5320, 0x6174, 0x7269, 0x0073, 
+
+    IDC_CB_MATERIAL, 0x403, 13, 0
+0x6843, 0x6961, 0x206e, 0x7453, 0x6961, 0x7372, "\000" 
+    IDC_CB_MATERIAL, 0x403, 12, 0
+0x6e53, 0x776f, 0x5320, 0x6174, 0x7269, 0x0073, 
+    IDC_CB_MATERIAL, 0x403, 9, 0
+0x6c45, 0x7665, 0x7461, 0x726f, "\000" 
+    0
+END
+
+IDD_CAPSULEPARAM DLGINIT
+BEGIN
+    IDC_CB_MATERIAL, 0x403, 6, 0
+0x7453, 0x6e6f, 0x0065, 
+    IDC_CB_MATERIAL, 0x403, 6, 0
+0x6c43, 0x746f, 0x0068, 
+    IDC_CB_MATERIAL, 0x403, 5, 0
+0x6944, 0x7472, "\000" 
+    IDC_CB_MATERIAL, 0x403, 6, 0
+0x6c47, 0x7361, 0x0073, 
+    IDC_CB_MATERIAL, 0x403, 6, 0
+0x7247, 0x7361, 0x0073, 
+    IDC_CB_MATERIAL, 0x403, 6, 0
+0x654d, 0x6174, 0x006c, 
+    IDC_CB_MATERIAL, 0x403, 8, 0
+0x724f, 0x6167, 0x696e, 0x0063, 
+    IDC_CB_MATERIAL, 0x403, 5, 0
+0x6b53, 0x6e69, "\000" 
+    IDC_CB_MATERIAL, 0x403, 6, 0
+0x6157, 0x6574, 0x0072, 
+    IDC_CB_MATERIAL, 0x403, 5, 0
+0x6f57, 0x646f, "\000" 
+    IDC_CB_MATERIAL, 0x403, 12, 0
+0x6548, 0x7661, 0x2079, 0x7453, 0x6e6f, 0x0065, 
+    IDC_CB_MATERIAL, 0x403, 12, 0
+0x6548, 0x7661, 0x2079, 0x654d, 0x6174, 0x006c, 
+    IDC_CB_MATERIAL, 0x403, 11, 0
+0x6548, 0x7661, 0x2079, 0x6f57, 0x646f, "\000" 
+    IDC_CB_MATERIAL, 0x403, 6, 0
+0x6843, 0x6961, 0x006e, 
+    IDC_CB_MATERIAL, 0x403, 5, 0
+0x6e53, 0x776f, "\000" 
+    IDC_CB_MATERIAL, 0x403, 13, 0
+0x7453, 0x6e6f, 0x2065, 0x7453, 0x6961, 0x7372, "\000" 
+    IDC_CB_MATERIAL, 0x403, 13, 0
+0x6c43, 0x746f, 0x2068, 0x7453, 0x6961, 0x7372, "\000" 
+    IDC_CB_MATERIAL, 0x403, 12, 0
+0x6944, 0x7472, 0x5320, 0x6174, 0x7269, 0x0073, 
+    IDC_CB_MATERIAL, 0x403, 13, 0
+0x6c47, 0x7361, 0x2073, 0x7453, 0x6961, 0x7372, "\000" 
+    IDC_CB_MATERIAL, 0x403, 13, 0
+0x7247, 0x7361, 0x2073, 0x7453, 0x6961, 0x7372, "\000" 
+    IDC_CB_MATERIAL, 0x403, 13, 0
+0x654d, 0x6174, 0x206c, 0x7453, 0x6961, 0x7372, "\000" 
+    IDC_CB_MATERIAL, 0x403, 15, 0
+0x724f, 0x6167, 0x696e, 0x2063, 0x7453, 0x6961, 0x7372, "\000" 
+    IDC_CB_MATERIAL, 0x403, 12, 0
+0x6b53, 0x6e69, 0x5320, 0x6174, 0x7269, 0x0073, 
+    IDC_CB_MATERIAL, 0x403, 13, 0
+0x6157, 0x6574, 0x2072, 0x7453, 0x6961, 0x7372, "\000" 
+    IDC_CB_MATERIAL, 0x403, 12, 0
+0x6f57, 0x646f, 0x5320, 0x6174, 0x7269, 0x0073, 
+    IDC_CB_MATERIAL, 0x403, 19, 0
+0x6548, 0x7661, 0x2079, 0x7453, 0x6e6f, 0x2065, 0x7453, 0x6961, 0x7372, 
+"\000" 
+    IDC_CB_MATERIAL, 0x403, 19, 0
+0x6548, 0x7661, 0x2079, 0x654d, 0x6174, 0x206c, 0x7453, 0x6961, 0x7372, 
+"\000" 
+    IDC_CB_MATERIAL, 0x403, 18, 0
+0x6548, 0x7661, 0x2079, 0x6f57, 0x646f, 0x5320, 0x6174, 0x7269, 0x0073, 
+
+    IDC_CB_MATERIAL, 0x403, 13, 0
+0x6843, 0x6961, 0x206e, 0x7453, 0x6961, 0x7372, "\000" 
+    IDC_CB_MATERIAL, 0x403, 12, 0
+0x6e53, 0x776f, 0x5320, 0x6174, 0x7269, 0x0073, 
+    IDC_CB_MATERIAL, 0x403, 9, 0
+0x6c45, 0x7665, 0x7461, 0x726f, "\000" 
+    0
+END
+
+IDD_BOXPARAM1 DLGINIT
+BEGIN
+    IDC_CB_MATERIAL, 0x403, 6, 0
+0x7453, 0x6e6f, 0x0065, 
+    IDC_CB_MATERIAL, 0x403, 6, 0
+0x6c43, 0x746f, 0x0068, 
+    IDC_CB_MATERIAL, 0x403, 5, 0
+0x6944, 0x7472, "\000" 
+    IDC_CB_MATERIAL, 0x403, 6, 0
+0x6c47, 0x7361, 0x0073, 
+    IDC_CB_MATERIAL, 0x403, 6, 0
+0x7247, 0x7361, 0x0073, 
+    IDC_CB_MATERIAL, 0x403, 6, 0
+0x654d, 0x6174, 0x006c, 
+    IDC_CB_MATERIAL, 0x403, 8, 0
+0x724f, 0x6167, 0x696e, 0x0063, 
+    IDC_CB_MATERIAL, 0x403, 5, 0
+0x6b53, 0x6e69, "\000" 
+    IDC_CB_MATERIAL, 0x403, 6, 0
+0x6157, 0x6574, 0x0072, 
+    IDC_CB_MATERIAL, 0x403, 5, 0
+0x6f57, 0x646f, "\000" 
+    IDC_CB_MATERIAL, 0x403, 12, 0
+0x6548, 0x7661, 0x2079, 0x7453, 0x6e6f, 0x0065, 
+    IDC_CB_MATERIAL, 0x403, 12, 0
+0x6548, 0x7661, 0x2079, 0x654d, 0x6174, 0x006c, 
+    IDC_CB_MATERIAL, 0x403, 11, 0
+0x6548, 0x7661, 0x2079, 0x6f57, 0x646f, "\000" 
+    IDC_CB_MATERIAL, 0x403, 6, 0
+0x6843, 0x6961, 0x006e, 
+    IDC_CB_MATERIAL, 0x403, 5, 0
+0x6e53, 0x776f, "\000" 
+    IDC_CB_MATERIAL, 0x403, 13, 0
+0x7453, 0x6e6f, 0x2065, 0x7453, 0x6961, 0x7372, "\000" 
+    IDC_CB_MATERIAL, 0x403, 13, 0
+0x6c43, 0x746f, 0x2068, 0x7453, 0x6961, 0x7372, "\000" 
+    IDC_CB_MATERIAL, 0x403, 12, 0
+0x6944, 0x7472, 0x5320, 0x6174, 0x7269, 0x0073, 
+    IDC_CB_MATERIAL, 0x403, 13, 0
+0x6c47, 0x7361, 0x2073, 0x7453, 0x6961, 0x7372, "\000" 
+    IDC_CB_MATERIAL, 0x403, 13, 0
+0x7247, 0x7361, 0x2073, 0x7453, 0x6961, 0x7372, "\000" 
+    IDC_CB_MATERIAL, 0x403, 13, 0
+0x654d, 0x6174, 0x206c, 0x7453, 0x6961, 0x7372, "\000" 
+    IDC_CB_MATERIAL, 0x403, 15, 0
+0x724f, 0x6167, 0x696e, 0x2063, 0x7453, 0x6961, 0x7372, "\000" 
+    IDC_CB_MATERIAL, 0x403, 12, 0
+0x6b53, 0x6e69, 0x5320, 0x6174, 0x7269, 0x0073, 
+    IDC_CB_MATERIAL, 0x403, 13, 0
+0x6157, 0x6574, 0x2072, 0x7453, 0x6961, 0x7372, "\000" 
+    IDC_CB_MATERIAL, 0x403, 12, 0
+0x6f57, 0x646f, 0x5320, 0x6174, 0x7269, 0x0073, 
+    IDC_CB_MATERIAL, 0x403, 19, 0
+0x6548, 0x7661, 0x2079, 0x7453, 0x6e6f, 0x2065, 0x7453, 0x6961, 0x7372, 
+"\000" 
+    IDC_CB_MATERIAL, 0x403, 19, 0
+0x6548, 0x7661, 0x2079, 0x654d, 0x6174, 0x206c, 0x7453, 0x6961, 0x7372, 
+"\000" 
+    IDC_CB_MATERIAL, 0x403, 18, 0
+0x6548, 0x7661, 0x2079, 0x6f57, 0x646f, 0x5320, 0x6174, 0x7269, 0x0073, 
+
+    IDC_CB_MATERIAL, 0x403, 13, 0
+0x6843, 0x6961, 0x206e, 0x7453, 0x6961, 0x7372, "\000" 
+    IDC_CB_MATERIAL, 0x403, 12, 0
+0x6e53, 0x776f, 0x5320, 0x6174, 0x7269, 0x0073, 
+    IDC_CB_MATERIAL, 0x403, 9, 0
+0x6c45, 0x7665, 0x7461, 0x726f, "\000" 
+    0
+END
+
 
 /////////////////////////////////////////////////////////////////////////////
 //
@@ -652,57 +848,63 @@ BEGIN
     IDS_PARAMS              "Parameters"
     IDS_SPIN                "Spin"
     IDS_ANIM_PARAMS         "Animation"
-    IDS_RB_Capsule          "bhkCapsule"
+    IDS_RB_CAPSULE          "bhkCapsule"
 END
 
 STRINGTABLE 
 BEGIN
+    IDS_RB_CAPSULE_CLASS    "bhkCapsule"
+    IDS_RB_RIGIDBODY_PARAM  "Rigid Body Parameters"
+    IDS_RB_CAP_POS1         "Cap Position 1"
+    IDS_RB_CAP_POS2         "Cap Position 2"
+    IDS_DS_MASS             "Mass"
+    IDS_DS_FRICTION         "Friction"
+    IDS_DS_RESTITUTION      "Restitution"
+    IDS_DS_LINEAR_DAMPING   "Linear Damping"
+    IDS_DS_ANGULAR_DAMPING  "Angular Damping"
+    IDS_DS_MAX_LINEAR_VELOCITY "Max Linear Velocity"
+    IDS_DS_MAX_ANGULAR_VELOCITY "Max Angular Velocity"
+    IDS_DS_PENETRATION_DEPTH "Penetration Depth"
+    IDS_DS_MOTION_SYSTEM    "Motion System"
+    IDS_DS_QUALITY_TYPE     "Quality Type"
+    IDS_RB_PARAMETERS       "Parameters"
     IDS_RB_RADIUS           "Radius"
-    IDS_RB_SEGS             "Segments"
 END
 
 STRINGTABLE 
 BEGIN
+    IDS_RB_SEGS             "Segments"
+    IDS_RB_SMOOTH           "Smooth"
+    IDS_RB_PRIMITIVES       "Standard Primitives"
+    IDS_RB_SPHERE           "bhkSphere"
     IDS_RB_RADIUS1          "Radius 1"
     IDS_RB_RADIUS2          "Radius 2"
-END
-
-STRINGTABLE 
-BEGIN
-    IDS_RB_SPHERE           "bhkSphere"
-END
-
-STRINGTABLE 
-BEGIN
     IDS_RB_SPHERE_CLASS     "bhkSphere"
-END
-
-STRINGTABLE 
-BEGIN
-    IDS_RB_PRIMITIVES       "Standard Primitives"
-END
-
-STRINGTABLE 
-BEGIN
     IDS_DS_PARAMCHG         "Parameter Change"
+    IDS_DS_LAYER            "Layer"
+    IDS_DS_MATERIAL         "Material"
+    IDS_DS_NODE             "Node"
+    IDS_DS_PRIORITY         "Priority"
+    IDS_DS_COLLISION        "Collision"
+    IDS_PICKNODE            "picknode"
+    IDS_PICKNODE_PROMPT     "Pick the Collision Mesh that is associated with this mesh."
+    IDS_RB_BOX              "bhkBox"
 END
 
 STRINGTABLE 
 BEGIN
-    IDS_RB_PARAMETERS       "Parameters"
-END
-
-STRINGTABLE 
-BEGIN
-    IDS_RB_SMOOTH           "Smooth"
-END
-
-STRINGTABLE 
-BEGIN
-    IDS_RB_CAPSULE_CLASS    "bhkCapsule"
-    IDS_RB_RIGIDBODY_PARAM  "Rigid Body Parameters"
-    IDS_RB_CAP_POS1         "Cap Position 1"
-    IDS_RB_CAP_POS2         "Cap Position 2"
+    IDS_RB_BOX_CLASS        "bhkBox"
+    IDS_RB_CLASS_NAME       "bhkRigidBody"
+    IDS_DS_LENGTH           "Length"
+    IDS_DS_WIDTH            "Width"
+    IDS_DS_HEIGHT           "Height"
+    IDS_ADD_MESH            "Add Collision Mesh"
+    IDS_MESHLIST            "MeshList"
+    IDS_BV_BOUNDING_TYPE    "Bounding Volume Type"
+    IDS_RB_MOD_PANEL1       "Axis Aligned Box"
+    IDS_RB_MOD_PANEL2       "Sphere"
+    IDS_RB_MOD_PANEL3       "Capsule"
+    IDS_RB_MOD_PANEL4       "Proxy Mesh"
 END
 
 #endif    // English (U.S.) resources
diff --git a/NifProps/bhkBoxObj.cpp b/NifProps/bhkBoxObj.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9079331290f518ed1cff0ff4ab4e70eb88a9bb38
--- /dev/null
+++ b/NifProps/bhkBoxObj.cpp
@@ -0,0 +1,811 @@
+/**********************************************************************
+*<
+FILE: bhkBoxObj.cpp
+
+DESCRIPTION:	Collision Box Object Implementation
+
+CREATED BY: tazpn (Theo)
+
+HISTORY: 
+  V1.0 - Derived from 3ds max prim box example
+
+*>	Copyright (c) 2006, All Rights Reserved.
+**********************************************************************/
+#pragma warning( disable:4800 )
+#include <max.h>
+#include "MAX_Mem.h"
+#include <map>
+#include "NifProps.h"
+#include "iparamm.h"
+#include "Simpobj.h"
+#include "surf_api.h"
+#include "notify.h"
+#include "macroRec.h"
+#include "bhkRigidBodyInterface.h"
+#include "NifGui.h"
+#include "NifStrings.h"
+
+#ifndef _countof
+#define _countof(x) (sizeof(x)/sizeof((x)[0]))
+#endif
+
+const Class_ID bhkBoxObject_CLASS_ID = Class_ID(0x86e19816, BHKRIGIDBODYCLASS_DESC.PartB());
+
+static ParamBlockDesc2* GetbhkBoxParamBlockDesc();
+
+class bhkBoxObject : public SimpleObject2
+{
+public:			
+   // Class vars
+   static IParamMap2 *pmapParam;
+   static IObjParam *ip;
+
+   bhkBoxObject(BOOL loading);		
+   ~bhkBoxObject();		
+
+   // From Object
+   int CanConvertToType(Class_ID obtype);
+   Object* ConvertToType(TimeValue t, Class_ID obtype);
+   void GetCollapseTypes(Tab<Class_ID> &clist,Tab<TSTR*> &nlist);
+
+   CreateMouseCallBack* GetCreateMouseCallBack();
+   void BeginEditParams( IObjParam  *ip, ULONG flags,Animatable *prev);
+   void EndEditParams( IObjParam *ip, ULONG flags,Animatable *next);
+   RefTargetHandle Clone(RemapDir& remap);
+   TCHAR *GetObjectName() { return GetString(IDS_RB_BOX); }
+
+   int	NumParamBlocks() { return 1; }					// return number of ParamBlocks in this instance
+   IParamBlock2* GetParamBlock(int i) { return pblock2; } // return i'th ParamBlock
+   IParamBlock2* GetParamBlockByID(BlockID id) { return (pblock2->ID() == id) ? pblock2 : NULL; } // return id'd ParamBlock
+
+   // Animatable methods		
+   void DeleteThis() {delete this;}
+   Class_ID ClassID() { return bhkBoxObject_CLASS_ID; } 
+   SClass_ID SuperClassID() { return HELPER_CLASS_ID; }
+
+   // From SimpleObject
+   void BuildMesh(TimeValue t);
+   BOOL OKtoDisplay(TimeValue t);
+   void InvalidateUI();
+
+   int Display(TimeValue t, INode* inode, ViewExp *vpt, int flags);
+
+   void UpdateUI();
+};
+
+//--- ClassDescriptor and class vars ---------------------------------
+
+// The class descriptor for box
+class bhkBoxClassDesc : public ClassDesc2 
+{
+public:
+   bhkBoxClassDesc();
+   int 			   IsPublic() { return 1; }
+   void *			Create(BOOL loading = FALSE) {
+      return new bhkBoxObject(loading);
+   }
+   const TCHAR *	ClassName() { return GetString(IDS_RB_BOX_CLASS); }
+   SClass_ID		SuperClassID() { return HELPER_CLASS_ID; }
+   Class_ID		   ClassID() { return bhkBoxObject_CLASS_ID; }
+   const TCHAR* 	Category() { return "NifTools"; }
+
+   const TCHAR*	InternalName() { return _T("bhkBox"); }	// returns fixed parsable name (scripter-visible name)
+   HINSTANCE		HInstance() { return hInstance; }			// returns owning module handle
+};
+
+extern ClassDesc2* GetbhkBoxDesc();
+
+// in prim.cpp  - The dll instance handle
+extern HINSTANCE hInstance;
+
+IParamMap2 *bhkBoxObject::pmapParam  = NULL;
+IObjParam *bhkBoxObject::ip         = NULL;
+
+//--- Parameter map/block descriptors -------------------------------
+
+// Parameter and ParamBlock IDs
+enum { box_params, };  // pblock ID
+enum 
+{ 
+   PB_MATERIAL,
+   PB_LENGTH,
+   PB_WIDTH,
+   PB_HEIGHT,
+};
+
+enum { box_params_panel, };
+
+static ParamBlockDesc2 param_blk ( 
+    box_params, _T("parameters"),  0, NULL, P_AUTO_CONSTRUCT + P_AUTO_UI + P_MULTIMAP, 0,
+    //rollout
+    1,
+    box_params, IDD_BOXPARAM1, IDS_PARAMS, 0, 0, NULL, 
+
+    // params
+    PB_MATERIAL, _T("material"), TYPE_INT, P_ANIMATABLE,	IDS_DS_MATERIAL,
+      p_default,	NP_DEFAULT_HVK_MATERIAL,
+      end,
+
+    PB_LENGTH, _T("length"), TYPE_FLOAT, P_ANIMATABLE,	IDS_DS_LENGTH,
+      p_default,	   0.0,
+      p_range,		0.0, float(1.0E30),
+      p_ui, box_params, TYPE_SPINNER, EDITTYPE_UNIVERSE, IDC_LENGTHEDIT, IDC_LENSPINNER, SPIN_AUTOSCALE,
+      end,
+
+    PB_WIDTH, _T("width"), TYPE_FLOAT, P_ANIMATABLE,	IDS_DS_WIDTH,
+      p_default,	   0.0,
+      p_range,		0.0, float(1.0E30),
+      p_ui, box_params, TYPE_SPINNER, EDITTYPE_UNIVERSE, IDC_WIDTHEDIT, IDC_WIDTHSPINNER, SPIN_AUTOSCALE,
+      end,
+
+    PB_HEIGHT, _T("height"), TYPE_FLOAT, P_ANIMATABLE,	IDS_DS_HEIGHT,
+      p_default,	   0.0,
+      p_range,		float(-1.0E30), float(1.0E30),
+      p_ui, box_params, TYPE_SPINNER, EDITTYPE_UNIVERSE, IDC_HEIGHTEDIT, IDC_HEIGHTSPINNER, SPIN_AUTOSCALE,
+      end,
+    end
+    );
+
+// bug in pb desc? forces us to use this rather than in inline version
+static bhkBoxClassDesc boxDesc;
+extern ClassDesc2* GetbhkBoxDesc() { return &boxDesc; }
+bhkBoxClassDesc::bhkBoxClassDesc() {
+   param_blk.SetClassDesc(this);
+}
+
+class BoxParamDlgProc : public ParamMap2UserDlgProc {
+public:
+   bhkBoxObject *so;
+   HWND thishWnd;
+   NpComboBox		mCbMaterial;
+
+   BoxParamDlgProc(bhkBoxObject *s) {so=s;thishWnd=NULL;}
+   BOOL DlgProc(TimeValue t,IParamMap2 *map,HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam);
+   void Update(TimeValue t);
+   void DeleteThis() {delete this;}
+
+   //--- ParamDlgProc --------------------------------
+   void TurnSpinner(HWND hWnd,int SpinNum,BOOL ison)
+   {	
+      ISpinnerControl *spin2 = GetISpinner(GetDlgItem(hWnd,SpinNum));
+      if (ison) spin2->Enable();else spin2->Disable();
+      ReleaseISpinner(spin2);
+   };
+
+};
+
+void BoxParamDlgProc::Update(TimeValue t)
+{
+   if (!thishWnd) 
+      return;
+   return;
+}
+
+BOOL BoxParamDlgProc::DlgProc(TimeValue t,IParamMap2 *map,HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
+{
+   thishWnd=hWnd;
+   switch (msg) 
+   {
+   case WM_INITDIALOG: 
+      {
+         mCbMaterial.init(GetDlgItem(hWnd, IDC_CB_MATERIAL));
+         for (const char **str = NpHvkMaterialNames; *str; ++str)
+            mCbMaterial.add(*str);
+
+         int sel = NP_DEFAULT_HVK_MATERIAL;
+         Interval valid;
+         so->pblock2->GetValue( PB_MATERIAL, 0, sel, valid);
+         mCbMaterial.select( sel );
+
+         Update(t);
+         break;
+      }
+   case WM_COMMAND:
+      switch (LOWORD(wParam)) 
+      {
+      case IDC_CB_MATERIAL:
+         if (HIWORD(wParam)==CBN_SELCHANGE) {
+            so->pblock2->SetValue( PB_MATERIAL, 0, mCbMaterial.selection() );
+         }
+         break;
+      }
+      break;	
+   }
+   return FALSE;
+}
+//--- Box methods -------------------------------
+
+
+bhkBoxObject::bhkBoxObject(BOOL loading)
+{
+   SetAFlag(A_PLUGIN1);
+   boxDesc.MakeAutoParamBlocks(this);
+   assert(pblock2);
+}
+
+bhkBoxObject::~bhkBoxObject() 
+{
+   param_blk.SetUserDlgProc();
+   if (pmapParam) {
+      pmapParam  = NULL;
+   }
+}
+
+void bhkBoxObject::BeginEditParams(IObjParam *ip,ULONG flags,Animatable *prev)
+{
+   SimpleObject::BeginEditParams(ip,flags,prev);
+
+   //if (pmapParam == NULL) {
+   //   pmapParam = CreateCPParamMap2(
+   //      0,
+   //      pblock2,
+   //      GetCOREInterface(),
+   //      hInstance,
+   //      MAKEINTRESOURCE(IDD_BOXPARAM1),
+   //      GetString(IDS_PARAMS),
+   //      0);
+   //}
+   boxDesc.BeginEditParams(ip,this,flags,prev);
+   param_blk.SetUserDlgProc(new BoxParamDlgProc(this));
+   pmapParam = pblock2->GetMap(box_params);
+
+	pmapParam->GetIRollup()->Hide(1);
+
+
+   this->ip = ip;
+
+   //if(pmapParam) {
+   //   // A callback for the type in.
+   //   pmapParam->SetUserDlgProc(new BoxParamDlgProc(this));
+   //}
+
+}
+
+void bhkBoxObject::EndEditParams( IObjParam *ip, ULONG flags,Animatable *next )
+{		
+   param_blk.SetUserDlgProc();
+
+   SimpleObject::EndEditParams(ip,flags,next);
+   this->ip = NULL;
+   pmapParam = NULL;
+   //if (pmapParam && flags&END_EDIT_REMOVEUI ) {
+   //   DestroyCPParamMap2 (pmapParam);
+   //   pmapParam = NULL;
+   //}
+
+   // tear down the appropriate auto-rollouts
+   boxDesc.EndEditParams(ip, this, flags, next);
+}
+
+void bhkBoxObject::UpdateUI()
+{
+   if (ip == NULL)
+      return;
+   BoxParamDlgProc* dlg = static_cast<BoxParamDlgProc*>(pmapParam->GetUserDlgProc());
+   dlg->Update(ip->GetTime());
+}
+
+enum 
+{
+   POSX = 0,	// right
+   POSY = 1,	// back
+   POSZ = 2,	// top
+   NEGX = 3,	// left
+   NEGY = 4,	// front
+   NEGZ = 5,	// bottom
+};
+
+int direction(Point3 *v) {
+   Point3 a = v[0]-v[2];
+   Point3 b = v[1]-v[0];
+   Point3 n = CrossProd(a,b);
+   switch(MaxComponent(n)) {
+      case 0: return (n.x<0)?NEGX:POSX;
+      case 1: return (n.y<0)?NEGY:POSY;
+      case 2: return (n.z<0)?NEGZ:POSZ;
+   }
+   return 0;
+}
+
+void bhkBoxObject::BuildMesh(TimeValue t)
+{
+	extern void BuildBox(Mesh&mesh, float l, float w, float h);
+
+	float l, w, h;
+	ivalid = FOREVER;	
+	pblock2->GetValue(PB_LENGTH,t,l,ivalid);
+	pblock2->GetValue(PB_WIDTH,t,w,ivalid);
+	pblock2->GetValue(PB_HEIGHT,t,h,ivalid);
+	BuildBox(mesh, l, w, h);
+}
+
+// Remap the sub-object material numbers so that the top face is the first one
+// The order now is:
+// Top / Bottom /  Left/ Right / Front / Back
+static int mapDir[6] ={ 3, 5, 0, 2, 4, 1 };
+
+// vertices ( a b c d ) are in counter clockwise order when viewd from 
+// outside the surface unless bias!=0 in which case they are clockwise
+static void MakeQuad(int nverts, Face *f, int a, int b , int c , int d, int sg, int bias) {
+   int sm = 1<<sg;
+   assert(a<nverts);
+   assert(b<nverts);
+   assert(c<nverts);
+   assert(d<nverts);
+   if (bias) {
+      f[0].setVerts( b, a, c);
+      f[0].setSmGroup(sm);
+      f[0].setEdgeVisFlags(1,0,1);
+      f[1].setVerts( d, c, a);
+      f[1].setSmGroup(sm);
+      f[1].setEdgeVisFlags(1,0,1);
+   } else {
+      f[0].setVerts( a, b, c);
+      f[0].setSmGroup(sm);
+      f[0].setEdgeVisFlags(1,1,0);
+      f[1].setVerts( c, d, a);
+      f[1].setSmGroup(sm);
+      f[1].setEdgeVisFlags(1,1,0);
+   }
+}
+#define MAKE_QUAD(na,nb,nc,nd,sm,b) {MakeQuad(nverts,&(mesh.faces[nf]),na, nb, nc, nd, sm, b);nf+=2;}
+
+void BuildBox(Mesh&mesh, float l, float w, float h)
+{
+   int ix,iy,iz,nf,kv,mv,nlayer,topStart,midStart;
+   int nverts,nv,nextk,nextm,wsp1;
+   int nfaces;
+   Point3 va,vb,p;
+   BOOL bias = 0;
+   const int lsegs = 1, wsegs = 1, hsegs = 1;
+
+   // Start the validity interval at forever and whittle it down.
+   if (h<0.0f) bias = 1;
+
+   // Number of verts
+   // bottom : (lsegs+1)*(wsegs+1)
+   // top	: (lsegs+1)*(wsegs+1)
+   // sides	: (2*lsegs+2*wsegs)*(hsegs-1)
+
+   // Number of rectangular faces.
+   // bottom : (lsegs)*(wsegs)
+   // top	: (lsegs)*(wsegs)
+   // sides	: 2*(hsegs*lsegs)+2*(wsegs*lsegs)
+
+   wsp1 = wsegs + 1;
+   nlayer	=  2*(lsegs+wsegs);
+   topStart = (lsegs+1)*(wsegs+1);
+   midStart = 2*topStart;
+
+   nverts = midStart+nlayer*(hsegs-1);
+   nfaces = 4*(lsegs*wsegs + hsegs*lsegs + wsegs*hsegs);
+
+   mesh.setNumVerts(nverts);
+   mesh.setNumFaces(nfaces);
+   mesh.InvalidateTopologyCache();
+
+   nv = 0;
+
+   vb =  Point3(w,l,h)/float(2);	
+   va = -vb;
+
+   float dx = w/wsegs;
+   float dy = l/lsegs;
+   float dz = h/hsegs;
+
+   // do bottom vertices.
+   p.z = va.z;
+   p.y = va.y;
+   for(iy=0; iy<=lsegs; iy++) {
+      p.x = va.x;
+      for (ix=0; ix<=wsegs; ix++) {
+         mesh.setVert(nv++, p);
+         p.x += dx;
+      }
+      p.y += dy;
+   }
+
+   nf = 0;
+
+   // do bottom faces.
+   for(iy=0; iy<lsegs; iy++) {
+      kv = iy*(wsegs+1);
+      for (ix=0; ix<wsegs; ix++) {
+         MAKE_QUAD(kv, kv+wsegs+1, kv+wsegs+2, kv+1, 1, bias);
+         kv++;
+      }
+   }
+   assert(nf==lsegs*wsegs*2);
+
+   // do top vertices.
+   p.z = vb.z;
+   p.y = va.y;
+   for(iy=0; iy<=lsegs; iy++) {
+      p.x = va.x;
+      for (ix=0; ix<=wsegs; ix++) {
+         mesh.setVert(nv++, p);
+         p.x += dx;
+      }
+      p.y += dy;
+   }
+
+   // do top faces (lsegs*wsegs);
+   for(iy=0; iy<lsegs; iy++) {
+      kv = iy*(wsegs+1)+topStart;
+      for (ix=0; ix<wsegs; ix++) {
+         MAKE_QUAD(kv, kv+1, kv+wsegs+2,kv+wsegs+1, 2, bias);
+         kv++;
+      }
+   }
+   assert(nf==lsegs*wsegs*4);
+
+   // do middle vertices 
+   for(iz=1; iz<hsegs; iz++) {
+
+      p.z = va.z + dz * iz;
+
+      // front edge
+      p.x = va.x;	 p.y = va.y;
+      for (ix=0; ix<wsegs; ix++) { mesh.setVert(nv++, p);	 p.x += dx;	}
+
+      // right edge
+      p.x = vb.x;	  p.y = va.y;
+      for (iy=0; iy<lsegs; iy++) { mesh.setVert(nv++, p);	 p.y += dy;	}
+
+      // back edge
+      p.x =  vb.x;  p.y =	 vb.y;
+      for (ix=0; ix<wsegs; ix++) { mesh.setVert(nv++, p);	 p.x -= dx;	}
+
+      // left edge
+      p.x = va.x;	 p.y =	vb.y;
+      for (iy=0; iy<lsegs; iy++) { mesh.setVert(nv++, p);	 p.y -= dy;	}
+   }
+
+   if (hsegs==1) {
+      // do FRONT faces -----------------------
+      kv = 0;
+      mv = topStart;
+      for (ix=0; ix<wsegs; ix++) {
+         MAKE_QUAD(kv, kv+1, mv+1, mv, 3, bias);
+         kv++;
+         mv++;
+      }
+
+      // do RIGHT faces.-----------------------
+      kv = wsegs;	 
+      mv = topStart + kv;
+      for (iy=0; iy<lsegs; iy++) {
+         MAKE_QUAD(kv, kv+wsp1, mv+wsp1, mv, 4, bias);
+         kv += wsp1;
+         mv += wsp1;
+      }	
+
+      // do BACK faces.-----------------------
+      kv = topStart - 1;
+      mv = midStart - 1;
+      for (ix=0; ix<wsegs; ix++) {
+         MAKE_QUAD(kv, kv-1, mv-1, mv, 5, bias);
+         kv --;
+         mv --;
+      }
+
+      // do LEFT faces.----------------------
+      kv = lsegs*(wsegs+1);  // index into bottom
+      mv = topStart + kv;
+      for (iy=0; iy<lsegs; iy++) {
+         MAKE_QUAD(kv, kv-wsp1, mv-wsp1, mv, 6, bias);
+         kv -= wsp1;
+         mv -= wsp1;
+      }
+   }
+
+   else {
+      // do front faces.
+      kv = 0;
+      mv = midStart;
+      for(iz=0; iz<hsegs; iz++) {
+         if (iz==hsegs-1) mv = topStart;
+         for (ix=0; ix<wsegs; ix++) 
+            MAKE_QUAD(kv+ix, kv+ix+1, mv+ix+1, mv+ix, 3, bias);
+         kv = mv;
+         mv += nlayer;
+      }
+
+      assert(nf==lsegs*wsegs*4 + wsegs*hsegs*2);
+
+      // do RIGHT faces.-------------------------
+      // RIGHT bottom row:
+      kv = wsegs; // into bottom layer. 
+      mv = midStart + wsegs; // first layer of mid verts
+
+
+      for (iy=0; iy<lsegs; iy++) {
+         MAKE_QUAD(kv, kv+wsp1, mv+1, mv, 4, bias);
+         kv += wsp1;
+         mv ++;
+      }
+
+      // RIGHT middle part:
+      kv = midStart + wsegs; 
+      for(iz=0; iz<hsegs-2; iz++) {
+         mv = kv + nlayer;
+         for (iy=0; iy<lsegs; iy++) {
+            MAKE_QUAD(kv+iy, kv+iy+1, mv+iy+1, mv+iy, 4, bias);
+         }
+         kv += nlayer;
+      }
+
+      // RIGHT top row:
+      kv = midStart + wsegs + (hsegs-2)*nlayer; 
+      mv = topStart + wsegs;
+      for (iy=0; iy<lsegs; iy++) {
+         MAKE_QUAD(kv, kv+1, mv+wsp1, mv, 4, bias);
+         mv += wsp1;
+         kv++;
+      }
+
+      assert(nf==lsegs*wsegs*4 + wsegs*hsegs*2 + lsegs*hsegs*2);
+
+      // do BACK faces. ---------------------
+      // BACK bottom row:
+      kv = topStart - 1;
+      mv = midStart + wsegs + lsegs;
+      for (ix=0; ix<wsegs; ix++) {
+         MAKE_QUAD(kv, kv-1, mv+1, mv, 5, bias);
+         kv --;
+         mv ++;
+      }
+
+      // BACK middle part:
+      kv = midStart + wsegs + lsegs; 
+      for(iz=0; iz<hsegs-2; iz++) {
+         mv = kv + nlayer;
+         for (ix=0; ix<wsegs; ix++) {
+            MAKE_QUAD(kv+ix, kv+ix+1, mv+ix+1, mv+ix, 5, bias);
+         }
+         kv += nlayer;
+      }
+
+      // BACK top row:
+      kv = midStart + wsegs + lsegs + (hsegs-2)*nlayer; 
+      mv = topStart + lsegs*(wsegs+1)+wsegs;
+      for (ix=0; ix<wsegs; ix++) {
+         MAKE_QUAD(kv, kv+1, mv-1, mv, 5, bias);
+         mv --;
+         kv ++;
+      }
+
+      assert(nf==lsegs*wsegs*4 + wsegs*hsegs*4 + lsegs*hsegs*2);
+
+      // do LEFT faces. -----------------
+      // LEFT bottom row:
+      kv = lsegs*(wsegs+1);  // index into bottom
+      mv = midStart + 2*wsegs +lsegs;
+      for (iy=0; iy<lsegs; iy++) {
+         nextm = mv+1;
+         if (iy==lsegs-1) 
+            nextm -= nlayer;
+         MAKE_QUAD(kv, kv-wsp1, nextm, mv, 6, bias);
+         kv -=wsp1;
+         mv ++;
+      }
+
+      // LEFT middle part:
+      kv = midStart + 2*wsegs + lsegs; 
+      for(iz=0; iz<hsegs-2; iz++) {
+         mv = kv + nlayer;
+         for (iy=0; iy<lsegs; iy++) {
+            nextm = mv+1;
+            nextk = kv+iy+1;
+            if (iy==lsegs-1) { 
+               nextm -= nlayer;
+               nextk -= nlayer;
+            }
+            MAKE_QUAD(kv+iy, nextk, nextm, mv, 6, bias);
+            mv++;
+         }
+         kv += nlayer;
+      }
+
+      // LEFT top row:
+      kv = midStart + 2*wsegs + lsegs+ (hsegs-2)*nlayer; 
+      mv = topStart + lsegs*(wsegs+1);
+      for (iy=0; iy<lsegs; iy++) {
+         nextk = kv+1;
+         if (iy==lsegs-1) 
+            nextk -= nlayer;
+         MAKE_QUAD(kv, nextk, mv-wsp1, mv, 6, bias);
+         mv -= wsp1;
+         kv++;
+      }
+   }
+
+   mesh.setNumTVerts(0);
+   mesh.setNumTVFaces(0);
+   for (nf = 0; nf<nfaces; nf++) {
+      Face& f = mesh.faces[nf];
+      DWORD* nv = f.getAllVerts();
+      Point3 v[3];
+      for (int ix =0; ix<3; ix++)
+         v[ix] = mesh.getVert(nv[ix]);
+      int dir = direction(v);
+      mesh.setFaceMtlIndex(nf,0);
+      //mesh.setFaceMtlIndex(nf,mapDir[dir]);
+   }
+
+   mesh.InvalidateTopologyCache();
+}
+
+Object* bhkBoxObject::ConvertToType(TimeValue t, Class_ID obtype)
+{
+   return 0;
+   //return SimpleObject::ConvertToType(t,obtype);
+}
+
+int bhkBoxObject::CanConvertToType(Class_ID obtype)
+{
+   return 0;
+}
+
+
+void bhkBoxObject::GetCollapseTypes(Tab<Class_ID> &clist,Tab<TSTR*> &nlist)
+{
+   Object::GetCollapseTypes(clist, nlist);
+}
+
+class BoxObjCreateCallBack: public CreateMouseCallBack {
+   bhkBoxObject *ob;
+   Point3 p0,p1;
+   IPoint2 sp0, sp1;
+   BOOL square;
+public:
+   int proc( ViewExp *vpt,int msg, int point, int flags, IPoint2 m, Matrix3& mat );
+   void SetObj(bhkBoxObject *obj) { ob = obj; }
+};
+
+int BoxObjCreateCallBack::proc(ViewExp *vpt,int msg, int point, int flags, IPoint2 m, Matrix3& mat ) {
+   Point3 d;
+   if (msg == MOUSE_FREEMOVE)
+   {
+      vpt->SnapPreview(m,m,NULL, SNAP_IN_3D);
+   }
+
+   else if (msg==MOUSE_POINT||msg==MOUSE_MOVE) {
+      switch(point) {
+         case 0:
+            // Find the node and plug in the wire color
+            {
+               ULONG handle;
+               ob->NotifyDependents(FOREVER, (PartID)&handle, REFMSG_GET_NODE_HANDLE);
+               INode *node = GetCOREInterface()->GetINodeByHandle(handle);
+               if (node) node->SetWireColor(RGB(255, 0, 0));
+            }
+
+            sp0 = m;
+            ob->pblock2->SetValue(PB_WIDTH,0,0.0f);
+            ob->pblock2->SetValue(PB_LENGTH,0,0.0f);
+            ob->pblock2->SetValue(PB_HEIGHT,0,0.0f);
+            ob->suspendSnap = TRUE;								
+            p0 = vpt->SnapPoint(m,m,NULL,SNAP_IN_3D);
+            p1 = p0 + Point3(.01,.01,.01);
+            mat.SetTrans(float(.5)*(p0+p1));				
+            break;
+         case 1:
+            sp1 = m;
+            p1 = vpt->SnapPoint(m,m,NULL,SNAP_IN_3D);
+            p1.z = p0.z +(float).01; 
+            if (flags&MOUSE_CTRL) {
+               mat.SetTrans(p0);
+            } else {
+               mat.SetTrans(float(.5)*(p0+p1));
+            }
+            d = p1-p0;
+
+            square = FALSE;
+            if (flags&MOUSE_CTRL) {
+               // Constrain to square base
+               float len;
+               if (fabs(d.x) > fabs(d.y)) len = d.x;
+               else len = d.y;
+               d.x = d.y = 2.0f * len;
+               square = TRUE;
+            }
+
+            ob->pblock2->SetValue(PB_WIDTH,0,float(fabs(d.x)));
+            ob->pblock2->SetValue(PB_LENGTH,0,float(fabs(d.y)));
+            ob->pblock2->SetValue(PB_HEIGHT,0,float(fabs(d.z)));
+            ob->pmapParam->Invalidate();										
+
+            if (msg==MOUSE_POINT && (Length(sp1-sp0)<3 || Length(d)<0.1f)) {
+                  return CREATE_ABORT;
+            }
+            break;
+         case 2:
+#ifdef _OSNAP
+            p1.z = p0.z + vpt->SnapLength(vpt->GetCPDisp(p0,Point3(0,0,1),sp1,m,TRUE));
+#else
+            p1.z = p0.z + vpt->SnapLength(vpt->GetCPDisp(p1,Point3(0,0,1),sp1,m));
+#endif				
+            if (!square)
+               mat.SetTrans(float(.5)*(p0+p1));
+
+            d = p1-p0;
+            if (square) 
+            {
+               // Constrain to square base
+               float len;
+               if (fabs(d.x) > fabs(d.y)) len = d.x;
+               else len = d.y;
+               d.x = d.y = 2.0f * len;					
+            }
+
+            ob->pblock2->SetValue(PB_WIDTH,0,float(fabs(d.x)));
+            ob->pblock2->SetValue(PB_LENGTH,0,float(fabs(d.y)));
+            ob->pblock2->SetValue(PB_HEIGHT,0,float(d.z));
+            ob->pmapParam->Invalidate();				
+
+            if (msg==MOUSE_POINT) 
+            {
+               ob->suspendSnap = FALSE;					
+               return CREATE_STOP;
+            }
+            break;
+      }
+   }
+   else
+      if (msg == MOUSE_ABORT) {		
+         return CREATE_ABORT;
+      }
+
+      return TRUE;
+}
+
+static BoxObjCreateCallBack boxCreateCB;
+
+CreateMouseCallBack* bhkBoxObject::GetCreateMouseCallBack() 
+{
+   boxCreateCB.SetObj(this);
+   return(&boxCreateCB);
+}
+
+
+BOOL bhkBoxObject::OKtoDisplay(TimeValue t) 
+{
+   return TRUE;
+}
+
+void bhkBoxObject::InvalidateUI() 
+{
+   param_blk.InvalidateUI(pblock2->LastNotifyParamID());
+   if (pmapParam) pmapParam->Invalidate();
+}
+
+RefTargetHandle bhkBoxObject::Clone(RemapDir& remap) 
+{
+   bhkBoxObject* newob = new bhkBoxObject(FALSE);	
+   newob->ReplaceReference(0,remap.CloneRef(pblock2));
+   newob->ivalid.SetEmpty();	
+   BaseClone(this, newob, remap);
+   return(newob);
+}
+
+int bhkBoxObject::Display(TimeValue t, INode* inode, ViewExp *vpt, int flags) 
+{
+   Matrix3 m;
+   Color color = Color(inode->GetWireColor());
+   GraphicsWindow *gw = vpt->getGW();
+   Material *mtl = gw->getMaterial();
+   m = inode->GetObjectTM(t);
+   gw->setTransform(m);
+   DWORD rlim = gw->getRndLimits();
+   gw->setRndLimits(GW_WIREFRAME|GW_EDGES_ONLY|GW_Z_BUFFER);
+   if (inode->Selected()) 
+      gw->setColor( LINE_COLOR, GetSelColor());
+   else if(!inode->IsFrozen() && !inode->Dependent())
+      gw->setColor( LINE_COLOR, color);
+
+   //UpdateMesh(t);
+   mesh.render( gw, mtl, NULL, COMP_ALL);	
+   gw->setRndLimits(rlim);
+   return 0;
+}
\ No newline at end of file
diff --git a/NifProps/bhkCapsuleObj.cpp b/NifProps/bhkCapsuleObj.cpp
index 9474be2fe131d137341088c0625ebf78dc0b92f7..4e98bcdec76ecb0244e3f3bf0bf56d3ac60c7a44 100644
--- a/NifProps/bhkCapsuleObj.cpp
+++ b/NifProps/bhkCapsuleObj.cpp
@@ -22,25 +22,23 @@ HISTORY:
 #include "notify.h"
 #include "macroRec.h"
 #include "bhkRigidBodyInterface.h"
+#include "NifGui.h"
+#include "NifStrings.h"
+
 #ifndef _countof
 #define _countof(x) (sizeof(x)/sizeof((x)[0]))
 #endif
 
 static void BuildScubaMesh(Mesh &mesh, int segs, int smooth, int llsegs, 
-                    float radius1, float radius2, Point3 cap1, Point3 cap2);
+                    float radius1, float radius2, float length);
 
-const Class_ID BHKCAPSULEOBJECT_CLASS_ID = Class_ID(0x7f8f629a, 0x1d88470a);
+const Class_ID BHKCAPSULEOBJECT_CLASS_ID = Class_ID(0x7f8f629a, BHKRIGIDBODYCLASS_DESC.PartB());
 
-class bhkCapsuleObject : public SimpleObject, public IParamArray, public bhkRigidBodyIfcHelper
+class bhkCapsuleObject : public SimpleObject2
 {
 public:			
    // Class vars
-   static IParamMap *pmapParam;
-   static float crtRadius;
-   static float crtRadius1;
-   static float crtRadius2;
-   static Point3 crtCapPos1;
-   static Point3 crtCapPos2;
+   static IParamMap2 *pmapParam;
    static IObjParam *ip;
 
    bhkCapsuleObject(BOOL loading);		
@@ -55,33 +53,24 @@ public:
    void BeginEditParams( IObjParam  *ip, ULONG flags,Animatable *prev);
    void EndEditParams( IObjParam *ip, ULONG flags,Animatable *next);
    RefTargetHandle Clone(RemapDir& remap);
-   TCHAR *GetObjectName() { return GetString(IDS_RB_Capsule); }
+   TCHAR *GetObjectName() { return GetString(IDS_RB_CAPSULE); }
 
    // Animatable methods		
    void DeleteThis() {delete this;}
    Class_ID ClassID() { return BHKCAPSULEOBJECT_CLASS_ID; } 
    SClass_ID SuperClassID() { return HELPER_CLASS_ID; }
 
-   // From ReferenceTarget
-   IOResult Load(ILoad *iload);
-   IOResult Save(ISave *isave);
-
-   // From ref
-   int NumRefs() {return 2;}
-   RefTargetHandle GetReference(int i);
-   void SetReference(int i, RefTargetHandle rtarg);
+   int	NumParamBlocks() { return 1; }					// return number of ParamBlocks in this instance
+   IParamBlock2* GetParamBlock(int i) { return pblock2; } // return i'th ParamBlock
+   IParamBlock2* GetParamBlockByID(BlockID id) { return (pblock2->ID() == id) ? pblock2 : NULL; } // return id'd ParamBlock
 
    // From SimpleObject
    void BuildMesh(TimeValue t);
    BOOL OKtoDisplay(TimeValue t);
    void InvalidateUI();
-   ParamDimension *GetParameterDim(int pbIndex);
-   TSTR GetParameterName(int pbIndex);		
 
    void UpdateUI();
-
-   BaseInterface* GetInterface(Interface_ID id);
-
+   int Display(TimeValue t, INode* inode, ViewExp *vpt, int flags);
 };
 
 class CapsuleObjCreateCallBack : public CreateMouseCallBack {
@@ -94,152 +83,97 @@ public:
 };
 static CapsuleObjCreateCallBack CapsuleCreateCB;
 
-// Misc stuff
-#define MAX_SEGMENTS	200
-#define MIN_SEGMENTS	4
-
-#define MIN_RADIUS		float(0)
-#define MAX_RADIUS		float(1.0E30)
-
-#define MIN_SMOOTH		0
-#define MAX_SMOOTH		1
-
-#define DEF_SEGMENTS	32	// 16
-#define DEF_RADIUS		float(0.0)
-
-#define SMOOTH_ON	1
-#define SMOOTH_OFF	0
-
-#define MIN_SLICE	float(-1.0E30)
-#define MAX_SLICE	float( 1.0E30)
-
-
 //--- ClassDescriptor and class vars ---------------------------------
 
-static BOOL sInterfaceAdded = FALSE;
-
 // The class descriptor for Capsule
 class bhkCapsuleClassDesc : public ClassDesc2 
 {
 public:
+   bhkCapsuleClassDesc();
    int 			   IsPublic() { return 1; }
    void *			Create(BOOL loading = FALSE)
    {
-      AddInterface (GetbhkRigidBodyInterfaceDesc());
       return new bhkCapsuleObject(loading);
    }
    const TCHAR *	ClassName() { return GetString(IDS_RB_CAPSULE_CLASS); }
    SClass_ID		SuperClassID() { return HELPER_CLASS_ID; }
    Class_ID		   ClassID() { return BHKCAPSULEOBJECT_CLASS_ID; }
    const TCHAR* 	Category() { return "NifTools"; }
-   void			   ResetClassParams(BOOL fileReset);
+
+   const TCHAR*	InternalName() { return _T("bhkCapsule"); }	// returns fixed parsable name (scripter-visible name)
+   HINSTANCE		HInstance() { return hInstance; }			// returns owning module handle
 };
 
-static bhkCapsuleClassDesc CapsuleDesc;
-extern ClassDesc2* GetbhkCapsuleDesc() { return &CapsuleDesc; }
+extern ClassDesc2* GetbhkCapsuleDesc();
 
 // in prim.cpp  - The dll instance handle
 extern HINSTANCE hInstance;
 
-IParamMap *bhkCapsuleObject::pmapParam  = NULL;
+IParamMap2 *bhkCapsuleObject::pmapParam  = NULL;
 IObjParam *bhkCapsuleObject::ip         = NULL;
-float bhkCapsuleObject::crtRadius1      = 0.0f;
-float bhkCapsuleObject::crtRadius2      = 0.0f;
-Point3 bhkCapsuleObject::crtCapPos1;
-Point3 bhkCapsuleObject::crtCapPos2;
-
-
-void bhkCapsuleClassDesc::ResetClassParams(BOOL fileReset)
-{
-   bhkCapsuleObject::crtRadius1      = 0.0f;
-   bhkCapsuleObject::crtRadius2      = 0.0f;
-   bhkCapsuleObject::crtCapPos1.Set(0,0,0);
-   bhkCapsuleObject::crtCapPos2.Set(0,0,0);
-}
 
 
 //--- Parameter map/block descriptors -------------------------------
 
 // Parameter block indices
+enum { cap_params, };
+
 enum CapsuleParamIndicies
 {
+   PB_MATERIAL,
    PB_RADIUS1,
    PB_RADIUS2,
-   PB_CAP_POS1,
-   PB_CAP_POS2,
+   PB_LENGTH,
 };
 
+enum { box_params_panel, };
+
+static ParamBlockDesc2 param_blk ( 
+    cap_params, _T("bhkCapsuleParameters"),  0, NULL, P_AUTO_CONSTRUCT|P_AUTO_UI, 0,
+    //rollout
+    IDD_CAPSULEPARAM, IDS_PARAMS, 0, 0, NULL, 
+
+    // params
+    PB_MATERIAL, _T("material"), TYPE_INT, P_ANIMATABLE,	IDS_DS_MATERIAL,
+       p_default,	NP_DEFAULT_HVK_MATERIAL,
+       end,
+
+    PB_RADIUS1, _T("radius1"), TYPE_FLOAT, P_ANIMATABLE,	IDS_RB_RADIUS1,
+       p_default,	   0.0,
+       p_range,		float(0), float(1.0E30),
+       p_ui, TYPE_SPINNER, EDITTYPE_UNIVERSE, IDC_RADIUS1, IDC_RADSPINNER1, SPIN_AUTOSCALE,
+       end,
+
+    PB_RADIUS2, _T("radius2"), TYPE_FLOAT, P_ANIMATABLE,	IDS_RB_RADIUS2,
+       p_default,	   0.0,
+       p_range,		float(0), float(1.0E30),
+       p_ui, TYPE_SPINNER, EDITTYPE_UNIVERSE, IDC_RADIUS2, IDC_RADSPINNER2, SPIN_AUTOSCALE,
+       end,
+
+    PB_LENGTH, _T("length"), TYPE_FLOAT, P_ANIMATABLE,	IDS_DS_LENGTH,
+       p_default,	   0.0,
+       p_range,		float(-1.0E30), float(1.0E30),
+       p_ui, TYPE_SPINNER, EDITTYPE_UNIVERSE, IDC_LENGTHEDIT, IDC_LENSPINNER, SPIN_AUTOSCALE,
+       end,
+
+    end
+    );
+
+// static ClassDesc must be declared after static paramblock
+static bhkCapsuleClassDesc capsuleDesc;
+extern ClassDesc2* GetbhkCapsuleDesc() { return &capsuleDesc; }
+bhkCapsuleClassDesc::bhkCapsuleClassDesc() {
+   param_blk.SetClassDesc(this);
+}
 
-//
-//
-// Parameters
-
-static ParamUIDesc descParam[] = {
-   // Radius 1
-   ParamUIDesc(
-   PB_RADIUS1,
-   EDITTYPE_UNIVERSE,
-   IDC_RADIUS1,IDC_RADSPINNER1,
-   MIN_RADIUS,MAX_RADIUS,
-   SPIN_AUTOSCALE),	
-
-   // Radius 2
-   ParamUIDesc(
-   PB_RADIUS2,
-   EDITTYPE_UNIVERSE,
-   IDC_RADIUS2,IDC_RADSPINNER2,
-   MIN_RADIUS,MAX_RADIUS,
-   SPIN_AUTOSCALE),	
-
-   ParamUIDesc(
-   PB_CAP_POS1,
-   EDITTYPE_UNIVERSE,
-   IDC_ED_POS1_X,IDC_SP_POS1_X,
-   IDC_ED_POS1_Y,IDC_SP_POS1_Y,
-   IDC_ED_POS1_Z,IDC_SP_POS1_Z,
-   float(-1.0E30),float(1.0E30),
-   SPIN_AUTOSCALE),
-
-   ParamUIDesc(
-   PB_CAP_POS2,
-   EDITTYPE_UNIVERSE,
-   IDC_ED_POS2_X,IDC_SP_POS2_X,
-   IDC_ED_POS2_Y,IDC_SP_POS2_Y,
-   IDC_ED_POS2_Z,IDC_SP_POS2_Z,
-   float(-1.0E30),float(1.0E30),
-   SPIN_AUTOSCALE),
-
-};
-const int PARAMDESC_LENGTH = _countof(descParam);
-
-static ParamBlockDescID descVer0[] = {
-   { TYPE_FLOAT, NULL, TRUE, 0 },		
-   { TYPE_FLOAT, NULL, TRUE, 1 },		
-   { TYPE_POINT3, NULL, TRUE, 2 },
-   { TYPE_POINT3, NULL, TRUE, 3 } 
-};
-const int PBLOCK_LENGTH = _countof(descVer0);
-static ParamBlockDescID *curDescVer = descVer0;
-
-// Array of old versions
-//static ParamVersionDesc versions[] = {
-//   ParamVersionDesc(descVer0,_countof(descVer0),0),
-//};
-//const int NUM_OLDVERSIONS = _countof(versions);
-static ParamVersionDesc* versions = NULL;
-const int NUM_OLDVERSIONS = 0;
-
-// Current version
-const int CURRENT_VERSION = NUM_OLDVERSIONS + 1;
-static ParamVersionDesc curVersion(descVer0,_countof(descVer0),CURRENT_VERSION);
-
-class CapsuleParamDlgProc : public ParamMapUserDlgProc {
+class CapsuleParamDlgProc : public ParamMap2UserDlgProc {
 public:
    bhkCapsuleObject *so;
    HWND thishWnd;
+   NpComboBox		mCbMaterial;
 
    CapsuleParamDlgProc(bhkCapsuleObject *s) {so=s;thishWnd=NULL;}
-   BOOL DlgProc(TimeValue t,IParamMap *map,HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam);
+   BOOL DlgProc(TimeValue t,IParamMap2 *map,HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam);
    void Update(TimeValue t);
    void DeleteThis() {delete this;}
 
@@ -260,20 +194,34 @@ void CapsuleParamDlgProc::Update(TimeValue t)
    return;
 }
 
-BOOL CapsuleParamDlgProc::DlgProc(TimeValue t,IParamMap *map,HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
+BOOL CapsuleParamDlgProc::DlgProc(TimeValue t,IParamMap2 *map,HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
 {
    thishWnd=hWnd;
    switch (msg) 
    {
    case WM_INITDIALOG: 
       {
+         mCbMaterial.init(GetDlgItem(hWnd, IDC_CB_MATERIAL));
+         for (const char **str = NpHvkMaterialNames; *str; ++str)
+            mCbMaterial.add(*str);
+
+         int sel = NP_DEFAULT_HVK_MATERIAL;
+         Interval valid;
+         so->pblock2->GetValue( PB_MATERIAL, 0, sel, valid);
+         mCbMaterial.select( sel );
+
          Update(t);
          break;
       }
    case WM_COMMAND:
-      //switch (LOWORD(wParam)) 
-      //{
-      //}
+      switch (LOWORD(wParam)) 
+      {
+      case IDC_CB_MATERIAL:
+         if (HIWORD(wParam)==CBN_SELCHANGE) {
+            so->pblock2->SetValue( PB_MATERIAL, 0, mCbMaterial.selection() );
+         }
+         break;
+      }
       break;	
    }
    return FALSE;
@@ -285,115 +233,38 @@ BOOL CapsuleParamDlgProc::DlgProc(TimeValue t,IParamMap *map,HWND hWnd,UINT msg,
 bhkCapsuleObject::bhkCapsuleObject(BOOL loading)
 {
    SetAFlag(A_PLUGIN1);
-   ReplaceReference(0, CreateParameterBlock(curDescVer, PBLOCK_LENGTH, CURRENT_VERSION));
-   assert(pblock);
-   ReplaceReference(1, GetRBBlock());
-
-   pblock->SetValue(PB_RADIUS1,0,crtRadius1);
-   pblock->SetValue(PB_RADIUS2,0,crtRadius2);
-   pblock->SetValue(PB_CAP_POS1,0,crtCapPos1);
-   pblock->SetValue(PB_CAP_POS2,0,crtCapPos2);
+   capsuleDesc.MakeAutoParamBlocks(this);
+   assert(pblock2);
 }
 
 bhkCapsuleObject::~bhkCapsuleObject() 
 {
+   param_blk.SetUserDlgProc();
    CapsuleCreateCB.SetObj(NULL);
    if (pmapParam) {
-      pmapParam->SetUserDlgProc(NULL);
-      DestroyCPParamMap(pmapParam);
       pmapParam  = NULL;
    }
 }
 
-#define NEWMAP_CHUNKID	0x0100
-
-IOResult bhkCapsuleObject::Load(ILoad *iload) 
-{
-   ClearAFlag(A_PLUGIN1);
-
-   IOResult res;
-   while (IO_OK==(res=iload->OpenChunk())) 
-   {
-      switch (iload->CurChunkID()) 
-      {	
-      case NEWMAP_CHUNKID:
-         SetAFlag(A_PLUGIN1);
-         break;
-      }
-      iload->CloseChunk();
-      if (res!=IO_OK)  return res;
-   }
-   return IO_OK;
-}
-
-IOResult bhkCapsuleObject::Save(ISave *isave)
-{
-   if (TestAFlag(A_PLUGIN1)) {
-      isave->BeginChunk(NEWMAP_CHUNKID);
-      isave->EndChunk();
-   }
-   return IO_OK;
-}
-
-RefTargetHandle bhkCapsuleObject::GetReference(int i) 
-{
-   if (i == 1) 
-      return GetRBBlock();
-   return pblock;
-}
-
-void bhkCapsuleObject::SetReference(int i, RefTargetHandle rtarg) 
-{
-   if (i == 1)
-      return;
-   pblock=(IParamBlock*)rtarg;
-}
-
-BaseInterface* bhkCapsuleObject::GetInterface(Interface_ID id)
-{
-   if (id == BHKRIGIDBODYINTERFACE_DESC)
-      return this;
-   return SimpleObject::GetInterface(id);
-}
-
-
-
 void bhkCapsuleObject::BeginEditParams(IObjParam *ip,ULONG flags,Animatable *prev)
 {
    SimpleObject::BeginEditParams(ip,flags,prev);
 
-   // Gotta make a new one.
-   if (NULL == pmapParam) 
-   {
-      pmapParam = CreateCPParamMap(
-         descParam,PARAMDESC_LENGTH,
-         pblock,
-         ip,
-         hInstance,
-         MAKEINTRESOURCE(IDD_CAPSULEPARAM),
-         GetString(IDS_RB_PARAMETERS),
-         0);
-   }
+   capsuleDesc.BeginEditParams(ip,this,flags,prev);
+   param_blk.SetUserDlgProc(new CapsuleParamDlgProc(this));
+   pmapParam = pblock2->GetMap(cap_params);
    this->ip = ip;
-
-   if(pmapParam) {
-      // A callback for the type in.
-      pmapParam->SetUserDlgProc(new CapsuleParamDlgProc(this));
-   }
-   BeginEditRBParams(ip, flags, prev);
 }
 
 void bhkCapsuleObject::EndEditParams( IObjParam *ip, ULONG flags,Animatable *next )
 {		
+   param_blk.SetUserDlgProc();
    SimpleObject::EndEditParams(ip,flags,next);
    this->ip = NULL;
+   pmapParam = NULL;
 
-   if (pmapParam && flags&END_EDIT_REMOVEUI ) {
-      pmapParam->SetUserDlgProc(NULL);
-      DestroyCPParamMap(pmapParam);
-      pmapParam  = NULL;
-   }
-   EndEditRBParams(ip, flags, next);
+   // tear down the appropriate auto-rollouts
+   capsuleDesc.EndEditParams(ip, this, flags, next);
 }
 
 void bhkCapsuleObject::BuildMesh(TimeValue t)
@@ -406,17 +277,13 @@ void bhkCapsuleObject::BuildMesh(TimeValue t)
    //FixHeight(pblock,t,(pmapParam?pmapParam->GetHWnd():NULL),increate);
    ivalid = FOREVER;
 
-   float radius1, radius2;
-   Point3 pos1, pos2;
-   pblock->GetValue(PB_RADIUS1,t,radius1,ivalid);
-   pblock->GetValue(PB_RADIUS2,t,radius2,ivalid);
-   pblock->GetValue(PB_CAP_POS1,t,pos1,ivalid);
-   pblock->GetValue(PB_CAP_POS2,t,pos2,ivalid);
-   LimitValue(radius1, MIN_RADIUS, MAX_RADIUS);
-   LimitValue(radius2, MIN_RADIUS, MAX_RADIUS);
-   if (radius2 == MIN_RADIUS) radius2 = radius1;
-
-   if (radius1 == 0)
+   float radius1, radius2, length;
+   pblock2->GetValue(PB_RADIUS1,t,radius1,ivalid);
+   pblock2->GetValue(PB_RADIUS2,t,radius2,ivalid);
+   pblock2->GetValue(PB_LENGTH,t,length,ivalid);
+   if (radius2 == 0.0f) radius2 = radius1;
+
+   if (radius1 == 0.0f)
    {
       mesh.setNumVerts(0);
       mesh.setNumFaces(0);
@@ -426,7 +293,7 @@ void bhkCapsuleObject::BuildMesh(TimeValue t)
    }
    else
    {
-      BuildScubaMesh(mesh, segs, smooth, hsegs, radius2, radius1, pos2, pos1);
+      BuildScubaMesh(mesh, segs, smooth, hsegs, radius2, radius1, length);
    }
 }
 
@@ -465,13 +332,19 @@ int CapsuleObjCreateCallBack::proc(ViewExp *vpt,int msg, int point, int flags, I
       switch(point) 
       {
       case 0:  // only happens with MOUSE_POINT msg
-         ob->pblock->SetValue(PB_RADIUS1,0,0.0f);
-         ob->pblock->SetValue(PB_RADIUS2,0,0.0f);
+         // Find the node and plug in the wire color
+         {
+            ULONG handle;
+            ob->NotifyDependents(FOREVER, (PartID)&handle, REFMSG_GET_NODE_HANDLE);
+            INode *node = GetCOREInterface()->GetINodeByHandle(handle);
+            if (node) node->SetWireColor(RGB(255, 0, 0));
+         }
+         ob->pblock2->SetValue(PB_RADIUS1,0,0.0f);
+         ob->pblock2->SetValue(PB_RADIUS2,0,0.0f);
          ob->suspendSnap = TRUE;				
          sp[0] = m;
          p[0] = vpt->SnapPoint(m,m,NULL,SNAP_IN_3D);
-         ob->pblock->SetValue(PB_CAP_POS1,0,p[0]);
-         ob->pblock->SetValue(PB_CAP_POS2,0,p[0]);
+         ob->pblock2->SetValue(PB_LENGTH,0,0.0f);
          mat.SetTrans(p[0]);
          break;
 
@@ -483,8 +356,8 @@ int CapsuleObjCreateCallBack::proc(ViewExp *vpt,int msg, int point, int flags, I
          r = Length(p[1]-p[0]);
          mat.SetTrans(p[0]);
 
-         ob->pblock->SetValue(PB_RADIUS1,0,r);
-         ob->pblock->SetValue(PB_RADIUS2,0,r);
+         ob->pblock2->SetValue(PB_RADIUS1,0,r);
+         ob->pblock2->SetValue(PB_RADIUS2,0,r);
          ob->pmapParam->Invalidate();
 
          if (flags&MOUSE_CTRL) 
@@ -506,25 +379,21 @@ int CapsuleObjCreateCallBack::proc(ViewExp *vpt,int msg, int point, int flags, I
          //mat.PreRotateZ(HALFPI);
          sp[2] = m;
          p[2] = vpt->SnapPoint(m,m,NULL,SNAP_IN_3D);
-         r = Length(p[1]-p[0]);
+         r = Length(p[2]-p[1]);
          mat.SetTrans(p[0]);
 
-         ob->pblock->SetValue(PB_CAP_POS2,0,p[2]);
+         ob->pblock2->SetValue(PB_LENGTH,0,r);
          ob->pmapParam->Invalidate();
 
-         //if (flags&MOUSE_CTRL) 
-         //{
-         //   float ang = (float)atan2(p1.y-p[0].y,p1.x-p[0].x);					
-         //   mat.PreRotateZ(ob->ip->SnapAngle(ang));
-         //}
-         //if (msg==MOUSE_POINT) 
-         //{
-         //   ob->suspendSnap = FALSE;
-         //   return (Length(m-sp[0])<3 || Length(p1-p[0])<0.1f)?CREATE_ABORT:CREATE_STOP;
-         //}
+         // Stop unless Ctrl is selected then we size the final radius
+         if (msg==MOUSE_POINT && !(flags&MOUSE_CTRL) )
+         {
+            ob->suspendSnap = FALSE;
+            return CREATE_STOP;
+         }
          break;
 
-      case 3: // Get second point
+      case 3: // Size the second cap
          mat.IdentityMatrix();
          //mat.PreRotateZ(HALFPI);
          sp[3] = m;
@@ -532,13 +401,13 @@ int CapsuleObjCreateCallBack::proc(ViewExp *vpt,int msg, int point, int flags, I
          if (flags&MOUSE_CTRL) // ignore radius
          {
             r = Length(p[1]-p[0]);
-            ob->pblock->SetValue(PB_RADIUS2,0,r);
+            ob->pblock2->SetValue(PB_RADIUS2,0,r);
          }
          else
          {
             // start radius at r1
             r = Length((p[3]-p[2]) + (p[1]-p[0]));
-            ob->pblock->SetValue(PB_RADIUS2,0,r);
+            ob->pblock2->SetValue(PB_RADIUS2,0,r);
          }
          ob->pmapParam->Invalidate();
          if (msg==MOUSE_POINT) 
@@ -567,7 +436,7 @@ CreateMouseCallBack* bhkCapsuleObject::GetCreateMouseCallBack()
 BOOL bhkCapsuleObject::OKtoDisplay(TimeValue t) 
 {
    float radius;
-   pblock->GetValue(PB_RADIUS1,t,radius,FOREVER);
+   pblock2->GetValue(PB_RADIUS1,t,radius,FOREVER);
    if (radius==0.0f) return FALSE;
    else return TRUE;
 }
@@ -577,40 +446,6 @@ void bhkCapsuleObject::InvalidateUI()
    if (pmapParam) pmapParam->Invalidate();
 }
 
-ParamDimension *bhkCapsuleObject::GetParameterDim(int pbIndex) 
-{
-   switch (pbIndex) 
-   {
-   case PB_RADIUS1:
-      return stdWorldDim;			
-   case PB_RADIUS2:
-      return stdWorldDim;			
-   case PB_CAP_POS1:
-      return stdWorldDim;			
-   case PB_CAP_POS2:
-      return stdWorldDim;			
-   default:
-      return defaultDim;
-   }
-}
-
-TSTR bhkCapsuleObject::GetParameterName(int pbIndex) 
-{
-   switch (pbIndex) 
-   {
-   case PB_RADIUS1:
-      return TSTR(GetString(IDS_RB_RADIUS1));			
-   case PB_RADIUS2:
-      return TSTR(GetString(IDS_RB_RADIUS2));			
-   case PB_CAP_POS1:
-      return TSTR(GetString(IDS_RB_CAP_POS1));			
-   case PB_CAP_POS2:
-      return TSTR(GetString(IDS_RB_CAP_POS2));			
-   default:
-      return TSTR(_T(""));
-   }
-}
-
 RefTargetHandle bhkCapsuleObject::Clone(RemapDir& remap) 
 {
    bhkCapsuleObject* newob = new bhkCapsuleObject(FALSE);	
@@ -642,7 +477,7 @@ void AddFace(Face *f,int a,int b,int c,int evis,int smooth_group)
 }
 
 void BuildScubaMesh(Mesh &mesh, int segs, int smooth, int llsegs, 
-                    float radius1, float radius2, Point3 cap1, Point3 cap2)
+                    float radius1, float radius2, float cylh)
 {
    Point3 p;
    int ix,jx,ic = 1;
@@ -691,7 +526,6 @@ void BuildScubaMesh(Mesh &mesh, int segs, int smooth, int llsegs,
    mesh.setSmoothFlags(smooth != 0);
 
    // bottom vertex 
-   float cylh = (cap1 - cap2).Length();
    float height = cylh + radius1 + radius2;
    mesh.setVert(nv, Point3(0.0f,0.0f,height));
    mesh.setVert(nverts-1, Point3(0.0f,0.0f,0.0f));		
@@ -828,7 +662,7 @@ void BuildScubaMesh(Mesh &mesh, int segs, int smooth, int llsegs,
       t0++;t1++;
    }
    for (i=0;i<nverts;i++) 
-      mesh.verts[i].z -= radius2;
+      mesh.verts[i].z -= (radius2 + cylh/2.0f);
 
    if (edgelstr) delete []edgelstr;
    if (edgelstl) delete []edgelstl;
@@ -837,174 +671,23 @@ void BuildScubaMesh(Mesh &mesh, int segs, int smooth, int llsegs,
    mesh.InvalidateTopologyCache();
 }
 
-#if 0
-void BuildCylinderMesh(Mesh &mesh,
-                       int segs, int smooth, int llsegs, int capsegs, 
-                       float radius1, float radius2, float height, 
-                       int doPie, float pie1, float pie2)
+int bhkCapsuleObject::Display(TimeValue t, INode* inode, ViewExp *vpt, int flags) 
 {
-   Point3 p;
-   int ix,na,nb,nc,nd,jx,kx, ic = 1;
-   int nf=0,nv=0, lsegs;
-   float delta,ang, u;	
-   float totalPie, startAng = 0.0f;	
-
-   lsegs = llsegs-1 + 2*capsegs;
-
-   // Make pie2 < pie1 and pie1-pie2 < TWOPI
-   while (pie1 < pie2) pie1 += TWOPI;
-   while (pie1 > pie2+TWOPI) pie1 -= TWOPI;
-   if (pie1==pie2) totalPie = TWOPI;
-   else totalPie = pie1-pie2;	
-
-   delta = (float)2.0*PI/(float)segs;
-
-   if (height<0) delta = -delta;
-
-   int nverts;
-   int nfaces;
-   nverts = 2+segs*(lsegs);
-   nfaces = 2*segs*(lsegs);	
-   mesh.setNumVerts(nverts);
-   mesh.setNumFaces(nfaces);
-   mesh.setSmoothFlags(smooth != 0);
-   mesh.setNumTVerts(0);
-   mesh.setNumTVFaces(0);
-
-   // bottom vertex 
-   mesh.setVert(nv, Point3(0.0,0.0,0.0));
-   nv++;
-
-   // Bottom cap vertices	
-   for(ix=0; ix<capsegs; ix++) {
-
-      // Put center vertices all the way up
-      p.z = 0.0f;
-      u   = float(ix+1)/float(capsegs);
-      ang = startAng;
-      for (jx = 0; jx<segs; jx++) {			
-         p.x = (float)cos(ang)*radius1*u;
-         p.y = (float)sin(ang)*radius1*u;	
-         mesh.setVert(nv, p);
-         nv++;
-         ang += delta;
-      }	
-   }
-
-   // Middle vertices 
-   for(ix=1; ix<llsegs; ix++) {
-
-      // Put center vertices all the way up
-      float   u = float(ix)/float(llsegs);
-      float rad = (radius1*(1.0f-u) + radius2*u);
-      p.z = height*((float)ix/float(llsegs));
-      ang = startAng;
-      for (jx = 0; jx<segs; jx++) {
-         p.x = (float)cos(ang)*rad;
-         p.y = (float)sin(ang)*rad;
-         mesh.setVert(nv, p);
-         nv++;
-         ang += delta;
-      }	
-   }
-
-   // Top cap vertices	
-   for(ix=0; ix<capsegs; ix++) {
-
-      // Put center vertices all the way up
-      p.z = height;
-      u   = 1.0f-float(ix)/float(capsegs);
-      ang = startAng;
-      for (jx = 0; jx<segs; jx++) {			
-         p.x = (float)cos(ang)*radius2*u;		
-         p.y = (float)sin(ang)*radius2*u;	
-         mesh.setVert(nv, p);
-         nv++;
-         ang += delta;
-      }	
-   }
-
-   /* top vertex */
-   mesh.setVert(nv, (float)0.0, (float)0.0, height);
-   nv++;
-
-   // Now make faces ---
-
-   BitArray startSliceFaces;
-   BitArray endSliceFaces;
-   BitArray topCapFaces;
-   BitArray botCapFaces;
-
-   // Make bottom cap		
-
-   for(ix=1; ix<=segs; ++ix) {
-      nc=(ix==segs)?1:ix+1;
-      mesh.faces[nf].setEdgeVisFlags(capsegs>1,1,capsegs>1);
-      mesh.faces[nf].setSmGroup(1);
-      mesh.faces[nf].setVerts(0,nc,ix);
-      mesh.faces[nf].setMatID(1);
-      nf++;
-   }
-
-   int topCapStartFace = 0;
-
-   /* Make midsection */
-   for(ix=0; ix<lsegs-1; ++ix) {
-      jx=ix*segs+1;
-      for(kx=0; kx<segs; ++kx) {
-         DWORD grp = 0;
-         int mtlid;
-         BOOL inSlice = FALSE;
-
-         if (kx==segs) {
-            mtlid = 4;
-            grp = (1<<2);
-            inSlice = TRUE;
-         } else if (ix < capsegs-1 || ix >= capsegs+llsegs-1) {
-            grp = 1;
-            mtlid = (ix<capsegs-1)?0:1;
-         } else {		
-            mtlid = 2;
-            if (smooth) {				
-               grp = (1<<3);	
-            }			
-         }
-
-         na = jx+kx;
-         nb = na+segs;
-         nc = (kx==(segs-1))? jx+segs: nb+1;
-         nd = (kx==(segs-1))? jx : na+1;			
-
-         mesh.faces[nf].setEdgeVisFlags(0,!inSlice,1);
-         mesh.faces[nf].setSmGroup(grp);
-         mesh.faces[nf].setVerts(na,nc,nb);
-         mesh.faces[nf].setMatID(mtlid);
-         nf++;
-
-         mesh.faces[nf].setEdgeVisFlags(!inSlice,1,0);
-         mesh.faces[nf].setSmGroup(grp);
-         mesh.faces[nf].setVerts(na,nd,nc);
-         mesh.faces[nf].setMatID(mtlid);
-         nf++;
-      }
-   }
-
-   //Make Top cap 			
-   na = mesh.getNumVerts()-1;	
-   jx = (lsegs-1)*segs+1;
-
-   for(ix=0; ix<segs; ++ix) {
-      nb = jx+ix;
-      nc = (ix==segs-1)? jx: nb+1;		
-      mesh.faces[nf].setEdgeVisFlags(capsegs>1,1,capsegs>1);		
-      mesh.faces[nf].setSmGroup( 1);
-      mesh.faces[nf].setVerts(na,nb,nc);
-      mesh.faces[nf].setMatID(0);
-      nf++;
-   }
-
-   assert(nf==mesh.numFaces);
-   assert(nv==mesh.numVerts);
-   mesh.InvalidateTopologyCache();
-}
-#endif
\ No newline at end of file
+   Matrix3 m;
+   Color color = Color(inode->GetWireColor());
+   GraphicsWindow *gw = vpt->getGW();
+   Material *mtl = gw->getMaterial();
+   m = inode->GetObjectTM(t);
+   gw->setTransform(m);
+   DWORD rlim = gw->getRndLimits();
+   gw->setRndLimits(GW_WIREFRAME|GW_EDGES_ONLY/*|GW_Z_BUFFER*/);
+   if (inode->Selected()) 
+      gw->setColor( LINE_COLOR, GetSelColor());
+   else if(!inode->IsFrozen() && !inode->Dependent())
+      gw->setColor( LINE_COLOR, color);
+
+   UpdateMesh(t);
+   mesh.render( gw, mtl, NULL, COMP_ALL);	
+   gw->setRndLimits(rlim);
+   return 0;
+}
\ No newline at end of file
diff --git a/NifProps/bhkRigidBodyInterface.cpp b/NifProps/bhkRigidBodyInterface.cpp
index 24c62f144ea535eaba48d5a8642b6fda8e71f104..ddc99faeff6bbca242dbe9fdf3de741441f76eb7 100644
--- a/NifProps/bhkRigidBodyInterface.cpp
+++ b/NifProps/bhkRigidBodyInterface.cpp
@@ -30,7 +30,7 @@ HISTORY:
 FPInterfaceDesc thebhkRigidBodyInterface(
    BHKRIGIDBODYINTERFACE_DESC, _T("bhkRigidBody"), -1/*IDS_OPS*/, 0, FP_CORE,
    properties,
-      bhkRigidBodyInterface::get_material, bhkRigidBodyInterface::set_material, _T("Material"), 0, TYPE_ENUM, bhkRigidBodyInterface::enum_material,
+      //bhkRigidBodyInterface::get_material, bhkRigidBodyInterface::set_material, _T("Material"), 0, TYPE_ENUM, bhkRigidBodyInterface::enum_material,
       bhkRigidBodyInterface::get_layer, bhkRigidBodyInterface::set_layer, _T("Layer"), 0, TYPE_ENUM, bhkRigidBodyInterface::enum_layer,
       bhkRigidBodyInterface::get_mass, bhkRigidBodyInterface::set_mass, _T("Mass"), 0, TYPE_FLOAT,
       bhkRigidBodyInterface::get_friction, bhkRigidBodyInterface::set_friction, _T("Friction"), 0, TYPE_FLOAT,
@@ -238,7 +238,7 @@ static ParamUIDesc descRigidBodyParam[] = {
 const int descRigidBodyParamLength = _countof(descRigidBodyParam);
 
 static ParamBlockDescID gRigidBlockParamDesc[] = {
-   { TYPE_INT, NULL, FALSE, PB_RB_MATERIAL },
+   //{ TYPE_INT, NULL, FALSE, PB_RB_MATERIAL },
    { TYPE_INT, NULL, FALSE, PB_RB_LAYER },
    { TYPE_FLOAT, NULL, FALSE, PB_RB_MASS },
    { TYPE_FLOAT, NULL, FALSE, PB_RB_FRICTION },
@@ -258,7 +258,7 @@ public:
    bhkRigidBodyInterface *so;
    HWND thishWnd;
    NpComboBox		mCbLayer;
-   NpComboBox		mCbMaterial;
+   //NpComboBox		mCbMaterial;
    NpComboBox		mCbMotionSystem;
    NpComboBox		mCbQualityType;
 
@@ -283,7 +283,7 @@ void RigidBodyParamDlgProc::Update(TimeValue t)
       return;
 
    
-   mCbMaterial.select(max(0, min(so->GetMaterial(t), mCbMaterial.count()-1)));
+   //mCbMaterial.select(max(0, min(so->GetMaterial(t), mCbMaterial.count()-1)));
    mCbLayer.select(max(0, min(so->GetLayer(t), mCbLayer.count()-1)));
    mCbMotionSystem.select(max(0, min(so->GetMotionSystem(t), mCbMotionSystem.count()-1)));
    mCbQualityType.select(max(0, min(so->GetQualityType(t), mCbQualityType.count()-1)));
@@ -297,9 +297,9 @@ BOOL RigidBodyParamDlgProc::DlgProc(TimeValue t,IParamMap *map,HWND hWnd,UINT ms
    {
    case WM_INITDIALOG: 
       {
-         mCbMaterial.init(GetDlgItem(hWnd, IDC_CB_MATERIAL));
-         for (const char **str = NpHvkMaterialNames; *str; ++str)
-            mCbMaterial.add(*str);
+         //mCbMaterial.init(GetDlgItem(hWnd, IDC_CB_MATERIAL));
+         //for (const char **str = NpHvkMaterialNames; *str; ++str)
+         //   mCbMaterial.add(*str);
 
          mCbLayer.init(GetDlgItem(hWnd, IDC_CB_LAYER));
          for (const char **str = NpHvkLayerNames; *str; ++str)
@@ -319,11 +319,11 @@ BOOL RigidBodyParamDlgProc::DlgProc(TimeValue t,IParamMap *map,HWND hWnd,UINT ms
    case WM_COMMAND:
       switch (LOWORD(wParam))
       {
-      case IDC_CB_MATERIAL:
-         if (HIWORD(wParam)==CBN_SELCHANGE) {
-            so->SetMaterial( mCbMaterial.selection(), t );
-         }
-         break;
+      //case IDC_CB_MATERIAL:
+      //   if (HIWORD(wParam)==CBN_SELCHANGE) {
+      //      so->SetMaterial( mCbMaterial.selection(), t );
+      //   }
+      //   break;
 
       case IDC_CB_LAYER:
          if (HIWORD(wParam)==CBN_SELCHANGE) {
@@ -356,7 +356,7 @@ IObjParam *bhkRigidBodyIfcHelper::rbip = NULL;
 bhkRigidBodyIfcHelper::bhkRigidBodyIfcHelper()
 {
    rbpblock = CreateParameterBlock(gRigidBlockParamDesc, descRigidBodyDescIDLength, 1);
-   rbpblock->SetValue(PB_RB_MATERIAL,0,NP_DEFAULT_HVK_MATERIAL);
+   //rbpblock->SetValue(PB_RB_MATERIAL,0,NP_DEFAULT_HVK_MATERIAL);
    rbpblock->SetValue(PB_RB_LAYER,0,NP_DEFAULT_HVK_LAYER);
    rbpblock->SetValue(PB_RB_MASS,0,NP_DEFAULT_HVK_MASS);
    rbpblock->SetValue(PB_RB_FRICTION,0,NP_DEFAULT_HVK_FRICTION);
@@ -395,7 +395,7 @@ void bhkRigidBodyIfcHelper::BeginEditRBParams(IObjParam *ip,ULONG flags,Animatab
          rbpblock,
          ip,
          hInstance,
-         MAKEINTRESOURCE(IDD_RigidBody),
+         MAKEINTRESOURCE(IDD_RIGIDBODY),
          GetString(IDS_RB_RIGIDBODY_PARAM),
          0);
    }
@@ -417,17 +417,17 @@ void bhkRigidBodyIfcHelper::EndEditRBParams( IObjParam *ip, ULONG flags,Animatab
 }
 
 
-void bhkRigidBodyIfcHelper::SetMaterial(int value, TimeValue time)
-{
-   rbpblock->SetValue(PB_RB_MATERIAL,time,value);
-}
-
-int bhkRigidBodyIfcHelper::GetMaterial(TimeValue time, Interval& valid) const
-{
-   int value = NP_DEFAULT_HVK_MATERIAL;
-   rbpblock->GetValue(PB_RB_MATERIAL,time,value,valid);
-   return value;
-}
+//void bhkRigidBodyIfcHelper::SetMaterial(int value, TimeValue time)
+//{
+//   rbpblock->SetValue(PB_RB_MATERIAL,time,value);
+//}
+//
+//int bhkRigidBodyIfcHelper::GetMaterial(TimeValue time, Interval& valid) const
+//{
+//   int value = NP_DEFAULT_HVK_MATERIAL;
+//   rbpblock->GetValue(PB_RB_MATERIAL,time,value,valid);
+//   return value;
+//}
 
 void bhkRigidBodyIfcHelper::SetLayer(int value, TimeValue time)
 {
diff --git a/NifProps/bhkRigidBodyInterface.h b/NifProps/bhkRigidBodyInterface.h
index 28cab3e0cec43e6db8642ba4e06864d757a249ff..4756f4fec5e68965ba886726f02b3f97b0a4ee04 100644
--- a/NifProps/bhkRigidBodyInterface.h
+++ b/NifProps/bhkRigidBodyInterface.h
@@ -23,14 +23,16 @@ HISTORY:
 //! The unique instance of the rigid body interface
 extern CoreExport FPInterfaceDesc gbhkRigidBodyDesc;
 
-#define BHKRIGIDBODYINTERFACE_DESC   Interface_ID(0x056aad53, 0x52c54024)
+#define BHKRIGIDBODYCLASS_DESC Class_ID(0x00000000, 0x1d88470a)
+const Interface_ID BHKRIGIDBODYINTERFACE_DESC(0x056aad53, 0x52c54024);
+
 extern FPInterfaceDesc* GetbhkRigidBodyInterfaceDesc();
 
 class bhkRigidBodyInterface : public FPMixinInterface
 {
 public:			
-   virtual void		SetMaterial(int value, TimeValue time) = 0;
-   virtual int		   GetMaterial(TimeValue time, Interval& valid = FOREVER) const = 0 ;
+   //virtual void		SetMaterial(int value, TimeValue time) = 0;
+   //virtual int		   GetMaterial(TimeValue time, Interval& valid = FOREVER) const = 0 ;
 
    virtual void		SetLayer(int value, TimeValue time) = 0;
    virtual int		   GetLayer(TimeValue time, Interval& valid = FOREVER) const = 0 ;
@@ -84,7 +86,7 @@ public:
    //Function Map For Mixin Interface
    //*************************************************
    BEGIN_FUNCTION_MAP
-      PROP_TFNS(get_material, GetMaterial, set_material, SetMaterial, TYPE_INT);
+      //PROP_TFNS(get_material, GetMaterial, set_material, SetMaterial, TYPE_INT);
       PROP_TFNS(get_layer, GetLayer, set_layer, SetLayer, TYPE_INT);
       PROP_TFNS(get_mass, GetMass, set_mass, SetMass, TYPE_FLOAT);
       PROP_TFNS(get_friction, GetFriction, set_friction, SetFriction, TYPE_FLOAT);
@@ -107,7 +109,7 @@ public:
 // Parameter block indices
 enum RigidBodyParamIndicies
 {
-   PB_RB_MATERIAL,
+   //PB_RB_MATERIAL,
    PB_RB_LAYER,
    PB_RB_MASS,
    PB_RB_FRICTION,
@@ -131,8 +133,8 @@ public:
    void              BeginEditRBParams(IObjParam *ip,ULONG flags,Animatable *prev);
    void              EndEditRBParams(IObjParam *ip,ULONG flags,Animatable *next);
 
-   virtual void		SetMaterial(int value, TimeValue time);
-   virtual int		   GetMaterial(TimeValue time, Interval& valid = FOREVER) const ;
+   //virtual void		SetMaterial(int value, TimeValue time);
+   //virtual int		   GetMaterial(TimeValue time, Interval& valid = FOREVER) const ;
 
    virtual void		SetLayer(int value, TimeValue time);
    virtual int		   GetLayer(TimeValue time, Interval& valid = FOREVER) const ;
diff --git a/NifProps/bhkRigidBodyModifer.cpp b/NifProps/bhkRigidBodyModifer.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..48c50f3a99495ef3421fa00f8795cb6a96b6341e
--- /dev/null
+++ b/NifProps/bhkRigidBodyModifer.cpp
@@ -0,0 +1,763 @@
+#pragma warning( disable:4800 )
+
+#include <map>
+#include "NifProps.h"
+#include "NifStrings.h"
+#include "NifPlugins.h"
+#include "NifGui.h"
+#include "bhkRigidBodyInterface.h"
+
+using namespace std;
+
+#define PBLOCK_REF	0
+const Class_ID BHKRIGIDBODYMODIFIER_CLASS_ID = Class_ID(0x398fd801, 0x303e44e5);
+class PickObjectMode;
+
+extern void BuildBox(Mesh&mesh, float l, float w, float h);
+extern void BuildSphere(Mesh&mesh, float radius, int segs=32, int smooth=1, float startAng = 0.0f);
+extern void BuildScubaMesh(Mesh &mesh, int segs, int smooth, int llsegs, 
+                    float radius1, float radius2, float cylh);
+
+void CalcAxisAlignedBox(Mesh& mesh, Box3& box)
+{
+   int nv = mesh.getNumVerts();
+   box.IncludePoints(mesh.getVertPtr(0), nv, NULL);
+}
+
+// Calculate bounding sphere using minimum-volume axis-align bounding box.  Its fast but not a very good fit.
+void CalcAxisAlignedSphere(Mesh& mesh, Point3& center, float& radius)
+{
+   //--Calculate center & radius--//
+
+   //Set lows and highs to first vertex
+   int nv = mesh.getNumVerts();
+   
+   Point3 lows = mesh.getVert(0);
+   Point3 highs = mesh.getVert(0);
+
+   //Iterate through the vertices, adjusting the stored values
+   //if a vertex with lower or higher values is found
+   for ( unsigned int i = 0; i < nv; ++i ) {
+      const Point3 & v = mesh.getVert(i);
+
+      if ( v.x > highs.x ) highs.x = v.x;
+      else if ( v.x < lows.x ) lows.x = v.x;
+
+      if ( v.y > highs.y ) highs.y = v.y;
+      else if ( v.y < lows.y ) lows.y = v.y;
+
+      if ( v.z > highs.z ) highs.z = v.z;
+      else if ( v.z < lows.z ) lows.z = v.z;
+   }
+
+   //Now we know the extent of the shape, so the center will be the average
+   //of the lows and highs
+   center = (highs + lows) / 2.0f;
+
+   //The radius will be the largest distance from the center
+   Point3 diff;
+   float dist2(0.0f), maxdist2(0.0f);
+   for ( unsigned int i = 0; i < nv; ++i ) {
+      const Point3 & v = mesh.getVert(i);
+
+      diff = center - v;
+      dist2 = diff.x * diff.x + diff.y * diff.y + diff.z * diff.z;
+      if ( dist2 > maxdist2 ) maxdist2 = dist2;
+   };
+   radius = sqrt(maxdist2);
+}
+
+// Calculate bounding sphere using average position of the points.  Better fit but slower.
+void CalcCenteredSphere(Mesh& mesh, Point3& center, float& radius)
+{
+   size_t nv = mesh.getNumVerts();
+   Point3 sum;
+   for (size_t i=0; i<nv; ++i)
+      sum += mesh.getVert(i);
+   center = sum / float(nv);
+   float radsq = 0.0f;
+   for (size_t i=0; i<nv; ++i){
+      Point3 diff = mesh.getVert(i) - center;
+      float mag = diff.LengthSquared();
+      radsq = max(radsq, mag);
+   }
+   radius = Sqrt(radsq);
+}
+
+
+class bhkValidatorClass : public PBValidator
+{
+public:
+   class bhkRigidBodyModifier *mod;
+private:
+   BOOL Validate(PB2Value &v) 
+   {
+      INode *node = (INode*) v.r;
+      if (node->TestForLoop(FOREVER,(ReferenceMaker *) mod)!=REF_SUCCEED) return FALSE;
+
+      ObjectState os = node->EvalWorldState(0);
+      //Allow only tri object derived objects
+      if (os.obj->CanConvertToType(triObjectClassID)  && os.obj->SuperClassID() != SHAPE_CLASS_ID) {			
+         return TRUE;
+      }
+      // and out objects which support the RigidBodyInterface
+      //if (os.obj->SuperClassID() == HELPER_CLASS_ID && NULL != GetInterface(BHKRIGIDBODYINTERFACE_DESC)) {
+      //   return TRUE;
+      //}
+      if (os.obj->SuperClassID() == HELPER_CLASS_ID && os.obj->ClassID().PartB() == BHKRIGIDBODYCLASS_DESC.PartB() ) {
+         return TRUE;
+      }
+      return FALSE;
+   };
+};
+
+enum { bv_type_none, bv_type_box, bv_type_sphere, bv_type_capsule, bv_type_mesh };  // pblock ID
+
+class bhkRigidBodyModifier : public Modifier, public bhkRigidBodyIfcHelper
+{
+
+public:
+
+	bhkRigidBodyModifier();
+	~bhkRigidBodyModifier();		
+
+   void DeleteThis() { delete this; }
+   void GetClassName(TSTR& s) { s = "bhkRigidBodyModifier"; }  
+   virtual Class_ID ClassID() { return BHKRIGIDBODYMODIFIER_CLASS_ID; }		
+   RefTargetHandle Clone(RemapDir& remap);
+   TCHAR *GetObjectName() { return "bhkRigidBodyModifier"; }
+
+   // From modifier
+	ChannelMask ChannelsUsed()  {return PART_GEOM|PART_TOPO;}
+	ChannelMask ChannelsChanged() {return PART_GEOM;}
+//	ChannelMask ChannelsUsed()  { return 0; }
+//   ChannelMask ChannelsChanged() { return 0; }
+   Class_ID InputType() { return mapObjectClassID; }
+   void ModifyObject (TimeValue t, ModContext &mc, ObjectState *os, INode *node);
+   Interval LocalValidity(TimeValue t) { return GetValidity(t); }
+   Interval GetValidity (TimeValue t);
+   BOOL DependOnTopology(ModContext &mc) { return TRUE; }
+	void NotifyInputChanged(Interval changeInt, PartID partID, RefMessage message, ModContext *mc);
+
+   void BeginEditParams (IObjParam  *ip, ULONG flags,Animatable *prev);
+   void EndEditParams (IObjParam *ip,ULONG flags,Animatable *next);		
+
+	int Display(TimeValue t, INode* inode, ViewExp *vpt, int flagst, ModContext *mc);
+
+
+	void			SelectionSetChanged(Interface *ip,IUtil *iu);
+
+	void			selectionChanged();
+   void        saveState();
+   BOOL			dlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
+
+   // ParamBlock2 access:
+   int NumParamBlocks () { return 1; }
+   IParamBlock2* GetParamBlock(int i) 
+   { 
+      if (i == 0) return pblock;
+      return NULL;
+   }
+   IParamBlock2* GetParamBlockByID(BlockID id) { 
+      if (pblock->ID() == id) return pblock;
+      return NULL; 
+   }
+
+   CreateMouseCallBack* GetCreateMouseCallBack() {return NULL;} 
+
+   virtual	int NumRefs();
+   virtual  RefTargetHandle GetReference(int i);
+   virtual  void SetReference(int i, RefTargetHandle rtarg);
+   virtual  RefResult   NotifyRefChanged(Interval,RefTargetHandle,PartID &,RefMessage);
+
+   int NumSubs() {return 1;}
+   Animatable* SubAnim(int i) { return GetReference(i); }
+   TSTR SubAnimName(int i) {return GetString (IDS_PARAMS);}
+
+   BOOL SetObject(INode *newNode);
+   INode* GetObject();
+
+	void UpdateBVDialogs();
+
+   BaseInterface *GetInterface(Interface_ID id) {
+      if (id == BHKRIGIDBODYINTERFACE_DESC)
+         return this;
+      return Modifier::GetInterface(id);
+   }
+
+public:
+   friend class PickObjectMode;
+
+   StdMat2* collMat;
+	Mesh mesh;
+
+   PickObjectMode *pickObMode;
+	IParamBlock2 *pblock;
+   IParamMap2 *pmapParam;
+	IParamMap2 *pbvParams[4]; //box, sphere, capsule, proxy
+
+	Interface		*mIP;
+   Tab<INode*> mNodes;
+
+	NpComboBox		mCbLayer;
+	NpComboBox		mCbMaterial;
+	NpComboBox		mCbMotionSystem;
+	NpComboBox		mCbQualityType;
+   bhkValidatorClass validator;
+   ICustButton		*iPickButton;
+
+	void enableGUI(BOOL object, BOOL hvk, BOOL anim);		
+};
+
+extern ClassDesc2* GetbhkRigidBodyModifierDesc();
+static ParamBlockDesc2& get_havok_param_blk();
+
+class bhkRigidBodyModifierClassDesc : public ClassDesc2
+{
+	public:
+   bhkRigidBodyModifierClassDesc() {
+      get_havok_param_blk().SetClassDesc(this);
+   }
+	int 			IsPublic() { return TRUE; }
+	void *			Create(BOOL loading = FALSE) { 
+      return new bhkRigidBodyModifier();
+   }
+	const TCHAR *	ClassName() { return GetString(IDS_RB_CLASS_NAME); }
+	SClass_ID		SuperClassID() { return OSM_CLASS_ID; }
+	Class_ID		ClassID() { return BHKRIGIDBODYMODIFIER_CLASS_ID; }
+	const TCHAR* 	Category() { return GetString(IDS_CATEGORY); }
+
+	const TCHAR*	InternalName() { return _T("bhkRigidBodyModifier"); }
+	HINSTANCE		HInstance() { return hInstance; }
+};
+
+
+
+// Parameter and ParamBlock IDs
+enum { havok_params, bv_box, bv_sphere, bv_capsule, bv_mesh};  // pblock ID
+enum { PB_BOUND_TYPE, PB_MESHLIST, };
+enum { havok_params_panel, };
+
+class BVTypePBAccessor : public PBAccessor
+{ 
+public:
+
+	void Set(PB2Value& v, ReferenceMaker* owner, ParamID id, int tabIndex, TimeValue t)    // set from v
+	{
+		bhkRigidBodyModifier* p = (bhkRigidBodyModifier*)owner;
+		switch (id)
+		{
+		case PB_BOUND_TYPE:
+			{
+				switch (v.i)
+				{ 
+            case bv_type_none:
+               // Delete mesh.
+               break;
+
+            case bv_type_box: // Box
+               
+               //BuildBox(mesh,,,)
+               break;
+
+            case bv_type_sphere: // Sphere
+               //BuildSphere();
+               break;
+
+            case bv_type_capsule: // Capsule
+               //BuildScubaMesh();
+               break;
+
+            case bv_type_mesh: 
+               break;
+				}
+			}
+		}
+	}
+};
+
+
+static BVTypePBAccessor bv_type_accessor;
+
+
+static ParamBlockDesc2 havok_param_blk ( 
+   havok_params, _T("BoundingVolumes"),  0, NULL, P_AUTO_CONSTRUCT + P_AUTO_UI + P_MULTIMAP, PBLOCK_REF,
+   //rollout
+   2,
+   havok_params,	IDD_RB_MOD_PANEL,  IDS_PARAMS, 0, 0, NULL, 
+	bv_mesh,			IDD_RB_MOD_PANEL4, IDS_RB_MOD_PANEL4, 0, 0, NULL, 
+
+	PB_BOUND_TYPE, 	_T("boundType"),	TYPE_INT, 0, IDS_BV_BOUNDING_TYPE,
+		p_default, 		0, 
+		p_range, 		0, 4, 
+		p_ui, 			havok_params,	TYPE_RADIO, 5, IDC_RDO_NO_COLL, IDC_RDO_AXIS_ALIGNED_BOX, IDC_RDO_SPHERE, IDC_RDO_CAPSULE, IDC_RDO_PROXY_MESH,
+		p_accessor,		&bv_type_accessor,
+		end,
+
+	PB_MESHLIST,   _T("meshList"),  TYPE_INODE_TAB,		0,	P_AUTO_UI|P_VARIABLE_SIZE,	IDS_MESHLIST,
+		p_ui,       bv_mesh, TYPE_NODELISTBOX, IDC_LIST1,IDC_ADD,0,IDC_REMOVE,
+		end,
+
+#if 0
+   // params
+   PB_RB_LAYER, _T("Layer"), TYPE_INT, 0,	IDS_DS_LAYER,
+      p_default,	NP_DEFAULT_HVK_LAYER,
+   end,
+
+   PB_RB_MATERIAL, _T("Material"), TYPE_INT, 0,	IDS_DS_MATERIAL,
+      p_default,	NP_DEFAULT_HVK_MATERIAL,
+   end,
+
+   PB_RB_MASS, _T("mass"), TYPE_FLOAT, 0,	IDS_DS_MASS,
+      p_default,	NP_DEFAULT_HVK_MASS,
+      p_range,		0.0, 1000.0,
+      p_ui, TYPE_SPINNER, EDITTYPE_UNIVERSE,  IDC_ED_MASS, IDC_SP_MASS, SPIN_AUTOSCALE,
+   end,
+
+   PB_RB_FRICTION, _T("friction"), TYPE_FLOAT, 0,	IDS_DS_FRICTION,
+      p_default,	NP_DEFAULT_HVK_FRICTION,
+      p_range,		0.0, 10.0,
+      p_ui, TYPE_SPINNER, EDITTYPE_UNIVERSE,  IDC_ED_FRICTION, IDC_SP_FRICTION, SPIN_AUTOSCALE,
+   end,
+
+   PB_RB_RESTITUTION, _T("restitution"), TYPE_FLOAT, 0,	IDS_DS_RESTITUTION,
+      p_default,	NP_DEFAULT_HVK_RESTITUTION,
+      p_range,		0.0, 10.0,
+      p_ui, TYPE_SPINNER, EDITTYPE_UNIVERSE,  IDC_ED_RESTITUTION, IDC_SP_RESTITUTION, SPIN_AUTOSCALE,
+   end,
+
+   PB_RB_LINEAR_DAMPING, _T("linear_damping"), TYPE_FLOAT, 0,	IDS_DS_LINEAR_DAMPING,
+      p_default,	NP_DEFAULT_HVK_LINEAR_DAMPING,
+      p_range,		0.0, 10.0,
+      p_ui, TYPE_SPINNER, EDITTYPE_UNIVERSE,  IDC_ED_LINEAR_DAMPING, IDC_SP_LINEAR_DAMPING, SPIN_AUTOSCALE,
+   end,
+
+   PB_RB_ANGULAR_DAMPING, _T("angular_damping"), TYPE_FLOAT, 0,	IDS_DS_ANGULAR_DAMPING,
+      p_default,	NP_DEFAULT_HVK_ANGULAR_DAMPING,
+      p_range,		0.0, 10.0,
+      p_ui, TYPE_SPINNER, EDITTYPE_UNIVERSE,  IDC_ED_ANGULAR_DAMPING, IDC_SP_ANGULAR_DAMPING, SPIN_AUTOSCALE,
+   end,
+
+   PB_RB_MAX_LINEAR_VELOCITY, _T("max_linear_velocity"), TYPE_FLOAT, 0,	IDS_DS_MAX_LINEAR_VELOCITY,
+      p_default,	NP_DEFAULT_HVK_MAX_LINEAR_VELOCITY,
+      p_range,		0.0, 10.0,
+      p_ui, TYPE_SPINNER, EDITTYPE_UNIVERSE,  IDC_ED_MAX_LINEAR_VELOCITY, IDC_SP_MAX_LINEAR_VELOCITY, SPIN_AUTOSCALE,
+   end,
+
+   PB_RB_MAX_ANGULAR_VELOCITY, _T("max_angular_velocity"), TYPE_FLOAT, 0,	IDS_DS_MAX_ANGULAR_VELOCITY,
+      p_default,	NP_DEFAULT_HVK_MAX_ANGULAR_VELOCITY,
+      p_range,		0.0, 10.0,
+      p_ui, TYPE_SPINNER, EDITTYPE_UNIVERSE,  IDC_ED_MAX_ANGULAR_VELOCITY, IDC_SP_MAX_ANGULAR_VELOCITY, SPIN_AUTOSCALE,
+   end,
+
+   PB_RB_PENETRATION_DEPTH, _T("penetration_depth"), TYPE_FLOAT, 0,	IDS_DS_PENETRATION_DEPTH,
+      p_default,	NP_DEFAULT_HVK_PENETRATION_DEPTH,
+      p_range,		0.0, 10.0,
+      p_ui, TYPE_SPINNER, EDITTYPE_UNIVERSE,  IDC_ED_PENETRATION_DEPTH, IDC_SP_PENETRATION_DEPTH, SPIN_AUTOSCALE,
+   end,
+
+   PB_RB_MOTION_SYSTEM, _T("motion_system"), TYPE_INT, 0, IDS_DS_MOTION_SYSTEM,
+      p_default,	NP_DEFAULT_HVK_MOTION_SYSTEM,
+   end,
+
+   PB_RB_QUALITY_TYPE, _T("quality_type"), TYPE_INT, 0,	IDS_DS_QUALITY_TYPE,
+      p_default,	NP_DEFAULT_HVK_QUALITY_TYPE,
+   end,
+#endif
+
+
+   //PB_HK_NODE, 		_T("node"), 		TYPE_INODE, 	0,		IDS_DS_NODE,
+   //   p_ui, 			TYPE_PICKNODEBUTTON,    IDC_PICK_NODE, 
+   //   p_prompt,      IDS_PICKNODE_PROMPT,
+   //   //p_validator, &validator,
+   end,
+   end
+   );
+
+static bhkRigidBodyModifierClassDesc bhkRigidBodyModifierDesc;
+ClassDesc2* GetbhkRigidBodyModifierDesc() { return &bhkRigidBodyModifierDesc; }
+ParamBlockDesc2& get_havok_param_blk() {
+   return havok_param_blk;
+}
+
+
+class PickObjectMode : 
+   public PickModeCallback,
+   public PickNodeCallback {
+public:		
+   bhkRigidBodyModifier *mod;
+
+   BOOL HitTest(IObjParam *ip,HWND hWnd,ViewExp *vpt,IPoint2 m,int flags);
+   BOOL Pick(IObjParam *ip,ViewExp *vpt);
+   void EnterMode(IObjParam *ip);
+   void ExitMode(IObjParam *ip);
+   BOOL RightClick(IObjParam *ip,ViewExp *vpt)	{return TRUE;}
+   BOOL Filter(INode *node);		
+   PickNodeCallback *GetFilter() {return this;}
+};
+
+//--- PickObjectMode ------------------------------------------------
+
+BOOL PickObjectMode::Filter(INode *node)
+{
+   if (node) {
+      node->BeginDependencyTest();
+      mod->NotifyDependents(FOREVER,0,REFMSG_TEST_DEPENDENCY);
+      if (node->EndDependencyTest()) {		
+         return FALSE;
+      } 
+      ////added code for looptest
+      //if (node->TestForLoop(FOREVER,(ReferenceMaker *) mod)!=REF_SUCCEED)
+      //   return FALSE;
+
+      for (int i = 0;i < mod->pblock->Count(PB_MESHLIST); i++) {
+         INode *tnode = NULL;
+         mod->pblock->GetValue(PB_MESHLIST,0,tnode,FOREVER,i);	
+         if  (node == tnode)
+            return FALSE;
+      }
+
+      ObjectState os = node->EvalWorldState(0);
+      //added code such that lines are not selected
+      if ( (os.obj->IsSubClassOf(triObjectClassID) || os.obj->CanConvertToType(triObjectClassID))
+         && (os.obj->SuperClassID() != SHAPE_CLASS_ID) 
+         ) 
+      {			
+         return TRUE;
+      }
+      if (os.obj->SuperClassID() == HELPER_CLASS_ID && os.obj->ClassID().PartB() == BHKRIGIDBODYCLASS_DESC.PartB() ) {
+         return TRUE;
+      }
+   }
+   return FALSE;
+}
+
+BOOL PickObjectMode::HitTest(
+                             IObjParam *ip,HWND hWnd,ViewExp *vpt,IPoint2 m,int flags)
+{
+   INode *node = mod->mIP->PickNode(hWnd,m, this);	//added "this" argument such that the Filter above is used
+   return node?TRUE:FALSE;
+}
+
+BOOL PickObjectMode::Pick(IObjParam *ip,ViewExp *vpt)
+{
+   BOOL rv = FALSE;
+   if (INode *node = vpt->GetClosestHit()) {
+      theHold.Begin();
+      ObjectState os = node->EvalWorldState(0);
+      if (os.obj->CanConvertToType(triObjectClassID)) {
+         mod->pblock->Append(PB_MESHLIST,1,&node,1);
+         rv = TRUE;
+      }
+      theHold.Accept(GetString(IDS_ADD_MESH));
+   }
+   return rv;
+}
+
+void PickObjectMode::EnterMode(IObjParam *ip)
+{mod->iPickButton->SetCheck(TRUE);}
+
+void PickObjectMode::ExitMode(IObjParam *ip)
+{mod->iPickButton->SetCheck(FALSE);}
+
+static PickObjectMode thePickMode;
+
+class bhkRigidBodyModifierDlgProc : public ParamMap2UserDlgProc {
+public:
+   bhkRigidBodyModifier *mod;
+   bhkRigidBodyModifierDlgProc(bhkRigidBodyModifier* m) {mod = m;}		
+   BOOL DlgProc(TimeValue t,IParamMap2 *map,HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam);		
+   void DeleteThis() {delete this;}		
+};
+
+BOOL bhkRigidBodyModifierDlgProc::DlgProc (TimeValue t,IParamMap2 *map,HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
+{
+   switch (msg) 
+   {
+   case WM_INITDIALOG:
+      //mod->iPickButton = GetICustButton(GetDlgItem(hWnd, IDC_ADD));
+      //mod->iPickButton->SetType(CBT_CHECK);
+      //mod->iPickButton->SetHighlightColor(GREEN_WASH);
+      break;
+
+   case WM_DESTROY:
+      if (mod && mod->iPickButton != NULL) {
+         ReleaseICustButton(mod->iPickButton);
+         mod->iPickButton = NULL;
+      }
+      break;
+
+   case WM_COMMAND:
+      switch (LOWORD(wParam))
+      {
+      case IDC_ADD:
+         {
+            thePickMode.mod = mod;
+            GetCOREInterface()->SetPickMode(&thePickMode);
+            break;
+         }
+      }
+      break;
+
+   default:
+      return FALSE;
+   }
+
+   return TRUE;
+}
+
+//--- bhkRigidBodyModifier -------------------------------------------------------
+
+bhkRigidBodyModifier::bhkRigidBodyModifier()
+{
+	mIP = NULL;	
+	pblock = NULL;
+   pmapParam = NULL;
+   pickObMode = NULL;
+   validator.mod = this;
+   iPickButton = NULL;
+   bhkRigidBodyModifierDesc.MakeAutoParamBlocks(this);
+
+   collMat = NewDefaultStdMat();
+   collMat->SetDiffuse(Color(1.0f, 0.0f, 0.0f), 0);
+   collMat->SetWire(TRUE);
+}
+
+bhkRigidBodyModifier::~bhkRigidBodyModifier()
+{
+   havok_param_blk.SetUserDlgProc();
+#if 0
+   if (NULL != pickObMode) {
+      delete pickObMode;
+      pickObMode = NULL;
+   }
+#endif
+   if (pmapParam) {
+      DestroyCPParamMap2 (pmapParam);
+      pmapParam = NULL;
+   }
+}
+
+RefTargetHandle bhkRigidBodyModifier::Clone(RemapDir& remap) {
+   bhkRigidBodyModifier *mod = new bhkRigidBodyModifier();
+   mod->ReplaceReference(0,remap.CloneRef(GetReference(0)));
+   mod->ReplaceReference(1,remap.CloneRef(GetReference(1)));
+   BaseClone(this, mod, remap);
+   return mod;
+}
+
+
+int bhkRigidBodyModifier::NumRefs()
+{
+   return 2;
+}
+
+RefTargetHandle bhkRigidBodyModifier::GetReference(int i)
+{
+   if (i==0) return pblock;
+   if (i==1) return GetRBBlock();
+   return NULL;
+}
+
+void bhkRigidBodyModifier::SetReference(int i, RefTargetHandle rtarg)
+{
+   if (i==0) pblock = (IParamBlock2*)rtarg;
+}
+
+RefResult bhkRigidBodyModifier::NotifyRefChanged(
+   Interval changeInt, 
+   RefTargetHandle hTarget, 
+   PartID& partID, 
+   RefMessage message)
+{
+   switch (message) 
+   {
+   case REFMSG_CHANGE:
+      ParamID changing_param = pblock->LastNotifyParamID();
+      havok_param_blk.InvalidateUI(changing_param);
+      if (changing_param == PB_MESHLIST)
+      {
+         if (partID == PART_TOPO) {
+            NotifyDependents(FOREVER,GEOM_CHANNEL,REFMSG_CHANGE);
+         }
+      }
+      break;
+   }
+   return REF_SUCCEED;
+}
+
+Interval bhkRigidBodyModifier::GetValidity (TimeValue t) {
+   Interval ret = FOREVER;
+   pblock->GetValidity (t, ret);
+   return ret;
+}
+
+void bhkRigidBodyModifier::ModifyObject (TimeValue t, ModContext &mc, ObjectState *os, INode *inode) 
+{
+OutputDebugString("bhkRigidBodyModifier::ModifyObject\n");
+
+	Box3 box; box.Init();
+   if (TriObject *tri = (TriObject *)os->obj->ConvertToType(t, Class_ID(TRIOBJ_CLASS_ID, 0)))
+   {
+      CalcAxisAlignedBox(tri->GetMesh(), box);
+      BuildBox(mesh, box.Max().x-box.Min().x, box.Max().y-box.Min().y, box.Max().z-box.Min().z);
+   }
+   //Modifier::ModifyObject(t, mc, os, inode);
+}
+void bhkRigidBodyModifier::NotifyInputChanged(Interval changeInt, PartID partID, RefMessage message, ModContext *mc)
+{
+	OutputDebugString("bhkRigidBodyModifier::NotifyInputChanged\n");
+   Modifier::NotifyInputChanged(changeInt, partID, message, mc);
+
+}
+
+struct ParamMapInfo
+{
+	MapID mapid;
+	DWORD idd;
+	DWORD ids;
+};
+static ParamMapInfo pminfo[] = {
+	{bv_box,		IDD_RB_MOD_PANEL1,	IDS_RB_MOD_PANEL1},
+	{bv_sphere,	IDD_RB_MOD_PANEL2,	IDS_RB_MOD_PANEL2},
+	{bv_capsule,IDD_RB_MOD_PANEL3,	IDS_RB_MOD_PANEL3},
+	{bv_mesh,	IDD_RB_MOD_PANEL4,	IDS_RB_MOD_PANEL4},
+};
+
+void bhkRigidBodyModifier::UpdateBVDialogs()
+{
+	//if (NULL != pmapParam)
+	//{
+	//	int bvType = pblock2->GetInt(PB_BOUND_TYPE);
+	//	if (bvType > 0) // none
+	//	{
+	//		int adjBvType = bvType - 1; //adjusted bvtype (ignoring none).
+	//		for (int i=0; i<_countof(pminfo), ++i){
+	//			if (pbvParams[i] != NULL && adjBvType != i)  {
+	//				DestroyCPParamMap2( pbvParams[i] );
+	//				pbvParams[i] = 0;
+	//			}
+	//		}
+	//		Interface *ifc = GetCOREInterface();
+	//		if (pbvParams[adjBvType] == NULL) {
+	//			pbvParams[adjBvType] = CreateCPParamMap2( pminfo[adjBvType], pblock2, ifc, hInstance, 
+	//				MAKEINTRESOURCE(pminfo[adjBvType]), GetString([adjBvType]), 0);
+	//		}
+	//	}
+	//}
+	//else
+	//{
+	//	// hide em all
+	//	for (int i=0; i<_countof(pminfo), ++i){
+	//		if (pbvParams[i] != NULL)  {
+	//			DestroyCPParamMap2( pbvParams[i] );
+	//			pbvParams[i] = 0;
+	//		}
+	//	}
+	//}
+}
+
+void bhkRigidBodyModifier::BeginEditParams(IObjParam  *ip, ULONG flags,Animatable *prev)
+{
+   Modifier::BeginEditParams(ip, flags, prev);
+	mIP = ip;
+
+   TimeValue t = ip->GetTime();
+   NotifyDependents(Interval(t,t), PART_ALL, REFMSG_BEGIN_EDIT);
+   NotifyDependents(Interval(t,t), PART_ALL, REFMSG_MOD_DISPLAY_ON);
+   SetAFlag(A_MOD_BEING_EDITED);
+   
+   bhkRigidBodyModifierDesc.BeginEditParams(ip,this,flags,prev);
+   //havok_param_blk.SetUserDlgProc(bv_mesh, new bhkRigidBodyModifierDlgProc(this));
+
+	pmapParam = pblock->GetMap(havok_params);
+	UpdateBVDialogs();
+	//pmapParam->GetIRollup()->Hide(1);
+	//pmapParam->GetIRollup()->Hide(3);
+
+   BeginEditRBParams(ip, flags, prev);
+
+   mNodes.ZeroCount();
+}
+	
+void bhkRigidBodyModifier::EndEditParams (IObjParam *ip,ULONG flags,Animatable *next)
+{
+   Modifier::EndEditParams(ip,flags,next);
+   //saveState();
+   mNodes.ZeroCount();
+	mIP = NULL;
+
+   // NOTE: This flag must be cleared before sending the REFMSG_END_EDIT
+   ClearAFlag(A_MOD_BEING_EDITED);
+   TimeValue t = ip->GetTime();
+   NotifyDependents(Interval(t,t), PART_ALL, REFMSG_END_EDIT);
+   NotifyDependents(Interval(t,t), PART_ALL, REFMSG_MOD_DISPLAY_OFF);
+
+   havok_param_blk.SetUserDlgProc();
+
+   if (flags&END_EDIT_REMOVEUI) {
+		pmapParam = NULL;
+		UpdateBVDialogs();
+	}
+
+   if (iPickButton != NULL) {
+      ReleaseICustButton(iPickButton);
+      iPickButton = NULL;
+   }
+
+   // For PB2 we ask the ClassDesc2 to take care of the EndEditParams - NH
+   bhkRigidBodyModifierDesc.EndEditParams(ip,this,flags,next);
+   EndEditRBParams(ip, flags, next);
+}
+
+class CollisionWireMtl: public Material 
+{
+public:
+   CollisionWireMtl();
+};
+static CollisionWireMtl swMtl;
+CollisionWireMtl::CollisionWireMtl():Material() 
+{	
+   Ks[0] = Kd[0] = 1.0f;
+   Ks[1] = Kd[1] = 0.0f;
+   Ks[2] = Kd[2] = 0.0f;
+   shininess = (float)0.0;
+   shadeLimit = GW_WIREFRAME|GW_BACKCULL;
+   selfIllum = (float)1.0;
+}
+
+int bhkRigidBodyModifier::Display(TimeValue t, INode* inode, ViewExp *vpt, int flagst, ModContext *mc)
+{
+   //OutputDebugString("bhkRigidBodyModifier::Display\n");
+   if (!Modifier::IsEnabled())
+      return 0;
+
+	Matrix3 m;
+	GraphicsWindow *gw = vpt->getGW();
+
+   int wrgb = inode->GetWireColor();
+   inode->SetWireColor( RGB(255,0,0) );
+
+   Material *mtl = &swMtl;
+   //gw->setTransform(mat);
+   if (inode->Selected()) 
+      gw->setColor( LINE_COLOR, GetSelColor());
+   else if(!inode->IsFrozen())
+      gw->setColor(LINE_COLOR,GetUIColor(COLOR_SPACE_WARPS));
+
+	m = inode->GetObjectTM(t);
+	gw->setTransform(m);
+	DWORD rlim = gw->getRndLimits();
+	gw->setRndLimits(GW_WIREFRAME|GW_EDGES_ONLY/*|GW_Z_BUFFER*/);
+
+	//UpdateMesh(t);
+   gw->setMaterial(swMtl);
+   gw->setColor(LINE_COLOR, 1.0f, 0.0f, 0.0f);
+   gw->setColor(FILL_COLOR, 1.0f, 0.0f, 0.0f);
+	mesh.render( gw, mtl, NULL, COMP_ALL);	
+
+   inode->SetWireColor(wrgb);
+	gw->setRndLimits(rlim);
+
+	return 0;
+}
\ No newline at end of file
diff --git a/NifProps/bhkSphereObj.cpp b/NifProps/bhkSphereObj.cpp
index 9971cb548b497ee0312980a6c6698e56d3c93428..f0ac610f62a67db25959e9b78c58999caed858de 100644
--- a/NifProps/bhkSphereObj.cpp
+++ b/NifProps/bhkSphereObj.cpp
@@ -22,20 +22,22 @@ HISTORY:
 #include "notify.h"
 #include "macroRec.h"
 #include "bhkRigidBodyInterface.h"
+#include "NifGui.h"
+#include "NifStrings.h"
+
 #ifndef _countof
 #define _countof(x) (sizeof(x)/sizeof((x)[0]))
 #endif
 
-const Class_ID bhkSphereObject_CLASS_ID = Class_ID(0x8d532427, 0x8b4c64c7);
+const Class_ID bhkSphereObject_CLASS_ID = Class_ID(0x8d532427, BHKRIGIDBODYCLASS_DESC.PartB());
+
+extern void BuildSphere(Mesh&mesh, float radius, int segs=32, int smooth=1, float startAng = 0.0f);
 
-class bhkSphereObject : public SimpleObject, public IParamArray, public bhkRigidBodyIfcHelper
+class bhkSphereObject : public SimpleObject2
 {
 public:			
    // Class vars
-   static IParamMap *pmapParam;
-   static int dlgSegments;
-   static int dlgSmooth;
-   static float crtRadius;
+   static IParamMap2 *pmapParam;
    static IObjParam *ip;
 
    bhkSphereObject(BOOL loading);		
@@ -60,27 +62,17 @@ public:
    Class_ID ClassID() { return bhkSphereObject_CLASS_ID; } 
    SClass_ID SuperClassID() { return HELPER_CLASS_ID; }
 
-   // From ReferenceTarget
-   IOResult Load(ILoad *iload);
-   IOResult Save(ISave *isave);
-
-   // From ref
-   int NumRefs() {return 2;}
-   RefTargetHandle GetReference(int i);
-   void SetReference(int i, RefTargetHandle rtarg);
+   int	NumParamBlocks() { return 1; }					// return number of ParamBlocks in this instance
+   IParamBlock2* GetParamBlock(int i) { return pblock2; } // return i'th ParamBlock
+   IParamBlock2* GetParamBlockByID(BlockID id) { return (pblock2->ID() == id) ? pblock2 : NULL; } // return id'd ParamBlock
 
    // From SimpleObject
    void BuildMesh(TimeValue t);
    BOOL OKtoDisplay(TimeValue t);
    void InvalidateUI();
-   ParamDimension *GetParameterDim(int pbIndex);
-   TSTR GetParameterName(int pbIndex);		
 
-   void SetParams(float rad, int segs, BOOL smooth=TRUE);
    void UpdateUI();
-
-   BaseInterface* GetInterface(Interface_ID id);
-
+   int Display(TimeValue t, INode* inode, ViewExp *vpt, int flags);
 };
 
 
@@ -94,121 +86,107 @@ public:
 #define MIN_SMOOTH		0
 #define MAX_SMOOTH		1
 
-#define DEF_SEGMENTS	32	// 16
-#define DEF_RADIUS		float(0.0)
-
-#define SMOOTH_ON	1
-#define SMOOTH_OFF	0
-
-#define MIN_SLICE	float(-1.0E30)
-#define MAX_SLICE	float( 1.0E30)
-
 
 //--- ClassDescriptor and class vars ---------------------------------
 
-static BOOL sInterfaceAdded = FALSE;
-
 // The class descriptor for sphere
 class bhkSphereClassDesc : public ClassDesc2 
 {
 public:
+   bhkSphereClassDesc();
    int 			   IsPublic() { return 1; }
    void *			Create(BOOL loading = FALSE)
    {
-      AddInterface (GetbhkRigidBodyInterfaceDesc());
       return new bhkSphereObject(loading);
    }
    const TCHAR *	ClassName() { return GetString(IDS_RB_SPHERE_CLASS); }
    SClass_ID		SuperClassID() { return HELPER_CLASS_ID; }
    Class_ID		   ClassID() { return bhkSphereObject_CLASS_ID; }
    const TCHAR* 	Category() { return "NifTools"; }
-   void			   ResetClassParams(BOOL fileReset);
+
+   const TCHAR*	InternalName() { return _T("bhkSphere"); }	// returns fixed parsable name (scripter-visible name)
+   HINSTANCE		HInstance() { return hInstance; }			// returns owning module handle
 };
 
-static bhkSphereClassDesc sphereDesc;
-extern ClassDesc2* GetbhkSphereDesc() { return &sphereDesc; }
+extern ClassDesc2* GetbhkSphereDesc();
+
+class SphereObjCreateCallBack : public CreateMouseCallBack {
+   IPoint2 sp0;
+   bhkSphereObject *ob;
+   Point3 p0;
+public:
+   int proc( ViewExp *vpt,int msg, int point, int flags, IPoint2 m, Matrix3& mat);
+   void SetObj(bhkSphereObject *obj) {ob = obj;}
+};
+static SphereObjCreateCallBack sphereCreateCB;
 
 // in prim.cpp  - The dll instance handle
 extern HINSTANCE hInstance;
 
-int bhkSphereObject::dlgSegments       = DEF_SEGMENTS;
-int bhkSphereObject::dlgSmooth         = SMOOTH_ON;
-IParamMap *bhkSphereObject::pmapParam  = NULL;
+IParamMap2 *bhkSphereObject::pmapParam  = NULL;
 IObjParam *bhkSphereObject::ip         = NULL;
-float bhkSphereObject::crtRadius       = 0.0f;
-
-void bhkSphereClassDesc::ResetClassParams(BOOL fileReset)
-{
-   bhkSphereObject::dlgSegments    = DEF_SEGMENTS;
-   bhkSphereObject::dlgSmooth      = SMOOTH_ON;
-   bhkSphereObject::crtRadius      = 0.0f;
-}
 
 
 //--- Parameter map/block descriptors -------------------------------
 
+enum { sphere_params, };
+
 // Parameter block indices
 enum SphereParamIndicies
 {
-   PB_RADIUS = 0,
-   PB_SEGS = 1,
-   PB_SMOOTH = 2,
+   PB_MATERIAL,
+   PB_RADIUS,
+   PB_SEGS,
+   PB_SMOOTH,
 };
 
+enum { box_params_panel, };
 
-//
-//
-// Parameters
+static ParamBlockDesc2 param_blk ( 
+    sphere_params, _T("bhkSphereParameters"),  0, NULL, P_AUTO_CONSTRUCT|P_AUTO_UI, 0,
+    //rollout
+    IDD_SPHEREPARAM2, IDS_PARAMS, 0, 0, NULL, 
 
-static ParamUIDesc descParam[] = {
-   // Radius
-   ParamUIDesc(
-   PB_RADIUS,
-   EDITTYPE_UNIVERSE,
-   IDC_RADIUS,IDC_RADSPINNER,
-   MIN_RADIUS,MAX_RADIUS,
-   SPIN_AUTOSCALE),	
+    // params
+    PB_MATERIAL, _T("material"), TYPE_INT, P_ANIMATABLE,	IDS_DS_MATERIAL,
+       p_default,	NP_DEFAULT_HVK_MATERIAL,
+       end,
 
-   // Segments
-   ParamUIDesc(
-   PB_SEGS,
-   EDITTYPE_INT,
-   IDC_SEGMENTS,IDC_SEGSPINNER,
-   (float)MIN_SEGMENTS,(float)MAX_SEGMENTS,
-   0.1f),
+    PB_RADIUS, _T("radius"), TYPE_FLOAT, P_ANIMATABLE,	IDS_RB_RADIUS,
+       p_default,	   0.0,
+       p_range,		float(0), float(1.0E30),
+       p_ui, TYPE_SPINNER, EDITTYPE_UNIVERSE, IDC_RADIUS, IDC_RADSPINNER, SPIN_AUTOSCALE,
+       end,
 
-   // Smooth
-   ParamUIDesc(PB_SMOOTH,TYPE_SINGLECHEKBOX,IDC_OBSMOOTH),
-};
-const int PARAMDESC_LENGTH = _countof(descParam);
+    PB_SEGS, _T("segments"), TYPE_INT, P_ANIMATABLE,	IDS_RB_SEGS,
+       p_default,	   32,
+       p_range,		MIN_SEGMENTS, MAX_SEGMENTS,
+       p_ui, TYPE_SPINNER, EDITTYPE_POS_INT, IDC_SEGMENTS, IDC_SEGSPINNER, 1.0f,
+       end,
 
-static ParamBlockDescID descVer0[] = {
-   { TYPE_FLOAT, NULL, TRUE, 0 },		
-   { TYPE_INT, NULL, TRUE, 1 },
-   { TYPE_INT, NULL, TRUE, 2 } 
-};
-const int PBLOCK_LENGTH = _countof(descVer0);
-static ParamBlockDescID *curDescVer = descVer0;
-
-// Array of old versions
-//static ParamVersionDesc versions[] = {
-//   ParamVersionDesc(descVer0,_countof(descVer0),0),
-//};
-//const int NUM_OLDVERSIONS = _countof(versions);
-static ParamVersionDesc* versions = NULL;
-const int NUM_OLDVERSIONS = 0;
-
-// Current version
-const int CURRENT_VERSION = NUM_OLDVERSIONS + 1;
-static ParamVersionDesc curVersion(descVer0,_countof(descVer0),CURRENT_VERSION);
-
-class SphereParamDlgProc : public ParamMapUserDlgProc {
+    PB_SMOOTH, _T("smooth"), TYPE_INT, P_ANIMATABLE,	IDS_RB_SMOOTH,
+       p_default,	   TRUE,
+       p_ui, TYPE_SINGLECHEKBOX, IDC_OBSMOOTH,
+       end,
+
+    end
+    );
+
+// static ClassDesc must be declared after static paramblock
+static bhkSphereClassDesc sphereDesc;
+extern ClassDesc2* GetbhkSphereDesc() { return &sphereDesc; }
+bhkSphereClassDesc::bhkSphereClassDesc() {
+   param_blk.SetClassDesc(this);
+}
+
+class SphereParamDlgProc : public ParamMap2UserDlgProc {
 public:
    bhkSphereObject *so;
    HWND thishWnd;
+   NpComboBox		mCbMaterial;
 
    SphereParamDlgProc(bhkSphereObject *s) {so=s;thishWnd=NULL;}
-   BOOL DlgProc(TimeValue t,IParamMap *map,HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam);
+   BOOL DlgProc(TimeValue t,IParamMap2 *map,HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam);
    void Update(TimeValue t);
    void DeleteThis() {delete this;}
 
@@ -229,20 +207,34 @@ void SphereParamDlgProc::Update(TimeValue t)
    return;
 }
 
-BOOL SphereParamDlgProc::DlgProc(TimeValue t,IParamMap *map,HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
+BOOL SphereParamDlgProc::DlgProc(TimeValue t,IParamMap2 *map,HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
 {
    thishWnd=hWnd;
    switch (msg) 
    {
    case WM_INITDIALOG: 
       {
+         mCbMaterial.init(GetDlgItem(hWnd, IDC_CB_MATERIAL));
+         for (const char **str = NpHvkMaterialNames; *str; ++str)
+            mCbMaterial.add(*str);
+
+         int sel = NP_DEFAULT_HVK_MATERIAL;
+         Interval valid;
+         so->pblock2->GetValue( PB_MATERIAL, 0, sel, valid);
+         mCbMaterial.select( sel );
+
          Update(t);
          break;
       }
    case WM_COMMAND:
-      //switch (LOWORD(wParam)) 
-      //{
-      //}
+      switch (LOWORD(wParam)) 
+      {
+      case IDC_CB_MATERIAL:
+         if (HIWORD(wParam)==CBN_SELCHANGE) {
+            so->pblock2->SetValue( PB_MATERIAL, 0, mCbMaterial.selection() );
+         }
+         break;
+      }
       break;	
    }
    return FALSE;
@@ -254,138 +246,83 @@ BOOL SphereParamDlgProc::DlgProc(TimeValue t,IParamMap *map,HWND hWnd,UINT msg,W
 bhkSphereObject::bhkSphereObject(BOOL loading)
 {
    SetAFlag(A_PLUGIN1);
-   ReplaceReference(0, CreateParameterBlock(curDescVer, PBLOCK_LENGTH, CURRENT_VERSION));
-   assert(pblock);
-   ReplaceReference(1, GetRBBlock());
-
-   pblock->SetValue(PB_RADIUS,0,crtRadius);
-   pblock->SetValue(PB_SMOOTH,0,dlgSmooth);
-   pblock->SetValue(PB_SEGS,0,dlgSegments);	
+   sphereDesc.MakeAutoParamBlocks(this);
+   assert(pblock2);
 }
 
 bhkSphereObject::~bhkSphereObject() {
-}
-
-#define NEWMAP_CHUNKID	0x0100
-
-IOResult bhkSphereObject::Load(ILoad *iload) 
-{
-   ClearAFlag(A_PLUGIN1);
-
-   IOResult res;
-   while (IO_OK==(res=iload->OpenChunk())) 
-   {
-      switch (iload->CurChunkID()) 
-      {	
-      case NEWMAP_CHUNKID:
-         SetAFlag(A_PLUGIN1);
-         break;
-      }
-      iload->CloseChunk();
-      if (res!=IO_OK)  return res;
-   }
-   return IO_OK;
-}
-
-IOResult bhkSphereObject::Save(ISave *isave)
-{
-   if (TestAFlag(A_PLUGIN1)) {
-      isave->BeginChunk(NEWMAP_CHUNKID);
-      isave->EndChunk();
+   param_blk.SetUserDlgProc();
+   sphereCreateCB.SetObj(NULL);
+   if (pmapParam) {
+      pmapParam  = NULL;
    }
-   return IO_OK;
 }
 
-RefTargetHandle bhkSphereObject::GetReference(int i) 
-{
-   if (i == 1) 
-      return GetRBBlock();
-   return pblock;
-}
-
-void bhkSphereObject::SetReference(int i, RefTargetHandle rtarg) 
-{
-   if (i == 1)
-      return;
-   pblock=(IParamBlock*)rtarg;
-}
-
-BaseInterface* bhkSphereObject::GetInterface(Interface_ID id)
-{
-   if (id == BHKRIGIDBODYINTERFACE_DESC)
-      return this;
-   return SimpleObject::GetInterface(id);
-}
-
-
-
 void bhkSphereObject::BeginEditParams(IObjParam *ip,ULONG flags,Animatable *prev)
 {
    SimpleObject::BeginEditParams(ip,flags,prev);
 
    // Gotta make a new one.
-   if (NULL == pmapParam) 
-   {
-      pmapParam = CreateCPParamMap(
-         descParam,PARAMDESC_LENGTH,
-         pblock,
-         ip,
-         hInstance,
-         MAKEINTRESOURCE(IDD_SPHEREPARAM2),
-         GetString(IDS_RB_PARAMETERS),
-         0);
-   }
+   //if (NULL == pmapParam) 
+   //{
+   //   pmapParam = CreateCPParamMap2(
+   //      0,
+   //      pblock2,
+   //      GetCOREInterface(),
+   //      hInstance,
+   //      MAKEINTRESOURCE(IDD_SPHEREPARAM2),
+   //      GetString(IDS_RB_PARAMETERS),
+   //      0);
+   //}
    this->ip = ip;
-
-   if(pmapParam) {
-      // A callback for the type in.
-      pmapParam->SetUserDlgProc(new SphereParamDlgProc(this));
-   }
-   BeginEditRBParams(ip, flags, prev);
+   sphereDesc.BeginEditParams(ip,this,flags,prev);
+   param_blk.SetUserDlgProc(new SphereParamDlgProc(this));
+   pmapParam = pblock2->GetMap(sphere_params);
+   //if(pmapParam) {
+   //   // A callback for the type in.
+   //   pmapParam->SetUserDlgProc(new SphereParamDlgProc(this));
+   //}
 }
 
 void bhkSphereObject::EndEditParams( IObjParam *ip, ULONG flags,Animatable *next )
 {		
+   param_blk.SetUserDlgProc();
+
    SimpleObject::EndEditParams(ip,flags,next);
    this->ip = NULL;
-
-   if (flags&END_EDIT_REMOVEUI ) {
-      DestroyCPParamMap(pmapParam);
-      pmapParam  = NULL;
-   }
-   EndEditRBParams(ip, flags, next);
-
-   // Save these values in class variables so the next object created will inherit them.
-   pblock->GetValue(PB_SEGS,ip->GetTime(),dlgSegments,FOREVER);
-   pblock->GetValue(PB_SMOOTH,ip->GetTime(),dlgSmooth,FOREVER);	
+   pmapParam = NULL;
+
+   //if (pmapParam && flags&END_EDIT_REMOVEUI ) {
+   //   DestroyCPParamMap2(pmapParam);
+   //   pmapParam  = NULL;
+   //}
+   // tear down the appropriate auto-rollouts
+   sphereDesc.EndEditParams(ip, this, flags, next);
 }
 
-void bhkSphereObject::SetParams(float rad, int segs, BOOL smooth)
+void bhkSphereObject::BuildMesh(TimeValue t)
 {
-   pblock->SetValue(PB_RADIUS,0, rad);				
-   pblock->SetValue(PB_SEGS,0, segs);				
-   pblock->SetValue(PB_SMOOTH,0, smooth);				
-}			   
+   float radius; int segs; int smooth;
+   float startAng = 0.0f;
+   if (TestAFlag(A_PLUGIN1)) startAng = HALFPI;
 
-void bhkSphereObject::BuildMesh(TimeValue t)
+   // Start the validity interval at forever and whittle it down.
+   ivalid = FOREVER;
+   pblock2->GetValue(PB_RADIUS, t, radius, ivalid);
+   pblock2->GetValue(PB_SEGS, t, segs, ivalid);
+   pblock2->GetValue(PB_SMOOTH, t, smooth, ivalid);
+   BuildSphere(mesh, radius, segs, smooth, startAng);
+}
+
+extern void BuildSphere(Mesh&mesh, float radius, int segs, int smooth, float startAng)
 {
    Point3 p;	
    int ix,na,nb,nc,nd,jx,kx;
    int nf=0,nv=0;
    float delta, delta2;
    float a,alt,secrad,secang,b,c;
-   int segs, smooth;
-   float radius;
    float hemi = 0.0f;
-   BOOL genUVs = TRUE;
-   float startAng = 0.0f;
-   if (TestAFlag(A_PLUGIN1)) startAng = HALFPI;
 
-   // Start the validity interval at forever and whittle it down.
-   ivalid = FOREVER;
-   pblock->GetValue(PB_RADIUS, t, radius, ivalid);
-   pblock->GetValue(PB_SEGS, t, segs, ivalid);
-   pblock->GetValue(PB_SMOOTH, t, smooth, ivalid);
    LimitValue(segs, MIN_SEGMENTS, MAX_SEGMENTS);
    LimitValue(smooth, MIN_SMOOTH, MAX_SMOOTH);
    LimitValue(radius, MIN_RADIUS, MAX_RADIUS);
@@ -504,15 +441,6 @@ void bhkSphereObject::GetCollapseTypes(Tab<Class_ID> &clist,Tab<TSTR*> &nlist)
    Object::GetCollapseTypes(clist, nlist);
 }
 
-class SphereObjCreateCallBack : public CreateMouseCallBack {
-   IPoint2 sp0;
-   bhkSphereObject *ob;
-   Point3 p0;
-public:
-   int proc( ViewExp *vpt,int msg, int point, int flags, IPoint2 m, Matrix3& mat);
-   void SetObj(bhkSphereObject *obj) {ob = obj;}
-};
-
 int SphereObjCreateCallBack::proc(ViewExp *vpt,int msg, int point, int flags, IPoint2 m, Matrix3& mat ) 
 {
    float r;
@@ -528,7 +456,14 @@ int SphereObjCreateCallBack::proc(ViewExp *vpt,int msg, int point, int flags, IP
       switch(point) 
       {
       case 0:  // only happens with MOUSE_POINT msg
-         ob->pblock->SetValue(PB_RADIUS,0,0.0f);
+         // Find the node and plug in the wire color
+         {
+            ULONG handle;
+            ob->NotifyDependents(FOREVER, (PartID)&handle, REFMSG_GET_NODE_HANDLE);
+            INode *node = GetCOREInterface()->GetINodeByHandle(handle);
+            if (node) node->SetWireColor(RGB(255, 0, 0));
+         }
+         ob->pblock2->SetValue(PB_RADIUS,0,0.0f);
          ob->suspendSnap = TRUE;				
          sp0 = m;
          p0 = vpt->SnapPoint(m,m,NULL,SNAP_IN_3D);
@@ -541,7 +476,7 @@ int SphereObjCreateCallBack::proc(ViewExp *vpt,int msg, int point, int flags, IP
          r = Length(p1-p0);
          mat.SetTrans(p0);
 
-         ob->pblock->SetValue(PB_RADIUS,0,r);
+         ob->pblock2->SetValue(PB_RADIUS,0,r);
          ob->pmapParam->Invalidate();
 
          if (flags&MOUSE_CTRL) 
@@ -567,8 +502,6 @@ int SphereObjCreateCallBack::proc(ViewExp *vpt,int msg, int point, int flags, IP
       return TRUE;
 }
 
-static SphereObjCreateCallBack sphereCreateCB;
-
 CreateMouseCallBack* bhkSphereObject::GetCreateMouseCallBack() 
 {
    sphereCreateCB.SetObj(this);
@@ -579,7 +512,7 @@ CreateMouseCallBack* bhkSphereObject::GetCreateMouseCallBack()
 BOOL bhkSphereObject::OKtoDisplay(TimeValue t) 
 {
    float radius;
-   pblock->GetValue(PB_RADIUS,t,radius,FOREVER);
+   pblock2->GetValue(PB_RADIUS,t,radius,FOREVER);
    if (radius==0.0f) return FALSE;
    else return TRUE;
 }
@@ -588,14 +521,14 @@ BOOL bhkSphereObject::OKtoDisplay(TimeValue t)
 int bhkSphereObject::IntersectRay(TimeValue t, Ray& ray, float& at, Point3& norm)
 {
    int smooth;
-   pblock->GetValue(PB_SMOOTH,t,smooth,FOREVER);
+   pblock2->GetValue(PB_SMOOTH,t,smooth,FOREVER);
 
    float r;
    float a, b, c, ac4, b2, at1, at2;
    float root;
    BOOL neg1, neg2;
 
-   pblock->GetValue(PB_RADIUS,t,r,FOREVER);
+   pblock2->GetValue(PB_RADIUS,t,r,FOREVER);
 
    a = DotProd(ray.dir,ray.dir);
    b = DotProd(ray.dir,ray.p) * 2.0f;
@@ -631,35 +564,6 @@ void bhkSphereObject::InvalidateUI()
    if (pmapParam) pmapParam->Invalidate();
 }
 
-ParamDimension *bhkSphereObject::GetParameterDim(int pbIndex) 
-{
-   switch (pbIndex) 
-   {
-   case PB_RADIUS:
-      return stdWorldDim;			
-   case PB_SEGS:
-      return stdSegmentsDim;			
-   case PB_SMOOTH:
-      return stdNormalizedDim;
-   default:
-      return defaultDim;
-   }
-}
-
-TSTR bhkSphereObject::GetParameterName(int pbIndex) 
-{
-   switch (pbIndex) 
-   {
-   case PB_RADIUS:
-      return TSTR(GetString(IDS_RB_RADIUS));			
-   case PB_SEGS:
-      return TSTR(GetString(IDS_RB_SEGS));			
-   case PB_SMOOTH:
-      return TSTR(GetString(IDS_RB_SMOOTH));			
-   default:
-      return TSTR(_T(""));
-   }
-}
 
 RefTargetHandle bhkSphereObject::Clone(RemapDir& remap) 
 {
@@ -677,3 +581,24 @@ void bhkSphereObject::UpdateUI()
    SphereParamDlgProc* dlg = static_cast<SphereParamDlgProc*>(pmapParam->GetUserDlgProc());
    dlg->Update(ip->GetTime());
 }
+
+int bhkSphereObject::Display(TimeValue t, INode* inode, ViewExp *vpt, int flags) 
+{
+   Matrix3 m;
+   Color color = Color(inode->GetWireColor());
+   GraphicsWindow *gw = vpt->getGW();
+   Material *mtl = gw->getMaterial();
+   m = inode->GetObjectTM(t);
+   gw->setTransform(m);
+   DWORD rlim = gw->getRndLimits();
+   gw->setRndLimits(GW_WIREFRAME|GW_EDGES_ONLY/*|GW_Z_BUFFER*/);
+   if (inode->Selected()) 
+      gw->setColor( LINE_COLOR, GetSelColor());
+   else if(!inode->IsFrozen() && !inode->Dependent())
+      gw->setColor( LINE_COLOR, color);
+
+   UpdateMesh(t);
+   mesh.render( gw, mtl, NULL, COMP_ALL);	
+   gw->setRndLimits(rlim);
+   return 0;
+}
\ No newline at end of file
diff --git a/NifProps/resource.h b/NifProps/resource.h
index 53b8d4f6b9cc2453c0d42ce4ca41e52365175e7a..16b569eb972c74d5998fca983a99037500b91440 100755
--- a/NifProps/resource.h
+++ b/NifProps/resource.h
@@ -2,7 +2,6 @@
 // Microsoft Visual C++ generated include file.
 // Used by NifProps.rc
 //
-#define IDD_SPHEREPARAM2                101
 #define IDC_RADIUS                      1000
 #define IDC_SEGMENTS                    1001
 #define IDC_RADIUS1                     1002
@@ -12,6 +11,17 @@
 #define IDC_OBSMOOTH                    1006
 #define IDC_RADSPINNER1                 1007
 #define IDC_RADSPINNER2                 1008
+#define IDC_LENSPINNER                  1009
+#define IDC_HEIGHTEDIT                  1010
+#define IDC_WIDTHSPINNER                1011
+#define IDC_HEIGHTSPINNER               1012
+#define IDC_LIST1                       1023
+#define IDC_ADD                         1024
+#define IDC_REMOVE                      1025
+#define IDC_RDO_NO_COLL                 1117
+#define IDC_RDO_SPHERE                  1119
+#define IDC_RDO_CAPSULE                 1120
+#define IDC_RDO_PROXY_MESH              1121
 #define IDC_ED_POS1_X                   1700
 #define IDC_SP_POS1_X                   1701
 #define IDC_ED_POS1_Y                   1702
@@ -25,37 +35,88 @@
 #define IDC_ED_POS2_Z                   1710
 #define IDC_SP_POS2_Z                   1711
 #define IDC_LBL_POS1                    1712
-#define IDS_LIBDESCRIPTION              11001
+#define IDC_PICK_NODE                   1713
+#define IDC_SLIDER1                     1714
+#define IDC_RDO_AXIS_ALIGNED_BOX        1715
+#define IDC_LENGTHEDIT                  3009
+#define IDC_WIDTHEDIT                   3010
 #define IDD_PANEL                       11001
+#define IDS_LIBDESCRIPTION              11001
 #define IDC_LBL_BSXFLAGS                11001
-#define IDS_CATEGORY                    11002
 #define IDD_ANIM_PANEL                  11002
+#define IDS_CATEGORY                    11002
 #define IDC_ED_BSXFLAGS                 11002
+#define IDD_RIGIDBODY                   11003
 #define IDS_CLASS_NAME                  11003
 #define IDC_ED_STRINGSEXTRA             11003
-#define IDD_RigidBody                   11003
+#define IDD_CAPSULEPARAM                11004
 #define IDS_PARAMS                      11004
 #define IDC_LBL_STRINGSEXTRA            11004
-#define IDD_CAPSULEPARAM                11004
+#define IDD_RB_MOD_PANEL                11005
 #define IDS_SPIN                        11005
 #define IDC_GRP_OBJECT                  11005
+#define IDD_BOXPARAM                    11006
 #define IDS_ANIM_PARAMS                 11006
 #define IDC_CHK_ISCOLL                  11006
+#define IDD_BOXPARAM1                   11006
+#define IDD_SPHEREPARAM2                11007
 #define IDC_GRP_HAVOK                   11007
 #define IDC_HVK_BEGIN                   11007
-#define IDS_RB_Capsule                  11007
 #define IDS_RB_CAPSULE                  11007
-#define IDS_RB_Capsule                  11007
 #define IDC_LBL_MATERIAL                11008
 #define IDS_RB_CAPSULE_CLASS            11008
+#define IDD_RB_MOD_PANEL1               11008
 #define IDC_CB_MATERIAL                 11009
 #define IDS_RB_RIGIDBODY_PARAM          11009
+#define IDD_RB_MOD_PANEL2               11009
 #define IDC_LBL_LAYER                   11010
 #define IDS_RB_CAP_POS1                 11010
+#define IDD_RB_MOD_PANEL3               11010
 #define IDC_CB_LAYER                    11011
 #define IDS_RB_CAP_POS2                 11011
+#define IDD_RB_MOD_PANEL4               11011
 #define IDC_LBL_CENTER                  11012
+#define IDS_DS_MASS                     11012
 #define IDC_LBL_POS2                    11013
+#define IDS_DS_FRICTION                 11013
+#define IDS_DS_RESTITUTION              11014
+#define IDS_DS_LINEAR_DAMPING           11015
+#define IDS_DS_ANGULAR_DAMPING          11016
+#define IDS_DS_MAX_LINEAR_VELOCITY      11017
+#define IDS_DS_MAX_ANGULAR_VELOCITY     11018
+#define IDS_DS_PENETRATION_DEPTH        11019
+#define IDS_DS_MOTION_SYSTEM            11020
+#define IDS_DS_QUALITY_TYPE             11021
+#define IDS_RB_PARAMETERS               11022
+#define IDS_RB_RADIUS                   11023
+#define IDS_RB_SEGS                     11024
+#define IDS_RB_SMOOTH                   11025
+#define IDS_RB_PRIMITIVES               11026
+#define IDS_RB_SPHERE                   11027
+#define IDS_RB_RADIUS1                  11028
+#define IDS_RB_RADIUS2                  11029
+#define IDS_RB_SPHERE_CLASS             11030
+#define IDS_DS_PARAMCHG                 11031
+#define IDS_DS_LAYER                    11032
+#define IDS_DS_MATERIAL                 11033
+#define IDS_DS_NODE                     11034
+#define IDS_DS_PRIORITY                 11035
+#define IDS_DS_COLLISION                11036
+#define IDS_PICKNODE                    11037
+#define IDS_PICKNODE_PROMPT             11038
+#define IDS_RB_BOX                      11039
+#define IDS_RB_BOX_CLASS                11040
+#define IDS_RB_CLASS_NAME               11041
+#define IDS_DS_LENGTH                   11042
+#define IDS_DS_WIDTH                    11043
+#define IDS_DS_HEIGHT                   11044
+#define IDS_ADD_MESH                    11045
+#define IDS_MESHLIST                    11046
+#define IDS_BV_BOUNDING_TYPE            11047
+#define IDS_RB_MOD_PANEL1               11048
+#define IDS_RB_MOD_PANEL2               11049
+#define IDS_RB_MOD_PANEL3               11050
+#define IDS_RB_MOD_PANEL4               11051
 #define IDC_ED_CENTER_X                 11490
 #define IDC_SP_CENTER_X                 11491
 #define IDC_ED_CENTER_Y                 11492
@@ -96,24 +157,14 @@
 #define IDC_ED_ANIM_PRIORITY            11601
 #define IDC_SP_ANIM_PRIORITY            11602
 #define IDC_ANIM_END                    11602
-#define IDS_RB_PARAMETERS               30028
-#define IDS_RB_RADIUS                   30045
-#define IDS_RB_SEGS                     30046
-#define IDS_RB_SMOOTH                   30048
-#define IDS_RB_PRIMITIVES               30264
-#define IDS_RB_SPHERE                   30503
-#define IDS_RB_RADIUS1                  30516
-#define IDS_RB_RADIUS2                  30517
-#define IDS_RB_SPHERE_CLASS             31298
-#define IDS_DS_PARAMCHG                 31316
 
 // Next default values for new objects
 // 
 #ifdef APSTUDIO_INVOKED
 #ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE        103
+#define _APS_NEXT_RESOURCE_VALUE        105
 #define _APS_NEXT_COMMAND_VALUE         40001
-#define _APS_NEXT_CONTROL_VALUE         1713
+#define _APS_NEXT_CONTROL_VALUE         1716
 #define _APS_NEXT_SYMED_VALUE           101
 #endif
 #endif