diff --git a/src/sbbs3/userlist/SBBS_User_ListMain.cpp b/src/sbbs3/userlist/SBBS_User_ListMain.cpp
index 1391e9444a6a63756f182a84583d2c88923da723..51760eb84c35cafb94687aea9d9e84341cd4b62a 100644
--- a/src/sbbs3/userlist/SBBS_User_ListMain.cpp
+++ b/src/sbbs3/userlist/SBBS_User_ListMain.cpp
@@ -43,7 +43,7 @@ wxString wxbuildinfo(wxbuildinfoformat format)
 
 //(*IdInit(SBBS_User_ListFrame)
 const long SBBS_User_ListFrame::ID_STATICTEXT1 = wxNewId();
-const long SBBS_User_ListFrame::ID_TEXTCTRL1 = wxNewId();
+const long SBBS_User_ListFrame::ID_ARSTEXTCTRL = wxNewId();
 const long SBBS_User_ListFrame::ID_CLEARBUTTON = wxNewId();
 const long SBBS_User_ListFrame::ID_USERLISTCTRL = wxNewId();
 const long SBBS_User_ListFrame::ID_STATICTEXT2 = wxNewId();
@@ -60,7 +60,7 @@ BEGIN_EVENT_TABLE(SBBS_User_ListFrame,wxFrame)
     //*)
 END_EVENT_TABLE()
 
-void fillUserList(wxListCtrl *UserList)
+void SBBS_User_ListFrame::fillUserList(void)
 {
     int         totalusers=lastuser(&App->cfg);
     int         i;
@@ -74,6 +74,10 @@ void fillUserList(wxListCtrl *UserList)
         user.number=i;
         if(getuserdat(&App->cfg, &user)!=0)
             continue;
+        if(ars!=NULL && ars != nular) {
+            if(!chk_ar(&App->cfg, ars, &user, NULL))
+                continue;
+        }
         buf.Printf(_("%d"), i);
         item=UserList->InsertItem(i, buf, 0);
 
@@ -119,14 +123,14 @@ SBBS_User_ListFrame::SBBS_User_ListFrame(wxWindow* parent,wxWindowID id)
     BoxSizer2 = new wxBoxSizer(wxHORIZONTAL);
     StaticText1 = new wxStaticText(this, ID_STATICTEXT1, _("ARS Filter"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT1"));
     BoxSizer2->Add(StaticText1, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5);
-    TextCtrl1 = new wxTextCtrl(this, ID_TEXTCTRL1, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_TEXTCTRL1"));
-    TextCtrl1->SetToolTip(_("Enter an ARS string to filter users with"));
-    BoxSizer2->Add(TextCtrl1, 1, wxALL|wxALIGN_TOP|wxALIGN_BOTTOM, 5);
+    ARSFilter = new wxTextCtrl(this, ID_ARSTEXTCTRL, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_ARSTEXTCTRL"));
+    ARSFilter->SetToolTip(_("Enter an ARS string to filter users with"));
+    BoxSizer2->Add(ARSFilter, 1, wxALL|wxALIGN_TOP|wxALIGN_BOTTOM, 5);
     ClearButton = new wxButton(this, ID_CLEARBUTTON, _("Clear"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_CLEARBUTTON"));
     ClearButton->SetToolTip(_("Clears the ARS filter"));
     BoxSizer2->Add(ClearButton, 0, wxALL|wxALIGN_TOP|wxALIGN_BOTTOM, 5);
     BoxSizer1->Add(BoxSizer2, 0, wxALL|wxEXPAND|wxALIGN_TOP|wxALIGN_BOTTOM, 5);
-    UserList = new wxListCtrl(this, ID_USERLISTCTRL, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxLC_HRULES, wxDefaultValidator, _T("ID_USERLISTCTRL"));
+    UserList = new wxListCtrl(this, ID_USERLISTCTRL, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxLC_HRULES, wxDefaultValidator, _T("ID_USERLISTCTRL"));
     UserList->InsertColumn(0, wxString(_("Num")));
     UserList->InsertColumn(1, wxString(_("Alias")));
     UserList->InsertColumn(2, wxString(_("Name")));
@@ -142,7 +146,7 @@ SBBS_User_ListFrame::SBBS_User_ListFrame(wxWindow* parent,wxWindowID id)
     UserList->InsertColumn(12, wxString(_("Logons")));
     UserList->InsertColumn(13, wxString(_("First On")));
     UserList->InsertColumn(14, wxString(_("Last On")));
-    fillUserList(UserList);
+    fillUserList();
     BoxSizer1->Add(UserList, 1, wxALL|wxEXPAND|wxALIGN_TOP|wxALIGN_BOTTOM, 5);
     BoxSizer3 = new wxBoxSizer(wxHORIZONTAL);
     BoxSizer4 = new wxBoxSizer(wxHORIZONTAL);
@@ -192,9 +196,37 @@ SBBS_User_ListFrame::SBBS_User_ListFrame(wxWindow* parent,wxWindowID id)
     BoxSizer1->Fit(this);
     BoxSizer1->SetSizeHints(this);
 
+    Connect(ID_ARSTEXTCTRL,wxEVT_COMMAND_TEXT_UPDATED,(wxObjectEventFunction)&SBBS_User_ListFrame::OnARSFilterText);
+    Connect(ID_CLEARBUTTON,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&SBBS_User_ListFrame::OnClearButtonClick);
+    Connect(ID_REFRESHBUTTON,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&SBBS_User_ListFrame::OnRefreshButtonClick);
     Connect(idMenuQuit,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&SBBS_User_ListFrame::OnQuit);
     Connect(idMenuAbout,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&SBBS_User_ListFrame::OnAbout);
-    //*)
+    //*)
+
+    /*
+     * Ideally, this would go right after UserList is created
+     * and before it's added to the parent.
+     */
+
+    if(UserList->GetColumnCount()==0) {
+    fprintf(stderr,"No columns in UserList!\r\n");
+    UserList->InsertColumn(0, wxString(_("Num")));
+    UserList->InsertColumn(1, wxString(_("Alias")));
+    UserList->InsertColumn(2, wxString(_("Name")));
+    UserList->InsertColumn(3, wxString(_("Level")));
+    UserList->InsertColumn(4, wxString(_("Age")));
+    UserList->InsertColumn(5, wxString(_("Sex")));
+    UserList->InsertColumn(6, wxString(_("Location")));
+    UserList->InsertColumn(7, wxString(_("Protocol")));
+    UserList->InsertColumn(8, wxString(_("Address")));
+    UserList->InsertColumn(9, wxString(_("Host Name")));
+    UserList->InsertColumn(10, wxString(_("Phone")));
+    UserList->InsertColumn(11, wxString(_("Email")));
+    UserList->InsertColumn(12, wxString(_("Logons")));
+    UserList->InsertColumn(13, wxString(_("First On")));
+    UserList->InsertColumn(14, wxString(_("Last On")));
+    fillUserList();
+    }
 }
 
 SBBS_User_ListFrame::~SBBS_User_ListFrame()
@@ -213,3 +245,33 @@ void SBBS_User_ListFrame::OnAbout(wxCommandEvent& event)
     wxString msg = wxbuildinfo(long_f);
     wxMessageBox(msg, _("Welcome to..."));
 }
+
+void SBBS_User_ListFrame::OnRefreshButtonClick(wxCommandEvent& event)
+{
+    fillUserList();
+}
+
+void SBBS_User_ListFrame::OnARSFilterText(wxCommandEvent& event)
+{
+    static uchar    *last_ars=NULL;
+    static ushort   last_ars_count=0;
+    ushort          count;
+
+    if(!ARSFilter->IsModified())
+        return;
+
+    ars=arstr(&count, ARSFilter->GetValue().mb_str(wxConvUTF8), &App->cfg);
+    if(count != last_ars_count || memcmp(last_ars, ars, count)) {
+        if(last_ars != nular)
+            FREE_AND_NULL(last_ars);
+        last_ars=ars;
+        last_ars_count=count;
+        fillUserList();
+    }
+}
+
+void SBBS_User_ListFrame::OnClearButtonClick(wxCommandEvent& event)
+{
+    ARSFilter->SetValue(_(""));
+    OnARSFilterText(event);
+}
diff --git a/src/sbbs3/userlist/SBBS_User_ListMain.h b/src/sbbs3/userlist/SBBS_User_ListMain.h
index 1de9ca97806d4caa80a14309b24cac71b51f4962..5585dc849b5b803c4c752d5a0bbd3f37a1ff05ad 100644
--- a/src/sbbs3/userlist/SBBS_User_ListMain.h
+++ b/src/sbbs3/userlist/SBBS_User_ListMain.h
@@ -33,14 +33,19 @@ class SBBS_User_ListFrame: public wxFrame
 
     private:
 
+        void fillUserList(void);
+
         //(*Handlers(SBBS_User_ListFrame)
         void OnQuit(wxCommandEvent& event);
         void OnAbout(wxCommandEvent& event);
+        void OnRefreshButtonClick(wxCommandEvent& event);
+        void OnARSFilterText(wxCommandEvent& event);
+        void OnClearButtonClick(wxCommandEvent& event);
         //*)
 
         //(*Identifiers(SBBS_User_ListFrame)
         static const long ID_STATICTEXT1;
-        static const long ID_TEXTCTRL1;
+        static const long ID_ARSTEXTCTRL;
         static const long ID_CLEARBUTTON;
         static const long ID_USERLISTCTRL;
         static const long ID_STATICTEXT2;
@@ -59,11 +64,12 @@ class SBBS_User_ListFrame: public wxFrame
         wxListCtrl* UserList;
         wxStatusBar* StatusBar1;
         wxButton* ClearButton;
-        wxTextCtrl* TextCtrl1;
         wxButton* EditButton;
+        wxTextCtrl* ARSFilter;
         wxChoice* Choice1;
-        //*)
-
+        //*)
+
+        unsigned char *ars;
         DECLARE_EVENT_TABLE()
 };
 
diff --git a/src/sbbs3/userlist/userlist.depend b/src/sbbs3/userlist/userlist.depend
index 26abf06b432d99586a9ee3ff7675166c2e81efb1..ced7cbe8a86d0a1267aa798e01540d9043f46613 100644
--- a/src/sbbs3/userlist/userlist.depend
+++ b/src/sbbs3/userlist/userlist.depend
@@ -349,7 +349,7 @@
 
 1316588509 /usr/local/include/wx-2.8/wx/gtk/app.h
 
-1319424883 /synchronet/src/src/sbbs3/userlist/SBBS_User_ListMain.h
+1319435465 /synchronet/src/src/sbbs3/userlist/SBBS_User_ListMain.h
 	<wx/listctrl.h>
 	<wx/sizer.h>
 	<wx/stattext.h>
@@ -844,7 +844,7 @@
 1316588509 /usr/local/include/wx-2.8/wx/generic/listctrl.h
 	"wx/textctrl.h"
 
-1319425188 source:/synchronet/src/src/sbbs3/userlist/SBBS_User_ListMain.cpp
+1319434824 source:/synchronet/src/src/sbbs3/userlist/SBBS_User_ListMain.cpp
 	"SBBS_User_ListMain.h"
 	<wx/msgdlg.h>
 	<wx/intl.h>
@@ -974,7 +974,7 @@
 1318548475 /synchronet/src/src/sbbs3/fidodefs.h
 	"gen_defs.h"
 
-1318548475 /synchronet/src/src/sbbs3/ars_defs.h
+1319435319 /synchronet/src/src/sbbs3/ars_defs.h
 	<stdio.h>
 	<stdlib.h>
 	<string.h>
@@ -1225,10 +1225,10 @@
 1318263568 source:/synchronet/src/src/sbbs3/str_util.c
 	"sbbs.h"
 
-1318263531 source:/synchronet/src/src/sbbs3/ars.c
+1319435319 source:/synchronet/src/src/sbbs3/ars.c
 	"sbbs.h"
 
-1319425356 source:/synchronet/src/src/sbbs3/userdat.c
+1319427985 source:/synchronet/src/src/sbbs3/userdat.c
 	"sbbs.h"
 	"cmdshell.h"
 
diff --git a/src/sbbs3/userlist/wxsmith/SBBS_User_Listframe.wxs b/src/sbbs3/userlist/wxsmith/SBBS_User_Listframe.wxs
index 9d9a1ce8651643f87502a59d8914ed2cf39395d3..c63d7c01eeada6c4f1f83ac61e3210c5fe13cc09 100644
--- a/src/sbbs3/userlist/wxsmith/SBBS_User_Listframe.wxs
+++ b/src/sbbs3/userlist/wxsmith/SBBS_User_Listframe.wxs
@@ -13,8 +13,9 @@
 						<border>5</border>
 					</object>
 					<object class="sizeritem">
-						<object class="wxTextCtrl" name="ID_TEXTCTRL1" variable="TextCtrl1" member="yes">
+						<object class="wxTextCtrl" name="ID_ARSTEXTCTRL" variable="ARSFilter" member="yes">
 							<tooltip>Enter an ARS string to filter users with</tooltip>
+							<handler function="OnARSFilterText" entry="EVT_TEXT" />
 						</object>
 						<flag>wxALL|wxALIGN_TOP|wxALIGN_BOTTOM</flag>
 						<border>5</border>
@@ -24,6 +25,7 @@
 						<object class="wxButton" name="ID_CLEARBUTTON" variable="ClearButton" member="yes">
 							<label>Clear</label>
 							<tooltip>Clears the ARS filter</tooltip>
+							<handler function="OnClearButtonClick" entry="EVT_BUTTON" />
 						</object>
 						<flag>wxALL|wxALIGN_TOP|wxALIGN_BOTTOM</flag>
 						<border>5</border>
@@ -83,6 +85,7 @@
 								<object class="wxButton" name="ID_REFRESHBUTTON" variable="RefreshButton" member="yes">
 									<label>Refresh</label>
 									<tooltip>Reloads the user database</tooltip>
+									<handler function="OnRefreshButtonClick" entry="EVT_BUTTON" />
 								</object>
 								<flag>wxALL|wxALIGN_RIGHT|wxALIGN_TOP|wxALIGN_BOTTOM</flag>
 								<border>5</border>