Index: src/tkt.c
==================================================================
--- src/tkt.c
+++ src/tkt.c
@@ -923,10 +923,11 @@
 */
 void ticket_cmd(void){
   int n;
   const char *zUser;
   const char *zDate;
+  const char *zTktUuid;
 
   /* do some ints, we want to be inside a checkout */
   db_find_and_open_repository(0, 0);
   user_select();
 
@@ -933,10 +934,14 @@
   zUser = find_option("user-override",0,1);
   if( zUser==0 ) zUser = g.zLogin;
   zDate = find_option("date-override",0,1);
   if( zDate==0 ) zDate = "now";
   zDate = date_in_standard_format(zDate);
+  zTktUuid = find_option("uuid-override",0,1);
+  if ( zTktUuid && strlen(zTktUuid) != UUID_SIZE ) {
+      fossil_fatal("UUID must have exacly %d characters.\n", UUID_SIZE);
+  }
 
   /*
   ** Check that the user exists.
   */
   if( !db_exists("SELECT 1 FROM user WHERE login=%Q", zUser) ){
@@ -997,11 +1002,10 @@
     }else{
       /* add a new ticket or update an existing ticket */
       enum { set,add,history,err } eCmd = err;
       int i = 0;
       int rid;
-      const char *zTktUuid = 0;
       Blob tktchng, cksum;
 
       /* get command type (set/add) and get uuid, if needed for set */
       if( strncmp(g.argv[2],"set",n)==0 || strncmp(g.argv[2],"change",n)==0 ||
          strncmp(g.argv[2],"history",n)==0 ){
@@ -1021,11 +1025,11 @@
         }
         i=4;
       }else if( strncmp(g.argv[2],"add",n)==0 ){
         eCmd = add;
         i = 3;
-        zTktUuid = db_text(0, "SELECT lower(hex(randomblob(20)))");
+        if ( !zTktUuid ) zTktUuid = db_text(0, "SELECT lower(hex(randomblob(20)))");
       }
       /* none of set/add, so show the usage! */
       if( eCmd==err ){
         usage("add|fieldlist|set|show|history");
       }
