diff --git a/ChangeLog b/ChangeLog
index a297e83e7..223f5a74d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,27 @@
+2001-06-01  Jon Trowbridge  <trow@gnu.org>
+
+       * gdate.c (g_date_update_julian): Changed to take a const
+       argument, and then to cast out const.
+       (g_date_update_dmy): Changed to take a const argument, and then
+       cast out const.
+       (g_date_get_weekday): Changed argument to be const.
+       (g_date_get_month): Changed argument to be const.
+       (g_date_get_year): Changed argument to be const.
+       (g_date_get_day): Changed argument to be const.
+       (g_date_get_julian): Changed argument to be const.
+       (g_date_get_day_of_year): Changed argument to be const.
+       (g_date_get_monday_week_of_year): Changed argument to be const.
+       (g_date_get_sunday_week_of_year): Changed argument to be const.
+       (g_date_compare): Changed arguments to be const.
+       (g_date_to_struct_tm): Changed GDate argument to be const.
+       (g_date_strftime): Changed GDate argument to be const.
+       (g_date_clamp): Added.  The equivalent of the CLAMP macro for
+       GDates.
+       (g_date_order): Added.  Ensure that the first GDate argument
+       preceeds the second, swapping them if necessary.
+       (g_date_days_between): Added.  Computes the (signed) number of days
+       between two dates.
+
 Mon Jun  4 16:02:57 2001  Owen Taylor  <otaylor@redhat.com>
 
 	* gstrfuncs.c (g_strup/strdown): to match g_strcasecmp,
diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0
index a297e83e7..223f5a74d 100644
--- a/ChangeLog.pre-2-0
+++ b/ChangeLog.pre-2-0
@@ -1,3 +1,27 @@
+2001-06-01  Jon Trowbridge  <trow@gnu.org>
+
+       * gdate.c (g_date_update_julian): Changed to take a const
+       argument, and then to cast out const.
+       (g_date_update_dmy): Changed to take a const argument, and then
+       cast out const.
+       (g_date_get_weekday): Changed argument to be const.
+       (g_date_get_month): Changed argument to be const.
+       (g_date_get_year): Changed argument to be const.
+       (g_date_get_day): Changed argument to be const.
+       (g_date_get_julian): Changed argument to be const.
+       (g_date_get_day_of_year): Changed argument to be const.
+       (g_date_get_monday_week_of_year): Changed argument to be const.
+       (g_date_get_sunday_week_of_year): Changed argument to be const.
+       (g_date_compare): Changed arguments to be const.
+       (g_date_to_struct_tm): Changed GDate argument to be const.
+       (g_date_strftime): Changed GDate argument to be const.
+       (g_date_clamp): Added.  The equivalent of the CLAMP macro for
+       GDates.
+       (g_date_order): Added.  Ensure that the first GDate argument
+       preceeds the second, swapping them if necessary.
+       (g_date_days_between): Added.  Computes the (signed) number of days
+       between two dates.
+
 Mon Jun  4 16:02:57 2001  Owen Taylor  <otaylor@redhat.com>
 
 	* gstrfuncs.c (g_strup/strdown): to match g_strcasecmp,
diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10
index a297e83e7..223f5a74d 100644
--- a/ChangeLog.pre-2-10
+++ b/ChangeLog.pre-2-10
@@ -1,3 +1,27 @@
+2001-06-01  Jon Trowbridge  <trow@gnu.org>
+
+       * gdate.c (g_date_update_julian): Changed to take a const
+       argument, and then to cast out const.
+       (g_date_update_dmy): Changed to take a const argument, and then
+       cast out const.
+       (g_date_get_weekday): Changed argument to be const.
+       (g_date_get_month): Changed argument to be const.
+       (g_date_get_year): Changed argument to be const.
+       (g_date_get_day): Changed argument to be const.
+       (g_date_get_julian): Changed argument to be const.
+       (g_date_get_day_of_year): Changed argument to be const.
+       (g_date_get_monday_week_of_year): Changed argument to be const.
+       (g_date_get_sunday_week_of_year): Changed argument to be const.
+       (g_date_compare): Changed arguments to be const.
+       (g_date_to_struct_tm): Changed GDate argument to be const.
+       (g_date_strftime): Changed GDate argument to be const.
+       (g_date_clamp): Added.  The equivalent of the CLAMP macro for
+       GDates.
+       (g_date_order): Added.  Ensure that the first GDate argument
+       preceeds the second, swapping them if necessary.
+       (g_date_days_between): Added.  Computes the (signed) number of days
+       between two dates.
+
 Mon Jun  4 16:02:57 2001  Owen Taylor  <otaylor@redhat.com>
 
 	* gstrfuncs.c (g_strup/strdown): to match g_strcasecmp,
diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12
index a297e83e7..223f5a74d 100644
--- a/ChangeLog.pre-2-12
+++ b/ChangeLog.pre-2-12
@@ -1,3 +1,27 @@
+2001-06-01  Jon Trowbridge  <trow@gnu.org>
+
+       * gdate.c (g_date_update_julian): Changed to take a const
+       argument, and then to cast out const.
+       (g_date_update_dmy): Changed to take a const argument, and then
+       cast out const.
+       (g_date_get_weekday): Changed argument to be const.
+       (g_date_get_month): Changed argument to be const.
+       (g_date_get_year): Changed argument to be const.
+       (g_date_get_day): Changed argument to be const.
+       (g_date_get_julian): Changed argument to be const.
+       (g_date_get_day_of_year): Changed argument to be const.
+       (g_date_get_monday_week_of_year): Changed argument to be const.
+       (g_date_get_sunday_week_of_year): Changed argument to be const.
+       (g_date_compare): Changed arguments to be const.
+       (g_date_to_struct_tm): Changed GDate argument to be const.
+       (g_date_strftime): Changed GDate argument to be const.
+       (g_date_clamp): Added.  The equivalent of the CLAMP macro for
+       GDates.
+       (g_date_order): Added.  Ensure that the first GDate argument
+       preceeds the second, swapping them if necessary.
+       (g_date_days_between): Added.  Computes the (signed) number of days
+       between two dates.
+
 Mon Jun  4 16:02:57 2001  Owen Taylor  <otaylor@redhat.com>
 
 	* gstrfuncs.c (g_strup/strdown): to match g_strcasecmp,
diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2
index a297e83e7..223f5a74d 100644
--- a/ChangeLog.pre-2-2
+++ b/ChangeLog.pre-2-2
@@ -1,3 +1,27 @@
+2001-06-01  Jon Trowbridge  <trow@gnu.org>
+
+       * gdate.c (g_date_update_julian): Changed to take a const
+       argument, and then to cast out const.
+       (g_date_update_dmy): Changed to take a const argument, and then
+       cast out const.
+       (g_date_get_weekday): Changed argument to be const.
+       (g_date_get_month): Changed argument to be const.
+       (g_date_get_year): Changed argument to be const.
+       (g_date_get_day): Changed argument to be const.
+       (g_date_get_julian): Changed argument to be const.
+       (g_date_get_day_of_year): Changed argument to be const.
+       (g_date_get_monday_week_of_year): Changed argument to be const.
+       (g_date_get_sunday_week_of_year): Changed argument to be const.
+       (g_date_compare): Changed arguments to be const.
+       (g_date_to_struct_tm): Changed GDate argument to be const.
+       (g_date_strftime): Changed GDate argument to be const.
+       (g_date_clamp): Added.  The equivalent of the CLAMP macro for
+       GDates.
+       (g_date_order): Added.  Ensure that the first GDate argument
+       preceeds the second, swapping them if necessary.
+       (g_date_days_between): Added.  Computes the (signed) number of days
+       between two dates.
+
 Mon Jun  4 16:02:57 2001  Owen Taylor  <otaylor@redhat.com>
 
 	* gstrfuncs.c (g_strup/strdown): to match g_strcasecmp,
diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4
index a297e83e7..223f5a74d 100644
--- a/ChangeLog.pre-2-4
+++ b/ChangeLog.pre-2-4
@@ -1,3 +1,27 @@
+2001-06-01  Jon Trowbridge  <trow@gnu.org>
+
+       * gdate.c (g_date_update_julian): Changed to take a const
+       argument, and then to cast out const.
+       (g_date_update_dmy): Changed to take a const argument, and then
+       cast out const.
+       (g_date_get_weekday): Changed argument to be const.
+       (g_date_get_month): Changed argument to be const.
+       (g_date_get_year): Changed argument to be const.
+       (g_date_get_day): Changed argument to be const.
+       (g_date_get_julian): Changed argument to be const.
+       (g_date_get_day_of_year): Changed argument to be const.
+       (g_date_get_monday_week_of_year): Changed argument to be const.
+       (g_date_get_sunday_week_of_year): Changed argument to be const.
+       (g_date_compare): Changed arguments to be const.
+       (g_date_to_struct_tm): Changed GDate argument to be const.
+       (g_date_strftime): Changed GDate argument to be const.
+       (g_date_clamp): Added.  The equivalent of the CLAMP macro for
+       GDates.
+       (g_date_order): Added.  Ensure that the first GDate argument
+       preceeds the second, swapping them if necessary.
+       (g_date_days_between): Added.  Computes the (signed) number of days
+       between two dates.
+
 Mon Jun  4 16:02:57 2001  Owen Taylor  <otaylor@redhat.com>
 
 	* gstrfuncs.c (g_strup/strdown): to match g_strcasecmp,
diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6
index a297e83e7..223f5a74d 100644
--- a/ChangeLog.pre-2-6
+++ b/ChangeLog.pre-2-6
@@ -1,3 +1,27 @@
+2001-06-01  Jon Trowbridge  <trow@gnu.org>
+
+       * gdate.c (g_date_update_julian): Changed to take a const
+       argument, and then to cast out const.
+       (g_date_update_dmy): Changed to take a const argument, and then
+       cast out const.
+       (g_date_get_weekday): Changed argument to be const.
+       (g_date_get_month): Changed argument to be const.
+       (g_date_get_year): Changed argument to be const.
+       (g_date_get_day): Changed argument to be const.
+       (g_date_get_julian): Changed argument to be const.
+       (g_date_get_day_of_year): Changed argument to be const.
+       (g_date_get_monday_week_of_year): Changed argument to be const.
+       (g_date_get_sunday_week_of_year): Changed argument to be const.
+       (g_date_compare): Changed arguments to be const.
+       (g_date_to_struct_tm): Changed GDate argument to be const.
+       (g_date_strftime): Changed GDate argument to be const.
+       (g_date_clamp): Added.  The equivalent of the CLAMP macro for
+       GDates.
+       (g_date_order): Added.  Ensure that the first GDate argument
+       preceeds the second, swapping them if necessary.
+       (g_date_days_between): Added.  Computes the (signed) number of days
+       between two dates.
+
 Mon Jun  4 16:02:57 2001  Owen Taylor  <otaylor@redhat.com>
 
 	* gstrfuncs.c (g_strup/strdown): to match g_strcasecmp,
diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8
index a297e83e7..223f5a74d 100644
--- a/ChangeLog.pre-2-8
+++ b/ChangeLog.pre-2-8
@@ -1,3 +1,27 @@
+2001-06-01  Jon Trowbridge  <trow@gnu.org>
+
+       * gdate.c (g_date_update_julian): Changed to take a const
+       argument, and then to cast out const.
+       (g_date_update_dmy): Changed to take a const argument, and then
+       cast out const.
+       (g_date_get_weekday): Changed argument to be const.
+       (g_date_get_month): Changed argument to be const.
+       (g_date_get_year): Changed argument to be const.
+       (g_date_get_day): Changed argument to be const.
+       (g_date_get_julian): Changed argument to be const.
+       (g_date_get_day_of_year): Changed argument to be const.
+       (g_date_get_monday_week_of_year): Changed argument to be const.
+       (g_date_get_sunday_week_of_year): Changed argument to be const.
+       (g_date_compare): Changed arguments to be const.
+       (g_date_to_struct_tm): Changed GDate argument to be const.
+       (g_date_strftime): Changed GDate argument to be const.
+       (g_date_clamp): Added.  The equivalent of the CLAMP macro for
+       GDates.
+       (g_date_order): Added.  Ensure that the first GDate argument
+       preceeds the second, swapping them if necessary.
+       (g_date_days_between): Added.  Computes the (signed) number of days
+       between two dates.
+
 Mon Jun  4 16:02:57 2001  Owen Taylor  <otaylor@redhat.com>
 
 	* gstrfuncs.c (g_strup/strdown): to match g_strcasecmp,
diff --git a/docs/reference/glib/glib-sections.txt b/docs/reference/glib/glib-sections.txt
index a92b4add8..79d362c1d 100644
--- a/docs/reference/glib/glib-sections.txt
+++ b/docs/reference/glib/glib-sections.txt
@@ -895,7 +895,10 @@ g_date_add_months
 g_date_subtract_months
 g_date_add_years
 g_date_subtract_years
+g_date_days_between
 g_date_compare
+g_date_clamp
+g_date_order
 
 <SUBSECTION>
 g_date_get_day
diff --git a/docs/reference/glib/tmpl/date.sgml b/docs/reference/glib/tmpl/date.sgml
index 2137a1483..60d0a4d6f 100644
--- a/docs/reference/glib/tmpl/date.sgml
+++ b/docs/reference/glib/tmpl/date.sgml
@@ -414,6 +414,18 @@ must be valid.
 @n_years: Number of years to move
 
 
+<!-- ##### FUNCTION g_date_days_between ##### -->
+<para>
+Compute the number of days between two dates.
+If @date2 is prior to @date1, the returned value is negative.
+Both dates must be valid.
+</para>
+
+@date1: The first date
+@date2: The second date
+@Returns: The number of days between @date1 and @date2
+
+
 <!-- ##### FUNCTION g_date_compare ##### -->
 <para>
 <function>qsort()</function>-style comparsion function for dates. Both
@@ -426,6 +438,29 @@ dates must be valid.
 greater than zero if @lhs is greater than @rhs
 
 
+<!-- ##### FUNCTION g_date_clamp ##### -->
+<para>
+If @date is prior to @min_date, set @date equal to @min_date.
+If @date falls after @max_date, set @date equal to @max_date.
+Either @min_date and @max_date may be %NULL.  All non-%NULL dates
+must be valid.
+</para>
+
+@date: Date to clamp
+@min_date: Minimum accepted value for @date
+@max_date: Maximum accepted value for @date
+
+
+<!-- ##### FUNCTION g_date_order ##### -->
+<para>
+Check if @date1 is less than or equal to @date2,
+and swap the values if this is not the case.
+</para>
+
+@date1: The first date
+@date2: The second date
+
+
 <!-- ##### FUNCTION g_date_get_day ##### -->
 <para>
 Return the day of the month; the #GDate must be valid.
diff --git a/docs/reference/glib/tmpl/main.sgml b/docs/reference/glib/tmpl/main.sgml
index 90d81269e..c5e55188e 100644
--- a/docs/reference/glib/tmpl/main.sgml
+++ b/docs/reference/glib/tmpl/main.sgml
@@ -837,7 +837,6 @@ of the above functions.
 @user_data: 
 @Returns: 
 
-
 <!--
 Local variables:
 mode: sgml
diff --git a/gdate.c b/gdate.c
index c3018ec90..769684ec6 100644
--- a/gdate.c
+++ b/gdate.c
@@ -100,7 +100,7 @@ g_date_free (GDate *d)
 }
 
 gboolean     
-g_date_valid (GDate       *d)
+g_date_valid (const GDate *d)
 {
   g_return_val_if_fail (d != NULL, FALSE);
   
@@ -167,8 +167,9 @@ g_date_valid_dmy (GDateDay     d,
  *   Jan 1, Year 1
  */
 static void
-g_date_update_julian (GDate *d)
+g_date_update_julian (const GDate *const_d)
 {
+  GDate *d = (GDate *) const_d;
   GDateYear year;
   gint index;
   
@@ -201,8 +202,9 @@ g_date_update_julian (GDate *d)
 }
 
 static void 
-g_date_update_dmy (GDate *d)
+g_date_update_dmy (const GDate *const_d)
 {
+  GDate *d = (GDate *) const_d;
   GDateYear y;
   GDateMonth m;
   GDateDay day;
@@ -249,7 +251,7 @@ g_date_update_dmy (GDate *d)
 }
 
 GDateWeekday 
-g_date_get_weekday (GDate *d)
+g_date_get_weekday (const GDate *d)
 {
   g_return_val_if_fail (d != NULL, G_DATE_BAD_WEEKDAY);
   g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_WEEKDAY);
@@ -264,7 +266,7 @@ g_date_get_weekday (GDate *d)
 }
 
 GDateMonth   
-g_date_get_month (GDate *d)
+g_date_get_month (const GDate *d)
 {
   g_return_val_if_fail (d != NULL, G_DATE_BAD_MONTH);
   g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_MONTH);
@@ -279,7 +281,7 @@ g_date_get_month (GDate *d)
 }
 
 GDateYear    
-g_date_get_year (GDate *d)
+g_date_get_year (const GDate *d)
 {
   g_return_val_if_fail (d != NULL, G_DATE_BAD_YEAR);
   g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_YEAR);
@@ -294,7 +296,7 @@ g_date_get_year (GDate *d)
 }
 
 GDateDay     
-g_date_get_day (GDate *d)
+g_date_get_day (const GDate *d)
 {
   g_return_val_if_fail (d != NULL, G_DATE_BAD_DAY);
   g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_DAY);
@@ -309,7 +311,7 @@ g_date_get_day (GDate *d)
 }
 
 guint32      
-g_date_get_julian (GDate *d)
+g_date_get_julian (const GDate *d)
 {
   g_return_val_if_fail (d != NULL, G_DATE_BAD_JULIAN);
   g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_JULIAN);
@@ -324,7 +326,7 @@ g_date_get_julian (GDate *d)
 }
 
 guint        
-g_date_get_day_of_year (GDate *d)
+g_date_get_day_of_year (const GDate *d)
 {
   gint index;
   
@@ -343,7 +345,7 @@ g_date_get_day_of_year (GDate *d)
 }
 
 guint        
-g_date_get_monday_week_of_year (GDate *d)
+g_date_get_monday_week_of_year (const GDate *d)
 {
   GDateWeekday wd;
   guint day;
@@ -369,7 +371,7 @@ g_date_get_monday_week_of_year (GDate *d)
 }
 
 guint        
-g_date_get_sunday_week_of_year (GDate *d)
+g_date_get_sunday_week_of_year (const GDate *d)
 {
   GDateWeekday wd;
   guint day;
@@ -395,6 +397,19 @@ g_date_get_sunday_week_of_year (GDate *d)
   return ((day + wd)/7U + (wd == 0 ? 1 : 0));
 }
 
+gint
+g_date_days_between (const GDate *d1,
+		     const GDate *d2)
+{
+  g_return_val_if_fail (d1 != NULL, 0);
+  g_return_val_if_fail (d2 != NULL, 0);
+
+  g_return_val_if_fail (g_date_valid (d1), 0);
+  g_return_val_if_fail (g_date_valid (d2), 0);
+
+  return (gint)g_date_get_julian (d2) - (gint)g_date_get_julian (d1);
+}
+
 void         
 g_date_clear (GDate       *d, guint ndates)
 {
@@ -919,7 +934,7 @@ g_date_set_julian (GDate *d, guint32 j)
 
 
 gboolean     
-g_date_is_first_of_month (GDate *d)
+g_date_is_first_of_month (const GDate *d)
 {
   g_return_val_if_fail (d != NULL, FALSE);
   g_return_val_if_fail (g_date_valid (d), FALSE);
@@ -935,7 +950,7 @@ g_date_is_first_of_month (GDate *d)
 }
 
 gboolean     
-g_date_is_last_of_month (GDate *d)
+g_date_is_last_of_month (const GDate *d)
 {
   gint index;
   
@@ -1184,8 +1199,8 @@ g_date_get_sunday_weeks_in_year (GDateYear  year)
 }
 
 gint         
-g_date_compare (GDate     *lhs, 
-                GDate     *rhs)
+g_date_compare (const GDate *lhs, 
+                const GDate *rhs)
 {
   g_return_val_if_fail (lhs != NULL, 0);
   g_return_val_if_fail (rhs != NULL, 0);
@@ -1235,7 +1250,7 @@ g_date_compare (GDate     *lhs,
 
 
 void        
-g_date_to_struct_tm (GDate      *d, 
+g_date_to_struct_tm (const GDate *d, 
                      struct tm   *tm)
 {
   GDateWeekday day;
@@ -1273,11 +1288,48 @@ g_date_to_struct_tm (GDate      *d,
   tm->tm_isdst = -1; /* -1 means "information not available" */
 }
 
+void
+g_date_clamp (GDate *date,
+	      const GDate *min_date,
+	      const GDate *max_date)
+{
+  g_return_if_fail (date);
+  g_return_if_fail (g_date_valid (date));
+  if (min_date != NULL)
+    g_return_if_fail (g_date_valid (min_date));
+  if (max_date != NULL)
+    g_return_if_fail (g_date_valid (max_date));
+  if (min_date != NULL && max_date != NULL)
+    g_return_if_fail (g_date_compare (min_date, max_date) <= 0);
+
+  if (min_date && g_date_compare (date, min_date) < 0)
+    *date = *min_date;
+
+  if (max_date && g_date_compare (max_date, date) < 0)
+    *date = *max_date;
+}
+
+void
+g_date_order (GDate *date1,
+              GDate *date2)
+{
+  g_return_if_fail (date1 != NULL);
+  g_return_if_fail (date2 != NULL);
+  g_return_if_fail (g_date_valid (date1));
+  g_return_if_fail (g_date_valid (date2));
+
+  if (g_date_compare (date1, date2) == 1) {
+    GDate tmp = *date1;
+    *date1 = *date2;
+    *date2 = tmp;
+  }
+}
+
 gsize     
 g_date_strftime (gchar       *s, 
                  gsize        slen, 
                  const gchar *format, 
-                 GDate       *d)
+                 const GDate *d)
 {
   struct tm tm;
   gsize retval;
diff --git a/gdate.h b/gdate.h
index 0ef73af50..4cbdd8c0d 100644
--- a/gdate.h
+++ b/gdate.h
@@ -126,7 +126,7 @@ void         g_date_free                  (GDate       *date);
  * dates (the exceptions are the mutators, since you need those to
  * return to validity).
  */
-gboolean     g_date_valid                 (GDate       *date);
+gboolean     g_date_valid                 (const GDate *date);
 gboolean     g_date_valid_day             (GDateDay     day) G_GNUC_CONST;
 gboolean     g_date_valid_month           (GDateMonth month) G_GNUC_CONST;
 gboolean     g_date_valid_year            (GDateYear  year) G_GNUC_CONST;
@@ -136,20 +136,20 @@ gboolean     g_date_valid_dmy             (GDateDay     day,
                                            GDateMonth   month,
                                            GDateYear    year) G_GNUC_CONST;
 
-GDateWeekday g_date_get_weekday           (GDate       *date);
-GDateMonth   g_date_get_month             (GDate       *date);
-GDateYear    g_date_get_year              (GDate       *date);
-GDateDay     g_date_get_day               (GDate       *date);
-guint32      g_date_get_julian            (GDate       *date);
-guint        g_date_get_day_of_year       (GDate       *date);
+GDateWeekday g_date_get_weekday           (const GDate *date);
+GDateMonth   g_date_get_month             (const GDate *date);
+GDateYear    g_date_get_year              (const GDate *date);
+GDateDay     g_date_get_day               (const GDate *date);
+guint32      g_date_get_julian            (const GDate *date);
+guint        g_date_get_day_of_year       (const GDate *date);
 /* First monday/sunday is the start of week 1; if we haven't reached
  * that day, return 0. These are not ISO weeks of the year; that
  * routine needs to be added.
  * these functions return the number of weeks, starting on the
  * corrsponding day
  */
-guint        g_date_get_monday_week_of_year (GDate      *date);
-guint        g_date_get_sunday_week_of_year (GDate      *date);
+guint        g_date_get_monday_week_of_year (const GDate *date);
+guint        g_date_get_sunday_week_of_year (const GDate *date);
 
 /* If you create a static date struct you need to clear it to get it
  * in a sane state before use. You can clear a whole array at
@@ -178,8 +178,8 @@ void         g_date_set_dmy               (GDate       *date,
                                            GDateYear    y);
 void         g_date_set_julian            (GDate       *date,
                                            guint32      julian_date);
-gboolean     g_date_is_first_of_month     (GDate       *date);
-gboolean     g_date_is_last_of_month      (GDate       *date);
+gboolean     g_date_is_first_of_month     (const GDate *date);
+gboolean     g_date_is_last_of_month      (const GDate *date);
 
 /* To go forward by some number of weeks just go forward weeks*7 days */
 void         g_date_add_days              (GDate       *date,
@@ -204,19 +204,31 @@ guint8       g_date_get_days_in_month     (GDateMonth   month,
 guint8       g_date_get_monday_weeks_in_year  (GDateYear    year) G_GNUC_CONST;
 guint8       g_date_get_sunday_weeks_in_year  (GDateYear    year) G_GNUC_CONST;
 
+/* Returns the number of days between the two dates.  If date2 comes
+   before date1, a negative value is return. */
+gint         g_date_days_between          (const GDate *date1,
+					   const GDate *date2);
+
 /* qsort-friendly (with a cast...) */
-gint         g_date_compare               (GDate       *lhs,
-                                           GDate       *rhs);
-void         g_date_to_struct_tm          (GDate       *date,
+gint         g_date_compare               (const GDate *lhs,
+                                           const GDate *rhs);
+void         g_date_to_struct_tm          (const GDate *date,
                                            struct tm   *tm);
 
+void         g_date_clamp                 (GDate *date,
+					   const GDate *min_date,
+					   const GDate *max_date);
+
+/* Swap date1 and date2's values if date1 > date2. */
+void         g_date_order                 (GDate *date1, GDate *date2);
+
 /* Just like strftime() except you can only use date-related formats.
  *   Using a time format is undefined.
  */
 gsize        g_date_strftime              (gchar       *s,
                                            gsize        slen,
                                            const gchar *format,
-                                           GDate       *date);
+                                           const GDate *date);
 
 #ifndef G_DISABLE_DEPRECATED
 
diff --git a/glib/gdate.c b/glib/gdate.c
index c3018ec90..769684ec6 100644
--- a/glib/gdate.c
+++ b/glib/gdate.c
@@ -100,7 +100,7 @@ g_date_free (GDate *d)
 }
 
 gboolean     
-g_date_valid (GDate       *d)
+g_date_valid (const GDate *d)
 {
   g_return_val_if_fail (d != NULL, FALSE);
   
@@ -167,8 +167,9 @@ g_date_valid_dmy (GDateDay     d,
  *   Jan 1, Year 1
  */
 static void
-g_date_update_julian (GDate *d)
+g_date_update_julian (const GDate *const_d)
 {
+  GDate *d = (GDate *) const_d;
   GDateYear year;
   gint index;
   
@@ -201,8 +202,9 @@ g_date_update_julian (GDate *d)
 }
 
 static void 
-g_date_update_dmy (GDate *d)
+g_date_update_dmy (const GDate *const_d)
 {
+  GDate *d = (GDate *) const_d;
   GDateYear y;
   GDateMonth m;
   GDateDay day;
@@ -249,7 +251,7 @@ g_date_update_dmy (GDate *d)
 }
 
 GDateWeekday 
-g_date_get_weekday (GDate *d)
+g_date_get_weekday (const GDate *d)
 {
   g_return_val_if_fail (d != NULL, G_DATE_BAD_WEEKDAY);
   g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_WEEKDAY);
@@ -264,7 +266,7 @@ g_date_get_weekday (GDate *d)
 }
 
 GDateMonth   
-g_date_get_month (GDate *d)
+g_date_get_month (const GDate *d)
 {
   g_return_val_if_fail (d != NULL, G_DATE_BAD_MONTH);
   g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_MONTH);
@@ -279,7 +281,7 @@ g_date_get_month (GDate *d)
 }
 
 GDateYear    
-g_date_get_year (GDate *d)
+g_date_get_year (const GDate *d)
 {
   g_return_val_if_fail (d != NULL, G_DATE_BAD_YEAR);
   g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_YEAR);
@@ -294,7 +296,7 @@ g_date_get_year (GDate *d)
 }
 
 GDateDay     
-g_date_get_day (GDate *d)
+g_date_get_day (const GDate *d)
 {
   g_return_val_if_fail (d != NULL, G_DATE_BAD_DAY);
   g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_DAY);
@@ -309,7 +311,7 @@ g_date_get_day (GDate *d)
 }
 
 guint32      
-g_date_get_julian (GDate *d)
+g_date_get_julian (const GDate *d)
 {
   g_return_val_if_fail (d != NULL, G_DATE_BAD_JULIAN);
   g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_JULIAN);
@@ -324,7 +326,7 @@ g_date_get_julian (GDate *d)
 }
 
 guint        
-g_date_get_day_of_year (GDate *d)
+g_date_get_day_of_year (const GDate *d)
 {
   gint index;
   
@@ -343,7 +345,7 @@ g_date_get_day_of_year (GDate *d)
 }
 
 guint        
-g_date_get_monday_week_of_year (GDate *d)
+g_date_get_monday_week_of_year (const GDate *d)
 {
   GDateWeekday wd;
   guint day;
@@ -369,7 +371,7 @@ g_date_get_monday_week_of_year (GDate *d)
 }
 
 guint        
-g_date_get_sunday_week_of_year (GDate *d)
+g_date_get_sunday_week_of_year (const GDate *d)
 {
   GDateWeekday wd;
   guint day;
@@ -395,6 +397,19 @@ g_date_get_sunday_week_of_year (GDate *d)
   return ((day + wd)/7U + (wd == 0 ? 1 : 0));
 }
 
+gint
+g_date_days_between (const GDate *d1,
+		     const GDate *d2)
+{
+  g_return_val_if_fail (d1 != NULL, 0);
+  g_return_val_if_fail (d2 != NULL, 0);
+
+  g_return_val_if_fail (g_date_valid (d1), 0);
+  g_return_val_if_fail (g_date_valid (d2), 0);
+
+  return (gint)g_date_get_julian (d2) - (gint)g_date_get_julian (d1);
+}
+
 void         
 g_date_clear (GDate       *d, guint ndates)
 {
@@ -919,7 +934,7 @@ g_date_set_julian (GDate *d, guint32 j)
 
 
 gboolean     
-g_date_is_first_of_month (GDate *d)
+g_date_is_first_of_month (const GDate *d)
 {
   g_return_val_if_fail (d != NULL, FALSE);
   g_return_val_if_fail (g_date_valid (d), FALSE);
@@ -935,7 +950,7 @@ g_date_is_first_of_month (GDate *d)
 }
 
 gboolean     
-g_date_is_last_of_month (GDate *d)
+g_date_is_last_of_month (const GDate *d)
 {
   gint index;
   
@@ -1184,8 +1199,8 @@ g_date_get_sunday_weeks_in_year (GDateYear  year)
 }
 
 gint         
-g_date_compare (GDate     *lhs, 
-                GDate     *rhs)
+g_date_compare (const GDate *lhs, 
+                const GDate *rhs)
 {
   g_return_val_if_fail (lhs != NULL, 0);
   g_return_val_if_fail (rhs != NULL, 0);
@@ -1235,7 +1250,7 @@ g_date_compare (GDate     *lhs,
 
 
 void        
-g_date_to_struct_tm (GDate      *d, 
+g_date_to_struct_tm (const GDate *d, 
                      struct tm   *tm)
 {
   GDateWeekday day;
@@ -1273,11 +1288,48 @@ g_date_to_struct_tm (GDate      *d,
   tm->tm_isdst = -1; /* -1 means "information not available" */
 }
 
+void
+g_date_clamp (GDate *date,
+	      const GDate *min_date,
+	      const GDate *max_date)
+{
+  g_return_if_fail (date);
+  g_return_if_fail (g_date_valid (date));
+  if (min_date != NULL)
+    g_return_if_fail (g_date_valid (min_date));
+  if (max_date != NULL)
+    g_return_if_fail (g_date_valid (max_date));
+  if (min_date != NULL && max_date != NULL)
+    g_return_if_fail (g_date_compare (min_date, max_date) <= 0);
+
+  if (min_date && g_date_compare (date, min_date) < 0)
+    *date = *min_date;
+
+  if (max_date && g_date_compare (max_date, date) < 0)
+    *date = *max_date;
+}
+
+void
+g_date_order (GDate *date1,
+              GDate *date2)
+{
+  g_return_if_fail (date1 != NULL);
+  g_return_if_fail (date2 != NULL);
+  g_return_if_fail (g_date_valid (date1));
+  g_return_if_fail (g_date_valid (date2));
+
+  if (g_date_compare (date1, date2) == 1) {
+    GDate tmp = *date1;
+    *date1 = *date2;
+    *date2 = tmp;
+  }
+}
+
 gsize     
 g_date_strftime (gchar       *s, 
                  gsize        slen, 
                  const gchar *format, 
-                 GDate       *d)
+                 const GDate *d)
 {
   struct tm tm;
   gsize retval;
diff --git a/glib/gdate.h b/glib/gdate.h
index 0ef73af50..4cbdd8c0d 100644
--- a/glib/gdate.h
+++ b/glib/gdate.h
@@ -126,7 +126,7 @@ void         g_date_free                  (GDate       *date);
  * dates (the exceptions are the mutators, since you need those to
  * return to validity).
  */
-gboolean     g_date_valid                 (GDate       *date);
+gboolean     g_date_valid                 (const GDate *date);
 gboolean     g_date_valid_day             (GDateDay     day) G_GNUC_CONST;
 gboolean     g_date_valid_month           (GDateMonth month) G_GNUC_CONST;
 gboolean     g_date_valid_year            (GDateYear  year) G_GNUC_CONST;
@@ -136,20 +136,20 @@ gboolean     g_date_valid_dmy             (GDateDay     day,
                                            GDateMonth   month,
                                            GDateYear    year) G_GNUC_CONST;
 
-GDateWeekday g_date_get_weekday           (GDate       *date);
-GDateMonth   g_date_get_month             (GDate       *date);
-GDateYear    g_date_get_year              (GDate       *date);
-GDateDay     g_date_get_day               (GDate       *date);
-guint32      g_date_get_julian            (GDate       *date);
-guint        g_date_get_day_of_year       (GDate       *date);
+GDateWeekday g_date_get_weekday           (const GDate *date);
+GDateMonth   g_date_get_month             (const GDate *date);
+GDateYear    g_date_get_year              (const GDate *date);
+GDateDay     g_date_get_day               (const GDate *date);
+guint32      g_date_get_julian            (const GDate *date);
+guint        g_date_get_day_of_year       (const GDate *date);
 /* First monday/sunday is the start of week 1; if we haven't reached
  * that day, return 0. These are not ISO weeks of the year; that
  * routine needs to be added.
  * these functions return the number of weeks, starting on the
  * corrsponding day
  */
-guint        g_date_get_monday_week_of_year (GDate      *date);
-guint        g_date_get_sunday_week_of_year (GDate      *date);
+guint        g_date_get_monday_week_of_year (const GDate *date);
+guint        g_date_get_sunday_week_of_year (const GDate *date);
 
 /* If you create a static date struct you need to clear it to get it
  * in a sane state before use. You can clear a whole array at
@@ -178,8 +178,8 @@ void         g_date_set_dmy               (GDate       *date,
                                            GDateYear    y);
 void         g_date_set_julian            (GDate       *date,
                                            guint32      julian_date);
-gboolean     g_date_is_first_of_month     (GDate       *date);
-gboolean     g_date_is_last_of_month      (GDate       *date);
+gboolean     g_date_is_first_of_month     (const GDate *date);
+gboolean     g_date_is_last_of_month      (const GDate *date);
 
 /* To go forward by some number of weeks just go forward weeks*7 days */
 void         g_date_add_days              (GDate       *date,
@@ -204,19 +204,31 @@ guint8       g_date_get_days_in_month     (GDateMonth   month,
 guint8       g_date_get_monday_weeks_in_year  (GDateYear    year) G_GNUC_CONST;
 guint8       g_date_get_sunday_weeks_in_year  (GDateYear    year) G_GNUC_CONST;
 
+/* Returns the number of days between the two dates.  If date2 comes
+   before date1, a negative value is return. */
+gint         g_date_days_between          (const GDate *date1,
+					   const GDate *date2);
+
 /* qsort-friendly (with a cast...) */
-gint         g_date_compare               (GDate       *lhs,
-                                           GDate       *rhs);
-void         g_date_to_struct_tm          (GDate       *date,
+gint         g_date_compare               (const GDate *lhs,
+                                           const GDate *rhs);
+void         g_date_to_struct_tm          (const GDate *date,
                                            struct tm   *tm);
 
+void         g_date_clamp                 (GDate *date,
+					   const GDate *min_date,
+					   const GDate *max_date);
+
+/* Swap date1 and date2's values if date1 > date2. */
+void         g_date_order                 (GDate *date1, GDate *date2);
+
 /* Just like strftime() except you can only use date-related formats.
  *   Using a time format is undefined.
  */
 gsize        g_date_strftime              (gchar       *s,
                                            gsize        slen,
                                            const gchar *format,
-                                           GDate       *date);
+                                           const GDate *date);
 
 #ifndef G_DISABLE_DEPRECATED