diff --git a/gcc/cobol/symbols.cc b/gcc/cobol/symbols.cc
index 8640e6bc65d3afd118cdd6394b2560def2e1f97c..84aa35a264a48665f25daa8001ff7b5021aeaa55 100644
--- a/gcc/cobol/symbols.cc
+++ b/gcc/cobol/symbols.cc
@@ -3111,15 +3111,14 @@ new_literal( uint32_t len, const char initial[], enum cbl_field_attr_t attr ) {
 }
 
 cbl_field_t *
-temporaries_t::acquire( cbl_field_type_t type ) {
+temporaries_t::reuse( cbl_field_type_t type ) {
   auto& fields = freed[type];
   cbl_field_t *field;
   
   if( fields.empty() ) {
-    field = new_temporary_add(type);
+    return NULL;
   } else {
     auto p = fields.begin();
-    parser_symbol_add(*p);
     field = *p;
     fields.erase(p);
   }
@@ -3128,6 +3127,18 @@ temporaries_t::acquire( cbl_field_type_t type ) {
   return field;
 }
 
+cbl_field_t *
+temporaries_t::acquire( cbl_field_type_t type ) {
+  cbl_field_t *field = reuse(type);
+
+  if( field ) {
+    parser_symbol_add(field); // notify of reuse 
+  } else {
+    field = new_temporary_add(type);
+  }
+  return field;
+}
+
 size_t
 temporaries_t::keep() {
   keepers.push(used);
@@ -3215,25 +3226,30 @@ new_temporary( enum cbl_field_type_t type, const char *initial ) {
 
 cbl_field_t *
 new_temporary_like( cbl_field_t skel ) {
-  auto field = new_temporary_impl(skel.type);
+  auto field = temporaries.reuse(skel.type);
+  if( ! field ) {
+    field = new_temporary_impl(skel.type);
+    temporaries.add(field);
+  }
   memcpy(skel.name, field->name, sizeof(field->name));
   *field = skel;
 
-  temporaries.add(field);
   return parser_symbol_add2(field);
 }
 
 cbl_field_t *
 new_temporary_clone( const cbl_field_t *orig) {
   cbl_field_type_t type = is_literal(orig)? FldAlphanumeric : orig->type;
-  auto field = new_temporary_impl(type);
+  auto field = temporaries.reuse(type);
+  if( ! field ) {
+    field = new_temporary_impl(type);
+    temporaries.add(field);
+  }
   field->data = orig->data;
   if( field->type == FldNumericBin5 ) field->type = orig->type;
   field->attr = temporary_e;
 
-  temporaries.add(field);
-  parser_symbol_add(field);
-  return field;
+  return parser_symbol_add2(field);
 }
 
 bool
diff --git a/gcc/cobol/symbols.h b/gcc/cobol/symbols.h
index f2a71639185284ea1c9247b750c66f4248c5661e..1181b0b3baae4eba2a0c9c3a25a51c17b443d376 100644
--- a/gcc/cobol/symbols.h
+++ b/gcc/cobol/symbols.h
@@ -1244,6 +1244,7 @@ class temporaries_t {
 
 public:
   cbl_field_t * literal( const char value[], uint32_t len, cbl_field_attr_t attr  = none_e );
+  cbl_field_t * reuse( cbl_field_type_t type );
   cbl_field_t * acquire( cbl_field_type_t type );
   size_t keep();
   void release( size_t kept);