diff --git a/ip.cabal b/ip.cabal
--- a/ip.cabal
+++ b/ip.cabal
@@ -1,5 +1,5 @@
 name:                ip
-version:             0.2
+version:             0.3
 synopsis:            Library for IP and MAC addresses
 description:         Please see README.md
 homepage:            https://github.com/andrewthad/ip#readme
diff --git a/src/Net/Mac.hs b/src/Net/Mac.hs
--- a/src/Net/Mac.hs
+++ b/src/Net/Mac.hs
@@ -12,6 +12,11 @@
 import qualified Data.Attoparsec.ByteString.Char8 as AB
 import Data.Bits ((.&.),(.|.),shiftR,shiftL,complement)
 import Net.Internal (attoparsecParseJSON)
+import qualified Data.Text.Lazy.Builder as TBuilder
+import Data.Text.Lazy.Builder.Int (hexadecimal)
+import Data.Monoid ((<>))
+import qualified Data.Aeson as Aeson
+import qualified Data.Text.Lazy as LText
 
 data Mac = Mac
   { macA :: {-# UNPACK #-} !Word16
@@ -21,8 +26,29 @@
 
 instance Hashable Mac
 
+instance ToJSON Mac where
+  toJSON = Aeson.String . toText
+
 instance FromJSON Mac where
   parseJSON = attoparsecParseJSON (textParser <* AT.endOfInput)
+
+toText :: Mac -> Text
+toText = LText.toStrict . TBuilder.toLazyText . toTextBuilder
+
+toTextBuilder :: Mac -> TBuilder.Builder
+toTextBuilder (Mac a b) = 
+  hexadecimal (255 .&. shiftR a 8 )
+  <> colon
+  <> hexadecimal (255 .&. a )
+  <> colon
+  <> hexadecimal (255 .&. shiftR b 24 )
+  <> colon
+  <> hexadecimal (255 .&. shiftR b 16 )
+  <> colon
+  <> hexadecimal (255 .&. shiftR b 8 )
+  <> colon
+  <> hexadecimal (255 .&. b)
+  where colon = TBuilder.singleton ':'
 
 -- | This does not do an endOfInput check
 textParser :: AT.Parser Mac
