Use XREF_ANY for an association, instead of XREF_INDI.
[gedcom-parse.git] / gedcom / gedcom.y
index a0481851dd4aa3e0e1ba5a2737c6f88d402744f3..44613d991e52eb560bbcec9a6176e68f8a1fb35f 100644 (file)
 #include "encoding.h"
 #include "interface.h"
 #include "date.h"
+#include "age.h"
+#include "xref.h"
+#include "compat.h"
 
 int  count_level    = 0;
 int  fail           = 0;
-int  compat_enabled = 1;
 int  gedcom_high_level_debug = 0; 
-int  compatibility  = 0; 
 Gedcom_err_mech error_mechanism = IMMED_FAIL;
-Gedcom_val_struct val; 
+Gedcom_val_struct val1;
+Gedcom_val_struct val2; 
  
 char line_item_buf[MAXGEDCLINELEN * UTF_FACTOR + 1];
 char *line_item_buf_ptr;
 
-enum _COMPAT {
-  C_FTREE = 0x01
-};
-
 /* These are defined at the bottom of the file */ 
 void push_countarray();
 void set_parenttag(char* tag);
-char* get_parenttag(); 
+char* get_parenttag(int offset); 
 void set_parentctxt(Gedcom_ctxt ctxt);
-Gedcom_ctxt get_parentctxt();
+Gedcom_ctxt get_parentctxt(int offset);
 void pop_countarray();
 int  count_tag(int tag);
 int  check_occurrence(int tag);
-void set_compatibility(char* program);
-int  compat_mode(int flags); 
 
 #define CLEAR_BUFFER(BUF)                                                     \
      memset(BUF, 0, sizeof(BUF));
@@ -201,15 +197,17 @@ int  compat_mode(int flags);
        START2(PARENTCTXT);                                                    \
      }
 #define PARENT                                                                \
-     get_parentctxt()
+     get_parentctxt(0)
+#define GRANDPARENT(OFF)                                                      \
+     get_parentctxt(OFF)
 #define CHK(TAG)                                                              \
      { if (!check_occurrence(TAG_##TAG)) {                                    \
-         char* parenttag = get_parenttag();                                   \
+         char* parenttag = get_parenttag(0);                                  \
          gedcom_error(_("The tag '%s' is mandatory within '%s', but missing"),\
                      #TAG, parenttag);                                       \
          HANDLE_ERROR;                                                        \
        }                                                                      \
-     }
+     } 
 #define POP                                                                   \
      { pop_countarray();                                                      \
        --count_level;                                                         \
@@ -226,14 +224,14 @@ int  compat_mode(int flags);
 #define OCCUR2(CHILDTAG, MIN, MAX)                                            \
      { int num = count_tag(TAG_##CHILDTAG);                                   \
        if (num > MAX) {                                                       \
-         char* parenttag = get_parenttag();                                   \
+         char* parenttag = get_parenttag(0);                                  \
          gedcom_error(_("The tag '%s' can maximally occur %d time(s) within '%s'"),                                                                          \
                      #CHILDTAG, MAX, parenttag);                             \
          HANDLE_ERROR;                                                        \
        }                                                                      \
      }
 #define INVALID_TAG(CHILDTAG)                                                 \
-     { char* parenttag = get_parenttag();                                     \
+     { char* parenttag = get_parenttag(0);                                    \
        gedcom_error(_("The tag '%s' is not a valid tag within '%s'"),         \
                    CHILDTAG, parenttag);                                     \
        HANDLE_ERROR;                                                          \
@@ -254,7 +252,7 @@ int  compat_mode(int flags);
 }
 
 %token_table
-%expect 300
+%expect 304
 
 %token <string> BADTOKEN
 %token <number> OPEN
@@ -402,7 +400,6 @@ int  compat_mode(int flags);
 %type <tag> indiv_gen_tag
 %type <tag> lio_bapl_tag
 %type <string> line_item
-%type <string> line_value
 %type <string> mand_line_item
 %type <string> mand_pointer
 %type <string> note_line_item
@@ -416,6 +413,8 @@ int  compat_mode(int flags);
 
 file        : head_sect records trlr_sect
                { if (fail == 1) YYABORT; }
+            | error
+               {  }
             ;
 
 records     : /* empty */
@@ -437,17 +436,29 @@ record      : fam_rec
 /**** Header                                                      ****/
 /*********************************************************************/
 head_sect    : OPEN DELIM TAG_HEAD
-               { $<ctxt>$ = start_record(REC_HEAD, $1, GEDCOM_MAKE_NULL(), $3,
-                                        NULL, GEDCOM_MAKE_NULL());
+               { $<ctxt>$ = start_record(REC_HEAD, $1, GEDCOM_MAKE_NULL(val1),
+                                        $3,
+                                        NULL, GEDCOM_MAKE_NULL(val2));
                 START(HEAD, $<ctxt>$) }
                head_subs
-               { if (compat_mode(C_FTREE))
-                  CHECK3(SOUR, GEDC, CHAR)
+               { if (compat_mode(C_FTREE)) {
+                  CHECK3(SOUR, GEDC, CHAR);
+                  compat_generate_submitter_link($<ctxt>4);
+                }
+                else if (compat_mode(C_LIFELINES)) {
+                  CHECK1(SOUR);
+                  compat_generate_submitter_link($<ctxt>4);
+                  compat_generate_gedcom($<ctxt>4);
+                  if (compat_generate_char($<ctxt>4)) YYABORT;
+                }
                 else
                   CHECK4(SOUR, SUBM, GEDC, CHAR)
               }
                CLOSE
-               { end_record(REC_HEAD, $<ctxt>4); }
+               { end_record(REC_HEAD, $<ctxt>4);
+                if (compat_mode(C_FTREE | C_LIFELINES))
+                  compat_generate_submitter();
+              }
              ;
 
 head_subs    : /* empty */
@@ -457,6 +468,9 @@ head_subs    : /* empty */
 head_sub     : head_sour_sect  { OCCUR2(SOUR, 1, 1) }
              | head_dest_sect  { OCCUR2(DEST, 0, 1) }
              | head_date_sect  { OCCUR2(DATE, 0, 1) }
+             | head_time_sect  { if (!compat_mode(C_LIFELINES))
+                                 INVALID_TAG("TIME");
+                                OCCUR2(TIME, 0, 1) }
              | head_subm_sect  { OCCUR2(SUBM, 1, 1) }
              | head_subn_sect  { OCCUR2(SUBN, 0, 1) }
              | head_file_sect  { OCCUR2(FILE, 0, 1) }
@@ -474,7 +488,7 @@ head_sour_sect : OPEN DELIM TAG_SOUR mand_line_item
                  { set_compatibility($4);
                   $<ctxt>$ = start_element(ELT_HEAD_SOUR, PARENT,
                                            $1, $3, $4,
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(SOUR, $<ctxt>$)
                 }
                  head_sour_subs
@@ -497,7 +511,7 @@ head_sour_sub : head_sour_vers_sect  { OCCUR2(VERS, 0, 1) }
 head_sour_vers_sect : OPEN DELIM TAG_VERS mand_line_item
                       { $<ctxt>$ = start_element(ELT_HEAD_SOUR_VERS, PARENT,
                                                 $1, $3, $4,
-                                                GEDCOM_MAKE_STRING($4));
+                                                GEDCOM_MAKE_STRING(val1, $4));
                        START(VERS, $<ctxt>$)
                      }
                       no_std_subs
@@ -510,7 +524,7 @@ head_sour_vers_sect : OPEN DELIM TAG_VERS mand_line_item
 head_sour_name_sect : OPEN DELIM TAG_NAME mand_line_item
                       { $<ctxt>$ = start_element(ELT_HEAD_SOUR_NAME, PARENT,
                                                 $1, $3, $4,
-                                                GEDCOM_MAKE_STRING($4));
+                                                GEDCOM_MAKE_STRING(val1, $4));
                        START(NAME, $<ctxt>$)
                      }
                       no_std_subs
@@ -523,7 +537,7 @@ head_sour_name_sect : OPEN DELIM TAG_NAME mand_line_item
 head_sour_corp_sect : OPEN DELIM TAG_CORP mand_line_item 
                       { $<ctxt>$ = start_element(ELT_HEAD_SOUR_CORP, PARENT,
                                                 $1, $3, $4,
-                                                GEDCOM_MAKE_STRING($4));
+                                                GEDCOM_MAKE_STRING(val1, $4));
                        START(CORP, $<ctxt>$)
                      }
                       head_sour_corp_subs
@@ -545,7 +559,7 @@ head_sour_corp_sub : addr_struc_sub  /* 0:1 */
 head_sour_data_sect : OPEN DELIM TAG_DATA mand_line_item 
                       { $<ctxt>$ = start_element(ELT_HEAD_SOUR_DATA, PARENT,
                                                 $1, $3, $4,
-                                                GEDCOM_MAKE_STRING($4));
+                                                GEDCOM_MAKE_STRING(val1, $4));
                        START(DATA, $<ctxt>$)
                      }
                       head_sour_data_subs
@@ -567,9 +581,10 @@ head_sour_data_sub : head_sour_data_date_sect  { OCCUR2(DATE, 0, 1) }
 
 head_sour_data_date_sect : OPEN DELIM TAG_DATE mand_line_item
                            { struct date_value dv = gedcom_parse_date($4);
-                            $<ctxt>$ = start_element(ELT_HEAD_SOUR_DATA_DATE,
-                                                     PARENT, $1, $3, $4,
-                                                     GEDCOM_MAKE_DATE(dv));
+                            $<ctxt>$
+                              = start_element(ELT_HEAD_SOUR_DATA_DATE,
+                                              PARENT, $1, $3, $4,
+                                              GEDCOM_MAKE_DATE(val1, dv));
                             START(DATE, $<ctxt>$)
                           }
                            no_std_subs
@@ -580,9 +595,10 @@ head_sour_data_date_sect : OPEN DELIM TAG_DATE mand_line_item
                           }
                          ;
 head_sour_data_copr_sect : OPEN DELIM TAG_COPR mand_line_item
-                           { $<ctxt>$ = start_element(ELT_HEAD_SOUR_DATA_COPR,
-                                                     PARENT, $1, $3, $4,
-                                                     GEDCOM_MAKE_STRING($4));
+                           { $<ctxt>$
+                              = start_element(ELT_HEAD_SOUR_DATA_COPR,
+                                              PARENT, $1, $3, $4,
+                                              GEDCOM_MAKE_STRING(val1, $4));
                             START(COPR, $<ctxt>$)
                           }
                            no_std_subs
@@ -597,7 +613,7 @@ head_sour_data_copr_sect : OPEN DELIM TAG_COPR mand_line_item
 head_dest_sect : OPEN DELIM TAG_DEST mand_line_item
                  { $<ctxt>$ = start_element(ELT_HEAD_DEST,
                                            PARENT, $1, $3, $4,
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(DEST, $<ctxt>$)
                 }
                  no_std_subs
@@ -613,7 +629,7 @@ head_date_sect : OPEN DELIM TAG_DATE mand_line_item
                  { struct date_value dv = gedcom_parse_date($4);
                   $<ctxt>$ = start_element(ELT_HEAD_DATE,
                                            PARENT, $1, $3, $4,
-                                           GEDCOM_MAKE_DATE(dv));
+                                           GEDCOM_MAKE_DATE(val1, dv));
                   START(DATE, $<ctxt>$)
                 }
                  head_date_subs
@@ -635,7 +651,7 @@ head_date_sub  : head_date_time_sect  { OCCUR2(TIME, 0, 1) }
 head_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
                       { $<ctxt>$ = start_element(ELT_HEAD_DATE_TIME,
                                                 PARENT, $1, $3, $4,
-                                                GEDCOM_MAKE_STRING($4));
+                                                GEDCOM_MAKE_STRING(val1, $4));
                        START(TIME, $<ctxt>$)
                      }
                       no_std_subs
@@ -646,11 +662,21 @@ head_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
                      }
                     ;
 
+/* HEAD.TIME (Only for 'Lifelines' compatibility) */
+/* Just ignore the time... */
+head_time_sect : OPEN DELIM TAG_TIME opt_line_item
+                 { }
+                 CLOSE
+              ;
+
 /* HEAD.SUBM */
 head_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
-                 { $<ctxt>$ = start_element(ELT_HEAD_SUBM,
+                 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
+                                                            XREF_SUBM);
+                  if (xr == NULL) HANDLE_ERROR;
+                  $<ctxt>$ = start_element(ELT_HEAD_SUBM,
                                            PARENT, $1, $3, $4,
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_XREF_PTR(val1, xr));
                   START(SUBM, $<ctxt>$)
                 }
                  no_std_subs
@@ -662,9 +688,12 @@ head_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
                ;
 /* HEAD.SUBN */
 head_subn_sect : OPEN DELIM TAG_SUBN mand_pointer 
-                 { $<ctxt>$ = start_element(ELT_HEAD_SUBN,
+                 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
+                                                            XREF_SUBN);
+                  if (xr == NULL) HANDLE_ERROR;
+                  $<ctxt>$ = start_element(ELT_HEAD_SUBN,
                                            PARENT, $1, $3, $4,
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_XREF_PTR(val1, xr));
                   START(SUBN, $<ctxt>$)
                 }
                  no_std_subs
@@ -678,7 +707,7 @@ head_subn_sect : OPEN DELIM TAG_SUBN mand_pointer
 head_file_sect : OPEN DELIM TAG_FILE mand_line_item 
                  { $<ctxt>$ = start_element(ELT_HEAD_FILE,
                                            PARENT, $1, $3, $4,
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(FILE, $<ctxt>$)
                 }
                  no_std_subs
@@ -691,7 +720,7 @@ head_file_sect : OPEN DELIM TAG_FILE mand_line_item
 head_copr_sect : OPEN DELIM TAG_COPR mand_line_item 
                  { $<ctxt>$ = start_element(ELT_HEAD_COPR,
                                            PARENT, $1, $3, $4,
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(COPR, $<ctxt>$)
                 }
                  no_std_subs
@@ -704,7 +733,7 @@ head_copr_sect : OPEN DELIM TAG_COPR mand_line_item
 head_gedc_sect : OPEN DELIM TAG_GEDC
                  { $<ctxt>$ = start_element(ELT_HEAD_GEDC,
                                            PARENT, $1, $3, NULL,
-                                           GEDCOM_MAKE_NULL());
+                                           GEDCOM_MAKE_NULL(val1));
                   START(GEDC, $<ctxt>$)
                 }
                  head_gedc_subs
@@ -725,7 +754,7 @@ head_gedc_sub  : head_gedc_vers_sect  { OCCUR2(VERS, 1, 1) }
 head_gedc_vers_sect : OPEN DELIM TAG_VERS mand_line_item  
                       { $<ctxt>$ = start_element(ELT_HEAD_GEDC_VERS,
                                                 PARENT, $1, $3, $4,
-                                                GEDCOM_MAKE_STRING($4));
+                                                GEDCOM_MAKE_STRING(val1, $4));
                        START(VERS, $<ctxt>$)
                      }
                       no_std_subs
@@ -738,7 +767,7 @@ head_gedc_vers_sect : OPEN DELIM TAG_VERS mand_line_item
 head_gedc_form_sect : OPEN DELIM TAG_FORM mand_line_item   
                       { $<ctxt>$ = start_element(ELT_HEAD_GEDC_FORM,
                                                 PARENT, $1, $3, $4,
-                                                GEDCOM_MAKE_STRING($4));
+                                                GEDCOM_MAKE_STRING(val1, $4));
                        START(FORM, $<ctxt>$)
                      }
                       no_std_subs
@@ -751,10 +780,12 @@ head_gedc_form_sect : OPEN DELIM TAG_FORM mand_line_item
 
 /* HEAD.CHAR */
 head_char_sect : OPEN DELIM TAG_CHAR mand_line_item 
-                 { if (open_conv_to_internal($4) == 0) YYERROR;
+                 { /* Don't allow to continue if conversion context couldn't
+                     be opened */
+                  if (open_conv_to_internal($4) == 0) YYABORT;
                   $<ctxt>$ = start_element(ELT_HEAD_CHAR,
                                            PARENT, $1, $3, $4,
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(CHAR, $<ctxt>$)
                 }
                  head_char_subs
@@ -774,7 +805,7 @@ head_char_sub  : head_char_vers_sect  { OCCUR2(VERS, 0, 1) }
 head_char_vers_sect : OPEN DELIM TAG_VERS mand_line_item   
                       { $<ctxt>$ = start_element(ELT_HEAD_CHAR_VERS,
                                                 PARENT, $1, $3, $4,
-                                                GEDCOM_MAKE_STRING($4));
+                                                GEDCOM_MAKE_STRING(val1, $4));
                        START(VERS, $<ctxt>$)
                      }
                       no_std_subs
@@ -789,7 +820,7 @@ head_char_vers_sect : OPEN DELIM TAG_VERS mand_line_item
 head_lang_sect : OPEN DELIM TAG_LANG mand_line_item   
                  { $<ctxt>$ = start_element(ELT_HEAD_LANG,
                                            PARENT, $1, $3, $4,
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(LANG, $<ctxt>$)
                 }
                  no_std_subs
@@ -802,7 +833,7 @@ head_lang_sect : OPEN DELIM TAG_LANG mand_line_item
 head_plac_sect : OPEN DELIM TAG_PLAC
                  { $<ctxt>$ = start_element(ELT_HEAD_PLAC,
                                            PARENT, $1, $3, NULL,
-                                           GEDCOM_MAKE_NULL());
+                                           GEDCOM_MAKE_NULL(val1));
                   START(PLAC, $<ctxt>$)
                 }
                  head_plac_subs
@@ -822,7 +853,7 @@ head_plac_sub  : head_plac_form_sect  { OCCUR2(FORM, 1, 1) }
 head_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item   
                       { $<ctxt>$ = start_element(ELT_HEAD_PLAC_FORM,
                                                 PARENT, $1, $3, $4, 
-                                                GEDCOM_MAKE_STRING($4));
+                                                GEDCOM_MAKE_STRING(val1, $4));
                        START(FORM, $<ctxt>$)
                      }
                       no_std_subs
@@ -837,7 +868,7 @@ head_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item
 head_note_sect : OPEN DELIM TAG_NOTE mand_line_item 
                  { $<ctxt>$ = start_element(ELT_HEAD_NOTE,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(NOTE, $<ctxt>$)
                 }
                  head_note_subs
@@ -866,9 +897,13 @@ trlr_sect   : OPEN DELIM TAG_TRLR CLOSE { }
 /**** Family record                                               ****/
 /*********************************************************************/
 fam_rec      : OPEN DELIM POINTER DELIM TAG_FAM
-               { $<ctxt>$ = start_record(REC_FAM,
-                                        $1, GEDCOM_MAKE_STRING($3), $5,
-                                        NULL, GEDCOM_MAKE_NULL());
+               { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
+                                                          XREF_FAM);
+                if (xr == NULL) HANDLE_ERROR;
+                $<ctxt>$ = start_record(REC_FAM,
+                                        $1, GEDCOM_MAKE_XREF_PTR(val1, xr),
+                                        $5,
+                                        NULL, GEDCOM_MAKE_NULL(val2));
                 START(FAM, $<ctxt>$) }
                fam_subs
               { CHECK0 }
@@ -897,9 +932,12 @@ fam_sub      : fam_event_struc_sub  /* 0:M */
 
 /* FAM.HUSB */
 fam_husb_sect : OPEN DELIM TAG_HUSB mand_pointer    
-                { $<ctxt>$ = start_element(ELT_FAM_HUSB,
+                { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
+                                                           XREF_INDI);
+                 if (xr == NULL) HANDLE_ERROR;
+                 $<ctxt>$ = start_element(ELT_FAM_HUSB,
                                           PARENT, $1, $3, $4, 
-                                          GEDCOM_MAKE_STRING($4));
+                                          GEDCOM_MAKE_XREF_PTR(val1, xr));
                  START(HUSB, $<ctxt>$)
                }
                 no_std_subs
@@ -911,9 +949,12 @@ fam_husb_sect : OPEN DELIM TAG_HUSB mand_pointer
 
 /* FAM.WIFE */
 fam_wife_sect : OPEN DELIM TAG_WIFE mand_pointer 
-                { $<ctxt>$ = start_element(ELT_FAM_WIFE,
+                { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
+                                                           XREF_INDI);
+                 if (xr == NULL) HANDLE_ERROR;
+                 $<ctxt>$ = start_element(ELT_FAM_WIFE,
                                           PARENT, $1, $3, $4, 
-                                          GEDCOM_MAKE_STRING($4));
+                                          GEDCOM_MAKE_XREF_PTR(val1, xr));
                  START(WIFE, $<ctxt>$)
                }
                 no_std_subs
@@ -925,9 +966,12 @@ fam_wife_sect : OPEN DELIM TAG_WIFE mand_pointer
 
 /* FAM.CHIL */
 fam_chil_sect : OPEN DELIM TAG_CHIL mand_pointer
-                { $<ctxt>$ = start_element(ELT_FAM_CHIL,
+                { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
+                                                           XREF_INDI);
+                 if (xr == NULL) HANDLE_ERROR;
+                 $<ctxt>$ = start_element(ELT_FAM_CHIL,
                                           PARENT, $1, $3, $4, 
-                                          GEDCOM_MAKE_STRING($4));
+                                          GEDCOM_MAKE_XREF_PTR(val1, xr));
                  START(CHIL, $<ctxt>$) 
                } 
                no_std_subs 
@@ -941,7 +985,7 @@ fam_chil_sect : OPEN DELIM TAG_CHIL mand_pointer
 fam_nchi_sect : OPEN DELIM TAG_NCHI mand_line_item    
                 { $<ctxt>$ = start_element(ELT_FAM_NCHI,
                                           PARENT, $1, $3, $4, 
-                                          GEDCOM_MAKE_STRING($4));
+                                          GEDCOM_MAKE_STRING(val1, $4));
                  START(NCHI, $<ctxt>$)  
                }  
                no_std_subs  
@@ -953,9 +997,12 @@ fam_nchi_sect : OPEN DELIM TAG_NCHI mand_line_item
 
 /* FAM.SUBM */
 fam_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
-                { $<ctxt>$ = start_element(ELT_FAM_SUBM,
+                { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
+                                                           XREF_SUBM);
+                 if (xr == NULL) HANDLE_ERROR;
+                 $<ctxt>$ = start_element(ELT_FAM_SUBM,
                                           PARENT, $1, $3, $4, 
-                                          GEDCOM_MAKE_STRING($4));
+                                          GEDCOM_MAKE_XREF_PTR(val1, xr));
                  START(SUBM, $<ctxt>$)   
                }   
                no_std_subs   
@@ -969,9 +1016,12 @@ fam_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
 /**** Individual record                                           ****/
 /*********************************************************************/
 indiv_rec   : OPEN DELIM POINTER DELIM TAG_INDI
-              { $<ctxt>$ = start_record(REC_INDI,
-                                       $1, GEDCOM_MAKE_STRING($3), $5,
-                                       NULL, GEDCOM_MAKE_NULL());
+              { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
+                                                         XREF_INDI);
+               if (xr == NULL) HANDLE_ERROR;
+               $<ctxt>$ = start_record(REC_INDI,
+                                       $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
+                                       NULL, GEDCOM_MAKE_NULL(val2));
                START(INDI, $<ctxt>$) }
               indi_subs
              { CHECK0 }
@@ -1013,7 +1063,7 @@ indi_sub    : indi_resn_sect  { OCCUR2(RESN, 0, 1) }
 indi_resn_sect : OPEN DELIM TAG_RESN mand_line_item     
                  { $<ctxt>$ = start_element(ELT_INDI_RESN,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(RESN, $<ctxt>$)    
                 }    
                 no_std_subs     
@@ -1027,7 +1077,7 @@ indi_resn_sect : OPEN DELIM TAG_RESN mand_line_item
 indi_sex_sect  : OPEN DELIM TAG_SEX mand_line_item     
                  { $<ctxt>$ = start_element(ELT_INDI_SEX,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(SEX, $<ctxt>$)     
                 }     
                 no_std_subs     
@@ -1039,9 +1089,12 @@ indi_sex_sect  : OPEN DELIM TAG_SEX mand_line_item
 
 /* INDI.SUBM */
 indi_subm_sect : OPEN DELIM TAG_SUBM mand_pointer 
-                 { $<ctxt>$ = start_element(ELT_INDI_SUBM,
+                 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
+                                                            XREF_SUBM);
+                  if (xr == NULL) HANDLE_ERROR;
+                  $<ctxt>$ = start_element(ELT_INDI_SUBM,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_XREF_PTR(val1, xr));
                   START(SUBM, $<ctxt>$)      
                 }      
                 no_std_subs      
@@ -1053,9 +1106,12 @@ indi_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
 
 /* INDI.ALIA */
 indi_alia_sect : OPEN DELIM TAG_ALIA mand_pointer
-                 { $<ctxt>$ = start_element(ELT_INDI_ALIA,
+                 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
+                                                            XREF_INDI);
+                  if (xr == NULL) HANDLE_ERROR;
+                  $<ctxt>$ = start_element(ELT_INDI_ALIA,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_XREF_PTR(val1, xr));
                   START(ALIA, $<ctxt>$)       
                 }       
                 no_std_subs       
@@ -1067,9 +1123,12 @@ indi_alia_sect : OPEN DELIM TAG_ALIA mand_pointer
 
 /* INDI.ANCI */
 indi_anci_sect : OPEN DELIM TAG_ANCI mand_pointer
-                 { $<ctxt>$ = start_element(ELT_INDI_ANCI,
+                 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
+                                                            XREF_SUBM);
+                  if (xr == NULL) HANDLE_ERROR;
+                  $<ctxt>$ = start_element(ELT_INDI_ANCI,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_XREF_PTR(val1, xr));
                   START(ANCI, $<ctxt>$)        
                 }        
                 no_std_subs        
@@ -1081,9 +1140,12 @@ indi_anci_sect : OPEN DELIM TAG_ANCI mand_pointer
 
 /* INDI.DESI */
 indi_desi_sect : OPEN DELIM TAG_DESI mand_pointer
-                 { $<ctxt>$ = start_element(ELT_INDI_DESI,
+                 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
+                                                            XREF_SUBM);
+                  if (xr == NULL) HANDLE_ERROR;
+                  $<ctxt>$ = start_element(ELT_INDI_DESI,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_XREF_PTR(val1, xr));
                   START(DESI, $<ctxt>$)         
                 }         
                 no_std_subs         
@@ -1097,7 +1159,7 @@ indi_desi_sect : OPEN DELIM TAG_DESI mand_pointer
 indi_rfn_sect  : OPEN DELIM TAG_RFN mand_line_item     
                  { $<ctxt>$ = start_element(ELT_INDI_RFN,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(RFN, $<ctxt>$)          
                 }          
                 no_std_subs          
@@ -1111,7 +1173,7 @@ indi_rfn_sect  : OPEN DELIM TAG_RFN mand_line_item
 indi_afn_sect  : OPEN DELIM TAG_AFN mand_line_item      
                  { $<ctxt>$ = start_element(ELT_INDI_AFN,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(AFN, $<ctxt>$)           
                 }           
                 no_std_subs           
@@ -1123,15 +1185,62 @@ indi_afn_sect  : OPEN DELIM TAG_AFN mand_line_item
 
 /* INDI.ADDR (Only for 'ftree' compatibility) */
 ftree_addr_sect : OPEN DELIM TAG_ADDR opt_line_item
-                  { START(ADDR, NULL) } no_std_subs { CHECK0 } CLOSE { }
+                  { if (compat_mode(C_FTREE)) {
+                     Gedcom_ctxt par = compat_generate_resi_start(PARENT);
+                     START(RESI, par);
+                     $<ctxt>$
+                       = start_element(ELT_SUB_ADDR,
+                                       par, $1 + 1, $3, $4,
+                                       GEDCOM_MAKE_NULL_OR_STRING(val2, $4));
+                     START(ADDR, $<ctxt>$);
+                   }
+                 else { START(ADDR, NULL) }
+                 }
+                  ftree_addr_subs
+                  { CHECK0 }
+                  CLOSE
+                  { if (compat_mode(C_FTREE)) {
+                     Gedcom_ctxt par = PARENT;
+                     end_element(ELT_SUB_ADDR, par, $<ctxt>5, NULL);
+                     CHECK0;
+                     compat_generate_resi_end(PARENT, par);
+                   } 
+                 }
+
+ftree_addr_subs : /* empty */
+                | ftree_addr_subs ftree_addr_sub
+                ;
+
+ftree_addr_sub  : continuation_sub
+                | ftree_addr_phon_sect
+                | no_std_sub
+                ;
+
+ftree_addr_phon_sect : OPEN DELIM TAG_PHON mand_line_item              
+                       { $<ctxt>$
+                          = start_element(ELT_SUB_PHON,
+                                          GRANDPARENT(1), $1, $3, $4, 
+                                          GEDCOM_MAKE_STRING(val1, $4));
+                        START(PHON, $<ctxt>$)               
+                      }               
+                       no_std_subs               
+                       { CHECK0 }               
+                       CLOSE               
+                       { end_element(ELT_SUB_PHON, GRANDPARENT(1),
+                                    $<ctxt>5, NULL);
+                      }
+            ;
 
 /*********************************************************************/
 /**** Multimedia record                                           ****/
 /*********************************************************************/
 multim_rec  : OPEN DELIM POINTER DELIM TAG_OBJE
-              { $<ctxt>$ = start_record(REC_OBJE,
-                                       $1, GEDCOM_MAKE_STRING($3), $5,
-                                       NULL, GEDCOM_MAKE_NULL());
+              { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
+                                                         XREF_OBJE);
+               if (xr == NULL) HANDLE_ERROR;
+               $<ctxt>$ = start_record(REC_OBJE,
+                                       $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
+                                       NULL, GEDCOM_MAKE_NULL(val2));
                START(OBJE, $<ctxt>$) }
               obje_subs
              { CHECK2(FORM, BLOB) }
@@ -1157,7 +1266,7 @@ obje_sub    : obje_form_sect  { OCCUR2(FORM, 1, 1) }
 obje_form_sect : OPEN DELIM TAG_FORM mand_line_item       
                  { $<ctxt>$ = start_element(ELT_OBJE_FORM,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(FORM, $<ctxt>$)            
                 }            
                 no_std_subs            
@@ -1171,7 +1280,7 @@ obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
 obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item       
                  { $<ctxt>$ = start_element(ELT_OBJE_TITL,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(TITL, $<ctxt>$)             
                 }             
                 no_std_subs             
@@ -1185,7 +1294,7 @@ obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
 obje_blob_sect : OPEN DELIM TAG_BLOB
                  { $<ctxt>$ = start_element(ELT_OBJE_BLOB,
                                            PARENT, $1, $3, NULL,
-                                           GEDCOM_MAKE_NULL());
+                                           GEDCOM_MAKE_NULL(val1));
                   START(BLOB, $<ctxt>$)              
                 }
                  obje_blob_subs
@@ -1206,7 +1315,7 @@ obje_blob_sub  : obje_blob_cont_sect  { OCCUR1(CONT, 1) }
 obje_blob_cont_sect : OPEN DELIM TAG_CONT mand_line_item        
                       { $<ctxt>$ = start_element(ELT_OBJE_BLOB_CONT,
                                                 PARENT, $1, $3, $4, 
-                                                GEDCOM_MAKE_STRING($4));
+                                                GEDCOM_MAKE_STRING(val1, $4));
                        START(CONT, $<ctxt>$)               
                      }                
                      no_std_subs                
@@ -1219,9 +1328,12 @@ obje_blob_cont_sect : OPEN DELIM TAG_CONT mand_line_item
 
 /* OBJE.OBJE */
 obje_obje_sect : OPEN DELIM TAG_OBJE mand_pointer 
-                 { $<ctxt>$ = start_element(ELT_OBJE_OBJE,
+                 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
+                                                            XREF_OBJE);
+                  if (xr == NULL) HANDLE_ERROR;
+                  $<ctxt>$ = start_element(ELT_OBJE_OBJE,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_XREF_PTR(val1, xr));
                   START(OBJE, $<ctxt>$)  
                  }  
                  no_std_subs  
@@ -1235,9 +1347,12 @@ obje_obje_sect : OPEN DELIM TAG_OBJE mand_pointer
 /**** Note record                                                 ****/
 /*********************************************************************/
 note_rec    : OPEN DELIM POINTER DELIM TAG_NOTE note_line_item
-              { $<ctxt>$ = start_record(REC_NOTE,
-                                       $1, GEDCOM_MAKE_STRING($3), $5,
-                                       $6, GEDCOM_MAKE_STRING($6));
+              { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
+                                                         XREF_NOTE);
+               if (xr == NULL) HANDLE_ERROR;
+               $<ctxt>$ = start_record(REC_NOTE,
+                                       $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
+                                       $6, GEDCOM_MAKE_STRING(val2, $6));
                START(NOTE, $<ctxt>$) }
               note_subs
              { CHECK0 }
@@ -1249,6 +1364,9 @@ note_line_item : /* empty */
                    { if (!compat_mode(C_FTREE)) {
                       gedcom_error(_("Missing value")); YYERROR;
                     }
+                    else {
+                      $$ = "";
+                    }
                   }
                | DELIM line_item
                    { gedcom_debug_print("==Val: %s==", $2);
@@ -1270,9 +1388,12 @@ note_sub    : continuation_sub  /* 0:M */
 /**** Repository record                                           ****/
 /*********************************************************************/
 repos_rec   : OPEN DELIM POINTER DELIM TAG_REPO
-              { $<ctxt>$ = start_record(REC_REPO,
-                                       $1, GEDCOM_MAKE_STRING($3), $5,
-                                       NULL, GEDCOM_MAKE_NULL());
+              { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
+                                                         XREF_REPO);
+               if (xr == NULL) HANDLE_ERROR;
+               $<ctxt>$ = start_record(REC_REPO,
+                                       $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
+                                       NULL, GEDCOM_MAKE_NULL(val2));
                START(REPO, $<ctxt>$) }
               repo_subs
              { CHECK0 }
@@ -1296,7 +1417,7 @@ repo_sub    : repo_name_sect  { OCCUR2(NAME, 0, 1) }
 repo_name_sect : OPEN DELIM TAG_NAME mand_line_item         
                  { $<ctxt>$ = start_element(ELT_REPO_NAME,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(NAME, $<ctxt>$)          
                  }          
                  no_std_subs          
@@ -1310,9 +1431,12 @@ repo_name_sect : OPEN DELIM TAG_NAME mand_line_item
 /**** Source record                                               ****/
 /*********************************************************************/
 source_rec  : OPEN DELIM POINTER DELIM TAG_SOUR
-              { $<ctxt>$ = start_record(REC_SOUR,
-                                       $1, GEDCOM_MAKE_STRING($3), $5,
-                                       NULL, GEDCOM_MAKE_NULL());
+              { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
+                                                         XREF_SOUR);
+               if (xr == NULL) HANDLE_ERROR;
+               $<ctxt>$ = start_record(REC_SOUR,
+                                       $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
+                                       NULL, GEDCOM_MAKE_NULL(val2));
                START(SOUR, $<ctxt>$) }
               sour_subs
              { CHECK0 }
@@ -1342,7 +1466,7 @@ sour_sub    : sour_data_sect  { OCCUR2(DATA, 0, 1) }
 sour_data_sect : OPEN DELIM TAG_DATA
                  { $<ctxt>$ = start_element(ELT_SOUR_DATA,
                                            PARENT, $1, $3, NULL,
-                                           GEDCOM_MAKE_NULL());
+                                           GEDCOM_MAKE_NULL(val1));
                   START(DATA, $<ctxt>$) 
                  }
                  sour_data_subs
@@ -1365,7 +1489,7 @@ sour_data_sub  : sour_data_even_sect  /* 0:M */
 sour_data_even_sect : OPEN DELIM TAG_EVEN mand_line_item 
                       { $<ctxt>$ = start_element(ELT_SOUR_DATA_EVEN,
                                                 PARENT, $1, $3, $4, 
-                                                GEDCOM_MAKE_STRING($4));
+                                                GEDCOM_MAKE_STRING(val1, $4));
                        START(EVEN, $<ctxt>$)  
                       }
                       sour_data_even_subs
@@ -1387,9 +1511,10 @@ sour_data_even_sub  : sour_data_even_date_sect { OCCUR2(DATE, 0, 1) }
 
 sour_data_even_date_sect : OPEN DELIM TAG_DATE mand_line_item          
                            { struct date_value dv = gedcom_parse_date($4);
-                            $<ctxt>$ = start_element(ELT_SOUR_DATA_EVEN_DATE,
-                                                     PARENT, $1, $3, $4, 
-                                                     GEDCOM_MAKE_DATE(dv));
+                            $<ctxt>$
+                              = start_element(ELT_SOUR_DATA_EVEN_DATE,
+                                              PARENT, $1, $3, $4, 
+                                              GEDCOM_MAKE_DATE(val1, dv));
                             START(DATE, $<ctxt>$)           
                            }           
                            no_std_subs           
@@ -1401,9 +1526,10 @@ sour_data_even_date_sect : OPEN DELIM TAG_DATE mand_line_item
                          ;
 
 sour_data_even_plac_sect : OPEN DELIM TAG_PLAC mand_line_item          
-                           { $<ctxt>$ = start_element(ELT_SOUR_DATA_EVEN_PLAC,
-                                                     PARENT, $1, $3, $4, 
-                                                     GEDCOM_MAKE_STRING($4));
+                           { $<ctxt>$
+                              = start_element(ELT_SOUR_DATA_EVEN_PLAC,
+                                              PARENT, $1, $3, $4, 
+                                              GEDCOM_MAKE_STRING(val1, $4));
                             START(PLAC, $<ctxt>$)           
                            }           
                            no_std_subs           
@@ -1417,7 +1543,7 @@ sour_data_even_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
 sour_data_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item          
                       { $<ctxt>$ = start_element(ELT_SOUR_DATA_AGNC,
                                                 PARENT, $1, $3, $4, 
-                                                GEDCOM_MAKE_STRING($4));
+                                                GEDCOM_MAKE_STRING(val1, $4));
                        START(AGNC, $<ctxt>$)           
                       }           
                       no_std_subs           
@@ -1432,7 +1558,7 @@ sour_data_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
 sour_auth_sect : OPEN DELIM TAG_AUTH mand_line_item
                  { $<ctxt>$ = start_element(ELT_SOUR_AUTH,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(AUTH, $<ctxt>$) 
                  }
                  sour_auth_subs
@@ -1454,7 +1580,7 @@ sour_auth_sub  : continuation_sub  /* 0:M */
 sour_titl_sect : OPEN DELIM TAG_TITL mand_line_item  
                  { $<ctxt>$ = start_element(ELT_SOUR_TITL,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(TITL, $<ctxt>$)   
                  }
                  sour_titl_subs 
@@ -1476,7 +1602,7 @@ sour_titl_sub  : continuation_sub  /* 0:M */
 sour_abbr_sect : OPEN DELIM TAG_ABBR mand_line_item           
                  { $<ctxt>$ = start_element(ELT_SOUR_ABBR,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(ABBR, $<ctxt>$)            
                  }            
                  no_std_subs            
@@ -1490,7 +1616,7 @@ sour_abbr_sect : OPEN DELIM TAG_ABBR mand_line_item
 sour_publ_sect : OPEN DELIM TAG_PUBL mand_line_item  
                  { $<ctxt>$ = start_element(ELT_SOUR_PUBL,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(PUBL, $<ctxt>$)            
                  }
                  sour_publ_subs  
@@ -1512,7 +1638,7 @@ sour_publ_sub  : continuation_sub  /* 0:M */
 sour_text_sect : OPEN DELIM TAG_TEXT mand_line_item   
                  { $<ctxt>$ = start_element(ELT_SOUR_TEXT,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(TEXT, $<ctxt>$)    
                  }
                  sour_text_subs  
@@ -1534,9 +1660,12 @@ sour_text_sub  : continuation_sub  /* 0:M */
 /**** Submission record                                           ****/
 /*********************************************************************/
 submis_rec  : OPEN DELIM POINTER DELIM TAG_SUBN    
-              { $<ctxt>$ = start_record(REC_SUBN,
-                                       $1, GEDCOM_MAKE_STRING($3), $5,
-                                       NULL, GEDCOM_MAKE_NULL());
+              { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
+                                                         XREF_SUBN);
+               if (xr == NULL) HANDLE_ERROR;
+               $<ctxt>$ = start_record(REC_SUBN,
+                                       $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
+                                       NULL, GEDCOM_MAKE_NULL(val2));
                START(SUBN, $<ctxt>$) }
               subn_subs
              { CHECK0 }
@@ -1560,9 +1689,12 @@ subn_sub    : subn_subm_sect  { OCCUR2(SUBM, 0, 1) }
 
 /* SUBN.SUBM */
 subn_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
-                 { $<ctxt>$ = start_element(ELT_SUBN_SUBM,
+                 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
+                                                            XREF_SUBM);
+                  if (xr == NULL) HANDLE_ERROR;
+                  $<ctxt>$ = start_element(ELT_SUBN_SUBM,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_XREF_PTR(val1, xr));
                   START(SUBM, $<ctxt>$) 
                  } 
                  no_std_subs 
@@ -1576,7 +1708,7 @@ subn_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
 subn_famf_sect : OPEN DELIM TAG_FAMF mand_line_item            
                  { $<ctxt>$ = start_element(ELT_SUBN_FAMF,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(FAMF, $<ctxt>$)             
                  }             
                  no_std_subs             
@@ -1590,7 +1722,7 @@ subn_famf_sect : OPEN DELIM TAG_FAMF mand_line_item
 subn_temp_sect : OPEN DELIM TAG_TEMP mand_line_item            
                  { $<ctxt>$ = start_element(ELT_SUBN_TEMP,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(TEMP, $<ctxt>$)             
                  }             
                  no_std_subs             
@@ -1604,7 +1736,7 @@ subn_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
 subn_ance_sect : OPEN DELIM TAG_ANCE mand_line_item            
                  { $<ctxt>$ = start_element(ELT_SUBN_ANCE,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(ANCE, $<ctxt>$)             
                  }             
                  no_std_subs             
@@ -1618,7 +1750,7 @@ subn_ance_sect : OPEN DELIM TAG_ANCE mand_line_item
 subn_desc_sect : OPEN DELIM TAG_DESC mand_line_item            
                  { $<ctxt>$ = start_element(ELT_SUBN_DESC,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(DESC, $<ctxt>$)             
                  }             
                  no_std_subs             
@@ -1632,7 +1764,7 @@ subn_desc_sect : OPEN DELIM TAG_DESC mand_line_item
 subn_ordi_sect : OPEN DELIM TAG_ORDI mand_line_item            
                  { $<ctxt>$ = start_element(ELT_SUBN_ORDI,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(ORDI, $<ctxt>$)             
                  }             
                  no_std_subs             
@@ -1646,7 +1778,7 @@ subn_ordi_sect : OPEN DELIM TAG_ORDI mand_line_item
 subn_rin_sect  : OPEN DELIM TAG_RIN mand_line_item            
                  { $<ctxt>$ = start_element(ELT_SUBN_RIN,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(RIN, $<ctxt>$)             
                  }             
                  no_std_subs             
@@ -1660,9 +1792,12 @@ subn_rin_sect  : OPEN DELIM TAG_RIN mand_line_item
 /**** Submitter record                                            ****/
 /*********************************************************************/
 submit_rec : OPEN DELIM POINTER DELIM TAG_SUBM    
-             { $<ctxt>$ = start_record(REC_SUBM,
-                                      $1, GEDCOM_MAKE_STRING($3), $5,
-                                      NULL, GEDCOM_MAKE_NULL());
+             { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
+                                                        XREF_SUBM);
+              if (xr == NULL) HANDLE_ERROR;
+              $<ctxt>$ = start_record(REC_SUBM,
+                                      $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
+                                      NULL, GEDCOM_MAKE_NULL(val2));
                START(SUBM, $<ctxt>$) }
              subm_subs
             { CHECK1(NAME) }
@@ -1674,7 +1809,7 @@ subm_subs  : /* empty */
            | subm_subs subm_sub
            ;
 
-subm_sub   : subm_name_sect  { OCCUR2(NAME, 0, 1) }
+subm_sub   : subm_name_sect  { OCCUR2(NAME, 1, 1) }
            | addr_struc_sub  /* 0:1 */
            | multim_link_sub  /* 0:M */
            | subm_lang_sect  { OCCUR2(LANG, 0, 3) }
@@ -1688,7 +1823,7 @@ subm_sub   : subm_name_sect  { OCCUR2(NAME, 0, 1) }
 subm_name_sect : OPEN DELIM TAG_NAME mand_line_item             
                  { $<ctxt>$ = start_element(ELT_SUBM_NAME,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(NAME, $<ctxt>$)              
                  }              
                  no_std_subs              
@@ -1702,7 +1837,7 @@ subm_name_sect : OPEN DELIM TAG_NAME mand_line_item
 subm_lang_sect : OPEN DELIM TAG_LANG mand_line_item             
                  { $<ctxt>$ = start_element(ELT_SUBM_LANG,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(LANG, $<ctxt>$)              
                  }              
                  no_std_subs              
@@ -1716,7 +1851,7 @@ subm_lang_sect : OPEN DELIM TAG_LANG mand_line_item
 subm_rfn_sect  : OPEN DELIM TAG_RFN mand_line_item             
                  { $<ctxt>$ = start_element(ELT_SUBM_RFN,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(RFN, $<ctxt>$)              
                  }              
                  no_std_subs              
@@ -1730,7 +1865,7 @@ subm_rfn_sect  : OPEN DELIM TAG_RFN mand_line_item
 subm_rin_sect  : OPEN DELIM TAG_RIN mand_line_item             
                  { $<ctxt>$ = start_element(ELT_SUBM_RIN,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(RIN, $<ctxt>$)              
                  }              
                  no_std_subs              
@@ -1752,7 +1887,7 @@ addr_struc_sub : addr_sect { OCCUR2(ADDR, 0, 1) }
 addr_sect   : OPEN DELIM TAG_ADDR mand_line_item 
               { $<ctxt>$ = start_element(ELT_SUB_ADDR,
                                         PARENT, $1, $3, $4, 
-                                        GEDCOM_MAKE_STRING($4));
+                                        GEDCOM_MAKE_STRING(val1, $4));
                START(ADDR, $<ctxt>$)  
               }
               addr_subs
@@ -1779,7 +1914,7 @@ addr_sub    : addr_cont_sect  /* 0:M */
 addr_cont_sect : OPEN DELIM TAG_CONT mand_line_item              
                  { $<ctxt>$ = start_element(ELT_SUB_ADDR_CONT,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(CONT, $<ctxt>$)               
                  }               
                  no_std_subs               
@@ -1791,7 +1926,7 @@ addr_cont_sect : OPEN DELIM TAG_CONT mand_line_item
 addr_adr1_sect : OPEN DELIM TAG_ADR1 mand_line_item              
                  { $<ctxt>$ = start_element(ELT_SUB_ADDR_ADR1,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(ADR1, $<ctxt>$)               
                  }               
                  no_std_subs               
@@ -1803,7 +1938,7 @@ addr_adr1_sect : OPEN DELIM TAG_ADR1 mand_line_item
 addr_adr2_sect : OPEN DELIM TAG_ADR2 mand_line_item              
                  { $<ctxt>$ = start_element(ELT_SUB_ADDR_ADR2,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(ADR2, $<ctxt>$)               
                  }               
                  no_std_subs               
@@ -1815,7 +1950,7 @@ addr_adr2_sect : OPEN DELIM TAG_ADR2 mand_line_item
 addr_city_sect : OPEN DELIM TAG_CITY mand_line_item              
                  { $<ctxt>$ = start_element(ELT_SUB_ADDR_CITY,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(CITY, $<ctxt>$)               
                  }               
                  no_std_subs               
@@ -1827,7 +1962,7 @@ addr_city_sect : OPEN DELIM TAG_CITY mand_line_item
 addr_stae_sect : OPEN DELIM TAG_STAE mand_line_item              
                  { $<ctxt>$ = start_element(ELT_SUB_ADDR_STAE,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(STAE, $<ctxt>$)               
                  }               
                  no_std_subs               
@@ -1839,7 +1974,7 @@ addr_stae_sect : OPEN DELIM TAG_STAE mand_line_item
 addr_post_sect : OPEN DELIM TAG_POST mand_line_item              
                  { $<ctxt>$ = start_element(ELT_SUB_ADDR_POST,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(POST, $<ctxt>$)               
                  }               
                  no_std_subs               
@@ -1851,7 +1986,7 @@ addr_post_sect : OPEN DELIM TAG_POST mand_line_item
 addr_ctry_sect : OPEN DELIM TAG_CTRY mand_line_item              
                  { $<ctxt>$ = start_element(ELT_SUB_ADDR_CTRY,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(CTRY, $<ctxt>$)               
                  }               
                  no_std_subs               
@@ -1864,7 +1999,7 @@ addr_ctry_sect : OPEN DELIM TAG_CTRY mand_line_item
 phon_sect   : OPEN DELIM TAG_PHON mand_line_item              
               { $<ctxt>$ = start_element(ELT_SUB_PHON,
                                         PARENT, $1, $3, $4, 
-                                        GEDCOM_MAKE_STRING($4));
+                                        GEDCOM_MAKE_STRING(val1, $4));
                START(PHON, $<ctxt>$)               
               }               
               no_std_subs               
@@ -1879,9 +2014,12 @@ assoc_struc_sub : asso_sect /* 0:M */
                 ;
 
 asso_sect : OPEN DELIM TAG_ASSO mand_pointer
-            { $<ctxt>$ = start_element(ELT_SUB_ASSO,
+            { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
+                                                       XREF_ANY);
+             if (xr == NULL) HANDLE_ERROR;
+             $<ctxt>$ = start_element(ELT_SUB_ASSO,
                                       PARENT, $1, $3, $4, 
-                                      GEDCOM_MAKE_STRING($4));
+                                      GEDCOM_MAKE_XREF_PTR(val1, xr));
              START(ASSO, $<ctxt>$) 
             }
             asso_subs
@@ -1902,7 +2040,7 @@ asso_subs : /* empty */
 asso_type_sect : OPEN DELIM TAG_TYPE mand_line_item               
                  { $<ctxt>$ = start_element(ELT_SUB_ASSO_TYPE,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(TYPE, $<ctxt>$)                
                  }                
                  no_std_subs                
@@ -1915,7 +2053,7 @@ asso_type_sect : OPEN DELIM TAG_TYPE mand_line_item
 asso_rela_sect : OPEN DELIM TAG_RELA mand_line_item               
                  { $<ctxt>$ = start_element(ELT_SUB_ASSO_RELA,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(RELA, $<ctxt>$)                
                  }                
                  no_std_subs                
@@ -1932,7 +2070,7 @@ change_date_sub : change_date_chan_sect  { OCCUR2(CHAN, 0, 1) }
 change_date_chan_sect : OPEN DELIM TAG_CHAN
                         { $<ctxt>$ = start_element(ELT_SUB_CHAN,
                                                   PARENT, $1, $3, NULL, 
-                                                  GEDCOM_MAKE_NULL());
+                                                  GEDCOM_MAKE_NULL(val1));
                          START(CHAN, $<ctxt>$) 
                         }
                         change_date_chan_subs
@@ -1955,7 +2093,7 @@ change_date_date_sect : OPEN DELIM TAG_DATE mand_line_item
                         { struct date_value dv = gedcom_parse_date($4);
                          $<ctxt>$ = start_element(ELT_SUB_CHAN_DATE,
                                                   PARENT, $1, $3, $4, 
-                                                  GEDCOM_MAKE_DATE(dv));
+                                                  GEDCOM_MAKE_DATE(val1, dv));
                          START(DATE, $<ctxt>$) }
                         change_date_date_subs
                        { CHECK0 }
@@ -1977,7 +2115,7 @@ change_date_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
                              { $<ctxt>$
                                 = start_element(ELT_SUB_CHAN_TIME,
                                                 PARENT, $1, $3, $4, 
-                                                GEDCOM_MAKE_STRING($4));
+                                                GEDCOM_MAKE_STRING(val1, $4));
                               START(TIME, $<ctxt>$) 
                              } 
                              no_std_subs 
@@ -1993,9 +2131,12 @@ chi_fam_link_sub : famc_sect  /* 0:M */
                  ;
 
 famc_sect : OPEN DELIM TAG_FAMC mand_pointer
-            { $<ctxt>$ = start_element(ELT_SUB_FAMC,
+            { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
+                                                         XREF_FAM);
+             if (xr == NULL) HANDLE_ERROR;
+             $<ctxt>$ = start_element(ELT_SUB_FAMC,
                                       PARENT, $1, $3, $4, 
-                                      GEDCOM_MAKE_STRING($4));
+                                      GEDCOM_MAKE_XREF_PTR(val1, xr));
              START(FAMC, $<ctxt>$) 
             }
             famc_subs
@@ -2017,7 +2158,7 @@ famc_sub  : famc_pedi_sect  /* 0:M */
 famc_pedi_sect : OPEN DELIM TAG_PEDI mand_line_item 
                  { $<ctxt>$ = start_element(ELT_SUB_FAMC_PEDI,
                                            PARENT, $1, $3, $4, 
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(PEDI, $<ctxt>$)  
                  }  
                  no_std_subs  
@@ -2035,7 +2176,7 @@ continuation_sub : cont_sect  /* 0:M */
 cont_sect : OPEN DELIM TAG_CONT mand_line_item 
             { $<ctxt>$ = start_element(ELT_SUB_CONT,
                                       PARENT, $1, $3, $4, 
-                                      GEDCOM_MAKE_STRING($4));
+                                      GEDCOM_MAKE_STRING(val1, $4));
              START(CONT, $<ctxt>$)  
             }  
             no_std_subs  
@@ -2048,7 +2189,7 @@ cont_sect : OPEN DELIM TAG_CONT mand_line_item
 conc_sect : OPEN DELIM TAG_CONC mand_line_item 
             { $<ctxt>$ = start_element(ELT_SUB_CONC,
                                       PARENT, $1, $3, $4, 
-                                      GEDCOM_MAKE_STRING($4));
+                                      GEDCOM_MAKE_STRING(val1, $4));
              START(CONC, $<ctxt>$)  
             }  
             no_std_subs  
@@ -2072,9 +2213,10 @@ event_detail_sub : event_detail_type_sect  { OCCUR2(TYPE, 0, 1) }
                  ;
 
 event_detail_type_sect : OPEN DELIM TAG_TYPE mand_line_item 
-                         { $<ctxt>$ = start_element(ELT_SUB_EVT_TYPE,
-                                                   PARENT, $1, $3, $4, 
-                                                   GEDCOM_MAKE_STRING($4));
+                         { $<ctxt>$
+                            = start_element(ELT_SUB_EVT_TYPE,
+                                            PARENT, $1, $3, $4, 
+                                            GEDCOM_MAKE_STRING(val1, $4));
                           START(TYPE, $<ctxt>$)  
                          }  
                          no_std_subs  
@@ -2086,9 +2228,10 @@ event_detail_type_sect : OPEN DELIM TAG_TYPE mand_line_item
                        ;
 event_detail_date_sect : OPEN DELIM TAG_DATE mand_line_item 
                          { struct date_value dv = gedcom_parse_date($4);
-                          $<ctxt>$ = start_element(ELT_SUB_EVT_DATE,
-                                                   PARENT, $1, $3, $4, 
-                                                   GEDCOM_MAKE_DATE(dv));
+                          $<ctxt>$
+                            = start_element(ELT_SUB_EVT_DATE,
+                                            PARENT, $1, $3, $4, 
+                                            GEDCOM_MAKE_DATE(val1, dv));
                           START(DATE, $<ctxt>$)  
                          }  
                          no_std_subs  
@@ -2099,9 +2242,11 @@ event_detail_date_sect : OPEN DELIM TAG_DATE mand_line_item
                         }
                        ;
 event_detail_age_sect  : OPEN DELIM TAG_AGE mand_line_item 
-                         { $<ctxt>$ = start_element(ELT_SUB_EVT_AGE,
-                                                   PARENT, $1, $3, $4, 
-                                                   GEDCOM_MAKE_STRING($4));
+                         { struct age_value age = gedcom_parse_age($4);
+                          $<ctxt>$
+                            = start_element(ELT_SUB_EVT_AGE,
+                                            PARENT, $1, $3, $4, 
+                                            GEDCOM_MAKE_AGE(val1, age));
                           START(AGE, $<ctxt>$)  
                          }  
                          no_std_subs  
@@ -2112,9 +2257,10 @@ event_detail_age_sect  : OPEN DELIM TAG_AGE mand_line_item
                         }
                        ;
 event_detail_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item 
-                         { $<ctxt>$ = start_element(ELT_SUB_EVT_AGNC,
-                                                   PARENT, $1, $3, $4, 
-                                                   GEDCOM_MAKE_STRING($4));
+                         { $<ctxt>$
+                            = start_element(ELT_SUB_EVT_AGNC,
+                                            PARENT, $1, $3, $4, 
+                                            GEDCOM_MAKE_STRING(val1, $4));
                           START(AGNC, $<ctxt>$)  
                          }  
                          no_std_subs  
@@ -2125,9 +2271,10 @@ event_detail_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
                         }
                        ;
 event_detail_caus_sect : OPEN DELIM TAG_CAUS mand_line_item 
-                         { $<ctxt>$ = start_element(ELT_SUB_EVT_CAUS,
-                                                   PARENT, $1, $3, $4, 
-                                                   GEDCOM_MAKE_STRING($4));
+                         { $<ctxt>$
+                            = start_element(ELT_SUB_EVT_CAUS,
+                                            PARENT, $1, $3, $4, 
+                                            GEDCOM_MAKE_STRING(val1, $4));
                           START(CAUS, $<ctxt>$)  
                          }  
                          no_std_subs  
@@ -2144,10 +2291,10 @@ fam_event_struc_sub : fam_event_sect
                     ;
 
 fam_event_sect : OPEN DELIM fam_event_tag opt_value  
-                 { 
-                  $<ctxt>$ = start_element(ELT_SUB_FAM_EVT,
-                                           PARENT, $1, $3, $4,
-                                           GEDCOM_MAKE_NULL_OR_STRING($4));
+                 { $<ctxt>$
+                    = start_element(ELT_SUB_FAM_EVT,
+                                    PARENT, $1, $3, $4,
+                                    GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
                   START2($<ctxt>$);
                 }
                  fam_event_subs
@@ -2182,7 +2329,7 @@ fam_event_sub : event_detail_sub
 fam_even_husb_sect : OPEN DELIM TAG_HUSB
                      { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_HUSB,
                                                PARENT, $1, $3, NULL,
-                                               GEDCOM_MAKE_NULL());
+                                               GEDCOM_MAKE_NULL(val1));
                       START(HUSB, $<ctxt>$) 
                      }
                      fam_even_husb_subs
@@ -2202,9 +2349,10 @@ fam_even_husb_sub : fam_even_age_sect  { OCCUR2(AGE, 1, 1) }
                   ;
 
 fam_even_age_sect : OPEN DELIM TAG_AGE mand_line_item  
-                    { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_AGE,
+                    { struct age_value age = gedcom_parse_age($4);
+                     $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_AGE,
                                               PARENT, $1, $3, $4,
-                                              GEDCOM_MAKE_STRING($4));
+                                              GEDCOM_MAKE_AGE(val1, age));
                      START(AGE, $<ctxt>$)   
                     }   
                     no_std_subs   
@@ -2218,7 +2366,7 @@ fam_even_age_sect : OPEN DELIM TAG_AGE mand_line_item
 fam_even_wife_sect : OPEN DELIM TAG_WIFE
                      { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_WIFE,
                                                PARENT, $1, $3, NULL,
-                                               GEDCOM_MAKE_NULL());
+                                               GEDCOM_MAKE_NULL(val1));
                       START(WIFE, $<ctxt>$) 
                      }
                      fam_even_husb_subs
@@ -2232,7 +2380,7 @@ fam_even_wife_sect : OPEN DELIM TAG_WIFE
 fam_gen_even_sect : OPEN DELIM TAG_EVEN
                     { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_EVEN,
                                                PARENT, $1, $3, NULL,
-                                               GEDCOM_MAKE_NULL());
+                                               GEDCOM_MAKE_NULL(val1));
                       START(EVEN, $<ctxt>$) 
                     }
                     fam_gen_even_subs
@@ -2261,7 +2409,7 @@ ident_struc_sub : ident_refn_sect  /* 0:M */
 ident_refn_sect : OPEN DELIM TAG_REFN mand_line_item 
                   { $<ctxt>$ = start_element(ELT_SUB_IDENT_REFN,
                                             PARENT, $1, $3, $4,
-                                            GEDCOM_MAKE_STRING($4));
+                                            GEDCOM_MAKE_STRING(val1, $4));
                    START(REFN, $<ctxt>$)  
                   }
                   ident_refn_subs
@@ -2281,9 +2429,10 @@ ident_refn_sub  : ident_refn_type_sect  { OCCUR2(TYPE, 0, 1) }
                 ;
 
 ident_refn_type_sect : OPEN DELIM TAG_TYPE mand_line_item   
-                       { $<ctxt>$ = start_element(ELT_SUB_IDENT_REFN_TYPE,
-                                                 PARENT, $1, $3, $4,
-                                                 GEDCOM_MAKE_STRING($4));
+                       { $<ctxt>$
+                          = start_element(ELT_SUB_IDENT_REFN_TYPE,
+                                          PARENT, $1, $3, $4,
+                                          GEDCOM_MAKE_STRING(val1, $4));
                         START(TYPE, $<ctxt>$)    
                        }    
                        no_std_subs    
@@ -2297,7 +2446,7 @@ ident_refn_type_sect : OPEN DELIM TAG_TYPE mand_line_item
 ident_rin_sect  : OPEN DELIM TAG_RIN mand_line_item   
                   { $<ctxt>$ = start_element(ELT_SUB_IDENT_RIN,
                                             PARENT, $1, $3, $4,
-                                            GEDCOM_MAKE_STRING($4));
+                                            GEDCOM_MAKE_STRING(val1, $4));
                    START(RIN, $<ctxt>$)    
                   }    
                   no_std_subs    
@@ -2316,7 +2465,7 @@ indiv_attr_struc_sub : indiv_attr_sect   /* 0:M */
 indiv_attr_sect : OPEN DELIM indiv_attr_tag mand_line_item
                   { $<ctxt>$ = start_element(ELT_SUB_INDIV_ATTR,
                                             PARENT, $1, $3, $4,
-                                            GEDCOM_MAKE_STRING($4));
+                                            GEDCOM_MAKE_STRING(val1, $4));
                    START2($<ctxt>$);
                  }
                   indiv_attr_event_subs
@@ -2341,7 +2490,7 @@ indiv_attr_tag  : TAG_CAST { $$ = $1; START1(CAST) }
 indiv_resi_sect : OPEN DELIM TAG_RESI 
                   { $<ctxt>$ = start_element(ELT_SUB_INDIV_RESI,
                                             PARENT, $1, $3, NULL,
-                                            GEDCOM_MAKE_NULL());
+                                            GEDCOM_MAKE_NULL(val1));
                    START(RESI, $<ctxt>$)  
                   }
                   indiv_attr_event_subs 
@@ -2367,9 +2516,10 @@ indiv_even_struc_sub : indiv_birt_sect
                      ;
 
 indiv_birt_sect : OPEN DELIM indiv_birt_tag opt_value 
-                  { $<ctxt>$ = start_element(ELT_SUB_INDIV_BIRT,
-                                            PARENT, $1, $3, $4,
-                                            GEDCOM_MAKE_NULL_OR_STRING($4));
+                  { $<ctxt>$
+                     = start_element(ELT_SUB_INDIV_BIRT,
+                                     PARENT, $1, $3, $4,
+                                     GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
                    START2($<ctxt>$);
                  }
                   indiv_birt_subs
@@ -2393,9 +2543,14 @@ indiv_birt_sub  : event_detail_sub
                 ;
 
 indiv_birt_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
-                       { $<ctxt>$ = start_element(ELT_SUB_INDIV_BIRT_FAMC,
-                                                 PARENT, $1, $3, $4,
-                                                 GEDCOM_MAKE_STRING($4));
+                       { struct xref_value *xr = gedcom_parse_xref($4,
+                                                                  XREF_USED,
+                                                                  XREF_FAM);
+                        if (xr == NULL) HANDLE_ERROR;
+                        $<ctxt>$
+                          = start_element(ELT_SUB_INDIV_BIRT_FAMC,
+                                          PARENT, $1, $3, $4,
+                                          GEDCOM_MAKE_XREF_PTR(val1, xr));
                         START(FAMC, $<ctxt>$) 
                        } 
                        no_std_subs 
@@ -2407,9 +2562,10 @@ indiv_birt_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
                      ;
 
 indiv_gen_sect  : OPEN DELIM indiv_gen_tag opt_value 
-                  { $<ctxt>$ = start_element(ELT_SUB_INDIV_GEN,
-                                            PARENT, $1, $3, $4,
-                                            GEDCOM_MAKE_NULL_OR_STRING($4));
+                  { $<ctxt>$
+                     = start_element(ELT_SUB_INDIV_GEN,
+                                     PARENT, $1, $3, $4,
+                                     GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
                    START2($<ctxt>$);
                  }
                   indiv_gen_subs
@@ -2449,9 +2605,10 @@ indiv_gen_sub   : event_detail_sub
                 ;
 
 indiv_adop_sect : OPEN DELIM TAG_ADOP opt_value 
-                  { $<ctxt>$ = start_element(ELT_SUB_INDIV_ADOP,
-                                            PARENT, $1, $3, $4,
-                                            GEDCOM_MAKE_NULL_OR_STRING($4));
+                  { $<ctxt>$
+                     = start_element(ELT_SUB_INDIV_ADOP,
+                                     PARENT, $1, $3, $4,
+                                     GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
                    START(ADOP, $<ctxt>$) }
                   indiv_adop_subs
                  { CHECK0 }
@@ -2470,9 +2627,14 @@ indiv_adop_sub  : event_detail_sub
                 ;
 
 indiv_adop_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
-                       { $<ctxt>$ = start_element(ELT_SUB_INDIV_ADOP_FAMC,
-                                                 PARENT, $1, $3, $4,
-                                                 GEDCOM_MAKE_STRING($4));
+                       { struct xref_value *xr = gedcom_parse_xref($4,
+                                                                  XREF_USED,
+                                                                  XREF_FAM);
+                        if (xr == NULL) HANDLE_ERROR;
+                        $<ctxt>$
+                          = start_element(ELT_SUB_INDIV_ADOP_FAMC,
+                                          PARENT, $1, $3, $4,
+                                          GEDCOM_MAKE_XREF_PTR(val1, xr));
                         START(FAMC, $<ctxt>$) }
                        indiv_adop_famc_subs
                       { CHECK0 }
@@ -2494,7 +2656,7 @@ indiv_adop_famc_adop_sect : OPEN DELIM TAG_ADOP mand_line_item
                             { $<ctxt>$
                                = start_element(ELT_SUB_INDIV_ADOP_FAMC_ADOP,
                                                PARENT, $1, $3, $4,
-                                               GEDCOM_MAKE_STRING($4));
+                                               GEDCOM_MAKE_STRING(val1, $4));
                              START(ADOP, $<ctxt>$) }    
                             no_std_subs    
                             { CHECK0 }    
@@ -2507,7 +2669,7 @@ indiv_adop_famc_adop_sect : OPEN DELIM TAG_ADOP mand_line_item
 indiv_even_sect : OPEN DELIM TAG_EVEN
                   { $<ctxt>$ = start_element(ELT_SUB_INDIV_EVEN,
                                             PARENT, $1, $3, NULL,
-                                            GEDCOM_MAKE_NULL());
+                                            GEDCOM_MAKE_NULL(val1));
                    START(EVEN, $<ctxt>$) }
                   indiv_gen_subs
                  { CHECK0 }
@@ -2524,7 +2686,7 @@ lds_indiv_ord_sub : lio_bapl_sect  /* 0:M */
 lio_bapl_sect : OPEN DELIM lio_bapl_tag 
                 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL,
                                           PARENT, $1, $3, NULL,
-                                          GEDCOM_MAKE_NULL());
+                                          GEDCOM_MAKE_NULL(val1));
                  START2($<ctxt>$);
                }
                 lio_bapl_subs
@@ -2555,7 +2717,7 @@ lio_bapl_sub  : lio_bapl_stat_sect  { OCCUR2(STAT, 0, 1) }
 lio_bapl_stat_sect : OPEN DELIM TAG_STAT mand_line_item   
                      { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_STAT,
                                                PARENT, $1, $3, $4,
-                                               GEDCOM_MAKE_STRING($4));
+                                               GEDCOM_MAKE_STRING(val1, $4));
                       START(STAT, $<ctxt>$)    
                      }    
                      no_std_subs    
@@ -2569,7 +2731,7 @@ lio_bapl_date_sect : OPEN DELIM TAG_DATE mand_line_item
                      { struct date_value dv = gedcom_parse_date($4);
                       $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_DATE,
                                                PARENT, $1, $3, $4,
-                                               GEDCOM_MAKE_DATE(dv));
+                                               GEDCOM_MAKE_DATE(val1, dv));
                       START(DATE, $<ctxt>$)    
                      }    
                      no_std_subs    
@@ -2582,7 +2744,7 @@ lio_bapl_date_sect : OPEN DELIM TAG_DATE mand_line_item
 lio_bapl_temp_sect : OPEN DELIM TAG_TEMP mand_line_item   
                      { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_TEMP,
                                                PARENT, $1, $3, $4,
-                                               GEDCOM_MAKE_STRING($4));
+                                               GEDCOM_MAKE_STRING(val1, $4));
                       START(TEMP, $<ctxt>$)    
                      }    
                      no_std_subs    
@@ -2595,7 +2757,7 @@ lio_bapl_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
 lio_bapl_plac_sect : OPEN DELIM TAG_PLAC mand_line_item   
                      { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_PLAC,
                                                PARENT, $1, $3, $4,
-                                               GEDCOM_MAKE_STRING($4));
+                                               GEDCOM_MAKE_STRING(val1, $4));
                       START(PLAC, $<ctxt>$)    
                      }    
                      no_std_subs    
@@ -2609,7 +2771,7 @@ lio_bapl_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
 lio_slgc_sect : OPEN DELIM TAG_SLGC
                 { $<ctxt>$ = start_element(ELT_SUB_LIO_SLGC,
                                           PARENT, $1, $3, NULL,
-                                          GEDCOM_MAKE_NULL());
+                                          GEDCOM_MAKE_NULL(val1));
                  START(SLGC, $<ctxt>$) 
                 }
                 lio_slgc_subs
@@ -2628,9 +2790,13 @@ lio_slgc_sub  : lio_bapl_sub
               ;
 
 lio_slgc_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
-                     { $<ctxt>$ = start_element(ELT_SUB_LIO_SLGC_FAMC,
-                                               PARENT, $1, $3, $4,
-                                               GEDCOM_MAKE_STRING($4));
+                     { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
+                                                                XREF_FAM);
+                      if (xr == NULL) HANDLE_ERROR;
+                      $<ctxt>$
+                        = start_element(ELT_SUB_LIO_SLGC_FAMC,
+                                        PARENT, $1, $3, $4,
+                                        GEDCOM_MAKE_XREF_PTR(val1, xr));
                       START(FAMC, $<ctxt>$) 
                      } 
                      no_std_subs 
@@ -2648,7 +2814,7 @@ lds_spouse_seal_sub : lss_slgs_sect
 lss_slgs_sect : OPEN DELIM TAG_SLGS
                 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS,
                                           PARENT, $1, $3, NULL,
-                                          GEDCOM_MAKE_NULL());
+                                          GEDCOM_MAKE_NULL(val1));
                  START(SLGS, $<ctxt>$) }
                 lss_slgs_subs
                { CHECK0 }
@@ -2673,7 +2839,7 @@ lss_slgs_sub  : lss_slgs_stat_sect  { OCCUR2(STAT, 0, 1) }
 lss_slgs_stat_sect : OPEN DELIM TAG_STAT mand_line_item   
                      { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_STAT,
                                                PARENT, $1, $3, $4,
-                                               GEDCOM_MAKE_STRING($4));
+                                               GEDCOM_MAKE_STRING(val1, $4));
                       START(STAT, $<ctxt>$)    
                      }    
                      no_std_subs    
@@ -2687,7 +2853,7 @@ lss_slgs_date_sect : OPEN DELIM TAG_DATE mand_line_item
                      { struct date_value dv = gedcom_parse_date($4);
                       $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_DATE,
                                                PARENT, $1, $3, $4,
-                                               GEDCOM_MAKE_DATE(dv));
+                                               GEDCOM_MAKE_DATE(val1, dv));
                       START(DATE, $<ctxt>$)    
                      }    
                      no_std_subs    
@@ -2700,7 +2866,7 @@ lss_slgs_date_sect : OPEN DELIM TAG_DATE mand_line_item
 lss_slgs_temp_sect : OPEN DELIM TAG_TEMP mand_line_item   
                      { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_TEMP,
                                                PARENT, $1, $3, $4,
-                                               GEDCOM_MAKE_STRING($4));
+                                               GEDCOM_MAKE_STRING(val1, $4));
                       START(TEMP, $<ctxt>$)    
                      }    
                      no_std_subs    
@@ -2713,7 +2879,7 @@ lss_slgs_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
 lss_slgs_plac_sect : OPEN DELIM TAG_PLAC mand_line_item   
                      { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_PLAC,
                                                PARENT, $1, $3, $4,
-                                               GEDCOM_MAKE_STRING($4));
+                                               GEDCOM_MAKE_STRING(val1, $4));
                       START(PLAC, $<ctxt>$)    
                      }    
                      no_std_subs    
@@ -2730,9 +2896,14 @@ multim_link_sub : multim_obje_link_sect
                 ;
 
 multim_obje_link_sect : OPEN DELIM TAG_OBJE DELIM POINTER    
-                        { $<ctxt>$ = start_element(ELT_SUB_MULTIM_OBJE,
-                                                  PARENT, $1, $3, $5,
-                                                  GEDCOM_MAKE_STRING($5));
+                        { struct xref_value *xr = gedcom_parse_xref($5,
+                                                                   XREF_USED,
+                                                                   XREF_OBJE);
+                         if (xr == NULL) HANDLE_ERROR;
+                         $<ctxt>$
+                           = start_element(ELT_SUB_MULTIM_OBJE,
+                                           PARENT, $1, $3, $5,
+                                           GEDCOM_MAKE_XREF_PTR(val1, xr));
                          START(OBJE, $<ctxt>$)     
                         }     
                         no_std_subs     
@@ -2746,7 +2917,7 @@ multim_obje_link_sect : OPEN DELIM TAG_OBJE DELIM POINTER
 multim_obje_emb_sect : OPEN DELIM TAG_OBJE
                        { $<ctxt>$ = start_element(ELT_SUB_MULTIM_OBJE,
                                                  PARENT, $1, $3, NULL,
-                                                 GEDCOM_MAKE_NULL());
+                                                 GEDCOM_MAKE_NULL(val1));
                         START(OBJE, $<ctxt>$) 
                        }
                        multim_obje_emb_subs
@@ -2769,9 +2940,10 @@ multim_obje_emb_sub : multim_obje_form_sect  { OCCUR2(FORM, 1, 1) }
                     ;
 
 multim_obje_form_sect : OPEN DELIM TAG_FORM mand_line_item    
-                        { $<ctxt>$ = start_element(ELT_SUB_MULTIM_OBJE_FORM,
-                                                  PARENT, $1, $3, $4,
-                                                  GEDCOM_MAKE_STRING($4));
+                        { $<ctxt>$
+                           = start_element(ELT_SUB_MULTIM_OBJE_FORM,
+                                           PARENT, $1, $3, $4,
+                                           GEDCOM_MAKE_STRING(val1, $4));
                          START(FORM, $<ctxt>$)     
                         }     
                         no_std_subs     
@@ -2782,9 +2954,10 @@ multim_obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
                        }
                       ;
 multim_obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item    
-                        { $<ctxt>$ = start_element(ELT_SUB_MULTIM_OBJE_TITL,
-                                                  PARENT, $1, $3, $4,
-                                                  GEDCOM_MAKE_STRING($4));
+                        { $<ctxt>$
+                           = start_element(ELT_SUB_MULTIM_OBJE_TITL,
+                                           PARENT, $1, $3, $4,
+                                           GEDCOM_MAKE_STRING(val1, $4));
                          START(TITL, $<ctxt>$)     
                         }     
                         no_std_subs     
@@ -2795,9 +2968,10 @@ multim_obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
                        }
                       ;
 multim_obje_file_sect : OPEN DELIM TAG_FILE mand_line_item    
-                        { $<ctxt>$ = start_element(ELT_SUB_MULTIM_OBJE_FILE,
-                                                  PARENT, $1, $3, $4,
-                                                  GEDCOM_MAKE_STRING($4));
+                        { $<ctxt>$
+                           = start_element(ELT_SUB_MULTIM_OBJE_FILE,
+                                           PARENT, $1, $3, $4,
+                                           GEDCOM_MAKE_STRING(val1, $4));
                          START(FILE, $<ctxt>$)     
                         }     
                         no_std_subs     
@@ -2814,9 +2988,14 @@ note_struc_sub : note_struc_link_sect  /* 0:M */
                ;
 
 note_struc_link_sect : OPEN DELIM TAG_NOTE DELIM POINTER
-                       { $<ctxt>$ = start_element(ELT_SUB_NOTE,
-                                                 PARENT, $1, $3, $5,
-                                                 GEDCOM_MAKE_STRING($5));
+                       { struct xref_value *xr = gedcom_parse_xref($5,
+                                                                  XREF_USED,
+                                                                  XREF_NOTE);
+                        if (xr == NULL) HANDLE_ERROR;
+                        $<ctxt>$
+                          = start_element(ELT_SUB_NOTE,
+                                          PARENT, $1, $3, $5,
+                                          GEDCOM_MAKE_XREF_PTR(val1, xr));
                         START(NOTE, $<ctxt>$) 
                        }
                        note_struc_link_subs
@@ -2838,7 +3017,7 @@ note_struc_emb_sect : OPEN DELIM TAG_NOTE opt_line_item
                       { $<ctxt>$
                          = start_element(ELT_SUB_NOTE,
                                          PARENT, $1, $3, $4,
-                                         GEDCOM_MAKE_NULL_OR_STRING($4));
+                                        GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
                        START(NOTE, $<ctxt>$) 
                       }
                       note_struc_emb_subs
@@ -2864,7 +3043,7 @@ pers_name_struc_sub : pers_name_sect /* 0:M */
 pers_name_sect : OPEN DELIM TAG_NAME mand_line_item 
                  { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME,
                                            PARENT, $1, $3, $4,
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(NAME, $<ctxt>$)  
                  }
                  pers_name_subs
@@ -2892,7 +3071,7 @@ pers_name_sub  : pers_name_npfx_sect  { OCCUR2(NPFX, 0, 1) }
 pers_name_npfx_sect : OPEN DELIM TAG_NPFX mand_line_item    
                       { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NPFX,
                                                 PARENT, $1, $3, $4,
-                                                GEDCOM_MAKE_STRING($4));
+                                                GEDCOM_MAKE_STRING(val1, $4));
                        START(NPFX, $<ctxt>$)     
                       }     
                       no_std_subs     
@@ -2905,7 +3084,7 @@ pers_name_npfx_sect : OPEN DELIM TAG_NPFX mand_line_item
 pers_name_givn_sect : OPEN DELIM TAG_GIVN mand_line_item    
                       { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_GIVN,
                                                 PARENT, $1, $3, $4,
-                                                GEDCOM_MAKE_STRING($4));
+                                                GEDCOM_MAKE_STRING(val1, $4));
                        START(GIVN, $<ctxt>$)     
                       }     
                       no_std_subs     
@@ -2918,7 +3097,7 @@ pers_name_givn_sect : OPEN DELIM TAG_GIVN mand_line_item
 pers_name_nick_sect : OPEN DELIM TAG_NICK mand_line_item    
                       { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NICK,
                                                 PARENT, $1, $3, $4,
-                                                GEDCOM_MAKE_STRING($4));
+                                                GEDCOM_MAKE_STRING(val1, $4));
                        START(NICK, $<ctxt>$)     
                       }     
                       no_std_subs     
@@ -2931,7 +3110,7 @@ pers_name_nick_sect : OPEN DELIM TAG_NICK mand_line_item
 pers_name_spfx_sect : OPEN DELIM TAG_SPFX mand_line_item    
                       { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_SPFX,
                                                 PARENT, $1, $3, $4,
-                                                GEDCOM_MAKE_STRING($4));
+                                                GEDCOM_MAKE_STRING(val1, $4));
                        START(SPFX, $<ctxt>$)     
                       }     
                       no_std_subs     
@@ -2944,7 +3123,7 @@ pers_name_spfx_sect : OPEN DELIM TAG_SPFX mand_line_item
 pers_name_surn_sect : OPEN DELIM TAG_SURN mand_line_item    
                       { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_SURN,
                                                 PARENT, $1, $3, $4,
-                                                GEDCOM_MAKE_STRING($4));
+                                                GEDCOM_MAKE_STRING(val1, $4));
                        START(SURN, $<ctxt>$)     
                       }     
                       no_std_subs     
@@ -2957,7 +3136,7 @@ pers_name_surn_sect : OPEN DELIM TAG_SURN mand_line_item
 pers_name_nsfx_sect : OPEN DELIM TAG_NSFX mand_line_item    
                       { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NSFX,
                                                 PARENT, $1, $3, $4,
-                                                GEDCOM_MAKE_STRING($4));
+                                                GEDCOM_MAKE_STRING(val1, $4));
                        START(NSFX, $<ctxt>$)     
                       }     
                       no_std_subs     
@@ -2973,9 +3152,10 @@ place_struc_sub : place_struc_plac_sect /* 0:M */
                 ;
 
 place_struc_plac_sect : OPEN DELIM TAG_PLAC mand_line_item 
-                        { $<ctxt>$ = start_element(ELT_SUB_PLAC,
-                                                  PARENT, $1, $3, $4,
-                                                  GEDCOM_MAKE_STRING($4));
+                        { $<ctxt>$
+                           = start_element(ELT_SUB_PLAC,
+                                           PARENT, $1, $3, $4,
+                                           GEDCOM_MAKE_STRING(val1, $4));
                          START(PLAC, $<ctxt>$)  
                         }
                         place_struc_plac_subs
@@ -2996,9 +3176,10 @@ place_struc_plac_sub : place_plac_form_sect  { OCCUR2(FORM, 0, 1) }
                      ;
 
 place_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item    
-                       { $<ctxt>$ = start_element(ELT_SUB_PLAC_FORM,
-                                                 PARENT, $1, $3, $4,
-                                                 GEDCOM_MAKE_STRING($4));
+                       { $<ctxt>$
+                          = start_element(ELT_SUB_PLAC_FORM,
+                                          PARENT, $1, $3, $4,
+                                          GEDCOM_MAKE_STRING(val1, $4));
                         START(FORM, $<ctxt>$)     
                        }     
                        no_std_subs     
@@ -3015,9 +3196,14 @@ source_cit_sub : source_cit_link_sect /* 0:M */
                ;
 
 source_cit_link_sect : OPEN DELIM TAG_SOUR DELIM POINTER
-                       { $<ctxt>$ = start_element(ELT_SUB_SOUR,
-                                                 PARENT, $1, $3, $5,
-                                                 GEDCOM_MAKE_STRING($5));
+                       { struct xref_value *xr = gedcom_parse_xref($5,
+                                                                  XREF_USED,
+                                                                  XREF_SOUR);
+                        if (xr == NULL) HANDLE_ERROR;
+                        $<ctxt>$
+                          = start_element(ELT_SUB_SOUR,
+                                          PARENT, $1, $3, $5,
+                                          GEDCOM_MAKE_XREF_PTR(val1, xr));
                         START(SOUR, $<ctxt>$) 
                        }
                        source_cit_link_subs
@@ -3041,9 +3227,10 @@ source_cit_link_sub : source_cit_page_sect  { OCCUR2(PAGE, 0, 1) }
                     ;
 
 source_cit_page_sect : OPEN DELIM TAG_PAGE mand_line_item    
-                       { $<ctxt>$ = start_element(ELT_SUB_SOUR_PAGE,
-                                                 PARENT, $1, $3, $4,
-                                                 GEDCOM_MAKE_STRING($4));
+                       { $<ctxt>$
+                          = start_element(ELT_SUB_SOUR_PAGE,
+                                          PARENT, $1, $3, $4,
+                                          GEDCOM_MAKE_STRING(val1, $4));
                         START(PAGE, $<ctxt>$)     
                        }     
                        no_std_subs     
@@ -3055,9 +3242,10 @@ source_cit_page_sect : OPEN DELIM TAG_PAGE mand_line_item
                      ;
 
 source_cit_even_sect : OPEN DELIM TAG_EVEN mand_line_item 
-                       { $<ctxt>$ = start_element(ELT_SUB_SOUR_EVEN,
-                                                 PARENT, $1, $3, $4,
-                                                 GEDCOM_MAKE_STRING($4));
+                       { $<ctxt>$
+                          = start_element(ELT_SUB_SOUR_EVEN,
+                                          PARENT, $1, $3, $4,
+                                          GEDCOM_MAKE_STRING(val1, $4));
                         START(EVEN, $<ctxt>$)     
                        }
                        source_cit_even_subs
@@ -3077,9 +3265,10 @@ source_cit_even_sub  : source_cit_even_role_sect  { OCCUR2(ROLE, 0, 1) }
                      ;
 
 source_cit_even_role_sect : OPEN DELIM TAG_ROLE mand_line_item    
-                          { $<ctxt>$ = start_element(ELT_SUB_SOUR_EVEN_ROLE,
-                                                    PARENT, $1, $3, $4,
-                                                    GEDCOM_MAKE_STRING($4));
+                          { $<ctxt>$
+                             = start_element(ELT_SUB_SOUR_EVEN_ROLE,
+                                             PARENT, $1, $3, $4,
+                                             GEDCOM_MAKE_STRING(val1, $4));
                            START(ROLE, $<ctxt>$)     
                           }     
                           no_std_subs     
@@ -3093,7 +3282,7 @@ source_cit_even_role_sect : OPEN DELIM TAG_ROLE mand_line_item
 source_cit_data_sect : OPEN DELIM TAG_DATA
                        { $<ctxt>$ = start_element(ELT_SUB_SOUR_DATA,
                                                  PARENT, $1, $3, NULL,
-                                                 GEDCOM_MAKE_NULL());
+                                                 GEDCOM_MAKE_NULL(val1));
                         START(DATA, $<ctxt>$) 
                        }
                        source_cit_data_subs
@@ -3115,9 +3304,10 @@ source_cit_data_sub : source_cit_data_date_sect  { OCCUR2(DATE, 0, 1) }
 
 source_cit_data_date_sect : OPEN DELIM TAG_DATE mand_line_item    
                             { struct date_value dv = gedcom_parse_date($4);
-                             $<ctxt>$ = start_element(ELT_SUB_SOUR_DATA_DATE,
-                                                      PARENT, $1, $3, $4,
-                                                      GEDCOM_MAKE_DATE(dv));
+                             $<ctxt>$
+                               = start_element(ELT_SUB_SOUR_DATA_DATE,
+                                               PARENT, $1, $3, $4,
+                                               GEDCOM_MAKE_DATE(val1, dv));
                              START(DATE, $<ctxt>$)     
                             }     
                             no_std_subs     
@@ -3129,9 +3319,10 @@ source_cit_data_date_sect : OPEN DELIM TAG_DATE mand_line_item
                           ;
 
 source_cit_text_sect : OPEN DELIM TAG_TEXT mand_line_item 
-                       { $<ctxt>$ = start_element(ELT_SUB_SOUR_TEXT,
-                                                 PARENT, $1, $3, $4,
-                                                 GEDCOM_MAKE_STRING($4));
+                       { $<ctxt>$
+                          = start_element(ELT_SUB_SOUR_TEXT,
+                                          PARENT, $1, $3, $4,
+                                          GEDCOM_MAKE_STRING(val1, $4));
                         START(TEXT, $<ctxt>$)  
                        }
                        source_cit_text_subs
@@ -3151,9 +3342,10 @@ source_cit_text_sub : continuation_sub
                     ;
 
 source_cit_quay_sect : OPEN DELIM TAG_QUAY mand_line_item    
-                       { $<ctxt>$ = start_element(ELT_SUB_SOUR_QUAY,
-                                                 PARENT, $1, $3, $4,
-                                                 GEDCOM_MAKE_STRING($4));
+                       { $<ctxt>$
+                          = start_element(ELT_SUB_SOUR_QUAY,
+                                          PARENT, $1, $3, $4,
+                                          GEDCOM_MAKE_STRING(val1, $4));
                         START(QUAY, $<ctxt>$)     
                        }     
                        no_std_subs     
@@ -3167,7 +3359,7 @@ source_cit_quay_sect : OPEN DELIM TAG_QUAY mand_line_item
 source_cit_emb_sect : OPEN DELIM TAG_SOUR mand_line_item
                       { $<ctxt>$ = start_element(ELT_SUB_SOUR,
                                                 PARENT, $1, $3, $4,
-                                                GEDCOM_MAKE_STRING($4));
+                                                GEDCOM_MAKE_STRING(val1, $4));
                        START(SOUR, $<ctxt>$) 
                       }
                       source_cit_emb_subs
@@ -3192,9 +3384,13 @@ source_repos_cit_sub : source_repos_repo_sect  { OCCUR2(REPO, 0, 1) }
                      ;
 
 source_repos_repo_sect : OPEN DELIM TAG_REPO mand_pointer
-                         { $<ctxt>$ = start_element(ELT_SUB_REPO,
-                                                   PARENT, $1, $3, $4,
-                                                   GEDCOM_MAKE_STRING($4));
+                         { struct xref_value *xr
+                            = gedcom_parse_xref($4, XREF_USED, XREF_REPO);
+                          if (xr == NULL) HANDLE_ERROR;
+                          $<ctxt>$
+                            = start_element(ELT_SUB_REPO,
+                                            PARENT, $1, $3, $4,
+                                            GEDCOM_MAKE_XREF_PTR(val1, xr));
                           START(REPO, $<ctxt>$) 
                          }
                          source_repos_repo_subs
@@ -3216,7 +3412,7 @@ source_repos_repo_sub  : note_struc_sub
 caln_sect : OPEN DELIM TAG_CALN mand_line_item 
             { $<ctxt>$ = start_element(ELT_SUB_REPO_CALN,
                                       PARENT, $1, $3, $4,
-                                      GEDCOM_MAKE_STRING($4));
+                                      GEDCOM_MAKE_STRING(val1, $4));
              START(CALN, $<ctxt>$) 
            }
             caln_subs
@@ -3237,7 +3433,7 @@ caln_sub  : caln_medi_sect  { OCCUR2(MEDI, 0, 1) }
 caln_medi_sect : OPEN DELIM TAG_MEDI mand_line_item    
                  { $<ctxt>$ = start_element(ELT_SUB_REPO_CALN_MEDI,
                                            PARENT, $1, $3, $4,
-                                           GEDCOM_MAKE_STRING($4));
+                                           GEDCOM_MAKE_STRING(val1, $4));
                   START(MEDI, $<ctxt>$)  
                 }   
                 no_std_subs   
@@ -3252,9 +3448,13 @@ spou_fam_link_sub : spou_fam_fams_sect  /* 0:M */
                   ;
 
 spou_fam_fams_sect : OPEN DELIM TAG_FAMS mand_pointer
-                     { $<ctxt>$ = start_element(ELT_SUB_FAMS,
-                                               PARENT, $1, $3, $4,
-                                               GEDCOM_MAKE_STRING($4));
+                     { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
+                                                                XREF_FAM);
+                      if (xr == NULL) HANDLE_ERROR;
+                      $<ctxt>$
+                        = start_element(ELT_SUB_FAMS,
+                                        PARENT, $1, $3, $4,
+                                        GEDCOM_MAKE_XREF_PTR(val1, xr));
                       START(FAMS, $<ctxt>$) 
                      }
                      spou_fam_fams_subs
@@ -3298,9 +3498,15 @@ user_rec    : OPEN DELIM opt_xref USERTAG
                }
              }
               opt_value
-              { $<ctxt>$ = start_record(REC_USER,
-                                       $1, GEDCOM_MAKE_NULL_OR_STRING($3), $4,
-                                       $6, GEDCOM_MAKE_NULL_OR_STRING($6));
+              { struct xref_value *xr = NULL;
+               if ($3 != NULL) {
+                 xr = gedcom_parse_xref($3, XREF_DEFINED, XREF_USER);
+                 if (xr == NULL) HANDLE_ERROR;
+               }
+               $<ctxt>$ = start_record(REC_USER,
+                                       $1,
+                                       GEDCOM_MAKE_NULL_OR_XREF_PTR(val1, xr),
+                                       $4, $6, &val2);
                START($4, $<ctxt>$)
              }
              user_sects
@@ -3316,8 +3522,7 @@ user_sect   : OPEN DELIM opt_xref USERTAG
                }
              }
               opt_value
-              { $<ctxt>$ = start_element(ELT_USER, PARENT, $1, $4, $6,  
-                                        GEDCOM_MAKE_NULL_OR_STRING($6));
+              { $<ctxt>$ = start_element(ELT_USER, PARENT, $1, $4, $6, &val2);
                START($4, $<ctxt>$);
              }
              user_sects
@@ -3335,12 +3540,15 @@ opt_xref    : /* empty */        { $$ = NULL; }
             | POINTER DELIM        { $$ = $1; }
             ;
 
-opt_value   : /* empty */        { $$ = NULL; }
-            | DELIM line_value        { $$ = $2; }
-            ;
-
-line_value  : POINTER        { $$ = $1; }
-            | line_item        { $$ = $1; }
+opt_value   : /* empty */        { GEDCOM_MAKE_NULL(val2);
+                                   $$ = NULL; }
+            | DELIM POINTER      { struct xref_value *xr
+                                    = gedcom_parse_xref($2, XREF_USED,
+                                                        XREF_USER);
+                                  GEDCOM_MAKE_XREF_PTR(val2, xr);
+                                  $$ = $2; }
+            | DELIM line_item    { GEDCOM_MAKE_STRING(val2, $2);
+                                  $$ = $2; }
             ;
 
 mand_pointer : /* empty */ { gedcom_error(_("Missing pointer")); YYERROR; }
@@ -3348,12 +3556,21 @@ mand_pointer : /* empty */ { gedcom_error(_("Missing pointer")); YYERROR; }
                                $$ = $2; }
              ;
 
-mand_line_item : /* empty */ { gedcom_error(_("Missing value")); YYERROR; }
+mand_line_item : /* empty */
+                 { if (compat_mode(C_LIFELINES)) {
+                     /* Lifelines tends to not care about mandatory values */
+                    gedcom_debug_print("==Val: ==");
+                    $$ = "";
+                  }
+                  else {
+                    gedcom_error(_("Missing value")); YYERROR;
+                  }
+                }
                | DELIM line_item { gedcom_debug_print("==Val: %s==", $2);
                                    $$ = $2; }
                ;
 
-opt_line_item : /* empty */ { }
+opt_line_item : /* empty */     { $$ = NULL; }
               | DELIM line_item { gedcom_debug_print("==Val: %s==", $2);
                                  $$ = $2; }
               ;
@@ -3405,7 +3622,7 @@ error_subs  : /* empty */
 error_sect  : OPEN DELIM opt_xref anytag opt_value error_subs CLOSE { }
 
 gen_sect    : OPEN DELIM opt_xref anystdtag
-              { INVALID_TAG($4); }
+              { INVALID_TAG($4.string); }
               opt_value opt_sects CLOSE
               { }
             ;
@@ -3415,7 +3632,7 @@ gen_rec : gen_rec_top
         ;
 
 gen_rec_norm : OPEN DELIM opt_xref anystdtag
-               { INVALID_TOP_TAG($4) }
+               { INVALID_TOP_TAG($4.string) }
                opt_value opt_sects CLOSE
                { }
              ;
@@ -3609,14 +3826,14 @@ void set_parentctxt(Gedcom_ctxt ctxt)
   ctxt_stack[count_level+1] = ctxt;
 }
 
-char* get_parenttag()
+char* get_parenttag(int offset)
 {
-  return tag_stack[count_level];
+  return tag_stack[count_level - offset];
 }
 
-Gedcom_ctxt get_parentctxt()
+Gedcom_ctxt get_parentctxt(int offset)
 {
-  return ctxt_stack[count_level];
+  return ctxt_stack[count_level - offset];
 }
 
 int count_tag(int tag)
@@ -3685,29 +3902,3 @@ void gedcom_set_error_handling(Gedcom_err_mech mechanism)
 {
   error_mechanism = mechanism;
 }
-
-/* Compatibility handling */
-
-void gedcom_set_compat_handling(int enable_compat)
-{
-  compat_enabled = enable_compat;
-}
-
-void set_compatibility(char* program)
-{
-  if (compat_enabled) {
-    if (! strncmp(program, "ftree", 6)) {
-      gedcom_warning(_("Enabling compatibility with 'ftree'"));
-      compatibility = C_FTREE;
-    }
-    else {
-      compatibility = 0;
-    }
-  }
-}
-
-int compat_mode(int compat_flags)
-{
-  return (compat_flags & compatibility);
-}
-