Handle standard and contructed dhcp-ranges on the same interface.
diff --git a/CHANGELOG b/CHANGELOG
index 2908275..d6aa7ff 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -23,6 +23,12 @@
 	which packets should be dumped is given by the --dumpmask
 	option.
 
+	Handle the case of both standard and constructed dhcp-ranges on the
+	same interface better. We don't now contruct a dhcp-range if there's
+	already one specified. This allows the specified interface to
+	have different parameters and avoids advertising the same
+	prefix twice. Thanks to Luis Marsano for spotting this case.
+
 
 version 2.79
 	Fix parsing of CNAME arguments, which are confused by extra spaces.
diff --git a/src/dhcp6.c b/src/dhcp6.c
index 3af747d..0b2f91f 100644
--- a/src/dhcp6.c
+++ b/src/dhcp6.c
@@ -667,23 +667,28 @@
 	end6 = *local;
 	setaddr6part(&end6, addr6part(&template->end6));
 	
+	/* If there's an absolute address context covering this address
+	   then don't contruct one as well. */
 	for (context = daemon->dhcp6; context; context = context->next)
-	  if ((context->flags & CONTEXT_CONSTRUCTED) &&
+	  if (!(context->flags & CONTEXT_TEMPLATE) &&
 	      IN6_ARE_ADDR_EQUAL(&start6, &context->start6) &&
 	      IN6_ARE_ADDR_EQUAL(&end6, &context->end6))
 	    {
-	      int flags = context->flags;
-	      context->flags &= ~(CONTEXT_GC | CONTEXT_OLD);
-	      if (flags & CONTEXT_OLD)
+	      if (context->flags & CONTEXT_CONSTRUCTED)
 		{
-		  /* address went, now it's back */
-		  log_context(AF_INET6, context); 
-		  /* fast RAs for a while */
-		  ra_start_unsolicited(param->now, context);
-		  param->newone = 1; 
-		  /* Add address to name again */
-		  if (context->flags & CONTEXT_RA_NAME)
-		    param->newname = 1;
+		  int cflags = context->flags;
+		  context->flags &= ~(CONTEXT_GC | CONTEXT_OLD);
+		  if (cflags & CONTEXT_OLD)
+		    {
+		      /* address went, now it's back */
+		      log_context(AF_INET6, context); 
+		      /* fast RAs for a while */
+		      ra_start_unsolicited(param->now, context);
+		      param->newone = 1; 
+		      /* Add address to name again */
+		      if (context->flags & CONTEXT_RA_NAME)
+			param->newname = 1;
+		    }
 		}
 	      break;
 	    }