From 80ea4ea70f95f0170083fff00ab4480fa62e2cd9 Mon Sep 17 00:00:00 2001
From: guinux <nuxgui@gmail.com>
Date: Sat, 9 Sep 2017 10:23:59 +0200
Subject: [PATCH] add appstream support and redesign ui

---
 data/applications/pamac-manager.desktop |    3 +-
 data/applications/pamac-updater.desktop |    3 +-
 po/pamac.pot                            |   86 +-
 po/pot_head                             |    6 +-
 resources/choose_ignorepkgs_dialog.ui   |    2 +-
 resources/choose_provider_dialog.ui     |    2 +-
 resources/history_dialog.ui             |    2 +-
 resources/manager_window.ui             | 1011 ++++++-----
 resources/package-generic.png           |  Bin 0 -> 4206 bytes
 resources/pamac.manager.gresource.xml   |    1 +
 resources/preferences_dialog.ui         |   95 +-
 resources/progress_box.ui               |    2 +-
 resources/progress_dialog.ui            |    2 +-
 resources/transaction_sum_dialog.ui     |    2 +-
 src/Makefile                            |    2 +
 src/manager.vala                        |    9 +-
 src/manager_window.vala                 | 1104 +++++++-----
 src/package.vala                        |   12 +-
 src/preferences_dialog.vala             |   11 +-
 src/system_daemon.vala                  |    8 +-
 src/transaction.vala                    |   19 +-
 src/user_daemon.vala                    |  306 +++-
 vapi/appstream-glib.vapi                | 2077 +++++++++++++++++++++++
 23 files changed, 3868 insertions(+), 897 deletions(-)
 create mode 100644 resources/package-generic.png
 create mode 100644 vapi/appstream-glib.vapi

diff --git a/data/applications/pamac-manager.desktop b/data/applications/pamac-manager.desktop
index 1df7512e..0d963aba 100644
--- a/data/applications/pamac-manager.desktop
+++ b/data/applications/pamac-manager.desktop
@@ -134,6 +134,5 @@ Icon=system-software-install
 Exec=pamac-manager
 Terminal=false
 Type=Application
-Categories=GNOME;GTK;System;
-#NotShowIn=KDE;
+Categories=GNOME;GTK;System;Settings;X-XFCE-SettingsDialog;X-XFCE-SystemSettings;
 StartupNotify=true
diff --git a/data/applications/pamac-updater.desktop b/data/applications/pamac-updater.desktop
index 63cc633e..1740f9b2 100644
--- a/data/applications/pamac-updater.desktop
+++ b/data/applications/pamac-updater.desktop
@@ -130,6 +130,5 @@ Icon=system-software-update
 Exec=pamac-updater
 Terminal=false
 Type=Application
-Categories=GNOME;GTK;System;
-#NotShowIn=KDE
+Categories=GNOME;GTK;System;Settings;X-XFCE-SettingsDialog;X-XFCE-SystemSettings;
 StartupNotify=true
diff --git a/po/pamac.pot b/po/pamac.pot
index 554843c2..d8345f05 100644
--- a/po/pamac.pot
+++ b/po/pamac.pot
@@ -1,13 +1,13 @@
 # Translation of Pamac.
-# Copyright (C) 2013-2016 Manjaro Developers <manjaro-dev@manjaro.org>
+# Copyright (C) 2013-2017 Manjaro Developers <manjaro-dev@manjaro.org>
 # This file is distributed under the same license as the Pamac package.
-# Guillaume Benoit <guillaume@manjaro.org>, 2013-2016.
+# Guillaume Benoit <guillaume@manjaro.org>, 2013-2017.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: Pamac\n"
 "Report-Msgid-Bugs-To: guillaume@manjaro.org\n"
-"POT-Creation-Date: 2016-04-24 08:44+0200\n"
+"POT-Creation-Date: 2017-09-09 09:46+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -170,6 +170,10 @@ msgstr ""
 msgid "To reinstall"
 msgstr ""
 
+#: ../src/transaction.vala
+msgid "To upgrade"
+msgstr ""
+
 #: ../src/transaction.vala ../src/manager_window.vala
 msgid "Total download size"
 msgstr ""
@@ -333,7 +337,7 @@ msgid "Warning"
 msgstr ""
 
 #: ../src/transaction.vala ../resources/progress_dialog.ui
-#: ../resources/history_dialog.ui
+#: ../resources/history_dialog.ui ../resources/preferences_dialog.ui
 msgid "_Close"
 msgstr ""
 
@@ -349,6 +353,10 @@ msgstr ""
 msgid "Pamac is already running"
 msgstr ""
 
+#: ../src/installer.vala ../src/manager_window.vala
+msgid "Waiting for another package manager to quit"
+msgstr ""
+
 #: ../src/tray.vala ../src/manager_window.vala
 msgid "Your system is up-to-date"
 msgstr ""
@@ -373,6 +381,10 @@ msgstr[1] ""
 msgid "Details"
 msgstr ""
 
+#: ../src/manager_window.vala
+msgid "No package found"
+msgstr ""
+
 #: ../src/manager_window.vala
 msgid "Deselect"
 msgstr ""
@@ -389,10 +401,6 @@ msgstr ""
 msgid "Remove"
 msgstr ""
 
-#: ../src/manager_window.vala
-msgid "Waiting for another package manager to quit"
-msgstr ""
-
 #: ../src/manager_window.vala
 #, c-format
 msgid "%u pending operation"
@@ -400,7 +408,7 @@ msgid_plural "%u pending operations"
 msgstr[0] ""
 msgstr[1] ""
 
-#: ../src/manager_window.vala
+#: ../src/manager_window.vala ../resources/manager_window.ui
 msgid "Installed"
 msgstr ""
 
@@ -413,7 +421,47 @@ msgid "Foreign"
 msgstr ""
 
 #: ../src/manager_window.vala
-msgid "Pending"
+msgid "Accessories"
+msgstr ""
+
+#: ../src/manager_window.vala
+msgid "Audio & Video"
+msgstr ""
+
+#: ../src/manager_window.vala
+msgid "Development"
+msgstr ""
+
+#: ../src/manager_window.vala
+msgid "Education"
+msgstr ""
+
+#: ../src/manager_window.vala
+msgid "Games"
+msgstr ""
+
+#: ../src/manager_window.vala
+msgid "Graphics"
+msgstr ""
+
+#: ../src/manager_window.vala
+msgid "Internet"
+msgstr ""
+
+#: ../src/manager_window.vala
+msgid "Office"
+msgstr ""
+
+#: ../src/manager_window.vala
+msgid "Science"
+msgstr ""
+
+#: ../src/manager_window.vala
+msgid "Settings"
+msgstr ""
+
+#: ../src/manager_window.vala
+msgid "System Tools"
 msgstr ""
 
 #: ../src/manager_window.vala
@@ -594,7 +642,7 @@ msgstr ""
 msgid "View History"
 msgstr ""
 
-#: ../resources/manager_window.ui
+#: ../resources/manager_window.ui ../resources/preferences_dialog.ui
 msgid "Preferences"
 msgstr ""
 
@@ -603,19 +651,27 @@ msgid "About"
 msgstr ""
 
 #: ../resources/manager_window.ui
-msgid "Search"
+msgid "Categories"
 msgstr ""
 
 #: ../resources/manager_window.ui
-msgid "State"
+msgid "Repositories"
 msgstr ""
 
 #: ../resources/manager_window.ui
-msgid "Repositories"
+msgid "Updates"
 msgstr ""
 
 #: ../resources/manager_window.ui
-msgid "Updates"
+msgid "Pending"
+msgstr ""
+
+#: ../resources/manager_window.ui
+msgid "Search"
+msgstr ""
+
+#: ../resources/manager_window.ui
+msgid "State"
 msgstr ""
 
 #: ../resources/manager_window.ui
diff --git a/po/pot_head b/po/pot_head
index 9ab3ae19..4a7812e0 100644
--- a/po/pot_head
+++ b/po/pot_head
@@ -1,13 +1,13 @@
 # Translation of Pamac.
-# Copyright (C) 2013-2016 Manjaro Developers <manjaro-dev@manjaro.org>
+# Copyright (C) 2013-2017 Manjaro Developers <manjaro-dev@manjaro.org>
 # This file is distributed under the same license as the Pamac package.
-# Guillaume Benoit <guillaume@manjaro.org>, 2013-2016.
+# Guillaume Benoit <guillaume@manjaro.org>, 2013-2017.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: Pamac\n"
 "Report-Msgid-Bugs-To: guillaume@manjaro.org\n"
-"POT-Creation-Date: 2016-04-24 08:44+0200\n"
+"POT-Creation-Date: 2017-09-09 09:46+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
diff --git a/resources/choose_ignorepkgs_dialog.ui b/resources/choose_ignorepkgs_dialog.ui
index fb9ebfea..22c87615 100644
--- a/resources/choose_ignorepkgs_dialog.ui
+++ b/resources/choose_ignorepkgs_dialog.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- Generated with glade 3.20.0 -->
 <interface>
-  <requires lib="gtk+" version="3.12"/>
+  <requires lib="gtk+" version="3.20"/>
   <template class="PamacChooseIgnorepkgsDialog" parent="GtkDialog">
     <property name="can_focus">False</property>
     <property name="border_width">3</property>
diff --git a/resources/choose_provider_dialog.ui b/resources/choose_provider_dialog.ui
index 4356fb56..f12e1f44 100644
--- a/resources/choose_provider_dialog.ui
+++ b/resources/choose_provider_dialog.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- Generated with glade 3.20.0 -->
 <interface>
-  <requires lib="gtk+" version="3.12"/>
+  <requires lib="gtk+" version="3.20"/>
   <template class="PamacChooseProviderDialog" parent="GtkDialog">
     <property name="can_focus">False</property>
     <property name="border_width">3</property>
diff --git a/resources/history_dialog.ui b/resources/history_dialog.ui
index 67f4169e..8a1c3d8f 100644
--- a/resources/history_dialog.ui
+++ b/resources/history_dialog.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- Generated with glade 3.20.0 -->
 <interface>
-  <requires lib="gtk+" version="3.12"/>
+  <requires lib="gtk+" version="3.20"/>
   <template class="PamacHistoryDialog" parent="GtkDialog">
     <property name="can_focus">False</property>
     <property name="border_width">3</property>
diff --git a/resources/manager_window.ui b/resources/manager_window.ui
index a3f294ae..8c38e5fa 100644
--- a/resources/manager_window.ui
+++ b/resources/manager_window.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- Generated with glade 3.20.0 -->
 <interface>
-  <requires lib="gtk+" version="3.16"/>
+  <requires lib="gtk+" version="3.20"/>
   <object class="GtkPopoverMenu" id="popovermenu">
     <property name="can_focus">False</property>
     <child>
@@ -15,7 +15,7 @@
           <object class="GtkModelButton" id="refresh_button">
             <property name="visible">True</property>
             <property name="can_focus">True</property>
-            <property name="receives_default">True</property>
+            <property name="receives_default">False</property>
             <property name="text" translatable="yes">Refresh databases</property>
             <signal name="clicked" handler="on_refresh_button_clicked" swapped="no"/>
           </object>
@@ -29,7 +29,7 @@
           <object class="GtkModelButton" id="history_button">
             <property name="visible">True</property>
             <property name="can_focus">True</property>
-            <property name="receives_default">True</property>
+            <property name="receives_default">False</property>
             <property name="text" translatable="yes">View History</property>
             <signal name="clicked" handler="on_history_button_clicked" swapped="no"/>
           </object>
@@ -43,7 +43,7 @@
           <object class="GtkModelButton" id="local_button">
             <property name="visible">True</property>
             <property name="can_focus">True</property>
-            <property name="receives_default">True</property>
+            <property name="receives_default">False</property>
             <property name="text" translatable="yes">Install Local Packages</property>
             <signal name="clicked" handler="on_local_button_clicked" swapped="no"/>
           </object>
@@ -57,7 +57,7 @@
           <object class="GtkModelButton" id="preferences_button">
             <property name="visible">True</property>
             <property name="can_focus">True</property>
-            <property name="receives_default">True</property>
+            <property name="receives_default">False</property>
             <property name="text" translatable="yes">Preferences</property>
             <signal name="clicked" handler="on_preferences_button_clicked" swapped="no"/>
           </object>
@@ -71,7 +71,7 @@
           <object class="GtkModelButton" id="about_button">
             <property name="visible">True</property>
             <property name="can_focus">True</property>
-            <property name="receives_default">True</property>
+            <property name="receives_default">False</property>
             <property name="text" translatable="yes">About</property>
             <signal name="clicked" handler="on_about_button_clicked" swapped="no"/>
           </object>
@@ -91,7 +91,8 @@
   <template class="PamacManagerWindow" parent="GtkApplicationWindow">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
-    <property name="default_height">500</property>
+    <property name="default_width">1005</property>
+    <property name="default_height">600</property>
     <property name="icon_name">system-software-install</property>
     <property name="gravity">center</property>
     <property name="show_menubar">False</property>
@@ -109,211 +110,161 @@
               <object class="GtkBox" id="box3">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
-                <property name="margin_top">3</property>
-                <property name="spacing">3</property>
                 <child>
-                  <object class="GtkStack" id="filters_stack">
+                  <object class="GtkRevealer" id="sidebar_revealer">
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
+                    <property name="transition_type">slide-right</property>
+                    <property name="transition_duration">200</property>
+                    <property name="reveal_child">True</property>
                     <child>
-                      <object class="GtkBox" id="box5">
-                        <property name="width_request">200</property>
+                      <object class="GtkStack" id="filters_stack">
+                        <property name="width_request">175</property>
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
-                        <property name="orientation">vertical</property>
-                        <property name="spacing">3</property>
+                        <property name="transition_duration">250</property>
+                        <property name="transition_type">crossfade</property>
                         <child>
-                          <object class="GtkSearchEntry" id="search_entry">
+                          <object class="GtkScrolledWindow" id="categories_scrolledwindow">
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
-                            <property name="receives_default">True</property>
-                            <property name="margin_left">3</property>
-                            <property name="caps_lock_warning">False</property>
-                            <property name="primary_icon_name">edit-find-symbolic</property>
-                            <property name="placeholder_text" translatable="yes">Search</property>
-                            <signal name="activate" handler="on_search_entry_activate" swapped="no"/>
-                            <signal name="changed" handler="on_search_entry_changed" swapped="no"/>
+                            <property name="shadow_type">in</property>
+                            <child>
+                              <object class="GtkViewport" id="categories_viewport">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <child>
+                                  <object class="GtkListBox" id="categories_listbox">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <signal name="row-activated" handler="on_categories_listbox_row_activated" swapped="no"/>
+                                  </object>
+                                </child>
+                              </object>
+                            </child>
                           </object>
                           <packing>
-                            <property name="expand">False</property>
-                            <property name="fill">True</property>
-                            <property name="position">0</property>
+                            <property name="name">categories</property>
+                            <property name="title" translatable="yes">Categories</property>
                           </packing>
                         </child>
                         <child>
-                          <object class="GtkScrolledWindow" id="scrolledwindow3">
+                          <object class="GtkScrolledWindow" id="groups_scrolledwindow">
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
                             <property name="shadow_type">in</property>
                             <child>
-                              <object class="GtkTreeView" id="search_treeview">
+                              <object class="GtkViewport" id="groups_viewport">
                                 <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="headers_visible">False</property>
-                                <property name="headers_clickable">False</property>
-                                <property name="enable_search">False</property>
-                                <property name="show_expanders">False</property>
-                                <child internal-child="selection">
-                                  <object class="GtkTreeSelection" id="search_treeview_selection">
-                                    <signal name="changed" handler="on_search_treeview_selection_changed" after="yes" swapped="no"/>
-                                  </object>
-                                </child>
+                                <property name="can_focus">False</property>
                                 <child>
-                                  <object class="GtkTreeViewColumn" id="Terms">
-                                    <child>
-                                      <object class="GtkCellRendererText" id="cellrenderertext8"/>
-                                      <attributes>
-                                        <attribute name="text">0</attribute>
-                                      </attributes>
-                                    </child>
+                                  <object class="GtkListBox" id="groups_listbox">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <signal name="row-activated" handler="on_groups_listbox_row_activated" swapped="no"/>
                                   </object>
                                 </child>
                               </object>
                             </child>
                           </object>
                           <packing>
-                            <property name="expand">True</property>
-                            <property name="fill">True</property>
-                            <property name="position">2</property>
+                            <property name="name">groups</property>
+                            <property name="title" translatable="yes">Groups</property>
+                            <property name="position">1</property>
                           </packing>
                         </child>
-                      </object>
-                      <packing>
-                        <property name="name">search</property>
-                        <property name="title" translatable="yes">Search</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <object class="GtkScrolledWindow" id="scrolledwindow1">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="shadow_type">in</property>
                         <child>
-                          <object class="GtkTreeView" id="groups_treeview">
+                          <object class="GtkScrolledWindow" id="repos_scrolledwindow">
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
-                            <property name="headers_visible">False</property>
-                            <property name="headers_clickable">False</property>
-                            <property name="enable_search">False</property>
-                            <property name="show_expanders">False</property>
-                            <child internal-child="selection">
-                              <object class="GtkTreeSelection" id="groups_treeview_selection">
-                                <signal name="changed" handler="on_groups_treeview_selection_changed" after="yes" swapped="no"/>
-                              </object>
-                            </child>
+                            <property name="shadow_type">in</property>
                             <child>
-                              <object class="GtkTreeViewColumn" id="Groups">
+                              <object class="GtkViewport" id="repos_viewport">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
                                 <child>
-                                  <object class="GtkCellRendererText" id="cellrenderertext2"/>
-                                  <attributes>
-                                    <attribute name="text">0</attribute>
-                                  </attributes>
+                                  <object class="GtkListBox" id="repos_listbox">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <signal name="row-activated" handler="on_repos_listbox_row_activated" swapped="no"/>
+                                  </object>
                                 </child>
                               </object>
                             </child>
                           </object>
+                          <packing>
+                            <property name="name">repos</property>
+                            <property name="title" translatable="yes">Repositories</property>
+                            <property name="position">2</property>
+                          </packing>
                         </child>
-                      </object>
-                      <packing>
-                        <property name="name">groups</property>
-                        <property name="title" translatable="yes">Groups</property>
-                        <property name="position">1</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <object class="GtkScrolledWindow" id="scrolledwindow2">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="shadow_type">in</property>
                         <child>
-                          <object class="GtkTreeView" id="states_treeview">
+                          <object class="GtkScrolledWindow" id="installed_scrolledwindow">
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
-                            <property name="headers_visible">False</property>
-                            <property name="headers_clickable">False</property>
-                            <property name="enable_search">False</property>
-                            <property name="show_expanders">False</property>
-                            <child internal-child="selection">
-                              <object class="GtkTreeSelection" id="states_treeview_selection">
-                                <signal name="changed" handler="on_states_treeview_selection_changed" after="yes" swapped="no"/>
-                              </object>
-                            </child>
+                            <property name="shadow_type">in</property>
                             <child>
-                              <object class="GtkTreeViewColumn" id="State">
+                              <object class="GtkViewport" id="installed_viewport">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
                                 <child>
-                                  <object class="GtkCellRendererText" id="cellrenderertext9"/>
-                                  <attributes>
-                                    <attribute name="text">0</attribute>
-                                  </attributes>
+                                  <object class="GtkListBox" id="installed_listbox">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <signal name="row-activated" handler="on_installed_listbox_row_activated" swapped="no"/>
+                                  </object>
                                 </child>
                               </object>
                             </child>
                           </object>
+                          <packing>
+                            <property name="name">installed</property>
+                            <property name="title" translatable="yes">Installed</property>
+                            <property name="position">3</property>
+                          </packing>
                         </child>
-                      </object>
-                      <packing>
-                        <property name="name">states</property>
-                        <property name="title" translatable="yes">State</property>
-                        <property name="position">2</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <object class="GtkScrolledWindow" id="scrolledwindow8">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="shadow_type">in</property>
                         <child>
-                          <object class="GtkTreeView" id="repos_treeview">
+                          <object class="GtkStackSidebar" id="updates_stacksidebar">
                             <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="headers_visible">False</property>
-                            <property name="headers_clickable">False</property>
-                            <property name="enable_search">False</property>
-                            <property name="show_expanders">False</property>
-                            <child internal-child="selection">
-                              <object class="GtkTreeSelection" id="repos_treeview_selection">
-                                <signal name="changed" handler="on_repos_treeview_selection_changed" after="yes" swapped="no"/>
-                              </object>
-                            </child>
-                            <child>
-                              <object class="GtkTreeViewColumn" id="Repos">
-                                <child>
-                                  <object class="GtkCellRendererText" id="cellrenderertext10"/>
-                                  <attributes>
-                                    <attribute name="text">0</attribute>
-                                  </attributes>
-                                </child>
-                              </object>
-                            </child>
+                            <property name="can_focus">False</property>
+                            <property name="stack">origin_stack</property>
                           </object>
+                          <packing>
+                            <property name="name">updates</property>
+                            <property name="title" translatable="yes">Updates</property>
+                            <property name="position">4</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkStackSidebar" id="pending_stacksidebar">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="stack">origin_stack</property>
+                          </object>
+                          <packing>
+                            <property name="name">pending</property>
+                            <property name="title" translatable="yes">Pending</property>
+                            <property name="position">5</property>
+                          </packing>
                         </child>
-                      </object>
-                      <packing>
-                        <property name="name">repos</property>
-                        <property name="title" translatable="yes">Repositories</property>
-                        <property name="position">3</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <object class="GtkBox" id="box6">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="orientation">vertical</property>
                         <child>
-                          <placeholder/>
+                          <object class="GtkStackSidebar" id="search_stacksidebar">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="stack">origin_stack</property>
+                          </object>
+                          <packing>
+                            <property name="name">search</property>
+                            <property name="position">6</property>
+                          </packing>
                         </child>
                       </object>
-                      <packing>
-                        <property name="name">updates</property>
-                        <property name="title" translatable="yes">Updates</property>
-                        <property name="position">4</property>
-                      </packing>
                     </child>
                   </object>
                   <packing>
                     <property name="expand">False</property>
                     <property name="fill">True</property>
-                    <property name="position">1</property>
+                    <property name="position">0</property>
                   </packing>
                 </child>
                 <child>
@@ -321,13 +272,34 @@
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
                     <property name="orientation">vertical</property>
-                    <property name="spacing">3</property>
                     <child>
-                      <object class="GtkStackSwitcher" id="packages_stackswitcher">
+                      <object class="GtkSearchBar" id="searchbar">
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
-                        <property name="halign">center</property>
-                        <property name="stack">packages_stack</property>
+                        <child>
+                          <object class="GtkComboBoxText" id="search_comboboxtext">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="has_entry">True</property>
+                            <signal name="changed" handler="on_search_comboboxtext_changed" swapped="no"/>
+                            <child internal-child="entry">
+                              <object class="GtkEntry" id="search_entry">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="has_focus">True</property>
+                                <property name="is_focus">True</property>
+                                <property name="can_default">True</property>
+                                <property name="has_default">True</property>
+                                <property name="receives_default">True</property>
+                                <property name="caps_lock_warning">False</property>
+                                <property name="primary_icon_name">edit-find-symbolic</property>
+                                <property name="secondary_icon_name">edit-clear-symbolic</property>
+                                <property name="placeholder_text" translatable="yes">Search</property>
+                                <signal name="icon-press" handler="on_search_entry_icon_press" swapped="no"/>
+                              </object>
+                            </child>
+                          </object>
+                        </child>
                       </object>
                       <packing>
                         <property name="expand">False</property>
@@ -336,12 +308,12 @@
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkStack" id="packages_stack">
+                      <object class="GtkStack" id="origin_stack">
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <child>
                           <object class="GtkScrolledWindow" id="packages_scrolledwindow">
-                            <property name="width_request">614</property>
+                            <property name="width_request">700</property>
                             <property name="height_request">200</property>
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
@@ -359,6 +331,7 @@
                                 <property name="fixed_height_mode">True</property>
                                 <property name="show_expanders">False</property>
                                 <property name="rubber_banding">True</property>
+                                <property name="activate_on_single_click">True</property>
                                 <signal name="button-press-event" handler="on_packages_treeview_button_press_event" swapped="no"/>
                                 <signal name="query-tooltip" handler="on_packages_treeview_query_tooltip" swapped="no"/>
                                 <signal name="row-activated" handler="on_packages_treeview_row_activated" swapped="no"/>
@@ -381,13 +354,20 @@
                                 <child>
                                   <object class="GtkTreeViewColumn" id="packages_name_column">
                                     <property name="resizable">True</property>
+                                    <property name="spacing">12</property>
                                     <property name="sizing">fixed</property>
-                                    <property name="fixed_width">200</property>
-                                    <property name="min_width">20</property>
+                                    <property name="fixed_width">240</property>
+                                    <property name="min_width">40</property>
                                     <property name="title" translatable="yes">Name</property>
                                     <property name="expand">True</property>
                                     <property name="clickable">True</property>
                                     <property name="sort_column_id">1</property>
+                                    <child>
+                                      <object class="GtkCellRendererPixbuf" id="packages_pixbuf"/>
+                                      <attributes>
+                                        <attribute name="pixbuf">8</attribute>
+                                      </attributes>
+                                    </child>
                                     <child>
                                       <object class="GtkCellRendererText" id="packages_name_renderertext">
                                         <property name="wrap_mode">word</property>
@@ -459,7 +439,7 @@
                         </child>
                         <child>
                           <object class="GtkScrolledWindow" id="aur_scrolledwindow">
-                            <property name="width_request">500</property>
+                            <property name="width_request">700</property>
                             <property name="height_request">200</property>
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
@@ -477,6 +457,7 @@
                                 <property name="fixed_height_mode">True</property>
                                 <property name="show_expanders">False</property>
                                 <property name="rubber_banding">True</property>
+                                <property name="activate_on_single_click">True</property>
                                 <signal name="button-press-event" handler="on_aur_treeview_button_press_event" swapped="no"/>
                                 <signal name="query-tooltip" handler="on_aur_treeview_query_tooltip" swapped="no"/>
                                 <signal name="row-activated" handler="on_aur_treeview_row_activated" swapped="no"/>
@@ -499,13 +480,20 @@
                                 <child>
                                   <object class="GtkTreeViewColumn" id="aur_name_column">
                                     <property name="resizable">True</property>
+                                    <property name="spacing">12</property>
                                     <property name="sizing">fixed</property>
-                                    <property name="fixed_width">200</property>
+                                    <property name="fixed_width">240</property>
                                     <property name="min_width">20</property>
                                     <property name="title" translatable="yes">Name</property>
                                     <property name="expand">True</property>
                                     <property name="clickable">True</property>
                                     <property name="sort_column_id">1</property>
+                                    <child>
+                                      <object class="GtkCellRendererPixbuf" id="aur_pixbuf"/>
+                                      <attributes>
+                                        <attribute name="pixbuf">6</attribute>
+                                      </attributes>
+                                    </child>
                                     <child>
                                       <object class="GtkCellRendererText" id="aur_name_renderertext">
                                         <property name="wrap_mode">word</property>
@@ -537,7 +525,7 @@
                                   <object class="GtkTreeViewColumn" id="aur_popularity_column">
                                     <property name="resizable">True</property>
                                     <property name="sizing">fixed</property>
-                                    <property name="fixed_width">90</property>
+                                    <property name="fixed_width">100</property>
                                     <property name="min_width">20</property>
                                     <property name="title" translatable="yes">Popularity</property>
                                     <property name="clickable">True</property>
@@ -597,6 +585,44 @@
                             <property name="position">2</property>
                           </packing>
                         </child>
+                        <child>
+                          <object class="GtkBox" id="no_item_box">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="orientation">vertical</property>
+                            <property name="homogeneous">True</property>
+                            <child>
+                              <object class="GtkImage" id="no_item_icon">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="valign">end</property>
+                                <property name="icon_name">action-unavailable-symbolic</property>
+                                <property name="icon_size">6</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">True</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="no_item_label">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="valign">start</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">True</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="name">no_item</property>
+                            <property name="position">3</property>
+                          </packing>
+                        </child>
                       </object>
                       <packing>
                         <property name="expand">True</property>
@@ -608,7 +634,7 @@
                   <packing>
                     <property name="expand">True</property>
                     <property name="fill">True</property>
-                    <property name="position">2</property>
+                    <property name="position">1</property>
                   </packing>
                 </child>
               </object>
@@ -618,32 +644,98 @@
               </packing>
             </child>
             <child>
-              <object class="GtkBox" id="box4">
+              <object class="GtkBox" id="properties_box">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
-                <property name="orientation">vertical</property>
-                <property name="spacing">6</property>
                 <child>
-                  <object class="GtkBox" id="box8">
+                  <object class="GtkStackSidebar" id="properties_stacksidebar">
+                    <property name="width_request">175</property>
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
-                    <property name="spacing">6</property>
+                    <property name="halign">center</property>
+                    <property name="stack">properties_stack</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">True</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkBox" id="box9">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="orientation">vertical</property>
                     <child>
-                      <object class="GtkBox" id="box9">
+                      <object class="GtkBox" id="properties_box1">
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
-                        <property name="margin_top">3</property>
-                        <property name="border_width">6</property>
+                        <property name="border_width">18</property>
                         <property name="orientation">vertical</property>
                         <property name="spacing">18</property>
                         <child>
-                          <object class="GtkLabel" id="name_label">
+                          <object class="GtkBox" id="properties_box2">
                             <property name="visible">True</property>
                             <property name="can_focus">False</property>
-                            <property name="halign">start</property>
-                            <property name="margin_start">6</property>
-                            <property name="margin_end">6</property>
-                            <property name="selectable">True</property>
+                            <property name="spacing">18</property>
+                            <child>
+                              <object class="GtkImage" id="app_image">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">True</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkBox" id="name_box">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="orientation">vertical</property>
+                                <property name="spacing">12</property>
+                                <child>
+                                  <object class="GtkLabel" id="name_label">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <property name="halign">start</property>
+                                    <property name="margin_left">6</property>
+                                    <property name="margin_right">6</property>
+                                    <property name="margin_start">6</property>
+                                    <property name="margin_end">6</property>
+                                    <property name="selectable">True</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkLabel" id="desc_label">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <property name="halign">start</property>
+                                    <property name="margin_left">6</property>
+                                    <property name="margin_right">6</property>
+                                    <property name="margin_start">6</property>
+                                    <property name="margin_end">6</property>
+                                    <property name="wrap">True</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">True</property>
+                                <property name="position">2</property>
+                              </packing>
+                            </child>
                           </object>
                           <packing>
                             <property name="expand">False</property>
@@ -652,28 +744,53 @@
                           </packing>
                         </child>
                         <child>
-                          <object class="GtkLabel" id="desc_label">
+                          <object class="GtkButtonBox" id="details_buttonbox">
                             <property name="visible">True</property>
                             <property name="can_focus">False</property>
-                            <property name="halign">start</property>
-                            <property name="margin_start">6</property>
-                            <property name="margin_end">6</property>
-                            <property name="wrap">True</property>
-                          </object>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="fill">True</property>
-                            <property name="position">1</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkLabel" id="link_label">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="halign">start</property>
-                            <property name="margin_start">6</property>
-                            <property name="margin_end">6</property>
-                            <property name="selectable">True</property>
+                            <property name="spacing">12</property>
+                            <property name="layout_style">start</property>
+                            <child>
+                              <object class="GtkToggleButton" id="remove_togglebutton">
+                                <property name="label" translatable="yes">Remove</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">False</property>
+                                <signal name="toggled" handler="on_remove_togglebutton_toggled" swapped="no"/>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkToggleButton" id="reinstall_togglebutton">
+                                <property name="label" translatable="yes">Reinstall</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">False</property>
+                                <signal name="toggled" handler="on_reinstall_togglebutton_toggled" swapped="no"/>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkToggleButton" id="install_togglebutton">
+                                <property name="label" translatable="yes">Install</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">False</property>
+                                <signal name="toggled" handler="on_install_togglebutton_toggled" swapped="no"/>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">2</property>
+                              </packing>
+                            </child>
                           </object>
                           <packing>
                             <property name="expand">False</property>
@@ -681,195 +798,244 @@
                             <property name="position">2</property>
                           </packing>
                         </child>
-                        <child>
-                          <object class="GtkLabel" id="licenses_label">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="halign">start</property>
-                            <property name="margin_start">6</property>
-                            <property name="margin_end">6</property>
-                          </object>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="fill">True</property>
-                            <property name="position">3</property>
-                          </packing>
-                        </child>
                       </object>
                       <packing>
-                        <property name="expand">True</property>
+                        <property name="expand">False</property>
                         <property name="fill">True</property>
                         <property name="position">0</property>
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkButtonBox" id="details_buttonbox">
+                      <object class="GtkStack" id="properties_stack">
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
-                        <property name="border_width">6</property>
-                        <property name="orientation">vertical</property>
-                        <property name="spacing">6</property>
-                        <property name="layout_style">start</property>
                         <child>
-                          <object class="GtkToggleButton" id="remove_togglebutton">
-                            <property name="label" translatable="yes">Remove</property>
+                          <object class="GtkScrolledWindow" id="details_scrolledwindow">
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
-                            <property name="receives_default">True</property>
-                            <signal name="toggled" handler="on_remove_togglebutton_toggled" swapped="no"/>
-                          </object>
-                          <packing>
-                            <property name="expand">True</property>
-                            <property name="fill">True</property>
-                            <property name="position">0</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkToggleButton" id="reinstall_togglebutton">
-                            <property name="label" translatable="yes">Reinstall</property>
-                            <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="receives_default">True</property>
-                            <signal name="toggled" handler="on_reinstall_togglebutton_toggled" swapped="no"/>
-                          </object>
-                          <packing>
-                            <property name="expand">True</property>
-                            <property name="fill">True</property>
-                            <property name="position">1</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkToggleButton" id="install_togglebutton">
-                            <property name="label" translatable="yes">Install</property>
-                            <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="receives_default">True</property>
-                            <signal name="toggled" handler="on_install_togglebutton_toggled" swapped="no"/>
-                          </object>
-                          <packing>
-                            <property name="expand">True</property>
-                            <property name="fill">True</property>
-                            <property name="position">2</property>
-                          </packing>
-                        </child>
-                      </object>
-                      <packing>
-                        <property name="expand">False</property>
-                        <property name="fill">True</property>
-                        <property name="position">1</property>
-                      </packing>
-                    </child>
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">True</property>
-                    <property name="position">0</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkStackSwitcher" id="properties_stackswitcher">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="halign">center</property>
-                    <property name="stack">properties_stack</property>
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">True</property>
-                    <property name="position">1</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkStack" id="properties_stack">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <child>
-                      <object class="GtkScrolledWindow" id="details_scrolledwindow">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <child>
-                          <object class="GtkViewport" id="viewport1">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="shadow_type">none</property>
                             <child>
-                              <object class="GtkGrid" id="details_grid">
+                              <object class="GtkViewport" id="details_viewport">
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
-                                <property name="border_width">6</property>
-                                <property name="row_spacing">12</property>
-                                <property name="column_spacing">12</property>
+                                <property name="shadow_type">none</property>
                                 <child>
-                                  <placeholder/>
+                                  <object class="GtkBox" id="details_box">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <property name="orientation">vertical</property>
+                                    <property name="spacing">18</property>
+                                    <child>
+                                      <object class="GtkBox" id="label_box">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
+                                        <property name="margin_left">18</property>
+                                        <property name="margin_right">199</property>
+                                        <property name="orientation">vertical</property>
+                                        <property name="spacing">18</property>
+                                        <child>
+                                          <object class="GtkLabel" id="long_desc_label">
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">False</property>
+                                            <property name="halign">start</property>
+                                            <property name="wrap">True</property>
+                                          </object>
+                                          <packing>
+                                            <property name="expand">False</property>
+                                            <property name="fill">True</property>
+                                            <property name="position">0</property>
+                                          </packing>
+                                        </child>
+                                        <child>
+                                          <object class="GtkImage" id="app_screenshot">
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">False</property>
+                                            <property name="halign">start</property>
+                                          </object>
+                                          <packing>
+                                            <property name="expand">False</property>
+                                            <property name="fill">True</property>
+                                            <property name="position">1</property>
+                                          </packing>
+                                        </child>
+                                        <child>
+                                          <object class="GtkLabel" id="link_label">
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">False</property>
+                                            <property name="halign">start</property>
+                                            <property name="margin_left">6</property>
+                                            <property name="margin_start">6</property>
+                                            <property name="margin_end">6</property>
+                                            <property name="selectable">True</property>
+                                          </object>
+                                          <packing>
+                                            <property name="expand">False</property>
+                                            <property name="fill">True</property>
+                                            <property name="position">2</property>
+                                          </packing>
+                                        </child>
+                                        <child>
+                                          <object class="GtkLabel" id="licenses_label">
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">False</property>
+                                            <property name="halign">start</property>
+                                            <property name="margin_left">6</property>
+                                            <property name="margin_start">6</property>
+                                            <property name="margin_end">6</property>
+                                          </object>
+                                          <packing>
+                                            <property name="expand">False</property>
+                                            <property name="fill">True</property>
+                                            <property name="position">3</property>
+                                          </packing>
+                                        </child>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">True</property>
+                                        <property name="position">0</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <object class="GtkGrid" id="details_grid">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
+                                        <property name="margin_left">24</property>
+                                        <property name="margin_bottom">18</property>
+                                        <property name="row_spacing">18</property>
+                                        <property name="column_spacing">18</property>
+                                        <child>
+                                          <placeholder/>
+                                        </child>
+                                        <child>
+                                          <placeholder/>
+                                        </child>
+                                        <child>
+                                          <placeholder/>
+                                        </child>
+                                        <child>
+                                          <placeholder/>
+                                        </child>
+                                        <child>
+                                          <placeholder/>
+                                        </child>
+                                        <child>
+                                          <placeholder/>
+                                        </child>
+                                        <child>
+                                          <placeholder/>
+                                        </child>
+                                        <child>
+                                          <placeholder/>
+                                        </child>
+                                        <child>
+                                          <placeholder/>
+                                        </child>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">True</property>
+                                        <property name="fill">True</property>
+                                        <property name="position">1</property>
+                                      </packing>
+                                    </child>
+                                  </object>
                                 </child>
                               </object>
                             </child>
                           </object>
+                          <packing>
+                            <property name="name">details</property>
+                            <property name="title" translatable="yes">Details</property>
+                          </packing>
                         </child>
-                      </object>
-                      <packing>
-                        <property name="name">details</property>
-                        <property name="title" translatable="yes">Details</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <object class="GtkScrolledWindow" id="deps_scrolledwindow">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
                         <child>
-                          <object class="GtkViewport" id="viewport2">
+                          <object class="GtkScrolledWindow" id="deps_scrolledwindow">
                             <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="shadow_type">none</property>
+                            <property name="can_focus">True</property>
                             <child>
-                              <object class="GtkGrid" id="deps_grid">
+                              <object class="GtkViewport" id="deps_viewport">
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
-                                <property name="border_width">6</property>
-                                <property name="row_spacing">3</property>
-                                <property name="column_spacing">3</property>
+                                <property name="shadow_type">none</property>
                                 <child>
-                                  <placeholder/>
+                                  <object class="GtkGrid" id="deps_grid">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <property name="border_width">18</property>
+                                    <property name="row_spacing">3</property>
+                                    <property name="column_spacing">3</property>
+                                    <child>
+                                      <placeholder/>
+                                    </child>
+                                    <child>
+                                      <placeholder/>
+                                    </child>
+                                    <child>
+                                      <placeholder/>
+                                    </child>
+                                    <child>
+                                      <placeholder/>
+                                    </child>
+                                    <child>
+                                      <placeholder/>
+                                    </child>
+                                    <child>
+                                      <placeholder/>
+                                    </child>
+                                    <child>
+                                      <placeholder/>
+                                    </child>
+                                    <child>
+                                      <placeholder/>
+                                    </child>
+                                    <child>
+                                      <placeholder/>
+                                    </child>
+                                  </object>
                                 </child>
                               </object>
                             </child>
                           </object>
+                          <packing>
+                            <property name="name">deps</property>
+                            <property name="title" translatable="yes">Dependencies</property>
+                            <property name="position">1</property>
+                          </packing>
                         </child>
-                      </object>
-                      <packing>
-                        <property name="name">deps</property>
-                        <property name="title" translatable="yes">Dependencies</property>
-                        <property name="position">1</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <object class="GtkScrolledWindow" id="files_scrolledwindow">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
                         <child>
-                          <object class="GtkTextView" id="files_textview">
+                          <object class="GtkScrolledWindow" id="files_scrolledwindow">
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
-                            <property name="pixels_above_lines">3</property>
-                            <property name="pixels_below_lines">3</property>
-                            <property name="editable">False</property>
-                            <property name="left_margin">6</property>
-                            <property name="right_margin">6</property>
-                            <property name="cursor_visible">False</property>
+                            <child>
+                              <object class="GtkTextView" id="files_textview">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="pixels_above_lines">3</property>
+                                <property name="pixels_below_lines">3</property>
+                                <property name="editable">False</property>
+                                <property name="left_margin">6</property>
+                                <property name="right_margin">6</property>
+                                <property name="cursor_visible">False</property>
+                              </object>
+                            </child>
                           </object>
+                          <packing>
+                            <property name="name">files</property>
+                            <property name="title" translatable="yes">Files</property>
+                            <property name="position">2</property>
+                          </packing>
                         </child>
                       </object>
                       <packing>
-                        <property name="name">files</property>
-                        <property name="title" translatable="yes">Files</property>
-                        <property name="position">2</property>
+                        <property name="expand">True</property>
+                        <property name="fill">True</property>
+                        <property name="position">1</property>
                       </packing>
                     </child>
                   </object>
                   <packing>
                     <property name="expand">True</property>
                     <property name="fill">True</property>
-                    <property name="position">2</property>
+                    <property name="position">1</property>
                   </packing>
                 </child>
               </object>
@@ -898,72 +1064,79 @@
           </packing>
         </child>
         <child>
-          <object class="GtkBox" id="transaction_infobox">
+          <object class="GtkRevealer" id="transaction_infobox_revealer">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
-            <property name="border_width">6</property>
-            <property name="spacing">12</property>
-            <child>
-              <placeholder/>
-            </child>
+            <property name="transition_type">slide-up</property>
             <child>
-              <object class="GtkButtonBox" id="transaction_infos_buttonbox">
+              <object class="GtkBox" id="transaction_infobox">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
-                <property name="valign">end</property>
-                <property name="spacing">6</property>
-                <property name="layout_style">start</property>
+                <property name="border_width">6</property>
+                <property name="spacing">12</property>
                 <child>
-                  <object class="GtkButton" id="details_button">
-                    <property name="label" translatable="yes">Details</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">True</property>
-                    <signal name="clicked" handler="on_details_button_clicked" swapped="no"/>
-                  </object>
-                  <packing>
-                    <property name="expand">True</property>
-                    <property name="fill">True</property>
-                    <property name="position">0</property>
-                  </packing>
+                  <placeholder/>
                 </child>
                 <child>
-                  <object class="GtkButton" id="apply_button">
-                    <property name="label" translatable="yes">_Apply</property>
+                  <object class="GtkButtonBox" id="transaction_infos_buttonbox">
                     <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">True</property>
-                    <property name="use_underline">True</property>
-                    <signal name="clicked" handler="on_apply_button_clicked" swapped="no"/>
+                    <property name="can_focus">False</property>
+                    <property name="valign">end</property>
+                    <property name="spacing">6</property>
+                    <property name="layout_style">start</property>
+                    <child>
+                      <object class="GtkButton" id="details_button">
+                        <property name="label" translatable="yes">Details</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <signal name="clicked" handler="on_details_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="expand">True</property>
+                        <property name="fill">True</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="apply_button">
+                        <property name="label" translatable="yes">_Apply</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="use_underline">True</property>
+                        <signal name="clicked" handler="on_apply_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="expand">True</property>
+                        <property name="fill">True</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="cancel_button">
+                        <property name="label" translatable="yes">_Cancel</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="use_underline">True</property>
+                        <signal name="clicked" handler="on_cancel_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="expand">True</property>
+                        <property name="fill">True</property>
+                        <property name="position">2</property>
+                      </packing>
+                    </child>
                   </object>
                   <packing>
-                    <property name="expand">True</property>
+                    <property name="expand">False</property>
                     <property name="fill">True</property>
+                    <property name="pack_type">end</property>
                     <property name="position">1</property>
                   </packing>
                 </child>
-                <child>
-                  <object class="GtkButton" id="cancel_button">
-                    <property name="label" translatable="yes">_Cancel</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">True</property>
-                    <property name="use_underline">True</property>
-                    <signal name="clicked" handler="on_cancel_button_clicked" swapped="no"/>
-                  </object>
-                  <packing>
-                    <property name="expand">True</property>
-                    <property name="fill">True</property>
-                    <property name="position">2</property>
-                  </packing>
-                </child>
               </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">True</property>
-                <property name="pack_type">end</property>
-                <property name="position">1</property>
-              </packing>
             </child>
           </object>
           <packing>
@@ -1008,23 +1181,55 @@
           </object>
         </child>
         <child>
-          <object class="GtkMenuButton" id="menu_button">
+          <object class="GtkBox" id="header_buttonbox">
             <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">False</property>
-            <property name="popover">popovermenu</property>
-            <signal name="toggled" handler="on_menu_button_toggled" swapped="no"/>
+            <property name="can_focus">False</property>
+            <property name="spacing">3</property>
             <child>
-              <object class="GtkImage" id="menu_icon">
+              <object class="GtkToggleButton" id="search_button">
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="icon_name">open-menu-symbolic</property>
-                <property name="icon_size">1</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">False</property>
+                <signal name="toggled" handler="on_search_button_toggled" swapped="no"/>
+                <child>
+                  <object class="GtkImage" id="search_image">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="icon_name">edit-find-symbolic</property>
+                  </object>
+                </child>
               </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkMenuButton" id="menu_button">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">False</property>
+                <property name="popover">popovermenu</property>
+                <signal name="toggled" handler="on_menu_button_toggled" swapped="no"/>
+                <child>
+                  <object class="GtkImage" id="menu_icon">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="icon_name">open-menu-symbolic</property>
+                    <property name="icon_size">1</property>
+                  </object>
+                </child>
+                <style>
+                  <class name="image-button"/>
+                </style>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
             </child>
-            <style>
-              <class name="image-button"/>
-            </style>
           </object>
           <packing>
             <property name="pack_type">end</property>
diff --git a/resources/package-generic.png b/resources/package-generic.png
new file mode 100644
index 0000000000000000000000000000000000000000..11967a92c5fc0708a2c548e1f8c8542aeb6b38ca
GIT binary patch
literal 4206
zcmV-!5RvbRP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00004b3#c}2nYxW
zd<bNS00009a7bBm000R(000R(0q|s!N&o-=8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H159>)pK~#90<(o~cCC63Af2X?d?fc%lGtcv3PiDsUc;eVeuqB8v
ziWFj5VHY;6SVRhJ5fXw0V#CIG#fO9<V1)#mNC?T1kXRsAkjMgIu^}P>CywKcaO|-?
zGoJDLxF6kJ=dh@%{<ydAdv^v)!BA4a*SD*?s?NXu=hQi;tHsRt|6JTpdH_G^l5eUI
z5g`C1A4Nxh_R?2(uU)#df9cBOpUp?bRdI6JyuX~~Ib}J!skPkHdinN^H~;-V-@bGB
z;qUz6-_AdZegOm2Hc(wwuZu_qOn@<vJ^$RZJ1;!{-2SyI4?pzKnZ5nJoynP^$oGqJ
zb~bbFj1xKIoJ^hA83$9u&Ir0^#?)a`Q$H24JyV~X!OoRun!aWSciDgVD%En<T)XrA
zZ((LQq%x5sGmZo~Q0%~vBSQ{U-J!vusUFsz!&*5kD?M0N_2I#Bd35*S_~4zJw-5j2
z+piz~>v!H*03IlTg_-%Tygdep$QYP@<IjKhD?j_wKl8_Vo)?B-s$hzlVrH0nOg-BD
z?>%ZYcty3wR6EzxeXw)NbXDbo%sJF$BQbX_bMBmokhu&I7Y-+gWQcP(afowBs(0z0
zj9>fem%&u$%f)-&diC4C`P;w$*Z(LYM`l*80U#ndaON-n=(m35^Ur<$Yo<!QoT0vK
z1xbQg_}vF3oohU|<~OmfRy{?0D3>LZVjPI;3{^uMh(%o#z_M_`42udXX7O6OC;XNy
zcYAwhFaP2%eDUSO<K?gZ-k<)>-;2nHW>!Nqf>Gahf%7js|Ajxml*QruREtCEa)Gaw
zs4p>JV_JhMU{S~@X#9;CQSHLH8AcF9?Q{SHFpX_A+L_vk&6E1+)>-I|?igs!oy+9Q
zFZ|rsfb+m^l(|_2GN1r17vo7$m-DufBt+9mdvxp5{oVRiP@JB=<oZhc!gPgg`bgq+
z>sEm3+@G*GGo4-lE=O6jE&z_8o_jcl`YQIfBE%M;*a@I`?b)BfqE1_3y2AE^>9iZi
zIn0U<V=%IOB*0#j)vW?B4u>GfRx@h@pl}i>EvGk@?ts^3b*+xh_=Z@~9edM7l(P>&
zTJtlB%l<Yq%c-FB?SS9H>og3-T47g(8PfHW7}IGvmW+;nv+fBBCkn9{6g?f3Emi?h
zU7yvSQEP!2W<__bL+a5l!>+L0-^^~!lq~>2HweRkFbyj@K=cG10&+6|0ysnZ9X06x
z&uoC2M&V8_?PRYAGo<UR0FhWRq#m)3759FP0TO#S)xw`Z_l-*=Td06^e2kNXSyhjO
zm9@gIv*Kh11o>h6*<}EfE-)*g=oUuMtA;_O0T1bVudZVh2U*c!OlYJR+zr@(EsWVl
zJD>whY1{Ml=>Vv?2-JYCTL*}yt^>v(EBflOTHMOHdteK{g&pV)Xw#7dToVRZ6{b<O
zHCC)JrmG%N&LngShFV&rr%$s14`2rr4Y5S(Dn^stYvB8{dP=a9Zj~4u_3P68);`}B
z83I5!MTj9#wsn<N71OE(!0K>xu6gaWAzdIg2$O`3!1U|rM~${BYd;?lyuq&CZ8@{6
zpsj<Vh#7)Gceb@|k2DBJLx1T4u`0|OD>^{M@ei?rm1S@(B^JdQ6k;6|9RNj#L5U1d
zUlAiwP!AmyFf&5FrtK#Uz9&pqJyz*|8Y@=HdQR{pA?}0jgEqh{&^-cRS~W)kK+Mxx
ztpQ<rtVne&FvG0qFy;gRgvP9_2ti-yZ6m`$P<#z8j>vpCk_uSpT@Bn2{pkR)Y7|do
zMXYnJoSPUR$HzzH*|>dZNRR<gHr?B+S4FkN#Z}0(jz?sGhRjg{xkvwwMPD<DgREF#
zj1vwIjuHTa3?Kt{eE1<3E<TJM-o8J|r#e7HkSuRz&oEpLc^QRX10XO!RmqDT^3epB
z1zRNoh+xD(eQQ?qfpiA*rQZy|7@W^Cspt3b^*+-Jk5bK#sH;V6P#WDO4W=<V5*JV)
zCPh^hvzR#bo@H60$MDRTeuI2824H^lAv@FkW-z|4`2Kf(9Vw<1<1vUtgBkzF-;!uA
zE{-E6ahwb393f<f3EAN+FUX2L4nKG^je0-@#$&;I(ej{~4L9CpT<lR-C9~r>%f*8E
zazVLVGM_J4EEX*03+D3$^ZA^`V##biXE9$gUo4r==gemd7R!>lR@9X9`#Gag#!#ti
z&tH7~??416j-tpZikzKs!MGSPDGDZ&B3zqH7*EFRObT|!V<tO0OeSL{#h9Jl3DYzC
zOwXRh<po(j0^s&rH--VYc=4h;I5@yLN3}Q()>s5zEx7aJ*ICYw@!q3e@$qopQ>Zd_
z#_ps>M~2_c@w$il33a-^4(ar|R*sGrWLbvGhF?fI6Ta~5RrYoY^2~vAWX|ET@Lw`V
zo;kA2;qsh3%W%$<XC)b)tjfV0%R0l)?yx+Va^bO0M*xh&ySKXCMMp?PxOkC~nRpO2
zFkd5C&YgFDKwT}!Mma9eTQ9k>1=8rh7-(ARlFd+JdP^~ddk06je1yw}8Q@HK;;ARu
z-`|b-`f$y#M*Bp-Asv+zTt>s1a5<<-RV}#v*7vyl<md3dZfsPy^i;rkFQ`#hOGIm`
z`5aty5ha|MfFtOdMMEHQU1)5>KruDEb4Zp2136H{V0w1S{zFq74nvy^Q5R@KL$4Nn
zhoMg6L{!T;<#I+<R%!WNQ2{f~J$*syIh2mf%qYtxB7#X{d*iu_zk~1=jguuKNzaAp
zk0%;Qars6Ska&}{%SSY<0R)NcGlS)Pf%=--hg5sDSTdRvjK*WK%#md|68(+kVn)3z
z!z8Yx0Gg3lo;&BwnJHS8q2u6@01^h5{1>79ooF>cuhkh5HJr<F*=X<<r_wYfo#*JN
zm12m(;`o@mw{Nktx5sEa0&%?eUvF{#k%t+L3nsfeWO-0EUoNT2B_c_&It+N}rI!RQ
zFyj3Hju~~m1aZ+d6-*>J9C4NtkrEq%*ClM^KSYNm_y-#qpeep+852Mbj0hM9bViec
z3zsh8YYzfhmT~2YYs_aeyw=Q)j+ySC2>{e3RapjGu~PCEfxn9Vli|D>byZ@)84cMP
zRh)Ct1Cz#+4IWl!@=qXv8F(YS#oYveS0EYIn4C4j%T}~`XQ-x(i!l^q?!5Q@T06zg
z4#lKEV-~tDE6T;Z%YYUDfU{@4+`T)3%7@O>FcdYzMaLuQdE<>m%%YNRv5Ue0g)GD6
zn*mU3TQdu8Ztylk8``lAV#W`@``TJNpM2&sjEjex->NmLo*`@5jAR7jofA{=b&WU|
zUTY`%n_;409Ud9M$BdLsm~0Z?Yg(c<?aYzRYxYQcO#pOP1dU$#2Fk^_qXEGCz+&n7
zuYCZ_EG7!t2hE~mAckd%s0$#_(f3ZkMfd+|QH#QDs0Yk61Vb^{F*Ujm^n)xm8s0XN
zZGUS!u#oua0^q$SW{YX?-J8u0$r35ikVPpi2^$@i&2pttbe?HTSys_yp7Y_ogJx#a
z8lPsfWri_3I%07=TW>6uqk9LK87_0|pF4+nkEr5Yj{*IZn5BGx#kV--nt@0Px{Wpr
zO^3t)Y(vJSZ9lvo|K>lu!eY6kT2@qLg<#}aMxJMkM;VVl`bcjHT+J$(8F`-b;~(9i
zT9$)--MaZMw{E`66Q6#HB#)XV8*pMiAnfGuKInY30SZWbK4?HkQ`DkCI++7zusbQZ
z^bj~V#YG=K7l#`;oH<+uE&{1(#x>c2$N~(PXIy{!X@2nC|JY~;9=Up%v*#a*X*eJ4
z#|cKT9ca?Apf#q}7&?fteeVfbF#;Qkz;wF9?%t&1%hO?#_H?{SL(td#6o>3gce!%?
z8gIXOW38*{{yvu;yV8JTkpV+4^C|!iQ`FapxnK)2pka>zS=9N&Bso>~4hCUgO3Dy*
zZGyG$1Vc_TZmv>|?+zkBamN}4=PzDhet5(Ow{ACmjEjQDp1juXGa{@4VO5YI;}8G>
zrcELvx}Cu)B1qV+B?c0flisptHn_%~T2d+}0n$W{9Tvt&60BnggAZV4eB#=p%;z)a
zM>8aIJoeNlaap#u3V`C=hG_8KJ*cQctQU1gq6erQ!zp68<oU%=Gzor+4IGxg`2)}b
z-|Bw5?G6<4tw(5$V8&zDuk+?>uk(q=uTm7_wS5R0a}%u-zhVTPb7obz=*@!Hlo+64
z)<wZYFpFua)QkmStjRrZD|tXItukiO?e6Y9j6i7GZ%7<dCoV8E+$iUXpZXMeJ{o)j
zt?KdZ7QGb!UVPE``kw%p_Yq~)AXK!Tngvf#nw&rf1Oyf9MT=XNxO9q1i13<qUt>}w
z<P;MVP>nz&V+djzJrE;v*~T3xrW)MP7J#NSHlU^=Y|k;&Jc2__ablQ)xCDZQ#Db;7
zXc$0~3b_vk7+o8%vH~@>z(;|*Z=qUO*t#M4h7vYt4ug{e+`S7_@mBR%?J?14Jslzz
z_vvbg5j><!tcbLN+$RGPaQ(EpMcN0d>*_w`6d|Vj(^7g;SJ4J^hSyO65jb~_3Q$!^
z@9;z<8o?xd%m>6(p@|G7`iadzwxod2=zqhAlnbECgmy)u0}?4@*3;eaX0vx+_~;6o
z8RySKU85l0E55Elz<b{&KAh{#IwYxsK%29HC&6IE^wJs#G^_}8Pj;d;f^q3JJB<KM
zMtf+6q6*w)G#ZKbUK+2-qV5>M_<7&XdZfGbX#W6yKzH_=^C(bK2WxJK8!cPmO?5lI
zHLFPD2(9f9X+iWJ_3>3zOgKvG3KCLaH0KW_cW-pv?$dJG&>_Lm01@&M(lBEi_d~sp
zVfMNqY*vA)s?0fu0?zxG?bW#MTU6T^4EMag2cv)c^h%Ht2iXdqqS0jaTj96vLv_1g
zNTc7Ka%ook#>j=o`-u=3Z1et$(OFGstbEf|5<EzAU&2F-1q|X+IP3?+BB}=J5echZ
z3d=;oTql)moXYNC?q^`D!09Tc7ALJ0Jgs{7TO@AyNLtjbTeSgpG%J^9_FQ3v^)oz@
z1YZp>Hp_Eb8N_Pn<;se8_W&VBuw@3v^K#i~!k`7f12dq!@$SLxXRnX1LPyA6UM`Nc
z`LjB(`w0g6muzT?K7x{5<QwlD+$MZIHX{-|0Z;?Sz~RfUyz%OjSI+)Yk!QJ`@Qu%d
z%*56M{)pRCgJtdOmtXnetH2>a)*50CFn&Pv2=FQ3=dYaK{n9Ug@%rbUxHLVtH;KC$
zKBnb(QI$8|JG%RgfBMnCz4O8Bo4`K<ZvgL`nKd6y#%~6%08ay-1wI3uC464;aV{lr
z0DKR44R{@R$Ktnxy)Q>aWEZ$d__FFE;S;mdzIFWHUgp3Dz-{0raNEq9PgRFLoy~!L
z!gqutKK>tAD<RgM0nG=KsjLCeR0O+_^M3<?+BOLK-}c;_VT)nT$p8QV07*qoM6N<$
Ef;Ecg8vp<R

literal 0
HcmV?d00001

diff --git a/resources/pamac.manager.gresource.xml b/resources/pamac.manager.gresource.xml
index 99dba715..b1b7a6b3 100644
--- a/resources/pamac.manager.gresource.xml
+++ b/resources/pamac.manager.gresource.xml
@@ -11,5 +11,6 @@
     <file preprocess="to-pixdata">package-reinstall.png</file>
     <file preprocess="to-pixdata">package-remove.png</file>
     <file preprocess="to-pixdata">package-upgrade.png</file>
+    <file preprocess="to-pixdata">package-generic.png</file>
   </gresource>
 </gresources>
diff --git a/resources/preferences_dialog.ui b/resources/preferences_dialog.ui
index bf505796..11d087e3 100644
--- a/resources/preferences_dialog.ui
+++ b/resources/preferences_dialog.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- Generated with glade 3.20.0 -->
 <interface>
-  <requires lib="gtk+" version="3.14"/>
+  <requires lib="gtk+" version="3.20"/>
   <object class="GtkAdjustment" id="cache_keep_nb_adjustment">
     <property name="upper">10</property>
     <property name="value">3</property>
@@ -18,6 +18,7 @@
   <template class="PamacPreferencesDialog" parent="GtkDialog">
     <property name="can_focus">False</property>
     <property name="border_width">3</property>
+    <property name="title" translatable="yes">Preferences</property>
     <property name="window_position">center-on-parent</property>
     <property name="icon_name">system-software-install</property>
     <property name="type_hint">dialog</property>
@@ -31,20 +32,31 @@
             <property name="can_focus">False</property>
             <property name="layout_style">end</property>
             <child>
-              <placeholder/>
+              <object class="GtkButton" id="close_button">
+                <property name="label" translatable="yes">_Close</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">False</property>
+                <property name="use_underline">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
             </child>
           </object>
           <packing>
             <property name="expand">False</property>
             <property name="fill">True</property>
             <property name="pack_type">end</property>
-            <property name="position">0</property>
+            <property name="position">1</property>
           </packing>
         </child>
         <child>
-          <object class="GtkStack" id="stack">
+          <object class="GtkNotebook" id="notebook">
             <property name="visible">True</property>
-            <property name="can_focus">False</property>
+            <property name="can_focus">True</property>
             <child>
               <object class="GtkBox" id="general_config_box">
                 <property name="visible">True</property>
@@ -370,9 +382,15 @@
                   </packing>
                 </child>
               </object>
+            </child>
+            <child type="tab">
+              <object class="GtkLabel" id="general_label">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">General</property>
+              </object>
               <packing>
-                <property name="name">general</property>
-                <property name="title" translatable="yes">General</property>
+                <property name="tab_fill">False</property>
               </packing>
             </child>
             <child>
@@ -485,11 +503,20 @@
                 </child>
               </object>
               <packing>
-                <property name="name">official_repositories</property>
-                <property name="title" translatable="yes">Official Repositories</property>
                 <property name="position">1</property>
               </packing>
             </child>
+            <child type="tab">
+              <object class="GtkLabel" id="mirrors_label">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">Official Repositories</property>
+              </object>
+              <packing>
+                <property name="position">1</property>
+                <property name="tab_fill">False</property>
+              </packing>
+            </child>
             <child>
               <object class="GtkBox" id="aur_config_box">
                 <property name="visible">True</property>
@@ -640,11 +667,20 @@ All AUR users should be familiar with the build process.</property>
                 </child>
               </object>
               <packing>
-                <property name="name">aur</property>
-                <property name="title" translatable="yes">AUR</property>
                 <property name="position">2</property>
               </packing>
             </child>
+            <child type="tab">
+              <object class="GtkLabel" id="aur_label">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">AUR</property>
+              </object>
+              <packing>
+                <property name="position">2</property>
+                <property name="tab_fill">False</property>
+              </packing>
+            </child>
             <child>
               <object class="GtkBox" id="cache_config_box">
                 <property name="visible">True</property>
@@ -736,37 +772,34 @@ All AUR users should be familiar with the build process.</property>
                 </child>
               </object>
               <packing>
-                <property name="name">cache</property>
-                <property name="title" translatable="yes">Cache</property>
                 <property name="position">3</property>
               </packing>
             </child>
+            <child type="tab">
+              <object class="GtkLabel" id="cache_label">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">Cache</property>
+              </object>
+              <packing>
+                <property name="position">3</property>
+                <property name="tab_fill">False</property>
+              </packing>
+            </child>
           </object>
           <packing>
             <property name="expand">True</property>
             <property name="fill">True</property>
-            <property name="position">2</property>
+            <property name="position">0</property>
           </packing>
         </child>
       </object>
     </child>
-    <child type="titlebar">
-      <object class="GtkHeaderBar">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="show_close_button">True</property>
-        <child>
-          <placeholder/>
-        </child>
-        <child type="title">
-          <object class="GtkStackSwitcher" id="stackswitcher">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="halign">center</property>
-            <property name="stack">stack</property>
-          </object>
-        </child>
-      </object>
+    <action-widgets>
+      <action-widget response="-7">close_button</action-widget>
+    </action-widgets>
+    <child>
+      <placeholder/>
     </child>
   </template>
 </interface>
diff --git a/resources/progress_box.ui b/resources/progress_box.ui
index cd330901..d72aa94e 100644
--- a/resources/progress_box.ui
+++ b/resources/progress_box.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- Generated with glade 3.20.0 -->
 <interface>
-  <requires lib="gtk+" version="3.12"/>
+  <requires lib="gtk+" version="3.20"/>
   <template class="PamacProgressBox" parent="GtkBox">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
diff --git a/resources/progress_dialog.ui b/resources/progress_dialog.ui
index 4aef5f90..c82d36db 100644
--- a/resources/progress_dialog.ui
+++ b/resources/progress_dialog.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- Generated with glade 3.20.0 -->
 <interface>
-  <requires lib="gtk+" version="3.12"/>
+  <requires lib="gtk+" version="3.20"/>
   <template class="PamacProgressDialog" parent="GtkApplicationWindow">
     <property name="can_focus">False</property>
     <property name="border_width">6</property>
diff --git a/resources/transaction_sum_dialog.ui b/resources/transaction_sum_dialog.ui
index f0973aed..9a94f0ad 100644
--- a/resources/transaction_sum_dialog.ui
+++ b/resources/transaction_sum_dialog.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- Generated with glade 3.20.0 -->
 <interface>
-  <requires lib="gtk+" version="3.12"/>
+  <requires lib="gtk+" version="3.20"/>
   <template class="PamacTransactionSumDialog" parent="GtkDialog">
     <property name="can_focus">False</property>
     <property name="border_width">3</property>
diff --git a/src/Makefile b/src/Makefile
index 46038382..62aab0ae 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -69,6 +69,7 @@ pamac-user-daemon: ../vapi/libalpm.vapi alpm_config.vala common.vala package.val
 			$(ALPM_VALA_FLAGS) \
 			--pkg=json-glib-1.0 \
 			--pkg=libsoup-2.4 \
+			--pkg=appstream-glib \
 			--thread \
 			alpm_config.vala \
 			common.vala \
@@ -112,6 +113,7 @@ pamac-manager: libpamac.so ../resources/manager_resources.c history_dialog.vala
 			$(PAMAC_LIB_FLAGS) \
 			--pkg=gtk+-3.0 \
 			--pkg=gdk-3.0 \
+			--pkg=libsoup-2.4 \
 			--gresources=$(MANAGER_GRESOURCE_FILE) \
 			../resources/manager_resources.c \
 			history_dialog.vala \
diff --git a/src/manager.vala b/src/manager.vala
index 72878dc2..6aa118dd 100644
--- a/src/manager.vala
+++ b/src/manager.vala
@@ -61,7 +61,7 @@ namespace Pamac {
 				this.set_accels_for_action ("app.back", accels);
 				// search accel
 				action =  new SimpleAction ("search", null);
-				action.activate.connect  (() => {manager_window.filters_stack.visible_child_name = "search";});
+				action.activate.connect  (() => {manager_window.search_button.activate ();});
 				this.add_action (action);
 				accels = {"<Ctrl>F"};
 				this.set_accels_for_action ("app.search", accels);
@@ -70,11 +70,16 @@ namespace Pamac {
 
 		public override int command_line (ApplicationCommandLine cmd) {
 			if (cmd.get_arguments ()[0] == "pamac-updater") {
+				if (!started) {
+					manager_window.update_lists ();
+					started = true;
+				}
 				manager_window.display_package_queue.clear ();
 				manager_window.main_stack.visible_child_name = "browse";
 				manager_window.filters_stack.visible_child_name = "updates";
 			} else if (!started) {
-				manager_window.show_default_pkgs ();
+				manager_window.update_lists ();
+				manager_window.refresh_packages_list ();
 				started = true;
 			}
 			if (!pamac_run) {
diff --git a/src/manager_window.vala b/src/manager_window.vala
index 86ae978b..ed4f1752 100644
--- a/src/manager_window.vala
+++ b/src/manager_window.vala
@@ -17,7 +17,7 @@
  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-const string VERSION = "5.1.1";
+const string VERSION = "5.9.0";
 
 namespace Pamac {
 
@@ -47,6 +47,7 @@ namespace Pamac {
 		Gdk.Pixbuf? to_upgrade_icon;
 		Gdk.Pixbuf? installed_locked_icon;
 		Gdk.Pixbuf? available_locked_icon;
+		Gdk.Pixbuf? package_icon;
 
 		// manager objects
 		[GtkChild]
@@ -64,29 +65,45 @@ namespace Pamac {
 		[GtkChild]
 		Gtk.TreeViewColumn aur_state_column;
 		[GtkChild]
+		Gtk.Revealer sidebar_revealer;
+		[GtkChild]
 		public Gtk.Stack filters_stack;
 		[GtkChild]
 		Gtk.StackSwitcher filters_stackswitcher;
 		[GtkChild]
-		Gtk.SearchEntry search_entry;
+		Gtk.StackSidebar updates_stacksidebar;
+		[GtkChild]
+		Gtk.StackSidebar pending_stacksidebar;
+		[GtkChild]
+		public Gtk.ToggleButton search_button;
+		[GtkChild]
+		Gtk.SearchBar searchbar;
+		[GtkChild]
+		Gtk.ComboBoxText search_comboboxtext;
 		[GtkChild]
-		Gtk.TreeView search_treeview;
+		Gtk.Entry search_entry;
 		[GtkChild]
-		Gtk.TreeView groups_treeview;
+		Gtk.ListBox categories_listbox;
 		[GtkChild]
-		Gtk.TreeView states_treeview;
+		Gtk.ListBox groups_listbox;
 		[GtkChild]
-		Gtk.TreeView repos_treeview;
+		Gtk.ListBox installed_listbox;
 		[GtkChild]
-		Gtk.Stack packages_stack;
+		Gtk.ListBox repos_listbox;
 		[GtkChild]
-		Gtk.StackSwitcher packages_stackswitcher;
+		Gtk.Stack origin_stack;
+		[GtkChild]
+		Gtk.ScrolledWindow packages_scrolledwindow;
+		[GtkChild]
+		Gtk.ScrolledWindow aur_scrolledwindow;
 		[GtkChild]
 		Gtk.Label updated_label;
 		[GtkChild]
+		Gtk.Label no_item_label;
+		[GtkChild]
 		Gtk.Stack properties_stack;
 		[GtkChild]
-		Gtk.StackSwitcher properties_stackswitcher;
+		Gtk.StackSidebar properties_stacksidebar;
 		[GtkChild]
 		Gtk.Grid deps_grid;
 		[GtkChild]
@@ -96,8 +113,14 @@ namespace Pamac {
 		[GtkChild]
 		Gtk.Label name_label;
 		[GtkChild]
+		Gtk.Image app_image;
+		[GtkChild]
+		Gtk.Image app_screenshot;
+		[GtkChild]
 		Gtk.Label desc_label;
 		[GtkChild]
+		Gtk.Label long_desc_label;
+		[GtkChild]
 		Gtk.Label link_label;
 		[GtkChild]
 		Gtk.Label licenses_label;
@@ -112,6 +135,8 @@ namespace Pamac {
 		[GtkChild]
 		Gtk.Box transaction_infobox;
 		[GtkChild]
+		Gtk.Revealer transaction_infobox_revealer;
+		[GtkChild]
 		Gtk.Button details_button;
 		[GtkChild]
 		Gtk.Button apply_button;
@@ -129,10 +154,6 @@ namespace Pamac {
 		GLib.List<string> selected_aur;
 
 		// liststores
-		Gtk.ListStore search_list;
-		Gtk.ListStore groups_list;
-		Gtk.ListStore states_list;
-		Gtk.ListStore repos_list;
 		Gtk.ListStore packages_list;
 		Gtk.ListStore aur_list;
 
@@ -150,14 +171,21 @@ namespace Pamac {
 		bool waiting;
 		bool force_refresh;
 
+		AlpmPackage[] repos_updates;
+		AURPackage[] aur_updates;
+		bool updates_checked;
+
 		uint search_entry_timeout_id;
+		string search_string;
+		bool show_last_search;
 
 		public ManagerWindow (Gtk.Application application) {
 			Object (application: application);
 
-			support_aur (false);
+			updates_checked = false;
 			button_back.visible = false;
-			transaction_infobox.visible = false;
+			pending_stacksidebar.visible = false;
+			searchbar.connect_entry (search_entry);
 			refreshing = false;
 			important_details = false;
 			transaction_running = false;
@@ -166,6 +194,7 @@ namespace Pamac {
 
 			this.title = dgettext (null, "Package Manager");
 			updated_label.set_markup ("<b>%s</b>".printf (dgettext (null, "Your system is up-to-date")));
+			no_item_label.set_markup ("<b>%s</b>".printf (dgettext (null, "No package found")));
 			this.get_window ().set_cursor (new Gdk.Cursor.for_display (Gdk.Display.get_default (), Gdk.CursorType.WATCH));
 			while (Gtk.events_pending ()) {
 				Gtk.main_iteration ();
@@ -190,23 +219,16 @@ namespace Pamac {
 			right_click_menu.append (details_item);
 			right_click_menu.show_all ();
 
-			search_list = new Gtk.ListStore (1, typeof (string));
-			search_treeview.set_model (search_list);
-			groups_list = new Gtk.ListStore (1, typeof (string));
-			groups_treeview.set_model (groups_list);
-			states_list = new Gtk.ListStore (1, typeof (string));
-			states_treeview.set_model (states_list);
-			repos_list = new Gtk.ListStore (1, typeof (string));
-			repos_treeview.set_model (repos_list);
-
-			packages_list = new Gtk.ListStore (7, 
+			packages_list = new Gtk.ListStore (9,
 											typeof (uint), //origin
-											typeof (string), //name
+											typeof (string), //pkgname
 											typeof (string), //name+desc
 											typeof (string), //version
 											typeof (string), //repo
 											typeof (uint64), //isize
-											typeof (string)); //GLib.format (isize)
+											typeof (string), //GLib.format (isize)
+											typeof (string), //app_name
+											typeof (Gdk.Pixbuf)); //icon
 			packages_treeview.set_model (packages_list);
 			// add custom cellrenderer to packages_treeview and aur_treewiew
 			var packages_state_renderer = new ActivableCellRendererPixbuf ();
@@ -241,13 +263,14 @@ namespace Pamac {
 			});
 			packages_state_renderer.activated.connect (on_packages_state_icon_activated);
 
-			aur_list = new Gtk.ListStore (6, 
+			aur_list = new Gtk.ListStore (7,
 											typeof (uint), //origin
 											typeof (string), //name
 											typeof (string), //name+desc
 											typeof (string), //version
 											typeof (double), //popularity
-											typeof (string)); //populariy to string
+											typeof (string), //populariy to string
+											typeof (Gdk.Pixbuf)); //icon
 			// sort packages by popularity by default
 			aur_list.set_sort_column_id (4, Gtk.SortType.DESCENDING);
 			aur_treeview.set_model (aur_list);
@@ -295,8 +318,9 @@ namespace Pamac {
 				to_upgrade_icon = new Gdk.Pixbuf.from_resource ("/org/manjaro/pamac/manager/package-upgrade.png");
 				installed_locked_icon = new Gdk.Pixbuf.from_resource ("/org/manjaro/pamac/manager/package-installed-locked.png");
 				available_locked_icon = new Gdk.Pixbuf.from_resource ("/org/manjaro/pamac/manager/package-available-locked.png");
+				package_icon = new Gdk.Pixbuf.from_resource ("/org/manjaro/pamac/manager/package-generic.png");
 			} catch (GLib.Error e) {
-				stderr.printf (e.message);
+				stderr.printf ("%s\n", e.message);
 			}
 
 			transaction = new Transaction (this as Gtk.ApplicationWindow);
@@ -316,21 +340,30 @@ namespace Pamac {
 			main_stack.add_named (transaction.term_window, "term");
 			transaction_infobox.pack_start (transaction.progress_box);
 
-			support_aur (transaction.enable_aur);
-
 			display_package_queue = new Queue<string> ();
 
 			main_stack.notify["visible-child"].connect (on_main_stack_visible_child_changed);
 			filters_stack.notify["visible-child"].connect (on_filters_stack_visible_child_changed);
-			packages_stack.notify["visible-child"].connect (on_packages_stack_visible_child_changed);
+			origin_stack.notify["visible-child"].connect (on_origin_stack_visible_child_changed);
 			properties_stack.notify["visible-child"].connect (on_properties_stack_visible_child_changed);
 
-			Timeout.add (100, populate_window);
-		}
+			searchbar.notify["search-mode-enabled"].connect (on_search_mode_enabled);
+			show_last_search = true;
+			// enable "type to search"
+			this.get_window ().set_events (Gdk.EventMask.KEY_PRESS_MASK);
+			this.key_press_event.connect ((event) => {
+				show_last_search = false;
+				return searchbar.handle_event (event);
+			});
 
-		bool populate_window () {
-			update_lists ();
-			return false;
+			// create screenshots tmp dir
+			string screenshots_tmp_dir = "/tmp/pamac-app-screenshots";
+			try {
+				Process.spawn_command_line_sync ("mkdir -p %s".printf (screenshots_tmp_dir));
+				Process.spawn_command_line_sync ("chmod -R 777 %s".printf (screenshots_tmp_dir));
+			} catch (SpawnError e) {
+				stderr.printf ("SpawnError: %s\n", e.message);
+			}
 		}
 
 		void on_write_pamac_config_finished (bool recurse, uint64 refresh_period, bool no_update_hide_icon,
@@ -353,15 +386,32 @@ namespace Pamac {
 	}
 
 		void support_aur (bool enable_aur) {
-			if (enable_aur) {
-				if (filters_stack.visible_child_name == "search") {
-					packages_stackswitcher.visible = true;
+			if (filters_stack.visible_child_name == "search") {
+				if (enable_aur) {
+					show_sidebar ();
+				} else {
+					hide_sidebar ();
+					origin_stack.visible_child_name = "repos";
 				}
-			} else {
-				packages_stackswitcher.visible = false;
 			}
 		}
 
+		void hide_sidebar () {
+			sidebar_revealer.set_reveal_child (false);
+		}
+
+		void show_sidebar () {
+			sidebar_revealer.set_reveal_child (true);
+		}
+
+		void hide_transaction_infobox () {
+			transaction_infobox_revealer.set_reveal_child (false);
+		}
+
+		void show_transaction_infobox () {
+			transaction_infobox_revealer.set_reveal_child (true);
+		}
+
 		void try_lock_and_run (TransactionAction action) {
 			if (transaction.get_lock ()) {
 				action ();
@@ -370,7 +420,7 @@ namespace Pamac {
 				transaction.progress_box.action_label.label = dgettext (null, "Waiting for another package manager to quit") + "...";
 				transaction.start_progressbar_pulse ();
 				cancel_button.sensitive = true;
-				transaction_infobox.show_all ();
+				show_transaction_infobox ();
 				Timeout.add (5000, () => {
 					bool locked = transaction.get_lock ();
 					if (locked) {
@@ -408,67 +458,108 @@ namespace Pamac {
 						apply_button.sensitive = false;
 					}
 					cancel_button.sensitive = false;
-					// fix an possible visibility issue
-					transaction_infobox.show_all ();
+					show_transaction_infobox ();
 				} else {
 					uint total_pending = transaction.to_install.length + transaction.to_remove.length + transaction.to_build.length;
 					if (total_pending == 0) {
+						if (filters_stack.visible_child_name != "pending") {
+							pending_stacksidebar.visible = false;
+							updates_stacksidebar.visible = true;
+						}
 						transaction.progress_box.action_label.label = "";
 						cancel_button.sensitive = false;
 						apply_button.sensitive = false;
 						if (important_details) {
-							transaction_infobox.show_all ();
+							show_transaction_infobox ();
 						}
 					} else {
+						updates_stacksidebar.visible = false;
+						pending_stacksidebar.visible = true;
+						var attention_val = GLib.Value (typeof (bool));
+						attention_val.set_boolean (true);
+						filters_stack.child_set_property (filters_stack.get_child_by_name ("pending"),
+														"needs-attention",
+														attention_val);
 						string info = dngettext (null, "%u pending operation", "%u pending operations", total_pending).printf (total_pending);
 						transaction.progress_box.action_label.label = info;
 						cancel_button.sensitive = true;
 						apply_button.sensitive = true;
-						// fix an possible visibility issue
-						transaction_infobox.show_all ();
+						show_transaction_infobox ();
 					}
 				}
 			}
 		}
 
-		public void show_default_pkgs () {
+		void show_default_pkgs () {
 			this.get_window ().set_cursor (new Gdk.Cursor.for_display (Gdk.Display.get_default (), Gdk.CursorType.WATCH));
 			transaction.get_installed_pkgs.begin ((obj, res) => {
 				populate_packages_list (transaction.get_installed_pkgs.end (res));
 			});
 		}
 
-		void update_lists () {
-			Gtk.TreeIter iter;
-			Gtk.TreeSelection selection = repos_treeview.get_selection ();
-			selection.changed.disconnect (on_repos_treeview_selection_changed);
+		Gtk.Label create_list_label (string str) {
+			var label = new Gtk.Label (str);
+			label.visible = true;
+			label.margin = 8;
+			label.xalign = 0;
+			return label;
+		}
+
+		int sort_list_row (Gtk.ListBoxRow row1, Gtk.ListBoxRow row2) {
+			var label1 = row1.get_child () as Gtk.Label;
+			var label2 = row2.get_child () as Gtk.Label;
+			return strcmp (label1.label, label2.label);
+		}
+
+		public void update_lists () {
+			Gtk.Label label;
 			foreach (unowned string repo in transaction.get_repos_names ()) {
-				repos_list.insert_with_values (null, -1, 0, repo);
+				label = create_list_label (repo);
+				repos_listbox.add (label);
 			}
-			repos_list.get_iter_first (out iter);
-			selection.select_iter (iter);
-			selection.changed.connect_after (on_repos_treeview_selection_changed);
+			repos_listbox.select_row (repos_listbox.get_row_at_index (0));
 
-			selection = groups_treeview.get_selection ();
-			selection.changed.disconnect (on_groups_treeview_selection_changed);
 			foreach (unowned string group in transaction.get_groups_names ()) {
-				groups_list.insert_with_values (null, -1, 0, group);
-			}
-			groups_list.set_sort_column_id (0, Gtk.SortType.ASCENDING);
-			groups_list.get_iter_first (out iter);
-			selection.select_iter (iter);
-			selection.changed.connect_after (on_groups_treeview_selection_changed);
-
-			selection = states_treeview.get_selection ();
-			selection.changed.disconnect (on_states_treeview_selection_changed);
-			states_list.insert_with_values (null, -1, 0, dgettext (null, "Installed"));
-			states_list.insert_with_values (null, -1, 0, dgettext (null, "Explicitly installed"));
-			states_list.insert_with_values (null, -1, 0, dgettext (null, "Orphans"));
-			states_list.insert_with_values (null, -1, 0, dgettext (null, "Foreign"));
-			states_list.insert_with_values (null, -1, 0, dgettext (null, "Pending"));
-			states_list.get_iter_first (out iter);
-			selection.select_iter (iter);
-			selection.changed.connect_after (on_states_treeview_selection_changed);
+				label = create_list_label (group);
+				groups_listbox.add (label);
+			}
+			groups_listbox.set_sort_func (sort_list_row);
+			groups_listbox.select_row (groups_listbox.get_row_at_index (0));
+
+			label = create_list_label (dgettext (null, "Installed"));
+			installed_listbox.add (label);
+			label = create_list_label (dgettext (null, "Explicitly installed"));
+			installed_listbox.add (label);
+			label = create_list_label (dgettext (null, "Orphans"));
+			installed_listbox.add (label);
+			label = create_list_label (dgettext (null, "Foreign"));
+			installed_listbox.add (label);
+			installed_listbox.select_row (installed_listbox.get_row_at_index (0));
+
+			label = create_list_label (dgettext (null, "Accessories"));
+			categories_listbox.add (label);
+			label = create_list_label (dgettext (null, "Audio & Video"));
+			categories_listbox.add (label);
+			label = create_list_label (dgettext (null, "Development"));
+			categories_listbox.add (label);
+			label = create_list_label (dgettext (null, "Education"));
+			categories_listbox.add (label);
+			label = create_list_label (dgettext (null, "Games"));
+			categories_listbox.add (label);
+			label = create_list_label (dgettext (null, "Graphics"));
+			categories_listbox.add (label);
+			label = create_list_label (dgettext (null, "Internet"));
+			categories_listbox.add (label);
+			label = create_list_label (dgettext (null, "Office"));
+			categories_listbox.add (label);
+			label = create_list_label (dgettext (null, "Science"));
+			categories_listbox.add (label);
+			label = create_list_label (dgettext (null, "Settings"));
+			categories_listbox.add (label);
+			label = create_list_label (dgettext (null, "System Tools"));
+			categories_listbox.add (label);
+			categories_listbox.set_sort_func (sort_list_row);
+			categories_listbox.select_row (categories_listbox.get_row_at_index (0));
 		}
 
 		void on_mark_explicit_button_clicked (Gtk.Button button) {
@@ -481,21 +572,21 @@ namespace Pamac {
 			var label = new Gtk.Label ("<b>%s</b>".printf (detail_type + ":"));
 			label.use_markup = true;
 			label.halign = Gtk.Align.START;
+			label.valign = Gtk.Align.START;
 			details_grid.attach_next_to (label, previous_widget, Gtk.PositionType.BOTTOM);
 			if (!transaction_running
 				&& !sysupgrade_running
 				&& detail_type == dgettext (null, "Install Reason")
 				&& detail == dgettext (null, "Installed as a dependency for another package")) {
-				var box = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 12);
+				var box = new Gtk.Box (Gtk.Orientation.VERTICAL, 12);
 				box.homogeneous = false;
-				box.hexpand = true;
 				var label2 = new Gtk.Label (detail);
 				label2.halign = Gtk.Align.START;
 				box.pack_start (label2, false);
 				var mark_explicit_button = new Gtk.Button.with_label (dgettext (null, "Mark as explicitly installed"));
-				mark_explicit_button.margin = 3;
+				mark_explicit_button.halign = Gtk.Align.START;
 				mark_explicit_button.clicked.connect (on_mark_explicit_button_clicked);
-				box.pack_end (mark_explicit_button, false);
+				box.pack_start (mark_explicit_button, false);
 				details_grid.attach_next_to (box, label, Gtk.PositionType.RIGHT);
 			} else {
 				var label2 = new Gtk.Label (detail);
@@ -540,34 +631,29 @@ namespace Pamac {
 			label.valign = Gtk.Align.START;
 			label.margin_top = 6;
 			deps_grid.attach_next_to (label, previous_widget, Gtk.PositionType.BOTTOM);
-			var box = new Gtk.Box (Gtk.Orientation.VERTICAL, 3);
-			box.hexpand = true;
+			var dep_name_grid = new Gtk.Grid ();
+			dep_name_grid.hexpand = true;
+			Gtk.Widget? previous_dep_name = null;
 			foreach (unowned string dep in dep_list) {
+				var dep_button = new Gtk.Button.with_label (dep);
+				dep_button.relief = Gtk.ReliefStyle.NONE;
+				dep_button.halign = Gtk.Align.START;
+				dep_button.clicked.connect (on_dep_button_clicked);
+				dep_name_grid.attach_next_to (dep_button, previous_dep_name, Gtk.PositionType.BOTTOM);
+				previous_dep_name = dep_button;
 				if (add_install_button) {
-					var box2 = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 12);
-					box2.homogeneous = false;
-					var dep_button = new Gtk.Button.with_label (dep);
-					dep_button.relief = Gtk.ReliefStyle.NONE;
-					dep_button.clicked.connect (on_dep_button_clicked);
-					box2.pack_start (dep_button, false);
 					if (transaction.find_installed_satisfier (dep).name == "") {
 						var install_dep_button = new Gtk.ToggleButton.with_label (dgettext (null, "Install"));
 						install_dep_button.margin = 3;
+						install_dep_button.halign = Gtk.Align.START;
 						install_dep_button.toggled.connect (on_install_dep_button_toggled);
-						box2.pack_end (install_dep_button, false);
+						dep_name_grid.attach_next_to (install_dep_button, dep_button, Gtk.PositionType.RIGHT);
 						string dep_name = find_install_button_dep_name (install_dep_button);
 						install_dep_button.active = (dep_name in transaction.to_install); 
 					}
-					box.pack_start (box2);
-				} else {
-					var dep_button = new Gtk.Button.with_label (dep);
-					dep_button.relief = Gtk.ReliefStyle.NONE;
-					dep_button.halign = Gtk.Align.START;
-					dep_button.clicked.connect (on_dep_button_clicked);
-					box.pack_start (dep_button, false);
 				}
 			}
-			deps_grid.attach_next_to (box, label, Gtk.PositionType.RIGHT);
+			deps_grid.attach_next_to (dep_name_grid, label, Gtk.PositionType.RIGHT);
 			return label as Gtk.Widget;
 		}
 
@@ -575,11 +661,81 @@ namespace Pamac {
 			widget.destroy ();
 		}
 
-		void set_package_details (string pkgname) {
-			AlpmPackageDetails details = transaction.get_pkg_details (pkgname);
+		async Gdk.Pixbuf get_screenshot_pixbuf (string url) {
+			var uri = File.new_for_uri (url);
+			var cached_screenshot = File.new_for_path ("/tmp/pamac-app-screenshots/%s".printf (uri.get_basename ()));
+			Gdk.Pixbuf pixbuf = null;
+			if (cached_screenshot.query_exists ()) {
+				try {
+					pixbuf = new Gdk.Pixbuf.from_file (cached_screenshot.get_path ());
+				} catch (GLib.Error e) {
+					stderr.printf ("%s: %s\n", url, e.message);
+				}
+			} else {
+				// download screenshot
+				var session = new Soup.Session ();
+				var utsname = Posix.utsname();
+				session.user_agent = "pamac (%s %s)".printf (utsname.sysname, utsname.machine);
+				try {
+					var request = session.request (url);
+					try {
+						var inputstream = yield request.send_async (null);
+						pixbuf = new Gdk.Pixbuf.from_stream (inputstream);
+						// scale pixbux at a width of 600 pixels
+						int width = pixbuf.get_width ();
+						if (width > 600) {
+							float ratio = (float) width / (float) pixbuf.get_height ();
+							int new_height = (int) (600 / ratio);
+							pixbuf = pixbuf.scale_simple (600, new_height, Gdk.InterpType.BILINEAR);
+						}
+						// save scaled image in tmp
+						FileOutputStream os = cached_screenshot.append_to (FileCreateFlags.NONE);
+						pixbuf.save_to_stream (os, "png");
+					} catch (GLib.Error e) {
+						stderr.printf ("%s: %s\n", url, e.message);
+					}
+				} catch (GLib.Error e) {
+					stderr.printf ("%s: %s\n", url, e.message);
+				}
+			}
+			return pixbuf;
+		}
+
+		void set_package_details (string pkgname, string app_name) {
+			AlpmPackageDetails details = transaction.get_pkg_details (pkgname, app_name);
+			// download screenshot
+			app_screenshot.pixbuf = null;
+			if (details.screenshot != "") {
+				get_screenshot_pixbuf.begin (details.screenshot, (obj, res) => {
+					var pixbuf = get_screenshot_pixbuf.end (res);
+					app_screenshot.pixbuf = pixbuf;
+				});
+			}
 			// infos
-			name_label.set_markup ("<big><b>%s  %s</b></big>".printf (details.name, details.version));
+			if (details.app_name == "") {
+				name_label.set_markup ("<big><b>%s  %s</b></big>".printf (details.name, details.version));
+				app_image.pixbuf = package_icon;
+			} else {
+				name_label.set_markup ("<big><b>%s (%s)  %s</b></big>".printf (Markup.escape_text (details.app_name), details.name, details.version));
+				if (details.icon != "") {
+					try {
+						var pixbuf = new Gdk.Pixbuf.from_file (details.icon);
+						app_image.pixbuf = pixbuf;
+					} catch (GLib.Error e) {
+						app_image.pixbuf = package_icon;
+						stderr.printf ("%s: %s\n", details.icon, e.message);
+					}
+				} else {
+					app_image.pixbuf = package_icon;
+				}
+			}
 			desc_label.set_text (details.desc);
+			if (details.long_desc == "") {
+				long_desc_label.visible = false;
+			} else {
+				long_desc_label.set_text (details.long_desc);
+				long_desc_label.visible = true;
+			}
 			string escaped_url = Markup.escape_text (details.url);
 			link_label.set_markup ("<a href=\"%s\">%s</a>".printf (escaped_url, escaped_url));
 			StringBuilder licenses = new StringBuilder ();
@@ -727,14 +883,17 @@ namespace Pamac {
 		}
 
 		void set_aur_details (string pkgname) {
+			app_image.pixbuf = null;
+			app_screenshot.pixbuf = null;
 			name_label.set_text ("");
 			desc_label.set_text ("");
 			link_label.set_text ("");
 			licenses_label.set_text ("");
+			long_desc_label.visible = false;
 			remove_togglebutton.visible = false;
 			reinstall_togglebutton.visible = false;
 			install_togglebutton.visible = false;
-			properties_stackswitcher.visible = false;
+			properties_stacksidebar.visible = false;
 			details_grid.foreach (destroy_widget);
 			deps_grid.foreach (destroy_widget);
 			this.get_window ().set_cursor (new Gdk.Cursor.for_display (Gdk.Display.get_default (), Gdk.CursorType.WATCH));
@@ -745,6 +904,7 @@ namespace Pamac {
 				AURPackageDetails details = transaction.get_aur_details.end (res);
 				// infos
 				name_label.set_markup ("<big><b>%s  %s</b></big>".printf (details.name, details.version));
+				app_image.pixbuf = package_icon;
 				desc_label.set_text (details.desc);
 				string aur_url = "http://aur.archlinux.org/packages/" + details.name;
 				string escaped_url = Markup.escape_text (details.url);
@@ -765,7 +925,7 @@ namespace Pamac {
 					remove_togglebutton.active = transaction.to_remove.contains (pkg.name);
 				}
 				// details
-				properties_stackswitcher.visible = true;
+				properties_stacksidebar.visible = true;
 				details_grid.foreach (destroy_widget);
 				Gtk.Widget? previous_widget = null;
 				if (details.packagebase != details.name) {
@@ -774,14 +934,11 @@ namespace Pamac {
 				if (details.maintainer != "") {
 					previous_widget = populate_details_grid (dgettext (null, "Maintainer"), details.maintainer, previous_widget);
 				}
-				GLib.Time time = GLib.Time.local ((time_t) details.firstsubmitted);
-				previous_widget = populate_details_grid (dgettext (null, "First Submitted"), time.format ("%a %d %b %Y %X %Z"), previous_widget);
-				time = GLib.Time.local ((time_t) details.lastmodified);
-				previous_widget = populate_details_grid (dgettext (null, "Last Modified"), time.format ("%a %d %b %Y %X %Z"), previous_widget);
+				previous_widget = populate_details_grid (dgettext (null, "First Submitted"), details.firstsubmitted, previous_widget);
+				previous_widget = populate_details_grid (dgettext (null, "Last Modified"), details.lastmodified, previous_widget);
 				previous_widget = populate_details_grid (dgettext (null, "Votes"), details.numvotes.to_string (), previous_widget);
-				if (details.outofdate != 0) {
-					time = GLib.Time.local ((time_t) details.outofdate);
-					previous_widget = populate_details_grid (dgettext (null, "Out of Date"), time.format ("%a %d %b %Y %X %Z"), previous_widget);
+				if (details.outofdate != "") {
+					previous_widget = populate_details_grid (dgettext (null, "Out of Date"), details.outofdate, previous_widget);
 				}
 				details_grid.show_all ();
 				// deps
@@ -888,10 +1045,26 @@ namespace Pamac {
 			packages_treeview.freeze_notify ();
 			packages_treeview.freeze_child_notify ();
 			packages_list.clear ();
+			// scroll to top
+			packages_scrolledwindow.vadjustment.value = 0;
+			if (pkgs.length == 0) {
+				origin_stack.visible_child_name = "no_item";
+				packages_treeview.thaw_child_notify ();
+				packages_treeview.thaw_notify ();
+				this.get_window ().set_cursor (null);
+				return;
+			}
 			foreach (unowned AlpmPackage pkg in pkgs) {
 				string version;
 				uint64 size;
 				string size_str;
+				string summary;
+				Gdk.Pixbuf pixbuf = null;
+				if (pkg.app_name == "") {
+					summary = "<b>%s</b>\n%s".printf (pkg.name, Markup.escape_text (pkg.desc));
+				} else {
+					summary = "<b>%s  (%s)</b>\n%s".printf (Markup.escape_text (pkg.app_name), pkg.name, Markup.escape_text (pkg.desc));
+				}
 				if (filters_stack.visible_child_name == "updates") {
 					version = "<b>%s</b>\n(%s)".printf (pkg.version, pkg.installed_version);
 					size = pkg.download_size;
@@ -901,14 +1074,37 @@ namespace Pamac {
 					size = pkg.size;
 					size_str = GLib.format_size (pkg.size);
 				}
+				if (pkg.icon != "") {
+					try {
+						pixbuf = new Gdk.Pixbuf.from_file_at_scale (pkg.icon, 32, 32, true);
+					} catch (GLib.Error e) {
+						// some icons are not in the right repo
+						string icon = pkg.icon;
+						if ("extra" in pkg.icon) {
+							icon = pkg.icon.replace ("extra", "community");
+						} else if ("community" in pkg.icon) {
+							icon = pkg.icon.replace ("community", "extra");
+						}
+						try {
+							pixbuf = new Gdk.Pixbuf.from_file_at_scale (icon, 32, 32, true);
+						} catch (GLib.Error e) {
+							pixbuf = package_icon.scale_simple (32, 32, Gdk.InterpType.BILINEAR);
+							stderr.printf ("%s: %s\n", pkg.icon, e.message);
+						}
+					}
+				} else {
+					pixbuf = package_icon.scale_simple (32, 32, Gdk.InterpType.BILINEAR);
+				}
 				packages_list.insert_with_values (null, -1,
 												0, pkg.origin,
 												1, pkg.name,
-												2, "<b>%s</b>\n%s".printf (pkg.name, Markup.escape_text (pkg.desc)),
+												2, summary,
 												3, version,
 												4, pkg.repo,
 												5, size,
-												6, size_str);
+												6, size_str,
+												7, pkg.app_name,
+												8, pixbuf);
 			}
 			packages_treeview.thaw_child_notify ();
 			packages_treeview.thaw_notify ();
@@ -920,6 +1116,15 @@ namespace Pamac {
 			aur_treeview.freeze_notify ();
 			aur_treeview.freeze_child_notify ();
 			aur_list.clear ();
+			// scroll to top
+			aur_scrolledwindow.vadjustment.value = 0;
+			if (pkgs.length == 0) {
+				origin_stack.visible_child_name = "no_item";
+				aur_treeview.thaw_child_notify ();
+				aur_treeview.thaw_notify ();
+				this.get_window ().set_cursor (null);
+				return;
+			}
 			foreach (unowned AURPackage aur_pkg in pkgs) {
 				string version;
 				if (filters_stack.visible_child_name == "updates") {
@@ -935,53 +1140,86 @@ namespace Pamac {
 											2, "<b>%s</b>\n%s".printf (aur_pkg.name, Markup.escape_text (aur_pkg.desc)),
 											3, version,
 											4, aur_pkg.popularity,
-											5, "%.2f".printf (aur_pkg.popularity));
+											5, "%.2f".printf (aur_pkg.popularity),
+											6, package_icon.scale_simple (32, 32, Gdk.InterpType.BILINEAR));
 			}
 			aur_treeview.thaw_child_notify ();
 			aur_treeview.thaw_notify ();
 			this.get_window ().set_cursor (null);
 		}
 
-		void refresh_packages_list () {
+		public void refresh_packages_list () {
+			if (filters_stack.visible_child_name != "search") {
+				searchbar.search_mode_enabled = false;
+				search_button.active = false;
+				origin_stack.visible_child_name = "repos";
+			}
+			if (filters_stack.visible_child_name != "pending") {
+				uint total_pending = transaction.to_install.length + transaction.to_remove.length + transaction.to_build.length;
+				if (total_pending == 0) {
+					pending_stacksidebar.visible = false;
+					updates_stacksidebar.visible = true;
+				}
+			}
 			switch (filters_stack.visible_child_name) {
-				case "search":
-					aur_list.clear ();
-					filters_stack.visible = true;
+				case "categories":
+					show_sidebar ();
 					set_pendings_operations ();
-					packages_stackswitcher.visible = transaction.enable_aur;
-					if (packages_stack.visible_child_name == "updated") {
-						packages_stack.visible_child_name = "repos";
-					}
-					Gtk.TreeSelection selection = search_treeview.get_selection ();
-					if (selection.get_selected (null, null)) {
-						on_search_treeview_selection_changed ();
+					on_categories_listbox_row_activated (categories_listbox.get_selected_row ());
+					break;
+				case "search":
+					if (search_string != null) {
+						if (transaction.enable_aur) {
+							show_sidebar ();
+						} else {
+							hide_sidebar ();
+						}
+						if (show_last_search) {
+							// select lest search_string
+							bool found = false;
+							search_comboboxtext.get_model ().foreach ((model, path, iter) => {
+								string line;
+								model.get (iter, 0, out line);
+								if (line == search_string) {
+									found = true;
+									// we select the iter in search list
+									// it will populate the packages list with the comboboxtext changed signal
+									search_comboboxtext.set_active_iter (null);
+									search_comboboxtext.set_active_iter (iter);
+								}
+								return found;
+							});
+						}
 					} else {
-						show_default_pkgs ();
-						search_entry.grab_focus ();
+						hide_sidebar ();
+						if (origin_stack.visible_child_name != "repos") {
+							// add a timeout for a smooth transition
+							Timeout.add (250, () => {
+								origin_stack.visible_child_name = "repos";
+								show_default_pkgs ();
+								return false;
+							});
+						}
+						// else do not modify packages list
 					}
 					break;
 				case "groups":
-					filters_stack.visible = true;
+					show_sidebar ();
 					set_pendings_operations ();
-					packages_stack.visible_child_name = "repos";
-					packages_stackswitcher.visible = false;
-					on_groups_treeview_selection_changed ();
+					on_groups_listbox_row_activated (groups_listbox.get_selected_row ());
 					break;
-				case "states":
-					filters_stack.visible = true;
+				case "installed":
+					show_sidebar ();
 					set_pendings_operations ();
-					packages_stack.visible_child_name = "repos";
-					packages_stackswitcher.visible = false;
-					on_states_treeview_selection_changed ();
+					on_installed_listbox_row_activated (installed_listbox.get_selected_row ());
 					break;
 				case "repos":
-					filters_stack.visible = true;
+					show_sidebar ();
 					set_pendings_operations ();
-					packages_stack.visible_child_name = "repos";
-					packages_stackswitcher.visible = false;
-					on_repos_treeview_selection_changed ();
+					on_repos_listbox_row_activated (repos_listbox.get_selected_row ());
 					break;
 				case "updates":
+					hide_sidebar ();
 					packages_list.clear ();
 					aur_list.clear ();
 					var attention_val = GLib.Value (typeof (bool));
@@ -989,22 +1227,81 @@ namespace Pamac {
 					filters_stack.child_set_property (filters_stack.get_child_by_name ("updates"),
 														"needs-attention",
 														attention_val);
-					filters_stack.visible = false;
-					packages_stack.visible_child_name = "repos";
-					packages_stackswitcher.visible = false;
-					apply_button.visible = false;
-					this.get_window ().set_cursor (new Gdk.Cursor.for_display (Gdk.Display.get_default (), Gdk.CursorType.WATCH));
-					transaction.start_get_updates ();
+					if (updates_checked) {
+						populate_updates ();
+					} else {
+						apply_button.sensitive = false;
+						this.get_window ().set_cursor (new Gdk.Cursor.for_display (Gdk.Display.get_default (), Gdk.CursorType.WATCH));
+						transaction.start_get_updates ();
+					}
+					break;
+				case "pending":
+					if (transaction.to_build.length != 0) {
+						show_sidebar ();
+					} else {
+						hide_sidebar ();
+					}
+					var attention_val = GLib.Value (typeof (bool));
+					attention_val.set_boolean (false);
+					filters_stack.child_set_property (filters_stack.get_child_by_name ("pending"),
+													"needs-attention",
+													attention_val);
+					AlpmPackage[] pkgs = {};
+					foreach (unowned string pkgname in transaction.to_install) {
+						AlpmPackage pkg = transaction.get_installed_pkg (pkgname);
+						if (pkg.name == "") {
+							pkg = transaction.get_sync_pkg (pkgname);
+						}
+						if (pkg.name != "") {
+							pkgs += pkg;
+						}
+					}
+					foreach (unowned string pkgname in transaction.to_remove) {
+						AlpmPackage pkg = transaction.get_installed_pkg (pkgname);
+						if (pkg.name != "") {
+							pkgs += pkg;
+						}
+					}
+					populate_packages_list (pkgs);
+					if (transaction.to_build.length != 0) {
+						AURPackage[] aur_pkgs = {};
+						foreach (unowned string pkgname in transaction.to_build) {
+							transaction.get_aur_details.begin (pkgname, (obj, res) => {
+								AURPackageDetails details_pkg = transaction.get_aur_details.end (res);
+								if (details_pkg.name != "") {
+									var aur_pkg = AURPackage () {
+										name = details_pkg.name,
+										version = details_pkg.version,
+										installed_version = "",
+										desc = details_pkg.desc,
+										popularity = details_pkg.popularity
+									};
+									aur_pkgs += aur_pkg;
+									populate_aur_list (aur_pkgs);
+									if (aur_pkgs.length > 0 ) {
+										if (pkgs.length == 0) {
+											origin_stack.visible_child_name = "aur";
+										} else {
+											attention_val.set_boolean (true);
+											origin_stack.child_set_property (origin_stack.get_child_by_name ("aur"),
+																				"needs-attention",
+																				attention_val);
+										}
+									}
+								}
+							});
+						}
+					}
 					break;
 				default:
 					break;
 			}
 		}
 
-		void display_package_properties (string pkgname) {
+		void display_package_properties (string pkgname, string app_name = "") {
 			current_package_displayed = pkgname;
 			files_scrolledwindow.visible = true;
-			set_package_details (current_package_displayed);
+			set_package_details (current_package_displayed, app_name);
 		}
 
 		void display_aur_properties (string pkgname) {
@@ -1024,8 +1321,9 @@ namespace Pamac {
 				Gtk.TreeIter iter;
 				packages_list.get_iter (out iter, path);
 				string pkgname;
-				packages_list.get (iter, 1, out pkgname);
-				display_package_properties (pkgname);
+				string app_name;
+				packages_list.get (iter, 1, out pkgname, 7, out app_name);
+				display_package_properties (pkgname, app_name);
 				this.get_window ().set_cursor (null);
 			}
 		}
@@ -1268,47 +1566,65 @@ namespace Pamac {
 			set_pendings_operations ();
 		}
 
-		void on_packages_stack_visible_child_changed () {
-			// do nothing if it we want to see pendings AUR operations
-			switch (filters_stack.visible_child_name) {
-				case "search":
-					Gtk.TreeIter iter;
-					Gtk.TreeSelection selection = search_treeview.get_selection ();
-					if (selection.get_selected (null, out iter)) {
+		void on_origin_stack_visible_child_changed () {
+			switch (origin_stack.visible_child_name) {
+				case "repos":
+					if (filters_stack.visible_child_name == "search") {
+						Timeout.add (200, () => {
+							search_entry.grab_focus_without_selecting ();
+							search_entry.set_position (-1);
+							return false;
+						});
+						if (search_string == null) {
+							return;
+						}
 						this.get_window ().set_cursor (new Gdk.Cursor.for_display (Gdk.Display.get_default (), Gdk.CursorType.WATCH));
 						while (Gtk.events_pending ()) {
 							Gtk.main_iteration ();
 						}
-						string search_string;
-						search_list.get (iter, 0, out search_string);
-						switch (packages_stack.visible_child_name) {
-							case "repos":
-								transaction.search_pkgs.begin (search_string, (obj, res) => {
-									// get custom sort by relevance
-									packages_list.set_sort_column_id (Gtk.TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID, 0);
-									populate_packages_list (transaction.search_pkgs.end (res));
-								});
-								break;
-							case "aur":
-								transaction.search_in_aur.begin (search_string, (obj, res) => {
-									populate_aur_list (transaction.search_in_aur.end (res));
-								});
-								break;
-							default:
-								break;
+						transaction.search_pkgs.begin (search_string, (obj, res) => {
+							// get custom sort by relevance
+							packages_list.set_sort_column_id (Gtk.TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID, 0);
+							populate_packages_list (transaction.search_pkgs.end (res));
+						});
+					} else if (filters_stack.visible_child_name == "updates") {
+						populate_packages_list (repos_updates);
+					} else if (filters_stack.visible_child_name == "pending") {
+						if ((transaction.to_install.length + transaction.to_remove.length) == 0) {
+							origin_stack.visible_child_name = "no_item";
+						}
+					}
+					break;
+				case "aur":
+					if (filters_stack.visible_child_name == "search") {
+						Timeout.add (200, () => {
+							search_entry.grab_focus_without_selecting ();
+							search_entry.set_position (-1);
+							return false;
+						});
+						if (search_string == null) {
+							origin_stack.visible_child_name = "no_item";
+							return;
+						}
+						this.get_window ().set_cursor (new Gdk.Cursor.for_display (Gdk.Display.get_default (), Gdk.CursorType.WATCH));
+						while (Gtk.events_pending ()) {
+							Gtk.main_iteration ();
 						}
+						transaction.search_in_aur.begin (search_string, (obj, res) => {
+							populate_aur_list (transaction.search_in_aur.end (res));
+						});
+						var attention_val = GLib.Value (typeof (bool));
+						attention_val.set_boolean (false);
+						origin_stack.child_set_property (origin_stack.get_child_by_name ("aur"),
+															"needs-attention",
+															attention_val);
+					} else if (filters_stack.visible_child_name == "updates") {
+						populate_aur_list (aur_updates);
 					}
 					break;
 				default:
 					break;
 			}
-			if (packages_stack.visible_child_name == "aur") {
-				var attention_val = GLib.Value (typeof (bool));
-				attention_val.set_boolean (false);
-				packages_stack.child_set_property (packages_stack.get_child_by_name ("aur"),
-													"needs-attention",
-													attention_val);
-			}
 		}
 
 		[GtkCallback]
@@ -1474,106 +1790,103 @@ namespace Pamac {
 			return false;
 		}
 
+		void on_search_mode_enabled () {
+			if (searchbar.search_mode_enabled) {
+				filters_stack.visible_child_name = "search";
+				// do it after change filters stack child
+				//  so show_last_search=false if we "type to search" 
+				search_button.active = true;
+				set_pendings_operations ();
+			}
+		}
+
 		[GtkCallback]
-		void on_search_entry_activate () {
-			string search_string = search_entry.get_text ().strip ();
-			if (search_string != "") {
-				this.get_window ().set_cursor (new Gdk.Cursor.for_display (Gdk.Display.get_default (), Gdk.CursorType.WATCH));
-				Gtk.TreeModel model;
-				Gtk.TreeIter iter;
-				Gtk.TreeSelection selection = search_treeview.get_selection ();
-				// add search string in search_list if needed
-				bool found = false;
-				// check if search string is already selected in search list
-				if (selection.get_selected (out model, out iter)) {
-					string selected_string;
-					model.get (iter, 0, out selected_string);
-					if (selected_string == search_string) {
-						on_search_treeview_selection_changed ();
-						found = true;
-					}
-				}
-				// check if search string exists in search list
-				if (!found) {
-					search_list.foreach ((_model, _path, _iter) => {
-						string line;
-						_model.get (_iter, 0, out line);
-						if (line == search_string) {
-							found = true;
-							// we select the iter in search_list
-							// it will populate the list with the selection changed signal
-							selection.select_iter (_iter);
-						}
-						return found;
-					});
-				}
-				if (!found) {
-					search_list.insert_with_values (out iter, -1, 0, search_string);
-					// we select the iter in search_list
-					// it will populate the list with the selection changed signal
-					selection.select_iter (iter);
-				}
+		void on_search_button_toggled () {
+			if (search_button.active) {
+				show_last_search = true;
+				searchbar.search_mode_enabled = true;
+			} else {
+				searchbar.search_mode_enabled = false;
 			}
 		}
 
 		bool search_entry_timeout_callback () {
-			on_search_entry_activate ();
+			// add search string in search_list if needed
+			string tmp_search_string = search_comboboxtext.get_active_text ().strip ();
+			if (tmp_search_string == "") {
+				search_entry_timeout_id = 0;
+				return false;
+			}
+			bool found = false;
+			// check if search string exists in search list
+			search_comboboxtext.get_model ().foreach ((model, path, iter) => {
+				string line;
+				model.get (iter, 0, out line);
+				if (line == tmp_search_string) {
+					found = true;
+					// we select the iter in search list
+					// it will populate the packages list with the comboboxtext changed signal
+					search_comboboxtext.set_active_iter (iter);
+				}
+				return found;
+			});
+			if (!found) {
+				Gtk.TreeIter iter;
+				var store = search_comboboxtext.get_model () as Gtk.ListStore;
+				store.insert_with_values (out iter, -1, 0, tmp_search_string);
+				// we select the iter in search list
+				// it will populate the packages list with the comboboxtext changed signal
+				search_comboboxtext.set_active_iter (iter);
+			}
 			search_entry_timeout_id = 0;
 			return false;
 		}
 
 		[GtkCallback]
-		void on_search_entry_changed () {
-			if (search_entry.get_text ().strip () != "") {
-				if (search_entry_timeout_id != 0) {
-					Source.remove (search_entry_timeout_id);
+		void on_search_comboboxtext_changed () {
+			if (search_comboboxtext.get_active () == -1) {
+				// entry was edited
+				if (search_comboboxtext.get_active_text ().strip () != "") {
+					if (search_entry_timeout_id != 0) {
+						Source.remove (search_entry_timeout_id);
+					}
+					search_entry_timeout_id = Timeout.add (500, search_entry_timeout_callback);
 				}
-				search_entry_timeout_id = Timeout.add (750, search_entry_timeout_callback);
-			}
-		}
-
-		[GtkCallback]
-		void on_search_treeview_selection_changed () {
-			Gtk.TreeIter iter;
-			Gtk.TreeSelection selection = search_treeview.get_selection ();
-			if (selection.get_selected (null, out iter)) {
+			} else {
+				// a history line was choosen
 				this.get_window ().set_cursor (new Gdk.Cursor.for_display (Gdk.Display.get_default (), Gdk.CursorType.WATCH));
-				string search_string;
-				search_list.get (iter, 0, out search_string);
-				// change search entry text to the selected one
-				search_entry.changed.disconnect (on_search_entry_changed);
-				search_entry.set_text (search_string);
-				search_entry.changed.connect (on_search_entry_changed);
+				search_string = search_comboboxtext.get_active_text ();
 				Timeout.add (200, () => {
 					search_entry.grab_focus_without_selecting ();
+					search_entry.set_position (-1);
 					return false;
 				});
-				search_entry.set_position (-1);
-				switch (packages_stack.visible_child_name) {
+				switch (origin_stack.visible_child_name) {
 					case "repos":
 						transaction.search_pkgs.begin (search_string, (obj, res) => {
+							if (transaction.enable_aur) {
+								show_sidebar ();
+							} else {
+								hide_sidebar ();
+							}
 							var pkgs = transaction.search_pkgs.end (res);
 							// get custom sort by relevance
 							packages_list.set_sort_column_id (Gtk.TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID, 0);
 							populate_packages_list (pkgs);
 							if (transaction.search_aur) {
-								if (pkgs.length == 0) {
-									transaction.search_in_aur.begin (search_string, (obj, res) => {
-										if (transaction.search_in_aur.end (res).length != 0) {
-											packages_stack.visible_child_name = "aur";
-										}
-									});
-								} else {
-									transaction.search_in_aur.begin (search_string, (obj, res) => {
-										if (transaction.search_in_aur.end (res).length != 0) {
+								transaction.search_in_aur.begin (search_string, (obj, res) => {
+									if (transaction.search_in_aur.end (res).length > 0) {
+										if (pkgs.length > 0) {
 											var attention_val = GLib.Value (typeof (bool));
 											attention_val.set_boolean (true);
-											packages_stack.child_set_property (packages_stack.get_child_by_name ("aur"),
+											origin_stack.child_set_property (origin_stack.get_child_by_name ("aur"),
 																				"needs-attention",
 																				attention_val);
+										} else {
+											origin_stack.visible_child_name = "aur";
 										}
-									});
-								}
+									}
+								});
 							}
 						});
 						aur_list.clear ();
@@ -1584,6 +1897,12 @@ namespace Pamac {
 						});
 						packages_list.clear ();
 						break;
+					case "updated":
+						origin_stack.visible_child_name = "repos";
+						break;
+					case "no_item":
+						origin_stack.visible_child_name = "repos";
+						break;
 					default:
 						break;
 				}
@@ -1591,127 +1910,120 @@ namespace Pamac {
 		}
 
 		[GtkCallback]
-		void on_groups_treeview_selection_changed () {
-			Gtk.TreeIter iter;
-			Gtk.TreeSelection selection = groups_treeview.get_selection ();
-			if (selection.get_selected (null, out iter)) {
-				this.get_window ().set_cursor (new Gdk.Cursor.for_display (Gdk.Display.get_default (), Gdk.CursorType.WATCH));
-				string group_name;
-				groups_list.get (iter, 0, out group_name);
-				transaction.get_group_pkgs.begin (group_name, (obj, res) => {
-					populate_packages_list (transaction.get_group_pkgs.end (res));
-				});
+		void on_search_entry_icon_press (Gtk.EntryIconPosition pos, Gdk.Event event) {
+			if (pos == Gtk.EntryIconPosition.SECONDARY) {
+				search_entry.set_text ("");
 			}
 		}
 
 		[GtkCallback]
-		void on_states_treeview_selection_changed () {
-			Gtk.TreeIter iter;
-			Gtk.TreeSelection selection = states_treeview.get_selection ();
-			if (selection.get_selected (null, out iter)) {
-				this.get_window ().set_cursor (new Gdk.Cursor.for_display (Gdk.Display.get_default (), Gdk.CursorType.WATCH));
-				packages_stackswitcher.visible = false;
-				string state;
-				states_list.get (iter, 0, out state);
-				if (state == dgettext (null, "Installed")) {
-					transaction.get_installed_pkgs.begin ((obj, res) => {
-						populate_packages_list (transaction.get_installed_pkgs.end (res));
-					});
-				} else if (state == dgettext (null, "Explicitly installed")) {
-					transaction.get_explicitly_installed_pkgs.begin ((obj, res) => {
-						populate_packages_list (transaction.get_explicitly_installed_pkgs.end (res));
-					});
-				} else if (state == dgettext (null, "Orphans")) {
-					transaction.get_orphans.begin ((obj, res) => {
-						populate_packages_list (transaction.get_orphans.end (res));
-					});
-				} else if (state == dgettext (null, "Foreign")) {
-					transaction.get_foreign_pkgs.begin ((obj, res) => {
-						populate_packages_list (transaction.get_foreign_pkgs.end (res));
-					});
-				} else if (state == dgettext (null, "Pending")) {
-					AlpmPackage[] pkgs = {};
-					foreach (unowned string pkgname in transaction.to_install) {
-						AlpmPackage pkg = transaction.get_installed_pkg (pkgname);
-						if (pkg.name == "") {
-							pkg = transaction.get_sync_pkg (pkgname);
-						}
-						if (pkg.name != "") {
-							pkgs += pkg;
-						}
-					}
-					foreach (unowned string pkgname in transaction.to_remove) {
-						AlpmPackage pkg = transaction.get_installed_pkg (pkgname);
-						if (pkg.name != "") {
-							pkgs += pkg;
-						}
-					}
-					populate_packages_list (pkgs);
-					if (transaction.to_build.length != 0) {
-						packages_stackswitcher.visible = true;
-						AURPackage[] aur_pkgs = {};
-						foreach (unowned string pkgname in transaction.to_build) {
-							transaction.get_aur_details.begin (pkgname, (obj, res) => {
-								AURPackageDetails details_pkg = transaction.get_aur_details.end (res);
-								if (details_pkg.name != "") {
-									var aur_pkg = AURPackage () {
-										name = details_pkg.name,
-										version = details_pkg.version,
-										desc = details_pkg.desc,
-										popularity = details_pkg.popularity
-									};
-									aur_pkgs += aur_pkg;
-									populate_aur_list (aur_pkgs);
-									if (aur_pkgs.length > 0 ) {
-										if (pkgs.length == 0) {
-											packages_stack.visible_child_name = "aur";
-										} else {
-											var attention_val = GLib.Value (typeof (bool));
-											attention_val.set_boolean (true);
-											packages_stack.child_set_property (packages_stack.get_child_by_name ("aur"),
-																				"needs-attention",
-																				attention_val);
-										}
-									}
-								}
-							});
-						}
-					}
-				}
-			}
+		void on_categories_listbox_row_activated (Gtk.ListBoxRow row) {
+			this.get_window ().set_cursor (new Gdk.Cursor.for_display (Gdk.Display.get_default (), Gdk.CursorType.WATCH));
+			var label = row.get_child () as Gtk.Label;
+			string matching_cat = "";
+			string category = label.label;
+			if (category == dgettext (null, "Accessories")) {
+				matching_cat = "Utility";
+			} else if (category == dgettext (null, "Audio & Video")) {
+				matching_cat = "AudioVideo";
+			} else if (category == dgettext (null, "Development")) {
+				matching_cat = "Development";
+			} else if (category == dgettext (null, "Education")) {
+				matching_cat = "Education";
+			} else if (category == dgettext (null, "Games")) {
+				matching_cat = "Game";
+			} else if (category == dgettext (null, "Graphics")) {
+				matching_cat = "Graphics";
+			} else if (category == dgettext (null, "Internet")) {
+				matching_cat = "Network";
+			} else if (category == dgettext (null, "Office")) {
+				matching_cat = "Office";
+			} else if (category == dgettext (null, "Science")) {
+				matching_cat = "Science";
+				} else if (category == dgettext (null, "Settings")) {
+				matching_cat = "Settings";
+			} else if (category == dgettext (null, "System Tools")) {
+				matching_cat = "System";
+			}
+			// get sort by app_name
+			packages_list.set_sort_column_id (2, Gtk.SortType.ASCENDING);
+			transaction.get_category_pkgs.begin (matching_cat, (obj, res) => {
+				populate_packages_list (transaction.get_category_pkgs.end (res));
+			});
 		}
 
 		[GtkCallback]
-		void on_repos_treeview_selection_changed () {
-			Gtk.TreeIter iter;
-			Gtk.TreeSelection selection = repos_treeview.get_selection ();
-			if (selection.get_selected (null, out iter)) {
-				this.get_window ().set_cursor (new Gdk.Cursor.for_display (Gdk.Display.get_default (), Gdk.CursorType.WATCH));
-				string repo;
-				repos_list.get (iter, 0, out repo);
-				transaction.get_repo_pkgs.begin (repo, (obj, res) => {
-					populate_packages_list (transaction.get_repo_pkgs.end (res));
+		void on_groups_listbox_row_activated (Gtk.ListBoxRow row) {
+			this.get_window ().set_cursor (new Gdk.Cursor.for_display (Gdk.Display.get_default (), Gdk.CursorType.WATCH));
+			var label = row.get_child () as Gtk.Label;
+			string group_name = label.label;
+			transaction.get_group_pkgs.begin (group_name, (obj, res) => {
+				populate_packages_list (transaction.get_group_pkgs.end (res));
+			});
+		}
+
+		[GtkCallback]
+		void on_installed_listbox_row_activated (Gtk.ListBoxRow row) {
+			this.get_window ().set_cursor (new Gdk.Cursor.for_display (Gdk.Display.get_default (), Gdk.CursorType.WATCH));
+			origin_stack.visible_child_name = "repos";
+			var label = row.get_child () as Gtk.Label;
+			string state = label.label;
+			if (state == dgettext (null, "Installed")) {
+				transaction.get_installed_pkgs.begin ((obj, res) => {
+					populate_packages_list (transaction.get_installed_pkgs.end (res));
+				});
+			} else if (state == dgettext (null, "Explicitly installed")) {
+				transaction.get_explicitly_installed_pkgs.begin ((obj, res) => {
+					populate_packages_list (transaction.get_explicitly_installed_pkgs.end (res));
+				});
+			} else if (state == dgettext (null, "Orphans")) {
+				transaction.get_orphans.begin ((obj, res) => {
+					populate_packages_list (transaction.get_orphans.end (res));
+				});
+			} else if (state == dgettext (null, "Foreign")) {
+				transaction.get_foreign_pkgs.begin ((obj, res) => {
+					populate_packages_list (transaction.get_foreign_pkgs.end (res));
 				});
 			}
 		}
 
+		[GtkCallback]
+		void on_repos_listbox_row_activated (Gtk.ListBoxRow row) {
+			this.get_window ().set_cursor (new Gdk.Cursor.for_display (Gdk.Display.get_default (), Gdk.CursorType.WATCH));
+			var label = row.get_child () as Gtk.Label;
+			string repo = label.label;
+			transaction.get_repo_pkgs.begin (repo, (obj, res) => {
+				populate_packages_list (transaction.get_repo_pkgs.end (res));
+			});
+		}
+
 		void on_main_stack_visible_child_changed () {
 			switch (main_stack.visible_child_name) {
 				case "browse":
 					button_back.visible = false;
+					search_button.visible = true;
+					if (filters_stack.visible_child_name == "search") {
+						search_button.activate ();
+					}
 					filters_stackswitcher.visible = true;
 					details_button.sensitive = true;
 					break;
 				case "details":
 					button_back.visible = true;
+					searchbar.search_mode_enabled = false;
+					search_button.active = false;
+					search_button.visible = false;
 					filters_stackswitcher.visible = false;
 					details_button.sensitive = true;
 					break;
 				case "term":
-					filters_stackswitcher.visible = false;
 					button_back.visible = true;
-					details_button.get_style_context ().remove_class (Gtk.STYLE_CLASS_SUGGESTED_ACTION);
+					searchbar.search_mode_enabled = false;
+					search_button.active = false;
+					search_button.visible = false;
+					filters_stackswitcher.visible = false;
 					details_button.sensitive = false;
+					details_button.get_style_context ().remove_class (Gtk.STYLE_CLASS_SUGGESTED_ACTION);
 					break;
 				default:
 					break;
@@ -1749,7 +2061,7 @@ namespace Pamac {
 						text.prepend (line + "\n");
 					}
 				} catch (GLib.Error e) {
-					GLib.stderr.printf ("%s\n", e.message);
+					stderr.printf ("%s\n", e.message);
 				}
 				var history_dialog = new HistoryDialog (this);
 				history_dialog.textview.buffer.set_text (text.str, (int) text.len);
@@ -1842,18 +2154,7 @@ namespace Pamac {
 					main_stack.visible_child_name = "term";
 				} else {
 					main_stack.visible_child_name = "browse";
-					filters_stack.notify["visible-child"].disconnect (on_filters_stack_visible_child_changed);
-					filters_stack.visible_child_name = "states";
-					filters_stack.notify["visible-child"].connect (on_filters_stack_visible_child_changed);
-					Gtk.TreeIter iter;
-					// show "Pending" in states_list
-					// "Pending" is at indice 4
-					states_list.get_iter (out iter, new Gtk.TreePath.from_indices (4));
-					Gtk.TreeSelection selection = states_treeview.get_selection ();
-					selection.changed.disconnect (on_states_treeview_selection_changed);
-					selection.select_iter (iter);
-					selection.changed.connect_after (on_states_treeview_selection_changed);
-					refresh_packages_list ();
+					filters_stack.visible_child_name = "pending";
 				}
 			}
 		}
@@ -1873,7 +2174,7 @@ namespace Pamac {
 			transaction_running = true;
 			apply_button.sensitive = false;
 			cancel_button.sensitive = false;
-			transaction_infobox.show_all ();
+			show_transaction_infobox ();
 			transaction.run ();
 		}
 
@@ -1930,45 +2231,17 @@ namespace Pamac {
 			this.get_window ().set_cursor (new Gdk.Cursor.for_display (Gdk.Display.get_default (), Gdk.CursorType.WATCH));
 			apply_button.sensitive = false;
 			cancel_button.sensitive = true;
-			transaction_infobox.show_all ();
+			show_transaction_infobox ();
 			transaction.start_refresh (force_refresh);
 		}
 
 		void on_get_updates_finished (Updates updates) {
+			updates_checked = true;
+			repos_updates = updates.repos_updates;
+			aur_updates = updates.aur_updates;
 			if (filters_stack.visible_child_name == "updates") {
-				transaction.to_update.remove_all ();
-				packages_stackswitcher.visible = false;
-				if ((updates.repos_updates.length + updates.aur_updates.length) == 0) {
-					filters_stack.visible = false;
-					if (!refreshing && !transaction_running && !sysupgrade_running) {
-						transaction_infobox.visible = false;
-					}
-					packages_stack.visible_child_name = "updated";
-					this.get_window ().set_cursor (null);
-				} else {
-					if (updates.repos_updates.length > 0) {
-						foreach (unowned AlpmPackage pkg in updates.repos_updates) {
-							if (!transaction.temporary_ignorepkgs.contains (pkg.name)) {
-								transaction.to_update.add (pkg.name);
-							}
-						}
-						populate_packages_list (updates.repos_updates);
-					}
-					if (updates.aur_updates.length > 0) {
-						packages_stackswitcher.visible = true;
-						foreach (unowned AURPackage pkg in updates.aur_updates) {
-							if (!transaction.temporary_ignorepkgs.contains (pkg.name)) {
-								transaction.to_update.add (pkg.name);
-							}
-						}
-						populate_aur_list (updates.aur_updates);
-						if (updates.repos_updates.length == 0) {
-							packages_stack.visible_child_name = "aur";
-						}
-					}
-					set_pendings_operations ();
-				}
-			} else if ((updates.repos_updates.length + updates.aur_updates.length) > 0) {
+				populate_updates ();
+			} else if ((repos_updates.length + aur_updates.length) > 0) {
 				this.get_window ().set_cursor (null);
 				var attention_val = GLib.Value (typeof (bool));
 				attention_val.set_boolean (true);
@@ -1978,6 +2251,43 @@ namespace Pamac {
 			}
 		}
 
+		void populate_updates () {
+			transaction.to_update.remove_all ();
+			if ((repos_updates.length + aur_updates.length) == 0) {
+				if (!refreshing && !transaction_running && !sysupgrade_running) {
+					hide_transaction_infobox ();
+				}
+				origin_stack.visible_child_name = "updated";
+				this.get_window ().set_cursor (null);
+			} else {
+				if (repos_updates.length > 0) {
+					foreach (unowned AlpmPackage pkg in repos_updates) {
+						if (!transaction.temporary_ignorepkgs.contains (pkg.name)) {
+							transaction.to_update.add (pkg.name);
+						}
+					}
+				}
+				if (aur_updates.length > 0) {
+					foreach (unowned AURPackage pkg in aur_updates) {
+						if (!transaction.temporary_ignorepkgs.contains (pkg.name)) {
+							transaction.to_update.add (pkg.name);
+						}
+					}
+					show_sidebar ();
+				}
+				if (origin_stack.visible_child_name == "repos") {
+					if (repos_updates.length == 0) {
+						origin_stack.visible_child_name = "aur";
+					} else {
+						populate_packages_list (repos_updates);
+					}
+				} else if (origin_stack.visible_child_name == "aur") {
+					populate_aur_list (aur_updates);
+				}
+				set_pendings_operations ();
+			}
+		}
+
 		void on_start_downloading () {
 			cancel_button.sensitive = true;
 		}
@@ -2007,10 +2317,12 @@ namespace Pamac {
 		void on_generate_mirrors_list () {
 			generate_mirrors_list = true;
 			apply_button.sensitive = false;
-			transaction_infobox.show_all ();
+			show_transaction_infobox ();
 		}
 
 		void on_transaction_finished (bool success) {
+			updates_checked = false;
+			show_last_search = true;
 			transaction.refresh_handle ();
 			if (main_stack.visible_child_name == "details") {
 				if (transaction.get_installed_pkg (current_package_displayed).name != ""
diff --git a/src/package.vala b/src/package.vala
index bbb6282b..699c2914 100644
--- a/src/package.vala
+++ b/src/package.vala
@@ -20,6 +20,7 @@
 namespace Pamac {
 	public struct AlpmPackage {
 		public string name;
+		public string app_name;
 		public string version;
 		public string installed_version;
 		public string desc;
@@ -27,15 +28,20 @@ namespace Pamac {
 		public uint64 size;
 		public uint64 download_size;
 		public uint origin;
+		public string icon;
 	}
 
 	public struct AlpmPackageDetails {
 		public string name;
+		public string app_name;
 		public string version;
 		public string desc;
+		public string long_desc;
 		public string repo;
 		public uint origin;
 		public string url;
+		public string icon;
+		public string screenshot;
 		public string packager;
 		public string builddate;
 		public string installdate;
@@ -69,9 +75,9 @@ namespace Pamac {
 		public string packagebase;
 		public string url;
 		public string maintainer;
-		public int64 firstsubmitted;
-		public int64 lastmodified;
-		public int64 outofdate;
+		public string firstsubmitted;
+		public string lastmodified;
+		public string outofdate;
 		public int64 numvotes;
 		public string[] licenses;
 		public string[] depends;
diff --git a/src/preferences_dialog.vala b/src/preferences_dialog.vala
index 85313a11..f78e3faf 100644
--- a/src/preferences_dialog.vala
+++ b/src/preferences_dialog.vala
@@ -62,10 +62,11 @@ namespace Pamac {
 		Gtk.ListStore ignorepkgs_liststore;
 		Transaction transaction;
 		uint64 previous_refresh_period;
-		string[] countries;
 
 		public PreferencesDialog (Transaction transaction) {
-			Object (transient_for: transaction.application_window, use_header_bar: 1);
+			int use_header_bar;
+			Gtk.Settings.get_default ().get ("gtk-dialogs-use-header", out use_header_bar);
+			Object (transient_for: transaction.application_window, use_header_bar: use_header_bar);
 
 			this.transaction = transaction;
 			refresh_period_label.set_markup (dgettext (null, "How often to check for updates, value in hours") +":");
@@ -109,9 +110,11 @@ namespace Pamac {
 				var mirrors_config = new MirrorsConfig ("/etc/pacman-mirrors.conf");
 				mirrors_country_comboboxtext.append_text (dgettext (null, "Worldwide"));
 				mirrors_country_comboboxtext.active = 0;
-				countries = transaction.get_mirrors_countries ();
+				if (transaction.preferences_available_countries.length == 0) {
+					transaction.preferences_available_countries = transaction.get_mirrors_countries ();
+				}
 				int index = 1;
-				foreach (unowned string country in countries) {
+				foreach (unowned string country in transaction.preferences_available_countries) {
 					mirrors_country_comboboxtext.append_text (country);
 					if (country == mirrors_config.choosen_country) {
 						mirrors_country_comboboxtext.active = index;
diff --git a/src/system_daemon.vala b/src/system_daemon.vala
index d937d088..477bd99e 100644
--- a/src/system_daemon.vala
+++ b/src/system_daemon.vala
@@ -551,19 +551,23 @@ namespace Pamac {
 				}
 				return AlpmPackage () {
 					name = alpm_pkg.name,
+					app_name = "",
 					version = alpm_pkg.version,
 					// desc can be null
 					desc = alpm_pkg.desc ?? "",
 					repo = (owned) repo_name,
 					size = alpm_pkg.isize,
-					origin = (uint) alpm_pkg.origin
+					origin = (uint) alpm_pkg.origin,
+					icon = ""
 				};
 			} else {
 				return AlpmPackage () {
 					name = "",
+					app_name = "",
 					version = "",
 					desc = "",
-					repo = ""
+					repo = "",
+					icon = ""
 				};
 			}
 		}
diff --git a/src/transaction.vala b/src/transaction.vala
index 3c56bf7a..113a8774 100644
--- a/src/transaction.vala
+++ b/src/transaction.vala
@@ -36,11 +36,12 @@ namespace Pamac {
 		public abstract AlpmPackage find_sync_satisfier (string depstring) throws IOError;
 		public abstract async AlpmPackage[] search_pkgs (string search_string) throws IOError;
 		public abstract async AURPackage[] search_in_aur (string search_string) throws IOError;
+		public abstract async AlpmPackage[] get_category_pkgs (string category) throws IOError;
 		public abstract string[] get_repos_names () throws IOError;
 		public abstract async AlpmPackage[] get_repo_pkgs (string repo) throws IOError;
 		public abstract string[] get_groups_names () throws IOError;
 		public abstract async AlpmPackage[] get_group_pkgs (string groupname) throws IOError;
-		public abstract AlpmPackageDetails get_pkg_details (string pkgname) throws IOError;
+		public abstract AlpmPackageDetails get_pkg_details (string pkgname, string app_name) throws IOError;
 		public abstract string[] get_pkg_files (string pkgname) throws IOError;
 		public abstract async AURPackageDetails get_aur_details (string pkgname) throws IOError;
 		public abstract string[] get_pkg_uninstalled_optdeps (string pkgname) throws IOError;
@@ -154,6 +155,7 @@ namespace Pamac {
 		StringBuilder warning_textbuffer;
 
 		//dialogs
+		public string[] preferences_available_countries;
 		TransactionSumDialog transaction_sum_dialog;
 		public ProgressBox progress_box;
 		Vte.Terminal term;
@@ -198,6 +200,7 @@ namespace Pamac {
 			connecting_user_daemon ();
 			//creating dialogs
 			this.application_window = application_window;
+			preferences_available_countries = {};
 			transaction_sum_dialog = new TransactionSumDialog (application_window);
 			progress_box = new ProgressBox ();
 			progress_box.progressbar.text = "";
@@ -658,6 +661,16 @@ namespace Pamac {
 			return pkgs;
 		}
 
+		public async AlpmPackage[] get_category_pkgs (string category) {
+			AlpmPackage[] pkgs = {};
+			try {
+				pkgs = yield user_daemon.get_category_pkgs (category);
+			} catch (IOError e) {
+				stderr.printf ("IOError: %s\n", e.message);
+			}
+			return pkgs;
+		}
+
 		public string[] get_repos_names () {
 			string[] repos_names = {};
 			try {
@@ -708,9 +721,9 @@ namespace Pamac {
 			return optdeps;
 		}
 
-		public AlpmPackageDetails get_pkg_details (string pkgname) {
+		public AlpmPackageDetails get_pkg_details (string pkgname, string app_name) {
 			try {
-				return user_daemon.get_pkg_details (pkgname);
+				return user_daemon.get_pkg_details (pkgname, app_name);
 			} catch (IOError e) {
 				stderr.printf ("IOError: %s\n", e.message);
 				return AlpmPackageDetails () {
diff --git a/src/user_daemon.vala b/src/user_daemon.vala
index 09d8dc95..55f7fbe0 100644
--- a/src/user_daemon.vala
+++ b/src/user_daemon.vala
@@ -89,6 +89,8 @@ namespace Pamac {
 		private Json.Array aur_updates_results;
 		private HashTable<string, Json.Array> aur_search_results;
 		private HashTable<string, Json.Object> aur_infos;
+		private As.Store app_store;
+		private string locale;
 
 		public signal void get_updates_finished (Updates updates);
 
@@ -98,6 +100,20 @@ namespace Pamac {
 			aur_search_results = new HashTable<string, Json.Array> (str_hash, str_equal);
 			aur_infos = new HashTable<string, Json.Object> (str_hash, str_equal);
 			refresh_handle ();
+			// init appstream
+			app_store = new As.Store ();
+			locale = Environ.get_variable (Environ.get (), "LANG");
+			if (locale != null) {
+				// remove .UTF-8 from locale
+				locale = locale.split (".")[0];
+			} else {
+				locale = "C";
+			}
+			try {
+				app_store.load (As.StoreLoadFlags.APP_INFO_SYSTEM);
+			} catch (Error e) {
+				stderr.printf ("Error: %s\n", e.message);
+			}
 		}
 
 		public void refresh_handle () {
@@ -156,10 +172,74 @@ namespace Pamac {
 			return 0;
 		}
 
+		private string get_localized_string (HashTable<string,string> hashtable) {
+			unowned string val;
+			if (!hashtable.lookup_extended (locale, null, out val)) {
+				// try with just the language
+				if (!hashtable.lookup_extended (locale.split ("_")[0], null, out val)) {
+					// try C locale
+					if (!hashtable.lookup_extended ("C", null, out val)) {
+						return "";
+					}
+				}
+			}
+			return val;
+		}
+
+		private string get_app_name (As.App app) {
+			return get_localized_string (app.get_names ());
+		}
+
+		private string get_app_summary (As.App app) {
+			return get_localized_string (app.get_comments ());
+		}
+
+		private string get_app_description (As.App app) {
+			return get_localized_string (app.get_descriptions ());
+		}
+
+		private string get_app_icon (As.App app, string dbname) {
+			string icon = "";
+			app.get_icons ().foreach ((as_icon) => {
+				if (as_icon.get_kind () == As.IconKind.CACHED) {
+					if (as_icon.get_height () == 64) {
+						icon = "/usr/share/app-info/icons/archlinux-arch-%s/64x64/%s".printf (dbname, as_icon.get_name ());
+					}
+				}
+			});
+			return icon;
+		}
+
+		private string get_app_screenshot (As.App app) {
+			string screenshot = "";
+			app.get_screenshots ().foreach ((as_screenshot) => {
+				if (as_screenshot.get_kind () == As.ScreenshotKind.DEFAULT) {
+					As.Image? as_image = as_screenshot.get_source ();
+					if (as_image != null) {
+						screenshot = as_image.get_url ();
+					}
+				}
+			});
+			return screenshot;
+		}
+
+		private As.App[] get_pkgname_matching_apps (string pkgname) {
+			As.App[] matching_apps = {};
+			app_store.get_apps ().foreach ((app) => {
+				if (app.get_pkgname_default () == pkgname) {
+					matching_apps += app;
+				}
+			});
+			return matching_apps;
+		}
+
 		private AlpmPackage initialise_pkg_struct (Alpm.Package? alpm_pkg) {
 			if (alpm_pkg != null) {
 				string installed_version = "";
 				string repo_name = "";
+				string desc = alpm_pkg.desc ?? "";
+				string icon = "";
+				string app_name = "";
 				if (alpm_pkg.origin == Alpm.Package.From.LOCALDB) {
 					installed_version = alpm_pkg.version;
 					unowned Alpm.Package? sync_pkg = get_syncpkg (alpm_pkg.name);
@@ -173,34 +253,117 @@ namespace Pamac {
 					}
 					repo_name = alpm_pkg.db.name;
 				}
+				if (repo_name != "") {
+					// find if pkgname provides only one app
+					As.App[] matching_apps = get_pkgname_matching_apps (alpm_pkg.name);
+					if (matching_apps.length == 1) {
+						As.App app = matching_apps[0];
+						app_name = get_app_name (app);
+						desc = get_app_summary (app);
+						icon = get_app_icon (app, repo_name);
+					}
+				}
 				return AlpmPackage () {
 					name = alpm_pkg.name,
+					app_name = (owned) app_name,
 					version = alpm_pkg.version,
 					installed_version = (owned) installed_version,
-					// desc can be null
-					desc = alpm_pkg.desc ?? "",
+					desc = (owned) desc,
 					repo = (owned) repo_name,
 					size = alpm_pkg.isize,
 					download_size = alpm_pkg.download_size,
-					origin = (uint) alpm_pkg.origin
+					origin = (uint) alpm_pkg.origin,
+					icon = (owned) icon
 				};
 			} else {
 				return AlpmPackage () {
 					name = "",
+					app_name = "",
 					version = "",
 					installed_version = "",
 					desc = "",
-					repo = ""
+					repo = "",
+					icon = ""
 				};
 			}
 		}
 
+		private AlpmPackage[] initialise_pkg_structs (Alpm.Package? alpm_pkg) {
+			AlpmPackage[] pkgs = {};
+			if (alpm_pkg != null) {
+				string installed_version = "";
+				string repo_name = "";
+				if (alpm_pkg.origin == Alpm.Package.From.LOCALDB) {
+					installed_version = alpm_pkg.version;
+					unowned Alpm.Package? sync_pkg = get_syncpkg (alpm_pkg.name);
+					if (sync_pkg != null) {
+						repo_name = sync_pkg.db.name;
+					}
+				} else if (alpm_pkg.origin == Alpm.Package.From.SYNCDB) {
+					unowned Alpm.Package? local_pkg = alpm_handle.localdb.get_pkg (alpm_pkg.name);
+					if (local_pkg != null) {
+						installed_version = local_pkg.version;
+					}
+					repo_name = alpm_pkg.db.name;
+				}
+				if (repo_name != "") {
+					As.App[] apps = get_pkgname_matching_apps (alpm_pkg.name);
+					if (apps.length > 0) {
+						// alpm_pkg provide some apps
+						foreach (unowned As.App app in apps) {
+							pkgs += AlpmPackage () {
+								name = alpm_pkg.name,
+								app_name = get_app_name (app),
+								version = alpm_pkg.version,
+								installed_version = installed_version,
+								desc = get_app_summary (app),
+								repo = repo_name,
+								size = alpm_pkg.isize,
+								download_size = alpm_pkg.download_size,
+								origin = (uint) alpm_pkg.origin,
+								icon = get_app_icon (app, repo_name)
+							};
+						}
+					} else {
+						pkgs += AlpmPackage () {
+							name = alpm_pkg.name,
+							app_name = "",
+							version = alpm_pkg.version,
+							installed_version = installed_version,
+							desc = alpm_pkg.desc ?? "",
+							repo = repo_name,
+							size = alpm_pkg.isize,
+							download_size = alpm_pkg.download_size,
+							origin = (uint) alpm_pkg.origin,
+							icon = ""
+						};
+					}
+				} else {
+					pkgs += AlpmPackage () {
+						name = alpm_pkg.name,
+						app_name = "",
+						version = alpm_pkg.version,
+						installed_version = installed_version,
+						desc = alpm_pkg.desc ?? "",
+						repo = repo_name,
+						size = alpm_pkg.isize,
+						download_size = alpm_pkg.download_size,
+						origin = (uint) alpm_pkg.origin,
+						icon = ""
+					};
+				}
+			}
+			return pkgs;
+		}
+
 		public async AlpmPackage[] get_installed_pkgs () {
 			AlpmPackage[] pkgs = {};
 			unowned Alpm.List<unowned Alpm.Package> pkgcache = alpm_handle.localdb.pkgcache;
 			while (pkgcache != null) {
 				unowned Alpm.Package alpm_pkg = pkgcache.data;
-				pkgs += initialise_pkg_struct (alpm_pkg);
+				foreach (unowned AlpmPackage pkg in initialise_pkg_structs (alpm_pkg)) {
+					pkgs += pkg;
+				}
 				pkgcache.next ();
 			}
 			return pkgs;
@@ -212,7 +375,9 @@ namespace Pamac {
 			while (pkgcache != null) {
 				unowned Alpm.Package alpm_pkg = pkgcache.data;
 				if (alpm_pkg.reason == Alpm.Package.Reason.EXPLICIT) {
-					pkgs += initialise_pkg_struct (alpm_pkg);
+					foreach (unowned AlpmPackage pkg in initialise_pkg_structs (alpm_pkg)) {
+						pkgs += pkg;
+					}
 				}
 				pkgcache.next ();
 			}
@@ -236,7 +401,9 @@ namespace Pamac {
 					syncdbs.next ();
 				}
 				if (sync_found == false) {
-					pkgs += initialise_pkg_struct (alpm_pkg);
+					foreach (unowned AlpmPackage pkg in initialise_pkg_structs (alpm_pkg)) {
+						pkgs += pkg;
+					}
 				}
 				pkgcache.next ();
 			}
@@ -253,7 +420,9 @@ namespace Pamac {
 					if (requiredby.length == 0) {
 						Alpm.List<string> optionalfor = alpm_pkg.compute_optionalfor ();
 						if (optionalfor.length == 0) {
-							pkgs += initialise_pkg_struct (alpm_pkg);
+							foreach (unowned AlpmPackage pkg in initialise_pkg_structs (alpm_pkg)) {
+								pkgs += pkg;
+							}
 						} else {
 							optionalfor.free_inner (GLib.free);
 						}
@@ -336,15 +505,17 @@ namespace Pamac {
 		}
 
 		public async AlpmPackage[] search_pkgs (string search_string) {
-			AlpmPackage[] result = {};
+			AlpmPackage[] pkgs = {};
 			Alpm.List<unowned Alpm.Package> alpm_pkgs = search_all_dbs (search_string);
 			unowned Alpm.List<unowned Alpm.Package> list = alpm_pkgs;
 			while (list != null) {
 				unowned Alpm.Package alpm_pkg = list.data;
-				result += initialise_pkg_struct (alpm_pkg);
+				foreach (unowned AlpmPackage pkg in initialise_pkg_structs (alpm_pkg)) {
+					pkgs += pkg;
+				}
 				list.next ();
 			}
-			return result;
+			return pkgs;
 		}
 
 		private AURPackage initialise_aur_struct (Json.Object json_object) {
@@ -388,9 +559,9 @@ namespace Pamac {
 			string packagebase = "";
 			string url = "";
 			string maintainer = "";
-			int64 firstsubmitted = 0;
-			int64 lastmodified = 0;
-			int64 outofdate = 0;
+			string firstsubmitted = "";
+			string lastmodified = "";
+			string outofdate = "";
 			int64 numvotes = 0;
 			string[] licenses = {};
 			string[] depends = {};
@@ -431,13 +602,16 @@ namespace Pamac {
 					maintainer = node.get_string ();
 				}
 				// firstsubmitted
-				firstsubmitted = json_object.get_int_member ("FirstSubmitted");
+				GLib.Time time = GLib.Time.local ((time_t) json_object.get_int_member ("FirstSubmitted"));
+				firstsubmitted = time.format ("%x");
 				// lastmodified
-				lastmodified = json_object.get_int_member ("LastModified");
+				time = GLib.Time.local ((time_t) json_object.get_int_member ("LastModified"));
+				lastmodified = time.format ("%x");
 				// outofdate can be null
 				node = json_object.get_member ("OutOfDate");
 				if (!node.is_null ()) {
-					outofdate = node.get_int ();
+					time = GLib.Time.local ((time_t) node.get_int ());
+					outofdate = time.format ("%x");
 				}
 				//numvotes
 				numvotes = json_object.get_int_member ("NumVotes");
@@ -544,9 +718,13 @@ namespace Pamac {
 						unowned Alpm.Package sync_pkg = pkgcache.data;
 						unowned Alpm.Package? local_pkg = alpm_handle.localdb.get_pkg (sync_pkg.name);
 						if (local_pkg != null) {
-							pkgs += initialise_pkg_struct (local_pkg);
+							foreach (unowned AlpmPackage pkg in initialise_pkg_structs (local_pkg)) {
+								pkgs += pkg;
+							}
 						} else {
-							pkgs += initialise_pkg_struct (sync_pkg);
+							foreach (unowned AlpmPackage pkg in initialise_pkg_structs (sync_pkg)) {
+								pkgs += pkg;
+							}
 						}
 						pkgcache.next ();
 					}
@@ -619,12 +797,52 @@ namespace Pamac {
 			unowned Alpm.List<unowned Alpm.Package> list = alpm_pkgs;
 			while (list != null) {
 				unowned Alpm.Package alpm_pkg = list.data;
-				pkgs += initialise_pkg_struct (alpm_pkg);
+				foreach (unowned AlpmPackage pkg in initialise_pkg_structs (alpm_pkg)) {
+					pkgs += pkg;
+				}
 				list.next ();
 			}
 			return pkgs;
 		}
 
+		public async AlpmPackage[] get_category_pkgs (string category) {
+			AlpmPackage[] pkgs = {};
+			app_store.get_apps ().foreach ((app) => {
+				app.get_categories ().foreach ((cat_name) => {
+					if (cat_name == category) {
+						string pkgname = app.get_pkgname_default ();
+						string installed_version = "";
+						string repo_name = "";
+						uint origin;
+						unowned Alpm.Package? local_pkg = alpm_handle.localdb.get_pkg (pkgname);
+						unowned Alpm.Package? sync_pkg = get_syncpkg (pkgname);
+						if (sync_pkg != null) {
+							if (local_pkg == null) {
+								repo_name = sync_pkg.db.name;
+								origin = (uint) sync_pkg.origin;
+							} else {
+								installed_version = local_pkg.version;
+								origin = (uint) local_pkg.origin;
+							}
+							pkgs += AlpmPackage () {
+								name = sync_pkg.name,
+								app_name = get_app_name (app),
+								version = sync_pkg.version,
+								installed_version = (owned) installed_version,
+								desc = get_app_summary (app),
+								repo = (owned) repo_name,
+								size = sync_pkg.isize,
+								download_size = sync_pkg.download_size,
+								origin = origin,
+								icon = get_app_icon (app, sync_pkg.db.name)
+							};
+						}
+					}
+				});
+			});
+			return pkgs;
+		}
+
 		public string[] get_pkg_uninstalled_optdeps (string pkgname) {
 			string[] optdeps = {};
 			unowned Alpm.Package? alpm_pkg = alpm_handle.localdb.get_pkg (pkgname);
@@ -644,11 +862,15 @@ namespace Pamac {
 			return optdeps;
 		}
 
-		public AlpmPackageDetails get_pkg_details (string pkgname) {
+		public AlpmPackageDetails get_pkg_details (string pkgname, string appname) {
 			string name = "";
+			string app_name = "";
 			string version = "";
 			string desc = "";
+			string long_desc = "";
 			string url = "";
+			string icon = "";
+			string screenshot = "";
 			string repo = "";
 			string has_signature = "";
 			string reason = "";
@@ -667,8 +889,9 @@ namespace Pamac {
 			string[] conflicts = {};
 			var details = AlpmPackageDetails ();
 			unowned Alpm.Package? alpm_pkg = alpm_handle.localdb.get_pkg (pkgname);
+			unowned Alpm.Package? sync_pkg = get_syncpkg (pkgname);
 			if (alpm_pkg == null) {
-				alpm_pkg = get_syncpkg (pkgname);
+				alpm_pkg = sync_pkg;
 			}
 			if (alpm_pkg != null) {
 				// name
@@ -679,6 +902,36 @@ namespace Pamac {
 				if (alpm_pkg.desc != null) {
 					desc = alpm_pkg.desc;
 				}
+				if (sync_pkg != null) {
+					if (appname != "") {
+						app_store.get_apps ().foreach ((app) => {
+							if (get_app_name (app) == appname) {
+								app_name = appname;
+								try {
+									long_desc = As.markup_convert_simple (get_app_description (app));
+								} catch (Error e) {
+									stderr.printf ("Error: %s\n", e.message);
+								}
+								icon = get_app_icon (app, sync_pkg.db.name);
+								screenshot = get_app_screenshot (app);
+							}
+						});
+					} else {
+						// find if pkgname provides only one app
+						As.App[] matching_apps = get_pkgname_matching_apps (pkgname);
+						if (matching_apps.length == 1) {
+							As.App app = matching_apps[0];
+							app_name = get_app_name (app);
+							try {
+								desc = As.markup_convert_simple (get_app_description (app));
+							} catch (Error e) {
+								stderr.printf ("Error: %s\n", e.message);
+							}
+							icon = get_app_icon (app, sync_pkg.db.name);
+							screenshot = get_app_screenshot (app);
+						}
+					}
+				}
 				details.origin = (uint) alpm_pkg.origin;
 				// url can be null
 				if (alpm_pkg.url != null) {
@@ -700,11 +953,10 @@ namespace Pamac {
 				}
 				// build_date
 				GLib.Time time = GLib.Time.local ((time_t) alpm_pkg.builddate);
-				builddate = time.format ("%a %d %b %Y %X %Z");
+				builddate = time.format ("%x");
 				// local pkg
 				if (alpm_pkg.origin == Alpm.Package.From.LOCALDB) {
 					// repo
-					unowned Alpm.Package? sync_pkg = get_syncpkg (alpm_pkg.name);
 					if (sync_pkg != null) {
 						repo = sync_pkg.db.name;
 					}
@@ -718,7 +970,7 @@ namespace Pamac {
 					}
 					// install_date
 					time = GLib.Time.local ((time_t) alpm_pkg.installdate);
-					installdate = time.format ("%a %d %b %Y %X %Z");
+					installdate = time.format ("%x");
 					// backups
 					list = alpm_pkg.backups;
 					while (list != null) {
@@ -780,10 +1032,14 @@ namespace Pamac {
 				}
 			}
 			details.name = (owned) name;
+			details.app_name = (owned) app_name;
 			details.version = (owned) version;
 			details.desc = (owned) desc;
+			details.long_desc = (owned) long_desc;
 			details.repo = (owned) repo;
 			details.url = (owned) url;
+			details.icon = (owned) icon;
+			details.screenshot = (owned) screenshot;
 			details.packager = (owned) packager;
 			details.builddate = (owned) builddate;
 			details.installdate = (owned) installdate;
diff --git a/vapi/appstream-glib.vapi b/vapi/appstream-glib.vapi
new file mode 100644
index 00000000..047209cd
--- /dev/null
+++ b/vapi/appstream-glib.vapi
@@ -0,0 +1,2077 @@
+/* appstream-glib.vapi generated by vapigen, do not modify. */
+
+[CCode (cprefix = "As", gir_namespace = "AppStreamGlib", gir_version = "1.0", lower_case_cprefix = "as__")]
+namespace As {
+	[CCode (cheader_filename = "appstream-glib.h", type_id = "as_app_get_type ()")]
+	public class App : GLib.Object {
+		[CCode (cname = "as_app_new", has_construct_function = false)]
+		[Version (since = "0.1.0")]
+		public App ();
+		[CCode (cname = "as_app_add_addon")]
+		[Version (since = "0.1.7")]
+		public void add_addon (As.App addon);
+		[CCode (cname = "as_app_add_arch")]
+		[Version (since = "0.1.1")]
+		public void add_arch (string arch);
+		[CCode (cname = "as_app_add_bundle")]
+		[Version (since = "0.3.5")]
+		public void add_bundle (As.Bundle bundle);
+		[CCode (cname = "as_app_add_category")]
+		[Version (since = "0.1.0")]
+		public void add_category (string category);
+		[CCode (cname = "as_app_add_compulsory_for_desktop")]
+		[Version (since = "0.1.0")]
+		public void add_compulsory_for_desktop (string compulsory_for_desktop);
+		[CCode (cname = "as_app_add_content_rating")]
+		[Version (since = "0.5.12")]
+		public void add_content_rating (As.ContentRating content_rating);
+		[CCode (cname = "as_app_add_extends")]
+		[Version (since = "0.1.7")]
+		public void add_extends (string extends);
+		[CCode (cname = "as_app_add_format")]
+		[Version (since = "0.6.9")]
+		public void add_format (As.Format format);
+		[CCode (cname = "as_app_add_icon")]
+		[Version (since = "0.3.1")]
+		public void add_icon (As.Icon icon);
+		[CCode (cname = "as_app_add_keyword")]
+		[Version (since = "0.3.0")]
+		public void add_keyword (string locale, string keyword);
+		[CCode (cname = "as_app_add_kudo")]
+		[Version (since = "0.2.2")]
+		public void add_kudo (string kudo);
+		[CCode (cname = "as_app_add_kudo_kind")]
+		[Version (since = "0.2.2")]
+		public void add_kudo_kind (As.KudoKind kudo_kind);
+		[CCode (cname = "as_app_add_language")]
+		[Version (since = "0.1.0")]
+		public void add_language (int percentage, string locale);
+		[CCode (cname = "as_app_add_launchable")]
+		[Version (since = "0.6.13")]
+		public void add_launchable (As.Launchable launchable);
+		[CCode (cname = "as_app_add_metadata")]
+		[Version (since = "0.1.0")]
+		public void add_metadata (string key, string value);
+		[CCode (cname = "as_app_add_mimetype")]
+		[Version (since = "0.1.0")]
+		public void add_mimetype (string mimetype);
+		[CCode (cname = "as_app_add_permission")]
+		[Version (since = "0.3.5")]
+		public void add_permission (string permission);
+		[CCode (cname = "as_app_add_pkgname")]
+		[Version (since = "0.1.0")]
+		public void add_pkgname (string pkgname);
+		[CCode (cname = "as_app_add_provide")]
+		[Version (since = "0.1.6")]
+		public void add_provide (As.Provide provide);
+		[CCode (cname = "as_app_add_quirk")]
+		[Version (since = "0.5.10")]
+		public void add_quirk (As.AppQuirk quirk);
+		[CCode (cname = "as_app_add_release")]
+		[Version (since = "0.1.0")]
+		public void add_release (As.Release release);
+		[CCode (cname = "as_app_add_require")]
+		[Version (since = "0.6.7")]
+		public void add_require (As.Require require);
+		[CCode (cname = "as_app_add_review")]
+		[Version (since = "0.6.1")]
+		public void add_review (As.Review review);
+		[CCode (cname = "as_app_add_screenshot")]
+		[Version (since = "0.1.0")]
+		public void add_screenshot (As.Screenshot screenshot);
+		[CCode (cname = "as_app_add_suggest")]
+		[Version (since = "0.6.1")]
+		public void add_suggest (As.Suggest suggest);
+		[CCode (cname = "as_app_add_translation")]
+		[Version (since = "0.5.8")]
+		public void add_translation (As.Translation translation);
+		[CCode (cname = "as_app_add_url")]
+		[Version (since = "0.1.0")]
+		public void add_url (As.UrlKind url_kind, string url);
+		[CCode (cname = "as_app_convert_icons")]
+		[Version (since = "0.3.1")]
+		public bool convert_icons (As.IconKind kind) throws GLib.Error;
+		[CCode (cname = "as_app_equal")]
+		[Version (since = "0.6.1")]
+		public bool equal (As.App app2);
+		[CCode (cname = "as_app_error_quark")]
+		[Version (since = "0.1.2")]
+		public static GLib.Quark error_quark ();
+		[CCode (cname = "as_app_get_addons")]
+		[Version (since = "0.1.7")]
+		public unowned GLib.GenericArray<As.App> get_addons ();
+		[CCode (cname = "as_app_get_architectures")]
+		[Version (since = "0.1.1")]
+		public unowned GLib.GenericArray<string> get_architectures ();
+		[CCode (cname = "as_app_get_branch")]
+		[Version (since = "0.6.1")]
+		public unowned string get_branch ();
+		[CCode (cname = "as_app_get_bundle_default")]
+		[Version (since = "0.3.5")]
+		public unowned As.Bundle get_bundle_default ();
+		[CCode (cname = "as_app_get_bundles")]
+		[Version (since = "0.3.5")]
+		public unowned GLib.GenericArray<As.Bundle> get_bundles ();
+		[CCode (cname = "as_app_get_categories")]
+		[Version (since = "0.1.0")]
+		public unowned GLib.GenericArray<string> get_categories ();
+		[CCode (cname = "as_app_get_comment")]
+		[Version (since = "0.1.0")]
+		public unowned string get_comment (string locale);
+		[CCode (cname = "as_app_get_comments")]
+		[Version (since = "0.1.6")]
+		public unowned GLib.HashTable<string,string> get_comments ();
+		[CCode (cname = "as_app_get_compulsory_for_desktops")]
+		[Version (since = "0.1.0")]
+		public unowned GLib.GenericArray<string> get_compulsory_for_desktops ();
+		[CCode (cname = "as_app_get_content_rating")]
+		[Version (since = "0.5.12")]
+		public unowned As.ContentRating get_content_rating (string kind);
+		[CCode (cname = "as_app_get_content_ratings")]
+		[Version (since = "0.5.12")]
+		public unowned GLib.GenericArray<As.ContentRating> get_content_ratings ();
+		[CCode (cname = "as_app_get_description")]
+		[Version (since = "0.1.0")]
+		public unowned string get_description (string locale);
+		[CCode (cname = "as_app_get_descriptions")]
+		[Version (since = "0.1.6")]
+		public unowned GLib.HashTable<string,string> get_descriptions ();
+		[CCode (cname = "as_app_get_developer_name")]
+		[Version (since = "0.1.8")]
+		public unowned string get_developer_name (string locale);
+		[CCode (cname = "as_app_get_developer_names")]
+		[Version (since = "0.1.8")]
+		public unowned GLib.HashTable<string,string> get_developer_names ();
+		[CCode (cname = "as_app_get_extends")]
+		[Version (since = "0.1.7")]
+		public unowned GLib.GenericArray<string> get_extends ();
+		[CCode (cname = "as_app_get_format_by_filename")]
+		[Version (since = "0.6.9")]
+		public unowned As.Format get_format_by_filename (string filename);
+		[CCode (cname = "as_app_get_format_by_kind")]
+		[Version (since = "0.6.9")]
+		public unowned As.Format get_format_by_kind (As.FormatKind kind);
+		[CCode (cname = "as_app_get_format_default")]
+		[Version (since = "0.6.9")]
+		public unowned As.Format get_format_default ();
+		[CCode (cname = "as_app_get_formats")]
+		[Version (since = "0.6.9")]
+		public unowned GLib.GenericArray<string> get_formats ();
+		[CCode (cname = "as_app_get_icon_default")]
+		[Version (since = "0.3.1")]
+		public unowned As.Icon get_icon_default ();
+		[CCode (cname = "as_app_get_icon_for_size")]
+		[Version (since = "0.3.1")]
+		public unowned As.Icon get_icon_for_size (uint width, uint height);
+		[CCode (cname = "as_app_get_icon_path")]
+		[Version (since = "0.1.0")]
+		public unowned string get_icon_path ();
+		[CCode (cname = "as_app_get_icons")]
+		[Version (since = "0.3.1")]
+		public unowned GLib.GenericArray<As.Icon> get_icons ();
+		[CCode (cname = "as_app_get_id")]
+		[Version (since = "0.1.0")]
+		public unowned string get_id ();
+		[CCode (cname = "as_app_get_id_filename")]
+		[Version (since = "0.3.0")]
+		public unowned string get_id_filename ();
+		[CCode (cname = "as_app_get_id_kind")]
+		[Version (since = "0.1.0")]
+		public As.IdKind get_id_kind ();
+		[CCode (cname = "as_app_get_id_no_prefix")]
+		[Version (since = "0.5.12")]
+		public unowned string get_id_no_prefix ();
+		[CCode (cname = "as_app_get_keywords")]
+		[Version (since = "0.3.0")]
+		public unowned GLib.GenericArray<string> get_keywords (string locale);
+		[CCode (cname = "as_app_get_kind")]
+		[Version (since = "0.5.10")]
+		public As.AppKind get_kind ();
+		[CCode (cname = "as_app_get_kudos")]
+		[Version (since = "0.2.2")]
+		public unowned GLib.GenericArray<string> get_kudos ();
+		[CCode (cname = "as_app_get_language")]
+		[Version (since = "0.1.0")]
+		public int get_language (string locale);
+		[CCode (cname = "as_app_get_languages")]
+		[Version (since = "0.1.0")]
+		public GLib.List<weak string> get_languages ();
+		[CCode (cname = "as_app_get_launchable_by_kind")]
+		[Version (since = "0.6.13")]
+		public unowned As.Launchable get_launchable_by_kind (As.LaunchableKind kind);
+		[CCode (cname = "as_app_get_launchable_default")]
+		[Version (since = "0.6.13")]
+		public unowned As.Launchable get_launchable_default ();
+		[CCode (cname = "as_app_get_launchables")]
+		[Version (since = "0.6.13")]
+		public unowned GLib.GenericArray<As.Launchable> get_launchables ();
+		[CCode (cname = "as_app_get_merge_kind")]
+		[Version (since = "0.6.1")]
+		public As.AppMergeKind get_merge_kind ();
+		[CCode (cname = "as_app_get_metadata")]
+		[Version (since = "0.1.6")]
+		public unowned GLib.HashTable<string,string> get_metadata ();
+		[CCode (cname = "as_app_get_metadata_item")]
+		[Version (since = "0.1.0")]
+		public unowned string get_metadata_item (string key);
+		[CCode (cname = "as_app_get_metadata_license")]
+		[Version (since = "0.1.4")]
+		public unowned string get_metadata_license ();
+		[CCode (cname = "as_app_get_mimetypes")]
+		[Version (since = "0.2.0")]
+		public unowned GLib.GenericArray<string> get_mimetypes ();
+		[CCode (cname = "as_app_get_name")]
+		[Version (since = "0.1.0")]
+		public unowned string get_name (string locale);
+		[CCode (cname = "as_app_get_names")]
+		[Version (since = "0.1.6")]
+		public unowned GLib.HashTable<string,string> get_names ();
+		[CCode (cname = "as_app_get_origin")]
+		[Version (since = "0.3.2")]
+		public unowned string get_origin ();
+		[CCode (cname = "as_app_get_permissions")]
+		[Version (since = "0.3.5")]
+		public unowned GLib.GenericArray<string> get_permissions ();
+		[CCode (cname = "as_app_get_pkgname_default")]
+		[Version (since = "0.2.0")]
+		public unowned string get_pkgname_default ();
+		[CCode (cname = "as_app_get_pkgnames")]
+		[Version (since = "0.1.0")]
+		public unowned GLib.GenericArray<string> get_pkgnames ();
+		[CCode (cname = "as_app_get_priority")]
+		[Version (since = "0.1.0")]
+		public int get_priority ();
+		[CCode (cname = "as_app_get_project_group")]
+		[Version (since = "0.1.0")]
+		public unowned string get_project_group ();
+		[CCode (cname = "as_app_get_project_license")]
+		[Version (since = "0.1.0")]
+		public unowned string get_project_license ();
+		[CCode (cname = "as_app_get_provides")]
+		[Version (since = "0.1.6")]
+		public unowned GLib.GenericArray<As.Provide> get_provides ();
+		[CCode (cname = "as_app_get_release")]
+		[Version (since = "0.3.5")]
+		public unowned As.Release get_release (string version);
+		[CCode (cname = "as_app_get_release_default")]
+		[Version (since = "0.3.5")]
+		public unowned As.Release get_release_default ();
+		[CCode (cname = "as_app_get_releases")]
+		[Version (since = "0.1.0")]
+		public unowned GLib.GenericArray<As.Release> get_releases ();
+		[CCode (cname = "as_app_get_require_by_value")]
+		[Version (since = "0.6.7")]
+		public unowned As.Require get_require_by_value (As.RequireKind kind, string value);
+		[CCode (cname = "as_app_get_requires")]
+		[Version (since = "0.6.7")]
+		public unowned GLib.GenericArray<As.Require> get_requires ();
+		[CCode (cname = "as_app_get_reviews")]
+		[Version (since = "0.6.1")]
+		public unowned GLib.GenericArray<As.Screenshot> get_reviews ();
+		[CCode (cname = "as_app_get_scope")]
+		[Version (since = "0.6.1")]
+		public As.AppScope get_scope ();
+		[CCode (cname = "as_app_get_screenshots")]
+		[Version (since = "0.1.0")]
+		public unowned GLib.GenericArray<As.Screenshot> get_screenshots ();
+		[CCode (cname = "as_app_get_search_match")]
+		[Version (since = "0.6.13")]
+		public As.AppSearchMatch get_search_match ();
+		[CCode (cname = "as_app_get_source_file")]
+		[Version (since = "0.2.2")]
+		public unowned string get_source_file ();
+		[CCode (cname = "as_app_get_source_kind")]
+		[Version (since = "0.1.4")]
+		public As.FormatKind get_source_kind ();
+		[CCode (cname = "as_app_get_source_pkgname")]
+		[Version (since = "0.2.4")]
+		public unowned string get_source_pkgname ();
+		[CCode (cname = "as_app_get_state")]
+		[Version (since = "0.2.2")]
+		public As.AppState get_state ();
+		[CCode (cname = "as_app_get_suggests")]
+		[Version (since = "0.6.1")]
+		public unowned GLib.GenericArray<As.Suggest> get_suggests ();
+		[CCode (cname = "as_app_get_translations")]
+		[Version (since = "0.5.8")]
+		public unowned GLib.GenericArray<As.Translation> get_translations ();
+		[CCode (cname = "as_app_get_trust_flags")]
+		[Version (since = "0.2.2")]
+		public As.AppTrustFlags get_trust_flags ();
+		[CCode (cname = "as_app_get_unique_id")]
+		[Version (since = "0.6.1")]
+		public unowned string get_unique_id ();
+		[CCode (cname = "as_app_get_update_contact")]
+		[Version (since = "0.1.4")]
+		public unowned string get_update_contact ();
+		[CCode (cname = "as_app_get_url_item")]
+		[Version (since = "0.1.0")]
+		public unowned string get_url_item (As.UrlKind url_kind);
+		[CCode (cname = "as_app_get_urls")]
+		[Version (since = "0.1.0")]
+		public unowned GLib.HashTable<string,string> get_urls ();
+		[CCode (cname = "as_app_get_vetos")]
+		[Version (since = "0.2.5")]
+		public unowned GLib.GenericArray<string> get_vetos ();
+		[CCode (cname = "as_app_guess_source_kind")]
+		[Version (since = "0.1.8")]
+		public static As.FormatKind guess_source_kind (string filename);
+		[CCode (cname = "as_app_has_category")]
+		[Version (since = "0.1.5")]
+		public bool has_category (string category);
+		[CCode (cname = "as_app_has_compulsory_for_desktop")]
+		[Version (since = "0.5.12")]
+		public bool has_compulsory_for_desktop (string desktop);
+		[CCode (cname = "as_app_has_kudo")]
+		[Version (since = "0.2.2")]
+		public bool has_kudo (string kudo);
+		[CCode (cname = "as_app_has_kudo_kind")]
+		[Version (since = "0.2.2")]
+		public bool has_kudo_kind (As.KudoKind kudo);
+		[CCode (cname = "as_app_has_permission")]
+		[Version (since = "0.3.5")]
+		public bool has_permission (string permission);
+		[CCode (cname = "as_app_has_quirk")]
+		[Version (since = "0.5.10")]
+		public bool has_quirk (As.AppQuirk quirk);
+		[CCode (cname = "as_app_kind_from_string")]
+		[Version (since = "0.5.10")]
+		public static As.AppKind kind_from_string (string kind);
+		[CCode (cname = "as_app_kind_to_string")]
+		[Version (since = "0.5.10")]
+		public static unowned string kind_to_string (As.AppKind kind);
+		[CCode (cname = "as_app_merge_kind_from_string")]
+		[Version (since = "0.6.1")]
+		public static As.AppMergeKind merge_kind_from_string (string merge_kind);
+		[CCode (cname = "as_app_merge_kind_to_string")]
+		[Version (since = "0.6.1")]
+		public static unowned string merge_kind_to_string (As.AppMergeKind merge_kind);
+		[CCode (cname = "as_app_parse_file")]
+		[Version (since = "0.1.2")]
+		public bool parse_file (string filename, As.AppParseFlags flags) throws GLib.Error;
+		[CCode (cname = "as_app_remove_category")]
+		[Version (since = "0.6.13")]
+		public void remove_category (string category);
+		[CCode (cname = "as_app_remove_format")]
+		[Version (since = "0.6.9")]
+		public void remove_format (As.Format format);
+		[CCode (cname = "as_app_remove_kudo")]
+		[Version (since = "0.6.13")]
+		public void remove_kudo (string kudo);
+		[CCode (cname = "as_app_remove_metadata")]
+		[Version (since = "0.1.0")]
+		public void remove_metadata (string key);
+		[CCode (cname = "as_app_remove_veto")]
+		[Version (since = "0.4.1")]
+		public void remove_veto (string description);
+		[CCode (cname = "as_app_scope_from_string")]
+		[Version (since = "0.6.1")]
+		public static As.AppScope scope_from_string (string scope);
+		[CCode (cname = "as_app_scope_to_string")]
+		[Version (since = "0.6.1")]
+		public static unowned string scope_to_string (As.AppScope scope);
+		[CCode (cname = "as_app_search_matches")]
+		[Version (since = "0.1.0")]
+		public uint search_matches (string search);
+		[CCode (cname = "as_app_search_matches_all")]
+		[Version (since = "0.1.3")]
+		public uint search_matches_all (string search);
+		[CCode (cname = "as_app_set_branch")]
+		[Version (since = "0.6.1")]
+		public void set_branch (string branch);
+		[CCode (cname = "as_app_set_comment")]
+		[Version (since = "0.1.0")]
+		public void set_comment (string locale, string comment);
+		[CCode (cname = "as_app_set_description")]
+		[Version (since = "0.1.0")]
+		public void set_description (string locale, string description);
+		[CCode (cname = "as_app_set_developer_name")]
+		[Version (since = "0.1.0")]
+		public void set_developer_name (string locale, string developer_name);
+		[CCode (cname = "as_app_set_icon_path")]
+		[Version (since = "0.1.0")]
+		public void set_icon_path (string icon_path);
+		[CCode (cname = "as_app_set_id")]
+		[Version (since = "0.1.0")]
+		public void set_id (string id);
+		[CCode (cname = "as_app_set_id_kind")]
+		[Version (since = "0.1.0")]
+		public void set_id_kind (As.IdKind id_kind);
+		[CCode (cname = "as_app_set_kind")]
+		[Version (since = "0.5.10")]
+		public void set_kind (As.AppKind kind);
+		[CCode (cname = "as_app_set_merge_kind")]
+		[Version (since = "0.6.1")]
+		public void set_merge_kind (As.AppMergeKind merge_kind);
+		[CCode (cname = "as_app_set_metadata_license")]
+		[Version (since = "0.1.4")]
+		public void set_metadata_license (string metadata_license);
+		[CCode (cname = "as_app_set_name")]
+		[Version (since = "0.1.0")]
+		public void set_name (string locale, string name);
+		[CCode (cname = "as_app_set_origin")]
+		[Version (since = "0.3.2")]
+		public void set_origin (string origin);
+		[CCode (cname = "as_app_set_priority")]
+		[Version (since = "0.1.0")]
+		public void set_priority (int priority);
+		[CCode (cname = "as_app_set_project_group")]
+		[Version (since = "0.1.0")]
+		public void set_project_group (string project_group);
+		[CCode (cname = "as_app_set_project_license")]
+		[Version (since = "0.1.0")]
+		public void set_project_license (string project_license);
+		[CCode (cname = "as_app_set_scope")]
+		[Version (since = "0.6.1")]
+		public void set_scope (As.AppScope scope);
+		[CCode (cname = "as_app_set_search_match")]
+		[Version (since = "0.6.13")]
+		public void set_search_match (As.AppSearchMatch search_match);
+		[CCode (cname = "as_app_set_source_file")]
+		[Version (since = "0.2.2")]
+		public void set_source_file (string source_file);
+		[CCode (cname = "as_app_set_source_kind")]
+		[Version (since = "0.1.4")]
+		public void set_source_kind (As.FormatKind source_kind);
+		[CCode (cname = "as_app_set_source_pkgname")]
+		[Version (since = "0.2.4")]
+		public void set_source_pkgname (string source_pkgname);
+		[CCode (cname = "as_app_set_state")]
+		[Version (since = "0.2.2")]
+		public void set_state (As.AppState state);
+		[CCode (cname = "as_app_set_trust_flags")]
+		[Version (since = "0.2.2")]
+		public void set_trust_flags (As.AppTrustFlags trust_flags);
+		[CCode (cname = "as_app_set_update_contact")]
+		[Version (since = "0.1.4")]
+		public void set_update_contact (string update_contact);
+		[CCode (cname = "as_app_source_kind_from_string")]
+		[Version (since = "0.2.2")]
+		public static As.FormatKind source_kind_from_string (string source_kind);
+		[CCode (cname = "as_app_source_kind_to_string")]
+		[Version (since = "0.2.2")]
+		public static unowned string source_kind_to_string (As.FormatKind source_kind);
+		[CCode (cname = "as_app_state_to_string")]
+		[Version (since = "0.2.2")]
+		public static unowned string state_to_string (As.AppState state);
+		[CCode (cname = "as_app_subsume")]
+		[Version (since = "0.1.0")]
+		public void subsume (As.App donor);
+		[CCode (cname = "as_app_subsume_full")]
+		[Version (since = "0.1.4")]
+		public void subsume_full (As.App donor, As.AppSubsumeFlags flags);
+		[CCode (cname = "as_app_to_file")]
+		[Version (since = "0.2.0")]
+		public bool to_file (GLib.File file, GLib.Cancellable? cancellable = null) throws GLib.Error;
+		[CCode (cname = "as_app_validate")]
+		[Version (since = "0.1.4")]
+		public GLib.GenericArray<weak As.Problem> validate (As.AppValidateFlags flags) throws GLib.Error;
+	}
+	[CCode (cheader_filename = "appstream-glib.h", type_id = "as_bundle_get_type ()")]
+	public class Bundle : GLib.Object {
+		[CCode (cname = "as_bundle_new", has_construct_function = false)]
+		[Version (since = "0.3.5")]
+		public Bundle ();
+		[CCode (cname = "as_bundle_get_id")]
+		[Version (since = "0.3.5")]
+		public unowned string get_id ();
+		[CCode (cname = "as_bundle_get_kind")]
+		[Version (since = "0.3.5")]
+		public As.BundleKind get_kind ();
+		[CCode (cname = "as_bundle_get_runtime")]
+		[Version (since = "0.5.10")]
+		public unowned string get_runtime ();
+		[CCode (cname = "as_bundle_get_sdk")]
+		[Version (since = "0.5.10")]
+		public unowned string get_sdk ();
+		[CCode (cname = "as_bundle_kind_from_string")]
+		[Version (since = "0.3.5")]
+		public static As.BundleKind kind_from_string (string kind);
+		[CCode (cname = "as_bundle_kind_to_string")]
+		[Version (since = "0.3.5")]
+		public static unowned string kind_to_string (As.BundleKind kind);
+		[CCode (cname = "as_bundle_set_id")]
+		[Version (since = "0.3.5")]
+		public void set_id (string id);
+		[CCode (cname = "as_bundle_set_kind")]
+		[Version (since = "0.3.5")]
+		public void set_kind (As.BundleKind kind);
+		[CCode (cname = "as_bundle_set_runtime")]
+		[Version (since = "0.5.10")]
+		public void set_runtime (string runtime);
+		[CCode (cname = "as_bundle_set_sdk")]
+		[Version (since = "0.5.10")]
+		public void set_sdk (string sdk);
+	}
+	[CCode (cheader_filename = "appstream-glib.h", type_id = "as_checksum_get_type ()")]
+	public class Checksum : GLib.Object {
+		[CCode (cname = "as_checksum_new", has_construct_function = false)]
+		[Version (since = "0.4.2")]
+		public Checksum ();
+		[CCode (cname = "as_checksum_get_filename")]
+		[Version (since = "0.4.2")]
+		public unowned string get_filename ();
+		[CCode (cname = "as_checksum_get_kind")]
+		[Version (since = "0.4.2")]
+		public GLib.ChecksumType get_kind ();
+		[CCode (cname = "as_checksum_get_target")]
+		[Version (since = "0.4.2")]
+		public As.ChecksumTarget get_target ();
+		[CCode (cname = "as_checksum_get_value")]
+		[Version (since = "0.4.2")]
+		public unowned string get_value ();
+		[CCode (cname = "as_checksum_set_filename")]
+		[Version (since = "0.4.2")]
+		public void set_filename (string filename);
+		[CCode (cname = "as_checksum_set_kind")]
+		[Version (since = "0.4.2")]
+		public void set_kind (GLib.ChecksumType kind);
+		[CCode (cname = "as_checksum_set_target")]
+		[Version (since = "0.4.2")]
+		public void set_target (As.ChecksumTarget target);
+		[CCode (cname = "as_checksum_set_value")]
+		[Version (since = "0.4.2")]
+		public void set_value (string value);
+		[CCode (cname = "as_checksum_target_from_string")]
+		[Version (since = "0.4.2")]
+		public static As.ChecksumTarget target_from_string (string target);
+		[CCode (cname = "as_checksum_target_to_string")]
+		[Version (since = "0.4.2")]
+		public static unowned string target_to_string (As.ChecksumTarget target);
+	}
+	[CCode (cheader_filename = "appstream-glib.h", type_id = "as_content_rating_get_type ()")]
+	public class ContentRating : GLib.Object {
+		[CCode (cname = "as_content_rating_new", has_construct_function = false)]
+		[Version (since = "0.5.12")]
+		public ContentRating ();
+		[CCode (cname = "as_content_rating_get_kind")]
+		[Version (since = "0.5.12")]
+		public unowned string get_kind ();
+		[CCode (cname = "as_content_rating_get_minimum_age")]
+		[Version (since = "0.5.12")]
+		public uint get_minimum_age ();
+		[CCode (cname = "as_content_rating_get_value")]
+		[Version (since = "0.6.4")]
+		public As.ContentRatingValue get_value (string id);
+		[CCode (cname = "as_content_rating_set_kind")]
+		[Version (since = "0.5.12")]
+		public void set_kind (string kind);
+		[CCode (cname = "as_content_rating_value_from_string")]
+		[Version (since = "0.5.12")]
+		public static As.ContentRatingValue value_from_string (string value);
+		[CCode (cname = "as_content_rating_value_to_string")]
+		[Version (since = "0.5.12")]
+		public static unowned string value_to_string (As.ContentRatingValue value);
+	}
+	[CCode (cheader_filename = "appstream-glib.h", type_id = "as_format_get_type ()")]
+	public class Format : GLib.Object {
+		[CCode (cname = "as_format_new", has_construct_function = false)]
+		[Version (since = "0.6.9")]
+		public Format ();
+		[CCode (cname = "as_format_equal")]
+		[Version (since = "0.6.9")]
+		public bool equal (As.Format format2);
+		[CCode (cname = "as_format_get_filename")]
+		[Version (since = "0.6.9")]
+		public unowned string get_filename ();
+		[CCode (cname = "as_format_get_kind")]
+		[Version (since = "0.6.9")]
+		public As.FormatKind get_kind ();
+		[CCode (cname = "as_format_guess_kind")]
+		[Version (since = "0.6.9")]
+		public static As.FormatKind guess_kind (string filename);
+		[CCode (cname = "as_format_kind_from_string")]
+		[Version (since = "0.6.9")]
+		public static As.FormatKind kind_from_string (string kind);
+		[CCode (cname = "as_format_kind_to_string")]
+		public static unowned string kind_to_string (As.FormatKind kind);
+		[CCode (cname = "as_format_set_filename")]
+		[Version (since = "0.6.9")]
+		public void set_filename (string filename);
+		[CCode (cname = "as_format_set_kind")]
+		[Version (since = "0.6.9")]
+		public void set_kind (As.FormatKind kind);
+	}
+	[CCode (cheader_filename = "appstream-glib.h", type_id = "as_icon_get_type ()")]
+	public class Icon : GLib.Object {
+		[CCode (cname = "as_icon_new", has_construct_function = false)]
+		[Version (since = "0.3.1")]
+		public Icon ();
+		[CCode (cname = "as_icon_convert_to_kind")]
+		[Version (since = "0.3.1")]
+		public bool convert_to_kind (As.IconKind kind) throws GLib.Error;
+		[CCode (cname = "as_icon_error_quark")]
+		[Version (since = "0.3.1")]
+		public static GLib.Quark error_quark ();
+		[CCode (cname = "as_icon_get_filename")]
+		[Version (since = "0.3.2")]
+		public unowned string get_filename ();
+		[CCode (cname = "as_icon_get_height")]
+		[Version (since = "0.3.1")]
+		public uint get_height ();
+		[CCode (cname = "as_icon_get_kind")]
+		[Version (since = "0.3.1")]
+		public As.IconKind get_kind ();
+		[CCode (cname = "as_icon_get_name")]
+		[Version (since = "0.3.1")]
+		public unowned string get_name ();
+		[CCode (cname = "as_icon_get_prefix")]
+		[Version (since = "0.1.6")]
+		public unowned string get_prefix ();
+		[CCode (cname = "as_icon_get_scale")]
+		[Version (since = "0.6.13")]
+		public uint get_scale ();
+		[CCode (cname = "as_icon_get_url")]
+		[Version (since = "0.3.2")]
+		public unowned string get_url ();
+		[CCode (cname = "as_icon_get_width")]
+		[Version (since = "0.3.1")]
+		public uint get_width ();
+		[CCode (cname = "as_icon_kind_from_string")]
+		[Version (since = "0.1.0")]
+		public static As.IconKind kind_from_string (string icon_kind);
+		[CCode (cname = "as_icon_kind_to_string")]
+		[Version (since = "0.1.0")]
+		public static unowned string kind_to_string (As.IconKind icon_kind);
+		[CCode (cname = "as_icon_load")]
+		[Version (since = "0.3.1")]
+		public bool load (As.IconLoadFlags flags) throws GLib.Error;
+		[CCode (cname = "as_icon_set_filename")]
+		[Version (since = "0.3.2")]
+		public void set_filename (string filename);
+		[CCode (cname = "as_icon_set_height")]
+		[Version (since = "0.3.1")]
+		public void set_height (uint height);
+		[CCode (cname = "as_icon_set_kind")]
+		[Version (since = "0.3.1")]
+		public void set_kind (As.IconKind kind);
+		[CCode (cname = "as_icon_set_name")]
+		[Version (since = "0.3.1")]
+		public void set_name (string name);
+		[CCode (cname = "as_icon_set_prefix")]
+		[Version (since = "0.1.6")]
+		public void set_prefix (string prefix);
+		[CCode (cname = "as_icon_set_scale")]
+		[Version (since = "0.6.13")]
+		public void set_scale (uint scale);
+		[CCode (cname = "as_icon_set_url")]
+		[Version (since = "0.3.2")]
+		public void set_url (string url);
+		[CCode (cname = "as_icon_set_width")]
+		[Version (since = "0.3.1")]
+		public void set_width (uint width);
+	}
+	[CCode (cheader_filename = "appstream-glib.h", type_id = "as_image_get_type ()")]
+	public class Image : GLib.Object {
+		[CCode (cname = "as_image_new", has_construct_function = false)]
+		[Version (since = "0.1.0")]
+		public Image ();
+		[CCode (cname = "as_image_equal")]
+		[Version (since = "0.5.7")]
+		public bool equal (As.Image image2);
+		[CCode (cname = "as_image_get_basename")]
+		[Version (since = "0.1.6")]
+		public unowned string get_basename ();
+		[CCode (cname = "as_image_get_height")]
+		[Version (since = "0.1.0")]
+		public uint get_height ();
+		[CCode (cname = "as_image_get_kind")]
+		[Version (since = "0.1.0")]
+		public As.ImageKind get_kind ();
+		[CCode (cname = "as_image_get_locale")]
+		[Version (since = "0.5.14")]
+		public unowned string get_locale ();
+		[CCode (cname = "as_image_get_md5")]
+		[Version (since = "0.1.6")]
+		public unowned string get_md5 ();
+		[CCode (cname = "as_image_get_url")]
+		[Version (since = "0.1.0")]
+		public unowned string get_url ();
+		[CCode (cname = "as_image_get_width")]
+		[Version (since = "0.1.0")]
+		public uint get_width ();
+		[CCode (cname = "as_image_kind_from_string")]
+		[Version (since = "0.1.0")]
+		public static As.ImageKind kind_from_string (string kind);
+		[CCode (cname = "as_image_kind_to_string")]
+		[Version (since = "0.1.0")]
+		public static unowned string kind_to_string (As.ImageKind kind);
+		[CCode (cname = "as_image_load_filename")]
+		[Version (since = "0.1.6")]
+		public bool load_filename (string filename) throws GLib.Error;
+		[CCode (cname = "as_image_load_filename_full")]
+		[Version (since = "0.5.6")]
+		public bool load_filename_full (string filename, uint dest_size, uint src_size_min, As.ImageLoadFlags flags) throws GLib.Error;
+		[CCode (cname = "as_image_save_filename")]
+		[Version (since = "0.1.6")]
+		public bool save_filename (string filename, uint width, uint height, As.ImageSaveFlags flags) throws GLib.Error;
+		[CCode (cname = "as_image_set_basename")]
+		[Version (since = "0.1.6")]
+		public void set_basename (string basename);
+		[CCode (cname = "as_image_set_height")]
+		[Version (since = "0.1.0")]
+		public void set_height (uint height);
+		[CCode (cname = "as_image_set_kind")]
+		[Version (since = "0.1.0")]
+		public void set_kind (As.ImageKind kind);
+		[CCode (cname = "as_image_set_locale")]
+		[Version (since = "0.5.14")]
+		public void set_locale (string locale);
+		[CCode (cname = "as_image_set_url")]
+		[Version (since = "0.1.0")]
+		public void set_url (string url);
+		[CCode (cname = "as_image_set_width")]
+		[Version (since = "0.1.0")]
+		public void set_width (uint width);
+	}
+	[CCode (cheader_filename = "appstream-glib.h", type_id = "as_launchable_get_type ()")]
+	public class Launchable : GLib.Object {
+		[CCode (cname = "as_launchable_new", has_construct_function = false)]
+		[Version (since = "0.6.13")]
+		public Launchable ();
+		[CCode (cname = "as_launchable_get_kind")]
+		[Version (since = "0.6.13")]
+		public As.LaunchableKind get_kind ();
+		[CCode (cname = "as_launchable_get_value")]
+		[Version (since = "0.6.13")]
+		public unowned string get_value ();
+		[CCode (cname = "as_launchable_kind_from_string")]
+		[Version (since = "0.6.13")]
+		public static As.LaunchableKind kind_from_string (string kind);
+		[CCode (cname = "as_launchable_kind_to_string")]
+		[Version (since = "0.6.13")]
+		public static unowned string kind_to_string (As.LaunchableKind kind);
+		[CCode (cname = "as_launchable_set_kind")]
+		[Version (since = "0.6.13")]
+		public void set_kind (As.LaunchableKind kind);
+		[CCode (cname = "as_launchable_set_value")]
+		[Version (since = "0.6.13")]
+		public void set_value (string value);
+	}
+	[CCode (cheader_filename = "appstream-glib.h", type_id = "as_problem_get_type ()")]
+	public class Problem : GLib.Object {
+		[CCode (cname = "as_problem_new", has_construct_function = false)]
+		[Version (since = "0.1.4")]
+		public Problem ();
+		[CCode (cname = "as_problem_get_kind")]
+		[Version (since = "0.1.4")]
+		public As.ProblemKind get_kind ();
+		[CCode (cname = "as_problem_get_line_number")]
+		[Version (since = "0.1.4")]
+		public uint get_line_number ();
+		[CCode (cname = "as_problem_get_message")]
+		[Version (since = "0.1.4")]
+		public unowned string get_message ();
+		[CCode (cname = "as_problem_kind_to_string")]
+		[Version (since = "0.1.4")]
+		public static unowned string kind_to_string (As.ProblemKind kind);
+		[CCode (cname = "as_problem_set_kind")]
+		[Version (since = "0.1.4")]
+		public void set_kind (As.ProblemKind kind);
+		[CCode (cname = "as_problem_set_line_number")]
+		[Version (since = "0.1.4")]
+		public void set_line_number (uint line_number);
+		[CCode (cname = "as_problem_set_message")]
+		[Version (since = "0.1.4")]
+		public void set_message (string message);
+	}
+	[CCode (cheader_filename = "appstream-glib.h", type_id = "as_provide_get_type ()")]
+	public class Provide : GLib.Object {
+		[CCode (cname = "as_provide_new", has_construct_function = false)]
+		[Version (since = "0.1.6")]
+		public Provide ();
+		[CCode (cname = "as_provide_get_kind")]
+		[Version (since = "0.1.6")]
+		public As.ProvideKind get_kind ();
+		[CCode (cname = "as_provide_get_value")]
+		[Version (since = "0.1.6")]
+		public unowned string get_value ();
+		[CCode (cname = "as_provide_kind_from_string")]
+		[Version (since = "0.1.6")]
+		public static As.ProvideKind kind_from_string (string kind);
+		[CCode (cname = "as_provide_kind_to_string")]
+		[Version (since = "0.1.6")]
+		public static unowned string kind_to_string (As.ProvideKind kind);
+		[CCode (cname = "as_provide_set_kind")]
+		[Version (since = "0.1.6")]
+		public void set_kind (As.ProvideKind kind);
+		[CCode (cname = "as_provide_set_value")]
+		[Version (since = "0.1.6")]
+		public void set_value (string value);
+	}
+	[CCode (cheader_filename = "appstream-glib.h", type_id = "as_release_get_type ()")]
+	public class Release : GLib.Object {
+		[CCode (cname = "as_release_new", has_construct_function = false)]
+		[Version (since = "0.1.0")]
+		public Release ();
+		[CCode (cname = "as_release_add_checksum")]
+		[Version (since = "0.4.2")]
+		public void add_checksum (As.Checksum checksum);
+		[CCode (cname = "as_release_add_location")]
+		[Version (since = "0.3.5")]
+		public void add_location (string location);
+		[CCode (cname = "as_release_get_blob")]
+		[Version (since = "0.5.2")]
+		public GLib.Bytes get_blob (string filename);
+		[CCode (cname = "as_release_get_checksum_by_fn")]
+		[Version (since = "0.4.2")]
+		public unowned As.Checksum get_checksum_by_fn (string fn);
+		[CCode (cname = "as_release_get_checksum_by_target")]
+		[Version (since = "0.4.2")]
+		public unowned As.Checksum get_checksum_by_target (As.ChecksumTarget target);
+		[CCode (cname = "as_release_get_checksums")]
+		[Version (since = "0.4.2")]
+		public unowned GLib.GenericArray<As.Checksum> get_checksums ();
+		[CCode (cname = "as_release_get_description")]
+		[Version (since = "0.1.0")]
+		public unowned string get_description (string locale);
+		[CCode (cname = "as_release_get_location_default")]
+		[Version (since = "0.3.5")]
+		public unowned string get_location_default ();
+		[CCode (cname = "as_release_get_locations")]
+		[Version (since = "0.3.5")]
+		public unowned GLib.GenericArray<string> get_locations ();
+		[CCode (cname = "as_release_get_size")]
+		[Version (since = "0.5.2")]
+		public uint64 get_size (As.SizeKind kind);
+		[CCode (cname = "as_release_get_state")]
+		[Version (since = "0.5.8")]
+		public As.ReleaseState get_state ();
+		[CCode (cname = "as_release_get_timestamp")]
+		[Version (since = "0.1.0")]
+		public uint64 get_timestamp ();
+		[CCode (cname = "as_release_get_urgency")]
+		[Version (since = "0.5.1")]
+		public As.UrgencyKind get_urgency ();
+		[CCode (cname = "as_release_get_version")]
+		[Version (since = "0.1.0")]
+		public unowned string get_version ();
+		[CCode (cname = "as_release_set_blob")]
+		[Version (since = "0.5.2")]
+		public void set_blob (string filename, GLib.Bytes blob);
+		[CCode (cname = "as_release_set_description")]
+		[Version (since = "0.1.0")]
+		public void set_description (string locale, string description);
+		[CCode (cname = "as_release_set_size")]
+		[Version (since = "0.5.2")]
+		public void set_size (As.SizeKind kind, uint64 size);
+		[CCode (cname = "as_release_set_state")]
+		[Version (since = "0.5.8")]
+		public void set_state (As.ReleaseState state);
+		[CCode (cname = "as_release_set_timestamp")]
+		[Version (since = "0.1.0")]
+		public void set_timestamp (uint64 timestamp);
+		[CCode (cname = "as_release_set_urgency")]
+		[Version (since = "0.5.1")]
+		public void set_urgency (As.UrgencyKind urgency);
+		[CCode (cname = "as_release_set_version")]
+		[Version (since = "0.1.0")]
+		public void set_version (string version);
+		[CCode (cname = "as_release_state_from_string")]
+		[Version (since = "0.6.6")]
+		public static As.ReleaseState state_from_string (string state);
+		[CCode (cname = "as_release_state_to_string")]
+		[Version (since = "0.6.6")]
+		public static unowned string state_to_string (As.ReleaseState state);
+		[CCode (cname = "as_release_vercmp")]
+		[Version (since = "0.4.2")]
+		public int vercmp (As.Release rel2);
+	}
+	[CCode (cheader_filename = "appstream-glib.h", type_id = "as_require_get_type ()")]
+	public class Require : GLib.Object {
+		[CCode (cname = "as_require_new", has_construct_function = false)]
+		[Version (since = "0.6.7")]
+		public Require ();
+		[CCode (cname = "as_require_compare_from_string")]
+		[Version (since = "0.6.7")]
+		public static As.RequireCompare compare_from_string (string compare);
+		[CCode (cname = "as_require_compare_to_string")]
+		[Version (since = "0.6.7")]
+		public static unowned string compare_to_string (As.RequireCompare compare);
+		[CCode (cname = "as_require_get_compare")]
+		[Version (since = "0.6.7")]
+		public As.RequireCompare get_compare ();
+		[CCode (cname = "as_require_get_kind")]
+		[Version (since = "0.6.7")]
+		public As.RequireKind get_kind ();
+		[CCode (cname = "as_require_get_value")]
+		[Version (since = "0.6.7")]
+		public unowned string get_value ();
+		[CCode (cname = "as_require_get_version")]
+		[Version (since = "0.6.7")]
+		public unowned string get_version ();
+		[CCode (cname = "as_require_kind_from_string")]
+		[Version (since = "0.6.7")]
+		public static As.RequireKind kind_from_string (string kind);
+		[CCode (cname = "as_require_kind_to_string")]
+		[Version (since = "0.6.7")]
+		public static unowned string kind_to_string (As.RequireKind kind);
+		[CCode (cname = "as_require_set_compare")]
+		[Version (since = "0.6.7")]
+		public void set_compare (As.RequireCompare compare);
+		[CCode (cname = "as_require_set_kind")]
+		[Version (since = "0.6.7")]
+		public void set_kind (As.RequireKind kind);
+		[CCode (cname = "as_require_set_value")]
+		[Version (since = "0.6.7")]
+		public void set_value (string value);
+		[CCode (cname = "as_require_set_version")]
+		[Version (since = "0.6.7")]
+		public void set_version (string version);
+		[CCode (cname = "as_require_version_compare")]
+		[Version (since = "0.6.7")]
+		public bool version_compare (string version) throws GLib.Error;
+	}
+	[CCode (cheader_filename = "appstream-glib.h", type_id = "as_review_get_type ()")]
+	public class Review : GLib.Object {
+		[CCode (cname = "as_review_new", has_construct_function = false)]
+		[Version (since = "0.6.1")]
+		public Review ();
+		[CCode (cname = "as_review_add_flags")]
+		[Version (since = "0.6.1")]
+		public void add_flags (As.ReviewFlags flags);
+		[CCode (cname = "as_review_add_metadata")]
+		[Version (since = "0.6.1")]
+		public void add_metadata (string key, string value);
+		[CCode (cname = "as_review_equal")]
+		[Version (since = "0.6.1")]
+		public bool equal (As.Review review2);
+		[CCode (cname = "as_review_get_date")]
+		[Version (since = "0.6.1")]
+		public unowned GLib.DateTime get_date ();
+		[CCode (cname = "as_review_get_description")]
+		[Version (since = "0.6.1")]
+		public unowned string get_description ();
+		[CCode (cname = "as_review_get_flags")]
+		[Version (since = "0.6.1")]
+		public As.ReviewFlags get_flags ();
+		[CCode (cname = "as_review_get_id")]
+		[Version (since = "0.6.1")]
+		public unowned string get_id ();
+		[CCode (cname = "as_review_get_locale")]
+		[Version (since = "0.6.1")]
+		public unowned string get_locale ();
+		[CCode (cname = "as_review_get_metadata_item")]
+		[Version (since = "0.6.1")]
+		public unowned string get_metadata_item (string key);
+		[CCode (cname = "as_review_get_priority")]
+		[Version (since = "0.6.1")]
+		public int get_priority ();
+		[CCode (cname = "as_review_get_rating")]
+		[Version (since = "0.6.1")]
+		public int get_rating ();
+		[CCode (cname = "as_review_get_reviewer_id")]
+		[Version (since = "0.6.1")]
+		public unowned string get_reviewer_id ();
+		[CCode (cname = "as_review_get_reviewer_name")]
+		[Version (since = "0.6.1")]
+		public unowned string get_reviewer_name ();
+		[CCode (cname = "as_review_get_summary")]
+		[Version (since = "0.6.1")]
+		public unowned string get_summary ();
+		[CCode (cname = "as_review_get_version")]
+		[Version (since = "0.6.1")]
+		public unowned string get_version ();
+		[CCode (cname = "as_review_set_date")]
+		[Version (since = "0.6.1")]
+		public void set_date (GLib.DateTime date);
+		[CCode (cname = "as_review_set_description")]
+		[Version (since = "0.6.1")]
+		public void set_description (string description);
+		[CCode (cname = "as_review_set_flags")]
+		[Version (since = "0.6.1")]
+		public void set_flags (As.ReviewFlags flags);
+		[CCode (cname = "as_review_set_id")]
+		[Version (since = "0.6.1")]
+		public void set_id (string id);
+		[CCode (cname = "as_review_set_locale")]
+		[Version (since = "0.6.1")]
+		public void set_locale (string locale);
+		[CCode (cname = "as_review_set_priority")]
+		[Version (since = "0.6.1")]
+		public void set_priority (int priority);
+		[CCode (cname = "as_review_set_rating")]
+		[Version (since = "0.6.1")]
+		public void set_rating (int rating);
+		[CCode (cname = "as_review_set_reviewer_id")]
+		[Version (since = "0.6.1")]
+		public void set_reviewer_id (string reviewer_id);
+		[CCode (cname = "as_review_set_reviewer_name")]
+		[Version (since = "0.6.1")]
+		public void set_reviewer_name (string reviewer_name);
+		[CCode (cname = "as_review_set_summary")]
+		[Version (since = "0.6.1")]
+		public void set_summary (string summary);
+		[CCode (cname = "as_review_set_version")]
+		[Version (since = "0.6.1")]
+		public void set_version (string version);
+		[NoAccessorMethod]
+		[Version (since = "0.6.1")]
+		public As.Review date { owned get; set construct; }
+		[NoAccessorMethod]
+		[Version (since = "0.6.1")]
+		public string description { owned get; set construct; }
+		[NoAccessorMethod]
+		[Version (since = "0.6.1")]
+		public uint64 flags { get; set construct; }
+		[NoAccessorMethod]
+		[Version (since = "0.6.1")]
+		public string id { owned get; set construct; }
+		[NoAccessorMethod]
+		[Version (since = "0.6.1")]
+		public string locale { owned get; set construct; }
+		[NoAccessorMethod]
+		[Version (since = "0.6.1")]
+		public int rating { get; set construct; }
+		[NoAccessorMethod]
+		[Version (since = "0.6.1")]
+		public string reviewer_id { owned get; set construct; }
+		[NoAccessorMethod]
+		[Version (since = "0.6.1")]
+		public string reviewer_name { owned get; set construct; }
+		[NoAccessorMethod]
+		[Version (since = "0.6.1")]
+		public string summary { owned get; set construct; }
+		[NoAccessorMethod]
+		[Version (since = "0.6.1")]
+		public string version { owned get; set construct; }
+	}
+	[CCode (cheader_filename = "appstream-glib.h", type_id = "as_screenshot_get_type ()")]
+	public class Screenshot : GLib.Object {
+		[CCode (cname = "as_screenshot_new", has_construct_function = false)]
+		[Version (since = "0.1.0")]
+		public Screenshot ();
+		[CCode (cname = "as_screenshot_add_image")]
+		[Version (since = "0.1.0")]
+		public void add_image (As.Image image);
+		[CCode (cname = "as_screenshot_equal")]
+		[Version (since = "0.5.7")]
+		public bool equal (As.Screenshot screenshot2);
+		[CCode (cname = "as_screenshot_get_caption")]
+		[Version (since = "0.1.0")]
+		public unowned string get_caption (string locale);
+		[CCode (cname = "as_screenshot_get_image")]
+		[Version (since = "0.2.2")]
+		public unowned As.Image get_image (uint width, uint height);
+		[CCode (cname = "as_screenshot_get_image_for_locale")]
+		[Version (since = "0.5.14")]
+		public unowned As.Image get_image_for_locale (string locale, uint width, uint height);
+		[CCode (cname = "as_screenshot_get_images")]
+		[Version (since = "0.1.0")]
+		public unowned GLib.GenericArray<As.Image> get_images ();
+		[CCode (cname = "as_screenshot_get_images_for_locale")]
+		[Version (since = "0.5.14")]
+		public GLib.GenericArray<weak As.Image> get_images_for_locale (string locale);
+		[CCode (cname = "as_screenshot_get_kind")]
+		[Version (since = "0.1.0")]
+		public As.ScreenshotKind get_kind ();
+		[CCode (cname = "as_screenshot_get_priority")]
+		[Version (since = "0.3.1")]
+		public int get_priority ();
+		[CCode (cname = "as_screenshot_get_source")]
+		[Version (since = "0.1.6")]
+		public unowned As.Image get_source ();
+		[CCode (cname = "as_screenshot_kind_from_string")]
+		[Version (since = "0.1.0")]
+		public static As.ScreenshotKind kind_from_string (string kind);
+		[CCode (cname = "as_screenshot_kind_to_string")]
+		[Version (since = "0.1.0")]
+		public static unowned string kind_to_string (As.ScreenshotKind kind);
+		[CCode (cname = "as_screenshot_set_caption")]
+		[Version (since = "0.1.0")]
+		public void set_caption (string locale, string caption);
+		[CCode (cname = "as_screenshot_set_kind")]
+		[Version (since = "0.1.0")]
+		public void set_kind (As.ScreenshotKind kind);
+		[CCode (cname = "as_screenshot_set_priority")]
+		[Version (since = "0.3.1")]
+		public void set_priority (int priority);
+	}
+	[CCode (cheader_filename = "appstream-glib.h", type_id = "as_store_get_type ()")]
+	public class Store : GLib.Object {
+		[CCode (cname = "as_store_new", has_construct_function = false)]
+		[Version (since = "0.1.0")]
+		public Store ();
+		[CCode (cname = "as_store_add_app")]
+		[Version (since = "0.1.0")]
+		public void add_app (As.App app);
+		[CCode (cname = "as_store_add_apps")]
+		[Version (since = "0.6.4")]
+		public void add_apps (GLib.GenericArray<As.App> apps);
+		[CCode (cname = "as_store_add_filter")]
+		[Version (since = "0.3.5")]
+		public void add_filter (As.AppKind kind);
+		[CCode (cname = "as_store_add_metadata_index")]
+		[Version (since = "0.3.0")]
+		public void add_metadata_index (string key);
+		[CCode (cname = "as_store_convert_icons")]
+		[Version (since = "0.3.1")]
+		public bool convert_icons (As.IconKind kind) throws GLib.Error;
+		[CCode (cname = "as_store_error_quark")]
+		[Version (since = "0.1.2")]
+		public static GLib.Quark error_quark ();
+		[CCode (cname = "as_store_from_bytes")]
+		[Version (since = "0.5.2")]
+		public bool from_bytes (GLib.Bytes bytes, GLib.Cancellable? cancellable = null) throws GLib.Error;
+		[CCode (cname = "as_store_from_file")]
+		[Version (since = "0.1.0")]
+		public bool from_file (GLib.File file, string icon_root, GLib.Cancellable? cancellable = null) throws GLib.Error;
+		[CCode (cname = "as_store_from_xml")]
+		[Version (since = "0.1.1")]
+		public bool from_xml (string data, string icon_root) throws GLib.Error;
+		[CCode (cname = "as_store_get_add_flags")]
+		[Version (since = "0.2.2")]
+		public As.StoreAddFlags get_add_flags ();
+		[CCode (cname = "as_store_get_api_version")]
+		[Version (since = "0.1.1")]
+		public double get_api_version ();
+		[CCode (cname = "as_store_get_app_by_id")]
+		[Version (since = "0.1.0")]
+		public unowned As.App get_app_by_id (string id);
+		[CCode (cname = "as_store_get_app_by_id_ignore_prefix")]
+		[Version (since = "0.5.12")]
+		public unowned As.App get_app_by_id_ignore_prefix (string id);
+		[CCode (cname = "as_store_get_app_by_id_with_fallbacks")]
+		[Version (since = "0.4.1")]
+		public unowned As.App get_app_by_id_with_fallbacks (string id);
+		[CCode (cname = "as_store_get_app_by_pkgname")]
+		[Version (since = "0.1.0")]
+		public unowned As.App get_app_by_pkgname (string pkgname);
+		[CCode (cname = "as_store_get_app_by_pkgnames")]
+		[Version (since = "0.4.1")]
+		public unowned As.App get_app_by_pkgnames (string pkgnames);
+		[CCode (cname = "as_store_get_app_by_provide")]
+		[Version (since = "0.5.0")]
+		public unowned As.App get_app_by_provide (As.ProvideKind kind, string value);
+		[CCode (cname = "as_store_get_app_by_unique_id")]
+		[Version (since = "0.6.1")]
+		public unowned As.App get_app_by_unique_id (string unique_id, As.StoreSearchFlags search_flags);
+		[CCode (cname = "as_store_get_apps")]
+		[Version (since = "0.1.0")]
+		public unowned GLib.GenericArray<As.App> get_apps ();
+		[CCode (cname = "as_store_get_apps_by_id")]
+		[Version (since = "0.5.12")]
+		public GLib.GenericArray<weak As.App> get_apps_by_id (string id);
+		[CCode (cname = "as_store_get_apps_by_metadata")]
+		[Version (since = "0.1.4")]
+		public GLib.GenericArray<weak As.App> get_apps_by_metadata (string key, string value);
+		[CCode (cname = "as_store_get_builder_id")]
+		[Version (since = "0.2.5")]
+		public unowned string get_builder_id ();
+		[CCode (cname = "as_store_get_destdir")]
+		[Version (since = "0.2.4")]
+		public unowned string get_destdir ();
+		[CCode (cname = "as_store_get_origin")]
+		[Version (since = "0.1.1")]
+		public unowned string get_origin ();
+		[CCode (cname = "as_store_get_search_match")]
+		[Version (since = "0.6.13")]
+		public As.AppSearchMatch get_search_match ();
+		[CCode (cname = "as_store_get_size")]
+		[Version (since = "0.1.0")]
+		public uint get_size ();
+		[CCode (cname = "as_store_get_watch_flags")]
+		[Version (since = "0.4.2")]
+		public As.StoreWatchFlags get_watch_flags ();
+		[CCode (cname = "as_store_load")]
+		[Version (since = "0.1.2")]
+		public bool load (As.StoreLoadFlags flags, GLib.Cancellable? cancellable = null) throws GLib.Error;
+		[CCode (cname = "as_store_load_path")]
+		[Version (since = "0.2.2")]
+		public bool load_path (string path, GLib.Cancellable? cancellable = null) throws GLib.Error;
+		[CCode (cname = "as_store_load_search_cache")]
+		[Version (since = "0.6.5")]
+		public void load_search_cache ();
+		[CCode (cname = "as_store_remove_all")]
+		[Version (since = "0.2.5")]
+		public void remove_all ();
+		[CCode (cname = "as_store_remove_app")]
+		[Version (since = "0.1.0")]
+		public void remove_app (As.App app);
+		[CCode (cname = "as_store_remove_app_by_id")]
+		[Version (since = "0.3.0")]
+		public void remove_app_by_id (string id);
+		[CCode (cname = "as_store_remove_apps_with_veto")]
+		[Version (since = "0.5.13")]
+		public void remove_apps_with_veto ();
+		[CCode (cname = "as_store_remove_filter")]
+		[Version (since = "0.3.5")]
+		public void remove_filter (As.AppKind kind);
+		[CCode (cname = "as_store_set_add_flags")]
+		[Version (since = "0.2.2")]
+		public void set_add_flags (As.StoreAddFlags add_flags);
+		[CCode (cname = "as_store_set_api_version")]
+		[Version (since = "0.1.1")]
+		public void set_api_version (double api_version);
+		[CCode (cname = "as_store_set_builder_id")]
+		[Version (since = "0.2.5")]
+		public void set_builder_id (string builder_id);
+		[CCode (cname = "as_store_set_destdir")]
+		[Version (since = "0.2.4")]
+		public void set_destdir (string destdir);
+		[CCode (cname = "as_store_set_origin")]
+		[Version (since = "0.1.1")]
+		public void set_origin (string origin);
+		[CCode (cname = "as_store_set_search_match")]
+		[Version (since = "0.6.5")]
+		public void set_search_match (As.AppSearchMatch search_match);
+		[CCode (cname = "as_store_set_watch_flags")]
+		[Version (since = "0.4.2")]
+		public void set_watch_flags (As.StoreWatchFlags watch_flags);
+		[CCode (cname = "as_store_to_file")]
+		[Version (since = "0.1.0")]
+		public bool to_file (GLib.File file, As.NodeToXmlFlags flags, GLib.Cancellable? cancellable = null) throws GLib.Error;
+		[CCode (cname = "as_store_to_xml")]
+		[Version (since = "0.1.0")]
+		public GLib.StringBuilder to_xml (As.NodeToXmlFlags flags);
+		[CCode (cname = "as_store_validate")]
+		[Version (since = "0.2.4")]
+		public GLib.GenericArray<weak As.Problem> validate (As.AppValidateFlags flags) throws GLib.Error;
+		[Version (since = "0.6.5")]
+		public virtual signal void app_added (As.App app);
+		[Version (since = "0.6.5")]
+		public virtual signal void app_changed (As.App app);
+		[Version (since = "0.6.5")]
+		public virtual signal void app_removed (As.App app);
+		[Version (since = "0.1.2")]
+		public virtual signal void changed ();
+	}
+	[CCode (cheader_filename = "appstream-glib.h", type_id = "as_suggest_get_type ()")]
+	public class Suggest : GLib.Object {
+		[CCode (cname = "as_suggest_new", has_construct_function = false)]
+		[Version (since = "0.6.1")]
+		public Suggest ();
+		[CCode (cname = "as_suggest_add_id")]
+		[Version (since = "0.6.1")]
+		public void add_id (string id);
+		[CCode (cname = "as_suggest_get_ids")]
+		[Version (since = "0.6.1")]
+		public unowned GLib.GenericArray<string> get_ids ();
+		[CCode (cname = "as_suggest_get_kind")]
+		[Version (since = "0.6.1")]
+		public As.SuggestKind get_kind ();
+		[CCode (cname = "as_suggest_kind_from_string")]
+		[Version (since = "0.6.1")]
+		public static As.SuggestKind kind_from_string (string kind);
+		[CCode (cname = "as_suggest_kind_to_string")]
+		[Version (since = "0.6.1")]
+		public static unowned string kind_to_string (As.SuggestKind kind);
+		[CCode (cname = "as_suggest_set_kind")]
+		[Version (since = "0.6.1")]
+		public void set_kind (As.SuggestKind kind);
+	}
+	[CCode (cheader_filename = "appstream-glib.h", type_id = "as_translation_get_type ()")]
+	public class Translation : GLib.Object {
+		[CCode (cname = "as_translation_new", has_construct_function = false)]
+		[Version (since = "0.5.8")]
+		public Translation ();
+		[CCode (cname = "as_translation_get_id")]
+		[Version (since = "0.5.8")]
+		public unowned string get_id ();
+		[CCode (cname = "as_translation_get_kind")]
+		[Version (since = "0.5.8")]
+		public As.TranslationKind get_kind ();
+		[CCode (cname = "as_translation_kind_from_string")]
+		[Version (since = "0.5.8")]
+		public static As.TranslationKind kind_from_string (string kind);
+		[CCode (cname = "as_translation_kind_to_string")]
+		[Version (since = "0.5.8")]
+		public static unowned string kind_to_string (As.TranslationKind kind);
+		[CCode (cname = "as_translation_set_id")]
+		[Version (since = "0.5.8")]
+		public void set_id (string id);
+		[CCode (cname = "as_translation_set_kind")]
+		[Version (since = "0.5.8")]
+		public void set_kind (As.TranslationKind kind);
+	}
+	[CCode (cheader_filename = "appstream-glib.h")]
+	[SimpleType]
+	public struct ImageAlphaFlags : uint {
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_APP_ERROR_", has_type_id = false)]
+	public enum AppError {
+		FAILED,
+		INVALID_TYPE
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_APP_KIND_", has_type_id = false)]
+	public enum AppKind {
+		UNKNOWN,
+		DESKTOP,
+		FONT,
+		CODEC,
+		INPUT_METHOD,
+		WEB_APP,
+		SOURCE,
+		ADDON,
+		FIRMWARE,
+		RUNTIME,
+		GENERIC,
+		OS_UPDATE,
+		OS_UPGRADE,
+		SHELL_EXTENSION,
+		LOCALIZATION,
+		CONSOLE,
+		DRIVER
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_APP_MERGE_KIND_", has_type_id = false)]
+	public enum AppMergeKind {
+		UNKNOWN,
+		NONE,
+		REPLACE,
+		APPEND
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_APP_PARSE_FLAG_", has_type_id = false)]
+	[Flags]
+	public enum AppParseFlags {
+		NONE,
+		USE_HEURISTICS,
+		KEEP_COMMENTS,
+		CONVERT_TRANSLATABLE,
+		APPEND_DATA,
+		ALLOW_VETO,
+		USE_FALLBACKS,
+		ADD_ALL_METADATA,
+		ONLY_NATIVE_LANGS
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_APP_QUIRK_", has_type_id = false)]
+	[Flags]
+	public enum AppQuirk {
+		NONE,
+		PROVENANCE,
+		COMPULSORY,
+		HAS_SOURCE,
+		MATCH_ANY_PREFIX,
+		NEEDS_REBOOT,
+		NOT_REVIEWABLE,
+		HAS_SHORTCUT,
+		NOT_LAUNCHABLE,
+		NEEDS_USER_ACTION,
+		IS_PROXY,
+		REMOVABLE_HARDWARE
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_APP_SCOPE_", has_type_id = false)]
+	public enum AppScope {
+		UNKNOWN,
+		USER,
+		SYSTEM
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_APP_SEARCH_MATCH_", has_type_id = false)]
+	[Flags]
+	public enum AppSearchMatch {
+		NONE,
+		MIMETYPE,
+		PKGNAME,
+		DESCRIPTION,
+		COMMENT,
+		NAME,
+		KEYWORD,
+		ID,
+		ORIGIN
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_APP_STATE_", has_type_id = false)]
+	public enum AppState {
+		UNKNOWN,
+		INSTALLED,
+		AVAILABLE,
+		AVAILABLE_LOCAL,
+		UPDATABLE,
+		UNAVAILABLE,
+		QUEUED_FOR_INSTALL,
+		INSTALLING,
+		REMOVING,
+		UPDATABLE_LIVE,
+		PURCHASABLE,
+		PURCHASING
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_APP_SUBSUME_FLAG_", has_type_id = false)]
+	[Flags]
+	public enum AppSubsumeFlags {
+		NONE,
+		NO_OVERWRITE,
+		BOTH_WAYS,
+		REPLACE,
+		KIND,
+		STATE,
+		BUNDLES,
+		TRANSLATIONS,
+		RELEASES,
+		KUDOS,
+		CATEGORIES,
+		PERMISSIONS,
+		EXTENDS,
+		COMPULSORY,
+		SCREENSHOTS,
+		REVIEWS,
+		CONTENT_RATINGS,
+		PROVIDES,
+		ICONS,
+		MIMETYPES,
+		VETOS,
+		LANGUAGES,
+		NAME,
+		COMMENT,
+		DEVELOPER_NAME,
+		DESCRIPTION,
+		METADATA,
+		URL,
+		KEYWORDS,
+		FORMATS,
+		BRANCH,
+		ORIGIN,
+		METADATA_LICENSE,
+		PROJECT_LICENSE,
+		PROJECT_GROUP,
+		SOURCE_KIND,
+		SUGGESTS,
+		LAUNCHABLES
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_APP_TRUST_FLAG_", has_type_id = false)]
+	public enum AppTrustFlags {
+		COMPLETE,
+		CHECK_DUPLICATES,
+		CHECK_VALID_UTF8
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_APP_VALIDATE_FLAG_", has_type_id = false)]
+	public enum AppValidateFlags {
+		NONE,
+		RELAX,
+		STRICT,
+		NO_NETWORK,
+		ALL_APPS
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_BUNDLE_KIND_", has_type_id = false)]
+	public enum BundleKind {
+		UNKNOWN,
+		LIMBA,
+		FLATPAK,
+		SNAP,
+		PACKAGE,
+		CABINET,
+		APPIMAGE
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_CHECKSUM_TARGET_", has_type_id = false)]
+	public enum ChecksumTarget {
+		UNKNOWN,
+		CONTAINER,
+		CONTENT
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_CONTENT_RATING_VALUE_", has_type_id = false)]
+	public enum ContentRatingValue {
+		UNKNOWN,
+		NONE,
+		MILD,
+		MODERATE,
+		INTENSE
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_FORMAT_KIND_", has_type_id = false)]
+	public enum FormatKind {
+		UNKNOWN,
+		APPSTREAM,
+		DESKTOP,
+		APPDATA,
+		METAINFO
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_ICON_ERROR_", has_type_id = false)]
+	public enum IconError {
+		FAILED
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_ICON_KIND_", has_type_id = false)]
+	public enum IconKind {
+		UNKNOWN,
+		STOCK,
+		CACHED,
+		REMOTE,
+		EMBEDDED,
+		LOCAL
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_ICON_LOAD_FLAG_", has_type_id = false)]
+	public enum IconLoadFlags {
+		NONE,
+		SEARCH_SIZE
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_ID_KIND_", has_type_id = false)]
+	public enum IdKind {
+		UNKNOWN,
+		DESKTOP,
+		FONT,
+		CODEC,
+		INPUT_METHOD,
+		WEB_APP,
+		SOURCE,
+		ADDON,
+		FIRMWARE,
+		RUNTIME,
+		GENERIC
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_IMAGE_KIND_", has_type_id = false)]
+	public enum ImageKind {
+		UNKNOWN,
+		SOURCE,
+		THUMBNAIL
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_IMAGE_LOAD_FLAG_", has_type_id = false)]
+	public enum ImageLoadFlags {
+		NONE,
+		SHARPEN,
+		SET_BASENAME,
+		SET_CHECKSUM,
+		ONLY_SUPPORTED
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_IMAGE_SAVE_FLAG_", has_type_id = false)]
+	public enum ImageSaveFlags {
+		NONE,
+		PAD_16_9,
+		SHARPEN,
+		BLUR
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_INF_LOAD_FLAG_", has_type_id = false)]
+	[Flags]
+	public enum InfLoadFlags {
+		NONE,
+		STRICT,
+		CASE_INSENSITIVE
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_KUDO_KIND_", has_type_id = false)]
+	public enum KudoKind {
+		UNKNOWN,
+		SEARCH_PROVIDER,
+		USER_DOCS,
+		APP_MENU,
+		MODERN_TOOLKIT,
+		NOTIFICATIONS,
+		HIGH_CONTRAST,
+		HI_DPI_ICON
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_LAUNCHABLE_KIND_", has_type_id = false)]
+	public enum LaunchableKind {
+		UNKNOWN,
+		DESKTOP_ID
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_MARKUP_CONVERT_FLAG_", has_type_id = false)]
+	[Flags]
+	public enum MarkupConvertFlag {
+		NONE,
+		IGNORE_ERRORS
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_MARKUP_CONVERT_FORMAT_", has_type_id = false)]
+	public enum MarkupConvertFormat {
+		SIMPLE,
+		MARKDOWN,
+		NULL,
+		APPSTREAM,
+		HTML
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_NODE_FROM_XML_FLAG_", has_type_id = false)]
+	[Flags]
+	public enum NodeFromXmlFlags {
+		NONE,
+		LITERAL_TEXT,
+		KEEP_COMMENTS,
+		ONLY_NATIVE_LANGS
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_NODE_INSERT_FLAG_", has_type_id = false)]
+	public enum NodeInsertFlags {
+		NONE,
+		PRE_ESCAPED,
+		SWAPPED,
+		NO_MARKUP,
+		DEDUPE_LANG,
+		MARK_TRANSLATABLE,
+		BASE64_ENCODED
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_NODE_TO_XML_FLAG_", has_type_id = false)]
+	public enum NodeToXmlFlags {
+		NONE,
+		ADD_HEADER,
+		FORMAT_MULTILINE,
+		FORMAT_INDENT,
+		INCLUDE_SIBLINGS,
+		SORT_CHILDREN
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_PROBLEM_KIND_", has_type_id = false)]
+	public enum ProblemKind {
+		UNKNOWN,
+		TAG_DUPLICATED,
+		TAG_MISSING,
+		TAG_INVALID,
+		ATTRIBUTE_MISSING,
+		ATTRIBUTE_INVALID,
+		MARKUP_INVALID,
+		STYLE_INCORRECT,
+		TRANSLATIONS_REQUIRED,
+		DUPLICATE_DATA,
+		VALUE_MISSING,
+		URL_NOT_FOUND,
+		FILE_INVALID,
+		ASPECT_RATIO_INCORRECT,
+		RESOLUTION_INCORRECT
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_PROVIDE_KIND_", has_type_id = false)]
+	public enum ProvideKind {
+		UNKNOWN,
+		LIBRARY,
+		BINARY,
+		FONT,
+		MODALIAS,
+		FIRMWARE_RUNTIME,
+		PYTHON2,
+		PYTHON3,
+		DBUS_SESSION,
+		DBUS_SYSTEM,
+		FIRMWARE_FLASHED
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_RELEASE_STATE_", has_type_id = false)]
+	public enum ReleaseState {
+		UNKNOWN,
+		INSTALLED,
+		AVAILABLE
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_REQUIRE_COMPARE_", has_type_id = false)]
+	public enum RequireCompare {
+		UNKNOWN,
+		EQ,
+		NE,
+		LT,
+		GT,
+		LE,
+		GE,
+		GLOB,
+		REGEX
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_REQUIRE_KIND_", has_type_id = false)]
+	public enum RequireKind {
+		UNKNOWN,
+		ID,
+		FIRMWARE
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_REVIEW_FLAG_", has_type_id = false)]
+	[Flags]
+	[Version (since = "0.6.1")]
+	public enum ReviewFlags {
+		NONE,
+		SELF,
+		VOTED
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_SCREENSHOT_KIND_", has_type_id = false)]
+	public enum ScreenshotKind {
+		UNKNOWN,
+		NORMAL,
+		DEFAULT
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_SIZE_KIND_", has_type_id = false)]
+	public enum SizeKind {
+		UNKNOWN,
+		INSTALLED,
+		DOWNLOAD
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_STORE_ADD_FLAG_", has_type_id = false)]
+	[Flags]
+	public enum StoreAddFlags {
+		NONE,
+		PREFER_LOCAL,
+		USE_UNIQUE_ID,
+		USE_MERGE_HEURISTIC,
+		ONLY_NATIVE_LANGS
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_STORE_ERROR_", has_type_id = false)]
+	public enum StoreError {
+		FAILED
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_STORE_LOAD_FLAG_", has_type_id = false)]
+	[Flags]
+	public enum StoreLoadFlags {
+		NONE,
+		APP_INFO_SYSTEM,
+		APP_INFO_USER,
+		APP_INSTALL,
+		APPDATA,
+		DESKTOP,
+		ALLOW_VETO,
+		FLATPAK_USER,
+		FLATPAK_SYSTEM,
+		IGNORE_INVALID,
+		ONLY_UNCOMPRESSED,
+		ONLY_MERGE_APPS
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_STORE_SEARCH_FLAG_", has_type_id = false)]
+	public enum StoreSearchFlags {
+		NONE,
+		USE_WILDCARDS
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_STORE_WATCH_FLAG_", has_type_id = false)]
+	public enum StoreWatchFlags {
+		NONE,
+		ADDED,
+		REMOVED
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_SUGGEST_KIND_", has_type_id = false)]
+	public enum SuggestKind {
+		UNKNOWN,
+		UPSTREAM,
+		HEURISTIC
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_TAG_", has_type_id = false)]
+	public enum Tag {
+		UNKNOWN,
+		COMPONENTS,
+		COMPONENT,
+		ID,
+		PKGNAME,
+		NAME,
+		SUMMARY,
+		DESCRIPTION,
+		URL,
+		ICON,
+		CATEGORIES,
+		CATEGORY,
+		KEYWORDS,
+		KEYWORD,
+		MIMETYPES,
+		MIMETYPE,
+		PROJECT_GROUP,
+		PROJECT_LICENSE,
+		SCREENSHOT,
+		SCREENSHOTS,
+		UPDATE_CONTACT,
+		IMAGE,
+		COMPULSORY_FOR_DESKTOP,
+		PRIORITY,
+		CAPTION,
+		LANGUAGES,
+		LANG,
+		METADATA,
+		VALUE,
+		RELEASES,
+		RELEASE,
+		ARCHITECTURES,
+		ARCH,
+		METADATA_LICENSE,
+		PROVIDES,
+		EXTENDS,
+		DEVELOPER_NAME,
+		KUDOS,
+		KUDO,
+		SOURCE_PKGNAME,
+		VETOS,
+		VETO,
+		BUNDLE,
+		PERMISSIONS,
+		PERMISSION,
+		LOCATION,
+		CHECKSUM,
+		SIZE,
+		TRANSLATION,
+		CONTENT_RATING,
+		CONTENT_ATTRIBUTE,
+		VERSION,
+		REVIEWS,
+		REVIEW,
+		REVIEWER_NAME,
+		REVIEWER_ID,
+		SUGGESTS,
+		REQUIRES,
+		CUSTOM,
+		LAUNCHABLE
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_TAG_FLAG_", has_type_id = false)]
+	public enum TagFlags {
+		NONE,
+		USE_FALLBACKS,
+		USE_TRANSLATED
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_TRANSLATION_KIND_", has_type_id = false)]
+	public enum TranslationKind {
+		UNKNOWN,
+		GETTEXT,
+		QT
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_URGENCY_KIND_", has_type_id = false)]
+	public enum UrgencyKind {
+		UNKNOWN,
+		LOW,
+		MEDIUM,
+		HIGH,
+		CRITICAL
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_URL_KIND_", has_type_id = false)]
+	public enum UrlKind {
+		UNKNOWN,
+		HOMEPAGE,
+		BUGTRACKER,
+		FAQ,
+		DONATION,
+		HELP,
+		MISSING,
+		TRANSLATE
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_UTILS_FIND_ICON_", has_type_id = false)]
+	[Flags]
+	public enum UtilsFindIconFlag {
+		NONE,
+		HI_DPI
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_UTILS_LOCATION_", has_type_id = false)]
+	public enum UtilsLocation {
+		SHARED,
+		CACHE,
+		USER
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_VERSION_PARSE_FLAG_", has_type_id = false)]
+	[Flags]
+	public enum VersionParseFlag {
+		NONE,
+		USE_TRIPLET
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_INF_ERROR_")]
+	public errordomain InfError {
+		FAILED,
+		INVALID_TYPE,
+		NOT_FOUND
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_NODE_ERROR_")]
+	public errordomain NodeError {
+		FAILED,
+		INVALID_MARKUP,
+		NO_SUPPORT
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cprefix = "AS_UTILS_ERROR_")]
+	public errordomain UtilsError {
+		FAILED,
+		INVALID_TYPE
+	}
+	[CCode (cheader_filename = "appstream-glib.h", cname = "AS_APP_SUBSUME_FLAG_DEDUPE")]
+	public const int APP_SUBSUME_FLAG_DEDUPE;
+	[CCode (cheader_filename = "appstream-glib.h", cname = "AS_APP_SUBSUME_FLAG_MERGE")]
+	public const int APP_SUBSUME_FLAG_MERGE;
+	[CCode (cheader_filename = "appstream-glib.h", cname = "AS_IMAGE_ALPHA_FLAG_BOTTOM")]
+	public const int IMAGE_ALPHA_FLAG_BOTTOM;
+	[CCode (cheader_filename = "appstream-glib.h", cname = "AS_IMAGE_ALPHA_FLAG_INTERNAL")]
+	public const int IMAGE_ALPHA_FLAG_INTERNAL;
+	[CCode (cheader_filename = "appstream-glib.h", cname = "AS_IMAGE_ALPHA_FLAG_LEFT")]
+	public const int IMAGE_ALPHA_FLAG_LEFT;
+	[CCode (cheader_filename = "appstream-glib.h", cname = "AS_IMAGE_ALPHA_FLAG_NONE")]
+	public const int IMAGE_ALPHA_FLAG_NONE;
+	[CCode (cheader_filename = "appstream-glib.h", cname = "AS_IMAGE_ALPHA_FLAG_RIGHT")]
+	public const int IMAGE_ALPHA_FLAG_RIGHT;
+	[CCode (cheader_filename = "appstream-glib.h", cname = "AS_IMAGE_ALPHA_FLAG_TOP")]
+	public const int IMAGE_ALPHA_FLAG_TOP;
+	[CCode (cheader_filename = "appstream-glib.h", cname = "AS_IMAGE_LARGE_HEIGHT")]
+	public const int IMAGE_LARGE_HEIGHT;
+	[CCode (cheader_filename = "appstream-glib.h", cname = "AS_IMAGE_LARGE_WIDTH")]
+	public const int IMAGE_LARGE_WIDTH;
+	[CCode (cheader_filename = "appstream-glib.h", cname = "AS_IMAGE_NORMAL_HEIGHT")]
+	public const int IMAGE_NORMAL_HEIGHT;
+	[CCode (cheader_filename = "appstream-glib.h", cname = "AS_IMAGE_NORMAL_WIDTH")]
+	public const int IMAGE_NORMAL_WIDTH;
+	[CCode (cheader_filename = "appstream-glib.h", cname = "AS_IMAGE_THUMBNAIL_HEIGHT")]
+	public const int IMAGE_THUMBNAIL_HEIGHT;
+	[CCode (cheader_filename = "appstream-glib.h", cname = "AS_IMAGE_THUMBNAIL_WIDTH")]
+	public const int IMAGE_THUMBNAIL_WIDTH;
+	[CCode (cheader_filename = "appstream-glib.h", cname = "AS_MAJOR_VERSION")]
+	public const int MAJOR_VERSION;
+	[CCode (cheader_filename = "appstream-glib.h", cname = "AS_MICRO_VERSION")]
+	public const int MICRO_VERSION;
+	[CCode (cheader_filename = "appstream-glib.h", cname = "AS_MINOR_VERSION")]
+	public const int MINOR_VERSION;
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_id_kind_from_string")]
+	[Version (since = "0.1.0")]
+	public static As.IdKind id_kind_from_string (string id_kind);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_id_kind_to_string")]
+	[Version (since = "0.1.0")]
+	public static unowned string id_kind_to_string (As.IdKind id_kind);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_inf_error_quark")]
+	[Version (since = "0.3.7")]
+	public static GLib.Quark inf_error_quark ();
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_inf_get_driver_version")]
+	[Version (since = "0.3.5")]
+	public static string inf_get_driver_version (GLib.KeyFile keyfile, uint64 timestamp) throws GLib.Error;
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_inf_load_data")]
+	[Version (since = "0.3.5")]
+	public static bool inf_load_data (GLib.KeyFile keyfile, string data, As.InfLoadFlags flags) throws GLib.Error;
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_inf_load_file")]
+	[Version (since = "0.3.5")]
+	public static bool inf_load_file (GLib.KeyFile keyfile, string filename, As.InfLoadFlags flags) throws GLib.Error;
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_kudo_kind_from_string")]
+	[Version (since = "0.2.2")]
+	public static As.KudoKind kudo_kind_from_string (string kudo_kind);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_kudo_kind_to_string")]
+	[Version (since = "0.2.2")]
+	public static unowned string kudo_kind_to_string (As.KudoKind kudo_kind);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_markup_convert")]
+	[Version (since = "0.3.5")]
+	public static string markup_convert (string markup, As.MarkupConvertFormat format) throws GLib.Error;
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_markup_convert_full")]
+	[Version (since = "0.3.5")]
+	public static string markup_convert_full (string markup, As.MarkupConvertFormat format, As.MarkupConvertFlag flags) throws GLib.Error;
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_markup_convert_simple")]
+	[Version (since = "0.1.0")]
+	public static string markup_convert_simple (string markup) throws GLib.Error;
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_markup_import")]
+	[Version (since = "0.5.11")]
+	public static string markup_import (string text, As.MarkupConvertFormat format) throws GLib.Error;
+	[CCode (array_length = false, array_null_terminated = true, cheader_filename = "appstream-glib.h", cname = "as_markup_strsplit_words")]
+	[Version (since = "0.3.5")]
+	public static string[] markup_strsplit_words (string text, uint line_len);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_markup_validate")]
+	[Version (since = "0.5.1")]
+	public static bool markup_validate (string markup) throws GLib.Error;
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_node_error_quark")]
+	[Version (since = "0.1.0")]
+	public static GLib.Quark node_error_quark ();
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_node_get_attribute")]
+	[Version (since = "0.1.0")]
+	public static unowned string node_get_attribute (GLib.Node node, string key);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_node_get_attribute_as_int")]
+	[Version (since = "0.1.0")]
+	public static int node_get_attribute_as_int (GLib.Node node, string key);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_node_get_attribute_as_uint")]
+	[Version (since = "0.6.1")]
+	public static uint node_get_attribute_as_uint (GLib.Node node, string key);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_node_get_comment")]
+	[Version (since = "0.1.6")]
+	public static unowned string node_get_comment (GLib.Node node);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_node_get_data")]
+	[Version (since = "0.1.0")]
+	public static unowned string node_get_data (GLib.Node node);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_node_get_localized")]
+	[Version (since = "0.1.0")]
+	public static GLib.HashTable<string,string> node_get_localized (GLib.Node node, string key);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_node_get_localized_best")]
+	[Version (since = "0.1.0")]
+	public static unowned string node_get_localized_best (GLib.Node node, string key);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_node_get_localized_unwrap")]
+	[Version (since = "0.1.0")]
+	public static GLib.HashTable<string,string> node_get_localized_unwrap (GLib.Node node) throws GLib.Error;
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_node_get_name")]
+	[Version (since = "0.1.0")]
+	public static unowned string node_get_name (GLib.Node node);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_node_get_tag")]
+	[Version (since = "0.1.2")]
+	public static As.Tag node_get_tag (GLib.Node node);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_node_insert_hash")]
+	[Version (since = "0.1.0")]
+	public static void node_insert_hash (GLib.Node parent, string name, string attr_key, GLib.HashTable<string,string> hash, As.NodeInsertFlags insert_flags);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_node_insert_localized")]
+	[Version (since = "0.1.0")]
+	public static void node_insert_localized (GLib.Node parent, string name, GLib.HashTable<string,string> localized, As.NodeInsertFlags insert_flags);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_node_to_xml")]
+	[Version (since = "0.1.0")]
+	public static GLib.StringBuilder node_to_xml (GLib.Node node, As.NodeToXmlFlags flags);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_node_unref")]
+	[Version (since = "0.1.0")]
+	public static void node_unref (GLib.Node node);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_size_kind_from_string")]
+	[Version (since = "0.5.2")]
+	public static As.SizeKind size_kind_from_string (string size_kind);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_size_kind_to_string")]
+	[Version (since = "0.5.2")]
+	public static unowned string size_kind_to_string (As.SizeKind size_kind);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_tag_from_string")]
+	[Version (since = "0.1.0")]
+	public static As.Tag tag_from_string (string tag);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_tag_from_string_full")]
+	[Version (since = "0.1.2")]
+	public static As.Tag tag_from_string_full (string tag, As.TagFlags flags);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_tag_to_string")]
+	[Version (since = "0.1.0")]
+	public static unowned string tag_to_string (As.Tag tag);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_urgency_kind_from_string")]
+	[Version (since = "0.5.1")]
+	public static As.UrgencyKind urgency_kind_from_string (string urgency_kind);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_urgency_kind_to_string")]
+	[Version (since = "0.5.1")]
+	public static unowned string urgency_kind_to_string (As.UrgencyKind urgency_kind);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_url_kind_from_string")]
+	[Version (since = "0.1.0")]
+	public static As.UrlKind url_kind_from_string (string url_kind);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_url_kind_to_string")]
+	[Version (since = "0.1.0")]
+	public static unowned string url_kind_to_string (As.UrlKind url_kind);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_utils_appstream_id_build")]
+	[Version (since = "0.6.4")]
+	public static string utils_appstream_id_build (string str);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_utils_appstream_id_valid")]
+	[Version (since = "0.6.4")]
+	public static bool utils_appstream_id_valid (string str);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_utils_error_quark")]
+	[Version (since = "0.3.7")]
+	public static GLib.Quark utils_error_quark ();
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_utils_find_icon_filename")]
+	[Version (since = "0.2.5")]
+	public static string utils_find_icon_filename (string destdir, string search) throws GLib.Error;
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_utils_find_icon_filename_full")]
+	[Version (since = "0.3.1")]
+	public static string utils_find_icon_filename_full (string destdir, string search, As.UtilsFindIconFlag flags) throws GLib.Error;
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_utils_guid_from_data")]
+	[Version (since = "0.6.13")]
+	public static string utils_guid_from_data (string namespace_id, uint8 data, size_t data_len) throws GLib.Error;
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_utils_guid_from_string")]
+	[Version (since = "0.5.0")]
+	public static string utils_guid_from_string (string str);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_utils_guid_is_valid")]
+	[Version (since = "0.5.0")]
+	public static bool utils_guid_is_valid (string guid);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_utils_install_filename")]
+	[Version (since = "0.3.4")]
+	public static bool utils_install_filename (As.UtilsLocation location, string filename, string origin, string destdir) throws GLib.Error;
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_utils_is_blacklisted_id")]
+	[Version (since = "0.2.2")]
+	public static bool utils_is_blacklisted_id (string desktop_id);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_utils_is_category_id")]
+	[Version (since = "0.2.4")]
+	public static bool utils_is_category_id (string category_id);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_utils_is_environment_id")]
+	[Version (since = "0.2.4")]
+	public static bool utils_is_environment_id (string environment_id);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_utils_is_spdx_license")]
+	[Version (since = "0.2.5")]
+	public static bool utils_is_spdx_license (string license);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_utils_is_spdx_license_id")]
+	[Version (since = "0.1.5")]
+	public static bool utils_is_spdx_license_id (string license_id);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_utils_is_stock_icon_name")]
+	[Version (since = "0.1.3")]
+	public static bool utils_is_stock_icon_name (string name);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_utils_license_to_spdx")]
+	[Version (since = "0.5.5")]
+	public static string utils_license_to_spdx (string license);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_utils_search_token_valid")]
+	[Version (since = "0.3.4")]
+	public static bool utils_search_token_valid (string token);
+	[CCode (array_length = false, array_null_terminated = true, cheader_filename = "appstream-glib.h", cname = "as_utils_search_tokenize")]
+	[Version (since = "0.3.4")]
+	public static string[] utils_search_tokenize (string search);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_utils_spdx_license_detokenize")]
+	[Version (since = "0.2.5")]
+	public static string utils_spdx_license_detokenize (string license_tokens);
+	[CCode (array_length = false, array_null_terminated = true, cheader_filename = "appstream-glib.h", cname = "as_utils_spdx_license_tokenize")]
+	[Version (since = "0.1.5")]
+	public static string[] utils_spdx_license_tokenize (string license);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_utils_string_replace")]
+	[Version (since = "0.5.11")]
+	public static uint utils_string_replace (GLib.StringBuilder string, string search, string replace);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_utils_unique_id_build")]
+	[Version (since = "0.6.1")]
+	public static string utils_unique_id_build (As.AppScope scope, As.BundleKind bundle_kind, string origin, As.AppKind kind, string id, string branch);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_utils_unique_id_equal")]
+	[Version (since = "0.6.1")]
+	public static bool utils_unique_id_equal (string unique_id1, string unique_id2);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_utils_unique_id_hash")]
+	[Version (since = "0.6.2")]
+	public static uint utils_unique_id_hash (string unique_id);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_utils_unique_id_valid")]
+	[Version (since = "0.6.1")]
+	public static bool utils_unique_id_valid (string unique_id);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_utils_vercmp")]
+	[Version (since = "0.3.5")]
+	public static int utils_vercmp (string version_a, string version_b);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_utils_version_from_uint16")]
+	[Version (since = "0.5.2")]
+	public static string utils_version_from_uint16 (uint16 val, As.VersionParseFlag flags);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_utils_version_from_uint32")]
+	[Version (since = "0.5.2")]
+	public static string utils_version_from_uint32 (uint32 val, As.VersionParseFlag flags);
+	[CCode (cheader_filename = "appstream-glib.h", cname = "as_utils_version_parse")]
+	[Version (since = "0.5.2")]
+	public static string utils_version_parse (string version);
+}
-- 
GitLab