diff --git a/gcc/cobol/cdf.y b/gcc/cobol/cdf.y
index 5e59a3cf4ea33d4334739689267afc6dad7e583e..84be0ddc4ac75724cf7d562c8b206a7976c0c158 100644
--- a/gcc/cobol/cdf.y
+++ b/gcc/cobol/cdf.y
@@ -759,10 +759,10 @@ defined_cmd( const char arg[] )
   if(p) {
     *p++ = '\0';
     int pos, number;
-    if( 1 == sscanf(p, "%d%n", &number, &pos) ) {
-      if( size_t(pos) == strlen(p) ) {
+    if( 1 == sscanf(p, "%d%n", &number, &pos) && size_t(pos) == strlen(p) ) {
 	value = cdfval_t(number);
-      }
+    } else {
+      value = cdfval_t(p);  // it's a string
     }
   }
   
diff --git a/gcc/cobol/parse.y b/gcc/cobol/parse.y
index 7a33e90941905e6fc03688d9b270e6e1a9a98b0e..038f356ff738b28d3b5a08b8ca1edfa1dc9b40bc 100644
--- a/gcc/cobol/parse.y
+++ b/gcc/cobol/parse.y
@@ -6044,6 +6044,13 @@ stop_how:       %empty
                 {
                   $$ = $stop_status? $stop_status : new_reference(literally_one);
                 }
+	|	RETURNING stop_status
+                {
+		  if( ! dialect_mf() ) {
+                    yyerror("error: RETURNING <number> requires -dialect mf");
+		  }
+                  $$ = $stop_status? $stop_status : new_reference(literally_one);
+                }
                 ;
 stop_status:    status         { $$ = NULL; }
         |       status scalar  { $$ = $2; }
diff --git a/gcc/cobol/scan.l b/gcc/cobol/scan.l
index 8a1f4fef073db1b5c35cb972b02fbbdd782f784c..6eddc2a4ee72703c083376fbb99898e886113b0c 100644
--- a/gcc/cobol/scan.l
+++ b/gcc/cobol/scan.l
@@ -1087,7 +1087,7 @@ USE({SPC}FOR)?		{ return USE; }
   FD/[[:blank:]]+       { parsing.need_level(false); return FD; }
   SD/[[:blank:]]+       { parsing.need_level(false); return SD; }
 
-  {NAME}                { yylval.string = strdup(yytext);
+  {NAME}                { ydflval.string = yylval.string = strdup(yytext);
                           const char *value = is_numeric_constant(yytext);
                           return value? numstr_of(value) : NAME; }
 
@@ -1933,12 +1933,12 @@ COPY		{
 }
 
 
-<*>OR	        { return OR; }
-<*>AND          { return AND; }
-<*>[().=*/+&-]    { return *yytext; }
-
-<*>[[:blank:]]+ {}
-<*>\r?\n        {}
+<*>OR 			{ return OR; }
+<*>AND			{ return AND; }
+<*>[().=*/+&-]		{ return *yytext; }
+<*>[.][[:blank:].]+  	{ return '.'; }
+<*>[[:blank:]]+
+<*>\r?\n
 
 <*>{
   {COMMA}