diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,9 @@
+0.0.6
+
+* Fix bug in `realAmount`
+* Add `integralAmount`
+* Add instances for `Semigroup` and `Monoid`
+
 0.0.5
 
 * Add `encodeTransactionNoEmptyField`
diff --git a/national-australia-bank.cabal b/national-australia-bank.cabal
--- a/national-australia-bank.cabal
+++ b/national-australia-bank.cabal
@@ -1,5 +1,5 @@
 name:                 national-australia-bank
-version:              0.0.5
+version:              0.0.6
 synopsis:             Functions for National Australia Bank transactions
 description:          Parsing, Processing and other functions for National Australia Bank transactions
 license:              BSD3
diff --git a/src/Data/Bank/NationalAustraliaBank/NationalAustraliaBank.hs b/src/Data/Bank/NationalAustraliaBank/NationalAustraliaBank.hs
--- a/src/Data/Bank/NationalAustraliaBank/NationalAustraliaBank.hs
+++ b/src/Data/Bank/NationalAustraliaBank/NationalAustraliaBank.hs
@@ -5,7 +5,7 @@
 module Data.Bank.NationalAustraliaBank.NationalAustraliaBank where
 
 import Control.Applicative (Alternative((<|>)))
-import Control.Lens( Lens', Prism', prism', (#), view )
+import Control.Lens( Lens', Prism', prism', (#), view, preview, over, _2 )
 import Control.Monad.IO.Class ( MonadIO(..) )
 import Control.Monad.Reader.Class ( MonadReader )
 import Control.Monad.Trans.Except ( ExceptT(..) )
@@ -24,6 +24,7 @@
       DecDigit(DecDigit0) )
 import Data.Foldable ( asum, toList )
 import Data.List.NonEmpty ( NonEmpty(..), some1 )
+import Data.Maybe( fromMaybe )
 import Data.Ord( comparing )
 import Data.String ( IsString(fromString) )
 import Data.Sv
@@ -52,6 +53,9 @@
       ParsecT,
       Stream )
 
+-- #setup
+-- >>> import Data.Digit
+
 data Month =
   Jan
   | Feb
@@ -444,10 +448,49 @@
   Integral a =>
   Amount
   -> Ratio a
-realAmount (Amount n ds d1 d2) =
+realAmount a =
+  integralAmount100 a % 100
+
+integralAmount100 ::
+  Integral a =>
+  Amount
+  -> a
+integralAmount100 (Amount n ds d1 d2) =
   let neg =
-        if n then Left else Right
-  in  (decDigitsIntegral (neg ds) * 100 + decDigitsIntegral (Right (d1 :| [d2]))) % 100
+        if n then (-1) else 1
+  in  neg * (decDigitsIntegral (Right ds) * 100 + decDigitsIntegral (Right (d1 :| [d2])))
+
+-- |
+--
+-- >>> Amount False (DecDigit1 :| []) DecDigit0 DecDigit0 <> Amount False (DecDigit1 :| []) DecDigit0 DecDigit0
+-- Amount {_negated = False, _dollars = DecDigit2 :| [], _cents1 = DecDigit0, _cents2 = DecDigit0}
+--
+-- >>> Amount True (DecDigit1 :| []) DecDigit0 DecDigit0 <> Amount False (DecDigit1 :| []) DecDigit0 DecDigit0
+-- Amount {_negated = False, _dollars = DecDigit0 :| [], _cents1 = DecDigit0, _cents2 = DecDigit0}
+--
+-- >>> Amount False (DecDigit1 :| []) DecDigit0 DecDigit0 <> Amount True (DecDigit1 :| []) DecDigit0 DecDigit0
+-- Amount {_negated = False, _dollars = DecDigit0 :| [], _cents1 = DecDigit0, _cents2 = DecDigit0}
+--
+-- >>> Amount True (DecDigit1 :| [DecDigit2]) DecDigit5 DecDigit9 <> Amount True (DecDigit9 :| []) DecDigit7 DecDigit3
+-- Amount {_negated = True, _dollars = DecDigit2 :| [DecDigit2], _cents1 = DecDigit3, _cents2 = DecDigit2}
+--
+-- >>> Amount False (DecDigit1 :| [DecDigit2]) DecDigit5 DecDigit9 <> Amount True (DecDigit9 :| []) DecDigit7 DecDigit3
+-- Amount {_negated = False, _dollars = DecDigit2 :| [], _cents1 = DecDigit8, _cents2 = DecDigit6}
+--
+-- >>> Amount False (DecDigit1 :| [DecDigit2]) DecDigit5 DecDigit9 <> Amount False (DecDigit9 :| []) DecDigit7 DecDigit3
+-- Amount {_negated = False, _dollars = DecDigit2 :| [DecDigit2], _cents1 = DecDigit3, _cents2 = DecDigit2}
+instance Semigroup Amount where
+  a1 <> a2 =
+    let div10 x = over _2 (fromMaybe DecDigit0 . preview integralDecimal) (divMod x 10)
+        v :: Integer
+        v = integralAmount100 a1 + integralAmount100 a2
+        (as1, c2) = div10 (abs v)
+        (as2, c1) = div10 as1
+    in  Amount (v < 0) (either id id (integralDecDigits as2)) c1 c2
+
+instance Monoid Amount where
+  mempty =
+    Amount False (DecDigit0 :| []) DecDigit0 DecDigit0
 
 data Transaction =
   Transaction {
