Index: /trunk/gui/filexfer/monitor.java
===================================================================
--- /trunk/gui/filexfer/monitor.java	(revision 212)
+++ /trunk/gui/filexfer/monitor.java	(revision 213)
@@ -19,4 +19,6 @@
 
 public class monitor extends Thread {
+    private String protocol = "1.0";
+
     private filexfer parent;
     private String hostName;
@@ -136,5 +138,5 @@
 
         try {
-            ostream.println("REGISTER "+user+" "+ipAddr+" "+cookie+" RAPPTURE");
+            ostream.println("REGISTER "+user+" "+ipAddr+" "+cookie+" RAPPTURE/"+protocol);
             ostream.println("ACTIVATE RAPPTURE");
             parent.status.append("Connected\n");
Index: /trunk/gui/scripts/analyzer.tcl
===================================================================
--- /trunk/gui/scripts/analyzer.tcl	(revision 212)
+++ /trunk/gui/scripts/analyzer.tcl	(revision 213)
@@ -619,4 +619,12 @@
                             Rappture::Tooltip::cue $widget "Can't download this result.  Looks like you might be having trouble with the version of Java installed for your browser."
                         }
+                    } elseif {"old client" == $result} {
+                        if {"" != $widget} {
+                            Rappture::Tooltip::cue $widget "For this to work properly, you must first restart your Web browser.  You don't need to close down this session.  Simply shut down all windows for your Web browser, then restart the browser and navigate back to this page.  You'll find it on \"my nanoHUB\" listed under \"my sessions\".  Once the browser is restarted, the download should work properly."
+                        }
+                    } elseif {"old clients" == $result} {
+                        if {"" != $widget} {
+                            Rappture::Tooltip::cue $widget "There are multiple browser pages connected to this session, and one of them has browser that needs to be restarted.\n\nWhoever didn't get the download should restart their Web browser.  You don't need to close down this session.  Simply shut down all windows for the Web browser, then restart the browser and navigate back to this page.  You'll find it on \"my nanoHUB\" listed under \"my sessions\".  Once the browser is restarted, the download should work properly."
+                        }
                     } else {
                         error $result "    (while spooling result \"$title\")"
Index: /trunk/gui/scripts/filexfer.tcl
===================================================================
--- /trunk/gui/scripts/filexfer.tcl	(revision 212)
+++ /trunk/gui/scripts/filexfer.tcl	(revision 213)
@@ -45,4 +45,9 @@
     }
 
+    # maps client socket => socket protocol
+    # if it doesn't match, we warn user to restart the browser
+    variable protocol
+    set protocol(current) "1.0"
+
     #
     # Translates mime type => file extension
@@ -182,4 +187,5 @@
     variable enabled
     variable clients
+    variable protocol
     variable access
 
@@ -214,7 +220,11 @@
 
         set sent 0
+        set protoproblems 0
         set access($filename) [bakeCookie]
         foreach cid $clients(order) {
             if {[info exists clients($cid)] && $clients($cid)} {
+                if {![string equal $protocol($cid) $protocol(current)]} {
+                    incr protoproblems
+                }
                 catch {
                     puts $cid [format "url /spool/%s/%s?access=%s" \
@@ -226,4 +236,9 @@
         if {!$sent} {
             error "no clients"
+        }
+        if {$protoproblems == 1} {
+            error "old client"
+        } elseif {$protoproblems > 1} {
+            error "old clients"
         }
     }
@@ -351,5 +366,5 @@
             }
             # blank line -- process below...
-        } elseif {[regexp { +RAPPTURE$} $line]} {
+        } elseif {[regexp { +RAPPTURE(/[0-9\.]+)?$} $line]} {
             set buffer($cid) $line
             # special Rappture request -- process below...
@@ -373,10 +388,10 @@
         set lines [lrange $lines 1 end]
         if {![regexp {^ *([A-Z]+) +([^ ]+) +(HTTP/1\.[01])$} $line \
-              match type url protocol]
-            && ![regexp { +(RAPPTURE)$} $line match protocol]} {
+              match type url proto]
+            && ![regexp { +(RAPPTURE(/[0-9\.]+)?)$} $line match proto]} {
             set errmsg "Malformed request: $line"
         }
 
-        if {[string match HTTP/* $protocol]} {
+        if {[string match HTTP/* $proto]} {
             #
             # HANDLE HTTP/1.x REQUESTS...
@@ -425,11 +440,13 @@
                 shutdown $cid
             }
-        } elseif {$protocol == "RAPPTURE"} {
+        } elseif {[string match RAPPTURE* $proto]} {
             #
             # HANDLE SPECIAL RAPPTURE REQUESTS...
             #
-            if {[regexp {^ *(REGISTER) +([^ ]+) +([^ ]+) +([^ ]+) +RAPPTURE$} \
-                  $line match type user addr cookie]} {
-                request_REGISTER $cid $user $addr $cookie
+            set vers "0.0"
+            if {[regexp {^ *(REGISTER) +([^ ]+) +([^ ]+) +([^ ]+) +RAPPTURE(/[0-9\.]+)?$} \
+                  $line match type user addr cookie vers]} {
+                  set vers [string trimleft $vers /]
+                request_REGISTER $cid $user $addr $cookie $vers
             } elseif {[regexp {^ *UNREGISTER +RAPPTURE$} $line]} {
                 request_UNREGISTER $cid
@@ -684,9 +701,10 @@
               && [info exists uploadcmds($post(callback))]} {
             # get the data -- either text or file
-            set data $post($post(which))
+            set dlist [list which $post(which)]
+            lappend dlist data $post($post(which))
 
             # get the upload callback command
             set cmd $uploadcmds($post(callback))
-            if {[catch "$cmd [list $data]" result]} {
+            if {[catch "$cmd $dlist" result]} {
                 bgerror $result
             }
@@ -732,14 +750,17 @@
 
 # ----------------------------------------------------------------------
-# USAGE: request_REGISTER <clientId> <user> <address> <cookie>
+# USAGE: request_REGISTER <clientId> <user> <address> <cookie> <protocol>
 #
 # Used internally to handle REGISTER requests on this server.  A client
 # sends REGISTER requests when it wants to be notified of file transfer
 # operations.  The <cookie> must match the one for this server, so
-# we know we can trust the client.
-# ----------------------------------------------------------------------
-proc Rappture::filexfer::request_REGISTER {cid user addr clientCookie} {
+# we know we can trust the client.  The <protocol> tells us what version
+# of filexfer client we're talking to.  If the protocol doesn't match
+# the current version, we warn the user to restart his browser.
+# ----------------------------------------------------------------------
+proc Rappture::filexfer::request_REGISTER {cid user addr clientCookie proto} {
     variable clients
     variable cookie
+    variable protocol
 
     if {![string equal $cookie $clientCookie]} {
@@ -749,4 +770,5 @@
         # add this client to the known listeners
         set clients($cid) 0
+        set protocol($cid) $proto
     }
 }
Index: /trunk/gui/scripts/loader.tcl
===================================================================
--- /trunk/gui/scripts/loader.tcl	(revision 212)
+++ /trunk/gui/scripts/loader.tcl	(revision 213)
@@ -286,9 +286,13 @@
             if {$status == 0} {
                 Rappture::Tooltip::cue $itk_component(combo) \
-                    "Upload starting...\nA web browser page should pop up on your desktop.  Use that form to handle the upload operation."
+                    "Upload starting...\nA web browser page should pop up on your desktop.  Use that form to handle the upload operation.\n\nIf the upload form doesn't pop up, make sure that you're allowing pop ups from this site.  If it still doesn't pop up, you may be having trouble with the version of Java installed for your browser.  See our Support area for details.\n\nClick anywhere to dismiss this message."
             } else {
                 if {$result == "no clients"} {
                     Rappture::Tooltip::cue $itk_component(combo) \
                         "Can't upload files.  Looks like you might be having trouble with the version of Java installed for your browser."
+                } elseif {"old client" == $result} {
+                    Rappture::Tooltip::cue $itk_component(combo) "For this to work properly, you must first restart your Web browser.  You don't need to close down this session.  Simply shut down all windows for your Web browser, then restart the browser and navigate back to this page.  You'll find it on \"my nanoHUB\" listed under \"my sessions\".  Once the browser is restarted, the upload should work properly."
+                } elseif {"old clients" == $result} {
+                    Rappture::Tooltip::cue $itk_component(combo) "There are multiple browser pages connected to this session, and one of them has browser that needs to be restarted.\n\nWhoever didn't get the upload form should restart their Web browser.  You don't need to close down this session.  Simply shut down all windows for the Web browser, then restart the browser and navigate back to this page.  You'll find it on \"my nanoHUB\" listed under \"my sessions\".  Once the browser is restarted, the upload should work properly."
                 } else {
                     bgerror $result
@@ -314,4 +318,8 @@
                     Rappture::Tooltip::cue $itk_component(combo) \
                         "Can't download data.  Looks like you might be having trouble with the version of Java installed for your browser."
+                } elseif {"old client" == $result} {
+                    Rappture::Tooltip::cue $itk_component(combo) "For this to work properly, you must first restart your Web browser.  You don't need to close down this session.  Simply shut down all windows for your Web browser, then restart the browser and navigate back to this page.  You'll find it on \"my nanoHUB\" listed under \"my sessions\".  Once the browser is restarted, the download should work properly."
+                } elseif {"old clients" == $result} {
+                    Rappture::Tooltip::cue $itk_component(combo) "There are multiple browser pages connected to this session, and one of them has browser that needs to be restarted.\n\nWhoever didn't get the download should restart their Web browser.  You don't need to close down this session.  Simply shut down all windows for the Web browser, then restart the browser and navigate back to this page.  You'll find it on \"my nanoHUB\" listed under \"my sessions\".  Once the browser is restarted, the download should work properly."
                 } else {
                     bgerror $result
@@ -380,5 +388,5 @@
 
 # ----------------------------------------------------------------------
-# USAGE: _uploadValue
+# USAGE: _uploadValue ?<key> <value> <key> <value> ...?
 #
 # Invoked automatically whenever the user has uploaded data from
@@ -386,6 +394,26 @@
 # argument) and loads into the destination widget.
 # ----------------------------------------------------------------------
-itcl::body Rappture::Loader::_uploadValue {string} {
+itcl::body Rappture::Loader::_uploadValue {args} {
     Rappture::Tooltip::cue hide  ;# take down the note about the popup window
+
+    array set data $args
+
+    if {[string length [string trim $data(data)]] == 0} {
+        switch -- $data(which) {
+            file {
+                set mesg "You indicated that you were uploading a file, but y"
+            }
+            text {
+                set mesg "You indicated that you were uploading text, but y"
+            }
+            default {
+                set mesg "Y"
+            }
+        }
+        Rappture::Tooltip::cue $itk_component(combo) \
+            "${mesg}ou didn't fill in any data on the upload form."
+        return
+    }
+
     #
     # BE CAREFUL:  This string may have binary characters that
@@ -394,4 +422,5 @@
     #   done with it.
     #
+    set string $data(data)
     regsub -all {[\000-\010\013\014\016-\037\177-\377]} $string {} string
     regsub -all "\r" $string "\n" string
Index: /trunk/gui/scripts/tooltip.tcl
===================================================================
--- /trunk/gui/scripts/tooltip.tcl	(revision 212)
+++ /trunk/gui/scripts/tooltip.tcl	(revision 213)
@@ -145,5 +145,5 @@
     }
     set pos 0
-    ::for {set i 0} {$pos >= 0 && $i < 5} {incr i} {
+    ::for {set i 0} {$pos >= 0 && $i < 20} {incr i} {
         incr pos
         set pos [string first \n $mesg $pos]
