diff --git a/OvmfPkg/Include/Library/XenIoMmioLib.h b/OvmfPkg/Include/Library/XenIoMmioLib.h
new file mode 100644
index 000000000000..68d176c680a1
--- /dev/null
+++ b/OvmfPkg/Include/Library/XenIoMmioLib.h
@@ -0,0 +1,64 @@
+/** @file
+*  Manage XenBus device path and I/O handles
+*
+*  Copyright (c) 2015, Linaro Ltd. All rights reserved.<BR>
+*
+*  This program and the accompanying materials are
+*  licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#ifndef _XENIO_MMIO_DEVICE_LIB_H_
+#define _XENIO_MMIO_DEVICE_LIB_H_
+
+/**
+
+  Install the XENBUS_ROOT_DEVICE_PATH and XENIO_PROTOCOL protocols on
+  the handle pointed to by @Handle, or on a new handle if if points to
+  NULL
+
+  @param  Handle                Pointer to the handle to install the protocols
+                                on, may point to a NULL handle.
+
+  @param  GrantTableAddress     The address of the Xen grant table
+
+  @retval EFI_SUCCESS           Protocols were installed successfully
+
+  @retval EFI_OUT_OF_RESOURCES  The function failed to allocate memory required
+                                by the XenIo MMIO and device path protocols
+
+  @return                       Status code returned by the boot service
+                                InstallMultipleProtocolInterfaces ()
+
+**/
+EFI_STATUS
+XenIoMmioInstall (
+  IN OUT   EFI_HANDLE              *Handle,
+  IN       EFI_PHYSICAL_ADDRESS    GrantTableAddress
+  );
+
+
+/**
+
+  Uninstall the XENBUS_ROOT_DEVICE_PATH and XENIO_PROTOCOL protocols
+
+  @param  Handle          Handle onto which the protocols have been installed
+                          earlier by XenIoMmioInstall ()
+
+  @retval EFI_SUCCESS     Protocols were uninstalled successfully
+
+  @return                 Status code returned by the boot service
+                          UninstallMultipleProtocolInterfaces ()
+
+**/
+EFI_STATUS
+XenIoMmioUninstall (
+  IN       EFI_HANDLE              Handle
+  );
+
+#endif
diff --git a/OvmfPkg/Library/XenIoMmioLib/XenIoMmioLib.c b/OvmfPkg/Library/XenIoMmioLib/XenIoMmioLib.c
new file mode 100644
index 000000000000..a2779c7e07f6
--- /dev/null
+++ b/OvmfPkg/Library/XenIoMmioLib/XenIoMmioLib.c
@@ -0,0 +1,166 @@
+/** @file
+*  Manage XenBus device path and I/O handles
+*
+*  Copyright (c) 2015, Linaro Ltd. All rights reserved.<BR>
+*
+*  This program and the accompanying materials are
+*  licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#include <Library/BaseLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/DebugLib.h>
+#include <Library/UefiLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/DevicePathLib.h>
+#include <Library/XenIoMmioLib.h>
+
+#include <Protocol/XenIo.h>
+#include <Guid/XenBusRootDevice.h>
+
+#pragma pack (1)
+typedef struct {
+  VENDOR_DEVICE_PATH                  Vendor;
+  EFI_PHYSICAL_ADDRESS                GrantTableAddress;
+  EFI_DEVICE_PATH_PROTOCOL            End;
+} XENBUS_ROOT_DEVICE_PATH;
+#pragma pack ()
+
+STATIC CONST XENBUS_ROOT_DEVICE_PATH mXenBusRootDevicePathTemplate = {
+  {
+    {
+      HARDWARE_DEVICE_PATH,
+      HW_VENDOR_DP,
+      { sizeof (VENDOR_DEVICE_PATH) + sizeof (EFI_PHYSICAL_ADDRESS), 0 }
+    },
+    XENBUS_ROOT_DEVICE_GUID,
+  },
+  0,
+  {
+    END_DEVICE_PATH_TYPE,
+    END_ENTIRE_DEVICE_PATH_SUBTYPE,
+    { sizeof (EFI_DEVICE_PATH_PROTOCOL), 0 }
+  }
+};
+
+/**
+
+  Install the XENBUS_ROOT_DEVICE_PATH and XENIO_PROTOCOL protocols on
+  the handle pointed to by @Handle, or on a new handle if if points to
+  NULL
+
+  @param  Handle                Pointer to the handle to install the protocols
+                                on, may point to a NULL handle.
+
+  @param  GrantTableAddress     The address of the Xen grant table
+
+  @retval EFI_SUCCESS           Protocols were installed successfully
+
+  @retval EFI_OUT_OF_RESOURCES  The function failed to allocate memory required
+                                by the XenIo MMIO and device path protocols
+
+  @return                       Status code returned by the boot service
+                                InstallMultipleProtocolInterfaces ()
+
+**/
+EFI_STATUS
+XenIoMmioInstall (
+  IN OUT   EFI_HANDLE              *Handle,
+  IN       EFI_PHYSICAL_ADDRESS    GrantTableAddress
+  )
+{
+  EFI_STATUS                     Status;
+  XENIO_PROTOCOL                 *XenIo;
+  XENBUS_ROOT_DEVICE_PATH        *XenBusDevicePath;
+  EFI_HANDLE                     OutHandle;
+
+  ASSERT (Handle != NULL);
+
+  OutHandle = *Handle;
+
+  XenIo = AllocateZeroPool (sizeof *XenIo);
+  if (!XenIo) {
+    return EFI_OUT_OF_RESOURCES;
+  }
+  XenIo->GrantTableAddress = GrantTableAddress;
+
+  XenBusDevicePath = AllocateCopyPool (sizeof *XenBusDevicePath,
+                       &mXenBusRootDevicePathTemplate);
+  if (!XenBusDevicePath) {
+    DEBUG ((EFI_D_ERROR, "%a: Out of memory\n", __FUNCTION__));
+    Status = EFI_OUT_OF_RESOURCES;
+    goto FreeXenIo;
+  }
+  XenBusDevicePath->GrantTableAddress = GrantTableAddress;
+
+  Status = gBS->InstallMultipleProtocolInterfaces (&OutHandle,
+                  &gEfiDevicePathProtocolGuid, XenBusDevicePath,
+                  &gXenIoProtocolGuid, XenIo,
+                  NULL);
+  if (!EFI_ERROR (Status)) {
+    *Handle = OutHandle;
+    return EFI_SUCCESS;
+  }
+  
+  DEBUG ((EFI_D_ERROR, "%a: Failed to install the EFI_DEVICE_PATH and "
+    "XENIO_PROTOCOL protocols on handle %p (Status == %r)\n",
+    __FUNCTION__, OutHandle, Status));
+
+  FreePool (XenBusDevicePath);
+
+FreeXenIo:
+  FreePool (XenIo);
+  return Status;
+}
+
+/**
+
+  Uninstall the XENBUS_ROOT_DEVICE_PATH and XENIO_PROTOCOL protocols
+
+  @param  Handle          Handle onto which the protocols have been installed
+                          earlier by XenIoMmioInstall ()
+
+  @retval EFI_SUCCESS     Protocols were uninstalled successfully
+
+  @return                 Status code returned by the boot service
+                          UninstallMultipleProtocolInterfaces ()
+
+**/
+EFI_STATUS
+XenIoMmioUninstall (
+  IN       EFI_HANDLE              Handle
+  )
+{
+  EFI_STATUS    Status;
+  VOID          *XenIo;
+  VOID          *XenBusDevicePath;
+
+  XenBusDevicePath = NULL;
+  gBS->OpenProtocol (Handle, &gEfiDevicePathProtocolGuid, &XenBusDevicePath,
+         NULL, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);
+
+  XenIo = NULL;
+  gBS->OpenProtocol (Handle, &gXenIoProtocolGuid, &XenIo,
+         NULL, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);
+
+  Status = gBS->UninstallMultipleProtocolInterfaces (Handle,
+                  &gEfiDevicePathProtocolGuid, XenBusDevicePath,
+                  &gXenIoProtocolGuid, XenIo,
+                  NULL);
+
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+
+  FreePool (XenBusDevicePath);
+  FreePool (XenIo);
+
+  return EFI_SUCCESS;
+}
diff --git a/OvmfPkg/Library/XenIoMmioLib/XenIoMmioLib.inf b/OvmfPkg/Library/XenIoMmioLib/XenIoMmioLib.inf
new file mode 100644
index 000000000000..16cc4530355e
--- /dev/null
+++ b/OvmfPkg/Library/XenIoMmioLib/XenIoMmioLib.inf
@@ -0,0 +1,39 @@
+## @file
+#  Manage XenBus device path and I/O handles
+#
+#  Copyright (c) 2015, Linaro Ltd. All rights reserved.<BR>
+#
+#  This program and the accompanying materials
+#  are licensed and made available under the terms and conditions of the BSD License
+#  which accompanies this distribution. The full text of the license may be found at
+#  http://opensource.org/licenses/bsd-license.php.
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#
+##
+
+[Defines]
+  INF_VERSION                    = 0x00010005
+  BASE_NAME                      = XenIoMmioLib
+  FILE_GUID                      = de9bdc19-8434-47bb-be3c-7f28f2101fd0
+  MODULE_TYPE                    = DXE_DRIVER
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = XenIoMmioLib
+
+[Sources]
+  XenIoMmioLib.c
+
+[Packages]
+  MdePkg/MdePkg.dec
+  OvmfPkg/OvmfPkg.dec
+
+[LibraryClasses]
+  BaseMemoryLib
+
+[Guids]
+  gXenBusRootDeviceGuid
+
+[Protocols]
+  gEfiDevicePathProtocolGuid
+  gXenIoProtocolGuid
diff --git a/OvmfPkg/OvmfPkg.dec b/OvmfPkg/OvmfPkg.dec
index d61600225919..4cb70dc98e79 100644
--- a/OvmfPkg/OvmfPkg.dec
+++ b/OvmfPkg/OvmfPkg.dec
@@ -48,6 +48,10 @@
   #
   XenHypercallLib|Include/Library/XenHypercallLib.h
 
+  ##  @libraryclass  Manage XenBus device path and I/O handles
+  #
+  XenIoMmioLib|Include/Library/XenIoMmioLib.h
+
 [Guids]
   gUefiOvmfPkgTokenSpaceGuid      = {0x93bb96af, 0xb9f2, 0x4eb8, {0x94, 0x62, 0xe0, 0xba, 0x74, 0x56, 0x42, 0x36}}
   gEfiXenInfoGuid                 = {0xd3b46f3b, 0xd441, 0x1244, {0x9a, 0x12, 0x0, 0x12, 0x27, 0x3f, 0xc1, 0x4d}}
