Index: /trunk/include/core/RpUnits.h
===================================================================
--- /trunk/include/core/RpUnits.h	(revision 399)
+++ /trunk/include/core/RpUnits.h	(revision 400)
@@ -299,5 +299,5 @@
 
         // retrieve a list of compatible units.
-        std::list<std::string> getCompatible() const;
+        std::list<std::string> getCompatible(double expMultiplier=1.0) const;
 
 
@@ -343,4 +343,15 @@
         static const RpUnits* find(std::string key);
 
+        // validate is very similar to find, but it works better 
+        // for seeing complex units can be interpreted. 
+        // it validates that if the a certain units string is
+        // provided as a unit type, then all of the base components
+        // of that unit are available for conversions.
+        // returns 0 on success (units are valid)
+        // returns !0 on failure (units not valid)
+        static int validate(const std::string& inUnits, 
+                            std::string& type,
+                            std::list<std::string>* compatList=NULL);
+
         // user calls define to add a RpUnits object or to add a relation rule
         //
Index: /trunk/src/core/RpLibrary.cc
===================================================================
--- /trunk/src/core/RpLibrary.cc	(revision 399)
+++ /trunk/src/core/RpLibrary.cc	(revision 400)
@@ -237,8 +237,10 @@
 
             if (!path.str().empty()) {
-                path.str(_node2comp(snode) + "." + path.str());
+                // path.str(_node2comp(snode) + "." + path.str());
+                path.str("." + _node2comp(snode) + path.str());
             }
             else {
-                path.str(_node2comp(snode));
+                // path.str(_node2comp(snode));
+                path.str("." + _node2comp(snode));
             }
 
@@ -1296,6 +1298,7 @@
 // METHOD: put()
 /// Put a RpLibrary* value into the xml.
-// Append flag is ignored for this function.
-/**
+/**
+ *  Append flag adds additional nodes, it does not merge same 
+ *  named nodes together
  */
 
@@ -1303,6 +1306,10 @@
 RpLibrary::put ( std::string path, RpLibrary* value, std::string id, int append )
 {
-    scew_element* retNode = NULL;
-    scew_element* new_elem = NULL;
+    scew_element* retNode   = NULL;
+    // scew_element* old_elem  = NULL;
+    scew_element* new_elem  = NULL;
+    scew_element* childNode = NULL;
+    // std::string nodeName    = "";
+
     int retVal = 1;
 
@@ -1318,6 +1325,42 @@
     }
 
+    // nodeName = value->nodeComp();
+    // old_elem = _find(path+"."+nodeName,NO_CREATE_PATH);
+
+    if (!append) {
+        retNode = _find(path,NO_CREATE_PATH);
+        if (retNode) {
+            scew_element_free(retNode);
+        }
+        else {
+            // path did not exist and was not created
+            // do nothing
+        }
+    }
+
     retNode = _find(path,CREATE_PATH);
 
+    if (retNode) {
+        while ( (childNode = scew_element_next(value->root,childNode)) ) {
+            if ((new_elem = scew_element_copy(childNode))) {
+                if (scew_element_add_elem(retNode, new_elem)) {
+                    // maybe we want to count the number of children
+                    // that we have successfully added?
+                    retVal = 0;
+                }
+                else {
+                    // adding new element failed
+                }
+            }
+            else {
+                // copying new element failed
+            }
+        }
+    }
+    else {
+        // path did not exist and was not created.
+    }
+
+    /*
     if (retNode) {
         if ((new_elem = scew_element_copy(value->root))) {
@@ -1327,4 +1370,6 @@
         }
     }
+
+    */
 
     return *this;
Index: /trunk/src/core/RpUnits.cc
===================================================================
--- /trunk/src/core/RpUnits.cc	(revision 399)
+++ /trunk/src/core/RpUnits.cc	(revision 400)
@@ -249,5 +249,4 @@
             // add the other unit's name to the list of compatible units
             // compatList.push_back(otherName.str());
-            std::cout << " pushing " << otherName << std::endl;
             compatList.push_back(otherName);
 
Index: /trunk/src/tcl/src/RpLibraryTclInterface.cc
===================================================================
--- /trunk/src/tcl/src/RpLibraryTclInterface.cc	(revision 399)
+++ /trunk/src/tcl/src/RpLibraryTclInterface.cc	(revision 400)
@@ -1063,4 +1063,6 @@
     int opt_argc       = 2;     // max number of optional parameters
     int argsLeft       = 0;     // temp variable for calculation
+    int noerr = 0;
+    Tcl_CmdInfo info;  // pointer to the command info
 
     while (opt_argc--) {
@@ -1119,6 +1121,27 @@
     }
 
+    noerr = Tcl_GetCommandInfo(interp, addStr.c_str(), &info);
+    if (noerr == 1) {
+        // valid command
+        if (info.proc == &RpLibCallCmd) {
+            // call the rappture library put function with the Rappture Object
+            ((RpLibrary*) cdata)->put( path, 
+                                       (RpLibrary*)info.clientData, 
+                                       id, append);
+        }
+        else {
+            // object is not a RpLibrary
+            // call the rappture library put function with the inputted string
+            ((RpLibrary*) cdata)->put(path, addStr, id, append);
+        }
+    }
+    else {
+        // invalid command
+        // call the rappture library put function with the inputted string
+        ((RpLibrary*) cdata)->put(path, addStr, id, append);
+    }
+
     // call the rappture library put function
-    ((RpLibrary*) cdata)->put(path, addStr, id, append);
+    // ((RpLibrary*) cdata)->put(path, addStr, id, append);
 
     // clear any previous result in the interpreter
