Merge changes from CUPS 1.4svn-r8252.


git-svn-id: svn+ssh://src.apple.com/svn/cups/easysw/current@1123 a1ca3aef-8c08-0410-bb20-df032aa958be
diff --git a/CHANGES-1.3.txt b/CHANGES-1.3.txt
index 42e4472..b57dbf2 100644
--- a/CHANGES-1.3.txt
+++ b/CHANGES-1.3.txt
@@ -3,7 +3,11 @@
 
 CHANGES IN CUPS V1.3.10
 
-	- Documentation fixes (STR #2994, STR #2995, STR #3008, STR #3056)
+	- Documentation fixes (STR #2994, STR #2995, STR #3008, STR #3056,
+	  STR #3057)
+	- The scheduler did not always load MIME type rules correctly
+	  (STR #3059)
+	- The test page did not format correctly on A4 paper (STR #3060)
 	- The web interface sometimes incorrectly redirected users to
 	  127.0.0.1 (STR #3022)
 	- cupsPrintFile*() did not send the document filename for single
diff --git a/CHANGES.txt b/CHANGES.txt
index 4c35ec7..262c7e4 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,9 +1,21 @@
-CHANGES.txt - 2009-01-09
+CHANGES.txt - 2009-01-14
 ------------------------
 
 CHANGES IN CUPS V1.4b3
 
+	- Documentation fixes (STR #3044, STR #3057)
+	- The libusb-based USB backend did not work.
+	- The scheduler did not set the printer-commands attribute correctly
+	  for some PPDs.
+	- The ppdi utility did not work.
+	- The web interface no longer uses multi-part output with old or broken
+	  web browsers (STR #3049)
 	- CUPS now conforms to the draft IPP/2.0 and IPP/2.1 specification.
+	- Added a new cupsGetConflicts() API to get a list of conflicting
+	  options.
+	- The PPD compiler didn't localize options or choices that did not
+	  have associated translation text (STR #3045)
+	- Updated the Spanish localization (STR #3043)
 	- Fixed build problems (STR #3040, STR #3047)
 	- cupsResolveConflicts() did not resolve using the default option
 	  choice in some cases due to the mirror UIConstraints that are
diff --git a/backend/usb-libusb.c b/backend/usb-libusb.c
index 6e6494c..3cb61e3 100644
--- a/backend/usb-libusb.c
+++ b/backend/usb-libusb.c
@@ -3,7 +3,7 @@
  *
  *   Libusb interface code for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007-2008 by Apple Inc.
+ *   Copyright 2007-2009 by Apple Inc.
  *
  *   These coded instructions, statements, and computer programs are the
  *   property of Apple Inc. and are protected by Federal copyright
@@ -156,13 +156,13 @@
     * TODO: Add back-channel support, along with better write error handling.
     */
 
-    if (poll(pfds, 2, -1) > 0)
+    while (poll(pfds, 2, -1) > 0)
     {
       if (pfds[0].revents & POLLIN)
       {
 	if ((bytes = read(print_fd, buffer, sizeof(buffer))) > 0)
 	{
-	  while (usb_bulk_write(printer->handle, printer->write_endp, buffer,
+	  if (usb_bulk_write(printer->handle, printer->write_endp, buffer,
 	                        bytes, 45000) < 0)
 	  {
 	    _cupsLangPrintf(stderr,
@@ -174,7 +174,7 @@
 
 	  tbytes += bytes;
 	}
-	else if (bytes < 0 && errno != EAGAIN && errno != EINTR)
+	else if (bytes == 0 || (bytes < 0 && errno != EAGAIN && errno != EINTR))
 	  break;
       }
 
diff --git a/cgi-bin/admin.c b/cgi-bin/admin.c
index 1601ef7..b0b3ae2 100644
--- a/cgi-bin/admin.c
+++ b/cgi-bin/admin.c
@@ -3,7 +3,7 @@
  *
  *   Administration CGI for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007-2008 by Apple Inc.
+ *   Copyright 2007-2009 by Apple Inc.
  *   Copyright 1997-2007 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -261,7 +261,7 @@
 
   current_device ++;
 
-  if (time(NULL) > last_device_time)
+  if (time(NULL) > last_device_time && cgiSupportsMultipart())
   {
    /*
     * Update the page...
@@ -921,7 +921,21 @@
     if (cupsGetDevices(http, 30, CUPS_INCLUDE_ALL, CUPS_EXCLUDE_NONE,
                        (cups_device_cb_t)choose_device_cb,
 		       (void *)title) == IPP_OK)
+    {
       fputs("DEBUG: Got device list!\n", stderr);
+
+      if (!cgiSupportsMultipart())
+      {
+       /*
+        * Non-modern browsers that don't support multi-part documents get
+	* everything at the end...
+	*/
+
+	cgiStartHTML(title);
+	cgiCopyTemplateLang("choose-device.tmpl");
+	cgiEndHTML();
+      }
+    }
     else
     {
       fprintf(stderr,
diff --git a/cgi-bin/cgi.h b/cgi-bin/cgi.h
index 66de511..5546d7a 100644
--- a/cgi-bin/cgi.h
+++ b/cgi-bin/cgi.h
@@ -3,7 +3,7 @@
  *
  *   CGI support library definitions.
  *
- *   Copyright 2007-2008 by Apple Inc.
+ *   Copyright 2007-2009 by Apple Inc.
  *   Copyright 1997-2006 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -95,6 +95,7 @@
 extern void		cgiShowJobs(http_t *http, const char *dest);
 extern void		cgiStartHTML(const char *title);
 extern void		cgiStartMultipart(void);
+extern int		cgiSupportsMultipart(void);
 extern const char	*cgiText(const char *message);
 
 #endif /* !_CUPS_CGI_H_ */
diff --git a/cgi-bin/html.c b/cgi-bin/html.c
index e992458..2db9bdd 100644
--- a/cgi-bin/html.c
+++ b/cgi-bin/html.c
@@ -3,7 +3,7 @@
  *
  *   HTML support functions for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007-2008 by Apple Inc.
+ *   Copyright 2007-2009 by Apple Inc.
  *   Copyright 1997-2006 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -14,12 +14,13 @@
  *
  * Contents:
  *
- *   cgiEndHTML()        - End a HTML page.
- *   cgiEndMultipart()   - End the delivery of a multipart web page.
- *   cgiFormEncode()     - Encode a string as a form variable...
- *   cgiStartHTML()      - Start a HTML page.
- *   cgiStartMultipart() - Start a multipart delivery of a web page...
- *   cgi_null_passwd()   - Return a NULL password for authentication.
+ *   cgiEndHTML()           - End a HTML page.
+ *   cgiEndMultipart()      - End the delivery of a multipart web page.
+ *   cgiFormEncode()        - Encode a string as a form variable.
+ *   cgiStartHTML()         - Start a HTML page.
+ *   cgiStartMultipart()    - Start a multipart delivery of a web page.
+ *   cgiSupportsMultipart() - Does the browser support multi-part documents?
+ *   cgi_null_passwd()      - Return a NULL password for authentication.
  */
 
 /*
@@ -72,7 +73,7 @@
 
 
 /*
- * 'cgiFormEncode()' - Encode a string as a form variable...
+ * 'cgiFormEncode()' - Encode a string as a form variable.
  */
 
 char *					/* O - Destination string */
@@ -183,7 +184,7 @@
 
 
 /*
- * 'cgiStartMultipart()' - Start a multipart delivery of a web page...
+ * 'cgiStartMultipart()' - Start a multipart delivery of a web page.
  */
 
 void
@@ -196,6 +197,41 @@
 
 
 /*
+ * 'cgiSupportsMultipart()' - Does the browser support multi-part documents?
+ */
+
+int					/* O - 1 if multi-part supported, 0 otherwise */
+cgiSupportsMultipart(void)
+{
+  const char	*user_agent;		/* User-Agent string */
+  static int	supports_multipart = -1;/* Cached value */
+
+
+  if (supports_multipart < 0)
+  {
+   /*
+    * CUPS STR #3049: Apparently some browsers don't support multi-part
+    * documents, which makes them useless for many web sites.  Rather than
+    * abandoning those users, we'll offer a degraded single-part mode...
+    *
+    * Currently we know that anything based on Gecko, MSIE, and Safari all
+    * work.  We'll add more as they are reported/tested.
+    */
+
+    if ((user_agent = getenv("HTTP_USER_AGENT")) != NULL &&
+        (strstr(user_agent, " Gecko/") != NULL ||
+	 strstr(user_agent, " MSIE ") != NULL ||
+	 strstr(user_agent, " Safari/") != NULL))
+      supports_multipart = 1;
+    else
+      supports_multipart = 0;
+  }
+
+  return (supports_multipart);
+}
+
+
+/*
  * 'cgi_null_passwd()' - Return a NULL password for authentication.
  */
 
diff --git a/cgi-bin/ipp-var.c b/cgi-bin/ipp-var.c
index 90c90cf..842268b 100644
--- a/cgi-bin/ipp-var.c
+++ b/cgi-bin/ipp-var.c
@@ -3,7 +3,7 @@
  *
  *   CGI <-> IPP variable routines for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007-2008 by Apple Inc.
+ *   Copyright 2007-2009 by Apple Inc.
  *   Copyright 1997-2007 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -548,11 +548,14 @@
   * Show status...
   */
 
-  cgiStartMultipart();
-  cgiStartHTML(title);
-  cgiCopyTemplateLang("command.tmpl");
-  cgiEndHTML();
-  fflush(stdout);
+  if (cgiSupportsMultipart())
+  {
+    cgiStartMultipart();
+    cgiStartHTML(title);
+    cgiCopyTemplateLang("command.tmpl");
+    cgiEndHTML();
+    fflush(stdout);
+  }
 
  /*
   * Send the command file job...
@@ -574,7 +577,9 @@
     cgiStartHTML(title);
     cgiCopyTemplateLang("error.tmpl");
     cgiEndHTML();
-    cgiEndMultipart();
+
+    if (cgiSupportsMultipart())
+      cgiEndMultipart();
     return;
   }
 
@@ -592,7 +597,9 @@
     cgiStartHTML(title);
     cgiCopyTemplateLang("error.tmpl");
     cgiEndHTML();
-    cgiEndMultipart();
+
+    if (cgiSupportsMultipart())
+      cgiEndMultipart();
 
     cupsCancelJob(dest, job_id);
     return;
@@ -602,44 +609,47 @@
   * Wait for the job to complete...
   */
 
-  for (;;)
+  if (cgiSupportsMultipart())
   {
-   /*
-    * Get the current job state...
-    */
-
-    snprintf(uri, sizeof(uri), "ipp://localhost/jobs/%d", job_id);
-    request = ippNewRequest(IPP_GET_JOB_ATTRIBUTES);
-    ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri",
-		 NULL, uri);
-    if (user)
-      ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
-		   "requesting-user-name", NULL, user);
-    ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
-		  "requested-attributes", 2, NULL, job_attrs);
-
-    if ((response = cupsDoRequest(http, request, "/")) != NULL)
-      cgiSetIPPVars(response, NULL, NULL, NULL, 0);
-
-    attr = ippFindAttribute(response, "job-state", IPP_TAG_ENUM);
-    if (!attr || attr->values[0].integer >= IPP_JOB_STOPPED)
+    for (;;)
     {
+     /*
+      * Get the current job state...
+      */
+
+      snprintf(uri, sizeof(uri), "ipp://localhost/jobs/%d", job_id);
+      request = ippNewRequest(IPP_GET_JOB_ATTRIBUTES);
+      ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri",
+		   NULL, uri);
+      if (user)
+	ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
+		     "requesting-user-name", NULL, user);
+      ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
+		    "requested-attributes", 2, NULL, job_attrs);
+
+      if ((response = cupsDoRequest(http, request, "/")) != NULL)
+	cgiSetIPPVars(response, NULL, NULL, NULL, 0);
+
+      attr = ippFindAttribute(response, "job-state", IPP_TAG_ENUM);
+      if (!attr || attr->values[0].integer >= IPP_JOB_STOPPED)
+      {
+	ippDelete(response);
+	break;
+      }
+
+     /*
+      * Job not complete, so update the status...
+      */
+
       ippDelete(response);
-      break;
+
+      cgiStartHTML(title);
+      cgiCopyTemplateLang("command.tmpl");
+      cgiEndHTML();
+      fflush(stdout);
+
+      sleep(5);
     }
-
-   /*
-    * Job not complete, so update the status...
-    */
-
-    ippDelete(response);
-
-    cgiStartHTML(title);
-    cgiCopyTemplateLang("command.tmpl");
-    cgiEndHTML();
-    fflush(stdout);
-
-    sleep(5);
   }
 
  /*
@@ -655,7 +665,9 @@
   cgiStartHTML(title);
   cgiCopyTemplateLang("command.tmpl");
   cgiEndHTML();
-  cgiEndMultipart();
+
+  if (cgiSupportsMultipart())
+    cgiEndMultipart();
 }
 
 
diff --git a/cgi-bin/libcupscgi.exp b/cgi-bin/libcupscgi.exp
index efe0ac7..73e309e 100644
--- a/cgi-bin/libcupscgi.exp
+++ b/cgi-bin/libcupscgi.exp
@@ -30,6 +30,7 @@
 _cgiShowJobs
 _cgiStartHTML
 _cgiStartMultipart
+_cgiSupportsMultipart
 _cgiText
 _helpDeleteIndex
 _helpFindNode
diff --git a/config-scripts/cups-manpages.m4 b/config-scripts/cups-manpages.m4
index 13881c5..44d3136 100644
--- a/config-scripts/cups-manpages.m4
+++ b/config-scripts/cups-manpages.m4
@@ -51,14 +51,6 @@
 
 dnl Setup manpage extensions...
 case "$uname" in
-	*BSD* | Darwin*)
-		# *BSD
-		MAN1EXT=1
-		MAN5EXT=5
-		MAN7EXT=7
-		MAN8EXT=8
-		MAN8DIR=8
-		;;
 	IRIX*)
 		# SGI IRIX
 		MAN1EXT=1
@@ -75,8 +67,8 @@
 		MAN8EXT=1m
 		MAN8DIR=1m
 		;;
-	Linux* | GNU*)
-		# Linux and GNU Hurd
+	Linux* | GNU* | Darwin*)
+		# Linux, GNU Hurd, and Mac OS X
 		MAN1EXT=1.gz
 		MAN5EXT=5.gz
 		MAN7EXT=7.gz
diff --git a/cups/conflicts.c b/cups/conflicts.c
index a99810c..6376f69 100644
--- a/cups/conflicts.c
+++ b/cups/conflicts.c
@@ -18,6 +18,8 @@
  *
  * Contents:
  *
+ *   cupsGetConflicts()       - Get a list of conflicting options in a marked
+ *                              PPD.
  *   cupsResolveConflicts()   - Resolve conflicts in a marked PPD.
  *   ppdConflicts()           - Check to see if there are any conflicts among
  *                              the marked option choices.
@@ -66,6 +68,74 @@
 
 
 /*
+ * 'cupsGetConflicts()' - Get a list of conflicting options in a marked PPD.
+ *
+ * This function gets a list of options that would conflict if "option" and
+ * "choice" were marked in the PPD.  You would typically call this function
+ * after marking the currently selected options in the PPD in order to
+ * determine whether a new option selection would cause a conflict.
+ *
+ * The number of conflicting options are returned with "options" pointing to
+ * the conflicting options.  The returned option array must be freed using
+ * @link cupsFreeOptions@.
+ *
+ * @since CUPS 1.4@
+ */
+
+int					/* O - Number of conflicting options */
+cupsGetConflicts(
+    ppd_file_t    *ppd,			/* I - PPD file */
+    const char    *option,		/* I - Option to test */
+    const char    *choice,		/* I - Choice to test */
+    cups_option_t **options)		/* O - Conflicting options */
+{
+  int			i,		/* Looping var */
+			num_options;	/* Number of conflicting options */
+  cups_array_t		*active;	/* Active conflicts */
+  _ppd_cups_uiconsts_t	*c;		/* Current constraints */
+  _ppd_cups_uiconst_t	*cptr;		/* Current constraint */
+
+
+ /*
+  * Range check input...
+  */
+
+  if (options)
+    *options = NULL;
+
+  if (!ppd || !option || !choice || !options)
+    return (0);
+
+ /*
+  * Test for conflicts...
+  */
+
+  active = ppd_test_constraints(ppd, option, choice, 0, NULL,
+                                _PPD_ALL_CONSTRAINTS);
+
+ /*
+  * Loop through all of the UI constraints and add any options that conflict...
+  */
+
+  for (num_options = 0, c = (_ppd_cups_uiconsts_t *)cupsArrayFirst(active);
+       c;
+       c = (_ppd_cups_uiconsts_t *)cupsArrayNext(active))
+  {
+    for (i = c->num_constraints, cptr = c->constraints;
+         i > 0;
+	 i --, cptr ++)
+      if (strcasecmp(cptr->option->keyword, option))
+        num_options = cupsAddOption(cptr->option->keyword, cptr->choice->choice,
+				    num_options, options);
+  }
+
+  cupsArrayDelete(active);
+
+  return (num_options);
+}
+
+
+/*
  * 'cupsResolveConflicts()' - Resolve conflicts in a marked PPD.
  *
  * This function attempts to resolve any conflicts in a marked PPD, returning
diff --git a/cups/cups.h b/cups/cups.h
index 6d3ca29..153ceb4 100644
--- a/cups/cups.h
+++ b/cups/cups.h
@@ -3,7 +3,7 @@
  *
  *   API definitions for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007-2008 by Apple Inc.
+ *   Copyright 2007-2009 by Apple Inc.
  *   Copyright 1997-2007 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -281,6 +281,10 @@
 				      cups_option_t *options) _CUPS_API_1_4;
 extern ipp_status_t	cupsFinishDocument(http_t *http,
 			                   const char *name) _CUPS_API_1_4;
+extern int		cupsGetConflicts(ppd_file_t *ppd, const char *option,
+					 const char *choice,
+					 cups_option_t **options)
+					     _CUPS_API_1_4;
 extern ipp_status_t	cupsGetDevices(http_t *http, int timeout,
 			               const char *exclude_schemes,
 			               const char *include_schemes,
diff --git a/cups/encode.c b/cups/encode.c
index 7d9198e..16762aa 100644
--- a/cups/encode.c
+++ b/cups/encode.c
@@ -3,7 +3,7 @@
  *
  *   Option encoding routines for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007-2008 by Apple Inc.
+ *   Copyright 2007-2009 by Apple Inc.
  *   Copyright 1997-2007 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -86,6 +86,13 @@
   { 1, "marker-names",		IPP_TAG_NAME,		IPP_TAG_PRINTER },
   { 1, "marker-types",		IPP_TAG_KEYWORD,	IPP_TAG_PRINTER },
   { 1, "media",			IPP_TAG_KEYWORD,	IPP_TAG_JOB },
+  { 0, "media-col",		IPP_TAG_BEGIN_COLLECTION, IPP_TAG_JOB },
+  { 0, "media-col-default",	IPP_TAG_BEGIN_COLLECTION, IPP_TAG_PRINTER },
+  { 0, "media-color",		IPP_TAG_KEYWORD,	IPP_TAG_JOB },
+  { 1, "media-default",		IPP_TAG_KEYWORD,	IPP_TAG_PRINTER },
+  { 0, "media-key",		IPP_TAG_KEYWORD,	IPP_TAG_JOB },
+  { 0, "media-size",		IPP_TAG_BEGIN_COLLECTION, IPP_TAG_JOB },
+  { 0, "media-type",		IPP_TAG_KEYWORD,	IPP_TAG_JOB },
   { 0, "mirror",		IPP_TAG_BOOLEAN,	IPP_TAG_JOB },
   { 0, "mirror-default",	IPP_TAG_BOOLEAN,	IPP_TAG_PRINTER },
   { 0, "natural-scaling",	IPP_TAG_INTEGER,	IPP_TAG_JOB },
@@ -152,7 +159,9 @@
   { 0, "sides",			IPP_TAG_KEYWORD,	IPP_TAG_JOB },
   { 0, "sides-default",		IPP_TAG_KEYWORD,	IPP_TAG_PRINTER },
   { 0, "wrap",			IPP_TAG_BOOLEAN,	IPP_TAG_JOB },
-  { 0, "wrap-default",		IPP_TAG_BOOLEAN,	IPP_TAG_PRINTER }
+  { 0, "wrap-default",		IPP_TAG_BOOLEAN,	IPP_TAG_PRINTER },
+  { 0, "x-dimension",		IPP_TAG_INTEGER,	IPP_TAG_JOB },
+  { 0, "y-dimension",		IPP_TAG_INTEGER,	IPP_TAG_JOB }
 };
 
 
@@ -215,6 +224,9 @@
   ipp_attribute_t *attr;		/* IPP attribute */
   ipp_tag_t	value_tag;		/* IPP value tag */
   cups_option_t	*option;		/* Current option */
+  ipp_t		*collection;		/* Collection value */
+  int		num_cols;		/* Number of collection values */
+  cups_option_t	*cols;			/* Collection values */
 
 
   DEBUG_printf(("cupsEncodeOptions2(ipp=%p, num_options=%d, options=%p, "
@@ -369,6 +381,7 @@
 	*/
 
 	DEBUG_puts("cupsEncodeOptions2: Ran out of memory for value copy!");
+	ippDeleteAttribute(ipp, attr);
 	return;
       }
 
@@ -534,6 +547,28 @@
 	                  "\"%s\"...\n", (char *)attr->values[j].unknown.data));
             break;
 
+        case IPP_TAG_BEGIN_COLLECTION :
+	   /*
+	    * Collection value
+	    */
+
+	    num_cols   = cupsParseOptions(val, 0, &cols);
+	    if ((collection = ippNew()) == NULL)
+	    {
+	      cupsFreeOptions(num_cols, cols);
+
+	      if (copy)
+	        free(copy);
+
+	      ippDeleteAttribute(ipp, attr);
+	      return;
+            }
+
+	    attr->values[j].collection = collection;
+	    cupsEncodeOptions2(collection, num_cols, cols, IPP_TAG_JOB);
+            cupsFreeOptions(num_cols, cols);
+	    break;
+
 	default :
 	    if ((attr->values[j].string.text = _cupsStrAlloc(val)) == NULL)
 	    {
@@ -542,6 +577,11 @@
 	      */
 
 	      DEBUG_puts("cupsEncodeOptions2: Ran out of memory for string!");
+
+	      if (copy)
+	        free(copy);
+
+	      ippDeleteAttribute(ipp, attr);
 	      return;
 	    }
 
diff --git a/cups/http-addr.c b/cups/http-addr.c
index 9a39292..52e8285 100644
--- a/cups/http-addr.c
+++ b/cups/http-addr.c
@@ -3,7 +3,7 @@
  *
  *   HTTP address routines for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007-2008 by Apple Inc.
+ *   Copyright 2007-2009 by Apple Inc.
  *   Copyright 1997-2006 by Easy Software Products, all rights reserved.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -207,6 +207,16 @@
   }
 #endif /* AF_LOCAL */
 
+ /*
+  * Optimize lookups for localhost/loopback addresses...
+  */
+
+  if (httpAddrLocalhost(addr))
+  {
+    strlcpy(name, "localhost", namelen);
+    return (name);
+  }
+
 #ifdef HAVE_RES_INIT
  /*
   * STR #2920: Initialize resolver after failure in cups-polld
diff --git a/cups/http-addrlist.c b/cups/http-addrlist.c
index b44acc6..a5b2e1f 100644
--- a/cups/http-addrlist.c
+++ b/cups/http-addrlist.c
@@ -3,7 +3,7 @@
  *
  *   HTTP address list routines for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007-2008 by Apple Inc.
+ *   Copyright 2007-2009 by Apple Inc.
  *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -265,6 +265,7 @@
   }
   else
 #endif /* AF_LOCAL */
+  if (!hostname || strcasecmp(hostname, "localhost"))
   {
 #ifdef HAVE_GETADDRINFO
     struct addrinfo	hints,		/* Address lookup hints */
@@ -501,7 +502,7 @@
   * Detect some common errors and handle them sanely...
   */
 
-  if (!addr && (!hostname || !strcmp(hostname, "localhost")))
+  if (!addr && (!hostname || !strcasecmp(hostname, "localhost")))
   {
     struct servent	*port;		/* Port number for service */
     int			portnum;	/* Port number */
@@ -530,7 +531,7 @@
     else
       return (NULL);
 
-    if (hostname && !strcmp(hostname, "localhost"))
+    if (hostname && !strcasecmp(hostname, "localhost"))
     {
      /*
       * Unfortunately, some users ignore all of the warnings in the
diff --git a/cups/ipp.c b/cups/ipp.c
index de0f12c..f8e7daf 100644
--- a/cups/ipp.c
+++ b/cups/ipp.c
@@ -1109,18 +1109,6 @@
 	  }
 
 	 /*
-          * Verify the major version number...
-	  */
-
-	  if (buffer[0] != 1 && buffer[0] != 2)
-	  {
-	    DEBUG_printf(("ippReadIO: version number (%d.%d) is bad.\n",
-	                  buffer[0], buffer[1]));
-	    ipp_buffer_release(buffer);
-	    return (IPP_ERROR);
-	  }
-
-	 /*
           * Then copy the request header over...
 	  */
 
diff --git a/cups/libcups.exp b/cups/libcups.exp
index 32803d6..74914ae 100644
--- a/cups/libcups.exp
+++ b/cups/libcups.exp
@@ -140,6 +140,7 @@
 _cupsFreeJobs
 _cupsFreeOptions
 _cupsGetClasses
+_cupsGetConflicts
 _cupsGetDefault
 _cupsGetDefault2
 _cupsGetDest
diff --git a/cups/mark.c b/cups/mark.c
index 4466ec1..b2cef1f 100644
--- a/cups/mark.c
+++ b/cups/mark.c
@@ -79,10 +79,12 @@
     cups_option_t *options)		/* I - Options */
 {
   int		i, j, k;		/* Looping vars */
-  char		*val,			/* Pointer into value */
-		*ptr,			/* Pointer into string */
+  char		*ptr,			/* Pointer into string */
 		s[255];			/* Temporary string */
-  const char	*page_size;		/* PageSize option */
+  const char	*val,			/* Pointer into value */
+		*media,			/* media option */
+		*media_col,		/* media-col option */
+		*page_size;		/* PageSize option */
   cups_option_t	*optptr;		/* Current option */
   ppd_option_t	*option;		/* PPD option */
   ppd_attr_t	*attr;			/* PPD attribute */
@@ -123,61 +125,124 @@
   debug_marked(ppd, "Before...");
 
  /*
-  * Mark options...
+  * Do special handling for media, media-col, and PageSize...
+  */
+
+  media     = cupsGetOption("media", num_options, options);
+  media_col = cupsGetOption("media-col", num_options, options);
+  page_size = cupsGetOption("PageSize", num_options, options);
+
+  if (media_col && (!page_size || !page_size[0]))
+  {
+   /*
+    * Pull out the corresponding media size from the media-col value...
+    */
+
+    int			num_media_cols,	/* Number of media-col values */
+    			num_media_sizes;/* Number of media-size values */
+    cups_option_t	*media_cols,	/* media-col values */
+			*media_sizes;	/* media-size values */
+
+
+    num_media_cols = cupsParseOptions(media_col, 0, &media_cols);
+
+    if ((val = cupsGetOption("media-key", num_media_cols, media_cols)) != NULL)
+      media = val;
+    else if ((val = cupsGetOption("media-size", num_media_cols,
+                                  media_cols)) != NULL)
+    {
+     /*
+      * Lookup by dimensions...
+      */
+
+      double		width,		/* Width in points */
+			length;		/* Length in points */
+      struct lconv	*loc;		/* Locale data */
+      _cups_pwg_media_t	*pwgmedia;	/* PWG media name */
+
+
+      num_media_sizes = cupsParseOptions(val, 0, &media_sizes);
+      loc             = localeconv();
+
+      if ((val = cupsGetOption("x-dimension", num_media_sizes,
+                               media_sizes)) != NULL)
+        width = _cupsStrScand(val, NULL, loc) * 2540.0 / 72.0;
+      else
+        width = 0.0;
+
+      if ((val = cupsGetOption("y-dimension", num_media_sizes,
+                               media_sizes)) != NULL)
+        length = _cupsStrScand(val, NULL, loc) * 2540.0 / 72.0;
+      else
+        length = 0.0;
+
+      if ((pwgmedia = _cupsPWGMediaBySize(width, length)) != NULL)
+        media = pwgmedia->pwg;
+
+      cupsFreeOptions(num_media_sizes, media_sizes);
+    }
+
+    cupsFreeOptions(num_media_cols, media_cols);
+  }
+
+  if (media)
+  {
+   /*
+    * Loop through the option string, separating it at commas and
+    * marking each individual option as long as the corresponding
+    * PPD option (PageSize, InputSlot, etc.) is not also set.
+    *
+    * For PageSize, we also check for an empty option value since
+    * some versions of MacOS X use it to specify auto-selection
+    * of the media based solely on the size.
+    */
+
+    for (val = media; *val;)
+    {
+     /*
+      * Extract the sub-option from the string...
+      */
+
+      for (ptr = s; *val && *val != ',' && (ptr - s) < (sizeof(s) - 1);)
+	*ptr++ = *val++;
+      *ptr++ = '\0';
+
+      if (*val == ',')
+	val ++;
+
+     /*
+      * Mark it...
+      */
+
+      if (!page_size || !page_size[0])
+	ppd_mark_size(ppd, s);
+
+      if (cupsGetOption("InputSlot", num_options, options) == NULL)
+	ppd_mark_option(ppd, "InputSlot", s);
+
+      if (cupsGetOption("MediaType", num_options, options) == NULL)
+	ppd_mark_option(ppd, "MediaType", s);
+
+      if (cupsGetOption("EFMediaType", num_options, options) == NULL)
+	ppd_mark_option(ppd, "EFMediaType", s);		/* EFI */
+
+      if (cupsGetOption("EFMediaQualityMode", num_options, options) == NULL)
+	ppd_mark_option(ppd, "EFMediaQualityMode", s);	/* EFI */
+
+      if (!strcasecmp(s, "manual") &&
+	  !cupsGetOption("ManualFeed", num_options, options))
+	ppd_mark_option(ppd, "ManualFeed", "True");
+    }
+  }
+
+ /*
+  * Mark other options...
   */
 
   for (i = num_options, optptr = options; i > 0; i --, optptr ++)
-    if (!strcasecmp(optptr->name, "media"))
-    {
-     /*
-      * Loop through the option string, separating it at commas and
-      * marking each individual option as long as the corresponding
-      * PPD option (PageSize, InputSlot, etc.) is not also set.
-      *
-      * For PageSize, we also check for an empty option value since
-      * some versions of MacOS X use it to specify auto-selection
-      * of the media based solely on the size.
-      */
-
-      page_size = cupsGetOption("PageSize", num_options, options);
-
-      for (val = optptr->value; *val;)
-      {
-       /*
-        * Extract the sub-option from the string...
-	*/
-
-        for (ptr = s; *val && *val != ',' && (ptr - s) < (sizeof(s) - 1);)
-	  *ptr++ = *val++;
-	*ptr++ = '\0';
-
-	if (*val == ',')
-	  val ++;
-
-       /*
-        * Mark it...
-	*/
-
-        if (!page_size || !page_size[0])
-	  ppd_mark_size(ppd, s);
-
-        if (cupsGetOption("InputSlot", num_options, options) == NULL)
-	  ppd_mark_option(ppd, "InputSlot", s);
-
-        if (cupsGetOption("MediaType", num_options, options) == NULL)
-	  ppd_mark_option(ppd, "MediaType", s);
-
-        if (cupsGetOption("EFMediaType", num_options, options) == NULL)
-	  ppd_mark_option(ppd, "EFMediaType", s);		/* EFI */
-
-        if (cupsGetOption("EFMediaQualityMode", num_options, options) == NULL)
-	  ppd_mark_option(ppd, "EFMediaQualityMode", s);	/* EFI */
-
-	if (!strcasecmp(s, "manual") &&
-	    !cupsGetOption("ManualFeed", num_options, options))
-          ppd_mark_option(ppd, "ManualFeed", "True");
-      }
-    }
+    if (!strcasecmp(optptr->name, "media") ||
+        !strcasecmp(optptr->name, "media-col"))
+      continue;
     else if (!strcasecmp(optptr->name, "sides"))
     {
       for (j = 0;
diff --git a/cups/testipp.c b/cups/testipp.c
index aa119ac..972c647 100644
--- a/cups/testipp.c
+++ b/cups/testipp.c
@@ -3,7 +3,7 @@
  *
  *   IPP test program for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007 by Apple Inc.
+ *   Copyright 2007-2009 by Apple Inc.
  *   Copyright 1997-2005 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -488,7 +488,7 @@
 
   for (group = IPP_TAG_ZERO, attr = ipp->attrs; attr; attr = attr->next)
   {
-    if ((attr->group_tag == IPP_TAG_ZERO && indent <= 8) || !attr->name)
+    if (!attr->name && indent == 4)
     {
       group = IPP_TAG_ZERO;
       putchar('\n');
@@ -499,17 +499,10 @@
     {
       group = attr->group_tag;
 
-      putchar('\n');
-      for (i = 4; i < indent; i ++)
-        putchar(' ');
-
-      printf("%s:\n\n", tags[group]);
+      printf("\n%*s%s:\n\n", indent - 4, "", tags[group]);
     }
 
-    for (i = 0; i < indent; i ++)
-      putchar(' ');
-
-    printf("%s (", attr->name);
+    printf("%*s%s (", indent, "", attr->name ? attr->name : "(null)");
     if (attr->num_values > 1)
       printf("1setOf ");
     printf("%s):", tags[attr->value_tag]);
diff --git a/cups/testppd.c b/cups/testppd.c
index 97337cc..44c43b5 100644
--- a/cups/testppd.c
+++ b/cups/testppd.c
@@ -113,7 +113,8 @@
   int		conflicts;		/* Number of conflicts */
   char		*s;			/* String */
   char		buffer[8192];		/* String buffer */
-  const char	*text;			/* Localized text */
+  const char	*text,			/* Localized text */
+		*val;			/* Option value */
   int		num_options;		/* Number of options */
   cups_option_t	*options;		/* Options */
   ppd_size_t	minsize,		/* Minimum size */
@@ -265,8 +266,26 @@
     * Test constraints...
     */
 
-    fputs("ppdConflicts(): ", stdout);
+    fputs("cupsGetConflicts(InputSlot=Envelope): ", stdout);
     ppdMarkOption(ppd, "PageSize", "Letter");
+
+    num_options = cupsGetConflicts(ppd, "InputSlot", "Envelope", &options);
+    if (num_options != 2 ||
+        (val = cupsGetOption("PageRegion", num_options, options)) == NULL ||
+	strcasecmp(val, "Letter") ||
+	(val = cupsGetOption("PageSize", num_options, options)) == NULL ||
+	strcasecmp(val, "Letter"))
+    {
+      printf("FAIL (%d options:", num_options);
+      for (i = 0; i < num_options; i ++)
+        printf(" %s=%s", options[i].name, options[i].value);
+      puts(")");
+      status ++;
+    }
+    else
+      puts("PASS");
+
+    fputs("ppdConflicts(): ", stdout);
     ppdMarkOption(ppd, "InputSlot", "Envelope");
 
     if ((conflicts = ppdConflicts(ppd)) == 2)
diff --git a/doc/Makefile b/doc/Makefile
index bf8bca0..0c894af 100644
--- a/doc/Makefile
+++ b/doc/Makefile
@@ -104,6 +104,7 @@
 			help/ref-snmp-conf.html \
 			help/ref-subscriptions-conf.html \
 			help/security.html \
+			help/sharing.html \
 			help/spec-banner.html \
 			help/spec-browsing.html \
 			help/spec-cmp.html \
diff --git a/doc/help/api-array.html b/doc/help/api-array.html
index f7373e3..1916f3d 100644
--- a/doc/help/api-array.html
+++ b/doc/help/api-array.html
@@ -388,8 +388,8 @@
 <li><a href="#cupsArrayNext" title="Get the next element in the array.">cupsArrayNext</a></li>
 <li><a href="#cupsArrayPrev" title="Get the previous element in the array.">cupsArrayPrev</a></li>
 <li><a href="#cupsArrayRemove" title="Remove an element from the array.">cupsArrayRemove</a></li>
-<li><a href="#cupsArrayRestore" title="Reset the current element to the last <a href="#cupsArraySave"><code>cupsArraySave</code></a>.">cupsArrayRestore</a></li>
-<li><a href="#cupsArraySave" title="Mark the current element for a later <a href="#cupsArrayRestore"><code>cupsArrayRestore</code></a>.">cupsArraySave</a></li>
+<li><a href="#cupsArrayRestore" title="Reset the current element to the last cupsArraySave.">cupsArrayRestore</a></li>
+<li><a href="#cupsArraySave" title="Mark the current element for a later cupsArrayRestore.">cupsArraySave</a></li>
 <li><a href="#cupsArrayUserData" title="Return the user data for an array.">cupsArrayUserData</a></li>
 </ul></li>
 <li><a href="#TYPES">Data Types</a><ul class="code">
diff --git a/doc/help/api-ppd.html b/doc/help/api-ppd.html
index 3da1d96..98b81f3 100644
--- a/doc/help/api-ppd.html
+++ b/doc/help/api-ppd.html
@@ -375,6 +375,7 @@
 <li><a href="#ATTRIBUTES">Attributes</a></li>
 </ul></li>
 <li><a href="#FUNCTIONS">Functions</a><ul class="code">
+<li><a href="#cupsGetConflicts" title="Get a list of conflicting options in a marked PPD.">cupsGetConflicts</a></li>
 <li><a href="#cupsMarkOptions" title="Mark command-line options in a PPD file.">cupsMarkOptions</a></li>
 <li><a href="#cupsResolveConflicts" title="Resolve conflicts in a marked PPD.">cupsResolveConflicts</a></li>
 <li><a href="#ppdClose" title="Free all memory used by the PPD file.">ppdClose</a></li>
@@ -689,6 +690,39 @@
   puts(attr->value);
 </pre>
 <h2 class="title"><a name="FUNCTIONS">Functions</a></h2>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.4&nbsp;</span><a name="cupsGetConflicts">cupsGetConflicts</a></h3>
+<p class="description">Get a list of conflicting options in a marked PPD.</p>
+<p class="code">
+int cupsGetConflicts (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#ppd_file_t">ppd_file_t</a> *ppd,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *option,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *choice,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;cups_option_t **options<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>ppd</dt>
+<dd class="description">PPD file</dd>
+<dt>option</dt>
+<dd class="description">Option to test</dd>
+<dt>choice</dt>
+<dd class="description">Choice to test</dd>
+<dt>options</dt>
+<dd class="description">Conflicting options</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Number of conflicting options</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function gets a list of options that would conflict if &quot;option&quot; and
+&quot;choice&quot; were marked in the PPD.  You would typically call this function
+after marking the currently selected options in the PPD in order to
+determine whether a new option selection would cause a conflict.<br>
+<br>
+The number of conflicting options are returned with &quot;options&quot; pointing to
+the conflicting options.  The returned option array must be freed using
+<a href="#cupsFreeOptions"><code>cupsFreeOptions</code></a>.
+
+</p>
 <h3 class="function"><a name="cupsMarkOptions">cupsMarkOptions</a></h3>
 <p class="description">Mark command-line options in a PPD file.</p>
 <p class="code">
diff --git a/doc/help/ref-cupsd-conf.html.in b/doc/help/ref-cupsd-conf.html.in
index 33b6693..6c51b9d 100644
--- a/doc/help/ref-cupsd-conf.html.in
+++ b/doc/help/ref-cupsd-conf.html.in
@@ -559,7 +559,9 @@
 BrowseLocalProtocols cups
 BrowseLocalProtocols dnssd
 BrowseLocalProtocols ldap
+BrowseLocalProtocols lpd
 BrowseLocalProtocols slp
+BrowseLocalProtocols smb
 BrowseLocalProtocols cups dnssd
 </PRE>
 
@@ -568,7 +570,7 @@
 <P>The <CODE>BrowseLocalProtocols</CODE> directive specifies the
 protocols to use when advertising local shared printers on the
 network. Multiple protocols can be specified by separating them
-with spaces. The default is <CODE>@CUPS_BROWSE_REMOTE_PROTOCOLS@</CODE>.</P>
+with spaces. The default is "<CODE>@CUPS_BROWSE_LOCAL_PROTOCOLS@</CODE>".</P>
 
 
 <H2 CLASS="title"><A NAME="BrowseOrder">BrowseOrder</A></H2>
@@ -652,7 +654,9 @@
 BrowseProtocols cups
 BrowseProtocols dnssd
 BrowseProtocols ldap
+BrowseProtocols lpd
 BrowseProtocols slp
+BrowseProtocols smb
 BrowseProtocols cups dnssd
 </PRE>
 
@@ -662,9 +666,9 @@
 protocols to use when showing and advertising shared printers on
 the local network. Multiple protocols can be specified by
 separating them with spaces. The default protocol is
-<CODE>@CUPS_BROWSE_LOCAL_PROTOCOLS@</CODE> for
+"<CODE>@CUPS_BROWSE_LOCAL_PROTOCOLS@</CODE>" for
 <A HREF="#BrowseLocalProtocols"><CODE>BrowseLocalProtocols</CODE></A> and
-<CODE>@CUPS_BROWSE_REMOTE_PROTOCOLS@</CODE> for
+"<CODE>@CUPS_BROWSE_REMOTE_PROTOCOLS@</CODE>" for
 <A HREF="#BrowseRemoteProtocols"><CODE>BrowseRemoteProtocols</CODE></A>.</P>
 
 <BLOCKQUOTE><B>Note:</B>
@@ -736,10 +740,8 @@
 BrowseRemoteProtocols all
 BrowseRemoteProtocols none
 BrowseRemoteProtocols cups
-BrowseRemoteProtocols dnssd
 BrowseRemoteProtocols ldap
 BrowseRemoteProtocols slp
-BrowseRemoteProtocols cups dnssd
 </PRE>
 
 <H3>Description</H3>
@@ -747,7 +749,7 @@
 <P>The <CODE>BrowseRemoteProtocols</CODE> directive specifies the
 protocols to use when finding remote shared printers on the
 network. Multiple protocols can be specified by separating them
-with spaces. The default is <CODE>@CUPS_BROWSE_REMOTE_PROTOCOLS@</CODE>.</P>
+with spaces. The default is "<CODE>@CUPS_BROWSE_REMOTE_PROTOCOLS@</CODE>".</P>
 
 
 <H2 CLASS="title"><A NAME="BrowseShortNames">BrowseShortNames</A></H2>
diff --git a/doc/help/sharing.html b/doc/help/sharing.html
new file mode 100644
index 0000000..29bb757
--- /dev/null
+++ b/doc/help/sharing.html
@@ -0,0 +1,181 @@
+<html>
+<!-- SECTION: Getting Started -->
+<head>
+	<title>Printer Sharing</title>
+</head>
+<body>
+
+<p>This document discusses several ways to configure printer sharing.</p>
+
+<h2><a name="BASICS">The Basics</h2>
+
+<p>A "server" is any machine that communicates directly to a printer. A "client"
+is any machine that sends print jobs to a server for final printing. Clients can
+also be servers if they communicate directly with any printers of their own.</p>
+
+<p>By default, CUPS uses the Internet Printing Protocol (IPP) to send jobs from
+a client to a server. When printing to legacy print servers you may also use the
+Line Printer Daemon (LPD) when printing to older UNIX-based servers or Server
+Message Block (SMB) when printing to Windows<sup>&reg;</sup> servers.</p>
+
+<p>Clients can automatically discover and access shared printers via CUPS
+browsing, IPP, Service Location Protocol (SLP), and Lightweight Directory Access
+Protocol (LDAP). DNS Service Discovery (DNS-SD a.k.a. Bonjour<sup>&reg;</sup>)
+and SMB browsing can also be used to manually discover and access shared
+printers.</p>
+
+
+<h2><a name="SERVER_CONFIG">Configuring the Server</a></h2>
+
+<p>You must enable printer sharing on the server before clients can print
+through it. The simplest way to do this is to use the
+<a href="man-cupsctl.html">cupsctl(8)</a> command on the server:</p>
+
+<pre class="command">
+cupsctl --share-printers
+</pre>
+
+<p>By default, the above command will allow printing from other clients on the
+same subnet as your server. To allow printing from any subnet, use the following
+command instead:</p>
+
+<pre class="command">
+cupsctl --share-printers --remote-any
+</pre>
+
+<p>Next, you need to choose which protocols to use for printer sharing. The
+default is CUPS browsing and DNS-SD on Mac OS X and CUPS browsing alone on
+other platforms. To set the sharing protocols, run the <b>cupsctl</b> command
+to set the
+<a href="ref-cupsd-conf.html#BrowseLocalProtocols">BrowseLocalProtocols</a>
+value. For example, run the following command to allow shared printing via
+CUPS, DNS-SD, LPD, and SMB:</p>
+
+<pre class="command">
+cupsctl 'BrowseLocalProtocols="cups dnssd lpd smb"'
+</pre>
+
+
+<h2><a name="AUTO_CUPS">Automatic Configuration using CUPS Browsing</a></h2>
+
+<p>CUPS browsing works by periodically broadcasting information about printers
+that are being shared to client systems on the same subnet. Each client
+maintains its own list of shared printers, and when more than one server shares
+the same printer (or the same kind of printer) the client uses all of the
+servers and printers to provide high-availability and failsafe printing.</p>
+
+<p>To configure printers on the same subnet, <em>do nothing</em>. Each client
+should see the available printers within 30 seconds automatically. The printer
+and class lists are updated automatically as printers and servers are added or
+removed.</p>
+
+<blockquote><b>Note:</b>
+
+<p>Due to user interface changes in Mac OS X 10.5, CUPS shared printers will not
+automatically appear in the print dialog. Instead, you must first run the
+following command to enable CUPS browsing on your system:</p>
+
+<pre class="command">
+cupsctl BrowseRemoteProtocols=cups
+</pre>
+
+<p>Then choose each of the CUPS shared printers you want to see in the print
+dialog by adding them, either from the <var>Add Printer...</var> item in the
+print dialog or from the <var>Print &amp; Fax</var> preference pane in the
+<var>System Preferences</var> window.</p>
+
+</blockquote>
+
+<h3><a name="BROWSE_POLL">Seeing Printers on Other Subnets</a></h3>
+
+<p>You can automatically access printers on other subnets by adding
+<a href="ref-cupsd-conf.html#BrowsePoll"><code>BrowsePoll</code></a> lines
+to the <var>cupsd.conf</var> file on your local system. For a single
+server you can use the <b>cupsctl</b> command:</p>
+
+<pre class="command">
+cupsctl BrowsePoll=server:port
+</pre>
+
+<p>For multiple servers, use the CUPS web interface (http://localhost:631/admin)
+to edit the configuration file instead. Enter one <code>BrowsePoll</code> line
+per server at the bottom of the file, as follows:</p>
+
+<pre class="example">
+BrowsePoll server1:port
+BrowsePoll server2:port
+BrowsePoll server3:port
+</pre>
+
+<p>If you have more than one client on your subnet that wants to see the
+printers on those servers, add a
+<a href="ref-cupsd-conf.html#BrowseRelay"><code>BrowseRely</code></a> line
+to the <var>cupsd.conf</var> file on your local system using the <b>cupsctl</b>
+command:</p>
+
+<pre class="command">
+cupsctl 'BrowseRelay="127.0.0.1 @LOCAL"'
+</pre>
+
+<p>or CUPS web interface (again, at the bottom of the file):</p>
+
+<pre class="example">
+BrowseRelay 127.0.0.1 @LOCAL
+</pre>
+
+
+<h2><a name="AUTO_IPP">Automatic Configuration using IPP</a></h2>
+
+<p>CUPS can be configured to run without a local spooler and send all jobs to a
+single server. However, if that server goes down then all printing will be
+disabled. Use this configuration only as absolutely necessary.</p>
+
+<p>The default server is normally the local system ("localhost"). To override
+the default server create a file named <var>/etc/cups/client.conf</var> with a
+line as follows:</p>
+
+<pre class='example'>
+ServerName <em>server</em>
+</pre>
+
+<p>The <var>server</var> name can be the hostname or IP address of the default
+server. If the server is not using the default IPP port (631), you can add the
+port number at the end like this:</p>
+
+<pre class='example'>
+ServerName <em>server:port</em>
+</pre>
+
+<p>The default server can also be customized on a per-user basis. To set a
+user-specific server create a file named <var>~/.cups/client.conf</var> instead.
+The user <var>client.conf</var> file takes precedence over the system one.</p>
+
+<p>Finally, you can set the <code>CUPS_SERVER</code> environment variable to
+override the default server for a single process, for example:</p>
+
+<pre class='command'>
+CUPS_SERVER=server:port firefox http://www.cups.org
+</pre>
+
+<p>will run the Firefox web browser pointed to the specified server and
+port. The environment variable overrides both the user and system
+<var>client.conf</var> files, if any.</p>
+
+
+<h2><a name="MANUAL">Manual Configuration of Print Queues</a></h2>
+
+<p>The most tedious method of configuring client machines is to configure
+each remote queue by hand using the <a href="man-lpadmin.html">lpadmin(8)</a>
+command:</p>
+
+<pre class='command'>
+lpadmin -p <em>printer</em> -E -v ipp://<em>server</em>/printers/<em>printer</em>
+</pre>
+
+<p>The <var>printer</var> name is the name of the printer on the server machine.
+The <var>server</var> name is the hostname or IP address of the server machine.
+Repeat the <b>lpadmin</b> command for each remote printer you wish to use.</p>
+
+
+</body>
+</html>
diff --git a/doc/help/spec-ipp.html b/doc/help/spec-ipp.html
index 70db037..70a3031 100644
--- a/doc/help/spec-ipp.html
+++ b/doc/help/spec-ipp.html
@@ -438,7 +438,7 @@
 
 	<dd>The required authentication information.
 
-</dl
+</dl>
 
 <h3 class='title'><span class='info'>CUPS 1.1</span><a name='CREATE_JOB'>Create-Job Operation</a></h3>
 
@@ -543,7 +543,7 @@
 
 	<dd>The required authentication information.
 
-</dl
+</dl>
 
 <h3 class='title'><a name='CANCEL_JOB'>Cancel Job Operation</a></h3>
 
@@ -1867,7 +1867,7 @@
 
 	<dd>The required authentication information.
 
-</dl
+</dl>
 
 <h3 class='title'><span class='info'>CUPS 1.3</span><a name='CUPS_GET_PPD'>CUPS-Get-PPD Operation</a></h3>
 
diff --git a/locale/cups_es.po b/locale/cups_es.po
index 230de93..49d10ca 100644
--- a/locale/cups_es.po
+++ b/locale/cups_es.po
@@ -17,7 +17,7 @@
 "Project-Id-Version: CUPS 1.4\n"
 "Report-Msgid-Bugs-To: http://www.cups.org/str.php\n"
 "POT-Creation-Date: 2008-12-15 09:29-0800\n"
-"PO-Revision-Date: 2008-11-12 16:53+0100\n"
+"PO-Revision-Date: 2008-12-17 17:32+0100\n"
 "Last-Translator: Juan Pablo González Riopedre <[email protected]>\n"
 "Language-Team: Spanish\n"
 "MIME-Version: 1.0\n"
@@ -245,31 +245,24 @@
 "                REF: Página 15, sección 3.2.\n"
 
 msgid "        WARN    Default choices conflicting!\n"
-msgstr ""
-"        ADVERTENCIA    Las preferencias predeterminadas están en conflicto.\n"
+msgstr "        ADVERTENCIA    Las preferencias predeterminadas están en conflicto.\n"
 
 #, c-format
 msgid ""
-"        WARN    Duplex option keyword %s may not work as expected and should "
-"be named Duplex!\n"
+"        WARN    Duplex option keyword %s may not work as expected and should be named Duplex!\n"
 "                REF: Page 122, section 5.17\n"
 msgstr ""
-"        ADVERTENCIA    La clave de opción Duplex %s puede que no funcione "
-"como se espera y debería llamarse Duplex.\n"
+"        ADVERTENCIA    La clave de opción Duplex %s puede que no funcione como se espera y debería llamarse Duplex.\n"
 "                REF: Página 122, sección 5.17\n"
 
-msgid ""
-"        WARN    File contains a mix of CR, LF, and CR LF line endings!\n"
-msgstr ""
-"        ADVERTENCIA    El archivo contiene una mezcla de líneas acabadas en "
-"CR, LF y CR LF.\n"
+msgid "        WARN    File contains a mix of CR, LF, and CR LF line endings!\n"
+msgstr "        ADVERTENCIA    El archivo contiene una mezcla de líneas acabadas en CR, LF y CR LF.\n"
 
 msgid ""
 "        WARN    LanguageEncoding required by PPD 4.3 spec.\n"
 "                REF: Pages 56-57, section 5.3.\n"
 msgstr ""
-"        ADVERTENCIA    Se necesita LanguageEncoding por especificación de "
-"PPD 4.3.\n"
+"        ADVERTENCIA    Se necesita LanguageEncoding por especificación de PPD 4.3.\n"
 "                REF: Páginas 56-57, sección 5.3.\n"
 
 #, c-format
@@ -280,8 +273,7 @@
 "        WARN    Manufacturer required by PPD 4.3 spec.\n"
 "                REF: Pages 58-59, section 5.3.\n"
 msgstr ""
-"        ADVERTENCIA    Se necesita Manufacturer por especificación de PPD "
-"4.3.\n"
+"        ADVERTENCIA    Se necesita Manufacturer por especificación de PPD 4.3.\n"
 "                REF: Páginas 58-59, sección 5.3.\n"
 
 #, c-format
@@ -292,12 +284,8 @@
 msgid "        WARN    Missing APPrinterIconPath file \"%s\"\n"
 msgstr "        ADVERTENCIA    Falta el archivo APPrinterIconPath \"%s\"\n"
 
-msgid ""
-"        WARN    Non-Windows PPD files should use lines ending with only LF, "
-"not CR LF!\n"
-msgstr ""
-"        ADVERTENCIA    Los archivos PPD que no sean de Windows deben tener "
-"líneas que acaben sólo en LF, no en CR LF.\n"
+msgid "        WARN    Non-Windows PPD files should use lines ending with only LF, not CR LF!\n"
+msgstr "        ADVERTENCIA    Los archivos PPD que no sean de Windows deben tener líneas que acaben sólo en LF, no en CR LF.\n"
 
 #, c-format
 msgid ""
@@ -311,32 +299,28 @@
 "        WARN    PCFileName longer than 8.3 in violation of PPD spec.\n"
 "                REF: Pages 61-62, section 5.3.\n"
 msgstr ""
-"        ADVERTENCIA    PCFileName es mas largo que 8.3 violando la "
-"especificación PPD.\n"
+"        ADVERTENCIA    PCFileName es mas largo que 8.3 violando la especificación PPD.\n"
 "                REF: Páginas 61-62, sección 5.3.\n"
 
 msgid ""
 "        WARN    Protocols contains PJL but JCL attributes are not set.\n"
 "                REF: Pages 78-79, section 5.7.\n"
 msgstr ""
-"        ADVERTENCIA    Los protocolos contienen PJL pero no se especifican "
-"los atributos JCL.\n"
+"        ADVERTENCIA    Los protocolos contienen PJL pero no se especifican los atributos JCL.\n"
 "                REF: Páginas 78-79, sección 5.7.\n"
 
 msgid ""
 "        WARN    Protocols contains both PJL and BCP; expected TBCP.\n"
 "                REF: Pages 78-79, section 5.7.\n"
 msgstr ""
-"        ADVERTENCIA    Los protocolos contienen a ambos, PJL y BCP; se "
-"esperaba TBCP.\n"
+"        ADVERTENCIA    Los protocolos contienen a ambos, PJL y BCP; se esperaba TBCP.\n"
 "                REF: Páginas 78-79, sección 5.7.\n"
 
 msgid ""
 "        WARN    ShortNickName required by PPD 4.3 spec.\n"
 "                REF: Pages 64-65, section 5.3.\n"
 msgstr ""
-"        ADVERTENCIA    Se necesita ShortNickName por especificación de PPD "
-"4.3.\n"
+"        ADVERTENCIA    Se necesita ShortNickName por especificación de PPD 4.3.\n"
 "                REF: Páginas 64-65, sección 5.3.\n"
 
 #, c-format
@@ -353,15 +337,11 @@
 
 #, c-format
 msgid "      %s  Bad UTF-8 \"%s\" translation string for option %s!\n"
-msgstr ""
-"      %s  Cadena de traducción UTF-8 \"%s\" incorrecta para opción %s.\n"
+msgstr "      %s  Cadena de traducción UTF-8 \"%s\" incorrecta para opción %s.\n"
 
 #, c-format
-msgid ""
-"      %s  Bad UTF-8 \"%s\" translation string for option %s, choice %s!\n"
-msgstr ""
-"      %s  Cadena de traducción UTF-8 \"%s\" incorrecta para opción %s, "
-"preferencia %s.\n"
+msgid "      %s  Bad UTF-8 \"%s\" translation string for option %s, choice %s!\n"
+msgstr "      %s  Cadena de traducción UTF-8 \"%s\" incorrecta para opción %s, preferencia %s.\n"
 
 #, c-format
 msgid "      %s  Bad cupsFilter value \"%s\"!\n"
@@ -393,18 +373,15 @@
 
 #, c-format
 msgid "      %s  Missing \"%s\" translation string for option %s, choice %s!\n"
-msgstr ""
-"      %s  Falta cadena de traducción \"%s\" para opción %s, preferencia %s.\n"
+msgstr "      %s  Falta cadena de traducción \"%s\" para opción %s, preferencia %s.\n"
 
 #, c-format
 msgid "      %s  Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"!\n"
-msgstr ""
-"      %s  Falta la preferencia *%s %s en UIConstraint \"*%s %s *%s %s\".\n"
+msgstr "      %s  Falta la preferencia *%s %s en UIConstraint \"*%s %s *%s %s\".\n"
 
 #, c-format
 msgid "      %s  Missing choice *%s %s in cupsUIConstraints %s: \"%s\"!\n"
-msgstr ""
-"      %s  Falta la preferencia *%s %s en cupsUIConstraints %s: \"%s\".\n"
+msgstr "      %s  Falta la preferencia *%s %s en cupsUIConstraints %s: \"%s\".\n"
 
 #, c-format
 msgid "      %s  Missing cupsFilter file \"%s\"\n"
@@ -412,7 +389,7 @@
 
 #, c-format
 msgid "      %s  Missing cupsICCProfile file \"%s\"!\n"
-msgstr "      %s Falta el archivo cupsICCProfile \"%s\".\n"
+msgstr "      %s  Falta el archivo cupsICCProfile \"%s\".\n"
 
 #, c-format
 msgid "      %s  Missing cupsPreFilter file \"%s\"\n"
@@ -439,7 +416,7 @@
 "      %s  REQUIRED %s does not define choice None!\n"
 "                REF: Page 122, section 5.17\n"
 msgstr ""
-"      %s  SE NECESITA %s no define preferencia Ninguna.\n"
+"      %s  NECESARIA %s no define la opción None.\n"
 "                REF: Página 122, sección 5.17\n"
 
 #, c-format
@@ -452,9 +429,7 @@
 
 #, c-format
 msgid "      **FAIL**  %s choice names %s and %s differ only by case!\n"
-msgstr ""
-"      **FALLO**  %s nombres de opción %s y %s se diferencian sólo en la "
-"capitalización.\n"
+msgstr "      **FALLO**  %s nombres de opción %s y %s se diferencian sólo en la capitalización.\n"
 
 #, c-format
 msgid ""
@@ -469,7 +444,7 @@
 "      **FAIL**  BAD Default%s %s\n"
 "                REF: Page 40, section 4.5.\n"
 msgstr ""
-"      **FALLO**  Default%s %s incorrecto\n"
+"      **FALLO**  Default%s %s INCORRECTO\n"
 "                REF: Página 40, sección 4.5.\n"
 
 #, c-format
@@ -477,7 +452,7 @@
 "      **FAIL**  BAD DefaultImageableArea %s!\n"
 "                REF: Page 102, section 5.15.\n"
 msgstr ""
-"      **FALLO**  DefaultImageableArea %s incorrecto\n"
+"      **FALLO**  DefaultImageableArea %s INCORRECTO\n"
 "                REF: Página 102, sección 5.15.\n"
 
 #, c-format
@@ -485,14 +460,14 @@
 "      **FAIL**  BAD DefaultPaperDimension %s!\n"
 "                REF: Page 103, section 5.15.\n"
 msgstr ""
-"      **FALLO**  DefaultPaperDimension %s incorrecto.\n"
+"      **FALLO**  DefaultPaperDimension %s INCORRECTO.\n"
 "                REF: Página 103, sección 5.15.\n"
 
 msgid ""
 "      **FAIL**  BAD JobPatchFile attribute in file\n"
 "                REF: Page 24, section 3.4.\n"
 msgstr ""
-"      **FALLO**  Atributo JobPatchFile en archivo, incorrecto\n"
+"      **FALLO**  Atributo JobPatchFile en archivo, INCORRECTO\n"
 "                REF: Página 24, sección 3.4.\n"
 
 msgid ""
@@ -514,28 +489,28 @@
 "      **FAIL**  BAD ModelName - \"%c\" not allowed in string.\n"
 "                REF: Pages 59-60, section 5.3.\n"
 msgstr ""
-"      **FALLO**  ModelName - \"%c\" incorrecto no permitido en la cadena.\n"
+"      **FALLO**  ModelName - \"%c\" INCORRECTO no permitido en la cadena.\n"
 "                REF: Páginas 59-60, sección 5.3.\n"
 
 msgid ""
 "      **FAIL**  BAD PSVersion - not \"(string) int\".\n"
 "                REF: Pages 62-64, section 5.3.\n"
 msgstr ""
-"      **FALLO**  PSVersion incorrecto- no es \"(string) int\".\n"
+"      **FALLO**  PSVersion INCORRECTO - no es \"(string) int\".\n"
 "                REF: Páginas 62-64, sección 5.3.\n"
 
 msgid ""
 "      **FAIL**  BAD Product - not \"(string)\".\n"
 "                REF: Page 62, section 5.3.\n"
 msgstr ""
-"      **FALLO**  Product incorrecto - no es \"(string)\".\n"
+"      **FALLO**  Product INCORRECTO - no es \"(string)\".\n"
 "                REF: Página 62, sección 5.3.\n"
 
 msgid ""
 "      **FAIL**  BAD ShortNickName - longer than 31 chars.\n"
 "                REF: Pages 64-65, section 5.3.\n"
 msgstr ""
-"      **FALLO**  ShortNickName incorrecto - mayor de 31 caracteres.\n"
+"      **FALLO**  ShortNickName INCORRECTO - mayor de 31 caracteres.\n"
 "                REF: Páginas 64-65, sección 5.3.\n"
 
 #, c-format
@@ -551,17 +526,20 @@
 "      **FAIL**  Bad FileVersion \"%s\"\n"
 "                REF: Page 56, section 5.3.\n"
 msgstr ""
+"      **FALLO**  FileVersion \"%s\" incorrecto\n"
+"                REF: Página 56, sección 5.3.\n"
 
 #, c-format
 msgid ""
 "      **FAIL**  Bad FormatVersion \"%s\"\n"
 "                REF: Page 56, section 5.3.\n"
 msgstr ""
+"      **FALLO**  FormatVersion \"%s\" incorrecto\n"
+"                REF: Página 56, sección 5.3.\n"
 
 #, c-format
 msgid "      **FAIL**  Bad LanguageEncoding %s - must be ISOLatin1!\n"
-msgstr ""
-"      **FALLO**  LanguageEncoding %s incorrecto: debería ser ISOLatin1.\n"
+msgstr "      **FALLO**  LanguageEncoding %s incorrecto: debería ser ISOLatin1.\n"
 
 #, c-format
 msgid "      **FAIL**  Bad LanguageVersion %s - must be English!\n"
@@ -569,31 +547,19 @@
 
 #, c-format
 msgid "      **FAIL**  Default option code cannot be interpreted: %s\n"
-msgstr ""
-"      **FALLO**  El código de opción predeterminado no puede ser "
-"interpretado: %s\n"
+msgstr "      **FALLO**  El código de opción predeterminado no puede ser interpretado: %s\n"
 
 #, c-format
-msgid ""
-"      **FAIL**  Default translation string for option %s choice %s contains "
-"8-bit characters!\n"
-msgstr ""
-"      **FALLO**  Cadena de traducción predeterminada para opción %s "
-"preferencia %s contiene caracteres de 8-bits.\n"
+msgid "      **FAIL**  Default translation string for option %s choice %s contains 8-bit characters!\n"
+msgstr "      **FALLO**  Cadena de traducción predeterminada para opción %s preferencia %s contiene caracteres de 8-bits.\n"
 
 #, c-format
-msgid ""
-"      **FAIL**  Default translation string for option %s contains 8-bit "
-"characters!\n"
-msgstr ""
-"      **FALLO**  Cadena de traducción predeterminada para opción %s contiene "
-"caracteres de 8-bits.\n"
+msgid "      **FAIL**  Default translation string for option %s contains 8-bit characters!\n"
+msgstr "      **FALLO**  Cadena de traducción predeterminada para opción %s contiene caracteres de 8-bits.\n"
 
 #, c-format
 msgid "      **FAIL**  Group names %s and %s differ only by case!\n"
-msgstr ""
-"      **FALLO**  Nombres de grupo %s y %s se diferencian sólo en la "
-"capitalización.\n"
+msgstr "      **FALLO**  Nombres de grupo %s y %s se diferencian sólo en la capitalización.\n"
 
 #, c-format
 msgid "      **FAIL**  Multiple occurrences of %s choice name %s!\n"
@@ -601,9 +567,7 @@
 
 #, c-format
 msgid "      **FAIL**  Option names %s and %s differ only by case!\n"
-msgstr ""
-"      **FALLO**  Nombres de opción %s y %s se diferencian sólo en la "
-"capitalización.\n"
+msgstr "      **FALLO**  Nombres de opción %s y %s se diferencian sólo en la capitalización.\n"
 
 #, c-format
 msgid ""
@@ -970,11 +934,8 @@
 msgstr "%s: No sé que hay que hacer.\n"
 
 #, c-format
-msgid ""
-"%s: Error - %s environment variable names non-existent destination \"%s\"!\n"
-msgstr ""
-"%s: Error - %s nombres de variables de entorno no existen en destino \"%s"
-"\".\n"
+msgid "%s: Error - %s environment variable names non-existent destination \"%s\"!\n"
+msgstr "%s: Error - %s nombres de variables de entorno no existen en destino \"%s\".\n"
 
 #, c-format
 msgid "%s: Error - bad job ID!\n"
@@ -982,16 +943,11 @@
 
 #, c-format
 msgid "%s: Error - cannot print files and alter jobs simultaneously!\n"
-msgstr ""
-"%s: Error - no se pueden imprimir archivos y alterar trabajos al mismo "
-"tiempo.\n"
+msgstr "%s: Error - no se pueden imprimir archivos y alterar trabajos al mismo tiempo.\n"
 
 #, c-format
-msgid ""
-"%s: Error - cannot print from stdin if files or a job ID are provided!\n"
-msgstr ""
-"%s: Error - no se puede imprimir desde stdin si se proporcionan archivos o "
-"una ID de trabajo.\n"
+msgid "%s: Error - cannot print from stdin if files or a job ID are provided!\n"
+msgstr "%s: Error - no se puede imprimir desde stdin si se proporcionan archivos o una ID de trabajo.\n"
 
 #, c-format
 msgid "%s: Error - expected character set after '-S' option!\n"
@@ -1078,12 +1034,8 @@
 msgstr "%s: Error - se esperaba un valor tras la opción '%c'.\n"
 
 #, c-format
-msgid ""
-"%s: Error - need \"completed\", \"not-completed\", or \"all\" after '-W' "
-"option!\n"
-msgstr ""
-"%s: Error - se necesita \"completed\", \"not completed\", o \"all\" tras la "
-"opción '-W'.\n"
+msgid "%s: Error - need \"completed\", \"not-completed\", or \"all\" after '-W' option!\n"
+msgstr "%s: Error - se necesita \"completed\", \"not completed\", o \"all\" tras la opción '-W'.\n"
 
 #, c-format
 msgid "%s: Error - no default destination available.\n"
@@ -1143,8 +1095,7 @@
 
 #, c-format
 msgid "%s: Need job ID ('-i jobid') before '-H restart'!\n"
-msgstr ""
-"%s: Se necesita un ID de trabajo ('-i id_trabajo') antes de '-H restart'.\n"
+msgstr "%s: Se necesita un ID de trabajo ('-i id_trabajo') antes de '-H restart'.\n"
 
 #, c-format
 msgid "%s: No filter to convert from %s/%s to %s/%s!\n"
@@ -1207,12 +1158,8 @@
 msgstr "%s: Tipo MIME de origen %s/%s desconocido.\n"
 
 #, c-format
-msgid ""
-"%s: Warning - '%c' format modifier not supported - output may not be "
-"correct!\n"
-msgstr ""
-"%s: Advertencia - no se admite el uso del modificador de formato '%c' - la "
-"salida puede no ser correcta.\n"
+msgid "%s: Warning - '%c' format modifier not supported - output may not be correct!\n"
+msgstr "%s: Advertencia - no se admite el uso del modificador de formato '%c' - la salida puede no ser correcta.\n"
 
 #, c-format
 msgid "%s: Warning - character set option ignored!\n"
@@ -1231,11 +1178,8 @@
 msgstr "%s: Advertencia - opción de modo no tenida en cuenta.\n"
 
 #, c-format
-msgid ""
-"%s: error - %s environment variable names non-existent destination \"%s\"!\n"
-msgstr ""
-"%s: error - %s nombres de variables de entorno no existen en destino \"%s"
-"\".\n"
+msgid "%s: error - %s environment variable names non-existent destination \"%s\"!\n"
+msgstr "%s: error - %s nombres de variables de entorno no existen en destino \"%s\".\n"
 
 #, c-format
 msgid "%s: error - expected option=value after '-o' option!\n"
@@ -1840,14 +1784,10 @@
 msgstr "?Comando de ayuda inválido desconocido\n"
 
 msgid "A Samba password is required to export printer drivers!"
-msgstr ""
-"Se requiere una contraseña Samba para exportar los controladores de "
-"impresora."
+msgstr "Se requiere una contraseña Samba para exportar los controladores de impresora."
 
 msgid "A Samba username is required to export printer drivers!"
-msgstr ""
-"Se requiere un nombre de usuario Samba para exportar los controladores de "
-"impresora."
+msgstr "Se requiere un nombre de usuario Samba para exportar los controladores de impresora."
 
 #, c-format
 msgid "A class named \"%s\" already exists!"
@@ -1960,16 +1900,14 @@
 msgstr "Siempre"
 
 msgid "AppSocket/HP JetDirect"
-msgstr ""
+msgstr "AppSocket/HP JetDirect"
 
 msgid "Applicator"
 msgstr "Aplicador"
 
 #, c-format
 msgid "Attempt to set %s printer-state to bad value %d!"
-msgstr ""
-"Se ha intentado cambiar el valor printer-state de %s a un valor incorrecto %"
-"d."
+msgstr "Se ha intentado cambiar el valor printer-state de %s a un valor incorrecto %d."
 
 #, c-format
 msgid "Attribute groups are out of order (%x < %x)!"
@@ -2115,7 +2053,7 @@
 msgstr "Rótulos"
 
 msgid "Billing Information: "
-msgstr "Información de facturación:"
+msgstr "Información de facturación: "
 
 msgid "Bond Paper"
 msgstr "Papel de cartas"
@@ -2219,7 +2157,7 @@
 msgstr "Creado"
 
 msgid "Created On: "
-msgstr "Creado en:"
+msgstr "Creado en: "
 
 msgid "Custom"
 msgstr "A medida"
@@ -2255,7 +2193,7 @@
 msgstr "Borrar impresora"
 
 msgid "Description: "
-msgstr "Descripción:"
+msgstr "Descripción: "
 
 msgid "DeskJet Series"
 msgstr "DeskJet Series"
@@ -2303,10 +2241,10 @@
 msgstr "Postal doble"
 
 msgid "Driver Name: "
-msgstr "Nombre de controlador:"
+msgstr "Nombre del controlador: "
 
 msgid "Driver Version: "
-msgstr "Versión de controlador:"
+msgstr "Versión del controlador: "
 
 msgid "Duplexer"
 msgstr "Unidad de impresión dúplex"
@@ -2316,13 +2254,11 @@
 
 #, c-format
 msgid "EMERG: Unable to allocate memory for page info: %s\n"
-msgstr ""
-"EMERG: No se ha podido asignar memoria para la información de página: %s\n"
+msgstr "EMERG: No se ha podido asignar memoria para la información de página: %s\n"
 
 #, c-format
 msgid "EMERG: Unable to allocate memory for pages array: %s\n"
-msgstr ""
-"EMERG: No se ha podido asignar memoria para la secuencia de páginas: %s\n"
+msgstr "EMERG: No se ha podido asignar memoria para la secuencia de páginas: %s\n"
 
 msgid "EPL1 Label Printer"
 msgstr "Impresora de etiquetas EPL1"
@@ -2411,9 +2347,7 @@
 msgstr "ERROR: Error fatal de USB.\n"
 
 msgid "ERROR: Invalid HP-GL/2 command seen, unable to print file!\n"
-msgstr ""
-"ERROR: Se ha detectado un comando HP-GL/2 no válido; no se puede imprimir el "
-"archivo.\n"
+msgstr "ERROR: Se ha detectado un comando HP-GL/2 no válido; no se puede imprimir el archivo.\n"
 
 #, c-format
 msgid "ERROR: Missing %%EndProlog!\n"
@@ -2423,23 +2357,16 @@
 msgid "ERROR: Missing %%EndSetup!\n"
 msgstr "ERROR: Falta %%EndSetup.\n"
 
-msgid ""
-"ERROR: Missing device URI on command-line and no DEVICE_URI environment "
-"variable!\n"
-msgstr ""
-"ERROR: Falta URI del dispositivo en la línea de comandos y no hay variable "
-"de entorno DEVICE_URI.\n"
+msgid "ERROR: Missing device URI on command-line and no DEVICE_URI environment variable!\n"
+msgstr "ERROR: Falta URI del dispositivo en la línea de comandos y no hay variable de entorno DEVICE_URI.\n"
 
 #, c-format
 msgid "ERROR: Missing value on line %d of banner file!\n"
 msgstr "ERROR: Falta el valor en la línea %d del archivo de rótulo.\n"
 
 #, c-format
-msgid ""
-"ERROR: Need a msgid line before any translation strings on line %d of %s!\n"
-msgstr ""
-"ERROR: Se necesita una línea msgid antes de cualquier cadena de traducción "
-"en línea %d de %s.\n"
+msgid "ERROR: Need a msgid line before any translation strings on line %d of %s!\n"
+msgstr "ERROR: Se necesita una línea msgid antes de cualquier cadena de traducción en línea %d de %s.\n"
 
 #, c-format
 msgid "ERROR: No %%BoundingBox: comment in header!\n"
@@ -2449,12 +2376,8 @@
 msgid "ERROR: No %%Pages: comment in header!\n"
 msgstr "ERROR: No hay comentario %%Pages: en la cabecera.\n"
 
-msgid ""
-"ERROR: No device URI found in argv[0] or in DEVICE_URI environment "
-"variable!\n"
-msgstr ""
-"ERROR: No se ha encontrado el URI del dispositivo en argv[0] o en la "
-"variable de entorno DEVICE_URI.\n"
+msgid "ERROR: No device URI found in argv[0] or in DEVICE_URI environment variable!\n"
+msgstr "ERROR: No se ha encontrado el URI del dispositivo en argv[0] o en la variable de entorno DEVICE_URI.\n"
 
 #, c-format
 msgid "ERROR: No fonts in charset file %s\n"
@@ -2491,9 +2414,7 @@
 msgstr "ERROR: El ordenador remoto no ha aceptado el archivo de datos (%d)\n"
 
 msgid "ERROR: There was a timeout error while sending data to the printer\n"
-msgstr ""
-"ERROR: Hay un error de tiempo de espera mientras se enviaban datos a la "
-"impresora\n"
+msgstr "ERROR: Hay un error de tiempo de espera mientras se enviaban datos a la impresora\n"
 
 #, c-format
 msgid "ERROR: Unable to add file %d to job: %s\n"
@@ -2511,9 +2432,7 @@
 
 #, c-format
 msgid "ERROR: Unable to create temporary compressed print file: %s\n"
-msgstr ""
-"ERROR: No se ha podido crear el archivo de impresión temporal comprimido: %"
-"s\n"
+msgstr "ERROR: No se ha podido crear el archivo de impresión temporal comprimido: %s\n"
 
 msgid "ERROR: Unable to create temporary file"
 msgstr "ERROR: No se ha podido crear el archivo temporal"
@@ -2548,9 +2467,7 @@
 
 #, c-format
 msgid "ERROR: Unable to get PPD file for printer \"%s\" - %s.\n"
-msgstr ""
-"ERROR: No se ha podido obtener el archivo PPD para la impresora \"%s\" - %"
-"s.\n"
+msgstr "ERROR: No se ha podido obtener el archivo PPD para la impresora \"%s\" - %s.\n"
 
 msgid "ERROR: Unable to get default AppleTalk zone"
 msgstr "ERROR: No se ha podido conseguir la zona AppleTalk predeterminada"
@@ -2617,9 +2534,7 @@
 
 #, c-format
 msgid "ERROR: Unable to open temporary compressed print file: %s\n"
-msgstr ""
-"ERROR: No se ha podido abrir el archivo de impresión temporal comprimido: %"
-"s\n"
+msgstr "ERROR: No se ha podido abrir el archivo de impresión temporal comprimido: %s\n"
 
 msgid "ERROR: Unable to open temporary file"
 msgstr "ERROR: No se ha podido abrir el archivo temporal"
@@ -2656,8 +2571,7 @@
 msgstr "ERROR: No se ha podido enviar una petición PAP"
 
 msgid "ERROR: Unable to send initial PAP send data request"
-msgstr ""
-"ERROR: No se ha podido enviar la petición inicial de datos de envío PAP"
+msgstr "ERROR: No se ha podido enviar la petición inicial de datos de envío PAP"
 
 #, c-format
 msgid "ERROR: Unable to send print data (%d)\n"
@@ -2695,16 +2609,14 @@
 msgstr "ERROR: No se han podido escribir los datos de impresión: %s\n"
 
 msgid "ERROR: Unable to write raster data to driver!\n"
-msgstr ""
-"ERROR: No se ha podido escribir la trama de datos (raster) al controlador.\n"
+msgstr "ERROR: No se ha podido escribir la trama de datos (raster) al controlador.\n"
 
 msgid "ERROR: Unable to write to temporary file"
 msgstr "ERROR: No se ha podido escribir al archivo temporal"
 
 #, c-format
 msgid "ERROR: Unable to write uncompressed document data: %s\n"
-msgstr ""
-"ERROR: No se han podido escribir los datos de documento sin comprimir: %s\n"
+msgstr "ERROR: No se han podido escribir los datos de documento sin comprimir: %s\n"
 
 #, c-format
 msgid "ERROR: Unexpected text on line %d of %s!\n"
@@ -2748,28 +2660,19 @@
 
 #, c-format
 msgid "ERROR: Unsupported number-up value %d, using number-up=1!\n"
-msgstr ""
-"ERROR: Valor de number-up (páginas por hoja) %d no permitido; usando number-"
-"up=1.\n"
+msgstr "ERROR: Valor de number-up (páginas por hoja) %d no permitido; usando number-up=1.\n"
 
 #, c-format
-msgid ""
-"ERROR: Unsupported number-up-layout value %s, using number-up-layout=lrtb!\n"
-msgstr ""
-"ERROR: Valor de number-up-layout (disposición de páginas por hoja) %s no "
-"permitido; usando number-up-layout=lrtb.\n"
+msgid "ERROR: Unsupported number-up-layout value %s, using number-up-layout=lrtb!\n"
+msgstr "ERROR: Valor de number-up-layout (disposición de páginas por hoja) %s no permitido; usando number-up-layout=lrtb.\n"
 
 #, c-format
 msgid "ERROR: Unsupported page-border value %s, using page-border=none!\n"
-msgstr ""
-"ERROR: Valor de page-border (borde de página) %s no permitido; usando page-"
-"border=none (ninguno).\n"
+msgstr "ERROR: Valor de page-border (borde de página) %s no permitido; usando page-border=none (ninguno).\n"
 
 #, c-format
 msgid "ERROR: doc_printf overflow (%d bytes) detected, aborting!\n"
-msgstr ""
-"ERROR: Se ha detectado un desbordamiento de doc_printf (%d bytes); "
-"cancelando.\n"
+msgstr "ERROR: Se ha detectado un desbordamiento de doc_printf (%d bytes); cancelando.\n"
 
 #, c-format
 msgid "ERROR: pdftops filter crashed on signal %d!\n"
@@ -2787,12 +2690,8 @@
 msgid "ERROR: pictwpstops exited with status %d!\n"
 msgstr "ERROR: pictwpstops se ha cerrado con el estado %d.\n"
 
-msgid ""
-"ERROR: recoverable: Unable to connect to printer; will retry in 30 "
-"seconds...\n"
-msgstr ""
-"ERROR: recuperable: No se ha podido establecer conexión con la impresora; "
-"reintento en 30 segundos...\n"
+msgid "ERROR: recoverable: Unable to connect to printer; will retry in 30 seconds...\n"
+msgstr "ERROR: recuperable: No se ha podido establecer conexión con la impresora; reintento en 30 segundos...\n"
 
 msgid "ERROR: select() failed"
 msgstr "ERROR: select() ha fallado"
@@ -2818,14 +2717,8 @@
 msgid "Enter password:"
 msgstr "Introduzca la contraseña:"
 
-msgid ""
-"Enter your username and password or the root username and password to access "
-"this page. If you are using Kerberos authentication, make sure you have a "
-"valid Kerberos ticket."
-msgstr ""
-"Introduzca su nombre de usuario y contraseña o el nombre de usuario y "
-"contraseña de root para poder acceder a esta página. Si está usando "
-"autentificación Kerberos, asegúrese de que tiene un ticket Kerberos válido."
+msgid "Enter your username and password or the root username and password to access this page. If you are using Kerberos authentication, make sure you have a valid Kerberos ticket."
+msgstr "Introduzca su nombre de usuario y contraseña o el nombre de usuario y contraseña de root para poder acceder a esta página. Si está usando autentificación Kerberos, asegúrese de que tiene un ticket Kerberos válido."
 
 msgid "Envelope Feed"
 msgstr "Alimentador de sobre"
@@ -2885,12 +2778,8 @@
 msgstr "Carpeta de archivosr - 9/16 x 3 7/16 pulg."
 
 #, c-format
-msgid ""
-"File device URIs have been disabled! To enable, see the FileDevice directive "
-"in \"%s/cupsd.conf\"."
-msgstr ""
-"Los URIs del dispositivo de archivo han sido deshabilitados. Para "
-"habilitarlos, vea la directiva FileDevice en \"%s/cupsd.conf\"."
+msgid "File device URIs have been disabled! To enable, see the FileDevice directive in \"%s/cupsd.conf\"."
+msgstr "Los URIs del dispositivo de archivo han sido deshabilitados. Para habilitarlos, vea la directiva FileDevice en \"%s/cupsd.conf\"."
 
 msgid "Folio"
 msgstr "Folio"
@@ -2947,10 +2836,10 @@
 msgstr "INFO: Cancelando trabajo de impresión...\n"
 
 msgid "INFO: Connected to printer...\n"
-msgstr ""
+msgstr "INFO: Conectado a la impresora...\n"
 
 msgid "INFO: Connecting to printer...\n"
-msgstr ""
+msgstr "INFO: Conectando a la impresora...\n"
 
 msgid "INFO: Control file sent successfully\n"
 msgstr "INFO: Archivo de control enviado correctamente\n"
@@ -2966,15 +2855,13 @@
 msgstr "INFO: Cargando archivo de imagen...\n"
 
 msgid "INFO: Looking for printer...\n"
-msgstr ""
+msgstr "INFO: Buscando impresora...\n"
 
 msgid "INFO: Opening connection\n"
 msgstr "INFO: Abriendo la conexión\n"
 
 msgid "INFO: Print file sent, waiting for printer to finish...\n"
-msgstr ""
-"INFO: Archivo de impresión enviado; esperando a que finalice la "
-"impresora...\n"
+msgstr "INFO: Archivo de impresión enviado; esperando a que finalice la impresora...\n"
 
 msgid "INFO: Printer busy; will retry in 10 seconds...\n"
 msgstr "INFO: Impresora ocupada; reintento en 10 segundos...\n"
@@ -3052,9 +2939,7 @@
 msgstr "INFO: Guardando trabajo LPR en cola, %.0f%% completado...\n"
 
 msgid "INFO: Unable to contact printer, queuing on next printer in class...\n"
-msgstr ""
-"INFO: No se ha podido contactar con la impresora; poniendo en cola en la "
-"siguiente impresora de la clase...\n"
+msgstr "INFO: No se ha podido contactar con la impresora; poniendo en cola en la siguiente impresora de la clase...\n"
 
 #, c-format
 msgid "INFO: Using default AppleTalk zone \"%s\"\n"
@@ -3169,7 +3054,7 @@
 msgstr "Correo por Internet Parte-3 - 2 1/4 x 7 pulg."
 
 msgid "Internet Printing Protocol"
-msgstr ""
+msgstr "Protocolo de Impresión de Internet IPP"
 
 msgid "Invite Envelope"
 msgstr "Sobre de invitación"
@@ -3240,7 +3125,7 @@
 msgstr "Trabajo detenido"
 
 msgid "Job UUID: "
-msgstr "UUID de trabajo:"
+msgstr "UUID del trabajo: "
 
 msgid "Job is completed and cannot be changed."
 msgstr "El trabajo está terminado y no puede ser cambiado."
@@ -3264,7 +3149,7 @@
 msgstr "Sobre Kaku3"
 
 msgid "LPD/LPR Host or Printer"
-msgstr ""
+msgstr "Equipo o impresora LPD/LPR"
 
 msgid "Label Printer"
 msgstr "Impresora de etiquetas"
@@ -3295,25 +3180,25 @@
 msgstr "Listar impresoras disponibles"
 
 msgid "Location: "
-msgstr "Ubicación:"
+msgstr "Ubicación: "
 
 msgid "Long-Edge (Portrait)"
 msgstr "Lado largo (retrato)"
 
 msgid "Make and Model: "
-msgstr "Marca y modelo:"
+msgstr "Marca y modelo: "
 
 msgid "Manual Feed"
 msgstr "Alimentación manual"
 
 msgid "Media Dimensions: "
-msgstr "Dimensiones del papel:"
+msgstr "Dimensiones del papel: "
 
 msgid "Media Limits: "
-msgstr "Límites del papel:"
+msgstr "Límites del papel: "
 
 msgid "Media Name: "
-msgstr "Nombre del soporte"
+msgstr "Nombre del soporte: "
 
 msgid "Media Size"
 msgstr "Tamaño de papel"
@@ -3497,7 +3382,7 @@
 msgstr "No se encontró printer-uri."
 
 msgid "No printer-uri in request!"
-msgstr ""
+msgstr "No hay printer-uri en la petición."
 
 msgid "No request-id"
 msgstr "No hay request-id"
@@ -3579,7 +3464,7 @@
 msgstr "Opciones instaladas"
 
 msgid "Options: "
-msgstr "Opciones:"
+msgstr "Opciones: "
 
 msgid "Out of toner!"
 msgstr "No hay toner."
@@ -3599,8 +3484,7 @@
 
 #, c-format
 msgid "Output for printer %s is sent to remote printer %s on %s\n"
-msgstr ""
-"La salida de la impresora %s se ha enviado a la impresora remota %s en %s\n"
+msgstr "La salida de la impresora %s se ha enviado a la impresora remota %s en %s\n"
 
 #, c-format
 msgid "Output for printer %s/%s is sent to %s\n"
@@ -3608,9 +3492,7 @@
 
 #, c-format
 msgid "Output for printer %s/%s is sent to remote printer %s on %s\n"
-msgstr ""
-"La salida de la impresora %s/%s se ha enviado a la impresora remota %s en %"
-"s\n"
+msgstr "La salida de la impresora %s/%s se ha enviado a la impresora remota %s en %s\n"
 
 msgid "Output tray missing!"
 msgstr "Falta la bandeja de salida."
@@ -3726,7 +3608,7 @@
 msgstr "Tasa de impresión"
 
 msgid "Print Self-Test Page"
-msgstr "Iimprimir página de auto-prueba"
+msgstr "Imprimir página de auto-prueba"
 
 msgid "Print Speed"
 msgstr "Velocidad de impresión"
@@ -3741,13 +3623,13 @@
 msgstr "Imprimir y romper"
 
 msgid "Printed For: "
-msgstr "Impreso para:"
+msgstr "Impreso para: "
 
 msgid "Printed From: "
-msgstr "Impreso desde:"
+msgstr "Impreso desde: "
 
 msgid "Printed On: "
-msgstr "Impreso en:"
+msgstr "Impreso en: "
 
 msgid "Printer Added"
 msgstr "Impresora añadida"
@@ -3762,7 +3644,7 @@
 msgstr "Impresora modificada"
 
 msgid "Printer Name: "
-msgstr "Nombre de la impresora:"
+msgstr "Nombre de la impresora: "
 
 msgid "Printer Paused"
 msgstr "Impresora en pausa"
@@ -3791,10 +3673,8 @@
 msgid "Rank    Owner   Job     File(s)                         Total Size\n"
 msgstr "Rango  Propiet. Trabajo Archivo(s)                      Tamaño total\n"
 
-msgid ""
-"Rank   Owner      Pri  Job        Files                       Total Size\n"
-msgstr ""
-"Rango  Propiet.   Pri  Trabajo    Archivos                    Tamaño total\n"
+msgid "Rank   Owner      Pri  Job        Files                       Total Size\n"
+msgstr "Rango  Propiet.   Pri  Trabajo    Archivos                    Tamaño total\n"
 
 msgid "Reject Jobs"
 msgstr "Rechazar trabajos"
@@ -3828,7 +3708,7 @@
 msgstr "Ejecutando comando: %s %s -N -A '%s -c '%s'\n"
 
 msgid "SCSI Printer"
-msgstr ""
+msgstr "Impresora SCSI"
 
 msgid "SEQUENCE uses indefinite length"
 msgstr "SEQUENCE usa una longitud indefinida"
@@ -3838,7 +3718,7 @@
 
 #, c-format
 msgid "Serial Port #%d"
-msgstr ""
+msgstr "Puerto serie #%d"
 
 msgid "Server Restarted"
 msgstr "Servidor reiniciado"
@@ -3932,29 +3812,18 @@
 msgid "The PPD file \"%s\" could not be opened: %s"
 msgstr "No se ha podido abrir el archivo PPD \"%s\": %s"
 
-msgid ""
-"The class name may only contain up to 127 printable characters and may not "
-"contain spaces, slashes (/), or the pound sign (#)."
-msgstr ""
-"El nombre de la clase sólo puede contener hasta 127 caracteres imprimibles y "
-"no puede contener espacios, barras (/), o la almohadilla (#)."
+msgid "The class name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)."
+msgstr "El nombre de la clase sólo puede contener hasta 127 caracteres imprimibles y no puede contener espacios, barras (/), o la almohadilla (#)."
 
-msgid ""
-"The notify-lease-duration attribute cannot be used with job subscriptions."
-msgstr ""
-"El atributo notify-lease-duration no puede ser usado con subscripciones de "
-"trabajos."
+msgid "The notify-lease-duration attribute cannot be used with job subscriptions."
+msgstr "El atributo notify-lease-duration no puede ser usado con subscripciones de trabajos."
 
 #, c-format
 msgid "The notify-user-data value is too large (%d > 63 octets)!"
 msgstr "El valor notify-user-data es demasiado grande (%d > 63 octetos)."
 
-msgid ""
-"The printer name may only contain up to 127 printable characters and may not "
-"contain spaces, slashes (/), or the pound sign (#)."
-msgstr ""
-"El nombre de la impresora sólo puede contener hasta 127 caracteres "
-"imprimibles y no puede contener espacios, barras (/), o la almohadilla (#)."
+msgid "The printer name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)."
+msgstr "El nombre de la impresora sólo puede contener hasta 127 caracteres imprimibles y no puede contener espacios, barras (/), o la almohadilla (#)."
 
 msgid "The printer or class is not shared!"
 msgstr "La impresora o clase no está compartida."
@@ -3969,33 +3838,23 @@
 msgid "The printer-uri attribute is required!"
 msgstr "Se necesita el atributo printer-uri."
 
-msgid ""
-"The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"."
-msgstr ""
-"El printer-uri debe ser de la forma \"ipp://NOMBRE_ORDENADOR/classes/"
-"NOMBRE_CLASE\"."
+msgid "The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"."
+msgstr "El printer-uri debe ser de la forma \"ipp://NOMBRE_ORDENADOR/classes/NOMBRE_CLASE\"."
 
-msgid ""
-"The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"."
-msgstr ""
-"El printer-uri debe ser de la forma \"ipp://NOMBRE_ORDENADOR/printers/"
-"NOMBRE_IMPRESORA\"."
+msgid "The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"."
+msgstr "El printer-uri debe ser de la forma \"ipp://NOMBRE_ORDENADOR/printers/NOMBRE_IMPRESORA\"."
 
-msgid ""
-"The subscription name may not contain spaces, slashes (/), question marks "
-"(?), or the pound sign (#)."
-msgstr ""
-"El nombre de la subscripción no puede contener espacios, barras (/), signos "
-"de interrogación (?), o la almohadilla (#)."
+msgid "The subscription name may not contain spaces, slashes (/), question marks (?), or the pound sign (#)."
+msgstr "El nombre de la subscripción no puede contener espacios, barras (/), signos de interrogación (?), o la almohadilla (#)."
 
 msgid "There are too many subscriptions."
-msgstr ""
+msgstr "Hay demasiadas subscripciones."
 
 msgid "Thermal Transfer Media"
 msgstr "Soporte de transferencia térmica"
 
 msgid "Title: "
-msgstr "Título:"
+msgstr "Título: "
 
 msgid "Toner low."
 msgstr "Toner bajo."
@@ -4058,7 +3917,7 @@
 
 #, c-format
 msgid "USB Serial Port #%d"
-msgstr ""
+msgstr "Puerto serie USB #%d"
 
 msgid "Unable to access cupsd.conf file:"
 msgstr "No se ha podido acceder al archivo cupsd.conf"
@@ -4096,21 +3955,15 @@
 
 #, c-format
 msgid "Unable to copy 64-bit CUPS printer driver files (%d)!"
-msgstr ""
-"No se han podido copiar los archivos del controlador de impresora de 64-bit "
-"de CUPS (%d)."
+msgstr "No se han podido copiar los archivos del controlador de impresora de 64-bit de CUPS (%d)."
 
 #, c-format
 msgid "Unable to copy 64-bit Windows printer driver files (%d)!"
-msgstr ""
-"No se han podido copiar los archivos del controlador de impresora de 64-bit "
-"de Windows (%d)."
+msgstr "No se han podido copiar los archivos del controlador de impresora de 64-bit de Windows (%d)."
 
 #, c-format
 msgid "Unable to copy CUPS printer driver files (%d)!"
-msgstr ""
-"No se han podido copiar los archivos del controlador de impresora de CUPS (%"
-"d)."
+msgstr "No se han podido copiar los archivos del controlador de impresora de CUPS (%d)."
 
 #, c-format
 msgid "Unable to copy PPD file - %s!"
@@ -4121,15 +3974,11 @@
 
 #, c-format
 msgid "Unable to copy Windows 2000 printer driver files (%d)!"
-msgstr ""
-"No se han podido copiar los archivos del controlador de impresora de Windows "
-"2000 (%d)."
+msgstr "No se han podido copiar los archivos del controlador de impresora de Windows 2000 (%d)."
 
 #, c-format
 msgid "Unable to copy Windows 9x printer driver files (%d)!"
-msgstr ""
-"No se han podido copiar los archivos del controlador de impresora de Windows "
-"9x (%d)."
+msgstr "No se han podido copiar los archivos del controlador de impresora de Windows 9x (%d)."
 
 #, c-format
 msgid "Unable to copy interface script - %s!"
@@ -4179,15 +4028,11 @@
 
 #, c-format
 msgid "Unable to install Windows 2000 printer driver files (%d)!"
-msgstr ""
-"No se han podido instalar los archivos del controlador de impresora de "
-"Windows 2000 (%d)."
+msgstr "No se han podido instalar los archivos del controlador de impresora de Windows 2000 (%d)."
 
 #, c-format
 msgid "Unable to install Windows 9x printer driver files (%d)!"
-msgstr ""
-"No se han podido instalar los archivos del controlador de impresora de "
-"Windows 9x (%d)."
+msgstr "No se han podido instalar los archivos del controlador de impresora de Windows 9x (%d)."
 
 msgid "Unable to modify class:"
 msgstr "No se ha podido modificar la clase:"
@@ -4226,8 +4071,7 @@
 
 #, c-format
 msgid "Unable to set Windows printer driver (%d)!"
-msgstr ""
-"No se ha podido configurar el controlador de impresora de Windows (%d)."
+msgstr "No se ha podido configurar el controlador de impresora de Windows (%d)."
 
 msgid "Unable to set options:"
 msgstr "No se han podido cambiar las opciones:"
@@ -4346,14 +4190,10 @@
 "\n"
 "Opciones:\n"
 "\n"
-"  -f nombrearchivo          Establece el archivo a convertir (de otro modo, "
-"stdin)\n"
-"  -o nombrearchivo          Establece el archivo a generar (de otro modo, "
-"stdout)\n"
-"  -i tipo/mime         Establece el tipo MIME de entrada (de otro modo, auto-"
-"tipado)\n"
-"  -j tipo/mime         Establece el tipo MIME de salida (de otro modo, "
-"application/pdf)\n"
+"  -f nombrearchivo          Establece el archivo a convertir (de otro modo, stdin)\n"
+"  -o nombrearchivo          Establece el archivo a generar (de otro modo, stdout)\n"
+"  -i tipo/mime         Establece el tipo MIME de entrada (de otro modo, auto-tipado)\n"
+"  -j tipo/mime         Establece el tipo MIME de salida (de otro modo, application/pdf)\n"
 "  -P nombrearchivo.ppd      Establece el archivo PPD\n"
 "  -a 'nombre=valor ...'  Establece opcion(es)\n"
 "  -U nombreusuario          Establece el nombre de usuario del trabajo\n"
@@ -4378,8 +4218,7 @@
 "       cupsaddsmb [opciones] -a\n"
 "\n"
 "Opciones:\n"
-"  -E               Hace que se use encriptación en la conexión con el "
-"servidor\n"
+"  -E               Hace que se use encriptación en la conexión con el servidor\n"
 "  -H servidor_samba  Usa el servidor SAMBA especificado\n"
 "  -U usuario_samba    Autentifica usando el usuario SAMBA especificado\n"
 "  -a               Exporta todas las impresoras\n"
@@ -4414,10 +4253,8 @@
 "    --[no-]remote-admin     Activar o desactivar la administración remota\n"
 "    --[no-]remote-any       Permitir o impedir el acceso desde Internet\n"
 "    --[no-]remote-printers  Mostrar u ocultar las impresoras remotas\n"
-"    --[no-]share-printers   Activar o desactivar la compartición de "
-"impresoras\n"
-"    --[no-]user-cancel-any  Permitir o impedir a los usuarios cancelar "
-"cualquier trabajo\n"
+"    --[no-]share-printers   Activar o desactivar la compartición de impresoras\n"
+"    --[no-]user-cancel-any  Permitir o impedir a los usuarios cancelar cualquier trabajo\n"
 
 msgid ""
 "Usage: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n"
@@ -4453,8 +4290,7 @@
 "Opciones:\n"
 "\n"
 "  -c cupsd.conf    Establecer el archivo cupsd.conf a usar\n"
-"  -j id-trabajo[,N]    Filtrar el archivo N del trabajo especificado (valor "
-"predeterminado 1)\n"
+"  -j id-trabajo[,N]    Filtrar el archivo N del trabajo especificado (valor predeterminado 1)\n"
 "  -n copias        Establecer el número de copias\n"
 "  -o nombre=valor    Establecer las opciones\n"
 "  -p nombre_archivo.ppd  Especificar el archivo PPD\n"
@@ -4468,8 +4304,7 @@
 "\n"
 "    -h       Show program usage\n"
 "\n"
-"    Note: this program only validates the DSC comments, not the PostScript "
-"itself.\n"
+"    Note: this program only validates the DSC comments, not the PostScript itself.\n"
 msgstr ""
 "Uso: cupstestdsc [opciones] nombre_archivo.ps [... nombre_archivo.ps]\n"
 "       cupstestdsc [opciones] -\n"
@@ -4478,8 +4313,7 @@
 "\n"
 "    -h       Muestra cómo se usa el programa\n"
 "\n"
-"    Nota: este programa sólo valida los comentarios DSC, no el PostScript en "
-"sí mismo.\n"
+"    Nota: este programa sólo valida los comentarios DSC, no el PostScript en sí mismo.\n"
 
 msgid ""
 "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n"
@@ -4495,8 +4329,7 @@
 "    -v                   Be slightly verbose\n"
 "    -vv                  Be very verbose\n"
 msgstr ""
-"Uso: cupstestppd [opciones] nombre_archivo1.ppd[.gz] [... nombre_archivoN.ppd"
-"[.gz]]\n"
+"Uso: cupstestppd [opciones] nombre_archivo1.ppd[.gz] [... nombre_archivoN.ppd[.gz]]\n"
 "       programa | cupstestppd [opciones] -\n"
 "\n"
 "Opciones:\n"
@@ -4535,11 +4368,8 @@
 "       lppasswd [-g nombre_grupo] -a [nombre_usuario]\n"
 "       lppasswd [-g nombre_grupo] -x [nombre_usuario]\n"
 
-msgid ""
-"Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n"
-msgstr ""
-"Uso: lpq (-P dest) (-U nombre_usuario) (-h nombre_ordenador(:puerto)) (-l) "
-"(+intervalo)\n"
+msgid "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n"
+msgstr "Uso: lpq (-P dest) (-U nombre_usuario) (-h nombre_ordenador(:puerto)) (-l) (+intervalo)\n"
 
 msgid ""
 "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]\n"
@@ -4610,8 +4440,7 @@
 "  -I include-dir    Add include directory to search path.\n"
 "  -v                Be verbose (more v's for more verbosity).\n"
 msgstr ""
-"Uso: ppdpo [opciones] -o nombre_archivo.po nombre_archivo.drv [ ... "
-"nombre_archivoN.drv ]\n"
+"Uso: ppdpo [opciones] -o nombre_archivo.po nombre_archivo.drv [ ... nombre_archivoN.drv ]\n"
 "Opciones:\n"
 "  -D nombre=valor        Establece la variable nombre al valor.\n"
 "  -I include-dir    Añade el directorio include a la ruta de búsqueda.\n"
@@ -4635,8 +4464,7 @@
 
 #, c-format
 msgid "WARNING: Boolean expected for waiteof option \"%s\"\n"
-msgstr ""
-"WARNING: Se esperaba un valor booleano para la opción waiteof \"%s\".\n"
+msgstr "WARNING: Se esperaba un valor booleano para la opción waiteof \"%s\".\n"
 
 msgid "WARNING: Failed to read side-channel request!\n"
 msgstr "WARNING: No se ha podido leer la petición del canal lateral.\n"
@@ -4652,41 +4480,23 @@
 msgstr "WARNING: La impresora envió un EOF inesperado\n"
 
 #, c-format
-msgid ""
-"WARNING: Remote host did not respond with command status byte after %d "
-"seconds!\n"
-msgstr ""
-"WARNING: El ordenador remoto no ha respondido con el byte de estado del "
-"comando después de %d segundos.\n"
+msgid "WARNING: Remote host did not respond with command status byte after %d seconds!\n"
+msgstr "WARNING: El ordenador remoto no ha respondido con el byte de estado del comando después de %d segundos.\n"
 
 #, c-format
-msgid ""
-"WARNING: Remote host did not respond with control status byte after %d "
-"seconds!\n"
-msgstr ""
-"WARNING: El ordenador remoto no ha respondido con el byte de estado de "
-"control después de %d segundos.\n"
+msgid "WARNING: Remote host did not respond with control status byte after %d seconds!\n"
+msgstr "WARNING: El ordenador remoto no ha respondido con el byte de estado de control después de %d segundos.\n"
 
 #, c-format
-msgid ""
-"WARNING: Remote host did not respond with data status byte after %d "
-"seconds!\n"
-msgstr ""
-"WARNING: El ordenador remoto no ha respondido con el byte de estado de los "
-"datos después de %d segundos.\n"
+msgid "WARNING: Remote host did not respond with data status byte after %d seconds!\n"
+msgstr "WARNING: El ordenador remoto no ha respondido con el byte de estado de los datos después de %d segundos.\n"
 
 #, c-format
 msgid "WARNING: SCSI command timed out (%d); retrying...\n"
-msgstr ""
-"WARNING: Agotado el tiempo de espera para el comando SCSI (%d); "
-"reintentando...\n"
+msgstr "WARNING: Agotado el tiempo de espera para el comando SCSI (%d); reintentando...\n"
 
-msgid ""
-"WARNING: This document does not conform to the Adobe Document Structuring "
-"Conventions and may not print correctly!\n"
-msgstr ""
-"WARNING: Este documento no se ajusta a las Convenciones de Estructuración de "
-"Documentos de Adobe y puede que no se imprima correctamente.\n"
+msgid "WARNING: This document does not conform to the Adobe Document Structuring Conventions and may not print correctly!\n"
+msgstr "WARNING: Este documento no se ajusta a las Convenciones de Estructuración de Documentos de Adobe y puede que no se imprima correctamente.\n"
 
 #, c-format
 msgid "WARNING: Unable to open \"%s:%s\": %s\n"
@@ -4720,28 +4530,18 @@
 msgstr "WARNING: se esperaba un número para la opción de estado \"%s\"\n"
 
 #, c-format
-msgid ""
-"WARNING: recoverable: Network host '%s' is busy; will retry in %d "
-"seconds...\n"
-msgstr ""
-"WARNING: recuperable: El ordenador de red '%s' está ocupado; reintento en %d "
-"segundos...\n"
+msgid "WARNING: recoverable: Network host '%s' is busy; will retry in %d seconds...\n"
+msgstr "WARNING: recuperable: El ordenador de red '%s' está ocupado; reintento en %d segundos...\n"
 
 msgid "Warning, no Windows 2000 printer drivers are installed!"
-msgstr ""
-"Advertencia, no está instalado ningún controlador de impresora de Windows "
-"2000."
+msgstr "Advertencia, no está instalado ningún controlador de impresora de Windows 2000."
 
 msgid "Yes"
 msgstr "Si"
 
 #, c-format
-msgid ""
-"You must access this page using the URL <A HREF=\"https://%s:%d%s\">https://%"
-"s:%d%s</A>."
-msgstr ""
-"Debe acceder a esta página usando el URL <A HREF=\"https://%s:%d%s\">https://"
-"%s:%d%s</A>."
+msgid "You must access this page using the URL <A HREF=\"https://%s:%d%s\">https://%s:%d%s</A>."
+msgstr "Debe acceder a esta página usando el URL <A HREF=\"https://%s:%d%s\">https://%s:%d%s</A>."
 
 msgid "You4 Envelope"
 msgstr "Sobre You4"
@@ -4787,9 +4587,7 @@
 msgstr "cupsctl: Opción \"-%c\" desconocida.\n"
 
 msgid "cupsd: Expected config filename after \"-c\" option!\n"
-msgstr ""
-"cupsd: Se esperaba un nombre de archivo de configuración tras la opción \"-c"
-"\".\n"
+msgstr "cupsd: Se esperaba un nombre de archivo de configuración tras la opción \"-c\".\n"
 
 msgid "cupsd: Unable to get current directory!\n"
 msgstr "cupsd: No se ha podido obtener el directorio actual.\n"
@@ -4803,9 +4601,7 @@
 msgstr "cupsd: Opción \"%c\" desconocida - cancelando.\n"
 
 msgid "cupsd: launchd(8) support not compiled in, running in normal mode.\n"
-msgstr ""
-"cupsd: el uso de launchd(8) no ha sido compilado, ejecutándose en modo "
-"normal.\n"
+msgstr "cupsd: el uso de launchd(8) no ha sido compilado, ejecutándose en modo normal.\n"
 
 #, c-format
 msgid "cupsfilter: Invalid document number %d!\n"
@@ -4859,8 +4655,7 @@
 msgstr "Falta el atributo job-printer-uri."
 
 msgid "lpadmin: Class name can only contain printable characters!\n"
-msgstr ""
-"lpadmin: El nombre de la clase sólo puede contener caracteres imprimibles.\n"
+msgstr "lpadmin: El nombre de la clase sólo puede contener caracteres imprimibles.\n"
 
 msgid "lpadmin: Expected PPD after '-P' option!\n"
 msgstr "lpadmin: Se esperaba un PPD tras la opción '-P'.\n"
@@ -4919,9 +4714,7 @@
 msgstr "lpadmin: La impresora %s no es miembro de la clase %s.\n"
 
 msgid "lpadmin: Printer name can only contain printable characters!\n"
-msgstr ""
-"lpadmin: El nombre de la impresora sólo puede contener caracteres "
-"imprimibles.\n"
+msgstr "lpadmin: El nombre de la impresora sólo puede contener caracteres imprimibles.\n"
 
 msgid ""
 "lpadmin: Unable to add a printer to the class:\n"
@@ -5019,15 +4812,13 @@
 msgstr "lpadmin: Opción '%c' desconocida.\n"
 
 msgid "lpadmin: Warning - content type list ignored!\n"
-msgstr ""
-"lpadmin: Advertencia - lista de tipo de contenido no tenida en cuenta.\n"
+msgstr "lpadmin: Advertencia - lista de tipo de contenido no tenida en cuenta.\n"
 
 msgid "lpc> "
 msgstr "lpc> "
 
 msgid "lpinfo: Expected 1284 device ID string after --device-id!\n"
-msgstr ""
-"lpinfo: Se esperaba una cadena ID de dispositivo 1284 tras --device-id.\n"
+msgstr "lpinfo: Se esperaba una cadena ID de dispositivo 1284 tras --device-id.\n"
 
 msgid "lpinfo: Expected language after --language!\n"
 msgstr "lpinfo: Se esperaba un idioma tras --language.\n"
@@ -5039,10 +4830,10 @@
 msgstr "lpinfo: Se esperaba una cadena de producto tras --product.\n"
 
 msgid "lpinfo: Expected scheme list after --exclude-schemes!\n"
-msgstr ""
+msgstr "lpinfo: Se esperaba una lista de esquemas tras --exclude-schemes.\n"
 
 msgid "lpinfo: Expected scheme list after --include-schemes!\n"
-msgstr ""
+msgstr "lpinfo: Se esperaba una lista de esquemas tras --include-schemes.\n"
 
 msgid "lpinfo: Expected timeout after --timeout!\n"
 msgstr "lpinfo: Se esperaba un tiempo tras --timeout.\n"
@@ -5127,9 +4918,7 @@
 
 #, c-format
 msgid "lppasswd: failed to backup old password file: %s\n"
-msgstr ""
-"lppasswd: falló al hacer una copia de seguridad del antiguo archivo de "
-"contraseñas: %s\n"
+msgstr "lppasswd: falló al hacer una copia de seguridad del antiguo archivo de contraseñas: %s\n"
 
 #, c-format
 msgid "lppasswd: failed to rename password file: %s\n"
@@ -5140,12 +4929,8 @@
 msgstr "lppasswd: el usuario \"%s\" y el grupo \"%s\" no existen.\n"
 
 #, c-format
-msgid ""
-"lpstat: error - %s environment variable names non-existent destination \"%s"
-"\"!\n"
-msgstr ""
-"lpstat: error - Los nombre de variable de entorno %s no existen en el "
-"destino \"%s\".\n"
+msgid "lpstat: error - %s environment variable names non-existent destination \"%s\"!\n"
+msgstr "lpstat: error - Los nombre de variable de entorno %s no existen en el destino \"%s\".\n"
 
 #, c-format
 msgid "members of class %s:\n"
@@ -5221,8 +5006,7 @@
 
 #, c-format
 msgid "ppdc: Expected charset after Font on line %d of %s!\n"
-msgstr ""
-"ppdc: Se esperaba un juego de caracteres tras Font en la línea %d de %s.\n"
+msgstr "ppdc: Se esperaba un juego de caracteres tras Font en la línea %d de %s.\n"
 
 #, c-format
 msgid "ppdc: Expected choice code on line %d of %s.\n"
@@ -5234,8 +5018,7 @@
 
 #, c-format
 msgid "ppdc: Expected color order for ColorModel on line %d of %s!\n"
-msgstr ""
-"ppdc: Se esperaba un orden de color para ColorModel en la línea %d de %s.\n"
+msgstr "ppdc: Se esperaba un orden de color para ColorModel en la línea %d de %s.\n"
 
 #, c-format
 msgid "ppdc: Expected colorspace for ColorModel on line %d of %s!\n"
@@ -5247,16 +5030,11 @@
 
 #, c-format
 msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s!\n"
-msgstr ""
-"ppdc: Se esperaba una cadena de restricciones para UIConstraints en la línea "
-"%d de %s.\n"
+msgstr "ppdc: Se esperaba una cadena de restricciones para UIConstraints en la línea %d de %s.\n"
 
 #, c-format
-msgid ""
-"ppdc: Expected driver type keyword following DriverType on line %d of %s!\n"
-msgstr ""
-"ppdc: Se esperaba una clave de tipo de controlador tras DriverType en la "
-"línea %d de %s.\n"
+msgid "ppdc: Expected driver type keyword following DriverType on line %d of %s!\n"
+msgstr "ppdc: Se esperaba una clave de tipo de controlador tras DriverType en la línea %d de %s.\n"
 
 #, c-format
 msgid "ppdc: Expected duplex type after Duplex on line %d of %s!\n"
@@ -5268,8 +5046,7 @@
 
 #, c-format
 msgid "ppdc: Expected filename after #po %s on line %d of %s!\n"
-msgstr ""
-"ppdc: Se esperaba un nombre de archivo tras #po %s en la línea %d de %s.\n"
+msgstr "ppdc: Se esperaba un nombre de archivo tras #po %s en la línea %d de %s.\n"
 
 #, c-format
 msgid "ppdc: Expected group name/text on line %d of %s!\n"
@@ -5321,19 +5098,15 @@
 
 #, c-format
 msgid "ppdc: Expected name/text after Installable on line %d of %s!\n"
-msgstr ""
-"ppdc: Se esperaba un nombre/texto tras Installable en la línea %d de %s.\n"
+msgstr "ppdc: Se esperaba un nombre/texto tras Installable en la línea %d de %s.\n"
 
 #, c-format
 msgid "ppdc: Expected name/text after Resolution on line %d of %s!\n"
-msgstr ""
-"ppdc: Se esperaba un nombre/texto tras Resolution en la línea %d de %s.\n"
+msgstr "ppdc: Se esperaba un nombre/texto tras Resolution en la línea %d de %s.\n"
 
 #, c-format
 msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s!\n"
-msgstr ""
-"ppdc: Se esperaba una combinación nombre/texto para ColorModel en la línea %"
-"d de %s.\n"
+msgstr "ppdc: Se esperaba una combinación nombre/texto para ColorModel en la línea %d de %s.\n"
 
 #, c-format
 msgid "ppdc: Expected option name/text on line %d of %s!\n"
@@ -5349,29 +5122,19 @@
 
 #, c-format
 msgid "ppdc: Expected override field after Resolution on line %d of %s!\n"
-msgstr ""
-"ppdc: Se esperaba un campo de anulación tras Resolution en la línea %d de %"
-"s.\n"
+msgstr "ppdc: Se esperaba un campo de anulación tras Resolution en la línea %d de %s.\n"
 
 #, c-format
 msgid "ppdc: Expected real number on line %d of %s!\n"
 msgstr "ppdc: Se esperaba un número real en la línea %d de %s.\n"
 
 #, c-format
-msgid ""
-"ppdc: Expected resolution/mediatype following ColorProfile on line %d of %"
-"s!\n"
-msgstr ""
-"ppdc: Se esperaba resolución/tipo de soporte tras ColorProfile en la línea %"
-"d de %s.\n"
+msgid "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s!\n"
+msgstr "ppdc: Se esperaba resolución/tipo de soporte tras ColorProfile en la línea %d de %s.\n"
 
 #, c-format
-msgid ""
-"ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d "
-"of %s!\n"
-msgstr ""
-"ppdc: Se esperaba resolución/tipo de soporte tras SimpleColorProfile en la "
-"línea %d de %s.\n"
+msgid "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d of %s!\n"
+msgstr "ppdc: Se esperaba resolución/tipo de soporte tras SimpleColorProfile en la línea %d de %s.\n"
 
 #, c-format
 msgid "ppdc: Expected selector after %s on line %d of %s!\n"
@@ -5411,14 +5174,11 @@
 
 #, c-format
 msgid "ppdc: Invalid empty MIME type for filter on line %d of %s!\n"
-msgstr ""
-"ppdc: Tipo MIME vacío incorrecto para el filtro en la línea %d de %s.\n"
+msgstr "ppdc: Tipo MIME vacío incorrecto para el filtro en la línea %d de %s.\n"
 
 #, c-format
 msgid "ppdc: Invalid empty program name for filter on line %d of %s!\n"
-msgstr ""
-"ppdc: Nombre de programa vacío incorrecto para el filtro en la línea %d de %"
-"s.\n"
+msgstr "ppdc: Nombre de programa vacío incorrecto para el filtro en la línea %d de %s.\n"
 
 #, c-format
 msgid "ppdc: Invalid option section \"%s\" on line %d of %s!\n"
@@ -5454,8 +5214,7 @@
 
 #, c-format
 msgid "ppdc: Option %s redefined with a different type on line %d of %s!\n"
-msgstr ""
-"ppdc: La opción %s redefinida con un tipo diferente en la línea %d de %s.\n"
+msgstr "ppdc: La opción %s redefinida con un tipo diferente en la línea %d de %s.\n"
 
 #, c-format
 msgid "ppdc: Option constraint must *name on line %d of %s!\n"
@@ -5483,14 +5242,11 @@
 
 #, c-format
 msgid "ppdc: Unable to find #po file %s on line %d of %s!\n"
-msgstr ""
-"ppdc: No se ha podido encontrar el archivo #po %s en la línea %d de %s.\n"
+msgstr "ppdc: No se ha podido encontrar el archivo #po %s en la línea %d de %s.\n"
 
 #, c-format
 msgid "ppdc: Unable to find include file \"%s\" on line %d of %s!\n"
-msgstr ""
-"ppdc: No se ha podido encontrar el archivo include \"%s\" en la línea %d de %"
-"s.\n"
+msgstr "ppdc: No se ha podido encontrar el archivo include \"%s\" en la línea %d de %s.\n"
 
 #, c-format
 msgid "ppdc: Unable to find localization for \"%s\" - %s\n"
@@ -5521,11 +5277,8 @@
 msgstr "ppdc: Elemento desconocido \"%s\" visto en la línea %d de %s.\n"
 
 #, c-format
-msgid ""
-"ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s!\n"
-msgstr ""
-"ppdc: Caracteres finales desconocidos en el número real \"%s\" en la línea %"
-"d de %s.\n"
+msgid "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s!\n"
+msgstr "ppdc: Caracteres finales desconocidos en el número real \"%s\" en la línea %d de %s.\n"
 
 #, c-format
 msgid "ppdc: Unterminated string starting with %c on line %d of %s!\n"
@@ -5616,22 +5369,5 @@
 msgstr "sin título"
 
 msgid "variable-bindings uses indefinite length"
-msgstr "Variable-bindings usa una longitud indefinida"
+msgstr "variable-bindings usa una longitud indefinida"
 
-#~ msgid "INFO: Attempting to connect to host %s for printer %s\n"
-#~ msgstr "INFO: Intentando conectar al ordenador %s para la impresora %s\n"
-
-#~ msgid "INFO: Attempting to connect to host %s on port %d\n"
-#~ msgstr "INFO: Intentando conectar al ordenador %s en el puerto %d\n"
-
-#~ msgid "INFO: Connected to %s...\n"
-#~ msgstr "INFO: Conectado a %s...\n"
-
-#~ msgid "INFO: Connecting to %s on port %d...\n"
-#~ msgstr "INFO: Conectando con %s en el puerto %d...\n"
-
-#~ msgid "INFO: Looking for \"%s\"...\n"
-#~ msgstr "INFO: Buscando \"%s\"...\n"
-
-#~ msgid "lpinfo: Unable to connect to server: %s\n"
-#~ msgstr "lpinfo: No se ha podido conectar al servidor: %s\n"
diff --git a/packaging/cups.list.in b/packaging/cups.list.in
index 2776550..2116b19 100644
--- a/packaging/cups.list.in
+++ b/packaging/cups.list.in
@@ -4,7 +4,7 @@
 #   ESP Package Manager (EPM) file list for the Common UNIX Printing
 #   System (CUPS).
 #
-#   Copyright 2007-2008 by Apple Inc.
+#   Copyright 2007-2009 by Apple Inc.
 #   Copyright 1997-2007 by Easy Software Products, all rights reserved.
 #
 #   These coded instructions, statements, and computer programs are the
@@ -628,6 +628,7 @@
 f 0644 root sys $DOCDIR/help/overview.html doc/help/overview.html
 f 0644 root sys $DOCDIR/help/policies.html doc/help/policies.html
 f 0644 root sys $DOCDIR/help/security.html doc/help/security.html
+f 0644 root sys $DOCDIR/help/sharing.html doc/help/sharing.html
 f 0644 root sys $DOCDIR/help/standard.html doc/help/standard.html
 f 0644 root sys $DOCDIR/help/translation.html doc/help/translation.html
 f 0644 root sys $DOCDIR/help/whatsnew.html doc/help/whatsnew.html
diff --git a/packaging/cups.spec.in b/packaging/cups.spec.in
index c9b2243..9dd3885 100644
--- a/packaging/cups.spec.in
+++ b/packaging/cups.spec.in
@@ -5,7 +5,7 @@
 #
 #   Original version by Jason McMullan <[email protected]>.
 #
-#   Copyright 2007-2008 by Apple Inc.
+#   Copyright 2007-2009 by Apple Inc.
 #   Copyright 1999-2007 by Easy Software Products, all rights reserved.
 #
 #   These coded instructions, statements, and computer programs are the
@@ -259,6 +259,7 @@
 /usr/share/doc/cups/help/policies.html
 /usr/share/doc/cups/help/ref-*.html
 /usr/share/doc/cups/help/security.html
+/usr/share/doc/cups/help/sharing.html
 /usr/share/doc/cups/help/standard.html
 /usr/share/doc/cups/help/translation.html
 /usr/share/doc/cups/help/whatsnew.html
diff --git a/ppdc/ppdc-driver.cxx b/ppdc/ppdc-driver.cxx
index c6e0dda..31c857f 100644
--- a/ppdc/ppdc-driver.cxx
+++ b/ppdc/ppdc-driver.cxx
@@ -3,7 +3,7 @@
 //
 //   PPD file compiler definitions for the CUPS PPD Compiler.
 //
-//   Copyright 2007-2008 by Apple Inc.
+//   Copyright 2007-2009 by Apple Inc.
 //   Copyright 2002-2006 by Easy Software Products.
 //
 //   These coded instructions, statements, and computer programs are the
@@ -945,7 +945,8 @@
         continue;
 
       if (!o->text->value || !strcmp(o->name->value, o->text->value))
-	cupsFilePrintf(fp, "*OpenUI *%s: ", o->name->value);
+	cupsFilePrintf(fp, "*OpenUI *%s: ", o->name->value,
+	               catalog->find_message(o->name->value));
       else
 	cupsFilePrintf(fp, "*OpenUI *%s/%s: ", o->name->value,
 	               catalog->find_message(o->text->value));
@@ -1008,7 +1009,8 @@
       {
         // Write this choice...
 	if (!c->text->value || !strcmp(c->name->value, c->text->value))
-          cupsFilePrintf(fp, "*%s %s: \"%s\"%s", o->name->value, c->name->value,
+          cupsFilePrintf(fp, "*%s %s: \"%s\"%s", o->name->value,
+	                 catalog->find_message(c->name->value),
 	        	 c->code->value, lf);
         else
           cupsFilePrintf(fp, "*%s %s/%s: \"%s\"%s", o->name->value,
diff --git a/ppdc/ppdc-source.cxx b/ppdc/ppdc-source.cxx
index d95f2d6..b4e31fc 100644
--- a/ppdc/ppdc-source.cxx
+++ b/ppdc/ppdc-source.cxx
@@ -3,7 +3,7 @@
 //
 //   Source class for the CUPS PPD Compiler.
 //
-//   Copyright 2007-2008 by Apple Inc.
+//   Copyright 2007-2009 by Apple Inc.
 //   Copyright 2002-2007 by Easy Software Products.
 //
 //   These coded instructions, statements, and computer programs are the
@@ -3422,15 +3422,15 @@
       quotef(fp, "  Copyright \"%s\"\n", st->value);
 
     // Write other strings and values...
-    if (d->manufacturer->value)
+    if (d->manufacturer && d->manufacturer->value)
       quotef(fp, "  Manufacturer \"%s\"\n", d->manufacturer->value);
     if (d->model_name->value)
       quotef(fp, "  ModelName \"%s\"\n", d->model_name->value);
-    if (d->file_name->value)
+    if (d->file_name && d->file_name->value)
       quotef(fp, "  FileName \"%s\"\n", d->file_name->value);
-    if (d->pc_file_name->value)
+    if (d->pc_file_name && d->pc_file_name->value)
       quotef(fp, "  PCFileName \"%s\"\n", d->pc_file_name->value);
-    if (d->version->value)
+    if (d->version && d->version->value)
       quotef(fp, "  Version \"%s\"\n", d->version->value);
 
     cupsFilePrintf(fp, "  DriverType %s\n", driver_types[d->type]);
diff --git a/ppdc/ppdpo.cxx b/ppdc/ppdpo.cxx
index fe533ba..c32b2ac 100644
--- a/ppdc/ppdpo.cxx
+++ b/ppdc/ppdpo.cxx
@@ -202,7 +202,7 @@
       if (!o->choices->count)
         continue;
 
-      if (o->text->value && strcmp(o->name->value, o->text->value))
+      if (o->text->value)
         catalog->add_message(o->text->value);
       else
         catalog->add_message(o->name->value);
@@ -210,7 +210,7 @@
       for (c = (ppdcChoice *)o->choices->first();
            c;
 	   c = (ppdcChoice *)o->choices->next())
-	if (c->text->value && strcmp(c->name->value, c->text->value))
+	if (c->text->value)
           catalog->add_message(c->text->value);
         else
           catalog->add_message(c->name->value);
diff --git a/scheduler/ipp.c b/scheduler/ipp.c
index 668da3e..e9e3e73 100644
--- a/scheduler/ipp.c
+++ b/scheduler/ipp.c
@@ -4714,7 +4714,18 @@
       continue;
 
     if (!ra || cupsArrayFind(ra, fromattr->name))
+    {
+     /*
+      * Don't send collection attributes by default to IPP/1.x clients
+      * since many do not support collections...
+      */
+
+      if (fromattr->value_tag == IPP_TAG_BEGIN_COLLECTION &&
+          !ra && to->request.status.version[0] == 1)
+	continue;
+
       copy_attribute(to, fromattr, quickcopy);
+    }
   }
 }
 
diff --git a/scheduler/job.c b/scheduler/job.c
index 9bdacc3..d5c1cfe 100644
--- a/scheduler/job.c
+++ b/scheduler/job.c
@@ -3,7 +3,7 @@
  *
  *   Job management routines for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007-2008 by Apple Inc.
+ *   Copyright 2007-2009 by Apple Inc.
  *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -3874,16 +3874,18 @@
 #ifdef __APPLE__
     else if (!strncmp(message, "recoverable:", 12))
     {
-      cupsdSetPrinterReasons(job->printer,
-                             "+com.apple.print.recoverable-warning");
-
       ptr = message + 12;
       while (isspace(*ptr & 255))
         ptr ++;
 
-      cupsdSetString(&job->printer->recoverable, ptr);
-      cupsdAddPrinterHistory(job->printer);
-      event |= CUPSD_EVENT_PRINTER_STATE;
+      if (*ptr)
+      {
+	cupsdSetPrinterReasons(job->printer,
+			       "+com.apple.print.recoverable-warning");
+	cupsdSetString(&job->printer->recoverable, ptr);
+	cupsdAddPrinterHistory(job->printer);
+	event |= CUPSD_EVENT_PRINTER_STATE;
+      }
     }
     else if (!strncmp(message, "recovered:", 10))
     {
@@ -4035,9 +4037,14 @@
 					 "job-printer-state-reasons",
 					 num_reasons, NULL, NULL);
   }
+  else if (job->printer_reasons)
+  {
+    for (i = 0; i < job->printer_reasons->num_values; i ++)
+      _cupsStrFree(job->printer_reasons->values[i].string.text);
+  }
 
   for (i = 0; i < num_reasons; i ++)
-    cupsdSetString(&(job->printer_reasons->values[i].string.text), reasons[i]);
+    job->printer_reasons->values[i].string.text = _cupsStrAlloc(reasons[i]);
 }
 
 
diff --git a/scheduler/printers.c b/scheduler/printers.c
index e4029cd..d32a09b 100644
--- a/scheduler/printers.c
+++ b/scheduler/printers.c
@@ -359,6 +359,13 @@
 		  ,"gzip"
 #endif /* HAVE_LIBZ */
 		};
+  static const char * const media_col_supported[] =
+		{			/* media-col-supported values */
+		  "media-color",
+		  "media-key",
+		  "media-size",
+		  "media-type"
+		};
   static const char * const multiple_document_handling[] =
 		{			/* multiple-document-handling-supported values */
 		  "separate-documents-uncollated-copies",
@@ -517,6 +524,13 @@
     ippAddString(CommonData, IPP_TAG_PRINTER, IPP_TAG_NAME | IPP_TAG_COPY,
                  "job-sheets-supported", NULL, "none");
 
+  /* media-col-supported */
+  ippAddStrings(CommonData, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
+                "media-col-supported",
+                sizeof(media_col_supported) /
+		    sizeof(media_col_supported[0]), NULL,
+	        media_col_supported);
+
   /* multiple-document-handling-supported */
   ippAddStrings(CommonData, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
                 "multiple-document-handling-supported",
@@ -3523,15 +3537,6 @@
   }
 
  /*
-  * Mark the CUPS_PRINTER_COMMANDS bit if we have a filter for
-  * application/vnd.cups-command...
-  */
-
-  if (!strcasecmp(super, "application") &&
-      !strcasecmp(type, "vnd.cups-command"))
-    p->type |= CUPS_PRINTER_COMMANDS;
-
- /*
   * Add the filter to the MIME database, supporting wildcards as needed...
   */
 
@@ -3803,6 +3808,8 @@
   ppd_attr_t	*ppd_attr;		/* PPD attribute */
   _cups_pwg_media_t *pwgmedia;		/* Matching PWG size name */
   ipp_attribute_t *attr;		/* Attribute data */
+  ipp_t		*media_col_default,	/* media-col-default collection value */
+		*media_size;		/* media-size collection value */
   ipp_value_t	*val;			/* Attribute value */
   int		num_finishings;		/* Number of finishings */
   int		finishings[5];		/* finishings-supported values */
@@ -3965,9 +3972,39 @@
 	    }
 
 	    if (size->marked)
+	    {
+	     /*
+	      * Add media-default...
+	      */
+
 	      ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD,
-			   "media-default", NULL,
-			   _cupsStrRetain(val->string.text));
+			   "media-default", NULL, val->string.text);
+
+             /*
+	      * Add media-col-default...
+	      */
+
+	      media_size = ippNew();
+	      ippAddInteger(media_size, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
+	                    "x-dimension", (int)(size->width * 2540.0 / 72.0));
+	      ippAddInteger(media_size, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
+	                    "y-dimension", (int)(size->length * 2540.0 / 72.0));
+
+	      media_col_default = ippNew();
+	      ippAddString(media_col_default, IPP_TAG_PRINTER,
+	                   IPP_TAG_KEYWORD | IPP_TAG_COPY, "media-color", NULL,
+			   "white");
+	      ippAddString(media_col_default, IPP_TAG_PRINTER, IPP_TAG_KEYWORD,
+			   "media-key", NULL,val->string.text);
+	      ippAddCollection(media_col_default, IPP_TAG_PRINTER, "media-size",
+	                       media_size);
+	      ippAddString(media_col_default, IPP_TAG_PRINTER,
+	                   IPP_TAG_KEYWORD | IPP_TAG_COPY, "media-type", NULL,
+			   "stationary");
+
+              ippAddCollection(p->ppd_attrs, IPP_TAG_PRINTER,
+	                       "media-col-default", media_col_default);
+	    }
 
             val ++;
 	  }
@@ -4100,6 +4137,10 @@
     {
       DEBUG_printf(("ppd->filters[%d] = \"%s\"\n", i, ppd->filters[i]));
       add_string_array(&(p->filters), ppd->filters[i]);
+
+      if (!strncasecmp(ppd->filters[i], "application/vnd.cups-command", 28) &&
+          isspace(ppd->filters[i][28] & 255))
+        p->type |= CUPS_PRINTER_COMMANDS;
     }
 
     if (ppd->num_filters == 0)
@@ -4123,7 +4164,8 @@
 
       for (i = 0; i < ppd->num_filters; i ++)
 	if (!strncasecmp(ppd->filters[i],
-			 "application/vnd.cups-postscript", 31))
+			 "application/vnd.cups-postscript", 31) &&
+            isspace(ppd->filters[i][31] & 255))
 	  break;
 
       if (i < ppd->num_filters)
diff --git a/scheduler/type.c b/scheduler/type.c
index c334e99..6218b4d 100644
--- a/scheduler/type.c
+++ b/scheduler/type.c
@@ -188,8 +188,7 @@
     else if (*rule == '+' && current != NULL)
     {
       if (logic != MIME_MAGIC_AND &&
-          current != NULL && current->prev != NULL &&
-	  current->prev->prev != NULL)
+          current != NULL && current->prev != NULL)
       {
        /*
         * OK, we have more than 1 rule in the current tree level...  Make a
diff --git a/templates/es/add-rss-subscription.tmpl b/templates/es/add-rss-subscription.tmpl
index 91c2b06..89d77ce 100644
--- a/templates/es/add-rss-subscription.tmpl
+++ b/templates/es/add-rss-subscription.tmpl
@@ -28,7 +28,7 @@
 <TD><INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_STARTED" {?EVENT_SERVER_STARTED}>Servidor iniciado<BR>
 <INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_STOPPED" {?EVENT_SERVER_STOPPED}>Servidor parado<BR>
 <INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_RESTARTED" {?EVENT_SERVER_RESTARTED}>Servidor reiniciado<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_AUDIT" {?EVENT_SERVER_AUDIT}>Auditoría de seguridad del servidor</TD>
+<INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_AUDIT" {?EVENT_SERVER_AUDIT}>Auditor&iacute;a de seguridad del servidor</TD>
 </TR>
 <TR>
 <TH CLASS="label">N&uacute;mero m&aacute;ximo de eventos del canal:</TH>
diff --git a/templates/es/admin.tmpl b/templates/es/admin.tmpl
index e50409e..a16eb4e 100644
--- a/templates/es/admin.tmpl
+++ b/templates/es/admin.tmpl
@@ -83,7 +83,7 @@
 <INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Guardar informaci&oacute;n de depuraci&oacute;n para b&uacute;squeda de problemas</P>
 
 }
-<P><INPUT TYPE="SUBMIT" NAME="CHANGESETTINGS" VALUE="Cambiar configuración"></P>
+<P><INPUT TYPE="SUBMIT" NAME="CHANGESETTINGS" VALUE="Cambiar configuraci&oacute;n"></P>
 
 </FORM>}
 
diff --git a/templates/es/error-op.tmpl b/templates/es/error-op.tmpl
index 80b20fd..d584108 100644
--- a/templates/es/error-op.tmpl
+++ b/templates/es/error-op.tmpl
@@ -1,9 +1,9 @@
 <DIV CLASS="indent">
 
-<H2 CLASS="title">Error {?title} {?printer_name}</H2>
+<H2 CLASS="title">Error en {?printer_name}: {?title}</H2>
 
 <P>Error:</P>
 
-<BLOCKQUOTE>Operaci&oacute;n desconocida "{op}"!</BLOCKQUOTE>
+<BLOCKQUOTE>Operaci&oacute;n desconocida "{op}".</BLOCKQUOTE>
 
 </DIV>
diff --git a/templates/es/error.tmpl b/templates/es/error.tmpl
index ff30a4c..650bc32 100644
--- a/templates/es/error.tmpl
+++ b/templates/es/error.tmpl
@@ -1,6 +1,6 @@
 <DIV CLASS="indent">
 
-<H2 CLASS="title">{?title} {?printer_name} Error</H2>
+<H2 CLASS="title">Error en {?printer_name}: {?title}</H2>
 
 <P>{?message?{message}:Error:}</P>
 
diff --git a/templates/es/printer-configured.tmpl b/templates/es/printer-configured.tmpl
index 22cb3ec..d382264 100644
--- a/templates/es/printer-configured.tmpl
+++ b/templates/es/printer-configured.tmpl
@@ -2,7 +2,7 @@
 
 <H2 CLASS="title">Cambiar opciones predeterminadas de {printer_name}</H2>
 
-<P>{OP=set-class-options?Class <A HREF="/classes/{printer_name}">:Printer <A HREF="/printers/{printer_name}">}{printer_name}</A>
-default options have been set successfully.
+<P>Se han establecido con &eacute;xito las opciones predeterminadas de la
+{OP=set-class-options?clase <A HREF="/classes/{printer_name}">:impresora <A HREF="/printers/{printer_name}">}{printer_name}</A>.
 
 </DIV>
diff --git a/templates/es/printer.tmpl b/templates/es/printer.tmpl
index 26344b8..2a1ad09 100644
--- a/templates/es/printer.tmpl
+++ b/templates/es/printer.tmpl
@@ -35,7 +35,7 @@
 <TABLE SUMMARY="{printer_name}">
 <TR><TH ALIGN="RIGHT" VALIGN="TOP">Descripci&oacute;n:</TH><TD>{printer_info}</TD></TR>
 <TR><TH ALIGN="RIGHT" VALIGN="TOP">Ubicaci&oacute;n:</TH><TD>{printer_location}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Controlador:</TH><TD>{printer_make_and_model} ({color_supported=1?color:escala de grises}{sides_supported?, dúplex:})<BR>
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Controlador:</TH><TD>{printer_make_and_model} ({color_supported=1?color:escala de grises}{sides_supported?, d&uacute;plex:})<BR>
 <TR><TH ALIGN="RIGHT" VALIGN="TOP">Conexi&oacute;n:</TH><TD>{device_uri}</TD></TR>
 <TR><TH ALIGN="RIGHT" VALIGN="TOP">Opciones predeterminadas:</TH><TD>job-sheets={job_sheets_default}
 media={media_default?{media_default}:desconocido}
diff --git a/templates/es/test-page.tmpl b/templates/es/test-page.tmpl
index a36ef8f..763dab5 100644
--- a/templates/es/test-page.tmpl
+++ b/templates/es/test-page.tmpl
@@ -1,6 +1,6 @@
 <DIV CLASS="indent">
 
-<H2 CLASS="title">Imprimir página de prueba en {printer_name}</H2>
+<H2 CLASS="title">Imprimir p&aacute;gina de prueba en {printer_name}</H2>
 
 <P>P&aacute;gina de prueba enviada; el n&uacute;mero del trabajo es el <A HREF="/{SECTION}/{printer_name}">
 {printer_name}-{job_id}</A>.</P>
diff --git a/test/4.1-requests.test b/test/4.1-requests.test
index fc4697b..fbd2a97 100644
--- a/test/4.1-requests.test
+++ b/test/4.1-requests.test
@@ -135,6 +135,25 @@
 	EXPECT attributes-charset
 	EXPECT attributes-natural-language
 }
+{
+	# The name of the test...
+	NAME "Bad IPP Version"
+
+	# The operation to use
+	OPERATION get-jobs
+
+	# The version number to use
+	VERSION 0.0
+
+	# The attributes to send
+	GROUP operation
+	ATTR charset attributes-charset utf-8
+	ATTR language attributes-natural-language en
+	ATTR uri printer-uri ipp://localhost/printers
+
+	# What statuses are OK?
+	STATUS server-error-version-not-supported
+}
 #
 # End of "$Id: 4.1-requests.test 8144 2008-11-19 19:23:12Z mike $"
 #
diff --git a/test/4.2-cups-printer-ops.test b/test/4.2-cups-printer-ops.test
index ab56d9e..26035bc 100644
--- a/test/4.2-cups-printer-ops.test
+++ b/test/4.2-cups-printer-ops.test
@@ -256,6 +256,29 @@
 	EXPECT attributes-charset
 	EXPECT attributes-natural-language
 }
+{
+	# The name of the test...
+	NAME "Get IPP/2.x Attributes for Printer Test1"
+
+	# The operation to use
+	OPERATION get-printer-attributes
+	RESOURCE /
+
+	# The IPP version to use
+	VERSION 2.0
+
+	# The attributes to send
+	GROUP operation
+	ATTR charset attributes-charset utf-8
+	ATTR language attributes-natural-language en
+	ATTR uri printer-uri $method://$hostname:$port/printers/Test1
+
+	# What statuses are OK?
+	STATUS successful-ok
+
+	# What attributes do we expect?
+	EXPECT media-col-default
+}
 
 #
 # End of "$Id: 4.2-cups-printer-ops.test 6379 2007-03-21 14:57:22Z mike $"
diff --git a/test/get-printer-attributes-2.0.test b/test/get-printer-attributes-2.0.test
new file mode 100644
index 0000000..664bd6c
--- /dev/null
+++ b/test/get-printer-attributes-2.0.test
@@ -0,0 +1,47 @@
+# Get printer attributes using get-printer-attributes
+{
+	# The name of the test...
+	NAME "Get printer attributes using get-printer-attributes"
+
+	# The resource to use for the POST
+	# RESOURCE /admin
+
+	# The operation to use
+	OPERATION get-printer-attributes
+
+	# The version to use
+	VERSION 2.0
+
+	# Attributes, starting in the operation group...
+	GROUP operation
+	ATTR charset attributes-charset utf-8
+	ATTR language attributes-natural-language en
+	ATTR uri printer-uri $uri
+
+	# What statuses are OK?
+	STATUS successful-ok
+
+	# What attributes do we expect?
+	EXPECT charset-configured
+	EXPECT charset-supported
+	EXPECT compression-supported
+	EXPECT document-format-default
+	EXPECT document-format-supported
+	EXPECT generated-natural-language-supported
+	EXPECT ipp-versions-supported
+	EXPECT media-col-default
+	EXPECT natural-language-configured
+	EXPECT operations-supported
+	EXPECT printer-info
+	EXPECT printer-is-accepting-jobs
+	EXPECT printer-location
+	EXPECT printer-make-and-model
+	EXPECT printer-more-info
+	EXPECT printer-name
+	EXPECT printer-state
+	EXPECT printer-state-reasons
+	EXPECT printer-up-time
+	EXPECT printer-uri-supported
+	EXPECT uri-authentication-supported
+	EXPECT uri-security-supported
+}
diff --git a/test/ipptest.c b/test/ipptest.c
index dcd17e2..59f2fb8 100644
--- a/test/ipptest.c
+++ b/test/ipptest.c
@@ -3,7 +3,7 @@
  *
  *   IPP test command for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007-2008 by Apple Inc.
+ *   Copyright 2007-2009 by Apple Inc.
  *   Copyright 1997-2007 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -51,6 +51,7 @@
 ipp_status_t	ippErrorValue(const char *);
 char		*get_token(FILE *, char *, int, int *linenum);
 void		print_attr(ipp_attribute_t *);
+void		print_col(ipp_t *col);
 void		usage(const char *option);
 
 
@@ -233,7 +234,7 @@
   pass            = 1;
   job_id          = 0;
   subscription_id = 0;
-  version         = 1;
+  version         = 11;
   linenum         = 1;
 
   while (get_token(fp, token, sizeof(token), &linenum) != NULL)
@@ -292,8 +293,21 @@
         * IPP version number for test...
 	*/
 
+        int major, minor;		/* Major/minor IPP version */
+
+
 	get_token(fp, temp, sizeof(temp), &linenum);
-	sscanf(temp, "%*d.%d", &version);
+	if (sscanf(temp, "%d.%d", &major, &minor) == 2 &&
+	    major >= 0 && minor >= 0 && minor < 10)
+	  version = major * 10 + minor;
+	else
+	{
+	  printf("Bad version %s seen on line %d - aborting test!\n", token,
+		 linenum);
+	  httpClose(http);
+	  ippDelete(request);
+	  return (0);
+	}
       }
       else if (!strcasecmp(token, "RESOURCE"))
       {
@@ -548,7 +562,8 @@
     * Submit the IPP request...
     */
 
-    request->request.op.version[1]   = version;
+    request->request.op.version[0]   = version / 10;
+    request->request.op.version[1]   = version % 10;
     request->request.op.operation_id = op;
     request->request.op.request_id   = 1;
 
@@ -837,6 +852,16 @@
 		 attr->values[i].string.charset);
 	break;
 
+    case IPP_TAG_BEGIN_COLLECTION :
+	for (i = 0; i < attr->num_values; i ++)
+	{
+	  if (i)
+	    putchar(' ');
+
+	  print_col(attr->values[i].collection);
+	}
+	break;
+        
     default :
 	break; /* anti-compiler-warning-code */
   }
@@ -846,6 +871,93 @@
 
 
 /*
+ * 'print_col()' - Print a collection attribute on the screen.
+ */
+
+void
+print_col(ipp_t *col)			/* I - Collection attribute to print */
+{
+  int			i;		/* Looping var */
+  ipp_attribute_t	*attr;		/* Current attribute in collection */
+
+
+  putchar('{');
+  for (attr = col->attrs; attr; attr = attr->next)
+  {
+    printf("%s(%s%s)=", attr->name, attr->num_values > 1 ? "1setOf " : "",
+	   ippTagString(attr->value_tag));
+
+    switch (attr->value_tag)
+    {
+      case IPP_TAG_INTEGER :
+      case IPP_TAG_ENUM :
+	  for (i = 0; i < attr->num_values; i ++)
+	    printf("%d ", attr->values[i].integer);
+	  break;
+
+      case IPP_TAG_BOOLEAN :
+	  for (i = 0; i < attr->num_values; i ++)
+	    if (attr->values[i].boolean)
+	      printf("true ");
+	    else
+	      printf("false ");
+	  break;
+
+      case IPP_TAG_NOVALUE :
+	  printf("novalue");
+	  break;
+
+      case IPP_TAG_RANGE :
+	  for (i = 0; i < attr->num_values; i ++)
+	    printf("%d-%d ", attr->values[i].range.lower,
+		   attr->values[i].range.upper);
+	  break;
+
+      case IPP_TAG_RESOLUTION :
+	  for (i = 0; i < attr->num_values; i ++)
+	    printf("%dx%d%s ", attr->values[i].resolution.xres,
+		   attr->values[i].resolution.yres,
+		   attr->values[i].resolution.units == IPP_RES_PER_INCH ?
+		       "dpi" : "dpc");
+	  break;
+
+      case IPP_TAG_STRING :
+      case IPP_TAG_TEXT :
+      case IPP_TAG_NAME :
+      case IPP_TAG_KEYWORD :
+      case IPP_TAG_CHARSET :
+      case IPP_TAG_URI :
+      case IPP_TAG_MIMETYPE :
+      case IPP_TAG_LANGUAGE :
+	  for (i = 0; i < attr->num_values; i ++)
+	    printf("\"%s\" ", attr->values[i].string.text);
+	  break;
+
+      case IPP_TAG_TEXTLANG :
+      case IPP_TAG_NAMELANG :
+	  for (i = 0; i < attr->num_values; i ++)
+	    printf("\"%s\",%s ", attr->values[i].string.text,
+		   attr->values[i].string.charset);
+	  break;
+
+      case IPP_TAG_BEGIN_COLLECTION :
+	  for (i = 0; i < attr->num_values; i ++)
+	  {
+	    print_col(attr->values[i].collection);
+	    putchar(' ');
+	  }
+	  break;
+	  
+      default :
+	  break; /* anti-compiler-warning-code */
+    }
+  }
+
+  putchar('}');
+}
+
+
+/*
  * 'usage()' - Show program usage.
  */
 
diff --git a/test/run-stp-tests.sh b/test/run-stp-tests.sh
index bf44c17..7a6cdc6 100755
--- a/test/run-stp-tests.sh
+++ b/test/run-stp-tests.sh
@@ -673,10 +673,10 @@
 
 # Error log messages
 count=`grep '^E ' /tmp/cups-$user/log/error_log | wc -l | awk '{print $1}'`
-if test $count != 17; then
-	echo "FAIL: $count error messages, expected 17."
+if test $count != 18; then
+	echo "FAIL: $count error messages, expected 18."
 	grep '^E ' /tmp/cups-$user/log/error_log
-	echo "<P>FAIL: $count error messages, expected 17.</P>" >>$strfile
+	echo "<P>FAIL: $count error messages, expected 18.</P>" >>$strfile
 	echo "<PRE>" >>$strfile
 	grep '^E ' /tmp/cups-$user/log/error_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
 	echo "</PRE>" >>$strfile