diff -ur evolution-2.2.3-orig/filter/filter.glade evolution-2.2.3/filter/filter.glade
--- evolution-2.2.3-orig/filter/filter.glade	2005-08-07 04:09:26.000000000 +0100
+++ evolution-2.2.3/filter/filter.glade	2005-08-07 05:07:29.000000000 +0100
@@ -188,6 +188,17 @@
 			  </child>
 
 			  <child>
+			    <widget class="GtkButton" id="rule_top">
+			      <property name="visible">True</property>
+			      <property name="can_default">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label">gtk-goto-top</property>
+			      <property name="use_stock">True</property>
+			      <property name="relief">GTK_RELIEF_NORMAL</property>
+			    </widget>
+			  </child>
+
+			  <child>
 			    <widget class="GtkButton" id="rule_up">
 			      <property name="visible">True</property>
 			      <property name="can_default">True</property>
@@ -208,6 +219,18 @@
 			      <property name="relief">GTK_RELIEF_NORMAL</property>
 			    </widget>
 			  </child>
+
+			  <child>
+			    <widget class="GtkButton" id="rule_bottom">
+			      <property name="visible">True</property>
+			      <property name="can_default">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label">gtk-goto-bottom</property>
+			      <property name="use_stock">True</property>
+			      <property name="relief">GTK_RELIEF_NORMAL</property>
+			    </widget>
+			  </child>
+
 			</widget>
 			<packing>
 			  <property name="padding">0</property>
diff -ur evolution-2.2.3-orig/filter/rule-editor.c evolution-2.2.3/filter/rule-editor.c
--- evolution-2.2.3-orig/filter/rule-editor.c	2005-08-07 04:09:26.000000000 +0100
+++ evolution-2.2.3/filter/rule-editor.c	2005-08-07 05:35:55.000000000 +0100
@@ -58,8 +58,10 @@
 	BUTTON_ADD,
 	BUTTON_EDIT,
 	BUTTON_DELETE,
+	BUTTON_TOP,
 	BUTTON_UP,
 	BUTTON_DOWN,
+	BUTTON_BOTTOM,
 	BUTTON_LAST
 };
 
@@ -471,6 +473,17 @@
 }
 
 static void
+rule_top (GtkWidget *widget, RuleEditor *re)
+{
+	int pos;
+
+	d(printf ("top rule\n"));
+	pos = rule_context_get_rank_rule (re->context, re->current, re->source);
+	if (pos > 0)
+		rule_move (re, pos, 0);
+}
+
+static void
 rule_up (GtkWidget *widget, RuleEditor *re)
 {
 	int pos;
@@ -492,6 +505,26 @@
 		rule_move (re, pos, pos + 1);
 }
 
+static void
+rule_bottom (GtkWidget *widget, RuleEditor *re)
+{
+	int pos;
+	int index = -1, count = 0;
+	FilterRule *rule = NULL;
+
+	d(printf ("bottom rule\n"));
+	pos = rule_context_get_rank_rule (re->context, re->current, re->source);
+	/* There's probably a better/faster way to get the count of the list here */
+	while ((rule = rule_context_next_rule (re->context, rule, re->source))) {
+		if (rule == re->current)
+			index = count;
+		count++;
+	}
+	count--;
+	if (pos > 0)
+		rule_move (re, pos, count);
+}
+
 static struct {
 	char *name;
 	GtkSignalFunc func;
@@ -499,8 +532,10 @@
 	{ "rule_add",    G_CALLBACK (rule_add)    },
 	{ "rule_edit",   G_CALLBACK (rule_edit)   },
 	{ "rule_delete", G_CALLBACK (rule_delete) },
+	{ "rule_top",    G_CALLBACK (rule_top)    },
 	{ "rule_up",     G_CALLBACK (rule_up)     },
 	{ "rule_down",   G_CALLBACK (rule_down)   },
+	{ "rule_bottom", G_CALLBACK (rule_bottom) },
 };
 
 static void
@@ -521,8 +556,10 @@
 	
 	gtk_widget_set_sensitive (GTK_WIDGET (re->priv->buttons[BUTTON_EDIT]), index != -1);
 	gtk_widget_set_sensitive (GTK_WIDGET (re->priv->buttons[BUTTON_DELETE]), index != -1);
+	gtk_widget_set_sensitive (GTK_WIDGET (re->priv->buttons[BUTTON_TOP]), index > 0);
 	gtk_widget_set_sensitive (GTK_WIDGET (re->priv->buttons[BUTTON_UP]), index > 0);
 	gtk_widget_set_sensitive (GTK_WIDGET (re->priv->buttons[BUTTON_DOWN]), index >= 0 && index < count);
+	gtk_widget_set_sensitive (GTK_WIDGET (re->priv->buttons[BUTTON_BOTTOM]), index >= 0 && index < count);
 }
 
 
