diff --git a/ChangeLog b/ChangeLog
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2011-01-13	Michel Boucey <michel.boucey@gmail.com>
+	- Version 0.3.3 released.
+	- ip6addrgen now deals with leading zeros in 16bits
+          token.
+
 2010-10-28      Michel Boucey <michel.boucey@gmail.com>
 
 	- Version 0.3.2 released.
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -4,7 +4,7 @@
 
 - ip6addrgen generates random IPv6 addresses.
 
-Copyright (c) 2009-2010, Michel Boucey All rights reserved.
+Copyright (c) 2009-2011, Michel Boucey All rights reserved.
 
 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
 
diff --git a/ip6addr.cabal b/ip6addr.cabal
--- a/ip6addr.cabal
+++ b/ip6addr.cabal
@@ -1,11 +1,11 @@
 Name:           ip6addr
-Version:        0.3.2
+Version:        0.3.3
 Author:         Michel Boucey <michel.boucey@gmail.com>
 Maintainer:     Michel Boucey <michel.boucey@gmail.com>
 Homepage:       http://www.cybervisible.fr/ip6addr
 Category:       Network,Console
 Synopsis:       Command-line tools to deal with IPv6 Addresses text representation
-Description:    ip6addr consists of two command-line tools: ip6addrcan which filters IPv6 addresses parsed against RFC 4291 and canonized them in conformation with RFC 5952. By default, ip6addrcan outputs only validated inputs, i.e. IPv6 addresses, removing CIDR suffix if necessary. Already compressed IPv6 adresses are recomputed. -e option throws out discarded inputs to stderr (which have of course to be redirected). The second command-line tool, ip6addrgen, generates random IPv6 adresses. -p option allows to provide a prefix to all IPv6 adresses to generate. -n option allows to provide the amount of IPv6 addresses to generate. Outputted IPv6 addresses have to be pipelined through ip6addrcan to be canonized.
+Description:    ip6addr consists of two command-line tools: ip6addrcan which filters IPv6 addresses parsed against RFC 4291 and canonized them in conformation with RFC 5952. By default, ip6addrcan outputs only validated inputs, i.e. IPv6 addresses, removing CIDR suffix if necessary. Already compressed IPv6 adresses are recomputed. -e option throws out discarded inputs to stderr (which have of course to be redirected). The second command-line tool, ip6addrgen, generates random IPv6 adresses. -p option allows to provide a prefix to all IPv6 adresses to generate. -n option allows to provide the amount of IPv6 addresses to generate. Outputted IPv6 addresses have no more to be pipelined through ip6addrcan to be canonized.
 License:        BSD3
 License-File:   LICENSE
 Build-Type:     Simple
diff --git a/src/IP6AddrCan.hs b/src/IP6AddrCan.hs
--- a/src/IP6AddrCan.hs
+++ b/src/IP6AddrCan.hs
@@ -41,7 +41,7 @@
         Nothing -> hPutStrLn stderr i >> evalInputsErr is
     where a = removeCidrSuffix i
 			   
-version = "ip6addrcan version 0.3.2"
+version = "ip6addrcan version 0.3.3"
 
 help   = "Usage: ip6addrcan [-v|-h] | [-e] [address ...]\n"
 
diff --git a/src/IP6AddrGen.hs b/src/IP6AddrGen.hs
--- a/src/IP6AddrGen.hs
+++ b/src/IP6AddrGen.hs
@@ -33,7 +33,7 @@
 prefixRewrite s =
     do
         t <- readLast16bitsTokenOfPrefix s
-        putStr $ map toLower $fst t
+        putStr $ dropWhile (=='0') $ map toLower $fst t
         g <- genNhex $ snd t
         putStr g
 				
@@ -49,7 +49,7 @@
 genNhex n = replicateM n genRandomHex
 
 n16bitsToken :: Int -> IO ()
-n16bitsToken n = replicateM n (genNhex 4) >>= putStr . intercalate ":"
+n16bitsToken n = replicateM n (fmap (dropWhile (=='0')) $ genNhex 4) >>= putStr . intercalate ":"
 
 count16bitsToken :: String -> Int
 count16bitsToken = foldl (\x y -> if y == '6' then x+1 else x) 0
@@ -105,7 +105,7 @@
         ([Help],_,_) -> putStrLn (usageInfo help options) >> exit
         (_,_,_) -> putStrLn (usageInfo help options) >> exit
 
-version = "ip6addrgen version 0.3.2"
+version = "ip6addrgen version 0.3.3"
 
 help = "Usage: ip6addrgen [-v|-h] | [-n] [-p]\n"
 
diff --git a/src/IPv6Addr.hs b/src/IPv6Addr.hs
--- a/src/IPv6Addr.hs
+++ b/src/IPv6Addr.hs
@@ -1,7 +1,7 @@
 module IPv6Addr where
 
 import Data.Char (intToDigit,isDigit,isHexDigit,toLower)
-import Data.List -- (group,groupBy,intercalate,intersperse,elemIndex)
+import Data.List (group,groupBy,intercalate,intersperse,elemIndex,isSuffixOf)
 import Data.Function (on)
 import Data.Maybe
 import Numeric
@@ -141,7 +141,7 @@
             then
                 (if Just DoubleColon `notElem` ts
                     then Just $ ipv6AddrToString (ipv4AddrToHex $ replaceTheLongestZerosRun ts)
-                    else Just $ ipv6AddrToString (ipv4AddrToHex $ replaceTheLongestZerosRun (expendDoubleColon ts)))
+                    else Just $ ipv6AddrToString (ipv4AddrToHex $ replaceTheLongestZerosRun (expandDoubleColon ts)))
             else Nothing
 
 -- The embedded IPv4 address have to be rewritten to output a pure IPv6 Address
@@ -180,8 +180,8 @@
                                     addZero s = if length s < 2 then '0':s else s
             otherwise -> ts
 
-expendDoubleColon :: [Maybe IPv6AddrToken] -> [Maybe IPv6AddrToken]
-expendDoubleColon mit = do
+expandDoubleColon :: [Maybe IPv6AddrToken] -> [Maybe IPv6AddrToken]
+expandDoubleColon mit = do
     let s = splitAt (fromJust $ elemIndex (Just DoubleColon) mit) mit
     let fsts = fst s
     let snds = if length(snd s) >= 1 then tail(snd s) else []
