diff --git a/panels/printers/pp-new-printer-dialog.c b/panels/printers/pp-new-printer-dialog.c
index 69372c2..f1785f7 100644
--- a/panels/printers/pp-new-printer-dialog.c
+++ b/panels/printers/pp-new-printer-dialog.c
@@ -48,6 +48,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);
@@ -118,6 +122,25 @@ struct _PpNewPrinterDialog {
 };
 
 static void
+show_message (GtkWindow *parent,
+              gchar     *first_line,
+              gchar     *second_line)
+{
+  GtkWidget *dialog;
+
+  dialog = gtk_message_dialog_new (parent,
+                                   GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
+                                   GTK_MESSAGE_WARNING,
+                                   GTK_BUTTONS_OK,
+                                   first_line);
+
+  gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+                                            "%s", second_line);
+  gtk_dialog_run (GTK_DIALOG (dialog));
+  gtk_widget_destroy (dialog);
+}
+
+static void
 device_type_selection_changed_cb (GtkTreeSelection *selection,
                                   gpointer          user_data)
 {
@@ -515,6 +538,142 @@ 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)
+    {
+      if (service_timeout == 0)
+        g_message ("Enabling \"%s\" service permanently.", service_name);
+      else
+        g_message ("Enabling \"%s\" service for next %d seconds.", service_name, service_timeout);
+
+      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)
+    {
+      g_message ("Disabling \"%s\" service.", service_name);
+
+      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 void
 search_address_cb (GtkToggleButton *togglebutton,
                    gpointer         user_data)
 {
@@ -733,10 +892,14 @@ actualize_devices_list (PpNewPrinterDialog *pp)
 static void
 populate_devices_list (PpNewPrinterDialog *pp)
 {
-  GtkTreeViewColumn *column;
-  GtkCellRenderer   *renderer;
-  GtkWidget         *network_treeview;
-  GtkWidget         *local_treeview;
+  GtkTreeViewColumn  *column;
+  GtkCellRenderer    *renderer;
+  GtkWidget          *network_treeview;
+  GtkWidget          *local_treeview;
+  gchar              *services = NULL;
+  gchar             **services_list = NULL;
+  gint                services_index = 0;
+  gint                i;
 
   network_treeview = (GtkWidget*)
     gtk_builder_get_object (pp->builder, "network-devices-treeview");
@@ -751,6 +914,34 @@ populate_devices_list (PpNewPrinterDialog *pp)
                     "changed", G_CALLBACK (device_selection_changed_cb), pp);
 
   actualize_devices_list (pp);
+
+  services_list = g_new0 (gchar *, 5);
+
+  if (!service_enabled ("mdns"))
+    services_list[services_index++] = g_strdup ("mdns");
+
+  if (!service_enabled ("ipp"))
+    services_list[services_index++] = g_strdup ("ipp");
+
+  if (!service_enabled ("ipp-client"))
+    services_list[services_index++] = g_strdup ("ipp-client");
+
+  if (!service_enabled ("samba-client"))
+    services_list[services_index++] = g_strdup ("samba-client");
+
+  services = g_strjoinv (", ", services_list);
+
+  if (services_list[0] != NULL)
+    show_message (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (pp->dialog))),
+                  "Temporarily enabling services:",
+                  services);
+
+  for (i = 0; services_list[i]; i++)
+    service_enable (services_list[i], 300);
+
+  g_strfreev (services_list);
+  g_free (services);
+
   devices_get (pp);
 
   renderer = gtk_cell_renderer_text_new ();
@@ -1230,6 +1421,39 @@ new_printer_add_button_cb (GtkButton *button,
                 }
               g_object_unref (proxy);
             }
+
+          if (pp->devices[device_id].device_uri)
+            {
+              if (g_str_has_prefix (pp->devices[device_id].device_uri, "dnssd:") ||
+                  g_str_has_prefix (pp->devices[device_id].device_uri, "mdns:"))
+                {
+                  show_message (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (pp->dialog))),
+                                "Permanently enabling service",
+                                "Enabling mdns service on firewall.");
+                  service_disable ("mdns");
+                  service_enable ("mdns", 0);
+                }
+
+              if (g_strrstr (pp->devices[device_id].device_uri, "smb:") != NULL)
+                {
+                  show_message (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (pp->dialog))),
+                                "Permanently enabling service",
+                                "Enabling samba-client service on firewall.");
+                  service_disable ("samba-client");
+                  service_enable ("samba-client", 0);
+                }
+
+              if (g_strrstr (pp->devices[device_id].device_uri, "ipp:") != NULL)
+                {
+                  show_message (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (pp->dialog))),
+                                "Permanently enabling service",
+                                "Enabling ipp services on firewall.");
+                  service_disable ("ipp");
+                  service_enable ("ipp", 0);
+                  service_disable ("ipp-client");
+                  service_enable ("ipp-client", 0);
+                }
+            }
         }
     }
 
