diff --git a/src/backend/utils/adt/nabstime.c b/src/backend/utils/adt/nabstime.c
index 32f1726..919e6dc 100644
*** a/src/backend/utils/adt/nabstime.c
--- b/src/backend/utils/adt/nabstime.c
*************** abstime2tm(AbsoluteTime _time, int *tzp,
*** 100,114 ****
  	pg_time_t	time = (pg_time_t) _time;
  	struct pg_tm *tx;
  
! 	/*
! 	 * If HasCTZSet is true then we have a brute force time zone specified. Go
! 	 * ahead and rotate to the local time zone since we will later bypass any
! 	 * calls which adjust the tm fields.
! 	 */
! 	if (HasCTZSet && (tzp != NULL))
! 		time -= CTimeZone;
! 
! 	if (!HasCTZSet && tzp != NULL)
  		tx = pg_localtime(&time, session_timezone);
  	else
  		tx = pg_gmtime(&time);
--- 100,106 ----
  	pg_time_t	time = (pg_time_t) _time;
  	struct pg_tm *tx;
  
! 	if (tzp != NULL)
  		tx = pg_localtime(&time, session_timezone);
  	else
  		tx = pg_gmtime(&time);
*************** abstime2tm(AbsoluteTime _time, int *tzp,
*** 126,146 ****
  
  	if (tzp != NULL)
  	{
- 		/*
- 		 * We have a brute force time zone per SQL99? Then use it without
- 		 * change since we have already rotated to the time zone.
- 		 */
- 		if (HasCTZSet)
- 		{
- 			*tzp = CTimeZone;
- 			tm->tm_gmtoff = CTimeZone;
- 			tm->tm_isdst = 0;
- 			tm->tm_zone = NULL;
- 			if (tzn != NULL)
- 				*tzn = NULL;
- 		}
- 		else
- 		{
  			*tzp = -tm->tm_gmtoff;		/* tm_gmtoff is Sun/DEC-ism */
  
  			/*
--- 118,123 ----
*************** abstime2tm(AbsoluteTime _time, int *tzp,
*** 161,167 ****
  							 errmsg("invalid time zone name: \"%s\"",
  									tm->tm_zone)));
  			}
- 		}
  	}
  	else
  		tm->tm_isdst = -1;
--- 138,143 ----
diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c
index 94b2a36..c3c71b7 100644
*** a/src/backend/utils/adt/timestamp.c
--- b/src/backend/utils/adt/timestamp.c
*************** dt2time(Timestamp jd, int *hour, int *mi
*** 1498,1505 ****
   *	 0 on success
   *	-1 on out of range
   *
!  * If attimezone is NULL, the global timezone (including possibly brute forced
!  * timezone) will be used.
   */
  int
  timestamp2tm(Timestamp dt, int *tzp, struct pg_tm * tm, fsec_t *fsec, const char **tzn, pg_tz *attimezone)
--- 1498,1504 ----
   *	 0 on success
   *	-1 on out of range
   *
!  * If attimezone is NULL, the global timezone setting will be used.
   */
  int
  timestamp2tm(Timestamp dt, int *tzp, struct pg_tm * tm, fsec_t *fsec, const char **tzn, pg_tz *attimezone)
*************** timestamp2tm(Timestamp dt, int *tzp, str
*** 1508,1526 ****
  	Timestamp	time;
  	pg_time_t	utime;
  
! 	/*
! 	 * If HasCTZSet is true then we have a brute force time zone specified. Go
! 	 * ahead and rotate to the local time zone since we will later bypass any
! 	 * calls which adjust the tm fields.
! 	 */
! 	if (attimezone == NULL && HasCTZSet && tzp != NULL)
! 	{
! #ifdef HAVE_INT64_TIMESTAMP
! 		dt -= CTimeZone * USECS_PER_SEC;
! #else
! 		dt -= CTimeZone;
! #endif
! 	}
  
  #ifdef HAVE_INT64_TIMESTAMP
  	time = dt;
--- 1507,1515 ----
  	Timestamp	time;
  	pg_time_t	utime;
  
! 	/* Use session timezone if caller asks for default */
! 	if (attimezone == NULL)
! 		attimezone = session_timezone;
  
  #ifdef HAVE_INT64_TIMESTAMP
  	time = dt;
*************** recalc_t:
*** 1590,1610 ****
  	}
  
  	/*
- 	 * We have a brute force time zone per SQL99? Then use it without change
- 	 * since we have already rotated to the time zone.
- 	 */
- 	if (attimezone == NULL && HasCTZSet)
- 	{
- 		*tzp = CTimeZone;
- 		tm->tm_isdst = 0;
- 		tm->tm_gmtoff = CTimeZone;
- 		tm->tm_zone = NULL;
- 		if (tzn != NULL)
- 			*tzn = NULL;
- 		return 0;
- 	}
- 
- 	/*
  	 * If the time falls within the range of pg_time_t, use pg_localtime() to
  	 * rotate to the local time zone.
  	 *
--- 1579,1584 ----
*************** recalc_t:
*** 1624,1631 ****
  	utime = (pg_time_t) dt;
  	if ((Timestamp) utime == dt)
  	{
! 		struct pg_tm *tx = pg_localtime(&utime,
! 								 attimezone ? attimezone : session_timezone);
  
  		tm->tm_year = tx->tm_year + 1900;
  		tm->tm_mon = tx->tm_mon + 1;
--- 1598,1604 ----
  	utime = (pg_time_t) dt;
  	if ((Timestamp) utime == dt)
  	{
! 		struct pg_tm *tx = pg_localtime(&utime, attimezone);
  
  		tm->tm_year = tx->tm_year + 1900;
  		tm->tm_mon = tx->tm_mon + 1;
diff --git a/src/test/regress/expected/horology.out b/src/test/regress/expected/horology.out
index 2666dee..3ed9c8c 100644
*** a/src/test/regress/expected/horology.out
--- b/src/test/regress/expected/horology.out
*************** SELECT '2012-12-12 12:00 America/New_Yor
*** 2959,2967 ****
  (1 row)
  
  SELECT to_char('2012-12-12 12:00'::timestamptz, 'YYYY-MM-DD HH:MI:SS TZ');
!        to_char        
! ----------------------
!  2012-12-12 12:00:00 
  (1 row)
  
  RESET TIME ZONE;
--- 2959,2967 ----
  (1 row)
  
  SELECT to_char('2012-12-12 12:00'::timestamptz, 'YYYY-MM-DD HH:MI:SS TZ');
!           to_char           
! ----------------------------
!  2012-12-12 12:00:00 -01:30
  (1 row)
  
  RESET TIME ZONE;
