diff --git a/gcc/cobol/genapi.cc b/gcc/cobol/genapi.cc
index 18e4ed2d0deca875347b7a20d898b5d678f8c1d7..a1c50628116c0831bd34ace1f66d19a9d21ee441 100644
--- a/gcc/cobol/genapi.cc
+++ b/gcc/cobol/genapi.cc
@@ -62,6 +62,8 @@
 #include "valconv.h"
 #include "show_parse.h"
 
+#define VS_REUSE vs_static
+
 extern void print_gimple_nodes(const char *filename, tree root);
 
 // This structure is returned by the parser_performxxx() routines, and gets
@@ -3711,20 +3713,8 @@ parser_symbol_add_FldLiteralN(struct cbl_field_t *field )
 
   tree var_type;
 
-  gg_variable_scope_t our_scope;
-  if( field->attr & (intermediate_e | temporary_e) )
-    {
-    //our_scope = vs_stack;
-    our_scope = vs_static;
-    }
-  else
-    {
-    our_scope = vs_static;
-    }
-
   if( field->data.capacity == 16 )
     {
-
     /*  GCC-13 has no provision for an int128 constructor.  So, we use a
         union for our necessary __int128.
 
@@ -3774,7 +3764,7 @@ parser_symbol_add_FldLiteralN(struct cbl_field_t *field )
 
     tree new_var_decl = gg_define_variable( var_type,
                                             base_name,
-                                            our_scope);
+                                            vs_static);
     DECL_INITIAL(new_var_decl) = union_constructor;
 
     field->data_decl_node = member(new_var_decl, "sval128");
@@ -3785,7 +3775,7 @@ parser_symbol_add_FldLiteralN(struct cbl_field_t *field )
     sprintf(id_string, ".%ld", ++our_index);
     strcpy(base_name, field->name);
     strcat(base_name, id_string);
-    field->literal_decl_node = gg_define_variable(DOUBLE, id_string, our_scope);
+    field->literal_decl_node = gg_define_variable(DOUBLE, id_string, vs_static);
     TREE_READONLY(field->literal_decl_node) = 1;
     TREE_CONSTANT(field->literal_decl_node) = 1;
     char ach[128];
@@ -3803,7 +3793,7 @@ parser_symbol_add_FldLiteralN(struct cbl_field_t *field )
                                     field->attr & signable_e);
     tree new_var_decl = gg_define_variable( var_type,
                                             base_name,
-                                            our_scope);
+                                            vs_static);
     DECL_INITIAL(new_var_decl) = build_int_cst_type(var_type, value);
     field->data_decl_node = new_var_decl;
     }
@@ -5125,11 +5115,6 @@ parser_exit(void)
       // variable on the stack.  We need to make a copy of it to avoid the
       // error of returning a pointer to data on the stack.
       
-      // Create a buffer that grows in size, as needed, to accommodate the
-      // data that needs to be returned.
-      
-#pragma GCC warning "Fix me: Create a buffer that grows in size"
-
       tree array_type = build_array_type_nelts(UCHAR,
                                     current_function->returning->data.capacity);
       tree retval     =  gg_define_variable(array_type, vs_static);
@@ -5771,7 +5756,7 @@ parser_division(cbl_division_t division,
           tree array_type = build_array_type_nelts(UCHAR, new_var->data.capacity);
           tree data_decl_node = gg_define_variable( array_type,
                                                     NULL,
-                                                    vs_stack);
+                                                    VS_REUSE);
           gg_assign( member(new_var->var_decl_node, "data"),
                             gg_get_address_of(data_decl_node) );
 
@@ -14438,15 +14423,31 @@ psa_new_var_decl(cbl_field_t *new_var, const char *external_record_base)
         }
       else if( strlen(new_var->name) == 0 )
         {
-        // This happens with some FldLiteralA variables.  For example, the
-        // filename in a SELECT statement.
-        static size_t literal_count = 1;
-        sprintf(base_name, "%s_%zd", "_literal", literal_count++);
+        // This can happen.
+        static int empty_count = 1;
+        sprintf(base_name,
+                "_%s_%d",
+                cbl_field_type_str(new_var->type),
+                empty_count++);
+        }
+      else if( new_var->attr & intermediate_e )
+        {
+        static int inter_count = 1;
+        sprintf(base_name,
+                "_%s_%s_%d",
+                "intermediate",
+                new_var->name,
+                inter_count++);
         }
-      else if( new_var->attr & (temporary_e | intermediate_e) )
+      else if( new_var->attr & temporary_e 
+               && !is_literal(new_var) )
         {
-        static size_t temp_count = 1;
-        sprintf(base_name, "%s_%zd_%s", "_temporary_", temp_count++, new_var->name);
+        static int temp_count = 1;
+        sprintf(base_name,
+                "_%s_%s_%d",
+                "temporary",
+                new_var->name,
+                temp_count++);
         }
       else
         {
@@ -14462,11 +14463,13 @@ psa_new_var_decl(cbl_field_t *new_var, const char *external_record_base)
                                           base_name,
                                           vs_external);
       }
-    else if( new_var->attr & (temporary_e | intermediate_e) )
+    else if( new_var->attr & (temporary_e | intermediate_e) 
+              && new_var->type != FldLiteralA
+              && new_var->type != FldLiteralN )
       {
       new_var_decl = gg_define_variable(  cblc_field_type_node,
                                           base_name,
-                                          vs_static); // vs_stack);
+                                          VS_REUSE);
       }
     else
       {
@@ -14518,6 +14521,13 @@ parser_local_add(struct cbl_field_t *new_var )
 void
 parser_symbol_add(struct cbl_field_t *new_var )
   {
+  if(new_var->var_decl_node)
+    {
+    fprintf(stderr, "possible reuse\n");
+    }
+    
+    
+    
   if( !(new_var->attr & initialized_e) )
     {
     cbl_field_type_t incoming_type = new_var->type;
@@ -14704,7 +14714,7 @@ parser_symbol_add(struct cbl_field_t *new_var )
         // a runtime copy of a structure for the variable; instead,
         // var_decl_node becomes a boolean_type_node that is used directly.
         sprintf(ach, "_%sconditional_%d", new_var->name, counter++);
-        new_var->var_decl_node = gg_define_variable(BOOL, ach, vs_static);
+        new_var->var_decl_node = gg_define_variable(BOOL, ach, VS_REUSE);
         return;
         break;
 
@@ -15006,7 +15016,21 @@ parser_symbol_add(struct cbl_field_t *new_var )
             {
             // We need a unique name for the allocated data for this COBOL variable:
             char achDataName[256];
-            sprintf(achDataName, "_%s_data_%lu", new_var->name, sv_data_name_counter++);
+            if( new_var->name[0] == '_' )
+              {
+              // Avoid doubling up on leading underscore
+              sprintf(achDataName,
+                      "%s_data_%lu",
+                      new_var->name,
+                      sv_data_name_counter++);
+              }
+            else
+              {
+              sprintf(achDataName,
+                      "_%s_data_%lu",
+                      new_var->name,
+                      sv_data_name_counter++);
+              }
 
             tree array_type = build_array_type_nelts(UCHAR, bytes_to_allocate);
             new_var->data_decl_node = gg_define_variable(
diff --git a/gcc/cobol/genutil.cc b/gcc/cobol/genutil.cc
index 6e82bb92fdbc2da6f8c767af760754c6fee2e068..803e0c2e97c5aedbab233d48ee4792ba085158d9 100644
--- a/gcc/cobol/genutil.cc
+++ b/gcc/cobol/genutil.cc
@@ -2431,12 +2431,7 @@ refer_fill_internal(cbl_refer_t &refer, refer_type_t refer_type)
           refer.field ? refer.field->name : "noname",
           counter++);
 
-  //// Trying to switch the next statement to vs_stack rather than vs_static.
-  //// That's a work in progress; at this time putting these on the stack results
-  //// in intermittent errors.  Apparently such data sometimes, but not always,
-  //// gets lost before it is used.  RJD 2024-04-07
-  refer.refer_decl_node = gg_define_variable(cblc_refer_type_node, ach, vs_static);
-//  refer.refer_decl_node = gg_define_variable(cblc_refer_type_node, ach, vs_stack);
+  refer.refer_decl_node = gg_define_variable(cblc_refer_type_node, ach, vs_stack);
   gg_memset(gg_get_address_of(refer.refer_decl_node),
             integer_zero_node,
             build_int_cst_type(SIZE_T, sizeof(cblc_refer_t)));
@@ -2467,18 +2462,6 @@ refer_fill_internal(cbl_refer_t &refer, refer_type_t refer_type)
         {
         gg_assign(member(refer.refer_decl_node, "qual_data"),
                   gg_cast(UCHAR_P, member(refer.field->var_decl_node, "initial")));
-#if 0
-        if( refer.field->attr & hex_encoded_e )
-          {
-          gg_assign(member(refer.refer_decl_node, "qual_size"),
-                    build_int_cst_type(SIZE_T, refer.field->data.capacity));
-          }
-        else
-          {
-          gg_assign(member(refer.refer_decl_node, "qual_size"),
-                    build_int_cst_type(SIZE_T, strlen(refer.field->data.initial)));
-          }
-#endif
         gg_assign(member(refer.refer_decl_node, "qual_size"),
                   build_int_cst_type(SIZE_T, refer.field->data.capacity));
         }
@@ -2598,15 +2581,14 @@ build_array_of_cblc_refer(  size_t N,
                             cbl_refer_t *refers)
   {
   // We create and populate an array of cblc_refer_t
-
   static size_t cblc_refer_size = gg_sizeof(cblc_refer_type_node);
 
-  tree refers_p = gg_define_variable(cblc_refer_p_type_node, vs_static);
-  tree walker   = gg_define_variable(cblc_refer_p_type_node, vs_static);
+  tree refers_p = gg_define_variable(cblc_refer_p_type_node, vs_stack);
+  tree walker   = gg_define_variable(cblc_refer_p_type_node, vs_stack);
 
   if( N )
     {
-    refers_p = gg_define_variable(cblc_refer_p_type_node, vs_static);
+    refers_p = gg_define_variable(cblc_refer_p_type_node, vs_stack);
     gg_assign(  refers_p,
                 gg_cast(cblc_refer_p_type_node, gg_malloc( N * cblc_refer_size)));
     gg_assign(  walker, refers_p);
@@ -2635,7 +2617,7 @@ build_array_of_cblc_size_t( size_t  N,
                             size_t *values)
   {
   // We create and populate an array of size_t values
-  tree values_p = gg_define_variable(build_pointer_type(SIZE_T), vs_static);
+  tree values_p = gg_define_variable(build_pointer_type(SIZE_T), vs_stack);
   if( N )
     {
     gg_assign(  values_p,
diff --git a/gcc/cobol/symbols.cc b/gcc/cobol/symbols.cc
index 81798fc25315df5fb9d09aa80b788bc06c6d3840..2e57410eef7bbbad24c1ab792a594a61a7878f82 100644
--- a/gcc/cobol/symbols.cc
+++ b/gcc/cobol/symbols.cc
@@ -3020,7 +3020,11 @@ new_literal_add( const char initial[], uint32_t len, enum cbl_field_attr_t attr
     }
 
   static size_t literal_count = 1;
-  sprintf(field->name, "%s_%zd", "_literal", literal_count++);
+  sprintf(field->name, 
+          "%s%c_%zd",
+          "_literal",
+          field->type == FldLiteralA ? 'a' : 'n',
+          literal_count++);
 
   return parser_symbol_add2(field);
 }