Index: gtk/gtkprinter.c
===================================================================
--- gtk/gtkprinter.c	(revision 20812)
+++ gtk/gtkprinter.c	(working copy)
@@ -43,13 +43,15 @@
   gchar *description;
   gchar *icon_name;
 
-  guint is_active   : 1;
-  guint is_new      : 1;
-  guint is_virtual  : 1;
-  guint is_default  : 1;
-  guint has_details : 1;
-  guint accepts_pdf : 1;
-  guint accepts_ps  : 1;
+  guint is_active         : 1;
+  guint is_paused         : 1;
+  guint is_accepting_jobs : 1;
+  guint is_new            : 1;
+  guint is_virtual        : 1;
+  guint is_default        : 1;
+  guint has_details       : 1;
+  guint accepts_pdf       : 1;
+  guint accepts_ps        : 1;
 
   gchar *state_message;  
   gint job_count;
@@ -213,6 +215,8 @@
   priv->icon_name = NULL;
 
   priv->is_active = TRUE;
+  priv->is_paused = FALSE;
+  priv->is_accepting_jobs = TRUE;
   priv->is_new = TRUE;
   priv->has_details = FALSE;
   priv->accepts_pdf = TRUE;
@@ -635,8 +639,70 @@
   printer->priv->is_active = val;
 }
 
+/**
+ * gtk_printer_is_paused:
+ * @printer: a #GtkPrinter
+ * 
+ * Returns whether the printer is currently paused
+ * 
+ * Return value: %TRUE if @printer is paused
+ *
+ * Since: 2.13
+ */
+gboolean
+gtk_printer_is_paused (GtkPrinter *printer)
+{
+  g_return_val_if_fail (GTK_IS_PRINTER (printer), TRUE);
+  
+  return printer->priv->is_paused;
+}
 
+gboolean
+gtk_printer_set_is_paused (GtkPrinter *printer,
+			   gboolean    val)
+{
+  GtkPrinterPrivate *priv;
+
+  g_return_val_if_fail (GTK_IS_PRINTER (printer), FALSE);
+
+  priv = printer->priv;
+
+  if (val == priv->is_paused)
+    return FALSE;
+
+  priv->is_paused = val;
+
+  return TRUE;
+}
+
 /**
+ * gtk_printer_is_accepting_jobs:
+ * @printer: a #GtkPrinter
+ * 
+ * Returns whether the printer is accepting jobs
+ * 
+ * Return value: %TRUE if @printer is accepting jobs
+ *
+ * Since: 2.13
+ */
+gboolean
+gtk_printer_is_accepting_jobs (GtkPrinter *printer)
+{
+  g_return_val_if_fail (GTK_IS_PRINTER (printer), TRUE);
+  
+  return printer->priv->is_accepting_jobs;
+}
+
+void
+gtk_printer_set_is_accepting_jobs (GtkPrinter *printer,
+				   gboolean val)
+{
+  g_return_if_fail (GTK_IS_PRINTER (printer));
+
+  printer->priv->is_accepting_jobs = val;
+}
+
+/**
  * gtk_printer_is_virtual:
  * @printer: a #GtkPrinter
  * 
Index: gtk/gtkprinter.h
===================================================================
--- gtk/gtkprinter.h	(revision 20812)
+++ gtk/gtkprinter.h	(working copy)
@@ -99,6 +99,8 @@
 G_CONST_RETURN gchar    *gtk_printer_get_icon_name         (GtkPrinter      *printer);
 gint                     gtk_printer_get_job_count         (GtkPrinter      *printer);
 gboolean                 gtk_printer_is_active             (GtkPrinter      *printer);
+gboolean                 gtk_printer_is_paused             (GtkPrinter      *printer);
+gboolean                 gtk_printer_is_accepting_jobs     (GtkPrinter      *printer);
 gboolean                 gtk_printer_is_virtual            (GtkPrinter      *printer);
 gboolean                 gtk_printer_is_default            (GtkPrinter      *printer);
 gboolean                 gtk_printer_accepts_pdf           (GtkPrinter      *printer);
Index: gtk/gtkprintbackend.h
===================================================================
--- gtk/gtkprintbackend.h	(revision 20812)
+++ gtk/gtkprintbackend.h	(working copy)
@@ -149,30 +149,32 @@
 
 /* Backend-only functions for GtkPrinter */
 
-GtkPrinter *gtk_printer_new               (const char      *name,
-					   GtkPrintBackend *backend,
-					   gboolean         is_virtual);
-gboolean    gtk_printer_is_new            (GtkPrinter      *printer);
-void        gtk_printer_set_is_new        (GtkPrinter      *printer,
-					   gboolean         val);
-void        gtk_printer_set_is_active     (GtkPrinter      *printer,
-					   gboolean         val);
-void        gtk_printer_set_has_details   (GtkPrinter      *printer,
-					   gboolean         val);
-void        gtk_printer_set_is_default    (GtkPrinter      *printer,
-					   gboolean         val);
-void        gtk_printer_set_icon_name     (GtkPrinter      *printer,
-					   const gchar     *icon);
-gboolean    gtk_printer_set_job_count     (GtkPrinter      *printer,
-					   gint             count);
-gboolean    gtk_printer_set_location      (GtkPrinter      *printer,
-					   const gchar     *location);
-gboolean    gtk_printer_set_description   (GtkPrinter      *printer,
-					   const gchar     *description);
-gboolean    gtk_printer_set_state_message (GtkPrinter      *printer,
-					   const gchar     *message);
-void        gtk_printer_set_is_active     (GtkPrinter      *printer,
-					   gboolean         active);
+GtkPrinter *gtk_printer_new                   (const char      *name,
+					       GtkPrintBackend *backend,
+					       gboolean         is_virtual);
+gboolean    gtk_printer_is_new                (GtkPrinter      *printer);
+void        gtk_printer_set_is_new            (GtkPrinter      *printer,
+					       gboolean         val);
+void        gtk_printer_set_is_active         (GtkPrinter      *printer,
+					       gboolean         val);
+gboolean    gtk_printer_set_is_paused         (GtkPrinter      *printer,
+					       gboolean         val);
+void        gtk_printer_set_is_accepting_jobs (GtkPrinter      *printer,
+					       gboolean         val);
+void        gtk_printer_set_has_details       (GtkPrinter      *printer,
+					       gboolean         val);
+void        gtk_printer_set_is_default        (GtkPrinter      *printer,
+					       gboolean         val);
+void        gtk_printer_set_icon_name         (GtkPrinter      *printer,
+					       const gchar     *icon);
+gboolean    gtk_printer_set_job_count         (GtkPrinter      *printer,
+					       gint             count);
+gboolean    gtk_printer_set_location          (GtkPrinter      *printer,
+					       const gchar     *location);
+gboolean    gtk_printer_set_description       (GtkPrinter      *printer,
+					       const gchar     *description);
+gboolean    gtk_printer_set_state_message     (GtkPrinter      *printer,
+					       const gchar     *message);
 
 
 G_END_DECLS
Index: gtk/gtkprintunixdialog.c
===================================================================
--- gtk/gtkprintunixdialog.c	(revision 20812)
+++ gtk/gtkprintunixdialog.c	(working copy)
@@ -96,6 +96,12 @@
 static gboolean dialog_get_reverse                 (GtkPrintUnixDialog *dialog);
 static gint     dialog_get_n_copies                (GtkPrintUnixDialog *dialog);
 
+static void     set_cell_sensitivity_func          (GtkTreeViewColumn *tree_column,
+				                    GtkCellRenderer   *cell,
+				                    GtkTreeModel      *model,
+				                    GtkTreeIter       *iter,
+				                    gpointer           data);
+
 /* GtkBuildable */
 static void gtk_print_unix_dialog_buildable_init                    (GtkBuildableIface *iface);
 static GObject *gtk_print_unix_dialog_buildable_get_internal_child  (GtkBuildable *buildable,
@@ -309,12 +315,12 @@
   gtk_dialog_add_action_widget (GTK_DIALOG (dialog), button, response_id);
 }
 
-/* Presents an overwrite confirmation dialog ("print to file" backend).
+/* This function handles error messages before printing.
  */
 static gboolean
-overwrite_confirmation_dialog (GtkPrintUnixDialog *print_dialog,
-                               gint                print_dialog_response_id,
-                               gpointer            data)
+error_dialogs (GtkPrintUnixDialog *print_dialog,
+               gint                print_dialog_response_id,
+               gpointer            data)
 {
   GtkPrintUnixDialogPrivate *priv = print_dialog->priv;
   GtkPrinterOption          *option = NULL;
@@ -330,6 +336,8 @@
     {
       printer = gtk_print_unix_dialog_get_selected_printer (print_dialog);
 
+      /* Shows overwrite confirmation dialog in the case of printing to file which
+       * already exists. */
       if (printer != NULL && gtk_printer_is_virtual (printer))
         {
           option = gtk_printer_option_set_lookup (priv->options,
@@ -395,6 +403,36 @@
               g_free (filename);
             }
         }
+
+      /* Shows error message in the case of printing to printer which is not accepting jobs. */     
+      if (printer != NULL && !gtk_printer_is_accepting_jobs (printer))
+        {
+          GtkWidget *error_dialog;
+
+          toplevel = get_toplevel (GTK_WIDGET (print_dialog));
+
+          error_dialog = gtk_message_dialog_new (toplevel,
+                                                 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+                                                 GTK_MESSAGE_ERROR,
+                                                 GTK_BUTTONS_OK,
+                                                 _("You can not print to the printer \"%s\""),
+                                                 gtk_printer_get_name (printer));
+
+          gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (error_dialog),
+                                                    _("The printer is not accepting jobs."));
+
+          if (toplevel->group)
+            gtk_window_group_add_window (toplevel->group, GTK_WINDOW (error_dialog));
+
+          g_signal_connect (error_dialog, "response",
+                            G_CALLBACK (gtk_widget_destroy), NULL);
+
+          gtk_widget_show (error_dialog);
+
+          g_signal_stop_emission_by_name (print_dialog, "response");
+
+          return TRUE;
+        }
     }
   return FALSE;
 }
@@ -418,7 +456,7 @@
 
   g_signal_connect (dialog,
                     "response",
-                    (GCallback) overwrite_confirmation_dialog,
+                    (GCallback) error_dialogs,
                     NULL);
 
   priv->preview_button = gtk_button_new_from_stock (GTK_STOCK_PRINT_PREVIEW);
@@ -568,6 +606,28 @@
   return parent_buildable_iface->get_internal_child (buildable, builder, childname);
 }
 
+/* This function controls "sensitive" property of GtkCellRenderer based on pause
+ * state of printers. */
+void set_cell_sensitivity_func (GtkTreeViewColumn *tree_column,
+                                GtkCellRenderer   *cell,
+                                GtkTreeModel      *tree_model,
+                                GtkTreeIter       *iter,
+                                gpointer           data)
+{
+  GtkPrinter *printer;
+  
+  gtk_tree_model_get (tree_model, iter, PRINTER_LIST_COL_PRINTER_OBJ, &printer, -1);
+
+  if (printer != NULL && gtk_printer_is_paused (printer))
+    g_object_set (cell,
+                  "sensitive", FALSE,
+                  NULL);
+  else
+    g_object_set (cell,
+                  "sensitive", TRUE,
+                  NULL);
+}
+
 static void
 printer_status_cb (GtkPrintBackend    *backend, 
 		   GtkPrinter         *printer, 
@@ -575,6 +635,7 @@
 {
   GtkPrintUnixDialogPrivate *priv = dialog->priv;
   GtkTreeIter *iter;
+  GtkTreeSelection *selection;
 
   iter = g_object_get_data (G_OBJECT (printer), "gtk-print-tree-iter");
 
@@ -585,6 +646,10 @@
                       PRINTER_LIST_COL_LOCATION, gtk_printer_get_location (printer),
                       -1);
 
+  /* When the pause state change then we need to update sensitive property
+   * of GTK_RESPONSE_OK button inside of selected_printer_changed function. */
+  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->printer_treeview));
+  selected_printer_changed (selection, dialog);
 }
 
 static void
@@ -1410,6 +1475,20 @@
   			  PRINTER_LIST_COL_PRINTER_OBJ, &printer,
 			  -1);
     }
+
+  /* sets GTK_RESPONSE_OK button sensitive/insensitive depending on pause state of printer */
+  if (printer != NULL)
+    {
+      if (gtk_printer_is_paused (printer))
+        {
+          gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_OK, FALSE);
+        }
+      else
+        {
+          if (priv->current_printer == printer && gtk_printer_has_details (printer))
+            gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_OK, TRUE);
+        }
+    }
   
   if (printer != NULL && !gtk_printer_has_details (printer))
     {
@@ -1445,7 +1524,8 @@
 
   priv->printer_capabilities = 0;
   
-  gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_OK, TRUE);
+  if (!gtk_printer_is_paused (printer))
+    gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_OK, TRUE);
   priv->current_printer = printer;
 
   if (printer != NULL)
@@ -1659,6 +1739,7 @@
 						     "icon-name",
 						     PRINTER_LIST_COL_ICON,
 						     NULL);
+  gtk_tree_view_column_set_cell_data_func (column, renderer, set_cell_sensitivity_func, NULL, NULL);
   gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
 
   renderer = gtk_cell_renderer_text_new ();
@@ -1667,6 +1748,7 @@
 						     "text",
 						     PRINTER_LIST_COL_NAME,
 						     NULL);
+  gtk_tree_view_column_set_cell_data_func (column, renderer, set_cell_sensitivity_func, NULL, NULL);
   gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
   
   renderer = gtk_cell_renderer_text_new ();
@@ -1675,6 +1757,7 @@
 						     "text",
 						     PRINTER_LIST_COL_LOCATION,
 						     NULL);
+  gtk_tree_view_column_set_cell_data_func (column, renderer, set_cell_sensitivity_func, NULL, NULL);
   gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
 
   renderer = gtk_cell_renderer_text_new ();
@@ -1684,6 +1767,7 @@
 						     "text",
 						     PRINTER_LIST_COL_STATE,
 						     NULL);
+  gtk_tree_view_column_set_cell_data_func (column, renderer, set_cell_sensitivity_func, NULL, NULL);
   gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
   
   gtk_widget_show (treeview);
Index: modules/printbackends/cups/gtkprintbackendcups.c
===================================================================
--- modules/printbackends/cups/gtkprintbackendcups.c	(revision 20812)
+++ modules/printbackends/cups/gtkprintbackendcups.c	(working copy)
@@ -1058,6 +1058,7 @@
       const gchar *reason_msg = NULL;
       gchar *reason_msg_desc = NULL;
       gchar *tmp_msg = NULL;
+      gchar *tmp_pause_msg = NULL;
       gint printer_state_reason_level = 0; /* 0 - none, 1 - report, 2 - warning, 3 - error */
       gboolean interested_in = FALSE;
       gboolean found = FALSE;
@@ -1093,6 +1094,8 @@
           N_("Printer '%s' may not be connected."),
           N_("There is a problem on printer '%s'.")
         };
+      gboolean is_paused = FALSE;
+      gboolean is_accepting_jobs = TRUE;
       
       /* Skip leading attributes until we hit a printer...
        */
@@ -1121,12 +1124,18 @@
           state_msg = attr->values[0].string.text;
         else if (strcmp (attr->name, "printer-state-reasons") == 0)
           /* Store most important reason to reason_msg and set
-             its importance at printer_state_reason_level */
+           * its importance at printer_state_reason_level */
           {
             for (i = 0; i < attr->num_values; i++)
               {
                 if (strcmp (attr->values[i].string.text, "none") != 0)
                   {
+                    /* Sets is_paused flag for paused printer. */
+                    if (strcmp (attr->values[i].string.text, "paused") == 0)
+                      {
+                        is_paused = TRUE;
+                      }
+
                     interested_in = FALSE;
                     for (j = 0; j < G_N_ELEMENTS (reasons); j++)
                         if (strncmp (attr->values[i].string.text, reasons[j], strlen (reasons[j])) == 0)
@@ -1166,6 +1175,13 @@
           state = attr->values[0].integer;
         else if (strcmp (attr->name, "queued-job-count") == 0)
           job_count = attr->values[0].integer;
+        else if (strcmp (attr->name, "printer-is-accepting-jobs") == 0)
+          {
+            if (attr->values[0].boolean == 1)
+              is_accepting_jobs = TRUE;
+            else
+              is_accepting_jobs = FALSE;
+          }
         else
 	  {
 	    GTK_NOTE (PRINTING,
@@ -1262,6 +1278,9 @@
       else
 	g_object_ref (printer);
 
+      gtk_printer_set_is_paused (printer, is_paused);
+      gtk_printer_set_is_accepting_jobs (printer, is_accepting_jobs);
+
       if (!gtk_printer_is_active (printer))
         {
 	  gtk_printer_set_is_active (printer, TRUE);
@@ -1288,6 +1307,19 @@
       status_changed |= gtk_printer_set_location (printer, location);
       status_changed |= gtk_printer_set_description (printer, description);
 
+      if (state_msg != NULL && strlen (state_msg) == 0)
+        {
+          if (is_paused && !is_accepting_jobs)
+            tmp_pause_msg = g_strdup ( N_("Paused ; Rejecting Jobs"));
+          if (is_paused && is_accepting_jobs)
+            tmp_pause_msg = g_strdup ( N_("Paused"));
+          if (!is_paused && !is_accepting_jobs)
+            tmp_pause_msg = g_strdup ( N_("Rejecting Jobs"));
+
+          if (tmp_pause_msg != NULL)
+            state_msg = tmp_pause_msg;
+        }
+
       /* Set description of the reason and combine it with printer-state-message. */
       if ( (reason_msg != NULL))
         {
@@ -1317,10 +1349,14 @@
         }
 
       status_changed |= gtk_printer_set_state_message (printer, state_msg);
+      status_changed |= gtk_printer_set_is_paused (printer, is_paused);
 
       if (tmp_msg != NULL)
         g_free (tmp_msg);
 
+      if (tmp_pause_msg != NULL)
+        g_free (tmp_pause_msg);
+
       if (reason_msg_desc != NULL)
         g_free (reason_msg_desc);
 
@@ -1376,7 +1412,8 @@
       "printer-state-message",
       "printer-state-reasons",
       "printer-state",
-      "queued-job-count"
+      "queued-job-count",
+      "printer-is-accepting-jobs"
     };
  
   if (cups_backend->list_printers_pending ||
