diff --git a/data/glade/plugins_window.glade b/data/glade/plugins_window.glade
new file mode 100644
index 0000000000000000000000000000000000000000..d8996b53e09599ee28da436fc3bd6da02b65a9a3
--- /dev/null
+++ b/data/glade/plugins_window.glade
@@ -0,0 +1,602 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
+<!--Generated with glade3 3.4.5 on Sat Jun  7 19:16:21 2008 -->
+<glade-interface>
+  <widget class="GtkWindow" id="plugins_window">
+    <property name="width_request">650</property>
+    <property name="height_request">500</property>
+    <property name="border_width">6</property>
+    <property name="title" translatable="yes">Plugins</property>
+    <property name="default_width">650</property>
+    <property name="default_height">500</property>
+    <signal name="destroy" handler="on_plugins_window_destroy"/>
+    <child>
+      <widget class="GtkVBox" id="vbox1">
+        <property name="visible">True</property>
+        <property name="spacing">6</property>
+        <child>
+          <widget class="GtkNotebook" id="plugins_notebook">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <child>
+              <widget class="GtkHPaned" id="hpaned1">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="position">250</property>
+                <property name="position_set">True</property>
+                <child>
+                  <widget class="GtkScrolledWindow" id="scrolledwindow1">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="border_width">6</property>
+                    <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                    <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                    <child>
+                      <widget class="GtkTreeView" id="installed_plugins_treeview">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="headers_clickable">True</property>
+                      </widget>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="resize">False</property>
+                    <property name="shrink">True</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkVBox" id="vbox2">
+                    <property name="visible">True</property>
+                    <property name="border_width">6</property>
+                    <property name="spacing">6</property>
+                    <child>
+                      <widget class="GtkHBox" id="hbox4">
+                        <property name="visible">True</property>
+                        <property name="spacing">6</property>
+                        <child>
+                          <widget class="GtkLabel" id="plugin_name_label">
+                            <property name="visible">True</property>
+                            <property name="xalign">0</property>
+                            <property name="label" translatable="yes">&lt;empty&gt;</property>
+                            <property name="use_markup">True</property>
+                            <property name="wrap">True</property>
+                            <property name="selectable">True</property>
+                          </widget>
+                        </child>
+                        <child>
+                          <widget class="GtkAlignment" id="alignment1">
+                            <property name="visible">True</property>
+                            <child>
+                              <placeholder/>
+                            </child>
+                          </widget>
+                          <packing>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="GtkHBox" id="hbox1">
+                        <property name="visible">True</property>
+                        <property name="spacing">6</property>
+                        <child>
+                          <widget class="GtkLabel" id="label5">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Version:</property>
+                          </widget>
+                          <packing>
+                            <property name="expand">False</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <widget class="GtkLabel" id="plugin_version_label">
+                            <property name="visible">True</property>
+                            <property name="xalign">0</property>
+                            <property name="label" translatable="yes">&lt;empty&gt;</property>
+                            <property name="selectable">True</property>
+                          </widget>
+                          <packing>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="GtkHBox" id="hbox2">
+                        <property name="visible">True</property>
+                        <property name="spacing">6</property>
+                        <child>
+                          <widget class="GtkLabel" id="label4">
+                            <property name="visible">True</property>
+                            <property name="yalign">0</property>
+                            <property name="label" translatable="yes">Authors:</property>
+                          </widget>
+                          <packing>
+                            <property name="expand">False</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <widget class="GtkLabel" id="plugin_authors_label">
+                            <property name="visible">True</property>
+                            <property name="xalign">0</property>
+                            <property name="yalign">0</property>
+                            <property name="label" translatable="yes">&lt;empty&gt;</property>
+                            <property name="wrap_mode">PANGO_WRAP_WORD_CHAR</property>
+                            <property name="selectable">True</property>
+                            <property name="ellipsize">PANGO_ELLIPSIZE_END</property>
+                          </widget>
+                          <packing>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">2</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="GtkHBox" id="hbox3">
+                        <property name="visible">True</property>
+                        <child>
+                          <widget class="GtkLabel" id="label6">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Homepage:</property>
+                          </widget>
+                          <packing>
+                            <property name="expand">False</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <widget class="GtkLinkButton" id="plugin_homepage_linkbutton">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">True</property>
+                            <property name="label" translatable="yes">homepage url</property>
+                            <property name="relief">GTK_RELIEF_NONE</property>
+                            <property name="focus_on_click">False</property>
+                            <property name="xalign">0</property>
+                            <property name="response_id">0</property>
+                            <property name="uri"></property>
+                          </widget>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">3</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="GtkVBox" id="vbox3">
+                        <property name="visible">True</property>
+                        <child>
+                          <widget class="GtkHBox" id="hbox5">
+                            <property name="visible">True</property>
+                            <child>
+                              <widget class="GtkLabel" id="label7">
+                                <property name="visible">True</property>
+                                <property name="label" translatable="yes">Descrition:</property>
+                              </widget>
+                              <packing>
+                                <property name="expand">False</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <widget class="GtkAlignment" id="alignment2">
+                                <property name="visible">True</property>
+                                <child>
+                                  <placeholder/>
+                                </child>
+                              </widget>
+                              <packing>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </widget>
+                          <packing>
+                            <property name="expand">False</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <widget class="GtkTextView" id="plugin_description_textview">
+                            <property name="visible">True</property>
+                            <property name="sensitive">False</property>
+                            <property name="can_focus">True</property>
+                            <property name="pixels_above_lines">6</property>
+                            <property name="editable">False</property>
+                            <property name="wrap_mode">GTK_WRAP_WORD</property>
+                            <property name="left_margin">6</property>
+                            <property name="right_margin">6</property>
+                            <property name="indent">1</property>
+                            <property name="text" comments="This text is never displayed. You don't have to translate it.">Plug-in decription should be displayed here. This text will be erased during PluginsWindow initialization.</property>
+                          </widget>
+                          <packing>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                      </widget>
+                      <packing>
+                        <property name="position">4</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="GtkHButtonBox" id="hbuttonbox2">
+                        <property name="visible">True</property>
+                        <property name="spacing">5</property>
+                        <property name="layout_style">GTK_BUTTONBOX_END</property>
+                        <child>
+                          <widget class="GtkButton" id="uninstall_plugin_button">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">True</property>
+                            <property name="response_id">0</property>
+                            <child>
+                              <widget class="GtkHBox" id="hbox11">
+                                <property name="visible">True</property>
+                                <child>
+                                  <widget class="GtkImage" id="image1">
+                                    <property name="visible">True</property>
+                                    <property name="stock">gtk-cancel</property>
+                                  </widget>
+                                </child>
+                                <child>
+                                  <widget class="GtkLabel" id="uninstall_plugin_button_label">
+                                    <property name="visible">True</property>
+                                    <property name="label" translatable="yes">Uninstall</property>
+                                  </widget>
+                                  <packing>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
+                              </widget>
+                            </child>
+                          </widget>
+                        </child>
+                        <child>
+                          <widget class="GtkButton" id="configure_plugin_button">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">True</property>
+                            <property name="response_id">0</property>
+                            <child>
+                              <widget class="GtkHBox" id="hbox12">
+                                <property name="visible">True</property>
+                                <child>
+                                  <widget class="GtkImage" id="image2">
+                                    <property name="visible">True</property>
+                                    <property name="stock">gtk-preferences</property>
+                                  </widget>
+                                </child>
+                                <child>
+                                  <widget class="GtkLabel" id="configure_plugin_button_label">
+                                    <property name="visible">True</property>
+                                    <property name="label" translatable="yes">Configure</property>
+                                  </widget>
+                                  <packing>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
+                              </widget>
+                            </child>
+                          </widget>
+                          <packing>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">5</property>
+                      </packing>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="resize">True</property>
+                    <property name="shrink">True</property>
+                  </packing>
+                </child>
+              </widget>
+            </child>
+            <child>
+              <widget class="GtkLabel" id="label1">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">Installed</property>
+              </widget>
+              <packing>
+                <property name="type">tab</property>
+                <property name="tab_fill">False</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkHPaned" id="hpaned2">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <child>
+                  <widget class="GtkScrolledWindow" id="scrolledwindow2">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                    <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                    <child>
+                      <widget class="GtkTreeView" id="treeview2">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="headers_clickable">True</property>
+                      </widget>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="resize">False</property>
+                    <property name="shrink">True</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkVBox" id="vbox4">
+                    <property name="visible">True</property>
+                    <child>
+                      <widget class="GtkHBox" id="hbox6">
+                        <property name="visible">True</property>
+                        <child>
+                          <widget class="GtkLabel" id="plugin_name_label1">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">&lt;empty&gt;</property>
+                            <property name="selectable">True</property>
+                          </widget>
+                          <packing>
+                            <property name="expand">False</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <widget class="GtkAlignment" id="alignment3">
+                            <property name="visible">True</property>
+                            <child>
+                              <placeholder/>
+                            </child>
+                          </widget>
+                          <packing>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="GtkHBox" id="hbox7">
+                        <property name="visible">True</property>
+                        <child>
+                          <widget class="GtkLabel" id="label3">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Version:</property>
+                          </widget>
+                          <packing>
+                            <property name="expand">False</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <widget class="GtkLabel" id="plugin_version_label1">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">&lt;empty&gt;</property>
+                            <property name="selectable">True</property>
+                          </widget>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="GtkHBox" id="hbox8">
+                        <property name="visible">True</property>
+                        <child>
+                          <widget class="GtkLabel" id="label8">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Authors:</property>
+                          </widget>
+                          <packing>
+                            <property name="expand">False</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <widget class="GtkLabel" id="plugin_authors_label1">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">&lt;empty&gt;</property>
+                            <property name="selectable">True</property>
+                          </widget>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">2</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="GtkHBox" id="hbox9">
+                        <property name="visible">True</property>
+                        <child>
+                          <widget class="GtkLabel" id="label9">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Homepage:</property>
+                          </widget>
+                          <packing>
+                            <property name="expand">False</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <widget class="GtkLinkButton" id="plugin_homepage_linkbutton1">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">True</property>
+                            <property name="label" translatable="yes">button</property>
+                            <property name="relief">GTK_RELIEF_NONE</property>
+                            <property name="focus_on_click">False</property>
+                            <property name="response_id">0</property>
+                            <property name="uri"></property>
+                          </widget>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">3</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="GtkVBox" id="vbox5">
+                        <property name="visible">True</property>
+                        <child>
+                          <widget class="GtkHBox" id="hbox10">
+                            <property name="visible">True</property>
+                            <child>
+                              <widget class="GtkLabel" id="label10">
+                                <property name="visible">True</property>
+                                <property name="label" translatable="yes">Descrition:</property>
+                              </widget>
+                              <packing>
+                                <property name="expand">False</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <widget class="GtkAlignment" id="alignment4">
+                                <property name="visible">True</property>
+                                <child>
+                                  <placeholder/>
+                                </child>
+                              </widget>
+                              <packing>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </widget>
+                          <packing>
+                            <property name="expand">False</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <widget class="GtkTextView" id="plugin_description_textview1">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                          </widget>
+                          <packing>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                      </widget>
+                      <packing>
+                        <property name="position">4</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="GtkHButtonBox" id="hbuttonbox3">
+                        <property name="visible">True</property>
+                        <property name="layout_style">GTK_BUTTONBOX_END</property>
+                        <child>
+                          <widget class="GtkButton" id="uninstall_plugin_button1">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">True</property>
+                            <property name="label" translatable="yes">button</property>
+                            <property name="response_id">0</property>
+                          </widget>
+                        </child>
+                        <child>
+                          <widget class="GtkButton" id="configure_plugin_button1">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">True</property>
+                            <property name="label" translatable="yes">button</property>
+                            <property name="response_id">0</property>
+                          </widget>
+                          <packing>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">5</property>
+                      </packing>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="resize">True</property>
+                    <property name="shrink">True</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkLabel" id="label2">
+                <property name="label" translatable="yes">Available</property>
+              </widget>
+              <packing>
+                <property name="type">tab</property>
+                <property name="position">1</property>
+                <property name="tab_fill">False</property>
+              </packing>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+              <packing>
+                <property name="type">tab</property>
+              </packing>
+            </child>
+          </widget>
+        </child>
+        <child>
+          <widget class="GtkHButtonBox" id="hbuttonbox1">
+            <property name="visible">True</property>
+            <property name="spacing">15</property>
+            <property name="layout_style">GTK_BUTTONBOX_END</property>
+            <child>
+              <widget class="GtkButton" id="close_button">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="label" translatable="yes">gtk-close</property>
+                <property name="use_stock">True</property>
+                <property name="response_id">0</property>
+                <signal name="clicked" handler="on_close_button_clicked"/>
+              </widget>
+            </child>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+  </widget>
+</glade-interface>
diff --git a/data/glade/roster_window.glade b/data/glade/roster_window.glade
index c480f6879a63d5c3c139422943c575b3662b212f..86ca8f2d10b28cf62f3277f93fda4592e4abf286 100644
--- a/data/glade/roster_window.glade
+++ b/data/glade/roster_window.glade
@@ -193,6 +193,21 @@
                         </child>
                       </widget>
                     </child>
+                    <child>
+                      <widget class="GtkImageMenuItem" id="plugins_menuitem">
+                        <property name="visible">True</property>
+                        <property name="label" translatable="yes">P_lugins</property>
+                        <property name="use_underline">True</property>
+                        <signal name="activate" handler="on_plugins_menuitem_activate"/>
+                        <child internal-child="image">
+                          <widget class="GtkImage" id="menu-item-image16">
+                            <property name="visible">True</property>
+                            <property name="stock">gtk-disconnect</property>
+                            <property name="icon_size">1</property>
+                          </widget>
+                        </child>
+                      </widget>
+                    </child>
                   </widget>
                 </child>
               </widget>
diff --git a/launch.sh b/launch.sh
index cfaf9cd68acc9ab31eca58e886d54b1719c60049..d816e833c482f12fe7a7c5fbc3867682b005b2e0 100755
--- a/launch.sh
+++ b/launch.sh
@@ -15,4 +15,4 @@ if [ "x${OS}" == "xDarwin" ]; then
 fi
 
 cd ${BASE}/src
-exec -a gajim python -t gajim.py $@
+exec -a gajim python2.5 -t gajim.py $@
diff --git a/plugins/length_notifier.py b/plugins/length_notifier.py
index af85ded5f3e0d38e59a7351c66ef51f6418452af..7c9f2422a7fa00226d7846d968aa7bc230b22f3d 100644
--- a/plugins/length_notifier.py
+++ b/plugins/length_notifier.py
@@ -32,12 +32,12 @@ from plugins import GajimPlugin
 from plugins.helpers import log, log_calls
 
 class LengthNotifierPlugin(GajimPlugin):
-	name = 'Message Length Notifier'
-	short_name = 'length_notifier'
-	version = '0.1'
-	description = '''Highlights message entry field in chat window when given 
-length of message is exceeded.'''
-	authors = ['Mateusz Biliński <mateusz@bilinski.it>']
+	name = u'Message Length Notifier'
+	short_name = u'length_notifier'
+	version = u'0.1'
+	description = u'''Highlights message entry field in chat window when given length of message is exceeded.'''
+	authors = [u'Mateusz Biliński <mateusz@bilinski.it>']
+	homepage = u'http://blog.bilinski.it'
 
 	@log_calls('LengthNotifierPlugin')
 	def __init__(self):
diff --git a/src/gajim.py b/src/gajim.py
index 19c98d5cd225bdb978fad2129514e9224b3de5ac..69d64e0c41f8d9714b054ebe43bdcaeec13ee690 100755
--- a/src/gajim.py
+++ b/src/gajim.py
@@ -26,6 +26,8 @@
 ##
 
 import os
+import pycallgraph
+
 
 if os.name == 'nt':
 	import warnings
@@ -602,6 +604,8 @@ def on_exit():
 	if sys.platform == 'darwin':
 		import osx
 		osx.shutdown()
+	
+	#pycallgraph.make_dot_graph('common.xmpp-only.dot', format='dot')
 
 import atexit
 atexit.register(on_exit)
@@ -3231,6 +3235,9 @@ class Interface:
 		gajim.ipython_window = window
 
 	def __init__(self):
+		#filter_func = pycallgraph.GlobbingFilter(include=['common.xmpp.*'])
+		#pycallgraph.start_trace(filter_func=filter_func)
+		
 		gajim.interface = self
 		# This is the manager and factory of message windows set by the module
 		self.msg_win_mgr = None
diff --git a/src/plugins/gui.py b/src/plugins/gui.py
new file mode 100644
index 0000000000000000000000000000000000000000..c4628958bedff8c93540cf60aace26ffcd53ee11
--- /dev/null
+++ b/src/plugins/gui.py
@@ -0,0 +1,166 @@
+# -*- coding: utf-8 -*-
+
+## This file is part of Gajim.
+##
+## Gajim 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; version 3 only.
+##
+## Gajim 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 Gajim.  If not, see <http://www.gnu.org/licenses/>.
+##
+
+'''
+GUI classes related to plug-in management.
+
+:author: Mateusz Biliński <mateusz@bilinski.it>
+:since: 06/06/2008
+:copyright: Copyright (2008) Mateusz Biliński <mateusz@bilinski.it>
+:license: GPL
+'''
+
+__all__ = ['PluginsWindow']
+
+import pango
+import gtk, gobject
+
+import gtkgui_helpers
+from common import gajim
+
+from plugins.helpers import log_calls, log
+
+class PluginsWindow(object):
+	'''Class for Plugins window'''
+
+	@log_calls('PluginsWindow')
+	def __init__(self):
+		'''Initialize Plugins window'''
+		self.xml = gtkgui_helpers.get_glade('plugins_window.glade')
+		self.window = self.xml.get_widget('plugins_window')
+		self.window.set_transient_for(gajim.interface.roster.window)
+		
+		widgets_to_extract = ('plugins_notebook',
+							 'plugin_name_label',
+							 'plugin_version_label',
+							 'plugin_authors_label',
+							 'plugin_homepage_linkbutton',
+							 'plugin_description_textview',
+							 'uninstall_plugin_button',
+							 'configure_plugin_button',
+							 'installed_plugins_treeview')
+		
+		for widget_name in widgets_to_extract:
+			setattr(self, widget_name, self.xml.get_widget(widget_name))
+
+		attr_list = pango.AttrList()
+		attr_list.insert(pango.AttrWeight(pango.WEIGHT_BOLD, 0, -1))
+		self.plugin_name_label.set_attributes(attr_list)
+		
+		self.installed_plugins_model = gtk.ListStore(gobject.TYPE_PYOBJECT,
+													 gobject.TYPE_STRING, 
+													 gobject.TYPE_BOOLEAN)
+		self.installed_plugins_treeview.set_model(self.installed_plugins_model)
+		
+		renderer = gtk.CellRendererText()
+		col = gtk.TreeViewColumn(_('Plugin'), renderer, text=1)
+		self.installed_plugins_treeview.append_column(col)
+		
+		renderer = gtk.CellRendererToggle()
+		renderer.set_property('activatable', True)
+		renderer.connect('toggled', self.installed_plugins_toggled_cb)
+		col = gtk.TreeViewColumn(_('Active'), renderer, active=2)
+		self.installed_plugins_treeview.append_column(col)
+		
+		# connect signal for selection change
+		selection = self.installed_plugins_treeview.get_selection()
+		selection.connect('changed',
+						  self.installed_plugins_treeview_selection_changed)
+		selection.set_mode(gtk.SELECTION_SINGLE)
+		
+		self._clear_installed_plugin_info()
+		
+		self.fill_installed_plugins_model()
+		
+		self.xml.signal_autoconnect(self)
+
+		self.plugins_notebook.set_current_page(0)
+		
+		self.window.show_all()
+		gtkgui_helpers.possibly_move_window_in_current_desktop(self.window)
+	
+	@log_calls('PluginsWindow')
+	def installed_plugins_treeview_selection_changed(self, treeview_selection):
+		model, iter = treeview_selection.get_selected()
+		if iter:
+			plugin = model.get_value(iter, 0)
+			plugin_name = model.get_value(iter, 1)
+			is_active = model.get_value(iter, 2)
+			
+			self._display_installed_plugin_info(plugin)
+		else:
+			self._clear_installed_plugin_info()
+		
+	def _display_installed_plugin_info(self, plugin):
+		self.plugin_name_label.set_text(plugin.name)
+		self.plugin_version_label.set_text(plugin.version)
+		self.plugin_authors_label.set_text(", ".join(plugin.authors))
+		self.plugin_homepage_linkbutton.set_uri(plugin.homepage)
+		self.plugin_homepage_linkbutton.set_label(plugin.homepage)
+		self.plugin_homepage_linkbutton.set_property('sensitive', True)
+		
+		desc_textbuffer = self.plugin_description_textview.get_buffer()
+		desc_textbuffer.set_text(plugin.description)
+		self.plugin_description_textview.set_property('sensitive', True)
+		self.uninstall_plugin_button.set_property('sensitive', True)
+		self.configure_plugin_button.set_property('sensitive', True)
+		
+	def _clear_installed_plugin_info(self):
+		self.plugin_name_label.set_text('')
+		self.plugin_version_label.set_text('')
+		self.plugin_authors_label.set_text('')
+		self.plugin_homepage_linkbutton.set_uri('')
+		self.plugin_homepage_linkbutton.set_label('')
+		self.plugin_homepage_linkbutton.set_property('sensitive', False)
+		
+		desc_textbuffer = self.plugin_description_textview.get_buffer()
+		desc_textbuffer.set_text('')
+		self.plugin_description_textview.set_property('sensitive', False)
+		self.uninstall_plugin_button.set_property('sensitive', False)
+		self.configure_plugin_button.set_property('sensitive', False)
+	
+	@log_calls('PluginsWindow')
+	def fill_installed_plugins_model(self):
+		pm = gajim.plugin_manager
+		self.installed_plugins_model.clear()
+		self.installed_plugins_model.set_sort_column_id(0, gtk.SORT_ASCENDING)
+		
+		for plugin_class in pm.plugins:
+			self.installed_plugins_model.append([plugin_class, 
+												 plugin_class.name, 
+												 plugin_class._active])
+		
+	@log_calls('PluginsWindow')
+	def installed_plugins_toggled_cb(self, cell, path):
+		is_active = self.installed_plugins_model[path][2]
+		plugin_class = self.installed_plugins_model[path][0]
+
+		if is_active:
+			gajim.plugin_manager.deactivate_plugin(plugin_class._instance)
+		else:
+			gajim.plugin_manager.activate_plugin(plugin_class)
+		
+		self.installed_plugins_model[path][2] = not is_active
+		
+	@log_calls('PluginsWindow')
+	def on_plugins_window_destroy(self, widget):
+		'''Close window'''
+		del gajim.interface.instances['plugins']
+
+	@log_calls('PluginsWindow')
+	def on_close_button_clicked(self, widget):
+		self.window.destroy()
\ No newline at end of file
diff --git a/src/plugins/plugin.py b/src/plugins/plugin.py
index c8bb95af9a259fc11a8069ef0e863ba3abe1235b..fd49c6a443968b007589e2ce911b67a6b061a61c 100644
--- a/src/plugins/plugin.py
+++ b/src/plugins/plugin.py
@@ -30,7 +30,7 @@ class GajimPlugin(object):
 	'''
 	Base class for implementing Gajim plugins.
 	'''
-	name = ''
+	name = u''
 	'''
 	Name of plugin.
 	
@@ -38,7 +38,7 @@ class GajimPlugin(object):
 	
 	:type: unicode
 	'''
-	short_name = ''
+	short_name = u''
 	'''
 	Short name of plugin.
 	
@@ -49,7 +49,7 @@ class GajimPlugin(object):
 	:todo: decide whether we really need this one, because class name (with
 		module name) can act as such short name		
 	'''
-	version = ''
+	version = u''
 	'''
 	Version of plugin.
 	
@@ -61,7 +61,7 @@ class GajimPlugin(object):
 		same plugin class but with different version and we want only the newest
 		one to be active - is such policy good?
 	'''
-	description = ''
+	description = u''
 	'''
 	Plugin description.
 	
@@ -78,6 +78,15 @@ class GajimPlugin(object):
 	:todo: should we decide on any particular format of author strings?
 		Especially: should we force format of giving author's e-mail?
 	'''
+	homepage = u''
+	'''
+	URL to plug-in's homepage.
+	
+	:type: unicode
+	
+	:todo: should we check whether provided string is valid URI? (Maybe
+	using 'property')
+	'''
 	gui_extension_points = {}
 	'''
 	Extension points that plugin wants to connect with.
diff --git a/src/plugins/pluginmanager.py b/src/plugins/pluginmanager.py
index b9e113793267298232b397371ffaef2f67960220..359ec3805ebc65d4479c33fbbe1c388e4afcbfed 100644
--- a/src/plugins/pluginmanager.py
+++ b/src/plugins/pluginmanager.py
@@ -94,7 +94,7 @@ class PluginManager(object):
 		'''
 
 		for path in gajim.PLUGINS_DIRS:
-			self.plugins.extend(PluginManager.scan_dir_for_plugins(path))
+			self._add_plugins(PluginManager.scan_dir_for_plugins(path))
 
 		log.debug('plugins: %s'%(self.plugins))
 
@@ -102,6 +102,22 @@ class PluginManager(object):
 
 		log.debug('active: %s'%(self.active_plugins))
 
+		
+	@log_calls('PluginManager')
+	def _add_plugin(self, plugin_class):
+		'''
+		:todo: what about adding plug-ins that are already added? Module reload
+		and adding class from reloaded module or ignoring adding plug-in?
+		'''
+		plugin_class._active = False
+		plugin_class._instance = None
+		self.plugins.append(plugin_class)
+	
+	@log_calls('PluginManager')
+	def _add_plugins(self, plugin_classes):
+		for plugin_class in plugin_classes:
+			self._add_plugin(plugin_class)
+		
 	@log_calls('PluginManager')
 	def gui_extension_point(self, gui_extpoint_name, *args):
 		'''
@@ -124,7 +140,6 @@ class PluginManager(object):
 			call 'self._deactivate_plugin()' or sth similar.
 			Looking closer - we only rewrite tuples here. Real check should be
 			made in method that invokes gui_extpoints handlers.
-
 		'''
 
 		self._add_gui_extension_point_call_to_list(gui_extpoint_name, *args)
@@ -141,13 +156,13 @@ class PluginManager(object):
 				handlers[0](*args)
 
 	@log_calls('PluginManager')
-	def activate_plugin(self, plugin):
+	def activate_plugin(self, plugin_class):
 		'''
 		:param plugin: plugin to be activated
 		:type plugin: class object of `GajimPlugin` subclass
 		'''
 		
-		plugin_object = plugin()
+		plugin_object = plugin_class()
 
 		success = True
 
@@ -156,6 +171,8 @@ class PluginManager(object):
 
 		if success:
 			self.active_plugins.append(plugin_object)
+			plugin_class._instance = plugin_object
+			plugin_class._active = True
 
 		return success
 	
@@ -165,8 +182,9 @@ class PluginManager(object):
 		# for each handled GUI extension point)
 		for gui_extpoint_name, gui_extpoint_handlers in \
 				plugin_object.gui_extension_points.iteritems():
-			for gui_extension_point_args in self.gui_extension_points[gui_extpoint_name]:
-				gui_extpoint_handlers[1](*gui_extension_point_args)
+			if gui_extpoint_name in self.gui_extension_points:
+				for gui_extension_point_args in self.gui_extension_points[gui_extpoint_name]:
+					gui_extpoint_handlers[1](*gui_extension_point_args)
 				
 		# remove GUI extension points handlers (provided by plug-in) from
 		# handlers list
@@ -176,6 +194,8 @@ class PluginManager(object):
 			
 		# removing plug-in from active plug-ins list
 		self.active_plugins.remove(plugin_object)
+		plugin_object.__class__._active = False
+		del plugin_object
 		
 	def deactivate_all_plugins(self):
 		for plugin_object in self.active_plugins:
diff --git a/src/roster_window.py b/src/roster_window.py
index 9af3d59b626d83336616434adcad35b57490519a..76b86c81abb51caab73e32addda6f4db3bba2ae8 100644
--- a/src/roster_window.py
+++ b/src/roster_window.py
@@ -44,6 +44,8 @@ import message_control
 import adhoc_commands
 import notify
 import features_window
+import plugins
+import plugins.gui
 
 from common import gajim
 from common import helpers
@@ -3129,6 +3131,12 @@ class RosterWindow:
 			gajim.interface.instances['preferences'].window.present()
 		else:
 			gajim.interface.instances['preferences'] = config.PreferencesWindow()
+			
+	def on_plugins_menuitem_activate(self, widget):
+		if gajim.interface.instances.has_key('plugins'):
+			gajim.interface.instances['plugins'].window.present()
+		else:
+			gajim.interface.instances['plugins'] = plugins.gui.PluginsWindow()
 
 	def on_publish_tune_checkbutton_toggled(self, widget, account):
 		if widget.get_active():