diff --git a/src/syncterm/htmlwin.cpp b/src/syncterm/htmlwin.cpp
index 95109f0369fcb549fb31b0eb7a8b93118d8851e5..96173846155f491ec318ac27bc0c9c2afc131d74 100644
--- a/src/syncterm/htmlwin.cpp
+++ b/src/syncterm/htmlwin.cpp
@@ -28,19 +28,15 @@ static sem_t		state_changed;
 static pthread_mutex_t	update_mutex;
 
 static wxString	update_str;
-
 enum update_type {
 	 HTML_WIN_UPDATE_NONE
 	,HTML_WIN_UPDATE_ADD
 	,HTML_WIN_UPDATE_REPLACE
 };
-
 static enum update_type		update_type=HTML_WIN_UPDATE_NONE;
 
 static wxFrame		*frame;
 static wxHtmlWindow *htmlWindow;
-static wxTimer		*update_timer;
-static wxTimer		*state_timer;
 
 static int			window_width=640;
 static int			window_height=400;
@@ -56,82 +52,8 @@ enum html_window_state {
 	,HTML_WIN_STATE_ICONIZED
 	,HTML_WIN_STATE_HIDDEN
 };
-
 static enum html_window_state	html_window_requested_state=HTML_WIN_STATE_RAISED;
 
-class MyUpdateTimer: public wxTimer
-{
-protected:
-	void Notify(void);
-};
-
-void MyUpdateTimer::Notify(void)
-{
-	int width,height,xpos,ypos;
-
-	pthread_mutex_lock(&update_mutex);
-	switch(update_type) {
-		case HTML_WIN_UPDATE_REPLACE:
-			frame->Show();
-			frame->Raise();
-			frame->GetPosition(&xpos, &ypos);
-			frame->GetSize(&width, &height);
-			if(xpos != window_xpos 
-					|| ypos != window_ypos
-					|| width != window_width
-					|| height != window_height)
-				frame->SetSize(window_xpos, window_ypos, window_width, window_height, wxSIZE_AUTO);
-			htmlWindow->SetPage(update_str);
-			htmlWindow->Raise();
-			htmlWindow->SetFocus();
-			sem_post(&shown);
-			break;
-		case HTML_WIN_UPDATE_ADD:
-			htmlWindow->AppendToPage(update_str);
-			sem_post(&shown);
-			break;
-	}
-	update_str=wxT("");
-	update_type=HTML_WIN_UPDATE_NONE;
-	pthread_mutex_unlock(&update_mutex);
-}
-
-class MyStateTimer: public wxTimer
-{
-protected:
-	void Notify(void);
-};
-
-void MyStateTimer::Notify(void)
-{
-	if(wxTheApp) {
-		switch(html_window_requested_state) {
-			case HTML_WIN_STATE_RAISED:
-				if(!frame->IsShown())
-					frame->Show();
-				if(frame->IsIconized())
-					frame->Iconize(false);
-				frame->Raise();
-				htmlWindow->Raise();
-				htmlWindow->SetFocus();
-				break;
-			case HTML_WIN_STATE_ICONIZED:
-				if(!frame->IsShown())
-					frame->Show();
-				frame->Lower();
-				if(!frame->IsIconized())
-					frame->Iconize(true);
-				break;
-			case HTML_WIN_STATE_HIDDEN:
-				frame->Lower();
-				if(frame->IsShown())
-					frame->Show(false);
-				break;
-		}
-	}
-	sem_post(&state_changed);
-}
-
 class MyHTML: public wxHtmlWindow
 {
 public:
@@ -142,6 +64,8 @@ public:
 protected:
 	wxHtmlOpeningStatus OnOpeningURL(wxHtmlURLType type,const wxString& url, wxString *redirect) const;
 	void MyHTML::OnKeyDown(wxKeyEvent& event);
+	void MyHTML::OnUpdate(wxCommandEvent &event);
+	void MyHTML::OnState(wxCommandEvent &event);
 
 	DECLARE_EVENT_TABLE()
 };
@@ -210,13 +134,87 @@ void MyHTML::OnKeyDown(wxKeyEvent& event)
 	event.Skip();
 }
 
+void MyHTML::OnUpdate(wxCommandEvent &event)
+{
+	int width,height,xpos,ypos;
+
+	pthread_mutex_lock(&update_mutex);
+	switch(update_type) {
+		case HTML_WIN_UPDATE_REPLACE:
+			frame->Show();
+			frame->Raise();
+			frame->GetPosition(&xpos, &ypos);
+			frame->GetSize(&width, &height);
+			if(xpos != window_xpos 
+					|| ypos != window_ypos
+					|| width != window_width
+					|| height != window_height)
+				frame->SetSize(window_xpos, window_ypos, window_width, window_height, wxSIZE_AUTO);
+			htmlWindow->SetPage(update_str);
+			htmlWindow->Raise();
+			htmlWindow->SetFocus();
+			sem_post(&shown);
+			break;
+		case HTML_WIN_UPDATE_ADD:
+			htmlWindow->AppendToPage(update_str);
+			sem_post(&shown);
+			break;
+	}
+	update_str=wxT("");
+	update_type=HTML_WIN_UPDATE_NONE;
+	pthread_mutex_unlock(&update_mutex);
+}
+
+void MyHTML::OnState(wxCommandEvent &event)
+{
+	if(wxTheApp) {
+		switch(html_window_requested_state) {
+			case HTML_WIN_STATE_RAISED:
+				if(!frame->IsShown())
+					frame->Show();
+				if(frame->IsIconized())
+					frame->Iconize(false);
+				frame->Raise();
+				htmlWindow->Raise();
+				htmlWindow->SetFocus();
+				break;
+			case HTML_WIN_STATE_ICONIZED:
+				if(!frame->IsShown())
+					frame->Show();
+				frame->Lower();
+				if(!frame->IsIconized())
+					frame->Iconize(true);
+				break;
+			case HTML_WIN_STATE_HIDDEN:
+				frame->Lower();
+				if(frame->IsShown())
+					frame->Show(false);
+				break;
+		}
+	}
+	sem_post(&state_changed);
+}
+
 #define HTML_ID		wxID_HIGHEST
 
+DECLARE_EVENT_TYPE(update_event, -1)
+DECLARE_EVENT_TYPE(state_event, -1)
+DEFINE_EVENT_TYPE(update_event)
+DEFINE_EVENT_TYPE(state_event)
+
 BEGIN_EVENT_TABLE(MyHTML, wxHtmlWindow)
   EVT_KEY_DOWN(MyHTML::OnKeyDown)
   EVT_HTML_LINK_CLICKED(HTML_ID, MyHTML::Clicked)
+  EVT_COMMAND(HTML_ID, update_event, MyHTML::OnUpdate)
+  EVT_COMMAND(HTML_ID, state_event, MyHTML::OnState)
 END_EVENT_TABLE()
 
+void send_html_event(int evt)
+{
+	wxCommandEvent event( evt, HTML_ID );
+	htmlWindow->GetEventHandler()->AddPendingEvent( event );
+}
+
 class MyFrame: public wxFrame
 {
 public:
@@ -260,8 +258,6 @@ bool MyApp::OnInit()
 	htmlWindow->SetRelatedFrame(frame,wxT("SyncTERM HTML : %s"));
 	wxFileSystem::AddHandler(new wxInternetFSHandler);
 	wxInitAllImageHandlers();
-	update_timer = new MyUpdateTimer();
-	state_timer = new MyStateTimer();
     frame->Show();
     SetTopWindow( frame );
 	while(wxTheApp->Pending())
@@ -316,21 +312,21 @@ extern "C" {
 	void hide_html(void)
 	{
 		html_window_requested_state=HTML_WIN_STATE_HIDDEN;
-		state_timer->Start(1, true);
+		send_html_event(state_event);
 		sem_wait(&state_changed);
 	}
 
 	void iconize_html(void)
 	{
 		html_window_requested_state=HTML_WIN_STATE_ICONIZED;
-		state_timer->Start(1, true);
+		send_html_event(state_event);
 		sem_wait(&state_changed);
 	}
 
 	void raise_html(void)
 	{
 		html_window_requested_state=HTML_WIN_STATE_RAISED;
-		state_timer->Start(1, true);
+		send_html_event(state_event);
 		sem_wait(&state_changed);
 	}
 	
@@ -338,10 +334,12 @@ extern "C" {
 	{
 		pthread_mutex_lock(&update_mutex);
 		if(update_type!=HTML_WIN_UPDATE_NONE) {
-			update_timer->Start(1, true);
+			send_html_event(update_event);
+			pthread_mutex_unlock(&update_mutex);
+			sem_wait(&shown);
 		}
-		pthread_mutex_unlock(&update_mutex);
-		sem_wait(&shown);
+		else
+			pthread_mutex_unlock(&update_mutex);
 	}
 
 	void add_html(const char *buf)