diff --git a/sys/dev/xen/balloon/balloon.c b/sys/dev/xen/balloon/balloon.c
--- a/sys/dev/xen/balloon/balloon.c
+++ b/sys/dev/xen/balloon/balloon.c
@@ -155,7 +155,6 @@
 	vm_page_t      page;
 	long           rc;
 	struct xen_memory_reservation reservation = {
-		.address_bits = 0,
 		.extent_order = 0,
 		.domid        = DOMID_SELF
 	};
@@ -217,7 +216,6 @@
 	int            need_sleep = 0;
 	int ret __diagused;
 	struct xen_memory_reservation reservation = {
-		.address_bits = 0,
 		.extent_order = 0,
 		.domid        = DOMID_SELF
 	};
diff --git a/sys/dev/xen/grant_table/grant_table.c b/sys/dev/xen/grant_table/grant_table.c
--- a/sys/dev/xen/grant_table/grant_table.c
+++ b/sys/dev/xen/grant_table/grant_table.c
@@ -39,6 +39,8 @@
 #include <vm/vm_extern.h>
 #include <vm/pmap.h>
 
+#define grant_entry_t grant_entry_v1_t
+
 /* External tools reserve first few grant table entries. */
 #define NR_RESERVED_ENTRIES 8
 #define GREFS_PER_GRANT_FRAME (PAGE_SIZE / sizeof(grant_entry_t))
diff --git a/sys/dev/xen/privcmd/privcmd.c b/sys/dev/xen/privcmd/privcmd.c
--- a/sys/dev/xen/privcmd/privcmd.c
+++ b/sys/dev/xen/privcmd/privcmd.c
@@ -315,7 +315,7 @@
 	}
 	case IOCTL_PRIVCMD_MMAPBATCH: {
 		struct ioctl_privcmd_mmapbatch *mmap;
-		struct xen_add_to_physmap_range add;
+		struct xen_add_to_physmap_batch add;
 		xen_ulong_t *idxs;
 		xen_pfn_t *gpfns;
 		int *errs;
@@ -338,7 +338,7 @@
 
 		add.domid = DOMID_SELF;
 		add.space = XENMAPSPACE_gmfn_foreign;
-		add.foreign_domid = mmap->dom;
+		add.u.foreign_domid = mmap->dom;
 
 		/*
 		 * The 'size' field in the xen_add_to_physmap_range only
@@ -370,7 +370,7 @@
 			bzero(errs, sizeof(*errs) * num);
 
 			error = HYPERVISOR_memory_op(
-			    XENMEM_add_to_physmap_range, &add);
+			    XENMEM_add_to_physmap_batch, &add);
 			if (error != 0) {
 				error = xen_translate_error(error);
 				goto mmap_out;
diff --git a/sys/x86/xen/xen_intr.c b/sys/x86/xen/xen_intr.c
--- a/sys/x86/xen/xen_intr.c
+++ b/sys/x86/xen/xen_intr.c
@@ -162,7 +162,7 @@
 
 static struct mtx	 xen_intr_isrc_lock;
 static u_int		 xen_intr_auto_vector_count;
-static struct xenisrc	*xen_intr_port_to_isrc[NR_EVENT_CHANNELS];
+static struct xenisrc	*xen_intr_port_to_isrc[EVTCHN_2L_NR_CHANNELS];
 
 /*------------------------- Private Functions --------------------------------*/
 
@@ -310,7 +310,7 @@
 
 	KASSERT(mtx_owned(&xen_intr_isrc_lock), ("Evtchn alloc lock not held"));
 
-	if (xen_intr_auto_vector_count > NR_EVENT_CHANNELS) {
+	if (xen_intr_auto_vector_count > EVTCHN_2L_NR_CHANNELS) {
 		if (!warned) {
 			warned = 1;
 			printf("%s: Event channels exhausted.\n", __func__);
@@ -650,10 +650,10 @@
 xen_intr_alloc_irqs(void)
 {
 
-	if (num_io_irqs > UINT_MAX - NR_EVENT_CHANNELS)
+	if (num_io_irqs > UINT_MAX - EVTCHN_2L_NR_CHANNELS)
 		panic("IRQ allocation overflow (num_msi_irqs too high?)");
 	first_evtchn_irq = num_io_irqs;
-	num_io_irqs += NR_EVENT_CHANNELS;
+	num_io_irqs += EVTCHN_2L_NR_CHANNELS;
 }
 
 /*--------------------------- Common PIC Functions ---------------------------*/
@@ -1284,7 +1284,7 @@
 xen_intr_get_evtchn_from_port(evtchn_port_t port, xen_intr_handle_t *handlep)
 {
 
-	if (!is_valid_evtchn(port) || port >= NR_EVENT_CHANNELS)
+	if (!is_valid_evtchn(port) || port >= EVTCHN_2L_NR_CHANNELS)
 		return (EINVAL);
 
 	if (handlep == NULL) {
@@ -1356,7 +1356,7 @@
 		return;
 	}
 
-	for (i = 0; i < NR_EVENT_CHANNELS; i++) {
+	for (i = 0; i < EVTCHN_2L_NR_CHANNELS; i++) {
 		struct xenisrc *isrc;
 
 		isrc = xen_intr_port_to_isrc[i];
diff --git a/sys/xen/xen-os.h b/sys/xen/xen-os.h
--- a/sys/xen/xen-os.h
+++ b/sys/xen/xen-os.h
@@ -30,7 +30,7 @@
 #ifndef _XEN_XEN_OS_H_
 #define _XEN_XEN_OS_H_
 
-#define  __XEN_INTERFACE_VERSION__ 0x00030208
+#define  __XEN_INTERFACE_VERSION__ 0x00040d00
 
 #define GRANT_REF_INVALID   0xffffffff