diff --git a/ChangeLog b/ChangeLog
new file mode 100644
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,9 @@
+2009-06-26	Michel Boucey <michel.boucey@gmail.com>
+
+	- Version 0.1 released.
+
+2009-09-11	Michel Boucey <michel.boucey@gmail.com>
+
+	- Version 0.1.1 released.
+	- Fixed three bugs in IPv6 address validation.
+	- Added a test written in Perl.
diff --git a/IsIPv6Addr.hs b/IsIPv6Addr.hs
--- a/IsIPv6Addr.hs
+++ b/IsIPv6Addr.hs
@@ -43,7 +43,7 @@
 isIPv4Token s
               | s == "." = 'd'
               | is8bitsToken s == True = '8'
-              | otherwise = 'u'
+              | otherwise = '?'
 
 internalIPv4Rep :: [String] -> String
 internalIPv4Rep = map isIPv4Token
@@ -59,7 +59,7 @@
                    | f == 0 = 0
                    | f == 1 = 1
                    | otherwise = -1
-                   where f = length $ filter(=='4') s
+                   where f = length $ filter (=='4') s
 
 isIPv4Addr :: String -> Bool
 isIPv4Addr = parseIPv4Tokens . internalIPv4Rep . tokenizeIPv4AddrInput
@@ -78,13 +78,13 @@
                | s == "::" = 'd'
                | is16bitsToken s == True = '6'
                | isIPv4Addr s == True = '4'
-               | otherwise = 'u'
+               | otherwise = '?'
                
 internalIPv6Rep :: [String] -> String
 internalIPv6Rep = map ipv6AddrToken
 
 parseInternalRep :: String -> Bool
-parseInternalRep s = 'u' `notElem` s
+parseInternalRep s = '?' `notElem` s
 
 isCompressed :: String -> Int
 isCompressed s
@@ -94,19 +94,19 @@
               where c = length $ filter (=='d') s
 
 lengthConstraints :: String -> Bool
-lengthConstraints s = (l == 15 && c <= 0) || (l < 15 && c == 1)
-                      where l = length s
-                            c = isCompressed s
+lengthConstraints s = case embeddedIPv4Addr s of
+			0 -> (e == '6' || e == 'd') && ((l == 15 && c <= 0) || (l < 15 && c == 1))
+			1 -> (e == '4' && l == 13 && c <= 0) || (e == '4' && l < 13 && c == 1)
+                        -1 -> False
+			where l = length s
+			      c = isCompressed s
+			      e = last s
 
-validLastToken :: String -> Bool
-validLastToken s = case embeddedIPv4Addr s of
-                           0 -> t == '6' || t == 'd'
-                           1 -> t == '4'
-                           -1 -> False
-                           where t = last s
+validFirstToken :: String -> Bool
+validFirstToken s = h == '6' || h == 'd' where h = head s 
 
 testsIPv6Addr :: String -> Bool
-testsIPv6Addr s = lengthConstraints s && parseInternalRep s && validLastToken s
+testsIPv6Addr s = lengthConstraints s && parseInternalRep s && validFirstToken s
    
 isIPv6Addr :: String -> Bool
-isIPv6Addr = testsIPv6Addr . internalIPv6Rep . tokenizeIPv6Input            
+isIPv6Addr = testsIPv6Addr . internalIPv6Rep . tokenizeIPv6Input            
diff --git a/Main.hs b/Main.hs
--- a/Main.hs
+++ b/Main.hs
@@ -65,7 +65,7 @@
                        then hPutStrLn stdout a >> evalInputsErr as
                        else hPutStrLn stderr a >> evalInputsErr as
 
-version = "ip6addr 0.1"
+version = "ip6addr Version 0.1.1"
 help   = "Usage: ip6addr [-v|-h] | [-e] [address ...]\n"
 exit    = exitWith ExitSuccess
 
diff --git a/Makefile b/Makefile
--- a/Makefile
+++ b/Makefile
@@ -11,8 +11,10 @@
 build: clean configure
 	$(RHS) build
 
+
+.PHONY: test
+test:
+	./test/test.pl
+
 install: clean configure build
 	$(RHS) install
-
-sdist:
-	$(RHS) sdist
diff --git a/ip6addr.cabal b/ip6addr.cabal
--- a/ip6addr.cabal
+++ b/ip6addr.cabal
@@ -1,5 +1,5 @@
 Name:		ip6addr
-Version:	0.1
+Version:	0.1.1
 Author:         Michel Boucey <michel.boucey@gmail.com>
 Maintainer:     Michel Boucey <michel.boucey@gmail.com>
 Homepage:       http://www.cybervisible.fr/ip6addr
diff --git a/test/inputs b/test/inputs
new file mode 100644
--- /dev/null
+++ b/test/inputs
@@ -0,0 +1,26 @@
+:::!0
+::4AF:!0
+:!0
+::!1
+0:0:0:0:0:0:0:0!1
+0:0:0:0:0:0:0:0:0!0
+::1!1
+0:0:0:0:0:0:0:1!1
+ABCD:EF01:2345:6789:ABCD:EF01:2345:6789!1
+0:ABCD:EF01:2345:6789:ABCD:EF01:2345:6789!0
+ABCD:EF01:123.67.3.45:6789:ABCD:EF01:2345:78.123.23.79!0
+ABCD:EF01:2345:6789:ABTD:EF01:2345:6789!0
+ABCD::2345:6789:ABTD::2345:6789!0
+:EF01:2345:6789:ABCD:EF01:2345:6789!0
+2001:DB8:0:0:8:800:200C:417A!1
+2001:DB8:0:0:8:8004:200CD:417A!0
+FF01:0:0:0:0:0:0:101!1
+FF01::101!1
+0:0:0:0:0:0:13.1.68.3!1
+::13.1.68.3!1
+0:0:0:0:0:FFFF:129.144.52.38!1
+0:0:0:0:0:FFFF:0:129.144.52.38!0
+0:0:0:0:0:129.144.52.38:0!0
+::FFFF:129.144.52.38!1
+::FFFF:129.144.52.38:ADEF!0
+129.144.52.38:ADEF!0
diff --git a/test/test.pl b/test/test.pl
new file mode 100644
--- /dev/null
+++ b/test/test.pl
@@ -0,0 +1,30 @@
+#!/usr/bin/perl -w
+
+use Cwd 'abs_path';
+use File::Basename;
+
+chdir(dirname(abs_path($0)));
+$ip6addr = "../dist/build/ip6addr/ip6addr";
+
+if (-e $ip6addr) {
+	@testList = `cat ./inputs`;
+	$fcpt = 0;
+	print "\n";
+	foreach (@testList) {
+		@test = split(/!/);
+		$result = `$ip6addr $test[0]`;
+		chomp($result);
+		if ($test[1] == "0") {print "Bad";} else {print "Good";}	
+		print " input \"$test[0]\" - ";
+		if (($result eq "" && $test[1] == "0")||($result eq $test[0] && $test[1] == "1")) {
+			print "PASSED\n";
+		} else {
+			print "FAILED !\n";
+			$fcpt++;
+		} 
+		$cpt++;
+	}
+	print "\nTests: $cpt\nFailed tests: $fcpt\n\n";
+} else {
+	print "Run  a 'make build' before testing...\n"
+}
