Index: perl/lib/BarnOwl.pm
===================================================================
--- perl/lib/BarnOwl.pm	(revision fd8dfe732ac4f414b1f6e8e97af41c7f9d170dd2)
+++ perl/lib/BarnOwl.pm	(revision 22b54a7e11a865e233b7487d805219989c6e31aa)
@@ -18,4 +18,5 @@
 use BarnOwl::Style;
 use BarnOwl::Timer;
+use BarnOwl::Editwin;
 
 =head1 NAME
@@ -316,4 +317,55 @@
 }
 
+=head2 Modify filters by appending text
+
+=cut
+
+BarnOwl::new_command("filterappend",
+    sub { filter_append_helper('appending', '', @_); },
+    {
+        summary => "append '<text>' to filter",
+        usage => "filterappend <filter> <text>",
+    });
+
+BarnOwl::new_command("filterand",
+    sub { filter_append_helper('and-ing', 'and', @_); },
+    {
+        summary => "append 'and <text>' to filter",
+        usage => "filterand <filter> <text>",
+    });
+
+BarnOwl::new_command("filteror",
+    sub { filter_append_helper('or-ing', 'or', @_); },
+    {
+        summary => "append 'or <text>' to filter",
+        usage => "filteror <filter> <text>",
+    });
+
+=head3 filter_append_helper ACTION SEP FUNC FILTER APPEND_TEXT
+
+Helper to append to filters.
+
+=cut
+
+sub filter_append_helper
+{
+    my $action = shift;
+    my $sep = shift;
+    my $func = shift;
+    my $filter = shift;
+    my @append = @_;
+    my $oldfilter = BarnOwl::getfilter($filter);
+    chomp $oldfilter;
+    my $newfilter = join(' ', $oldfilter, $sep, @_);
+    my $msgtext = "To filter '$filter' $action\n'".join(' ', @append)."' to get\n'$newfilter'";
+    if (BarnOwl::getvar('showfilterchange') eq 'on') {
+        BarnOwl::admin_message("Filter", $msgtext);
+    }
+    BarnOwl::filter($filter, $newfilter);
+    return;
+}
+BarnOwl::new_variable_bool("showfilterchange",
+                           { default => 1,
+                             summary => 'Show modifications to filters by filterappend and friends.'});
 
 1;
Index: perl/lib/BarnOwl/Editwin.pm
===================================================================
--- perl/lib/BarnOwl/Editwin.pm	(revision c6ecf5c7b947ccf3045a8217895bcb3707cc40dd)
+++ perl/lib/BarnOwl/Editwin.pm	(revision c6ecf5c7b947ccf3045a8217895bcb3707cc40dd)
@@ -0,0 +1,39 @@
+use warnings;
+use strict;
+
+=head1 NAME
+
+BarnOwl::Editwin
+
+=head1 DESCRIPTION
+
+Functions for interfacing with the BarnOwl editwin. Most of the
+functions in this module are defined in perlglue.xs; This module
+exists to provide Exporter hooks and documentation for them.
+
+=cut
+
+package BarnOwl::Editwin;
+use base qw(Exporter);
+
+our @EXPORT_OK = qw(text_before_point text_after_point replace
+                    point_move replace_region get_region
+                    save_excursion current_column point mark);
+
+sub text_before_point {
+    save_excursion {
+        BarnOwl::command('edit:set-mark');
+        BarnOwl::command('edit:move-to-buffer-start');
+        get_region();
+    }
+}
+
+sub text_after_point {
+    save_excursion {
+        BarnOwl::command('edit:set-mark');
+        BarnOwl::command('edit:move-to-buffer-end');
+        get_region();
+    }
+}
+
+1;
Index: perl/lib/BarnOwl/Message.pm
===================================================================
--- perl/lib/BarnOwl/Message.pm	(revision fd8dfe732ac4f414b1f6e8e97af41c7f9d170dd2)
+++ perl/lib/BarnOwl/Message.pm	(revision d1ae4a421ba5874c2899090ebdd7079e9bbddc25)
@@ -22,4 +22,5 @@
 sub direction   { return shift->{"direction"}; }
 sub time        { return shift->{"time"}; }
+sub unix_time   { return shift->{"unix_time"}; }
 sub id          { return shift->{"id"}; }
 sub body        { return shift->{"body"}; }
Index: perl/lib/BarnOwl/Message/Zephyr.pm
===================================================================
--- perl/lib/BarnOwl/Message/Zephyr.pm	(revision bc8275e9e97b201c2d62ad8acd8eb4d672542c89)
+++ perl/lib/BarnOwl/Message/Zephyr.pm	(revision 30e7ffdcb0c653baff90c99a801d2bf2cdd7a46d)
@@ -179,5 +179,7 @@
 
     my $cmd;
-    if(lc $self->opcode eq 'crypt') {
+    if(lc $self->opcode eq 'crypt' and ( not $sender or $self->is_private)) {
+        # Responses to zcrypted messages should be zcrypted, so long as we
+        # aren't switching to personals
         $cmd = 'zcrypt';
     } else {
Index: perl/lib/BarnOwl/Style/Default.pm
===================================================================
--- perl/lib/BarnOwl/Style/Default.pm	(revision ee183beb7b1f02ed315026b95d9d72e0913908bd)
+++ perl/lib/BarnOwl/Style/Default.pm	(revision 5550eb09288cd1e20bd0d23ec60bba36e0019f0d)
@@ -3,4 +3,6 @@
 
 package BarnOwl::Style::Default;
+use POSIX qw(strftime);
+
 ################################################################################
 # Branching point for various formatting functions in this style.
@@ -40,6 +42,5 @@
     my $self = shift;
     my $m = shift;
-    my ($time) = $m->time =~ /(\d\d:\d\d)/;
-    return $time;
+    return strftime('%H:%M', localtime($m->unix_time));
 }
 
Index: perl/modules/IRC/lib/BarnOwl/Module/IRC.pm
===================================================================
--- perl/modules/IRC/lib/BarnOwl/Module/IRC.pm	(revision 1b62a5524238e97ee512527a1d5bb8d65416c381)
+++ perl/modules/IRC/lib/BarnOwl/Module/IRC.pm	(revision 48f7d1233a2fe7a8f8255a71e7944b8f22589667)
@@ -60,5 +60,5 @@
     register_commands();
     register_handlers();
-    BarnOwl::filter('irc type ^IRC$');
+    BarnOwl::filter('irc type ^IRC$ or ( type ^admin$ and adminheader ^IRC$ )');
 }
 
@@ -375,4 +375,5 @@
     $conn->conn->disconnect;
     delete $ircnets{$conn->alias};
+    return;
 }
 
@@ -387,4 +388,5 @@
         BarnOwl::start_edit_win("/msg -a " . $conn->alias . " $to", sub {process_msg($conn, $to, @_)});
     }
+    return;
 }
 
@@ -415,4 +417,5 @@
        );
     BarnOwl::queue_message($msg);
+    return;
 }
 
@@ -423,4 +426,5 @@
     $target ||= shift;
     $conn->conn->mode($target, @_);
+    return;
 }
 
@@ -432,4 +436,5 @@
     push @{$channels{$chan}}, $conn;
     $conn->conn->join($chan, @_);
+    return;
 }
 
@@ -440,4 +445,5 @@
     $channels{$chan} = [grep {$_ ne $conn} @{$channels{$chan} || []}];
     $conn->conn->part($chan);
+    return;
 }
 
@@ -447,4 +453,5 @@
     my $nick = shift or die("Usage: $cmd <new nick>\n");
     $conn->conn->nick($nick);
+    return;
 }
 
@@ -455,4 +462,5 @@
     $conn->names_tmp([]);
     $conn->conn->names($chan);
+    return;
 }
 
@@ -462,4 +470,5 @@
     my $who = shift || die("Usage: $cmd <user>\n");
     $conn->conn->whois($who);
+    return;
 }
 
@@ -468,4 +477,5 @@
     my $conn = shift;
     $conn->conn->motd;
+    return;
 }
 
@@ -477,4 +487,5 @@
     }
     BarnOwl::popless_ztext($message);
+    return;
 }
 
@@ -485,4 +496,5 @@
     BarnOwl::error("WHO $cmd $conn $who");
     $conn->conn->who($who);
+    return;
 }
 
@@ -492,4 +504,5 @@
     my $type = shift || die("Usage: $cmd <chiklmouy> [server] \n");
     $conn->conn->stats($type, @_);
+    return;
 }
 
@@ -499,4 +512,5 @@
     my $chan = shift;
     $conn->conn->topic($chan, @_ ? join(" ", @_) : undef);
+    return;
 }
 
@@ -505,4 +519,5 @@
     my $conn = shift;
     $conn->conn->sl(join(" ", @_));
+    return;
 }
 
Index: perl/modules/IRC/lib/BarnOwl/Module/IRC/Connection.pm
===================================================================
--- perl/modules/IRC/lib/BarnOwl/Module/IRC/Connection.pm	(revision 32620ac3c3d440bebbc1c828ae41b98d769a0d12)
+++ perl/modules/IRC/lib/BarnOwl/Module/IRC/Connection.pm	(revision 7c83a328fd31c2e251bf67957dd817f91ffada3d)
@@ -273,5 +273,5 @@
         $self->whois_tmp
     );
-    $self->whois_tmp([]);
+    $self->whois_tmp('');
 }
 
