Index: commands.c
===================================================================
--- commands.c	(revision 39a531dbab5fa35e3e3ad8b92a43e40ecac6012d)
+++ commands.c	(revision f89cc6fa54344f8f6b48601228af46e8fc95caea)
@@ -96,5 +96,5 @@
   OWLCMD_ARGS("unbindkey", owl_command_unbindkey, OWL_CTX_ANY,
 	      "removes a binding in a keymap",
-	      "unbindkey <keymap> <keyseq>",
+	      "bindkey <keymap> <keyseq>",
 	      "Removes a binding of a key sequence within a keymap.\n"
 	      "Use 'show keymaps' to see the existing keymaps.\n"
@@ -1778,5 +1778,5 @@
 
   if (argc < 3) {
-    owl_function_makemsg("Usage: unbindkey <keymap> <binding>");
+    owl_function_makemsg("Usage: bindkey <keymap> <binding>");
     return NULL;
   }
Index: doc/barnowl.1
===================================================================
--- doc/barnowl.1	(revision 813573732b0f3417b980267c0277caba41fb2cb3)
+++ doc/barnowl.1	(revision bad44968701bd819226d18137988f6234af2bcb4)
@@ -35,12 +35,6 @@
 .TP
 \fB\-c\fP, \fB\-\-config\-file\fP=\fIFILE\fP
-Specify an alternate config file for \fBBarnOwl\fP to use.  The config file is
-an arbitrary Perl script evaluated in the \fImain\fP package, and if it 
-overrides the \fIBarnOwl::startup\fP method that is run when \fBBarnOwl\fP 
-starts.  (Compare \fI~/.owl/startup\fP, which contains \fBBarnOwl\fP commands 
-that are run at startup after the config file is loaded.)
-
-By default, \fBBarnOwl\fP uses the first of \fI~/.owl/init.pl\fP, 
-\fI~/.barnowlconf\fP, or \fI~/.owlconf\fP that exists.
+Specify an alternate config file for \fBBarnOwl\fP to use.  By default,
+\fBBarnOwl\fP uses \fI~/.barnowlconf\fP if it exists, and \fI~/.owlconf\fP otherwise.
 
 .TP
Index: functions.c
===================================================================
--- functions.c	(revision bd482c3a3acaa8cee4b0527fb21a61c2ed52e4e6)
+++ functions.c	(revision 78033261fc599d8d986e1c32b68523132b853d40)
@@ -216,5 +216,5 @@
 void owl_function_add_outgoing_zephyrs(const owl_zwrite *z)
 {
-  if (z->cc && owl_zwrite_is_personal(z)) {
+  if (z->cc || owl_zwrite_get_numrecips(z) == 0) {
     /* create the message */
     owl_message *m = g_new(owl_message, 1);
@@ -225,11 +225,6 @@
     int i;
     for (i = 0; i < owl_zwrite_get_numrecips(z); i++) {
-      owl_message *m;
-
-      if (!owl_zwrite_recip_is_personal(owl_zwrite_get_recip_n(z, i)))
-        continue;
-
       /* create the message */
-      m = g_new(owl_message, 1);
+      owl_message *m = g_new(owl_message, 1);
       owl_message_create_from_zwrite(m, z, owl_zwrite_get_message(z), i);
 
@@ -378,6 +373,9 @@
   owl_function_makemsg("Waiting for ack...");
 
-  /* create the outgoing message */
-  owl_function_add_outgoing_zephyrs(z);
+  /* If it's personal */
+  if (owl_zwrite_is_personal(z)) {
+    /* create the outgoing message */
+    owl_function_add_outgoing_zephyrs(z);
+  }
 }
 #else
@@ -429,11 +427,13 @@
   owl_function_makemsg("Waiting for ack...");
 
-  /* Create the outgoing message. Restore the un-crypted message for display. */
-  owl_zwrite_set_message_raw(z, old_msg);
-  owl_function_add_outgoing_zephyrs(z);
-
-  /* Clean up. */
+  /* If it's personal */
+  if (owl_zwrite_is_personal(z)) {
+    /* Create the outgoing message. Restore the un-crypted message for display. */
+    owl_zwrite_set_message_raw(z, old_msg);
+    owl_function_add_outgoing_zephyrs(z);
+  }
+
+  /* free the zwrite */
   g_free(cryptmsg);
-  g_free(old_msg);
 }
 
Index: global.c
===================================================================
--- global.c	(revision 219f52ca5fddec776365b3e66f4e5415d11a1d40)
+++ global.c	(revision 9078f69bca3842103a42b6ff02451b229988753a)
@@ -75,5 +75,5 @@
   g_free(cd);
 
-  g->msglist = owl_messagelist_new();
+  owl_messagelist_create(&(g->msglist));
 
   _owl_global_init_windows(g);
@@ -109,5 +109,5 @@
 
   /* Create the widgets */
-  g->mw = owl_mainwin_new(g->mainpanel.recwin);
+  owl_mainwin_init(&(g->mw), g->mainpanel.recwin);
   owl_msgwin_init(&(g->msgwin), g->mainpanel.msgwin);
   owl_sepbar_init(g->mainpanel.sepwin);
@@ -241,7 +241,6 @@
 /* windows */
 
-owl_mainwin *owl_global_get_mainwin(owl_global *g)
-{
-  return g->mw;
+owl_mainwin *owl_global_get_mainwin(owl_global *g) {
+  return(&(g->mw));
 }
 
@@ -257,5 +256,5 @@
 
 owl_messagelist *owl_global_get_msglist(owl_global *g) {
-  return g->msglist;
+  return(&(g->msglist));
 }
 
Index: mainwin.c
===================================================================
--- mainwin.c	(revision ab88b053a39621697d2c5b89fcd5dfd9fbf65b04)
+++ mainwin.c	(revision 099597c2cb6389a72841e1aa2b7e3a381b4e500d)
@@ -4,7 +4,6 @@
 static void owl_mainwin_resized(owl_window *w, void *user_data);
 
-CALLER_OWN owl_mainwin *owl_mainwin_new(owl_window *window)
+void owl_mainwin_init(owl_mainwin *mw, owl_window *window)
 {
-  owl_mainwin *mw = g_new(owl_mainwin, 1);
   mw->curtruncated=0;
   mw->lastdisplayed=-1;
@@ -17,6 +16,4 @@
   /* For now, we do not bother with connecting up dependencies; that'll be a
    * future refactor of the mainwin */
-
-  return mw;
 }
 
Index: message.c
===================================================================
--- message.c	(revision bff1f223f86b0f929024fe200978af380d54cba5)
+++ message.c	(revision 6646fdb981a88a6548cbc3da4b4963330fe1c7d6)
@@ -836,6 +836,8 @@
 
   
-  /* set the "isprivate" attribute if it's a private zephyr. */
-  if (owl_zwrite_recip_is_personal(n->z_recipient)) {
+  /* set the "isprivate" attribute if it's a private zephyr.
+   ``private'' means recipient is non-empty and doesn't start wit 
+   `@' */
+  if (*n->z_recipient && *n->z_recipient != '@') {
     owl_message_set_isprivate(m);
   }
Index: messagelist.c
===================================================================
--- messagelist.c	(revision 219f52ca5fddec776365b3e66f4e5415d11a1d40)
+++ messagelist.c	(revision f271129fbb186598811b923e406d65f9d2b3031a)
@@ -1,17 +1,14 @@
 #include "owl.h"
 
-CALLER_OWN owl_messagelist *owl_messagelist_new(void)
+void owl_messagelist_create(owl_messagelist *ml)
 {
-  owl_messagelist *ml = g_new(owl_messagelist, 1);
   ml->list = g_ptr_array_new();
-  return ml;
 }
 
-void owl_messagelist_delete(owl_messagelist *ml, bool free_messages)
+void owl_messagelist_cleanup(owl_messagelist *ml, bool free_messages)
 {
   if (free_messages)
     g_ptr_array_foreach(ml->list, (GFunc)owl_message_delete, NULL);
   g_ptr_array_free(ml->list, true);
-  g_free(ml);
 }
 
Index: owl.c
===================================================================
--- owl.c	(revision 813573732b0f3417b980267c0277caba41fb2cb3)
+++ owl.c	(revision 3b17b576fd1ea9cad1bfe24591b287425172db9a)
@@ -41,6 +41,6 @@
   fprintf(stderr, "  -v,--version        print the Barnowl version number and exit\n");
   fprintf(stderr, "  -h,--help           print this help message\n");
+  fprintf(stderr, "  -c,--config-file    specify an alternate config file\n");
   fprintf(stderr, "  -s,--config-dir     specify an alternate config dir (default ~/.owl)\n");
-  fprintf(stderr, "  -c,--config-file    specify an alternate config file (default ~/.owl/init.pl)\n");
   fprintf(stderr, "  -t,--tty            set the tty name\n");
 }
@@ -585,9 +585,4 @@
   );
 
-  owl_function_debugmsg("startup: setting context interactive");
-
-  owl_global_pop_context(&g);
-  owl_global_push_context(&g, OWL_CTX_INTERACTIVE|OWL_CTX_RECV, NULL, "recv", NULL);
-
   /* process the startup file */
   owl_function_debugmsg("startup: processing startup file");
@@ -601,4 +596,9 @@
       owl_function_error("No such style: %s", owl_global_get_default_style(&g));
 
+  owl_function_debugmsg("startup: setting context interactive");
+
+  owl_global_pop_context(&g);
+  owl_global_push_context(&g, OWL_CTX_INTERACTIVE|OWL_CTX_RECV, NULL, "recv", NULL);
+
   source = owl_window_redraw_source_new();
   g_source_attach(source, NULL);
Index: owl.h
===================================================================
--- owl.h	(revision 219f52ca5fddec776365b3e66f4e5415d11a1d40)
+++ owl.h	(revision b9517cf7ce2959a6e86a52d25a98b1d03df56d58)
@@ -452,5 +452,5 @@
   char *name;
   owl_filter *filter;
-  owl_messagelist *ml;
+  owl_messagelist ml;
   const owl_style *style;
   int cachedmsgid;
@@ -533,5 +533,5 @@
 
 typedef struct _owl_global {
-  owl_mainwin *mw;
+  owl_mainwin mw;
   owl_popwin *pw;
   owl_msgwin msgwin;
@@ -551,5 +551,5 @@
   int curmsg_vert_offset;
   owl_view current_view;
-  owl_messagelist *msglist;
+  owl_messagelist msglist;
   WINDOW *input_pad;
   owl_mainpanel mainpanel;
Index: perl/lib/BarnOwl.pm
===================================================================
--- perl/lib/BarnOwl.pm	(revision 813573732b0f3417b980267c0277caba41fb2cb3)
+++ perl/lib/BarnOwl.pm	(revision 78033261fc599d8d986e1c32b68523132b853d40)
@@ -329,13 +329,8 @@
 our @all_commands;
 
-if(!$configfile) {
-    if (-f get_config_dir() . "/init.pl") {
-        $configfile = get_config_dir() . "/init.pl";
-    } elsif (-f $ENV{HOME} . "/.barnowlconf") {
-        $configfile = $ENV{HOME} . "/.barnowlconf";
-    } else {
-        $configfile = $ENV{HOME}."/.owlconf";
-    }
-}
+if(!$configfile && -f $ENV{HOME} . "/.barnowlconf") {
+    $configfile = $ENV{HOME} . "/.barnowlconf";
+}
+$configfile ||= $ENV{HOME}."/.owlconf";
 
 # populate global variable space for legacy owlconf files
Index: perl/lib/BarnOwl/Message/Zephyr.pm
===================================================================
--- perl/lib/BarnOwl/Message/Zephyr.pm	(revision bf703502300b5d4cd09e0c2a21224e1a8237faa7)
+++ perl/lib/BarnOwl/Message/Zephyr.pm	(revision edd0be704c8df4198dab90ca1633cfa8be9c633f)
@@ -171,5 +171,7 @@
         $class = $self->class;
         $instance = $self->instance;
-        if ($self->recipient eq '' || $self->recipient =~ /^@/) {
+        if ($self->recipient eq '*' || $self->recipient eq '') {
+            $to = '';
+        } elsif ($self->recipient =~ /^@/) {
             $to = $self->recipient;
         } else {
Index: perl/modules/Jabber/lib/BarnOwl/Module/Jabber.pm
===================================================================
--- perl/modules/Jabber/lib/BarnOwl/Module/Jabber.pm	(revision 678f607a39f5773acac88c24b83bde78981ae8b5)
+++ perl/modules/Jabber/lib/BarnOwl/Module/Jabber.pm	(revision b8a3e0025038d7a71f4d13206b772d904f95b8a0)
@@ -1482,15 +1482,5 @@
 }
 
-sub complete_jabberlogout {
-    my $ctx = shift;
-    if($ctx->word == 1) {
-        return ("-A", complete_account() );
-    } else {
-        return ();
-    }
-}
-
 BarnOwl::Completion::register_completer(jwrite => sub { BarnOwl::Module::Jabber::complete_jwrite(@_) });
-BarnOwl::Completion::register_completer(jabberlogout => sub { BarnOwl::Module::Jabber::complete_jabberlogout(@_) });
 
 1;
Index: variable.c
===================================================================
--- variable.c	(revision d126a19eb5f8a883b722fb26d21fb7b62b2aedeb)
+++ variable.c	(revision f271129fbb186598811b923e406d65f9d2b3031a)
@@ -116,7 +116,8 @@
 	       "both,in,out"),
 
-  OWLVAR_BOOL_FULL( "colorztext" /* %OwlVarStub */, 1,
-                    "allow @color() in zephyrs to change color",
-                    NULL, NULL, owl_variable_colorztext_set, NULL),
+  OWLVAR_BOOL( "colorztext" /* %OwlVarStub */, 1,
+	       "allow @color() in zephyrs to change color",
+	       "Note that only messages received after this variable\n"
+	       "is set will be affected." ),
 
   OWLVAR_BOOL( "fancylines" /* %OwlVarStub */, 1,
@@ -495,17 +496,4 @@
   }
   return owl_variable_bool_set_default(v, newval);
-}
-
-int owl_variable_colorztext_set(owl_variable *v, const void *newval)
-{
-  int ret = owl_variable_bool_set_default(v, newval);
-  /* flush the format cache so that we see the update, but only if we're done initializing BarnOwl */
-  if (owl_global_get_msglist(&g) != NULL)
-    owl_messagelist_invalidate_formats(owl_global_get_msglist(&g));
-  if (owl_global_get_mainwin(&g) != NULL) {
-    owl_function_calculate_topmsg(OWL_DIRECTION_DOWNWARDS);
-    owl_mainwin_redisplay(owl_global_get_mainwin(&g));
-  }
-  return ret;
 }
 
Index: view.c
===================================================================
--- view.c	(revision 219f52ca5fddec776365b3e66f4e5415d11a1d40)
+++ view.c	(revision f271129fbb186598811b923e406d65f9d2b3031a)
@@ -6,5 +6,5 @@
   v->filter=f;
   v->style=s;
-  v->ml = owl_messagelist_new();
+  owl_messagelist_create(&(v->ml));
   owl_view_recalculate(v);
 }
@@ -19,5 +19,5 @@
 {
   if (owl_filter_message_match(v->filter, m)) {
-    owl_messagelist_append_element(v->ml, m);
+    owl_messagelist_append_element(&(v->ml), m);
   }
 }
@@ -30,11 +30,13 @@
   int i, j;
   const owl_messagelist *gml;
+  owl_messagelist *ml;
   owl_message *m;
 
   gml=owl_global_get_msglist(&g);
+  ml=&(v->ml);
 
   /* nuke the old list, don't free the messages */
-  owl_messagelist_delete(v->ml, false);
-  v->ml = owl_messagelist_new();
+  owl_messagelist_cleanup(ml, false);
+  owl_messagelist_create(&(v->ml));
 
   /* find all the messages we want */
@@ -43,5 +45,5 @@
     m=owl_messagelist_get_element(gml, i);
     if (owl_filter_message_match(v->filter, m)) {
-      owl_messagelist_append_element(v->ml, m);
+      owl_messagelist_append_element(ml, m);
     }
   }
@@ -70,20 +72,20 @@
 owl_message *owl_view_get_element(const owl_view *v, int index)
 {
-  return owl_messagelist_get_element(v->ml, index);
+  return(owl_messagelist_get_element(&(v->ml), index));
 }
 
 void owl_view_delete_element(owl_view *v, int index)
 {
-  owl_messagelist_delete_element(v->ml, index);
+  owl_messagelist_delete_element(&(v->ml), index);
 }
 
 void owl_view_undelete_element(owl_view *v, int index)
 {
-  owl_messagelist_undelete_element(v->ml, index);
+  owl_messagelist_undelete_element(&(v->ml), index);
 }
 
 int owl_view_get_size(const owl_view *v)
 {
-  return owl_messagelist_get_size(v->ml);
+  return(owl_messagelist_get_size(&(v->ml)));
 }
 
@@ -156,5 +158,5 @@
 void owl_view_cleanup(owl_view *v)
 {
-  owl_messagelist_delete(v->ml, false);
+  owl_messagelist_cleanup(&v->ml, false);
   g_free(v->name);
 }
Index: zephyr.c
===================================================================
--- zephyr.c	(revision f183917998f244e77793c393ebc60f3fc93a3c58)
+++ zephyr.c	(revision d953ede767fb537e3eacf7d9962809191ec38c5c)
@@ -697,5 +697,4 @@
   Code_t ret;
   ZNotice_t notice;
-  char *zsender = NULL;
     
   memset(&notice, 0, sizeof(notice));
@@ -709,11 +708,12 @@
   notice.z_class=zstr(class);
   notice.z_class_inst=zstr(instance);
-  if (!strcmp(recipient, "@")) {
+  notice.z_sender=NULL;
+  if (!strcmp(recipient, "*") || !strcmp(recipient, "@")) {
     notice.z_recipient=zstr("");
+    if (*owl_global_get_zsender(&g))
+        notice.z_sender=zstr(owl_global_get_zsender(&g));
   } else {
     notice.z_recipient=zstr(recipient);
   }
-  if (!owl_zwrite_recip_is_personal(recipient) && *owl_global_get_zsender(&g))
-    notice.z_sender = zsender = long_zuser(owl_global_get_zsender(&g));
   notice.z_default_format=zstr("Class $class, Instance $instance:\nTo: @bold($recipient) at $time $date\nFrom: @bold{$1 <$sender>}\n\n$2");
   if (opcode) notice.z_opcode=zstr(opcode);
@@ -730,5 +730,4 @@
   g_free(notice.z_message);
   ZFreeNotice(&notice);
-  g_free(zsender);
   if (ret != ZERR_NONE) {
     owl_function_error("Error sending zephyr: %s", error_message(ret));
@@ -790,5 +789,6 @@
   } else if (!strcmp(retnotice->z_message, ZSRVACK_NOTSENT)) {
     if (retnotice->z_recipient == NULL
-        || !owl_zwrite_recip_is_personal(retnotice->z_recipient)) {
+        || *retnotice->z_recipient == 0
+        || *retnotice->z_recipient == '@') {
       char *buff;
       owl_function_error("No one subscribed to class %s", retnotice->z_class);
Index: zwrite.c
===================================================================
--- zwrite.c	(revision 919cbf2035c47a7fcb221ef0296e2bfde13eab12)
+++ zwrite.c	(revision ef4074b758108eb46e2b1884e950d6f092a01260)
@@ -182,8 +182,9 @@
   }
 
+  /* if there are no recipients we won't send a ping, which
+     is what we want */
   for (i = 0; i < z->recips->len; i++) {
     to = owl_zwrite_get_recip_n_with_realm(z, i);
-    if (owl_zwrite_recip_is_personal(to))
-      send_ping(to, z->class, z->inst);
+    send_ping(to, z->class, z->inst);
     g_free(to);
   }
@@ -206,5 +207,5 @@
   g_free(z->message);
 
-  if (z->cc && owl_zwrite_is_personal(z)) {
+  if (z->recips->len > 0 && z->cc) {
     message = g_string_new("CC: ");
     for (i = 0; i < z->recips->len; i++) {
@@ -337,18 +338,15 @@
 }
 
-bool owl_zwrite_recip_is_personal(const char *recipient)
-{
-  return recipient[0] && recipient[0] != '@';
-}
-
-bool owl_zwrite_is_personal(const owl_zwrite *z)
+int owl_zwrite_is_personal(const owl_zwrite *z)
 {
   /* return true if at least one of the recipients is personal */
   int i;
-
-  for (i = 0; i < z->recips->len; i++)
-    if (owl_zwrite_recip_is_personal(z->recips->pdata[i]))
-      return true;
-  return false;
+  char *recip;
+
+  for (i = 0; i < z->recips->len; i++) {
+    recip = z->recips->pdata[i];
+    if (recip[0] != '@') return 1;
+  }
+  return(0);
 }
 
