diff --git a/Main.hs b/Main.hs
deleted file mode 100644
--- a/Main.hs
+++ /dev/null
@@ -1,94 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-
-import           Control.Monad          (replicateM_)
-import           Data.Monoid            ((<>))
-import qualified Data.Text              as T
-import qualified Data.Text.IO           as TIO (hPutStrLn, putStrLn)
-import           System.Console.CmdArgs
-import           System.Exit
-import           System.IO              (stderr)
-
-import           Text.IPv6Addr
-
-version :: String
-version = "0.5.2"
-
-data Input = Input
-  { output   :: String
-  , address  :: String
-  , quantity :: Int
-  , prefix   :: String
-  } deriving (Show, Data, Typeable)
-
-ip6addrInput :: Input
-ip6addrInput = Input
-  { address = mempty
-    &= typ " <IPv6 address>"
-  , output = "canonical"
-    &= typ " [canonical|pure|full|arpa|unc|random]"
-    &= help "Default : canonical (RFC 5952)"
-  , quantity = 1
-    &= help "Amount of random addresses to generate"
-    &= typ " <Integer>"
-  , prefix = ""
-    &= typ " <Prefix>"
-    &= help "Set a prefix for random addresses generation"
-  } &= summary ("ip6addr version " <> version <> " (c) Michel Boucey 2015-2017")
-    &= program "ip6addr"
-    &= helpArg [name "h"]
-    &= details [ "Examples:"
-               , ""
-               , "  ip6addr -a 0:0::FFFF:192.0.2.128"
-               , "  ip6addr -o full -a ::1"
-               , "  ip6addr -o random -q 10 -p 1234:abcd::"
-               , ""
-               ]
-
-main :: IO ()
-main = do
-  Input{..} <- cmdArgs ip6addrInput
-  if output == "random"
-    then replicateM_ quantity (putRandAddr prefix) >> exitSuccess
-    else
-      case output of
-        "canonical" -> out maybeIPv6Addr address fromIPv6Addr
-        "pure"      -> out maybePureIPv6Addr address fromIPv6Addr
-        "full"      -> out maybeFullIPv6Addr address fromIPv6Addr
-        "arpa"      -> out maybeIP6ARPA address id
-        "unc"       -> out maybeUNC address id
-        _           -> TIO.hPutStrLn stderr "See help" >> exitFailure
-  where
-  putRandAddr p = do
-    r <- randIPv6AddrWithPrefix (if p == mempty then Nothing else Just (T.pack p))
-    case r of
-      Nothing -> TIO.putStrLn "Bad prefix"
-      Just a  -> TIO.putStrLn (fromIPv6Addr a)
-  out t i o =
-    if i /= mempty
-      then do
-        let p = T.pack i
-        case t p of
-          Nothing ->
-            TIO.hPutStrLn stderr ("'" <> p <> "' is not an IPv6 address")
-            >> exitFailure
-          Just a  -> TIO.putStrLn (o a) >> exitSuccess
-        else Prelude.putStrLn "See help" >> exitFailure
-  maybeUNC t =
-    maybe
-      Nothing
-      (\a -> Just (T.concatMap trans (fromIPv6Addr a) <> ".ipv6-literal.net"))
-      (maybePureIPv6Addr t)
-    where
-    trans ':' = "-"
-    trans c   = T.pack [c]
-  maybeIP6ARPA t =
-    maybe
-      Nothing
-      (\a -> Just (T.reverse (T.concatMap trans (fromIPv6Addr a)) <> "IP6.ARPA."))
-      (maybeFullIPv6Addr t)
-    where
-    trans ':' = T.empty
-    trans c   = "." <> T.pack [c]
-
diff --git a/app/Main.hs b/app/Main.hs
new file mode 100644
--- /dev/null
+++ b/app/Main.hs
@@ -0,0 +1,79 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+
+import           Control.Monad          (replicateM_)
+import           Data.Monoid            ((<>))
+import qualified Data.Text              as T
+import qualified Data.Text.IO           as TIO (hPutStrLn, putStrLn)
+import           System.Console.CmdArgs
+import           System.Exit
+import           System.IO              (stderr)
+
+import           Text.IPv6Addr
+
+version :: String
+version = "1.0.0"
+
+data Input = Input
+  { output   :: String
+  , address  :: String
+  , quantity :: Int
+  , prefix   :: String
+  } deriving (Show, Data, Typeable)
+
+ip6addrInput :: Input
+ip6addrInput = Input
+  { address = mempty
+    &= typ " <IPv6 address>"
+  , output = "canonical"
+    &= typ " [canonical|pure|full|arpa|unc|random]"
+    &= help "Default : canonical (RFC 5952)"
+  , quantity = 1
+    &= help "Amount of random addresses to generate"
+    &= typ " <Integer>"
+  , prefix = ""
+    &= typ " <Prefix>"
+    &= help "Set a prefix for random addresses generation"
+  } &= summary ("ip6addr version " <> version <> " (c) Michel Boucey 2011-2018")
+    &= program "ip6addr"
+    &= helpArg [name "h"]
+    &= details [ "Examples:"
+               , ""
+               , "  ip6addr -a 0:0::FFFF:192.0.2.128"
+               , "  ip6addr -o full -a ::1"
+               , "  ip6addr -o random -q 10 -p 1234:abcd::"
+               , ""
+               ]
+
+main :: IO ()
+main = do
+  Input{..} <- cmdArgs ip6addrInput
+  if output == "random"
+    then replicateM_ quantity (putRandAddr prefix) >> exitSuccess
+    else
+      case output of
+        "canonical" -> out maybeIPv6Addr address fromIPv6Addr
+        "pure"      -> out maybePureIPv6Addr address fromIPv6Addr
+        "full"      -> out maybeFullIPv6Addr address fromIPv6Addr
+        "arpa"      -> out maybeIP6ARPA address id
+        "unc"       -> out maybeUNC address id
+        _           -> TIO.hPutStrLn stderr "See help" >> exitFailure
+  where
+    putRandAddr p = do
+      r <- randIPv6AddrWithPrefix (if p == mempty then Nothing else Just (T.pack p))
+      case r of
+        Just a  -> TIO.putStrLn (fromIPv6Addr a)
+        Nothing -> TIO.putStrLn "Bad prefix"
+    out t i o =
+      if i /= mempty
+        then do
+          let p = T.pack i
+          case t p of
+            Nothing ->
+              TIO.hPutStrLn stderr ("'" <> p <> "' is not an IPv6 address") >> exitFailure
+            Just a  -> TIO.putStrLn (o a) >> exitSuccess
+        else Prelude.putStrLn "See help" >> exitFailure
+    maybeUNC t = toUNC <$> maybePureIPv6Addr t
+    maybeIP6ARPA t = toIP6ARPA <$> maybeFullIPv6Addr t
+
diff --git a/ip6addr.cabal b/ip6addr.cabal
--- a/ip6addr.cabal
+++ b/ip6addr.cabal
@@ -1,17 +1,17 @@
-name: ip6addr
-version: 0.5.3
 cabal-version: >=1.10
-build-type: Simple
+name: ip6addr
+version: 1.0.0
 license: BSD3
 license-file: LICENSE
-copyright: Copyright (c) 2011-2017 - Michel Boucey
+copyright: Copyright (c) 2011-2018 - Michel Boucey
 maintainer: michel.boucey@cybervisible.fr
+author: Michel Boucey
 homepage: https://github.com/MichelBoucey/ip6addr
 synopsis: Commandline tool to generate IPv6 address text representations
 description:
     Commandline tool to generate IPv6 address text representations
 category: Network,Console
-author: Michel Boucey
+build-type: Simple
 extra-source-files:
     README.md
 
@@ -21,12 +21,12 @@
 
 executable ip6addr
     main-is: Main.hs
+    hs-source-dirs: app
+    default-language: Haskell2010
+    other-extensions: DeriveDataTypeable OverloadedStrings
+    ghc-options: -Wall
     build-depends:
         base >=4.8 && <5,
         cmdargs >=0.10.13 && <0.11,
-        IPv6Addr >=0.6.0.2 && <1.1.0,
+        IPv6Addr >=1.1.0 && <1.2.0,
         text >=1.2.2 && <1.3
-    default-language: Haskell2010
-    other-extensions: DeriveDataTypeable OverloadedStrings
-    ghc-options: -Wall
-
