Index: src/main.c
==================================================================
--- src/main.c
+++ src/main.c
@@ -411,16 +411,10 @@
   const char *zCmdName = "unknown";
   int idx;
   int rc;
   int i;
 
-#ifdef FOSSIL_ENABLE_TCL
-  g.tcl.argc = argc;
-  g.tcl.argv = argv;
-  g.tcl.interp = 0;
-#endif
-
   sqlite3_config(SQLITE_CONFIG_LOG, fossil_sqlite_log, 0);
   memset(&g, 0, sizeof(g));
   g.now = time(0);
   g.argc = argc;
   g.argv = argv;
@@ -436,22 +430,25 @@
   g.json.outOpt = cson_output_opt_empty;
   g.json.outOpt.addNewline = 1;
   g.json.outOpt.indentation = 1 /* in CGI/server mode this can be configured */;
 #endif /* FOSSIL_ENABLE_JSON */
   expand_args_option();
-  argc = g.argc;
-  argv = g.argv;
-  for(i=0; i<argc; i++) g.argv[i] = fossil_mbcs_to_utf8(argv[i]);
+  for(i=0; i<g.argc; i++) g.argv[i] = fossil_mbcs_to_utf8(g.argv[i]);
+#ifdef FOSSIL_ENABLE_TCL
+  g.tcl.argc = g.argc;
+  g.tcl.argv = g.argv;
+  g.tcl.interp = 0;
+#endif
   if( fossil_getenv("GATEWAY_INTERFACE")!=0 && !find_option("nocgi", 0, 0)){
     zCmdName = "cgi";
     g.isHTTP = 1;
-  }else if( argc<2 ){
+  }else if( g.argc<2 ){
     fossil_print(
        "Usage: %s COMMAND ...\n"
        "   or: %s help           -- for a list of common commands\n"
        "   or: %s help COMMMAND  -- for help with the named command\n",
-       argv[0], argv[0], argv[0]);
+       g.argv[0], g.argv[0], g.argv[0]);
     fossil_exit(1);
   }else{
     const char *zChdir = find_option("chdir",0,1);
     g.isHTTP = 0;
     g.fQuiet = find_option("quiet", 0, 0)!=0;
@@ -469,13 +466,13 @@
     if( find_option("help",0,0)!=0 ){
       /* --help anywhere on the command line is translated into
       ** "fossil help argv[1] argv[2]..." */
       int i;
       char **zNewArgv = fossil_malloc( sizeof(char*)*(g.argc+2) );
-      for(i=1; i<g.argc; i++) zNewArgv[i+1] = argv[i];
+      for(i=1; i<g.argc; i++) zNewArgv[i+1] = g.argv[i];
       zNewArgv[i+1] = 0;
-      zNewArgv[0] = argv[0];
+      zNewArgv[0] = g.argv[0];
       zNewArgv[1] = "help";
       g.argc++;
       g.argv = zNewArgv;
     }
     zCmdName = g.argv[1];
@@ -482,11 +479,11 @@
   }
   rc = name_search(zCmdName, aCommand, count(aCommand), &idx);
   if( rc==1 ){
     fossil_fatal("%s: unknown command: %s\n"
                  "%s: use \"help\" for more information\n",
-                   argv[0], zCmdName, argv[0]);
+                   g.argv[0], zCmdName, g.argv[0]);
   }else if( rc==2 ){
     int i, n;
     Blob couldbe;
     blob_zero(&couldbe);
     n = strlen(zCmdName);
@@ -496,11 +493,11 @@
       }
     }
     fossil_print("%s: ambiguous command prefix: %s\n"
                  "%s: could be any of:%s\n"
                  "%s: use \"help\" for more information\n",
-                 argv[0], zCmdName, argv[0], blob_str(&couldbe), argv[0]);
+                 g.argv[0], zCmdName, g.argv[0], blob_str(&couldbe), g.argv[0]);
     fossil_exit(1);
   }
   atexit( fossil_atexit );
   aCommand[idx].xFunc();
   fossil_exit(0);

Index: src/th_tcl.c
==================================================================
--- src/th_tcl.c
+++ src/th_tcl.c
@@ -389,13 +389,11 @@
     return TH_ERROR;
   }
   if ( tclContext->interp ){
     return TH_OK;
   }
-  if ( tclContext->argc>0 && tclContext->argv ) {
-    Tcl_FindExecutable(tclContext->argv[0]);
-  }
+  Tcl_FindExecutable(tclContext->argv[0]);
   tclInterp = tclContext->interp = Tcl_CreateInterp();
   if( !tclInterp || Tcl_InterpDeleted(tclInterp) ){
     Th_ErrorMessage(interp,
         "Could not create Tcl interpreter", (const char *)"", 0);
     return TH_ERROR;
@@ -405,10 +403,20 @@
         "Tcl initialization error:", Tcl_GetStringResult(tclInterp), -1);
     Tcl_DeleteInterp(tclInterp);
     tclContext->interp = tclInterp = 0;
     return TH_ERROR;
   }
+  if (tclContext->argc > 0) {
+	int argc = tclContext->argc - 1;
+	char **argv = tclContext->argv + 1;
+    Tcl_Obj *argvPtr = Tcl_NewListObj(0, NULL);
+    while (argc--) {
+      Tcl_ListObjAppendElement(NULL, argvPtr, Tcl_NewStringObj(*argv++, -1));
+    }
+    Tcl_SetVar2Ex(tclContext->interp, "argv", NULL, argvPtr, TCL_GLOBAL_ONLY);
+  }
+
   /* Add the TH1 integration commands to Tcl. */
   Tcl_CallWhenDeleted(tclInterp, Th1DeleteProc, interp);
   Tcl_CreateObjCommand(tclInterp, "th1Eval", Th1EvalObjCmd, interp, NULL);
   Tcl_CreateObjCommand(tclInterp, "th1Expr", Th1ExprObjCmd, interp, NULL);
   return TH_OK;