Index: modules/uri/uri.tcl
==================================================================
--- modules/uri/uri.tcl
+++ modules/uri/uri.tcl
@@ -62,11 +62,11 @@
 	variable	xCharN		{[a-zA-Z0-9$_.+!*'(,);/?:@&=-]}
 	variable	xChar		"(${xCharN}|${escape})"
 	variable	digits		"${digit}+"
 
 	variable	toplabel	\
-		"(${alpha}${alphaDigitMinus}*${alphaDigit}|${alpha})"
+		"(${alphaDigit}${alphaDigitMinus}*${alphaDigit}\\.?|${alphaDigit}\\.?)"
 	variable	domainlabel	\
 		"(${alphaDigit}${alphaDigitMinus}*${alphaDigit}|${alphaDigit})"
 
 	variable	hostname	\
 		"((${domainlabel}\\.)*${toplabel})"
@@ -165,12 +165,12 @@
 proc ::uri::split {url {defaultscheme http}} {
 
     set url [string trim $url]
     set scheme {}
 
-    # RFC 1738:	scheme = 1*[ lowalpha | digit | "+" | "-" | "." ]
-    regexp -- {^([A-Za-z0-9+.-][A-Za-z0-9+.-]*):} $url dummy scheme
+    # RFC 3986 Sec 3.1: scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
+    regexp -- {^([A-Za-z][A-Za-z0-9+.-]*):} $url dummy scheme
 
     if {$scheme == {}} {
 	set scheme $defaultscheme
 	switch -- $scheme {
 	    http - https - ftp {
@@ -297,11 +297,11 @@
     upvar #0 [namespace current]::http::segment segment
 
     array set parts {host {} port {} path {} query {} fragment {}}
 
     set searchPattern   "\\?(${search})\$"
-    set fragmentPattern "#(${segment})\$"
+    set fragmentPattern "#(.*)\$"
 
     # slash off possible fragment.
 
     # NOTE: This must be done before the query, because a fragment can
     # follow a query, and slashing off the query first will take the
@@ -711,11 +711,11 @@
 #
 # Results:
 #	Returns 1 if the URL is relative, 0 otherwise
 
 proc ::uri::isrelative url {
-    return [expr {![regexp -- {^[a-z0-9+-.][a-z0-9+-.]*:} $url]}]
+    return [expr {![regexp -- {^[A-Za-z][A-Za-z0-9+.-]*:} $url]}]
 }
 
 # ::uri::geturl --
 #
 #	Fetch the data from an arbitrary URL.

Index: modules/uri/uri.test
==================================================================
--- modules/uri/uri.test
+++ modules/uri/uri.test
@@ -474,14 +474,13 @@
     eval uri::join $ls
 } {http://tcl.apache.org/websh/faq.ws3#generic?foo=bar}
 
 # -------------------------------------------------------------------------
 
-test uri-8.0 {uri::split bug #676976, ill. char in scheme} {
-    set ls [uri::split ht,tp://tcl.apache.org/websh]
-    eval uri::join $ls
-} {http://ht/,tp://tcl.apache.org/websh}
+test uri-8.0 {uri::split bug #676976, ill. char in scheme} -body {
+    uri::split ht,tp://tcl.apache.org/websh
+} -returnCodes error -result {{invalid url} ,tp://tcl.apache.org/websh ht,tp://tcl.apache.org/websh}
 
 # -------------------------------------------------------------------------
 
 test uri-9.0 {uri::split bug #936064, user information} {
     dictsort [uri::split http://foo:bar@baz.com:80/bla/]

