diff --git a/gio/gfdonotificationbackend.c b/gio/gfdonotificationbackend.c
index 1603f6e..658c0f8 100644
--- a/gio/gfdonotificationbackend.c
+++ b/gio/gfdonotificationbackend.c
@@ -29,6 +29,7 @@
 #include "gaction.h"
 #include "gfileicon.h"
 #include "gfile.h"
+#include "gthemedicon.h"
 #include "gdbusutils.h"
 
 #define G_TYPE_FDO_NOTIFICATION_BACKEND  (g_fdo_notification_backend_get_type ())
@@ -215,10 +216,13 @@ call_notify (GDBusConnection     *con,
   guint i;
   GVariantBuilder hints_builder;
   GIcon *icon;
+  gchar *icon_name;
   GVariant *parameters;
   const gchar *body;
   guchar urgency;
+  gboolean override_app_icon;
 
+  icon_name = NULL;
   g_variant_builder_init (&action_builder, G_VARIANT_TYPE_STRING_ARRAY);
   if (g_notification_get_default_action (notification, NULL, NULL))
     {
@@ -262,13 +266,26 @@ call_notify (GDBusConnection     *con,
   urgency = urgency_from_priority (g_notification_get_priority (notification));
   g_variant_builder_add (&hints_builder, "{sv}", "urgency", g_variant_new_byte (urgency));
   icon = g_notification_get_icon (notification);
+  override_app_icon = g_notification_get_override_app_icon(notification);
+
   if (icon != NULL && G_IS_FILE_ICON (icon))
     {
       GFile *file;
 
       file = g_file_icon_get_file (G_FILE_ICON (icon));
-      g_variant_builder_add (&hints_builder, "{sv}", "image-path",
-                             g_variant_new_take_string (g_file_get_path (file)));
+      if (!override_app_icon)
+        g_variant_builder_add (&hints_builder, "{sv}", "image-path",
+                               g_variant_new_take_string (g_file_get_path (file)));
+      else
+        icon_name = g_file_get_path (file);
+    }
+  else if (icon != NULL && G_IS_THEMED_ICON (icon))
+    {
+      const gchar* const* icon_names = g_themed_icon_get_names(G_THEMED_ICON (icon));
+      icon_name = g_strdup (icon_names[0]);  /* Take first name from GThemedIcon */
+      if (!override_app_icon)
+        g_variant_builder_add (&hints_builder, "{sv}", "image-path",
+                               g_variant_new_string (icon_name));
     }
 
   body = g_notification_get_body (notification);
@@ -276,7 +293,7 @@ call_notify (GDBusConnection     *con,
   parameters = g_variant_new ("(susssasa{sv}i)",
                               "",           /* app name */
                               replace_id,
-                              "",           /* app icon */
+                              (icon_name && override_app_icon) ? icon_name : "",           /* app icon */
                               g_notification_get_title (notification),
                               body ? body : "",
                               &action_builder,
@@ -288,6 +305,9 @@ call_notify (GDBusConnection     *con,
                           parameters, G_VARIANT_TYPE ("(u)"),
                           G_DBUS_CALL_FLAGS_NONE, -1, NULL,
                           callback, user_data);
+
+  if (icon_name)
+    g_free(icon_name);
 }
 
 static void
diff --git a/gio/gnotification-private.h b/gio/gnotification-private.h
index e12a423..f32714d 100644
--- a/gio/gnotification-private.h
+++ b/gio/gnotification-private.h
@@ -30,6 +30,8 @@ const gchar *           g_notification_get_body                         (GNotifi
 
 GIcon *                 g_notification_get_icon                         (GNotification *notification);
 
+gboolean                g_notification_get_override_app_icon            (GNotification *notification);
+
 GNotificationPriority   g_notification_get_priority                     (GNotification *notification);
 
 guint                   g_notification_get_n_buttons                    (GNotification *notification);
diff --git a/gio/gnotification.c b/gio/gnotification.c
index 53c5c6b..77e72e9 100644
--- a/gio/gnotification.c
+++ b/gio/gnotification.c
@@ -73,6 +73,7 @@ struct _GNotification
   gchar *title;
   gchar *body;
   GIcon *icon;
+  gboolean override_app_icon;
   GNotificationPriority priority;
   GPtrArray *buttons;
   gchar *default_action;
@@ -321,6 +322,39 @@ g_notification_set_urgent (GNotification *notification,
 }
 
 /**
+ * g_notification_set_override_app_icon:
+ * @notification: a #GNotification
+ * @override_app_icon: %TRUE if #GIcon in @notification must used as application icon
+ *
+ *
+ * Since: 2.44
+ */
+void
+g_notification_set_override_app_icon (GNotification *notification,
+                                      gboolean       override_app_icon)
+{
+  g_return_if_fail (G_IS_NOTIFICATION (notification));
+
+  notification->override_app_icon = override_app_icon;
+}
+
+/*< private >
+ * g_notification_get_override_app_icon:
+ * @notification: a #GNotification
+ *
+ * Returns the %TRUE if #GIcon of @notification must used as application icon
+ *
+ * Since: 2.44
+ */
+gboolean
+g_notification_get_override_app_icon (GNotification *notification)
+{
+  g_return_val_if_fail (G_IS_NOTIFICATION (notification), FALSE);
+
+  return notification->override_app_icon;
+}
+
+/**
  * g_notification_set_priority:
  * @notification: a #GNotification
  * @priority: a #GNotificationPriority
diff --git a/gio/gnotification.h b/gio/gnotification.h
index 07600b3..e967130 100644
--- a/gio/gnotification.h
+++ b/gio/gnotification.h
@@ -51,6 +51,10 @@ GLIB_AVAILABLE_IN_2_40
 void                    g_notification_set_icon                         (GNotification *notification,
                                                                          GIcon         *icon);
 
+GLIB_AVAILABLE_IN_2_44
+void                    g_notification_set_override_app_icon            (GNotification *notification,
+                                                                         gboolean       override_app_icon);
+
 GLIB_DEPRECATED_IN_2_42_FOR(g_notification_set_priority)
 void                    g_notification_set_urgent                       (GNotification *notification,
                                                                          gboolean       urgent);
