Index: Portfile
===================================================================
--- Portfile	(revision 131059)
+++ Portfile	(working copy)
@@ -4,7 +4,7 @@
 PortSystem          1.0
 PortGroup           perl5 1.0
 
-perl5.branches      5.16
+perl5.branches      5.16 5.18 5.20
 perl5.setup         Net-CUPS 0.61
 revision            2
 platforms           darwin
@@ -15,9 +15,11 @@
 
 long_description    ${description}
 
-checksums           sha1    48240df335169950853ec30caa4be8733af2b48b \
-                    rmd160  c3dcf15fefc83985e79bb47439d485a5f956f854
+checksums           rmd160  c3dcf15fefc83985e79bb47439d485a5f956f854 \
+                    sha256  fd4a5a86038df9dfe57dcfed78b2d045e4b18d507a6fa5a8f82ecb3a732e0e35
 
 if {${perl5.major} != ""} {
-depends_lib-append  port:zlib
+    depends_lib-append \
+                    port:zlib
+    patchfiles      patch-CUPS.xs.diff
 }
Index: files/patch-CUPS.xs.diff
===================================================================
--- files/patch-CUPS.xs.diff	(revision 0)
+++ files/patch-CUPS.xs.diff	(working copy)
@@ -0,0 +1,165 @@
+https://rt.cpan.org/Public/Bug/Display.html?id=78583
+
+--- CUPS.xs.orig
++++ CUPS.xs
+@@ -5,9 +5,17 @@
+ #include "ppport.h"
+ 
+ #include <cups/cups.h>
++#if (CUPS_VERSION_MAJOR > 1) || (CUPS_VERSION_MINOR > 5)
++#define HAVE_CUPS_1_6 1
++#endif
++
+ /*#include <cups/backend.h>*/
+ #include <cups/http.h>
+-#include <cups/image.h>
++#ifdef HAVE_CUPS_1_6
++ #include <cupsfilters/image.h>
++#else
++ #include <cups/image.h>
++#endif
+ #include <cups/ipp.h>
+ #include <cups/ppd.h>
+ #include <cups/file.h>
+@@ -19,6 +27,17 @@
+ #include "const-c.inc"
+ #include "packer.c"
+ 
++#ifndef HAVE_CUPS_1_6
++#define ippGetGroupTag(attr)  attr->group_tag
++#define ippGetName(attr)      attr->name
++#define ippGetValueTag(attr)  attr->value_tag
++#define ippGetInteger(attr, element) attr->values[element].integer
++#define ippGetString(attr, element, language) attr->values[element].string.text
++#define ippGetStatusCode(ipp)  ipp->request.status.status_code
++#define ippFirstAttribute(ipp) ipp->current = ipp->attrs
++#define ippNextAttribute(ipp)  ipp->current = ipp->current->next
++#endif
++
+ static SV *password_cb = (SV*) NULL;
+ 
+ const char *
+@@ -200,7 +219,7 @@ NETCUPS_getPPDMakes()
+ 		if (response != NULL) {
+ 			attr = ippFindAttribute(response, "ppd-make", IPP_TAG_TEXT); 
+ 			rv = sv_newmortal();
+-			sv_setpv(rv, attr->values[0].string.text);
++			sv_setpv(rv, ippGetString(attr, 0, NULL));
+ 			XPUSHs(rv);
+ 			count++;
+ 
+@@ -211,7 +230,7 @@ NETCUPS_getPPDMakes()
+ 				}
+ 
+ 				rv = sv_newmortal();
+-				sv_setpv(rv, attr->values[0].string.text);
++				sv_setpv(rv, ippGetString(attr, 0, NULL));
+ 				XPUSHs(rv);
+ 				count++;
+ 			}			
+@@ -252,7 +271,7 @@ NETCUPS_getAllPPDs ()
+ 									"ppd-make-and-model", 
+ 									IPP_TAG_TEXT); 
+ 			rv = sv_newmortal();
+-			sv_setpv(rv, attr->values[0].string.text);
++			sv_setpv(rv, ippGetString(attr, 0, NULL));
+ 			XPUSHs(rv);
+ 			count++;
+ 			while (attr != NULL) {
+@@ -263,7 +282,7 @@ NETCUPS_getAllPPDs ()
+ 					break;
+ 				}
+ 				rv = sv_newmortal();
+-				sv_setpv(rv, attr->values[0].string.text);
++				sv_setpv(rv, ippGetString(attr, 0, NULL));
+ 				XPUSHs(rv);
+ 				count++;
+ 			}			
+@@ -356,14 +375,14 @@ NETCUPS_getPPDFileName(ppdfilename);
+ 		if (response != NULL) {
+ 			attr = ippFindAttribute(response, "ppd-name", IPP_TAG_NAME );
+ 			while ((attr != NULL) && (i < 1)) {
+-				tmpppd = attr->values[0].string.text;	
++				tmpppd = ippGetString(attr, 0, NULL);	
+ 				attr = ippFindNextAttribute(response, 
+ 											"ppd-make", 
+ 											IPP_TAG_TEXT);
+ 				attr = ippFindNextAttribute(response, 
+ 											"ppd-make-and-model", 
+ 											IPP_TAG_TEXT);
+-				if (strcmp(attr->values[0].string.text, ppdfilename) == 0 ) {
++				if (strcmp(ippGetString(attr, 0, NULL), ppdfilename) == 0 ) {
+ 					/* return tmpppd; */
+ 					strcpy(test, tmpppd);	
+ 					break;	
+@@ -410,12 +429,12 @@ NETCUPS_getDeviceAttribute( device, attribute, attribute_type )
+ 			attr = ippFindNextAttribute(response, "printer-name", IPP_TAG_NAME);
+ 
+ 			while (attr != NULL) {
+-				if (strcmp(attr->values[0].string.text, device) == 0) { 
++				if (strcmp(ippGetString(attr, 0, NULL), device) == 0) { 
+ 					attr = ippFindNextAttribute( response, 
+ 												 attribute, 
+ 												 attribute_type);
+ 					rv = sv_newmortal();  
+-					sv_setpv( rv, attr->values[0].string.text); 
++					sv_setpv( rv, ippGetString(attr, 0, NULL)); 
+ 					XPUSHs( rv );
+ 					break;	
+ 				}					
+@@ -858,15 +877,15 @@ NETCUPS_getAttributes( ipp )
+ 		SV* rv = NULL;
+ 		int count = 0;
+ 		ipp_attribute_t* attr = NULL;
+-		for (attr = ipp->attrs; attr != NULL; attr = attr->next)
++		for (attr = ippFirstAttribute(ipp); attr != NULL; attr = ippNextAttribute(ipp))
+ 		{
+-			while (attr != NULL && attr->group_tag != IPP_TAG_JOB)
+- 		       attr = attr->next;
++			while (attr != NULL && ippGetGroupTag(attr) != IPP_TAG_JOB)
++ 		       attr = ippNextAttribute(ipp);
+ 
+ 			if (attr == NULL)
+ 				break;
+ 			rv = sv_newmortal();
+-			sv_setpv( rv, attr->name );
++			sv_setpv( rv, ippGetName(attr) );
+ 			XPUSHs( rv );
+ 			count++;
+ 		}
+@@ -880,27 +899,27 @@ NETCUPS_getAttributeValue( ipp, name )
+ 		SV* rv = NULL;
+ 		int count = 0;
+ 		ipp_attribute_t* attr = NULL;
+-		for (attr = ipp->attrs; attr != NULL; attr = attr->next)
++		for (attr = ippFirstAttribute(ipp); attr != NULL; attr = ippNextAttribute(ipp))
+ 		{
+-			while (attr != NULL && attr->group_tag != IPP_TAG_JOB)
+- 		       attr = attr->next;
++			while (attr != NULL && ippGetGroupTag(attr) != IPP_TAG_JOB)
++ 		       attr = ippNextAttribute(ipp);
+ 
+ 			if (attr == NULL)
+ 				break;
+ 
+-			if( !strcmp( attr->name, name ) )
++			if( !strcmp( ippGetName(attr), name ) )
+ 			{
+ 				rv = sv_newmortal();
+-				if( ( attr->value_tag == IPP_TAG_INTEGER ) ||
+-					( attr->value_tag == IPP_TAG_ENUM ) )
++				if( ( ippGetValueTag(attr) == IPP_TAG_INTEGER ) ||
++					( ippGetValueTag(attr) == IPP_TAG_ENUM ) )
+ 				{
+ 					/* We have a number with any luck ... */
+-					sv_setiv( rv, attr->values[0].integer );
++					sv_setiv( rv, ippGetInteger(attr, 0) );
+ 				}
+ 				else
+ 				{
+ 					/* We have a string ... maybe ... try to set it. */
+-					sv_setpv( rv, attr->values[0].string.text );
++					sv_setpv( rv, ippGetString(attr, 0, NULL) );
+ 				}
+ 
+ 				XPUSHs( rv );
