diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,11 @@
+0.6.2.0
+---
+* bugfix diffDTree
+
+0.6.1.0
+---
+* add diffDTree
+
 0.6.0.1
 ---
 * spatial-math.0.3.0.0 compatability
diff --git a/generic-accessors.cabal b/generic-accessors.cabal
--- a/generic-accessors.cabal
+++ b/generic-accessors.cabal
@@ -1,5 +1,5 @@
 name:                generic-accessors
-version:             0.6.1.0
+version:             0.6.2.0
 synopsis:            stringly-named getters for generic data
 license:             BSD3
 license-file:        LICENSE
diff --git a/src/Accessors/Dynamic.hs b/src/Accessors/Dynamic.hs
--- a/src/Accessors/Dynamic.hs
+++ b/src/Accessors/Dynamic.hs
@@ -223,8 +223,8 @@
   " got incompatible dynamic DField " ++ describeDField d
 
 
-diffDTrees :: DTree -> DTree -> [String]
-diffDTrees = diffDTrees' []
+diffDTrees :: String -> DTree -> DTree -> [String]
+diffDTrees rootName = diffDTrees' [rootName]
 
 showName :: [String] -> String
 showName = intercalate "." . reverse
@@ -287,6 +287,11 @@
         | otherwise -> [showName name ++ " has different types"]
       (Record x, Record y)
         | map fst x /= map fst y -> [showName name ++ " has different types"]
+        | otherwise ->
+            let diffChild (nx, x') (ny, y')
+                  | nx == ny = diffDTrees' (nx:name) x' y'
+                  | otherwise = error $ "internal error: record names don't match " ++ show (nx, ny)
+            in concat $ zipWith diffChild x y
       _ -> [showName name ++ " has different types"]
 diffDData name _ _ = [showName name ++ " has different types"]
 
