diff --git a/src/backend/utils/adt/formatting.c b/src/backend/utils/adt/formatting.c
new file mode 100644
index 25af8a2..2aa6df1
*** a/src/backend/utils/adt/formatting.c
--- b/src/backend/utils/adt/formatting.c
*************** typedef struct
*** 412,418 ****
  				mi,
  				ss,
  				ssss,
! 				d,
  				dd,
  				ddd,
  				mm,
--- 412,418 ----
  				mi,
  				ss,
  				ssss,
! 				d,				/* stored as 1-7, Sunday = 1, 0 means missing */
  				dd,
  				ddd,
  				mm,
*************** DCH_from_char(FormatNode *node, char *in
*** 2897,2902 ****
--- 2897,2903 ----
  				from_char_seq_search(&value, &s, days, ONE_UPPER,
  									 MAX_DAY_LEN, n);
  				from_char_set_int(&out->d, value, n);
+ 				out->d++;
  				break;
  			case DCH_DY:
  			case DCH_Dy:
*************** DCH_from_char(FormatNode *node, char *in
*** 2904,2909 ****
--- 2905,2911 ----
  				from_char_seq_search(&value, &s, days, ONE_UPPER,
  									 MAX_DY_LEN, n);
  				from_char_set_int(&out->d, value, n);
+ 				out->d++;
  				break;
  			case DCH_DDD:
  				from_char_parse_int(&out->ddd, &s, n);
*************** DCH_from_char(FormatNode *node, char *in
*** 2919,2929 ****
  				break;
  			case DCH_D:
  				from_char_parse_int(&out->d, &s, n);
- 				out->d--;
  				s += SKIP_THth(n->suffix);
  				break;
  			case DCH_ID:
  				from_char_parse_int_len(&out->d, &s, 1, n);
  				s += SKIP_THth(n->suffix);
  				break;
  			case DCH_WW:
--- 2921,2933 ----
  				break;
  			case DCH_D:
  				from_char_parse_int(&out->d, &s, n);
  				s += SKIP_THth(n->suffix);
  				break;
  			case DCH_ID:
  				from_char_parse_int_len(&out->d, &s, 1, n);
+ 				/* Shift numbering to match Gregorian where Sunday = 1 */
+ 				if (++out->d > 7)
+ 					out->d = 1;
  				s += SKIP_THth(n->suffix);
  				break;
  			case DCH_WW:
*************** do_to_timestamp(text *date_txt, text *fm
*** 3534,3540 ****
  	if (tmfc.w)
  		tmfc.dd = (tmfc.w - 1) * 7 + 1;
  	if (tmfc.d)
! 		tm->tm_wday = tmfc.d;
  	if (tmfc.dd)
  		tm->tm_mday = tmfc.dd;
  	if (tmfc.ddd)
--- 3538,3544 ----
  	if (tmfc.w)
  		tmfc.dd = (tmfc.w - 1) * 7 + 1;
  	if (tmfc.d)
! 		tm->tm_wday = tmfc.d - 1;	/* convert to native numbering */
  	if (tmfc.dd)
  		tm->tm_mday = tmfc.dd;
  	if (tmfc.ddd)
diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c
new file mode 100644
index 2adc178..50ef897
*** a/src/backend/utils/adt/timestamp.c
--- b/src/backend/utils/adt/timestamp.c
*************** isoweek2date(int woy, int *year, int *mo
*** 3775,3792 ****
  
  /* isoweekdate2date()
   *
!  *	Convert an ISO 8601 week date (ISO year, ISO week and day of week) into a Gregorian date.
   *	Populates year, mon, and mday with the correct Gregorian values.
   *	year must be passed in as the ISO year.
   */
  void
! isoweekdate2date(int isoweek, int isowday, int *year, int *mon, int *mday)
  {
  	int			jday;
  
  	jday = isoweek2j(*year, isoweek);
! 	jday += isowday - 1;
! 
  	j2date(jday, year, mon, mday);
  }
  
--- 3775,3796 ----
  
  /* isoweekdate2date()
   *
!  *	Convert an ISO 8601 week date (ISO year, ISO week) into a Gregorian date.
!  *	Gregorian day of week sent so weekday strings can be supplied.
   *	Populates year, mon, and mday with the correct Gregorian values.
   *	year must be passed in as the ISO year.
   */
  void
! isoweekdate2date(int isoweek, int wday, int *year, int *mon, int *mday)
  {
  	int			jday;
  
  	jday = isoweek2j(*year, isoweek);
! 	/* convert Gregorian week start (Sunday=1) to ISO week start (Monday=1) */
! 	if (wday > 1)
! 		jday += wday - 2;
! 	else
! 		jday += 6;
  	j2date(jday, year, mon, mday);
  }
  
diff --git a/src/include/utils/timestamp.h b/src/include/utils/timestamp.h
new file mode 100644
index 665e969..e7cdb41
*** a/src/include/utils/timestamp.h
--- b/src/include/utils/timestamp.h
*************** extern int	timestamp_cmp_internal(Timest
*** 236,242 ****
  
  extern int	isoweek2j(int year, int week);
  extern void isoweek2date(int woy, int *year, int *mon, int *mday);
! extern void isoweekdate2date(int isoweek, int isowday, int *year, int *mon, int *mday);
  extern int	date2isoweek(int year, int mon, int mday);
  extern int	date2isoyear(int year, int mon, int mday);
  extern int	date2isoyearday(int year, int mon, int mday);
--- 236,242 ----
  
  extern int	isoweek2j(int year, int week);
  extern void isoweek2date(int woy, int *year, int *mon, int *mday);
! extern void isoweekdate2date(int isoweek, int wday, int *year, int *mon, int *mday);
  extern int	date2isoweek(int year, int mon, int mday);
  extern int	date2isoyear(int year, int mon, int mday);
  extern int	date2isoyearday(int year, int mon, int mday);
