diff -u base/guicast/bcfilebox.C hvirtual-1.1.5/guicast/bcfilebox.C
--- base/guicast/bcfilebox.C	2003-05-05 16:24:52.000000000 +0200
+++ hvirtual-1.1.5/guicast/bcfilebox.C	2003-05-05 15:20:36.000000000 +0200
@@ -10,7 +10,6 @@
 
 #define DIRECTORY_COLOR BLUE
 #define FILE_COLOR BLACK
-
 BC_NewFolder::BC_NewFolder(int x, int y, BC_FileBox *filebox)
  : BC_Window(filebox->get_newfolder_title(), 
  	x, 
@@ -53,21 +52,12 @@
 BC_NewFolderThread::BC_NewFolderThread(BC_FileBox *filebox) : Thread("New folder", 1)
 {
 	this->filebox = filebox;
-	active = 0;
-	set_synchronous(0);
+	window = 0;
 }
 
 BC_NewFolderThread::~BC_NewFolderThread() 
 {
-	change_lock.lock();
-	if(active)
-	{
-		window->lock_window();
-		window->set_done(1);
-		window->unlock_window();
-	}
-	change_lock.unlock();
-	join();
+	interrupt();
 }
 
 void BC_NewFolderThread::run()
@@ -77,46 +67,41 @@
 	if(!result)
 	{
 		char new_folder[BCTEXTLEN];
+		filebox->refresh_lock.lock();
 		filebox->fs->join_names(new_folder, filebox->fs->get_current_dir(), window->get_text());
 		mkdir(new_folder, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
+		filebox->refresh();
+		filebox->refresh_lock.unlock();
 	}
 
-	change_lock.lock();
-	active = 0;
-	change_lock.unlock();
+	window_lock.lock();
 	delete window;
-	completion_lock.unlock();
+	window = 0;
+	window_lock.unlock();
 }
 
 int BC_NewFolderThread::interrupt()
 {
-	change_lock.lock();
-	if(active)
+	if (running())
 	{
-		window->lock_window();
-		window->set_done(1);
-		window->unlock_window();
+		window_lock.lock();
+		if (window)
+			window->set_done(1);
+		window_lock.unlock();
+		join();
 	}
-
-	change_lock.unlock();
-
-	completion_lock.lock();
-	completion_lock.unlock();
 	return 0;
 }
 
 int BC_NewFolderThread::start_new_folder()
 {
+	window_lock.lock();
 	window = new BC_NewFolder(filebox->get_abs_cursor_x(), filebox->get_abs_cursor_y(), filebox);
 	window->create_objects();
-
-	change_lock.lock();
-	active = 1;
-	change_lock.unlock();
+	window_lock.unlock();
 
 	Thread::start();
 
-	completion_lock.lock();
 	return 0;
 }
 
@@ -422,11 +407,11 @@
 
 BC_FileBox::~BC_FileBox()
 {
+	delete newfolder_thread;  // this has to be destroyed before tables, because it can call for an update!
 	delete fs;
 	delete_tables();
 	for(int i = 0; i < TOTAL_ICONS; i++)
 		delete icons[i];
-	delete newfolder_thread;
 	filter_list.remove_all_objects();
 	delete ok_button;
 	if(want_directory)
@@ -494,8 +479,8 @@
 	add_subwindow(filter_popup = 
 		new BC_FileBoxFilterMenu(x + filter_text->get_w(), y, this));
 
+	listbox->activate();    // listbox has to be active because refresh might be called from newfolder_thread
 	newfolder_thread = new BC_NewFolderThread(this);
-	listbox->activate();
 	
 	show_window();
 	return 0;
@@ -621,9 +606,6 @@
 {
 	for(int j = 0; j < FILEBOX_COLUMNS; j++)
 	{
-/*		for(int i = 0; i < list_column[0].total; i++)
-			delete list_column[j].values[i];
-		list_column[j].remove_all();*/
 		list_column[j].remove_all_objects();
 	}
 	return 0;
@@ -654,11 +636,8 @@
 
 	return icons[icon_type];
 }
-
-int BC_FileBox::update_filter(char *filter)
+void BC_FileBox::refresh() 
 {
-	fs->set_filter(filter);
-	fs->update();
 	create_tables();
 	listbox->update(list_column, 
 		column_titles, 
@@ -668,6 +647,14 @@
 		0,
 		-1, 
 		1);
+}
+
+int BC_FileBox::update_filter(char *filter)
+{
+	refresh_lock.lock();
+	fs->set_filter(filter);
+	refresh();
+	refresh_lock.unlock();
 	strcpy(get_resources()->filebox_filter, filter);
 
 	return 0;
@@ -678,18 +665,12 @@
 	if(!path[0]) return 1;   // blank
 
 // is a directory, change directories
+	refresh_lock.lock();
 	if(!fs->is_dir(path) && !use_this)
 	{
 		fs->change_dir(path);
-		create_tables();
-		listbox->update(list_column, 
-			column_titles, 
-			column_width,
-			FILEBOX_COLUMNS, 
-			0, 
-			0, 
-			-1, 
-			1);
+		refresh();
+		refresh_lock.unlock();
 		directory_title->update(fs->get_current_dir());
 		strcpy(this->path, fs->get_current_dir());
 		strcpy(this->directory, fs->get_current_dir());
@@ -708,6 +689,7 @@
 		fs->extract_dir(directory, path);     // save directory for defaults
 		fs->extract_name(filename, path);     // save filename
 		fs->complete_path(path);
+		refresh_lock.unlock();
 		strcpy(this->path, path);          // save complete path
 		newfolder_thread->interrupt();
 		set_done(return_value);
@@ -723,6 +705,7 @@
 
 void BC_FileBox::create_listbox(int x, int y, int mode)
 {
+	refresh_lock.lock();
 	if(listbox && listbox->get_display_mode() != mode)
 	{
 		delete listbox;
@@ -732,6 +715,7 @@
 
 	if(!listbox)
 		add_subwindow(listbox = new BC_FileBoxListBox(x, y, this));
+	refresh_lock.unlock();
 }
 
 char* BC_FileBox::get_path(int selection)
@@ -745,7 +729,9 @@
 		BC_ListBoxItem *item = listbox->get_selection(0, selection - 1);
 		if(item) 
 		{
+			refresh_lock.lock();
 			fs->join_names(string, directory, item->get_text());
+			refresh_lock.unlock();
 			return string;
 		}
 	}
diff -u base/guicast/bcfilebox.h hvirtual-1.1.5/guicast/bcfilebox.h
--- base/guicast/bcfilebox.h	2003-05-05 16:24:52.000000000 +0200
+++ hvirtual-1.1.5/guicast/bcfilebox.h	2003-05-05 15:03:27.000000000 +0200
@@ -42,8 +42,7 @@
 	int start_new_folder();
 
 private:
-	Mutex change_lock, completion_lock;
-	int active;
+	Mutex window_lock;
 	BC_FileBox *filebox;
 	BC_NewFolder *window;
 };
@@ -207,8 +206,10 @@
 	int update_filter(char *filter);
 	virtual int resize_event(int w, int h);
 	char* get_newfolder_title();
-
+	
 private:
+	Mutex refresh_lock;
+	void refresh();
 	int create_icons();
 	int create_tables();
 	int delete_tables();
 {
