diff --git a/MdePkg/Include/Protocol/NvmExpressPassThru.h b/MdePkg/Include/Protocol/NvmExpressPassThru.h
new file mode 100644
index 0000000..e9b0a5e
--- /dev/null
+++ b/MdePkg/Include/Protocol/NvmExpressPassThru.h
@@ -0,0 +1,259 @@
+/** @file
+  The EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL provides services that allow NVM Express commands
+  to be sent to an NVM Express controller or to a specific namespace in a NVM Express controller.
+
+  Copyright (c) 2014 - 2015, American Megatrends, Inc. 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 __EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL_H__
+#define __EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL_H__
+
+typedef struct _EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL;
+
+#define EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL_GUID \
+  {0x52c78312, 0x8edc, 0x4233, { 0x98, 0xf2, 0x1a, 0x1a, 0xa5, 0xe3, 0x88, 0xa5 } }
+
+///
+/// If this bit is set, then the EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL interface
+/// is for directly addressable namespaces.
+///
+#define EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_PHYSICAL      0x0001
+///
+/// If this bit is set, then the EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL interface
+/// is for a single volume logical namespace comprised of multiple namespaces.
+///
+#define EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_LOGICAL       0x0002
+///
+/// If this bit is set, then the EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL interface
+/// supports non-blocking I/O.
+///
+#define EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_NONBLOCKINGIO 0x0004
+///
+/// If this bit is set, then the EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL interface
+/// supports NVM command set.
+///
+#define EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_CMD_SET_NVME  0x0008
+
+///
+/// FusedOperation
+///
+///@{
+#define NORMAL_CMD          0x00
+#define FUSED_FIRST_CMD     0x01
+#define FUSED_SECOND_CMD    0x02
+///@}
+
+///
+/// Flags
+///
+///@{
+#define CDW2_VALID       0x01
+#define CDW3_VALID       0x02
+#define CDW10_VALID      0x04
+#define CDW11_VALID      0x08
+#define CDW12_VALID      0x10
+#define CDW13_VALID      0x20
+#define CDW14_VALID      0x40
+#define CDW15_VALID      0x80
+///@}
+
+typedef struct {
+  UINT32    Attributes;
+  UINT32    IoAlign;
+  UINT32    NvmeVersion;
+} EFI_NVM_EXPRESS_PASS_THRU_MODE;
+
+typedef struct { 
+  UINT8    OpCode;
+  UINT8    FusedOperation;
+  UINT16   Unused;
+} NVME_CDW0;
+
+typedef struct {
+  NVME_CDW0  Cdw0;
+  UINT8      Flags;
+  UINT32     Nsid;
+  UINT32     Cdw2;
+  UINT32     Cdw3;
+  UINT32     Cdw10;
+  UINT32     Cdw11;
+  UINT32     Cdw12;
+  UINT32     Cdw13;
+  UINT32     Cdw14;
+  UINT32     Cdw15;
+} EFI_NVM_EXPRESS_COMMAND;
+
+///
+/// This structure maps to the NVM Express specification Completion Queue Entry 
+///
+typedef struct { 
+  UINT32    DW0;
+  UINT32    DW1;
+  UINT32    DW2;
+  UINT32    DW3;
+} EFI_NVM_EXPRESS_COMPLETION;
+
+typedef struct _EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET {
+  /// The timeout, in 100 ns units, to use for the execution of this 
+  /// NVM Express Command Packet. A Timeout value of 0 means that this 
+  /// function will wait indefinitely for the command to execute. 
+  /// If Timeout is greater than zero, then this function will return 
+  /// EFI_TIMEOUT if the time required to execute the NVM Express 
+  /// command is greater than Timeout
+  UINT64                      CommandTimeout;
+  /// 
+  /// A pointer to the data buffer to transfer between the host, and the 
+  /// NVM Express controller for read, write, and bi-directional commands
+  ///
+  VOID                        *TransferBuffer;
+  ///
+  /// On input, the size in bytes of TransferBuffer. On output, the number
+  /// of bytes transferred to the NVM Express controller, or namespace
+  ///
+  UINT32                      TransferLength;
+  ///
+  /// A pointer to the optional metadata buffer to transfer between the host,
+  /// and the NVM Express controller.If this field is not NULL, then it must
+  /// be aligned on the boundary specified by the IoAlign field in the 
+  /// EFI_NVM_EXPRESS_PASS_THRU_MODE structure.
+  ///
+  VOID                        *MetaDataBuffer;
+  ///
+  /// On Input, the size in bytes of MetadataBuffer. On output, the number 
+  /// of bytes transferred to/from the NVM Express controller, or namespace
+  ///
+  UINT32                      MetadataLength;
+  ///
+  /// The type of the queue that the NVMe command should be posted to.
+  /// A value of 0 indicates it should be posted to the Admin Submission Queue.
+  /// A value of 1 indicates it should be posted to an I/O Submission Queue
+  ///
+  UINT16                      QueueType;
+  ///
+  /// A pointer to an NVM Express Command Packet.
+  ///
+  EFI_NVM_EXPRESS_COMMAND     *NvmeCmd;
+  ///
+  /// The raw NVM Express completion queue 
+  ///
+  EFI_NVM_EXPRESS_COMPLETION  *NvmeCompletion;
+} EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET;
+
+/**
+    Sends an NVM Express Command Packet to an NVM Express controller or namespace
+
+    @param This         A pointer to the EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL instance
+    @param NamespaceId  A 32 bit namespace ID as defined in the NVMe specification 
+                        to which the NVM Express Command Packet will be sent.  
+    @param Packet       A pointer to the NVM Express Command Packet to send to
+                        the NVMe namespace specified by NamespaceId. 
+    @param Event        Event to be signalled when the NVM Express Command Packet completes
+                        and non-blocking I/O is supported
+
+    @retval EFI_SUCCESS          The NVM Express Command Packet was sent by the host successfully
+    @retval EFI_BAD_BUFFER_SIZE  The number of bytes that could be transferred is not valid
+    @retval EFI_NOT_READY        The NVM Express Command Packet could not be sent as the controller
+                                 is not ready
+    @retval EFI_DEVICE_ERROR     Device error
+    @retval EFI_UNSUPPORTED      The command described by the NVM Express Command Packet is not 
+                                 supported by the host adapter
+    @retval EFI_TIMEOUT          A timeout occurred while waiting for the NVM Express Command Packet
+                                 to execute
+
+**/
+typedef
+EFI_STATUS 
+(EFIAPI *EFI_NVM_EXPRESS_PASS_THRU_PASSTHRU) ( 
+  IN EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL            *This,
+  IN UINT32                                        NamespaceId,
+  IN OUT EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET  *Packet,
+  IN EFI_EVENT                                     Event
+  );
+
+/**
+    Used to retrieve the next namespace ID for this NVM Express controller.  
+
+    @param This         A pointer to the EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL instance
+    @param NamespaceId  On input, a pointer to a valid namespace ID on this NVM Express controller
+	                    or a pointer to the value 0xFFFFFFFF. A pointer to the value 0xFFFFFFFF retrieves 
+						the first valid namespace ID on this NVM Express controller.
+
+    @retval EFI_SUCCESS   The Namespace ID of the next Namespace was returned
+    @retval EFI_NOT_FOUND There are no more namespaces defined on this controller
+    @retval EFI_INVALID_PARAMETER The Namespace ID was not valid
+
+**/
+typedef 
+EFI_STATUS
+(EFIAPI *EFI_NVM_EXPRESS_PASS_THRU_GET_NEXT_NAMESPACE) (
+  IN EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL    *This,
+  IN OUT UINT32                            *NamespaceId
+  );
+
+/**
+    Used to allocate and build a device path node for an NVM Express namespace 
+    on an NVM Express controller
+
+    @param This         A pointer to the EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL instance
+    @param NamespaceId  The NVM Express namespace ID for which a device path node is
+                        to be allocated and built
+    @param DevicePath   A pointer to a single device path node that describes the 
+                        NVM Express namespace specified by NamespaceId. 
+						This function is responsible for allocating the buffer DevicePath
+						with the boot service AllocatePool(). It is the caller’s responsibility
+						to free DevicePath when the caller is finished with DevicePath.
+
+    @retval EFI_SUCCESS           The device path node that describes the NVM Express 
+                                  namespace specified by NamespaceId was allocated and 
+                                  returned in DevicePath
+    @retval EFI_NOT_FOUND         The NamespaceIdis not valid
+    @retval EFI_INVALID_PARAMETER DevicePath is NULL
+    @retval EFI_OUT_OF_RESOURCES  There are not enough resources to allocate the 
+                                  DevicePath node.
+**/
+typedef
+EFI_STATUS 
+(EFIAPI *EFI_NVM_EXPRESS_PASS_THRU_BUILD_DEVICE_PATH) (
+  IN EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL    *This,
+  IN UINT32                                NamespaceId,
+  IN OUT EFI_DEVICE_PATH_PROTOCOL          **DevicePath
+  ); 
+
+/**
+    Used to translate a device path node to a namespace ID
+    
+    @param This         A pointer to the EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL instance
+    @param DevicePath   A pointer to the device path node that describes an NVM 
+                        Express namespace on the NVM Express controller. 
+    @param NamespaceId  The NVM Express namespace ID contained in the device path node
+ 
+    @retval EFI_SUCCESS    Namespace ID is returned in NamespaceID
+
+**/
+typedef
+EFI_STATUS 
+(EFIAPI *EFI_NVM_EXPRESS_PASS_THRU_GET_NAMESPACE) (
+  IN EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL    *This,
+  IN EFI_DEVICE_PATH_PROTOCOL              *DevicePath,
+  OUT UINT32                               *NamespaceId
+  ); 
+
+struct _EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL {
+  EFI_NVM_EXPRESS_PASS_THRU_MODE                 *Mode;
+  EFI_NVM_EXPRESS_PASS_THRU_PASSTHRU             PassThru;
+  EFI_NVM_EXPRESS_PASS_THRU_GET_NEXT_NAMESPACE   GetNextNamespace;
+  EFI_NVM_EXPRESS_PASS_THRU_BUILD_DEVICE_PATH    BuildDevicePath;
+  EFI_NVM_EXPRESS_PASS_THRU_GET_NAMESPACE        GetNameSpace;
+};
+
+extern EFI_GUID gEfiNvmExpressPassThruProtocolGuid;
+
+#endif
diff --git a/MdePkg/Include/Protocol/SmartCardReader.h b/MdePkg/Include/Protocol/SmartCardReader.h
new file mode 100644
index 0000000..71a7e9e
--- /dev/null
+++ b/MdePkg/Include/Protocol/SmartCardReader.h
@@ -0,0 +1,268 @@
+/** @file
+  Smart card aware application invokes this protocol to get access to an inserted smart card in the
+  reader or to the reader itself.
+
+  Copyright (c) 2014 - 2015, American Megatrends, Inc. 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 __EFI_SMART_CARD_READER_PROTOCOL_H__
+#define __EFI_SMART_CARD_READER_PROTOCOL_H__
+
+typedef struct _EFI_SMART_CARD_READER_PROTOCOL EFI_SMART_CARD_READER_PROTOCOL;
+
+#define EFI_SMART_CARD_READER_PROTOCOL_GUID \
+  {0x2a4d1adf, 0x21dc, 0x4b81, {0xa4, 0x2f, 0x8b, 0x8e, 0xe2, 0x38, 0x00, 0x60} }
+
+//
+// Codes for access mode
+//
+///@{
+#define SCARD_AM_READER 0x0001 // Exclusive access to reader
+#define SCARD_AM_CARD 0x0002 // Exclusive access to card
+///@}
+
+//
+// Codes for card action
+//
+///@{
+#define SCARD_CA_NORESET 0x0000 // Don’t reset card
+#define SCARD_CA_COLDRESET 0x0001 // Perform a cold reset
+#define SCARD_CA_WARMRESET 0x0002 // Perform a warm reset
+#define SCARD_CA_UNPOWER 0x0003 // Power off the card
+#define SCARD_CA_EJECT 0x0004 // Eject the card
+///@}
+
+//
+// Protocol types
+//
+///@{
+#define SCARD_PROTOCOL_UNDEFINED 0x0000
+#define SCARD_PROTOCOL_T0 0x0001
+#define SCARD_PROTOCOL_T1 0x0002
+#define SCARD_PROTOCOL_RAW 0x0004
+///@}
+
+//
+// Codes for state type
+//
+///@{
+#define SCARD_UNKNOWN 0x0000 ///< state is unknown
+#define SCARD_ABSENT 0x0001 ///< Card is absent
+#define SCARD_INACTIVE 0x0002 ///< Card is present and not powered
+#define SCARD_ACTIVE 0x0003 ///< Card is present and powered
+///@}
+
+//
+// Macro to generate a ControlCode & PC/SC part 10 control code
+//
+///@{
+#define SCARD_CTL_CODE(code) (0x42000000 + (code))
+#define CM_IOCTL_GET_FEATURE_REQUEST SCARD_CTL_CODE(3400)
+///@}
+
+/**
+    This function requests connection to the smart card or the reader, using the appropriate reset type
+    and protocol.
+
+    @param This               A pointer to the EFI_SMART_CARD_READER_PROTOCOL instance
+    @param AccessMode         Access mode (SCARD_AM_READER or SCARD_AM_CARD)
+    @param CardAction         Card action(reset type) that that has to be performed
+                              (SCARD_CA_NORESET, SCARD_CA_COLDRESET or SCARD_CA_WARMRESET)
+    @param PreferredProtocols Bit mask of acceptable protocols
+    @param ActiveProtocol     A flag that indicates the active protocol
+
+    @retval EFI_SUCCESS           The requested command completed successfully
+    @retval EFI_INVALID_PARAMETER Either AccessMode or CardAction is not valid or
+                                  invalid combination of AccessMode/CardAction/PreferredProtocols
+    @retval EFI_NOT_READY         A smart card is inserted but failed to return an ATR
+    @retval EFI_DEVICE_ERROR      Any other error condition, typically a reader removal
+    @retval EFI_ACCESS_DENIED     Access is already locked by a previous SCardConnect call
+    @retval EFI_NO_MEDIA          AccessMode is set to SCARD_AM_CARD but there is no smart
+                                  card inserted
+    @retval EFI_UNSUPPORTED       PreferredProtocols does not contain an available protocol to use
+
+**/
+typedef
+EFI_STATUS
+(*EFI_SMART_CARD_READER_PROTOCOL_CONNECT) (
+  IN EFI_SMART_CARD_READER_PROTOCOL *This,
+  IN UINT32                         AccessMode,
+  IN UINT32                         CardAction,
+  IN UINT32                         PreferredProtocols,
+  OUT UINT32                        *ActiveProtocol
+  );
+
+/**
+    This function releases a connection previously taken by SCardConnect.
+
+    @param This        A pointer to the EFI_SMART_CARD_READER_PROTOCOL instance
+    @param CardAction  Card action(reset type) that that has to be performed
+	                   (SCARD_CA_NORESET, SCARD_CA_COLDRESET or SCARD_CA_WARMRESE
+
+    @retval EFI_SUCCESS           The requested command completed successfully
+    @retval EFI_INVALID_PARAMETER CardAction value is unknown 
+    @retval EFI_DEVICE_ERROR      Any other error condition, typically a reader removal
+    @retval EFI_UNSUPPORTED       Reader does not support Eject card feature (disconnect was not
+                                  performed).
+
+**/
+typedef
+EFI_STATUS
+(*EFI_SMART_CARD_READER_PROTOCOL_DISCONNECT) (
+  IN EFI_SMART_CARD_READER_PROTOCOL *This,
+  IN UINT32                         CardAction
+  );
+
+/**
+    This function retrieves some basic information about the smart card and reader.
+
+    @param This              A pointer to the EFI_SMART_CARD_READER_PROTOCOL instance
+    @param ReaderName        A pointer to a NULL terminated string that will contain the reader name
+    @param ReaderNameLength  On input, a pointer to the variable that holds the maximal size of 
+                             ReaderName in bytes.
+							 On output, the actual size, in bytes, of the returned ReaderName string.
+    @param State             Current state of the smart card reader
+    @param CardProtocol      Current protocol used to communicate with the smart card
+    @param Atr               Pointer to retrieve the ATR of the smart card
+    @param AtrLength         On input, a pointer to hold the maximum size, in bytes, of Atr (usually 33).
+                             On output, the required size, in bytes, for the smart card ATR
+
+    @retval EFI_SUCCESS           The requested command completed successfully.
+    @retval EFI_INVALID_PARAMETER Atr is not NULL but AtrLength is NULL or
+                                  ReaderName is not NULL but ReaderNameLength is NULL
+    @retval EFI_DEVICE_ERROR      Any other error condition, typically a reader removal
+    @retval EFI_BUFFER_TOO_SMALL  ReaderNameLength is not big enough to hold the reader name.
+                                  ReaderNameLength has been updated to the required value
+                                  or 
+                                  AtrLength is not big enough to hold the ATR.
+                                  AtrLength has been updated to the required value.
+
+**/
+typedef
+EFI_STATUS
+(*EFI_SMART_CARD_READER_PROTOCOL_STATUS) (
+  IN EFI_SMART_CARD_READER_PROTOCOL *This,
+  OUT CHAR16                        *ReaderName,
+  IN OUT UINTN                      *ReaderNameLength,
+  OUT UINT32                        *State,
+  OUT UINT32                        *CardProtocol,
+  OUT UINT8                         *Atr,
+  IN OUT UINTN                      *AtrLength
+  );
+
+/**
+    This function sends a command to the card or reader and returns its response.
+
+    @param This         A pointer to the EFI_SMART_CARD_READER_PROTOCOL instance
+    @param CAPDU        Pointer to a byte array that contains the Command APDU to 
+                        send to the smart card or reader
+    @param CAPDULength  Command APDU size in bytes
+    @param RAPDU        Pointer to a byte array that will contain the Response APDU
+    @param RAPDULength  On input, the maximum size of the Response APDU in bytes
+                        On output, the size of the Response APDU in bytes
+
+    @retval EFI_SUCCESS           The requested command completed successfully.
+    @retval EFI_INVALID_PARAMETER CAPDU is NULL or CAPDULength is 0. 
+    @retval EFI_DEVICE_ERROR      Any other error condition, typically a reader removal
+    @retval EFI_NO_MEDIA          There is no card in the reader.
+    @retval EFI_BUFFER_TOO_SMALL  RAPDULength is not big enough to hold the response APDU.
+                                  RAPDULength has been updated to the required value.
+    @retval EFI_TIMEOUT           The reader did not respond
+    @retval EFI_ACCESS_DENIED     A communication with the reader/card is already pending
+    @retval EFI_NOT_READY         Card is not powered
+
+**/
+typedef
+EFI_STATUS
+(*EFI_SMART_CARD_READER_PROTOCOL_TRANSMIT) (
+  IN EFI_SMART_CARD_READER_PROTOCOL *This,
+  IN UINT8                          *CAPDU,
+  IN UINTN                          CAPDULength,
+  OUT UINT8                         *RAPDU,
+  IN OUT UINTN                      *RAPDULength
+  );
+
+/**
+    This function provides direct access to the reader.
+
+    @param This            A pointer to the EFI_SMART_CARD_READER_PROTOCOL instance
+    @param ControlCode     Control code for the operation to perform
+    @param InBuffer        Pointer to the input parameters
+    @param InBufferLength  Size of the input parameters in bytes
+    @param OutBuffer       Pointer to the output parameters
+    @param OutBufferLength On input, maximal size to store output parameters in bytes
+                           On output, the size of output parameters in bytes
+
+    @retval EFI_SUCCESS           The requested command completed successfully
+    @retval EFI_INVALID_PARAMETER OutBuffer is not NULL but OutBufferLength is NULL or
+                                  ControlCode is not supported.
+    @retval EFI_DEVICE_ERROR      Any other error condition, typically a reader removal
+    @retval EFI_NO_MEDIA          There is no card in the reader and the control code specified requires
+                                  one
+    @retval EFI_BUFFER_TOO_SMALL  OutBufferLength is not big enough to hold the output
+                                  parameters. OutBufferLength has been updated to the required value
+    @retval EFI_TIMEOUT           The reader did not respond
+    @retval EFI_ACCESS_DENIED     A communication with the reader/card is already pending
+    @retval EFI_NOT_READY         ControlCode requires a powered card to operate
+    @retval EFI_PROTOCOL_ERROR    A protocol error has occurred   
+**/
+typedef
+EFI_STATUS
+(*EFI_SMART_CARD_READER_PROTOCOL_CONTROL) (
+  IN EFI_SMART_CARD_READER_PROTOCOL *This,
+  IN UINT32                         ControlCode,
+  IN UINT8                          *InBuffer,
+  IN UINTN                          *InBufferLength,
+  OUT UINT8                         *OutBuffer,
+  IN OUT UINTN                      *OutBufferLength
+  );
+
+/**
+    This function retrieves a reader or smart card attribute.
+
+    @param This            A pointer to the EFI_SMART_CARD_READER_PROTOCOL instance
+    @param Attrib          Identifier for the attribute to retrieve
+    @param OutBuffer       Pointer to a buffer that will contain attribute data
+    @param OutBufferLength On input, maximal size to store attribute data in bytes
+                           On output, the size of the attribute data in bytes
+
+    @retval EFI_SUCCESS           The requested command completed successfully.
+    @retval EFI_INVALID_PARAMETER OutBuffer is NULL or OutBufferLength is 0
+    @retval EFI_UNSUPPORTED       Attrib is not supported                                 
+    @retval EFI_NO_MEDIA          There is no card in the reader and Attrib value requires one
+    @retval EFI_BUFFER_TOO_SMALL  OutBufferLength is not big enough to hold the output
+                                  parameters. OutBufferLength has been updated to the required value
+    @retval EFI_PROTOCOL_ERROR    A protocol error has occurred
+    @retval EFI_TIMEOUT           The reader did not respond
+    @retval EFI_NOT_READY         Attrib requires a powered card to operate
+    @retval EFI_DEVICE_ERROR      Any other error condition, typically a reader removal
+**/
+typedef
+EFI_STATUS
+(*EFI_SMART_CARD_READER_PROTOCOL_GET_ATTRIB) (
+  IN EFI_SMART_CARD_READER_PROTOCOL *This,
+  IN UINT32                         Attrib,
+  OUT UINT8                         *OutBuffer,
+  IN OUT UINTN                      *OutBufferLength
+  );
+
+typedef struct _EFI_SMART_CARD_READER_PROTOCOL {
+  EFI_SMART_CARD_READER_PROTOCOL_CONNECT       SCardConnect;
+  EFI_SMART_CARD_READER_PROTOCOL_DISCONNECT    SCardDisConnect;
+  EFI_SMART_CARD_READER_PROTOCOL_STATUS        SCardStatus;
+  EFI_SMART_CARD_READER_PROTOCOL_TRANSMIT      ScardTransmit;
+  EFI_SMART_CARD_READER_PROTOCOL_CONTROL       SCardControl;
+  EFI_SMART_CARD_READER_PROTOCOL_GET_ATTRIB    SCardGetAttrib;
+};
+
+extern EFI_GUID gEfiSmartCardReaderProtocolGuid;
+
+#endif
diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec
index 494dfba..c2bdae3 100644
--- a/MdePkg/MdePkg.dec
+++ b/MdePkg/MdePkg.dec
@@ -1393,6 +1393,15 @@
   ## Include/Protocol/AdapterInformation.h
   gEfiAdapterInformationProtocolGuid	 = { 0xE5DD1403, 0xD622, 0xC24E, {0x84, 0x88, 0xC7, 0x1B, 0x17, 0xF5, 0xE8, 0x02 }}
 
+  #
+  # Protocols defined in UEFI2.5
+  #
+  ## Include/Protocol/NvmExpressPassThru.h
+  gEfiNvmExpressPassThruProtocolGuid   = {0x52c78312, 0x8edc, 0x4233, { 0x98, 0xf2, 0x1a, 0x1a, 0xa5, 0xe3, 0x88, 0xa5 } }
+  
+  ## Include/Protocol/SmartCardReader.h
+  gEfiSmartCardReaderProtocolGuid      = {0x2a4d1adf, 0x21dc, 0x4b81, {0xa4, 0x2f, 0x8b, 0x8e, 0xe2, 0x38, 0x00, 0x60} }
+  
 #
 # [Error.gEfiMdePkgTokenSpaceGuid]
 #   0x80000001 | Invalid value provided.
