   };
 
   /** private */
-  _delete = function (obj) {
-    var sql = "UPDATE object SET is_deleted = true WHERE id=$1;";
-
+  _delete = function (obj, isChild) {
+    var oldRec, key, i, child, rel,
+      sql = "UPDATE object SET is_deleted = true WHERE id=$1;",
+      klass = featherbone.getClass(obj.name),
+      props = klass.properties;
+
+    if (!isChild && _isChildClass(obj.name)) {
+      plv8.elog(ERROR, "Can not directly delete a child class");
+    }
+
+    /* Delete children recursively */
+    for (key in props) {
+      if (props.hasOwnProperty(key) &&
+          typeof props[key].type === "object" &&
+          props[key].type.parentOf) {
+        oldRec = oldRec || _select(obj);
+        rel = props[key].type.relation;
+        i = 0;
+
+        while (i < oldRec[key].length) {
+          child = {name: rel, id: oldRec[key][i].id};
+          _delete(child, true);
+          i++;
+        }
+      }
+    }
+
+    /* Now delete object */
     plv8.execute(sql, [obj.id]);
 
     return true;

      pk;

    /* Validate */
    if (_isChildClass(klass)) {
      plv8.elog(ERROR, "Can not query directly on a child class");
    }


  };

  _update = function (klass, id, oldRec, newRec, isChild) {
    var result, updRec, props, value, key, sql, i, cKlass, cid, child, err,
      row,
      tokens = [klass.name.toSnakeCase()],
      pk = _getKey(id),
      params = [],
      ary = [],
      p = 1,
      exists = function (ary, id) {
        var n = 0;

        while (n < ary.length) {
          if (ary[n].id === id) { return true; }
          n++;
        }

        return false;
