diff --git a/src/sbbs3/userlist/SBBS_User_ListMain.cpp b/src/sbbs3/userlist/SBBS_User_ListMain.cpp
index 0fa50309a858f854a80b68b0c7ab43ecc6da4b58..eada0c4e65701bfd9bb0a2eaf5e57cc4142042db 100644
--- a/src/sbbs3/userlist/SBBS_User_ListMain.cpp
+++ b/src/sbbs3/userlist/SBBS_User_ListMain.cpp
@@ -62,11 +62,67 @@ const long SBBS_User_ListFrame::ID_COPYALL = wxNewId();
 const long SBBS_User_ListFrame::ID_REFRESH = wxNewId();
 //*)
 
+struct sortData {
+	int			sort;
+	wxListCtrl	*UserList;
+};
+
 BEGIN_EVENT_TABLE(SBBS_User_ListFrame,wxFrame)
     //(*EventTable(SBBS_User_ListFrame)
     //*)
 END_EVENT_TABLE()
 
+int wxCALLBACK SortCallBack(wxIntPtr item1_data, wxIntPtr item2_data, wxIntPtr data)
+{
+	struct sortData	*sd=(struct sortData *)data;
+	long			item1=sd->UserList->FindItem(-1, item1_data);
+	long			item2=sd->UserList->FindItem(-1, item2_data);
+	wxString		val1,val2;
+	wxListItem		li;
+	long			v1, v2;
+	int				ret;
+
+	li.m_itemId = (sd->sort & 0x100) ? item2 : item1;
+	li.m_col = sd->sort & 0xff;
+	li.m_mask = wxLIST_MASK_TEXT;
+	if(!sd->UserList->GetItem(li))
+		return 0;
+	val1 = li.m_text;
+
+	li.m_itemId = (sd->sort & 0x100) ? item1 : item2;
+	li.m_mask = wxLIST_MASK_TEXT;
+	if(!sd->UserList->GetItem(li))
+		return 0;
+	val2 = li.m_text;
+
+	switch(sd->sort & 0xff) {
+		// Numbers:
+		case 0:
+		case 3:
+		case 4:
+		case 12:
+			if(!val1.ToLong(&v1))
+				return 0;
+			if(!val2.ToLong(&v2))
+				return 0;
+			ret = v1-v2;
+			break;
+		// Dates:
+		case 13:
+		case 14:
+			v1=dstrtounix(&App->cfg, val1.mb_str(wxConvUTF8));
+			v2=dstrtounix(&App->cfg, val2.mb_str(wxConvUTF8));
+			ret = v1-v2;
+			break;
+		// Strings
+		default:
+			ret=val1.CmpNoCase(val2);
+	}
+	if(ret==0)
+		return item1_data-item2_data;
+	return ret;
+}
+
 void SBBS_User_ListFrame::fillUserList(void)
 {
     int         totalusers=lastuser(&App->cfg);
@@ -76,6 +132,7 @@ void SBBS_User_ListFrame::fillUserList(void)
     wxString    buf;
     char        datebuf[9];
     long        topitem=UserList->GetTopItem();
+	struct sortData sd;
 
     UserList->Freeze();
     UserList->DeleteAllItems();
@@ -114,6 +171,9 @@ void SBBS_User_ListFrame::fillUserList(void)
         unixtodstr(&App->cfg, user.laston, datebuf);
         UserList->SetItem(item,14, wxString::From8BitData(datebuf));
     }
+	sd.sort=sort;
+	sd.UserList=UserList;
+	UserList->SortItems(SortCallBack, (wxIntPtr)&sd);
     UserList->EnsureVisible(item);
     UserList->EnsureVisible(topitem);
 	UserList->Thaw();
@@ -409,62 +469,6 @@ void SBBS_User_ListFrame::CopyAllMenuItemSelected(wxCommandEvent& event)
 	CopyItems(wxLIST_STATE_DONTCARE);
 }
 
-struct sortData {
-	int			sort;
-	wxListCtrl	*UserList;
-};
-
-int wxCALLBACK SortCallBack(wxIntPtr item1_data, wxIntPtr item2_data, wxIntPtr data)
-{
-	struct sortData	*sd=(struct sortData *)data;
-	long			item1=sd->UserList->FindItem(-1, item1_data);
-	long			item2=sd->UserList->FindItem(-1, item2_data);
-	wxString		val1,val2;
-	wxListItem		li;
-	long			v1, v2;
-	int				ret;
-
-	li.m_itemId = (sd->sort & 0x100) ? item2 : item1;
-	li.m_col = sd->sort & 0xff;
-	li.m_mask = wxLIST_MASK_TEXT;
-	if(!sd->UserList->GetItem(li))
-		return 0;
-	val1 = li.m_text;
-
-	li.m_itemId = (sd->sort & 0x100) ? item1 : item2;
-	li.m_mask = wxLIST_MASK_TEXT;
-	if(!sd->UserList->GetItem(li))
-		return 0;
-	val2 = li.m_text;
-
-	switch(sd->sort & 0xff) {
-		// Numbers:
-		case 0:
-		case 3:
-		case 4:
-		case 12:
-			if(!val1.ToLong(&v1))
-				return 0;
-			if(!val2.ToLong(&v2))
-				return 0;
-			ret = v1-v2;
-			break;
-		// Dates:
-		case 13:
-		case 14:
-			v1=dstrtounix(&App->cfg, val1.mb_str(wxConvUTF8));
-			v2=dstrtounix(&App->cfg, val2.mb_str(wxConvUTF8));
-			ret = v1-v2;
-			break;
-		// Strings
-		default:
-			ret=val1.CmpNoCase(val2);
-	}
-	if(ret==0)
-		return item1_data-item2_data;
-	return ret;
-}
-
 void SBBS_User_ListFrame::OnUserListColumnClick(wxListEvent& event)
 {
 	struct sortData sd;