diff --git a/configure.ac b/configure.ac
index b7e6259..fcda3fb 100644
--- a/configure.ac
+++ b/configure.ac
@@ -76,13 +76,15 @@ GDKPIXBUF_REQUIRED_VERSION=2.23.0
 POLKIT_REQUIRED_VERSION=0.97
 GSD_REQUIRED_VERSION=2.91.94
 NETWORK_MANAGER_REQUIRED_VERSION=0.8.992
+LIBNOTIFY_REQUIRED_VERSION=0.7.3
 
 COMMON_MODULES="gtk+-3.0 >= $GTK_REQUIRED_VERSION
  glib-2.0 >= $GLIB_REQUIRED_VERSION
  gthread-2.0
  gio-2.0
  gio-unix-2.0
- gsettings-desktop-schemas >= $DESKTOP_SCHEMAS_REQUIRED_VERSION"
+ gsettings-desktop-schemas >= $DESKTOP_SCHEMAS_REQUIRED_VERSION
+ libnotify >= $LIBNOTIFY_REQUIRED_VERSION"
 
 PKG_CHECK_MODULES(LIBGNOME_CONTROL_CENTER, $COMMON_MODULES gconf-2.0)
 PKG_CHECK_MODULES(LIBLANGUAGE, $COMMON_MODULES gnome-desktop-3.0)
diff --git a/panels/printers/pp-new-printer-dialog.c b/panels/printers/pp-new-printer-dialog.c
index 69372c2..0e1e1c6 100644
--- a/panels/printers/pp-new-printer-dialog.c
+++ b/panels/printers/pp-new-printer-dialog.c
@@ -38,6 +38,8 @@
 
 #include <dbus/dbus-glib.h>
 
+#include <libnotify/notify.h>
+
 #ifdef GDK_WINDOWING_X11
 #include <gdk/gdkx.h>
 #endif
@@ -48,6 +50,10 @@
 #define PACKAGE_KIT_PATH "/org/freedesktop/PackageKit"
 #define PACKAGE_KIT_IFACE "org.freedesktop.PackageKit.Modify"
 
+#define FIREWALLD_BUS "org.fedoraproject.FirewallD"
+#define FIREWALLD_PATH "/org/fedoraproject/FirewallD"
+#define FIREWALLD_IFACE "org.fedoraproject.FirewallD"
+
 #define ALLOWED_CHARACTERS "abcdefghijklmnopqrtsuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_/"
 
 static void pp_new_printer_dialog_hide (PpNewPrinterDialog *pp);
@@ -115,9 +121,30 @@ struct _PpNewPrinterDialog {
   gpointer             user_data;
 
   GCancellable *cancellable;
+
+  gchar *warning;
 };
 
 static void
+show_notification (gchar *primary_text,
+                   gchar *secondary_text,
+                   gchar *icon_name)
+{
+  if (primary_text)
+    {
+      NotifyNotification *notification;
+      notification = notify_notification_new (primary_text,
+                                              secondary_text,
+                                              icon_name);
+      notify_notification_set_app_name (notification, _("Printers"));
+      notify_notification_set_hint (notification, "transient", g_variant_new_boolean (TRUE));
+
+      notify_notification_show (notification, NULL);
+      g_object_unref (notification);
+    }
+}
+
+static void
 device_type_selection_changed_cb (GtkTreeSelection *selection,
                                   gpointer          user_data)
 {
@@ -515,6 +542,180 @@ devices_get (PpNewPrinterDialog *pp)
 }
 
 static void
+service_enable (gchar *service_name,
+                gint   service_timeout)
+{
+  GDBusProxy *proxy;
+  GVariant   *input = NULL;
+  GVariant   *output = NULL;
+  GError     *error = NULL;
+  gint        result;
+
+  proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
+                                         G_DBUS_PROXY_FLAGS_NONE,
+                                         NULL,
+                                         FIREWALLD_BUS,
+                                         FIREWALLD_PATH,
+                                         FIREWALLD_IFACE,
+                                         NULL,
+                                         &error);
+
+  if (proxy)
+    {
+      input = g_variant_new ("(si)",
+                             service_name,
+                             service_timeout);
+
+      output = g_dbus_proxy_call_sync (proxy,
+                                       "enableService",
+                                       input,
+                                       G_DBUS_CALL_FLAGS_NONE,
+                                       60000,
+                                       NULL,
+                                       &error);
+
+      if (output && g_variant_n_children (output) == 1)
+        g_variant_get (output, "(i)", &result);
+
+      if (output)
+        g_variant_unref (output);
+      g_variant_unref (input);
+      g_object_unref (proxy);
+    }
+}
+
+static void
+service_disable (gchar *service_name)
+{
+  GDBusProxy *proxy;
+  GVariant   *input = NULL;
+  GVariant   *output = NULL;
+  GError     *error = NULL;
+  gint        result;
+
+  proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
+                                         G_DBUS_PROXY_FLAGS_NONE,
+                                         NULL,
+                                         FIREWALLD_BUS,
+                                         FIREWALLD_PATH,
+                                         FIREWALLD_IFACE,
+                                         NULL,
+                                         &error);
+
+  if (proxy)
+    {
+      input = g_variant_new ("(s)", service_name);
+
+      output = g_dbus_proxy_call_sync (proxy,
+                                       "disableService",
+                                       input,
+                                       G_DBUS_CALL_FLAGS_NONE,
+                                       60000,
+                                       NULL,
+                                       &error);
+
+      if (output && g_variant_n_children (output) == 1)
+        g_variant_get (output, "(i)", &result);
+
+      if (output)
+        g_variant_unref (output);
+      g_variant_unref (input);
+      g_object_unref (proxy);
+    }
+}
+
+static gboolean
+service_enabled (gchar *service_name)
+{
+  GDBusProxy *proxy;
+  GVariant   *input = NULL;
+  GVariant   *output = NULL;
+  GError     *error = NULL;
+  gint        query_result = 0;
+
+  proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
+                                         G_DBUS_PROXY_FLAGS_NONE,
+                                         NULL,
+                                         FIREWALLD_BUS,
+                                         FIREWALLD_PATH,
+                                         FIREWALLD_IFACE,
+                                         NULL,
+                                         &error);
+
+  if (proxy)
+    {
+      input = g_variant_new ("(s)",
+                             service_name);
+
+      output = g_dbus_proxy_call_sync (proxy,
+                                       "queryService",
+                                       input,
+                                       G_DBUS_CALL_FLAGS_NONE,
+                                       60000,
+                                       NULL,
+                                       &error);
+
+      if (output && g_variant_n_children (output) == 1)
+        g_variant_get (output, "(i)", &query_result);
+
+      if (output)
+        g_variant_unref (output);
+      g_variant_unref (input);
+      g_object_unref (proxy);
+    }
+
+  if (query_result > 0)
+    return TRUE;
+  else
+    return FALSE;
+}
+
+static gboolean
+dbus_method_available (gchar *name,
+                       gchar *path,
+                       gchar *iface,
+                       gchar *method)
+{
+  GDBusProxy *proxy;
+  GError     *error = NULL;
+  GVariant   *output = NULL;
+  gboolean    result = FALSE;
+
+  proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
+                                         G_DBUS_PROXY_FLAGS_NONE,
+                                         NULL,
+                                         name,
+                                         path,
+                                         iface,
+                                         NULL,
+                                         NULL);
+
+  if (proxy)
+    {
+      output = g_dbus_proxy_call_sync (proxy,
+                                       method,
+                                       NULL,
+                                       G_DBUS_CALL_FLAGS_NONE,
+                                       60000,
+                                       NULL,
+                                       &error);
+
+      if (error &&
+          error->domain == G_DBUS_ERROR &&
+          error->code == G_DBUS_ERROR_SERVICE_UNKNOWN)
+        result = FALSE;
+      else
+        result = TRUE;
+
+      if (output)
+        g_variant_unref (output);
+      g_object_unref (proxy);
+    }
+
+  return result;
+}
+
+static void
 search_address_cb (GtkToggleButton *togglebutton,
                    gpointer         user_data)
 {
@@ -690,17 +891,32 @@ actualize_devices_list (PpNewPrinterDialog *pp)
                                     G_TYPE_INT,
                                     G_TYPE_STRING);
 
+  if (pp->warning)
+    {
+      gtk_widget_set_sensitive (GTK_WIDGET (network_treeview), FALSE);
+      gtk_list_store_append (network_store, &iter);
+      gtk_list_store_set (network_store, &iter,
+                          DEVICE_ID_COLUMN, 0,
+                          DEVICE_NAME_COLUMN, pp->warning,
+                          -1);
+    }
+  else
+    gtk_widget_set_sensitive (GTK_WIDGET (network_treeview), TRUE);
+
   for (i = 0; i < pp->num_devices; i++)
     {
       if (pp->devices[i].device_id || pp->devices[i].device_ppd_uri)
         {
           if (g_strcmp0 (pp->devices[i].device_class, "network") == 0)
             {
-              gtk_list_store_append (network_store, &iter);
-              gtk_list_store_set (network_store, &iter,
-                                  DEVICE_ID_COLUMN, i,
-                                  DEVICE_NAME_COLUMN, pp->devices[i].display_name,
-                                  -1);
+              if (!pp->warning)
+                {
+                  gtk_list_store_append (network_store, &iter);
+                  gtk_list_store_set (network_store, &iter,
+                                      DEVICE_ID_COLUMN, i,
+                                      DEVICE_NAME_COLUMN, pp->devices[i].display_name,
+                                      -1);
+                }
             }
           else if (g_strcmp0 (pp->devices[i].device_class, "direct") == 0)
             {
@@ -716,10 +932,13 @@ actualize_devices_list (PpNewPrinterDialog *pp)
   gtk_tree_view_set_model (network_treeview, GTK_TREE_MODEL (network_store));
   gtk_tree_view_set_model (local_treeview, GTK_TREE_MODEL (local_store));
 
-  if (gtk_tree_model_get_iter_first ((GtkTreeModel *) network_store, &iter))
-    gtk_tree_selection_select_iter (
-      gtk_tree_view_get_selection (GTK_TREE_VIEW (network_treeview)),
-      &iter);
+  if (!pp->warning)
+    {
+      if (gtk_tree_model_get_iter_first ((GtkTreeModel *) network_store, &iter))
+        gtk_tree_selection_select_iter (
+          gtk_tree_view_get_selection (GTK_TREE_VIEW (network_treeview)),
+          &iter);
+    }
 
   if (gtk_tree_model_get_iter_first ((GtkTreeModel *) local_store, &iter))
     gtk_tree_selection_select_iter (
@@ -751,6 +970,30 @@ populate_devices_list (PpNewPrinterDialog *pp)
                     "changed", G_CALLBACK (device_selection_changed_cb), pp);
 
   actualize_devices_list (pp);
+
+  if (dbus_method_available (FIREWALLD_BUS,
+                             FIREWALLD_PATH,
+                             FIREWALLD_IFACE,
+                             "getServices"))
+    {
+      if (!service_enabled ("mdns"))
+        service_enable ("mdns", 300);
+
+      if (!service_enabled ("ipp"))
+        service_enable ("ipp", 300);
+
+      if (!service_enabled ("ipp-client"))
+        service_enable ("ipp-client", 300);
+
+      if (!service_enabled ("samba-client"))
+        service_enable ("samba-client", 300);
+    }
+  else
+    pp->warning = g_strdup ("FirewallD is not installed.\n"
+                            "Printer detection needs services\n"
+                            "mdns, ipp, ipp-client and samba-client\n"
+                            "enabled on firewall.");
+
   devices_get (pp);
 
   renderer = gtk_cell_renderer_text_new ();
@@ -1230,6 +1473,43 @@ new_printer_add_button_cb (GtkButton *button,
                 }
               g_object_unref (proxy);
             }
+
+          if (pp->devices[device_id].device_uri &&
+              dbus_method_available (FIREWALLD_BUS,
+                                     FIREWALLD_PATH,
+                                     FIREWALLD_IFACE,
+                                     "getServices"))
+            {
+              if (g_str_has_prefix (pp->devices[device_id].device_uri, "dnssd:") ||
+                  g_str_has_prefix (pp->devices[device_id].device_uri, "mdns:"))
+                {
+                  show_notification ("Enabling service mDNS on firewall",
+                                     NULL,
+                                     "dialog-information-symbolic");
+                  service_disable ("mdns");
+                  service_enable ("mdns", 0);
+                }
+
+              if (g_strrstr (pp->devices[device_id].device_uri, "smb:") != NULL)
+                {
+                  show_notification ("Enabling service Samba Client on firewall",
+                                     NULL,
+                                     "dialog-information-symbolic");
+                  service_disable ("samba-client");
+                  service_enable ("samba-client", 0);
+                }
+
+              if (g_strrstr (pp->devices[device_id].device_uri, "ipp:") != NULL)
+                {
+                  show_notification ("Enabling services IPP and IPP Client on firewall",
+                                     NULL,
+                                     "dialog-information-symbolic");
+                  service_disable ("ipp");
+                  service_enable ("ipp", 0);
+                  service_disable ("ipp-client");
+                  service_enable ("ipp-client", 0);
+                }
+            }
         }
     }
 
@@ -1285,6 +1565,7 @@ pp_new_printer_dialog_new (GtkWindow            *parent,
   pp->user_data = user_data;
 
   pp->cancellable = NULL;
+  pp->warning = NULL;
 
   /* connect signals */
   g_signal_connect (pp->dialog, "delete-event", G_CALLBACK (gtk_widget_hide_on_delete), NULL);
@@ -1337,6 +1618,8 @@ pp_new_printer_dialog_free (PpNewPrinterDialog *pp)
       g_object_unref (pp->cancellable);
     }
 
+  g_free (pp->warning);
+
   g_free (pp);
 }
 
diff --git a/shell/control-center.c b/shell/control-center.c
index 9370aa5..ca07a1b 100644
--- a/shell/control-center.c
+++ b/shell/control-center.c
@@ -178,6 +178,8 @@ main (int argc, char **argv)
   gtk_init (&argc, &argv);
   cc_shell_log_init ();
 
+  notify_init ("gnome-control-center");
+
   shell = gnome_control_center_new ();
 
   /* enforce single instance of this application */
