diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,11 @@
+### hora
+
+    convenience date, time types and functions
+    
+    timestamps
+    
+    parse UTCTime to explicit type
+    
+    time in future 
+    
+    pico difference between times   
diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,8 @@
+#####   1.0.3
+    fix Eq, Ord TimeSpan: was derived. Implemented manually
+    
+    add Num TimeSpan 
+
 #####   1.0.2
     Tz derive Functor
     
diff --git a/hora.cabal b/hora.cabal
--- a/hora.cabal
+++ b/hora.cabal
@@ -1,5 +1,5 @@
 name:                hora
-version:             1.0.2
+version:             1.0.3
 build-type:          Simple
 cabal-version:       >=1.10
 
@@ -10,7 +10,7 @@
 category:            System, Time
 license:             PublicDomain
 license-file:        PublicDomain
-extra-source-files:  changelog.md
+extra-source-files:  changelog.md, README.md
 
 homepage:            https://github.com/ciez/hora
 source-repository   head
diff --git a/src/Data/Time/Hora/Convert.hs b/src/Data/Time/Hora/Convert.hs
--- a/src/Data/Time/Hora/Convert.hs
+++ b/src/Data/Time/Hora/Convert.hs
@@ -59,3 +59,4 @@
 nominalDiff::Integral a => TimeSpan a -> NominalDiffTime
 nominalDiff ts0 = let s1 = toPico ts0::Integer
                 in fromRational $ s1 % picoSec
+
diff --git a/src/Data/Time/Hora/Type/Time.hs b/src/Data/Time/Hora/Type/Time.hs
--- a/src/Data/Time/Hora/Type/Time.hs
+++ b/src/Data/Time/Hora/Type/Time.hs
@@ -1,14 +1,79 @@
-module Data.Time.Hora.Type.Time where
+module Data.Time.Hora.Type.Time 
+    (Tz(..),
+    TwoInt(..),
+    TimeSpan(..)) where
 
 import Data.Time.LocalTime
 
 
+data Tz a = Tz TimeZone a  deriving (Show,Functor)
+
+
+-- | various precision
 data TimeSpan a = Sec a
     | Pico a
-    | Milli a deriving (Show, Eq, Ord)
+    | Milli a deriving (Show, Functor)
 
 
-data Tz a = Tz TimeZone a  deriving (Show,Functor)
-
 -- | constraint
 type TwoInt a b = (Integral a, Integral b)
+
+
+
+
+-- | ! fromInteger returns 'Pico'. assumes the value is Pico seconds
+instance Integral a => Num (TimeSpan a) where
+    (+) = withPico (+)
+    (*) = withPico (*)
+    abs a0 = if a0 > Pico 0 then a0 else - a0
+    signum a0
+        | a0 > Pico 0 = 1
+        | a0 < Pico 0 = - 1
+        | otherwise = 0
+    fromInteger i0 = Pico $ fromIntegral i0
+    (-) = withPico (-)
+
+
+-- | safe to mix sec \/ pico \/ milli 
+instance (Eq a, Integral a) => Eq (TimeSpan a) where
+    (==) (Sec a0) (Sec b0) = a0 == b0
+    (==) (Milli a0) (Milli b0) = a0 == b0
+    (==) (Pico a0) (Pico b0) = a0 == b0
+    (==) a0 b0 = a1 == b1
+        where a1 = toPico a0::Integer
+              b1 = toPico b0::Integer
+
+
+-- | safe to mix sec \/ pico \/ milli 
+instance (Ord a, Integral a) => Ord (TimeSpan a) where
+    (<=) (Sec a0) (Sec b0) = a0 <= b0
+    (<=) (Milli a0) (Milli b0) = a0 <= b0
+    (<=) (Pico a0) (Pico b0) = a0 <= b0
+    (<=) a0 b0 = a1 <= b1
+        where a1 = toPico a0::Integer
+              b1 = toPico b0::Integer
+
+
+withPico::Integral a => (a -> a -> a) ->
+    TimeSpan a -> TimeSpan a -> TimeSpan a
+withPico fn0 a0 b0 = Pico $ fn0 a1 b1
+        where a1 = toPico a0
+              b1 = toPico b0
+
+
+{- | >>> toPico (Milli 1) 
+    1000000000 -}
+toPico::TwoInt a b => TimeSpan a -> b
+toPico (Pico i0) = fromIntegral i0
+toPico (Milli i0) = fromIntegral $ i0 * picoMs
+toPico (Sec i0) = fromIntegral $ i0 * picoSec
+
+
+
+-- | pico in 1 second
+picoSec::Integral a => a
+picoSec = 1000000000000     --  12
+
+-- | pico in 1 milli
+picoMs::Integral a => a
+picoMs = 1000000000         --  9              
diff --git a/test/Test/TestConvert.hs b/test/Test/TestConvert.hs
--- a/test/Test/TestConvert.hs
+++ b/test/Test/TestConvert.hs
@@ -23,6 +23,18 @@
               toMilli (Sec $ i 17) `shouldBe` (toMilli $ Pico $ toPico $ Sec $ i 17)
               toMilli (Milli $ i 170) `shouldBe` (toMilli $ Pico $ toPico $ Milli $ i 170)
               s1 `shouldBe` i3
+       describe "TimeSpan Num" $ do
+          it "pico Num" $ do 
+              Milli 1 + (Milli 2) `shouldBe` (Pico $ (picoMs * 1) + (picoMs * 2))  
+              Sec 2 - (Sec 1) `shouldBe` (Pico $ (picoSec * 2) - (picoSec * 1))  
+              Pico 2 * (Milli 10) `shouldBe` (Pico $ 2 * (picoMs * 10))
+       describe "TimeSpan Ord" $ do
+          it "pico Ord" $ do
+              Milli 10 `shouldSatisfy` (< (Sec 1))   
+              Milli 10 `shouldSatisfy` (> (Milli 9))   
+              Pico 10 `shouldSatisfy` (< (Sec 1))   
+              Pico 10 `shouldSatisfy` (< (Milli 1))   
+              picoMs * 10 `shouldSatisfy` (== (toPico $ Milli 10))   
         where p1 = toPico (Sec i3)::Int
               m1 = toMilli (Pico p1)::Int
               s1 = toSec (Milli m1)::Int
