diff -rN -u old-psi2/options/default.xml new-psi2/options/default.xml
--- old-psi2/options/default.xml	2007-01-25 22:54:08.109375000 +0100
+++ new-psi2/options/default.xml	2007-01-25 22:54:43.328125000 +0100
@@ -136,6 +136,11 @@
 				<next-tab type="QKeySequence" comment="Switch to the previous tab">Ctrl+PgUp</next-tab>
 				<previous-tab type="QKeySequence" comment="Switch to the next tab">Ctrl+PgDown</previous-tab>
 				<find type="QKeySequence" comment="Find text">Ctrl+F</find>
+				<find-next type="QVariantList" comment="Find next text occurence">
+					<item type="QKeySequence">F3</item>
+					<item type="QKeySequence">Ctrl+Down</item>
+				</find-next>
+				<find-prev type="QKeySequence" comment="Find previous text occurence" >Ctrl+Up</find-prev>
 				<send type="QVariantList" comment="Sends the message">
 					<item type="QKeySequence">Return</item>
 					<item type="QKeySequence">Enter</item>
diff -rN -u old-psi2/src/chatdlg.cpp new-psi2/src/chatdlg.cpp
--- old-psi2/src/chatdlg.cpp	2007-01-25 22:54:09.796875000 +0100
+++ new-psi2/src/chatdlg.cpp	2007-01-25 22:54:46.031250000 +0100
@@ -72,6 +72,7 @@
 #include "shortcutmanager.h"
 #include "psicontactlist.h"
 #include "accountlabel.h"
+#include "typeaheadfind.h"
 
 #ifdef Q_WS_WIN
 #include <windows.h>
@@ -107,7 +108,8 @@
 	QMenu *pm_settings;
 
 	QToolBar *toolbar;
-	IconAction *act_clear, *act_history, *act_info, *act_pgp, *act_icon, *act_file, *act_compact, *act_voice;
+	TypeAheadFindBar *typeahead;
+	IconAction *act_clear, *act_history, *act_info, *act_pgp, *act_icon, *act_file, *act_compact, *act_voice, *act_find;
 	QAction *act_send, *act_scrollup, *act_scrolldown, *act_close;
 
 	int pending;
@@ -268,11 +270,18 @@
 	// tool area
 	QVBoxLayout *vb3 = new QVBoxLayout(sp_bottom, 0, 4);
 
+	QHBoxLayout *hb3a = new QHBoxLayout(vb3);
+	d->typeahead = new TypeAheadFindBar(d->log, tr("Find toolbar"), 0);
+	hb3a->addWidget( d->typeahead );
+
 	QHBoxLayout *hb3 = new QHBoxLayout(vb3);
 
 	d->act_clear = new IconAction (tr("Clear chat window"), "psi/clearChat", tr("Clear chat window"), 0, this);
 	connect( d->act_clear, SIGNAL( activated() ), SLOT( doClearButton() ) );
 
+	d->act_find = new IconAction(tr("Find"), "psi/search", tr("&Find"), 0, this);
+	connect(d->act_find, SIGNAL(activated()), d->typeahead, SLOT(open()));
+
 	connect(pa->psi()->iconSelectPopup(), SIGNAL(textSelected(QString)), d, SLOT(addEmoticon(QString)));
 	d->act_icon = new IconAction( tr( "Select icon" ), "psi/smile", tr( "Select icon" ), 0, this );
 	d->act_icon->setMenu( pa->psi()->iconSelectPopup() );
@@ -314,6 +323,7 @@
 	d->toolbar = new QToolBar(tr("Chat toolbar"), sp_bottom);
 	d->toolbar->setIconSize(QSize(16,16));
 	d->toolbar->addAction(d->act_clear);
+	d->toolbar->addAction(d->act_find);
 	d->toolbar->addWidget(new StretchWidget(d->toolbar));
 	d->toolbar->addAction(d->act_icon);
 	d->toolbar->addAction(d->act_file);
@@ -417,6 +427,7 @@
 void ChatDlg::setShortcuts()
 {
 	d->act_clear->setShortcuts(ShortcutManager::instance()->shortcuts("chat.clear"));
+	d->act_find->setShortcuts(ShortcutManager::instance()->shortcuts("chat.find"));
 	d->act_info->setShortcuts(ShortcutManager::instance()->shortcuts("common.user-info"));
 	d->act_history->setShortcuts(ShortcutManager::instance()->shortcuts("common.history"));
 	//d->act_send->setShortcuts(ShortcutManager::instance()->shortcuts("chat.send"));
@@ -829,6 +840,7 @@
 
 	setLooks();
 	setShortcuts();
+	d->typeahead->optionsUpdate();
 
 	if(isHidden()) {
 		if(option.delChats == dcClose) {
diff -rN -u old-psi2/src/eventdlg.cpp new-psi2/src/eventdlg.cpp
--- old-psi2/src/eventdlg.cpp	2007-01-25 22:54:10.046875000 +0100
+++ new-psi2/src/eventdlg.cpp	2007-01-25 22:54:46.312500000 +0100
@@ -72,6 +72,7 @@
 #include "httpauthmanager.h"
 #include "psicontactlist.h"
 #include "accountlabel.h"
+#include "typeaheadfind.h"
 #include "xdata_widget.h"
 
 static QString findJid(const QString &s, int x, int *p1, int *p2)
@@ -510,7 +511,7 @@
 	ELineEdit *le_to;
 	QLineEdit *le_from, *le_subj;
 	QLabel *lb_count;
-	IconToolButton *tb_url, *tb_info, *tb_history, *tb_pgp, *tb_icon;
+	IconToolButton *tb_url, *tb_info, *tb_history, *tb_pgp, *tb_icon, *tb_find;
 	IconLabel *lb_pgp;
 	bool enc;
 	int transid;
@@ -518,6 +519,7 @@
 	IconButton *pb_close, *pb_quote, *pb_deny, *pb_send, *pb_reply, *pb_chat, *pb_auth, *pb_http_confirm, *pb_http_deny;
 	IconButton *pb_form_submit, *pb_form_cancel;
 	ChatView *mle;
+	TypeAheadFindBar *typeahead;
 	AttachView *attachView;
 	QTimer *whois;
 	QString lastWhois;
@@ -780,6 +782,12 @@
 	d->lb_count->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
 	d->lb_count->setNum(0);
 	 
+	if(!d->composing) {
+		d->tb_find = new IconToolButton(this);
+		d->tb_find->setPsiIcon(IconsetFactory::iconPtr("psi/search"));
+		d->tb_find->setToolTip(tr("Find"));
+		connect(d->tb_find, SIGNAL(clicked()), this, SLOT(doFind()));
+	}
 
 	if(d->composing) {
 		d->tb_pgp = new IconToolButton(this);
@@ -804,6 +812,8 @@
 	d->tb_history->setToolTip(tr("Message history"));
 
 	QList<IconToolButton*> toolButtons;
+	if (!d->composing)
+		toolButtons << d->tb_find;
 	toolButtons << d->tb_url << d->tb_info << d->tb_history;
    	if (PsiOptions::instance()->getOption("options.pgp.enable").toBool())
 		toolButtons << d->tb_pgp;
@@ -821,6 +831,8 @@
 		hb3->addWidget(l);
 		hb3->addWidget(d->le_subj);
 		hb3->addWidget(d->lb_count);
+		if(!d->composing)
+			hb3->addWidget(d->tb_find);
 		hb3->addWidget(d->tb_icon);
 		hb3->addWidget(d->tb_url);
 		hb3->addWidget(d->tb_info);
@@ -836,6 +848,8 @@
 	} else {
 		d->le_subj->hide();
 		hb2->addWidget(d->lb_count);
+		if(!d->composing)
+			hb3->addWidget(d->tb_find);
 		hb2->addWidget(d->tb_icon);
 		hb2->addWidget(d->tb_url);
 		hb2->addWidget(d->tb_info);
@@ -860,6 +874,14 @@
 		d->mle->setUndoRedoEnabled(false);
 	}
 
+	// typeahead find bar
+	if(!d->composing) {
+		d->typeahead = new TypeAheadFindBar(d->mle, tr("Find toolbar"), 0);
+		vb1->addWidget(d->typeahead);
+	}
+	else
+		d->typeahead = 0;
+
 	// attachment view
 	d->attachView = new AttachView(this);
 	d->attachView->setFixedHeight(80);
@@ -996,6 +1018,8 @@
 	ShortcutManager::connect("common.user-info", this, SLOT(doInfo()));
 	ShortcutManager::connect("common.history", this, SLOT(doHistory()));
 	//ShortcutManager::connect("message.send", this, SLOT(doSend()));
+	if (d->typeahead)
+		ShortcutManager::connect("chat.find", this, SLOT(doFind()));
 }
 
 void EventDlg::setAccount(PsiAccount *pa)
@@ -1377,6 +1401,10 @@
 			setWindowIcon(d->anim->icon());
 	}
 #endif
+
+	// typeahead
+	if (d->typeahead)
+		d->typeahead->optionsUpdate();
 }
 
 QSize EventDlg::defaultSize()
@@ -1680,6 +1708,11 @@
 	d->pa->actionInfo(d->jid);
 }
 
+void EventDlg::doFind()
+{
+	d->typeahead->open();
+}
+
 void EventDlg::closeAfterReply()
 {
 	if(d->nextAmount == 0)
diff -rN -u old-psi2/src/eventdlg.h new-psi2/src/eventdlg.h
--- old-psi2/src/eventdlg.h	2007-01-25 22:54:10.046875000 +0100
+++ new-psi2/src/eventdlg.h	2007-01-25 22:54:46.328125000 +0100
@@ -175,6 +175,7 @@
 	void doHttpDeny();
 	void doInfo();
 	void doHistory();
+	void doFind();
 	void showHideAttachView();
 	void addUrl();
 	void doFormSubmit();
diff -rN -u old-psi2/src/groupchatdlg.cpp new-psi2/src/groupchatdlg.cpp
--- old-psi2/src/groupchatdlg.cpp	2007-01-25 22:54:10.125000000 +0100
+++ new-psi2/src/groupchatdlg.cpp	2007-01-25 22:54:46.890625000 +0100
@@ -73,6 +73,7 @@
 #include "shortcutmanager.h"
 #include "psicontactlist.h"
 #include "accountlabel.h"
+#include "typeaheadfind.h"
 
 #ifdef Q_WS_WIN
 #include <windows.h>
@@ -410,6 +411,7 @@
 	GCUserView *lv_users;
 	QPushButton *pb_topic;
 	QToolBar *toolbar;
+	TypeAheadFindBar *typeahead;
 	IconAction *act_find, *act_clear, *act_icon, *act_configure;
 	QAction *act_send, *act_scrollup, *act_scrolldown, *act_close;
 	QLabel* lb_ident;
@@ -424,9 +426,6 @@
 	QStringList hist;
 	int histAt;
 
-	QPointer<GCFindDlg> findDlg;
-	QString lastSearch;
-
 	QPointer<MUCConfigDlg> configDlg;
 	
 public:
@@ -470,27 +469,6 @@
 		te_log->scrollToBottom();
 	}
 
-public:
-	bool internalFind(QString str, bool startFromBeginning = false)
-	{
-		if (startFromBeginning) {
-			QTextCursor cursor = te_log->textCursor();
-			cursor.movePosition(QTextCursor::Start, QTextCursor::KeepAnchor);
-			cursor.clearSelection();
-			te_log->setTextCursor(cursor);
-		}
-		
-		bool found = te_log->find(str);
-		if(!found) {
-			if (!startFromBeginning)
-				return internalFind(str, true);
-			
-			return false;
-		}
-
-		return true;
-	}
-	
 private:
 	void removeTrackBar(QTextCursor &cursor)
 	{
@@ -779,7 +757,6 @@
 	d->connecting = false;
 
 	d->histAt = 0;
-	d->findDlg = 0;
 	d->configDlg = 0;
 
 	d->state = Private::Connected;
@@ -820,10 +797,6 @@
 	PsiToolTip::install(d->le_topic);
 	hb_top->addWidget(d->le_topic);
 
-	d->act_find = new IconAction(tr("Find"), "psi/search", tr("&Find"), 0, this);
-	connect(d->act_find, SIGNAL(activated()), SLOT(openFind()));
-	d->act_find->addTo( sp_top_top );
-	
 	d->lb_ident = new AccountLabel(d->pa, sp_top_top, true);
 	d->lb_ident->setSizePolicy(QSizePolicy( QSizePolicy::Minimum, QSizePolicy::Minimum ));
 	hb_top->addWidget(d->lb_ident);
@@ -853,10 +826,18 @@
 		dlg_layout->addWidget( sp_bottom );
 	QVBoxLayout *vb_bottom = new QVBoxLayout(sp_bottom, 0, 4);
 
+	// typeahead find bar
+	d->typeahead = new TypeAheadFindBar(d->te_log, tr("Find toolbar"), 0);
+	d->typeahead->displayIconText(true);
+	vb_bottom->addWidget( d->typeahead );
+
 	// toolbar
 	d->act_clear = new IconAction (tr("Clear chat window"), "psi/clearChat", tr("Clear chat window"), 0, this);
 	connect( d->act_clear, SIGNAL( activated() ), SLOT( doClearButton() ) );
-	
+
+	d->act_find = new IconAction(tr("Find"), "psi/search", tr("&Find"), 0, this);
+	connect(d->act_find, SIGNAL(activated()), d->typeahead, SLOT(open()));
+
 	d->act_configure = new IconAction(tr("Configure Room"), "psi/configure-room", tr("&Configure Room"), 0, this);
 	connect(d->act_configure, SIGNAL(activated()), SLOT(configureRoom()));
 
@@ -867,6 +848,7 @@
 	d->toolbar = new QToolBar( tr("Groupchat toolbar"), 0);
 	d->toolbar->setIconSize(QSize(16,16));
 	d->toolbar->addAction(d->act_clear);
+	d->toolbar->addAction(d->act_find);
 	d->toolbar->addAction(d->act_configure);
 	d->toolbar->addWidget(new StretchWidget(d->toolbar));
 	d->toolbar->addAction(d->act_icon);
@@ -1147,17 +1129,6 @@
 		doClear();
 }
 
-void GCMainDlg::openFind()
-{
-	if(d->findDlg)
-		bringToFront(d->findDlg);
-	else {
-		d->findDlg = new GCFindDlg(d->lastSearch, this);
-		connect(d->findDlg, SIGNAL(find(const QString &)), SLOT(doFind(const QString &)));
-		d->findDlg->show();
-	}
-}
-
 void GCMainDlg::configureRoom()
 {
 	if(d->configDlg)
@@ -1170,15 +1141,6 @@
 	}
 }
 
-void GCMainDlg::doFind(const QString &str)
-{
-	d->lastSearch = str;
-	if (d->internalFind(str))
-		d->findDlg->found();
-	else
-		d->findDlg->error(str);
-}
-
 void GCMainDlg::goDisc()
 {
 	if(d->state != Private::Idle) {
@@ -1779,6 +1741,7 @@
 
 	setLooks();
 	setShortcuts();
+	d->typeahead->optionsUpdate();
 
 	// update status icons
 	d->lv_users->updateAll();
diff -rN -u old-psi2/src/groupchatdlg.h new-psi2/src/groupchatdlg.h
--- old-psi2/src/groupchatdlg.h	2007-01-25 22:54:10.125000000 +0100
+++ new-psi2/src/groupchatdlg.h	2007-01-25 22:54:46.984375000 +0100
@@ -150,9 +150,7 @@
 	void scrollDown();
 	void mle_returnPressed();
 	void doTopic();
-	void openFind();
 	void configureRoom();
-	void doFind(const QString &);
 	void flashAnimate();
 	void pa_updatedActivity();
 	void goDisc();
diff -rN -u old-psi2/src/widgets/typeaheadfind.cpp new-psi2/src/widgets/typeaheadfind.cpp
--- old-psi2/src/widgets/typeaheadfind.cpp	1970-01-01 01:00:00.000000000 +0100
+++ new-psi2/src/widgets/typeaheadfind.cpp	2007-01-25 22:54:58.265625000 +0100
@@ -0,0 +1,269 @@
+/*
+ * typeaheadfind.cpp - Typeahead find toolbar
+ * Copyright (C) 2006  Maciej Niedzielski
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#include "typeaheadfind.h"
+
+#include <QAction>
+#include <QLineEdit>
+#include <QCheckBox>
+#include <QLabel>
+#include <QTextEdit>
+
+#include "iconaction.h"
+#include "stretchwidget.h"
+#include "shortcutmanager.h"
+
+/**
+ * \class TypeAheadFindBar
+ * \brief The TypeAheadFindBar class provides a toolbar for typeahead finding.
+ */
+
+class TypeAheadFindBar::Private
+{
+public:
+	// setup search and react to search results
+	void doFind(bool backward = false)
+	{
+		QTextDocument::FindFlags options;
+
+		if (caseSensitive)
+			options |= QTextDocument::FindCaseSensitively;
+
+		if (backward) {
+			options |= QTextDocument::FindBackward;
+
+			// move cursor before currect selection
+			// to prevent finding the same occurence again
+			QTextCursor cursor = te->textCursor();
+			cursor.setPosition(cursor.selectionStart());
+			cursor.movePosition(QTextCursor::Left);
+			te->setTextCursor(cursor);
+		}
+
+		if (find(text, options)) {
+			le_find->setStyleSheet("");
+		}
+		else {
+			le_find->setStyleSheet("QLineEdit { background: #ff6666; color: #ffffff }");
+		}
+	}
+
+	// real search code
+
+	bool find(const QString &str, QTextDocument::FindFlags options, QTextCursor::MoveOperation start = QTextCursor::NoMove)
+	{
+		if (start != QTextCursor::NoMove) {
+			QTextCursor cursor = te->textCursor();
+			cursor.movePosition(start);
+			te->setTextCursor(cursor);
+		}
+
+		bool found = te->find(text, options);
+		if (!found) {
+			if (start == QTextCursor::NoMove)
+				return find(text, options, options & QTextDocument::FindBackward ? QTextCursor::End : QTextCursor::Start);
+
+			return false;
+		}
+
+		return true;
+	}
+
+	QString text;
+	bool caseSensitive;
+
+	QTextEdit *te;
+	QAction *act_close;
+	QLineEdit *le_find;
+	QAction *act_next;
+	QAction *act_prev;
+	QCheckBox *cb_case;
+};
+
+/**
+ * \brief Creates new find toolbar, hidden by default.
+ * \param textedit, QTextEdit that this toolbar will operate on.
+ * \param title, toolbar's title
+ * \param parent, toolbar's parent
+ */
+TypeAheadFindBar::TypeAheadFindBar(QTextEdit *textedit, const QString &title, QWidget *parent)
+: QToolBar(title, parent)
+{
+	d = new Private();
+
+	setIconSize(QSize(16,16));
+	setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+	setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Maximum);
+
+	d->te = textedit;
+	d->caseSensitive = false;
+	d->text = "";
+
+	d->act_close = new IconAction(tr("Close"), "psi/close", "", 0, this);
+	d->act_close->setToolTip(tr("Close"));
+	connect(d->act_close, SIGNAL(activated()), SLOT(close()));
+	addAction(d->act_close);
+
+	addSeparator();
+
+	addWidget(new QLabel("Search: ", this));
+
+	d->le_find = new QLineEdit(this);
+	d->le_find->setMaximumWidth(128);
+	connect(d->le_find, SIGNAL(textEdited(const QString &)), SLOT(textChanged(const QString &)));
+	addWidget(d->le_find);
+
+	d->act_next = new IconAction(tr("Find next"), "psi/arrowDown", "", 0, this);
+	d->act_next->setEnabled(false);
+	connect(d->act_next, SIGNAL(activated()), SLOT(findNext()));
+	addAction(d->act_next);
+
+	d->act_prev = new IconAction(tr("Find previous"), "psi/arrowUp", "", 0, this);
+	d->act_prev->setEnabled(false);
+	connect(d->act_prev, SIGNAL(activated()), SLOT(findPrevious()));
+	addAction(d->act_prev);
+
+	d->cb_case = new QCheckBox("&Case sensitive", this);
+	connect(d->cb_case, SIGNAL(stateChanged(int)), SLOT(caseToggled(int)));
+	addWidget(d->cb_case);
+
+	addWidget(new StretchWidget(this));
+
+	optionsUpdate();
+
+	hide();
+}
+
+/**
+ * \brief Destroys the toolbar.
+ */
+TypeAheadFindBar::~TypeAheadFindBar()
+{
+	delete d;
+	d = 0;
+}
+
+/**
+ * \brief Should be called when application options are changed.
+ * This slot updates toolbar's shortcuts.
+ */
+void TypeAheadFindBar::optionsUpdate()
+{
+	d->act_close->setShortcuts(ShortcutManager::instance()->shortcuts("common.close"));
+	d->act_next->setShortcuts(ShortcutManager::instance()->shortcuts("chat.find-next"));
+	d->act_prev->setShortcuts(ShortcutManager::instance()->shortcuts("chat.find-prev"));
+}
+
+/**
+ * \brief Opens (shows) the toolbar.
+ */
+void TypeAheadFindBar::open()
+{
+	show();
+	d->le_find->setFocus();
+	d->le_find->selectAll();
+	emit visibilityChanged(true);
+}
+
+/**
+ * \brief Closes (hides) the toolbar.
+ */
+void TypeAheadFindBar::close()
+{
+	hide();
+	emit visibilityChanged(false);
+}
+
+/**
+ * \brief Switched between visible and hidden state.
+ */
+void TypeAheadFindBar::toggleVisibility()
+{
+	if (isVisible())
+		hide();
+	else
+		show();
+}
+
+/**
+ * \brief Enable icons text if \a yes is true.
+ */
+void TypeAheadFindBar::displayIconText(bool yes)
+{
+	if (yes) {
+		d->act_next->setIconText(tr("Find &next"));
+		d->act_prev->setIconText(tr("Find &previous"));
+	}
+	else {
+		d->act_next->setIconText("");
+		d->act_prev->setIconText("");
+	}
+}
+
+/**
+ * \brief Private slot activated when find text chagnes.
+ */
+void TypeAheadFindBar::textChanged(const QString &str)
+{
+	QTextCursor cursor = d->te->textCursor();
+	
+	if (str.isEmpty()) {
+		d->act_next->setEnabled(false);
+		d->act_prev->setEnabled(false);
+		d->le_find->setStyleSheet("");
+		cursor.clearSelection();
+		d->te->setTextCursor(cursor);
+	}
+	else {
+		d->act_next->setEnabled(true);
+		d->act_prev->setEnabled(true);
+
+		// don't jump to next word occurence after appending new charater
+		cursor.setPosition(cursor.selectionStart());
+		d->te->setTextCursor(cursor);
+
+		d->text = str;
+		d->doFind();
+	}
+}
+
+/**
+ * \brief Private slot activated when find-next is requested.
+ */
+void TypeAheadFindBar::findNext()
+{
+	d->doFind();
+}
+
+/**
+ * \brief Private slot activated when find-prev is requested.
+ */
+void TypeAheadFindBar::findPrevious()
+{
+	d->doFind(true);
+}
+
+/**
+ * \brief Private slot activated when case-sensitive box is toggled.
+ */
+void TypeAheadFindBar::caseToggled(int state)
+{
+	d->caseSensitive = (state == QCheckBox::On);
+}
diff -rN -u old-psi2/src/widgets/typeaheadfind.h new-psi2/src/widgets/typeaheadfind.h
--- old-psi2/src/widgets/typeaheadfind.h	1970-01-01 01:00:00.000000000 +0100
+++ new-psi2/src/widgets/typeaheadfind.h	2007-01-25 22:54:58.218750000 +0100
@@ -0,0 +1,57 @@
+/*
+ * typeaheadfind.h - Typeahead find toolbar
+ * Copyright (C) 2006  Maciej Niedzielski
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#ifndef TYPEAHEADFIND_H
+#define TYPEAHEADFIND_H
+
+#include <QToolBar>
+
+class QTextEdit;
+class QString;
+
+class TypeAheadFindBar : public QToolBar
+{
+	Q_OBJECT
+public:
+	TypeAheadFindBar(QTextEdit *textedit, const QString &title, QWidget *parent = 0);
+	~TypeAheadFindBar();
+
+public slots:
+	void open();
+	void close();
+	void toggleVisibility();
+	void optionsUpdate();
+	void displayIconText(bool yes);
+
+signals:
+	void visibilityChanged(bool visible);
+
+private slots:
+	void textChanged(const QString &);
+	void findNext();
+	void findPrevious();
+	void caseToggled(int);
+
+private:
+	class Private;
+	Private *d;
+};
+
+#endif
diff -rN -u old-psi2/src/widgets/widgets.pri new-psi2/src/widgets/widgets.pri
--- old-psi2/src/widgets/widgets.pri	2007-01-25 22:54:23.203125000 +0100
+++ new-psi2/src/widgets/widgets.pri	2007-01-25 22:54:59.640625000 +0100
@@ -14,7 +14,8 @@
 	$$PWD/psirichtext.cpp \
 	$$PWD/psitooltip.cpp \
 	$$PWD/psitabwidget.cpp \
-	$$PWD/psitabbar.cpp
+	$$PWD/psitabbar.cpp \
+	$$PWD/typeaheadfind.cpp
 
 HEADERS += \
 	$$PWD/stretchwidget.h \
@@ -36,7 +37,8 @@
 	$$PWD/psirichtext.h \
 	$$PWD/psitooltip.h \
 	$$PWD/psitabwidget.h \
-	$$PWD/psitabbar.h
+	$$PWD/psitabbar.h \
+	$$PWD/typeaheadfind.h
 
 # to remove dependency on iconset and stuff
 #DEFINES += WIDGET_PLUGIN

