diff --git a/edosl0util/merge.py b/edosl0util/merge.py
index d2951b5e75e08cdabe3dc55f20feee3b87bec22d..b41dc0cfcae80724516b9d352d97e25ef2209231 100644
--- a/edosl0util/merge.py
+++ b/edosl0util/merge.py
@@ -49,10 +49,9 @@ class _Ptr(object):
     def __lt__(self, that):
         return (self.stamp, self.apid) < (that.stamp, that.apid)
 
-    # WTF?
-    # instances with same timecode/apid/size will compare the same
-    # def __hash__(self):
-    #    return hash((self.stamp, self.apid, self.size))
+    # hash by stamp, apid, size so we can dedup in index using set
+    def __hash__(self):
+       return hash((self.stamp, self.apid, self.size))
 
     def bytes(self):
         self.fobj.seek(self.offset, os.SEEK_SET)
diff --git a/edosl0util/timecode.py b/edosl0util/timecode.py
index 8c2c54f1fc63fd5bf5b1216e2d36107fc14379b5..d6160fd1ad4e23c836a6a3dad1aba7bff6edf868 100644
--- a/edosl0util/timecode.py
+++ b/edosl0util/timecode.py
@@ -30,7 +30,9 @@ def timecode_parts_to_iet(days, ms, us, epoch):
     Convert components to a IET based on arbitrary epoch.
     """
     return int(_grain.utc2tai(
-        epoch + timedelta(days=days, milliseconds=ms, microseconds=us),
+        epoch + timedelta(days=float(days),
+                          milliseconds=float(ms),
+                          microseconds=float(us)),
         epoch) * 1e6)
 
 
@@ -56,4 +58,5 @@ def dt_to_cds(dt):
     return (d.days, int(d.seconds * 1e3), d.microseconds)
 
 
+dt_to_iet = _grain.utc2iet
 iet_to_dt = _grain.iet2utc