diff --git a/src/acpica/source/common/dmrestag.c b/src/acpica/source/common/dmrestag.c
index cc1aece..6f12f74 100644
--- a/src/acpica/source/common/dmrestag.c
+++ b/src/acpica/source/common/dmrestag.c
@@ -738,6 +738,7 @@ AcpiGetTagPathname (
     Status = AcpiNsBuildExternalPath (BufferNode, RequiredSize, Pathname);
     if (ACPI_FAILURE (Status))
     {
+        ACPI_FREE (Pathname);
         return (NULL);
     }
 
diff --git a/src/acpica/source/common/dmtable.c b/src/acpica/source/common/dmtable.c
index 35767c1..b1f2e77 100644
--- a/src/acpica/source/common/dmtable.c
+++ b/src/acpica/source/common/dmtable.c
@@ -172,6 +172,7 @@ static const char           *AcpiDmEinjActions[] =
     "Execute Operation",
     "Check Busy Status",
     "Get Command Status",
+    "Set Error Type With Address",
     "Unknown Action"
 };
 
@@ -182,6 +183,7 @@ static const char           *AcpiDmEinjInstructions[] =
     "Write Register",
     "Write Register Value",
     "Noop",
+    "Flush Cacheline",
     "Unknown Instruction"
 };
 
@@ -252,6 +254,8 @@ static const char           *AcpiDmHestNotifySubnames[] =
     "Local Interrupt",
     "SCI",
     "NMI",
+    "CMCI",                         /* ACPI 5.0 */
+    "MCE",                          /* ACPI 5.0 */
     "Unknown Notify Type"           /* Reserved */
 };
 
@@ -816,6 +820,11 @@ AcpiDmDumpTable (
             ByteLength = 8;
             break;
 
+        case ACPI_DMT_BUF10:
+
+            ByteLength = 10;
+            break;
+
         case ACPI_DMT_BUF16:
         case ACPI_DMT_UUID:
 
@@ -934,6 +943,7 @@ AcpiDmDumpTable (
             break;
 
         case ACPI_DMT_BUF7:
+        case ACPI_DMT_BUF10:
         case ACPI_DMT_BUF16:
         case ACPI_DMT_BUF128:
             /*
diff --git a/src/acpica/source/common/dmtbdump.c b/src/acpica/source/common/dmtbdump.c
index 3d7ac6d..84c646a 100644
--- a/src/acpica/source/common/dmtbdump.c
+++ b/src/acpica/source/common/dmtbdump.c
@@ -944,6 +944,7 @@ AcpiDmDumpDmar (
         {
             return;
         }
+        AcpiOsPrintf ("\n");
 
         switch (SubTable->Type)
         {
@@ -996,6 +997,7 @@ AcpiDmDumpDmar (
             {
                 return;
             }
+            AcpiOsPrintf ("\n");
 
             /* Dump the PCI Path entries for this device scope */
 
@@ -1013,6 +1015,7 @@ AcpiDmDumpDmar (
 
                 PathOffset += 2;
                 PciPath += 2;
+                AcpiOsPrintf ("\n");
             }
 
             /* Point to next device scope entry */
diff --git a/src/acpica/source/common/dmtbinfo.c b/src/acpica/source/common/dmtbinfo.c
index 743c654..def6de8 100644
--- a/src/acpica/source/common/dmtbinfo.c
+++ b/src/acpica/source/common/dmtbinfo.c
@@ -852,6 +852,7 @@ ACPI_DMTABLE_INFO           AcpiDmTableInfoDmar[] =
 {
     {ACPI_DMT_UINT8,    ACPI_DMAR_OFFSET (Width),                   "Host Address Width", 0},
     {ACPI_DMT_UINT8,    ACPI_DMAR_OFFSET (Flags),                   "Flags", 0},
+    {ACPI_DMT_BUF10,    ACPI_DMAR_OFFSET (Reserved[0]),             "Reserved", 0},
     ACPI_DMT_TERMINATOR
 };
 
diff --git a/src/acpica/source/compiler/aslcompile.c b/src/acpica/source/compiler/aslcompile.c
index 4932abd..3d5a1a5 100644
--- a/src/acpica/source/compiler/aslcompile.c
+++ b/src/acpica/source/compiler/aslcompile.c
@@ -1038,7 +1038,19 @@ CmCleanupAndExit (
 
     /* Close all open files */
 
-    Gbl_Files[ASL_FILE_PREPROCESSOR].Handle = NULL; /* the .i file is same as source file */
+    /*
+     * Take care with the preprocessor file (.i), it might be the same
+     * as the "input" file, depending on where the compiler has terminated
+     * or aborted. Prevent attempt to close the same file twice in
+     * loop below.
+     */
+    if (Gbl_Files[ASL_FILE_PREPROCESSOR].Handle ==
+        Gbl_Files[ASL_FILE_INPUT].Handle)
+    {
+        Gbl_Files[ASL_FILE_PREPROCESSOR].Handle = NULL;
+    }
+
+    /* Close the standard I/O files */
 
     for (i = ASL_FILE_INPUT; i < ASL_MAX_FILE_TYPE; i++)
     {
diff --git a/src/acpica/source/compiler/aslmessages.h b/src/acpica/source/compiler/aslmessages.h
index 586afca..16c1d94 100644
--- a/src/acpica/source/compiler/aslmessages.h
+++ b/src/acpica/source/compiler/aslmessages.h
@@ -320,7 +320,7 @@ typedef enum
     ASL_MSG_TOO_MANY_ARGUMENTS,
     ASL_MSG_UNKNOWN_DIRECTIVE,
     ASL_MSG_UNKNOWN_PRAGMA,
-
+    ASL_MSG_WARNING_DIRECTIVE,
 
     /* These messages are used by the data table compiler only */
 
@@ -505,6 +505,7 @@ char                        *AslMessages [] =
 /*    ASL_MSG_TOO_MANY_ARGUMENTS */         "Too many macro arguments",
 /*    ASL_MSG_UNKNOWN_DIRECTIVE */          "Unknown directive",
 /*    ASL_MSG_UNKNOWN_PRAGMA */             "Unknown pragma",
+/*    ASL_MSG_WARNING_DIRECTIVE */          "#warning",
 
 /* Table compiler */
 
diff --git a/src/acpica/source/compiler/asltree.c b/src/acpica/source/compiler/asltree.c
index 2fb249b..59cea2b 100644
--- a/src/acpica/source/compiler/asltree.c
+++ b/src/acpica/source/compiler/asltree.c
@@ -895,6 +895,7 @@ TrLinkChildren (
         {
             AslError (ASL_WARNING, ASL_MSG_COMPILER_INTERNAL, Child,
                 "Child node list invalid");
+            va_end(ap);
             return (Op);
         }
 
@@ -941,8 +942,8 @@ TrLinkChildren (
         }
         PrevChild = Child;
     }
-    va_end(ap);
 
+    va_end(ap);
     DbgPrint (ASL_PARSE_OUTPUT, "\n\n");
     return (Op);
 }
diff --git a/src/acpica/source/compiler/aslutils.c b/src/acpica/source/compiler/aslutils.c
index 53fba5a..2e4db5a 100644
--- a/src/acpica/source/compiler/aslutils.c
+++ b/src/acpica/source/compiler/aslutils.c
@@ -425,8 +425,6 @@ DbgPrint (
     va_list                 Args;
 
 
-    va_start (Args, Fmt);
-
     if (!Gbl_DebugFlag)
     {
         return;
@@ -438,6 +436,7 @@ DbgPrint (
         return;
     }
 
+    va_start (Args, Fmt);
     (void) vfprintf (stderr, Fmt, Args);
     va_end (Args);
     return;
diff --git a/src/acpica/source/compiler/dtfield.c b/src/acpica/source/compiler/dtfield.c
index 6d781ca..00debb8 100644
--- a/src/acpica/source/compiler/dtfield.c
+++ b/src/acpica/source/compiler/dtfield.c
@@ -539,12 +539,13 @@ DtCompileBuffer (
         if (ACPI_FAILURE (Status))
         {
             DtError (ASL_ERROR, ASL_MSG_BUFFER_ELEMENT, Field, MsgBuffer);
-            return (ByteLength - Count);
+            goto Exit;
         }
 
         Buffer[i] = (UINT8) Value;
     }
 
+Exit:
     ACPI_FREE (StringValue);
     return (ByteLength - Count);
 }
diff --git a/src/acpica/source/compiler/dtio.c b/src/acpica/source/compiler/dtio.c
index f20792d..3c22381 100644
--- a/src/acpica/source/compiler/dtio.c
+++ b/src/acpica/source/compiler/dtio.c
@@ -359,31 +359,21 @@ DtParseLine (
 
     while (Start < Colon)
     {
-        if (*Start == ' ')
-        {
-            Start++;
-            continue;
-        }
-
-        /* Found left bracket, go to the right bracket */
-
         if (*Start == '[')
         {
+            /* Found left bracket, go to the right bracket */
+
             while (Start < Colon && *Start != ']')
             {
                 Start++;
             }
-
-            if (Start == Colon)
-            {
-                break;
-            }
-
-            Start++;
-            continue;
+        }
+        else if (*Start != ' ')
+        {
+            break;
         }
 
-        break;
+        Start++;
     }
 
     /*
@@ -1210,4 +1200,5 @@ DtWriteTableToListing (
     AcpiUtDumpBuffer (Buffer, Gbl_TableLength, DB_BYTE_DISPLAY, 0);
 
     AcpiOsRedirectOutput (stdout);
+    ACPI_FREE (Buffer);
 }
diff --git a/src/acpica/source/compiler/dttable.c b/src/acpica/source/compiler/dttable.c
index a7c6e18..e754cc4 100644
--- a/src/acpica/source/compiler/dttable.c
+++ b/src/acpica/source/compiler/dttable.c
@@ -613,8 +613,9 @@ DtCompileDmar (
     DT_FIELD                *SubtableStart;
     ACPI_DMTABLE_INFO       *InfoTable;
     ACPI_DMAR_HEADER        *DmarHeader;
-    UINT8                   *ReservedBuffer;
-    UINT32                  ReservedSize;
+    ACPI_DMAR_DEVICE_SCOPE  *DmarDeviceScope;
+    UINT32                  DeviceScopeLength;
+    UINT32                  PciPathLength;
 
 
     Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmar, &Subtable, TRUE);
@@ -625,17 +626,7 @@ DtCompileDmar (
 
     ParentTable = DtPeekSubtable ();
     DtInsertSubtable (ParentTable, Subtable);
-
-    /* DMAR Reserved area */
-
-    ReservedSize = (UINT32) sizeof (((ACPI_TABLE_DMAR *) NULL)->Reserved);
-    ReservedBuffer = UtLocalCalloc (ReservedSize);
-
-    DtCreateSubtable (ReservedBuffer, ReservedSize, &Subtable);
-
-    ACPI_FREE (ReservedBuffer);
-    ParentTable = DtPeekSubtable ();
-    DtInsertSubtable (ParentTable, Subtable);
+    DtPushSubtable (Subtable);
 
     while (*PFieldList)
     {
@@ -693,10 +684,13 @@ DtCompileDmar (
 
         ParentTable = DtPeekSubtable ();
         DtInsertSubtable (ParentTable, Subtable);
+        DtPushSubtable (Subtable);
 
         /* Optional Device Scope subtables */
 
-        while (*PFieldList)
+        DeviceScopeLength = DmarHeader->Length - Subtable->Length -
+            ParentTable->Length;
+        while (DeviceScopeLength)
         {
             Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarScope,
                         &Subtable, FALSE);
@@ -709,9 +703,12 @@ DtCompileDmar (
             DtInsertSubtable (ParentTable, Subtable);
             DtPushSubtable (Subtable);
 
+            DmarDeviceScope = ACPI_CAST_PTR (ACPI_DMAR_DEVICE_SCOPE, Subtable->Buffer);
+
             /* Optional PCI Paths */
 
-            while (*PFieldList)
+            PciPathLength = DmarDeviceScope->Length - Subtable->Length;
+            while (PciPathLength)
             {
                 Status = DtCompileTable (PFieldList, TableInfoDmarPciPath,
                             &Subtable, FALSE);
@@ -723,10 +720,15 @@ DtCompileDmar (
 
                 ParentTable = DtPeekSubtable ();
                 DtInsertSubtable (ParentTable, Subtable);
+                PciPathLength -= Subtable->Length;
             }
+
+            DtPopSubtable ();
+            DeviceScopeLength -= DmarDeviceScope->Length;
         }
 
         DtPopSubtable ();
+        DtPopSubtable ();
     }
 
     return (AE_OK);
diff --git a/src/acpica/source/compiler/dttemplate.h b/src/acpica/source/compiler/dttemplate.h
index 9543ad6..f131b62 100644
--- a/src/acpica/source/compiler/dttemplate.h
+++ b/src/acpica/source/compiler/dttemplate.h
@@ -260,22 +260,22 @@ const unsigned char TemplateDbgp[] =
 const unsigned char TemplateDmar[] =
 {
     0x44,0x4D,0x41,0x52,0x8C,0x00,0x00,0x00,  /* 00000000    "DMAR...." */
-    0x01,0x15,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    "..INTEL " */
+    0x01,0x03,0x49,0x4E,0x54,0x45,0x4C,0x20,  /* 00000008    "..INTEL " */
     0x54,0x45,0x4D,0x50,0x4C,0x41,0x54,0x45,  /* 00000010    "TEMPLATE" */
     0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
-    0x28,0x05,0x10,0x20,0x2F,0x01,0x00,0x00,  /* 00000020    "(.. /..." */
+    0x17,0x05,0x13,0x20,0x2F,0x01,0x00,0x00,  /* 00000020    "... /..." */
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000028    "........" */
     0x00,0x00,0x18,0x00,0x01,0x00,0x00,0x00,  /* 00000030    "........" */
-    0x00,0x00,0x02,0xFD,0x00,0x00,0x00,0x00,  /* 00000038    "........" */
-    0x03,0x08,0x00,0x00,0x08,0xF0,0x1F,0x07,  /* 00000040    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000038    "........" */
+    0x03,0x08,0x00,0x00,0x08,0x00,0x00,0x01,  /* 00000040    "........" */
     0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,  /* 00000048    ".. ....." */
-    0x00,0x10,0xC2,0x78,0x00,0x00,0x00,0x00,  /* 00000050    "...x...." */
-    0xFF,0x3F,0xC2,0x78,0x00,0x00,0x00,0x00,  /* 00000058    ".?.x...." */
-    0x01,0x08,0x00,0x00,0x00,0x00,0x1D,0x00,  /* 00000060    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000050    "........" */
+    0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000058    "........" */
+    0x01,0x08,0x00,0x00,0x00,0x00,0x00,0x02,  /* 00000060    "........" */
     0x02,0x00,0x10,0x00,0x00,0x00,0x00,0x00,  /* 00000068    "........" */
-    0x02,0x08,0x00,0x00,0x00,0x00,0x01,0x00,  /* 00000070    "........" */
+    0x02,0x08,0x00,0x00,0x00,0x00,0x00,0x03,  /* 00000070    "........" */
     0x03,0x00,0x14,0x00,0x00,0x00,0x00,0x00,  /* 00000078    "........" */
-    0x00,0x00,0x02,0xFD,0x00,0x00,0x00,0x00,  /* 00000080    "........" */
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  /* 00000080    "........" */
     0x00,0x00,0x00,0x00                       /* 00000088    "...."     */
 };
 
diff --git a/src/acpica/source/compiler/dtutils.c b/src/acpica/source/compiler/dtutils.c
index dacb9c4..0045e07 100644
--- a/src/acpica/source/compiler/dtutils.c
+++ b/src/acpica/source/compiler/dtutils.c
@@ -469,6 +469,7 @@ DtGetFieldType (
 
     case ACPI_DMT_BUFFER:
     case ACPI_DMT_BUF7:
+    case ACPI_DMT_BUF10:
     case ACPI_DMT_BUF16:
     case ACPI_DMT_BUF128:
     case ACPI_DMT_PCI_PATH:
@@ -702,6 +703,11 @@ DtGetFieldLength (
         }
         break;
 
+    case ACPI_DMT_BUF10:
+
+        ByteLength = 10;
+        break;
+
     case ACPI_DMT_BUF16:
     case ACPI_DMT_UUID:
 
diff --git a/src/acpica/source/compiler/preprocess.h b/src/acpica/source/compiler/preprocess.h
index 3e4eaff..ccf83d0 100644
--- a/src/acpica/source/compiler/preprocess.h
+++ b/src/acpica/source/compiler/preprocess.h
@@ -196,6 +196,17 @@ typedef struct pr_file_node
 
 } PR_FILE_NODE;
 
+#define MAX_ARGUMENT_LENGTH     24
+
+typedef struct directive_info
+{
+    struct directive_info       *Next;
+    char                        Argument[MAX_ARGUMENT_LENGTH];
+    int                         Directive;
+    BOOLEAN                     IgnoringThisCodeBlock;
+
+} DIRECTIVE_INFO;
+
 
 /*
  * Globals
@@ -208,12 +219,13 @@ PR_EXTERN char                  PR_INIT_GLOBAL (*Gbl_MainTokenBuffer, NULL); /*
 PR_EXTERN char                  PR_INIT_GLOBAL (*Gbl_MacroTokenBuffer, NULL); /* [ASL_LINE_BUFFER_SIZE]; */
 PR_EXTERN char                  PR_INIT_GLOBAL (*Gbl_ExpressionTokenBuffer, NULL); /* [ASL_LINE_BUFFER_SIZE]; */
 
-PR_EXTERN PR_FILE_NODE          *Gbl_InputFileList;
-PR_EXTERN PR_DEFINE_INFO        PR_INIT_GLOBAL (*Gbl_DefineList, NULL);
 PR_EXTERN UINT32                Gbl_PreprocessorLineNumber;
 PR_EXTERN int                   Gbl_IfDepth;
+PR_EXTERN PR_FILE_NODE          *Gbl_InputFileList;
+PR_EXTERN PR_DEFINE_INFO        PR_INIT_GLOBAL (*Gbl_DefineList, NULL);
 PR_EXTERN BOOLEAN               PR_INIT_GLOBAL (Gbl_PreprocessorError, FALSE);
-
+PR_EXTERN BOOLEAN               PR_INIT_GLOBAL (Gbl_IgnoringThisCodeBlock, FALSE);
+PR_EXTERN DIRECTIVE_INFO        PR_INIT_GLOBAL (*Gbl_DirectiveStack, NULL);
 
 /*
  * prscan - Preprocessor entry
@@ -230,7 +242,7 @@ void
 PrTerminatePreprocessor (
     void);
 
-BOOLEAN
+void
 PrDoPreprocess (
     void);
 
diff --git a/src/acpica/source/compiler/prscan.c b/src/acpica/source/compiler/prscan.c
index a32f14c..c36a52c 100644
--- a/src/acpica/source/compiler/prscan.c
+++ b/src/acpica/source/compiler/prscan.c
@@ -137,13 +137,27 @@ PrPreprocessInputFile (
 static void
 PrDoDirective (
     char                    *DirectiveToken,
-    char                    **Next,
-    BOOLEAN                 *IgnoringThisCodeBlock);
+    char                    **Next);
 
 static int
 PrMatchDirective (
     char                    *Directive);
 
+static void
+PrPushDirective (
+    int                     Directive,
+    char                    *Argument);
+
+static ACPI_STATUS
+PrPopDirective (
+    void);
+
+static void
+PrDbgPrint (
+    char                    *Action,
+    char                    *DirectiveName);
+
+
 /*
  * Supported preprocessor directives
  */
@@ -228,11 +242,16 @@ PrInitializeGlobals (
 {
     /* Init globals */
 
-    Gbl_IfDepth = 0;
     Gbl_InputFileList = NULL;
     Gbl_CurrentLineNumber = 0;
     Gbl_PreprocessorLineNumber = 1;
     Gbl_PreprocessorError = FALSE;
+
+    /* These are used to track #if/#else blocks (possibly nested) */
+
+    Gbl_IfDepth = 0;
+    Gbl_IgnoringThisCodeBlock = FALSE;
+    Gbl_DirectiveStack = NULL;
 }
 
 
@@ -279,7 +298,7 @@ PrTerminatePreprocessor (
  *
  * PARAMETERS:  None
  *
- * RETURN:      Error Status. TRUE if error, FALSE if OK.
+ * RETURN:      None
  *
  * DESCRIPTION: Main entry point for the iASL Preprocessor. Input file must
  *              be already open. Handles multiple input files via the
@@ -287,7 +306,7 @@ PrTerminatePreprocessor (
  *
  ******************************************************************************/
 
-BOOLEAN
+void
 PrDoPreprocess (
     void)
 {
@@ -309,20 +328,7 @@ PrDoPreprocess (
 
     } while (MoreInputFiles);
 
-
-    /*
-     * TBD: is this necessary? (Do we abort on any preprocessing errors?)
-     */
-    if (Gbl_PreprocessorError)
-    {
-        /* TBD: can't use source_output file for preprocessor error reporting */
-
-        Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle = NULL;
-        PrTerminatePreprocessor ();
-        return (TRUE);
-    }
-
-    /* Point compiler input to the new preprocessor file (.i) */
+    /* Point compiler input to the new preprocessor output file (.i) */
 
     FlCloseFile (ASL_FILE_INPUT);
     Gbl_Files[ASL_FILE_INPUT].Handle = Gbl_Files[ASL_FILE_PREPROCESSOR].Handle;
@@ -334,7 +340,6 @@ PrDoPreprocess (
     Gbl_CurrentLineNumber = 1;
 
     DbgPrint (ASL_DEBUG_OUTPUT, "Preprocessing phase complete \n\n");
-    return (FALSE);
 }
 
 
@@ -362,7 +367,6 @@ PrPreprocessInputFile (
     char                    *ReplaceString;
     PR_DEFINE_INFO          *DefineInfo;
     ACPI_SIZE               TokenOffset;
-    BOOLEAN                 IgnoringThisCodeBlock = FALSE;
     char                    *Next;
     int                     OffsetAdjust;
 
@@ -392,7 +396,7 @@ PrPreprocessInputFile (
 
             /* Execute the directive, do not write line to output file */
 
-            PrDoDirective (Token, &Next, &IgnoringThisCodeBlock);
+            PrDoDirective (Token, &Next);
             continue;
         }
 
@@ -401,7 +405,7 @@ PrPreprocessInputFile (
          * FALSE, ignore the line and do not write it to the output file.
          * This continues until an #else or #endif is encountered.
          */
-        if (IgnoringThisCodeBlock == TRUE)
+        if (Gbl_IgnoringThisCodeBlock)
         {
             continue;
         }
@@ -488,12 +492,8 @@ PrPreprocessInputFile (
  *
  * PARAMETERS:  Directive               - Pointer to directive name token
  *              Next                    - "Next" buffer from GetNextToken
- *              IgnoringThisCodeBlock   - Where the "ignore code" flag is
- *                                        returned.
  *
- * RETURN:      IgnoringThisCodeBlock: Set to TRUE if we are skipping the FALSE
- *              part of an #if or #else block. Set to FALSE when the
- *              corresponding #else or #endif is encountered.
+ * RETURN:      None.
  *
  * DESCRIPTION: Main processing for all preprocessor directives
  *
@@ -502,8 +502,7 @@ PrPreprocessInputFile (
 static void
 PrDoDirective (
     char                    *DirectiveToken,
-    char                    **Next,
-    BOOLEAN                 *IgnoringThisCodeBlock)
+    char                    **Next)
 {
     char                    *Token = Gbl_MainTokenBuffer;
     char                    *Token2;
@@ -531,14 +530,28 @@ PrDoDirective (
         return;
     }
 
-    /* TBD: Need a faster way to do this: */
-
-    if ((Directive == PR_DIRECTIVE_ELIF) ||
-        (Directive == PR_DIRECTIVE_ELSE) ||
-        (Directive == PR_DIRECTIVE_ENDIF))
+    /*
+     * If we are currently ignoring this block and we encounter a #else or
+     * #elif, we must ignore their blocks also if the parent block is also
+     * being ignored.
+     */
+    if (Gbl_IgnoringThisCodeBlock)
     {
-        DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID "Begin #%s\n",
-            Gbl_CurrentLineNumber, Gbl_DirectiveInfo[Directive].Name);
+        switch (Directive)
+        {
+        case PR_DIRECTIVE_ELSE:
+        case PR_DIRECTIVE_ELIF:
+
+            if (Gbl_DirectiveStack && Gbl_DirectiveStack->IgnoringThisCodeBlock)
+            {
+                PrDbgPrint ("Ignoring", Gbl_DirectiveInfo[Directive].Name);
+                return;
+            }
+            break;
+
+        default:
+            break;
+        }
     }
 
     /*
@@ -548,57 +561,54 @@ PrDoDirective (
      */
     switch (Directive)
     {
+    case PR_DIRECTIVE_ELSE:
+
+        Gbl_IgnoringThisCodeBlock = !(Gbl_IgnoringThisCodeBlock);
+        PrDbgPrint ("Executing", "else block");
+        return;
+
     case PR_DIRECTIVE_ELIF:
 
-        *IgnoringThisCodeBlock = !(*IgnoringThisCodeBlock);
-        if (*IgnoringThisCodeBlock == TRUE)
+        Gbl_IgnoringThisCodeBlock = !(Gbl_IgnoringThisCodeBlock);
+        Directive = PR_DIRECTIVE_IF;
+
+        if (Gbl_IgnoringThisCodeBlock == TRUE)
         {
             /* Not executing the ELSE part -- all done here */
+            PrDbgPrint ("Ignoring", "elif block");
             return;
         }
 
-        /* Will execute the ELSE..IF part */
+        /*
+         * After this, we will execute the IF part further below.
+         * First, however, pop off the original #if directive.
+         */
+        if (ACPI_FAILURE (PrPopDirective ()))
+        {
+            PrError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL,
+                THIS_TOKEN_OFFSET (DirectiveToken));
+        }
 
-        DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
-            "#elif - Executing else block\n",
-            Gbl_CurrentLineNumber);
-        Directive = PR_DIRECTIVE_IF;
+        PrDbgPrint ("Executing", "elif block");
         break;
 
-    case PR_DIRECTIVE_ELSE:
+    case PR_DIRECTIVE_ENDIF:
 
-        *IgnoringThisCodeBlock = !(*IgnoringThisCodeBlock);
-        return;
+        PrDbgPrint ("Executing", "endif");
 
-    case PR_DIRECTIVE_ENDIF:
+        /* Pop the owning #if/#ifdef/#ifndef */
 
-        *IgnoringThisCodeBlock = FALSE;
-        Gbl_IfDepth--;
-        if (Gbl_IfDepth < 0)
+        if (ACPI_FAILURE (PrPopDirective ()))
         {
             PrError (ASL_ERROR, ASL_MSG_ENDIF_MISMATCH,
                 THIS_TOKEN_OFFSET (DirectiveToken));
-            Gbl_IfDepth = 0;
         }
         return;
 
     default:
-
         break;
     }
 
-    /*
-     * At this point, if we are ignoring the current code block,
-     * do not process any more directives (i.e., ignore them also.)
-     */
-    if (*IgnoringThisCodeBlock == TRUE)
-    {
-        return;
-    }
-
-    DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID "Begin #%s\n",
-        Gbl_CurrentLineNumber, Gbl_DirectiveInfo[Directive].Name);
-
     /* Most directives have at least one argument */
 
     if (Gbl_DirectiveInfo[Directive].ArgCount == 1)
@@ -610,8 +620,85 @@ PrDoDirective (
         }
     }
 
+    /*
+     * At this point, if we are ignoring the current code block,
+     * do not process any more directives (i.e., ignore them also.)
+     * For "if" style directives, open/push a new block anyway. We
+     * must do this to keep track of #endif directives
+     */
+    if (Gbl_IgnoringThisCodeBlock)
+    {
+        switch (Directive)
+        {
+        case PR_DIRECTIVE_IF:
+        case PR_DIRECTIVE_IFDEF:
+        case PR_DIRECTIVE_IFNDEF:
+
+            PrPushDirective (Directive, Token);
+            PrDbgPrint ("Ignoring", Gbl_DirectiveInfo[Directive].Name);
+            break;
+
+        default:
+            break;
+        }
+
+        return;
+    }
+
+    /*
+     * Execute the directive
+     */
+    PrDbgPrint ("Begin execution", Gbl_DirectiveInfo[Directive].Name);
+
     switch (Directive)
     {
+    case PR_DIRECTIVE_IF:
+
+        TokenOffset = Token - Gbl_MainTokenBuffer;
+
+        /* Need to expand #define macros in the expression string first */
+
+        Status = PrResolveIntegerExpression (
+            &Gbl_CurrentLineBuffer[TokenOffset-1], &Value);
+        if (ACPI_FAILURE (Status))
+        {
+            return;
+        }
+
+        PrPushDirective (Directive, Token);
+        if (!Value)
+        {
+            Gbl_IgnoringThisCodeBlock = TRUE;
+        }
+
+        DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
+            "Resolved #if: %8.8X%8.8X %s\n",
+            Gbl_CurrentLineNumber, ACPI_FORMAT_UINT64 (Value),
+            Gbl_IgnoringThisCodeBlock ? "<Skipping Block>" : "<Executing Block>");
+        break;
+
+    case PR_DIRECTIVE_IFDEF:
+
+        PrPushDirective (Directive, Token);
+        if (!PrMatchDefine (Token))
+        {
+            Gbl_IgnoringThisCodeBlock = TRUE;
+        }
+
+        PrDbgPrint ("Evaluated", "ifdef");
+        break;
+
+    case PR_DIRECTIVE_IFNDEF:
+
+        PrPushDirective (Directive, Token);
+        if (PrMatchDefine (Token))
+        {
+            Gbl_IgnoringThisCodeBlock = TRUE;
+        }
+
+        PrDbgPrint ("Evaluated", "ifndef");
+        break;
+
     case PR_DIRECTIVE_DEFINE:
         /*
          * By definition, if first char after the name is a paren,
@@ -667,64 +754,15 @@ PrDoDirective (
 
     case PR_DIRECTIVE_ERROR:
 
-        /* TBD compiler should abort */
         /* Note: No macro expansion */
 
         PrError (ASL_ERROR, ASL_MSG_ERROR_DIRECTIVE,
             THIS_TOKEN_OFFSET (Token));
-        break;
-
-    case PR_DIRECTIVE_IF:
 
-        TokenOffset = Token - Gbl_MainTokenBuffer;
-
-        /* Need to expand #define macros in the expression string first */
-
-        Status = PrResolveIntegerExpression (
-            &Gbl_CurrentLineBuffer[TokenOffset-1], &Value);
-        if (ACPI_FAILURE (Status))
-        {
-            return;
-        }
-
-        if (!Value)
-        {
-            *IgnoringThisCodeBlock = TRUE;
-        }
-
-        DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
-            "Resolved #if: %8.8X%8.8X %s\n",
-            Gbl_CurrentLineNumber, ACPI_FORMAT_UINT64 (Value),
-            *IgnoringThisCodeBlock ? "<Skipping Block>" : "<Executing Block>");
-
-        Gbl_IfDepth++;
-        break;
-
-    case PR_DIRECTIVE_IFDEF:
-
-        if (!PrMatchDefine (Token))
-        {
-            *IgnoringThisCodeBlock = TRUE;
-        }
-
-        Gbl_IfDepth++;
-        DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
-            "Start #ifdef %s\n", Gbl_CurrentLineNumber,
-            *IgnoringThisCodeBlock ? "<Skipping Block>" : "<Executing Block>");
-        break;
-
-    case PR_DIRECTIVE_IFNDEF:
-
-        if (PrMatchDefine (Token))
-        {
-            *IgnoringThisCodeBlock = TRUE;
-        }
-
-        Gbl_IfDepth++;
-        DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
-            "Start #ifndef %2.2X\n", Gbl_CurrentLineNumber,
-            *IgnoringThisCodeBlock, Gbl_CurrentLineNumber);
-        break;
+        Gbl_SourceLine = 0;
+        Gbl_NextError = Gbl_ErrorLog;
+        CmCleanupAndExit ();
+        exit(1);
 
     case PR_DIRECTIVE_INCLUDE:
 
@@ -810,7 +848,7 @@ PrDoDirective (
 
     case PR_DIRECTIVE_WARNING:
 
-        PrError (ASL_WARNING, ASL_MSG_ERROR_DIRECTIVE,
+        PrError (ASL_WARNING, ASL_MSG_WARNING_DIRECTIVE,
             THIS_TOKEN_OFFSET (Token));
         break;
 
@@ -825,7 +863,6 @@ PrDoDirective (
 
     return;
 
-
 SyntaxError:
 
     PrError (ASL_ERROR, ASL_MSG_DIRECTIVE_SYNTAX,
@@ -868,3 +905,130 @@ PrMatchDirective (
 
     return (ASL_DIRECTIVE_NOT_FOUND);    /* Command not recognized */
 }
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    PrPushDirective
+ *
+ * PARAMETERS:  Directive           - Encoded directive ID
+ *              Argument            - String containing argument to the
+ *                                    directive
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Push an item onto the directive stack. Used for processing
+ *              nested #if/#else type conditional compilation directives.
+ *              Specifically: Used on detection of #if/#ifdef/#ifndef to open
+ *              a block.
+ *
+ ******************************************************************************/
+
+static void
+PrPushDirective (
+    int                     Directive,
+    char                    *Argument)
+{
+    DIRECTIVE_INFO          *Info;
+
+
+    /* Allocate and populate a stack info item */
+
+    Info = ACPI_ALLOCATE (sizeof (DIRECTIVE_INFO));
+
+    Info->Next = Gbl_DirectiveStack;
+    Info->Directive = Directive;
+    Info->IgnoringThisCodeBlock = Gbl_IgnoringThisCodeBlock;
+    strncpy (Info->Argument, Argument, MAX_ARGUMENT_LENGTH);
+
+    DbgPrint (ASL_DEBUG_OUTPUT,
+        "Pr(%.4u) - [%u %s] %*s Pushed [#%s %s]: IgnoreFlag = %s\n",
+        Gbl_CurrentLineNumber, Gbl_IfDepth,
+        Gbl_IgnoringThisCodeBlock ? "I" : "E",
+        Gbl_IfDepth * 4, " ",
+        Gbl_DirectiveInfo[Directive].Name,
+        Argument, Gbl_IgnoringThisCodeBlock ? "TRUE" : "FALSE");
+
+    /* Push new item */
+
+    Gbl_DirectiveStack = Info;
+    Gbl_IfDepth++;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    PrPopDirective
+ *
+ * PARAMETERS:  None
+ *
+ * RETURN:      Status. Error if the stack is empty.
+ *
+ * DESCRIPTION: Pop an item off the directive stack. Used for processing
+ *              nested #if/#else type conditional compilation directives.
+ *              Specifically: Used on detection of #elif and #endif to remove
+ *              the original #if/#ifdef/#ifndef from the stack and close
+ *              the block.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+PrPopDirective (
+    void)
+{
+    DIRECTIVE_INFO          *Info;
+
+
+    /* Check for empty stack */
+
+    Info = Gbl_DirectiveStack;
+    if (!Info)
+    {
+        return (AE_ERROR);
+    }
+
+    /* Pop one item, keep globals up-to-date */
+
+    Gbl_IfDepth--;
+    Gbl_IgnoringThisCodeBlock = Info->IgnoringThisCodeBlock;
+    Gbl_DirectiveStack = Info->Next;
+
+    DbgPrint (ASL_DEBUG_OUTPUT,
+        "Pr(%.4u) - [%u %s] %*s Popped [#%s %s]: IgnoreFlag now = %s\n",
+        Gbl_CurrentLineNumber, Gbl_IfDepth,
+        Gbl_IgnoringThisCodeBlock ? "I" : "E",
+        Gbl_IfDepth * 4, " ",
+        Gbl_DirectiveInfo[Info->Directive].Name,
+        Info->Argument, Gbl_IgnoringThisCodeBlock ? "TRUE" : "FALSE");
+
+    ACPI_FREE (Info);
+    return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    PrDbgPrint
+ *
+ * PARAMETERS:  Action              - Action being performed
+ *              DirectiveName       - Directive being processed
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Special debug print for directive processing.
+ *
+ ******************************************************************************/
+
+static void
+PrDbgPrint (
+    char                    *Action,
+    char                    *DirectiveName)
+{
+
+    DbgPrint (ASL_DEBUG_OUTPUT, "Pr(%.4u) - [%u %s] "
+        "%*s %s #%s, Depth %u\n",
+        Gbl_CurrentLineNumber, Gbl_IfDepth,
+        Gbl_IgnoringThisCodeBlock ? "I" : "E",
+        Gbl_IfDepth * 4, " ",
+        Action, DirectiveName, Gbl_IfDepth);
+}
diff --git a/src/acpica/source/components/debugger/dbcmds.c b/src/acpica/source/components/debugger/dbcmds.c
index 0e1c49b..54ddf1a 100644
--- a/src/acpica/source/components/debugger/dbcmds.c
+++ b/src/acpica/source/components/debugger/dbcmds.c
@@ -177,13 +177,15 @@ AcpiDbConvertToNode (
     char                    *InString)
 {
     ACPI_NAMESPACE_NODE     *Node;
+    ACPI_SIZE               Address;
 
 
     if ((*InString >= 0x30) && (*InString <= 0x39))
     {
         /* Numeric argument, convert */
 
-        Node = ACPI_TO_POINTER (ACPI_STRTOUL (InString, NULL, 16));
+        Address = ACPI_STRTOUL (InString, NULL, 16);
+        Node = ACPI_TO_POINTER (Address);
         if (!AcpiOsReadable (Node, sizeof (ACPI_NAMESPACE_NODE)))
         {
             AcpiOsPrintf ("Address %p is invalid in this address space\n",
diff --git a/src/acpica/source/components/debugger/dbdisply.c b/src/acpica/source/components/debugger/dbdisply.c
index a42a954..832647d 100644
--- a/src/acpica/source/components/debugger/dbdisply.c
+++ b/src/acpica/source/components/debugger/dbdisply.c
@@ -211,9 +211,11 @@ AcpiDbGetPointer (
     void                    *Target)
 {
     void                    *ObjPtr;
+    ACPI_SIZE               Address;
 
 
-    ObjPtr = ACPI_TO_POINTER (ACPI_STRTOUL (Target, NULL, 16));
+    Address = ACPI_STRTOUL (Target, NULL, 16);
+    ObjPtr = ACPI_TO_POINTER (Address);
     return (ObjPtr);
 }
 
diff --git a/src/acpica/source/components/debugger/dbinput.c b/src/acpica/source/components/debugger/dbinput.c
index 8f30208..2f6127f 100644
--- a/src/acpica/source/components/debugger/dbinput.c
+++ b/src/acpica/source/components/debugger/dbinput.c
@@ -901,7 +901,7 @@ AcpiDbCommandDispatch (
         break;
 
     case CMD_EVENT:
-        
+
         AcpiOsPrintf ("Event command not implemented\n");
         break;
 
@@ -960,7 +960,7 @@ AcpiDbCommandDispatch (
         return (Status);
 
     case CMD_HISTORY_LAST: /* !! command */
-        
+
         CommandLine = AcpiDbGetFromHistory (NULL);
         if (!CommandLine)
         {
@@ -971,12 +971,12 @@ AcpiDbCommandDispatch (
         return (Status);
 
     case CMD_INFORMATION:
-        
+
         AcpiDbDisplayMethodInfo (Op);
         break;
 
     case CMD_INTEGRITY:
-        
+
         AcpiDbCheckIntegrity ();
         break;
 
@@ -1070,7 +1070,7 @@ AcpiDbCommandDispatch (
         break;
 
     case CMD_OWNER:
-        
+
         AcpiDbDumpNamespaceByOwner (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
         break;
 
diff --git a/src/acpica/source/components/debugger/dbnames.c b/src/acpica/source/components/debugger/dbnames.c
index bc37388..9fbe539 100644
--- a/src/acpica/source/components/debugger/dbnames.c
+++ b/src/acpica/source/components/debugger/dbnames.c
@@ -855,11 +855,13 @@ AcpiDbFindReferences (
     char                    *ObjectArg)
 {
     ACPI_OPERAND_OBJECT     *ObjDesc;
+    ACPI_SIZE               Address;
 
 
     /* Convert string to object pointer */
 
-    ObjDesc = ACPI_TO_POINTER (ACPI_STRTOUL (ObjectArg, NULL, 16));
+    Address = ACPI_STRTOUL (ObjectArg, NULL, 16);
+    ObjDesc = ACPI_TO_POINTER (Address);
 
     /* Search all nodes in namespace */
 
diff --git a/src/acpica/source/components/disassembler/dmbuffer.c b/src/acpica/source/components/disassembler/dmbuffer.c
index 4b33c56..9e9f4c4 100644
--- a/src/acpica/source/components/disassembler/dmbuffer.c
+++ b/src/acpica/source/components/disassembler/dmbuffer.c
@@ -249,7 +249,7 @@ AcpiDmByteList (
     case ACPI_DASM_STRING:
 
         AcpiDmIndent (Info->Level);
-        AcpiUtPrintString ((char *) ByteData, ACPI_UINT8_MAX);
+        AcpiUtPrintString ((char *) ByteData, ACPI_UINT16_MAX);
         AcpiOsPrintf ("\n");
         break;
 
@@ -595,11 +595,9 @@ AcpiDmUnicode (
     WordData = ACPI_CAST_PTR (UINT16, Op->Named.Data);
     WordCount = ACPI_DIV_2 (((UINT32) Op->Common.Value.Integer));
 
-
-    AcpiOsPrintf ("\"");
-
     /* Write every other byte as an ASCII character */
 
+    AcpiOsPrintf ("\"");
     for (i = 0; i < (WordCount - 1); i++)
     {
         AcpiOsPrintf ("%c", (int) WordData[i]);
diff --git a/src/acpica/source/components/disassembler/dmopcode.c b/src/acpica/source/components/disassembler/dmopcode.c
index 36cfd8a..767c2bf 100644
--- a/src/acpica/source/components/disassembler/dmopcode.c
+++ b/src/acpica/source/components/disassembler/dmopcode.c
@@ -705,7 +705,7 @@ AcpiDmDisassembleOneOp (
 
     case AML_STRING_OP:
 
-        AcpiUtPrintString (Op->Common.Value.String, ACPI_UINT8_MAX);
+        AcpiUtPrintString (Op->Common.Value.String, ACPI_UINT16_MAX);
         break;
 
     case AML_BUFFER_OP:
diff --git a/src/acpica/source/components/disassembler/dmresrcl.c b/src/acpica/source/components/disassembler/dmresrcl.c
index 6d1420d..4096822 100644
--- a/src/acpica/source/components/disassembler/dmresrcl.c
+++ b/src/acpica/source/components/disassembler/dmresrcl.c
@@ -637,7 +637,7 @@ AcpiDmResourceSource (
     if (TotalLength > (MinimumTotalLength + 1))
     {
         AcpiOsPrintf (" ");
-        AcpiUtPrintString ((char *) &AmlResourceSource[1], ACPI_UINT8_MAX);
+        AcpiUtPrintString ((char *) &AmlResourceSource[1], ACPI_UINT16_MAX);
     }
 
     AcpiOsPrintf (", ");
diff --git a/src/acpica/source/components/disassembler/dmresrcl2.c b/src/acpica/source/components/disassembler/dmresrcl2.c
index b15db88..a5cc7fb 100644
--- a/src/acpica/source/components/disassembler/dmresrcl2.c
+++ b/src/acpica/source/components/disassembler/dmresrcl2.c
@@ -267,7 +267,7 @@ AcpiDmGpioCommon (
     {
         AcpiUtPrintString (
             ACPI_ADD_PTR (char, Resource, Resource->Gpio.ResSourceOffset),
-            ACPI_UINT8_MAX);
+            ACPI_UINT16_MAX);
     }
 
     AcpiOsPrintf (", ");
@@ -570,7 +570,7 @@ AcpiDmI2cSerialBusDescriptor (
 
     AcpiUtPrintString (
         ACPI_ADD_PTR (char, Resource, ResourceSourceOffset),
-        ACPI_UINT8_MAX);
+        ACPI_UINT16_MAX);
 
     /* ResourceSourceIndex, ResourceUsage */
 
@@ -645,7 +645,7 @@ AcpiDmSpiSerialBusDescriptor (
 
     AcpiUtPrintString (
         ACPI_ADD_PTR (char, Resource, ResourceSourceOffset),
-        ACPI_UINT8_MAX);
+        ACPI_UINT16_MAX);
 
     /* ResourceSourceIndex, ResourceUsage */
 
@@ -723,7 +723,7 @@ AcpiDmUartSerialBusDescriptor (
 
     AcpiUtPrintString (
         ACPI_ADD_PTR (char, Resource, ResourceSourceOffset),
-        ACPI_UINT8_MAX);
+        ACPI_UINT16_MAX);
 
     /* ResourceSourceIndex, ResourceUsage */
 
diff --git a/src/acpica/source/components/events/evgpeinit.c b/src/acpica/source/components/events/evgpeinit.c
index 8cf5730..c9ae57b 100644
--- a/src/acpica/source/components/events/evgpeinit.c
+++ b/src/acpica/source/components/events/evgpeinit.c
@@ -206,7 +206,6 @@ AcpiEvGpeInitialize (
         /* GPE block 0 exists (has both length and address > 0) */
 
         RegisterCount0 = (UINT16) (AcpiGbl_FADT.Gpe0BlockLength / 2);
-
         GpeNumberMax = (RegisterCount0 * ACPI_GPE_REGISTER_WIDTH) - 1;
 
         /* Install GPE Block 0 */
@@ -281,16 +280,6 @@ AcpiEvGpeInitialize (
         goto Cleanup;
     }
 
-    /* Check for Max GPE number out-of-range */
-
-    if (GpeNumberMax > ACPI_GPE_MAX)
-    {
-        ACPI_ERROR ((AE_INFO,
-            "Maximum GPE number from FADT is too large: 0x%X",
-            GpeNumberMax));
-        Status = AE_BAD_VALUE;
-        goto Cleanup;
-    }
 
 Cleanup:
     (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
diff --git a/src/acpica/source/components/executer/exdump.c b/src/acpica/source/components/executer/exdump.c
index cb93831..af788e2 100644
--- a/src/acpica/source/components/executer/exdump.c
+++ b/src/acpica/source/components/executer/exdump.c
@@ -429,6 +429,7 @@ AcpiExDumpObject (
 {
     UINT8                   *Target;
     char                    *Name;
+    const char              *ReferenceName;
     UINT8                   Count;
 
 
@@ -513,8 +514,8 @@ AcpiExDumpObject (
 
         case ACPI_EXD_REFERENCE:
 
-            AcpiExOutString ("Class Name",
-                ACPI_CAST_PTR (char, AcpiUtGetReferenceName (ObjDesc)));
+            ReferenceName = AcpiUtGetReferenceName (ObjDesc);
+            AcpiExOutString ("Class Name", ACPI_CAST_PTR (char, ReferenceName));
             AcpiExDumpReferenceObj (ObjDesc);
             break;
 
diff --git a/src/acpica/source/components/namespace/nsdump.c b/src/acpica/source/components/namespace/nsdump.c
index 45f009d..233ded6 100644
--- a/src/acpica/source/components/namespace/nsdump.c
+++ b/src/acpica/source/components/namespace/nsdump.c
@@ -691,7 +691,7 @@ AcpiNsDumpOneObject (
             break;
 
         case ACPI_TYPE_LOCAL_INDEX_FIELD:
-            
+
             ObjDesc = (void *) ObjDesc->IndexField.IndexObj;
             break;
 
diff --git a/src/acpica/source/components/namespace/nsrepair2.c b/src/acpica/source/components/namespace/nsrepair2.c
index e3ec4a6..46f4107 100644
--- a/src/acpica/source/components/namespace/nsrepair2.c
+++ b/src/acpica/source/components/namespace/nsrepair2.c
@@ -573,19 +573,7 @@ AcpiNsRepair_CST (
 
 
     /*
-     * Entries (subpackages) in the _CST Package must be sorted by the
-     * C-state type, in ascending order.
-     */
-    Status = AcpiNsCheckSortedList (Info, ReturnObject, 1, 4, 1,
-                ACPI_SORT_ASCENDING, "C-State Type");
-    if (ACPI_FAILURE (Status))
-    {
-        return (Status);
-    }
-
-    /*
-     * We now know the list is correctly sorted by C-state type. Check if
-     * the C-state type values are proportional.
+     * Check if the C-state type values are proportional.
      */
     OuterElementCount = ReturnObject->Package.Count - 1;
     i = 0;
@@ -599,6 +587,7 @@ AcpiNsRepair_CST (
             ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
                 "SubPackage[%u] - removing entry due to zero count", i));
             Removing = TRUE;
+            goto RemoveElement;
         }
 
         ObjDesc = (*OuterElements)->Package.Elements[1]; /* Index1 = Type */
@@ -609,6 +598,7 @@ AcpiNsRepair_CST (
             Removing = TRUE;
         }
 
+RemoveElement:
         if (Removing)
         {
             AcpiNsRemoveElement (ReturnObject, i + 1);
@@ -624,6 +614,18 @@ AcpiNsRepair_CST (
 
     ObjDesc = ReturnObject->Package.Elements[0];
     ObjDesc->Integer.Value = OuterElementCount;
+
+    /*
+     * Entries (subpackages) in the _CST Package must be sorted by the
+     * C-state type, in ascending order.
+     */
+    Status = AcpiNsCheckSortedList (Info, ReturnObject, 1, 4, 1,
+                ACPI_SORT_ASCENDING, "C-State Type");
+    if (ACPI_FAILURE (Status))
+    {
+        return (Status);
+    }
+
     return (AE_OK);
 }
 
diff --git a/src/acpica/source/components/namespace/nsxfname.c b/src/acpica/source/components/namespace/nsxfname.c
index 71f1191..530d94a 100644
--- a/src/acpica/source/components/namespace/nsxfname.c
+++ b/src/acpica/source/components/namespace/nsxfname.c
@@ -249,6 +249,7 @@ AcpiGetName (
 {
     ACPI_STATUS             Status;
     ACPI_NAMESPACE_NODE     *Node;
+    char                    *NodeName;
 
 
     /* Parameter validation */
@@ -299,7 +300,8 @@ AcpiGetName (
 
     /* Just copy the ACPI name from the Node and zero terminate it */
 
-    ACPI_MOVE_NAME (Buffer->Pointer, AcpiUtGetNodeName (Node));
+    NodeName = AcpiUtGetNodeName (Node);
+    ACPI_MOVE_NAME (Buffer->Pointer, NodeName);
     ((char *) Buffer->Pointer) [ACPI_NAME_SIZE] = 0;
     Status = AE_OK;
 
@@ -495,9 +497,14 @@ AcpiGetObjectInfo (
          * Get extra info for ACPI Device/Processor objects only:
          * Run the _STA, _ADR and, SxW, and _SxD methods.
          *
-         * Note: none of these methods are required, so they may or may
+         * Notes: none of these methods are required, so they may or may
          * not be present for this device. The Info->Valid bitfield is used
          * to indicate which methods were found and run successfully.
+         *
+         * For _STA, if the method does not exist, then (as per the ACPI
+         * specification), the returned CurrentStatus flags will indicate
+         * that the device is present/functional/enabled. Otherwise, the
+         * CurrentStatus flags reflect the value returned from _STA.
          */
 
         /* Execute the Device._STA method */
diff --git a/src/acpica/source/components/resources/rsdump.c b/src/acpica/source/components/resources/rsdump.c
index 26f8315..fb1af63 100644
--- a/src/acpica/source/components/resources/rsdump.c
+++ b/src/acpica/source/components/resources/rsdump.c
@@ -275,7 +275,7 @@ AcpiRsDumpDescriptor (
             break;
 
         case ACPI_RSD_UINT64:
-            
+
             AcpiRsOutInteger64 (Name, ACPI_GET64 (Target));
             break;
 
diff --git a/src/acpica/source/components/resources/rsutils.c b/src/acpica/source/components/resources/rsutils.c
index c04ebac..bdc5ccf 100644
--- a/src/acpica/source/components/resources/rsutils.c
+++ b/src/acpica/source/components/resources/rsutils.c
@@ -265,7 +265,7 @@ AcpiRsMoveData (
             break;
 
         case ACPI_RSC_MOVE32:
-            
+
             ACPI_MOVE_32_TO_32 (&ACPI_CAST_PTR (UINT32, Destination)[i],
                                 &ACPI_CAST_PTR (UINT32, Source)[i]);
             break;
diff --git a/src/acpica/source/components/tables/tbxfroot.c b/src/acpica/source/components/tables/tbxfroot.c
index 377e2a7..7e6a620 100644
--- a/src/acpica/source/components/tables/tbxfroot.c
+++ b/src/acpica/source/components/tables/tbxfroot.c
@@ -125,11 +125,6 @@
 
 /* Local prototypes */
 
-static UINT8 *
-AcpiTbScanMemoryForRsdp (
-    UINT8                   *StartAddress,
-    UINT32                  Length);
-
 static ACPI_STATUS
 AcpiTbValidateRsdp (
     ACPI_TABLE_RSDP         *Rsdp);
@@ -324,7 +319,7 @@ ACPI_EXPORT_SYMBOL (AcpiFindRootPointer)
  *
  ******************************************************************************/
 
-static UINT8 *
+UINT8 *
 AcpiTbScanMemoryForRsdp (
     UINT8                   *StartAddress,
     UINT32                  Length)
diff --git a/src/acpica/source/components/utilities/uteval.c b/src/acpica/source/components/utilities/uteval.c
index 90677b9..b8d7b6b 100644
--- a/src/acpica/source/components/utilities/uteval.c
+++ b/src/acpica/source/components/utilities/uteval.c
@@ -332,7 +332,8 @@ AcpiUtEvaluateNumericObject (
  * RETURN:      Status
  *
  * DESCRIPTION: Executes _STA for selected device and stores results in
- *              *Flags.
+ *              *Flags. If _STA does not exist, then the device is assumed
+ *              to be present/functional/enabled (as per the ACPI spec).
  *
  *              NOTE: Internal function, no parameter validation
  *
@@ -356,6 +357,11 @@ AcpiUtExecute_STA (
     {
         if (AE_NOT_FOUND == Status)
         {
+            /*
+             * if _STA does not exist, then (as per the ACPI specification),
+             * the returned flags will indicate that the device is present,
+             * functional, and enabled.
+             */
             ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
                 "_STA on %4.4s was not found, assuming device is present\n",
                 AcpiUtGetNodeName (DeviceNode)));
diff --git a/src/acpica/source/components/utilities/utstring.c b/src/acpica/source/components/utilities/utstring.c
index e38deef..a8c928d 100644
--- a/src/acpica/source/components/utilities/utstring.c
+++ b/src/acpica/source/components/utilities/utstring.c
@@ -467,7 +467,8 @@ ErrorExit:
  * FUNCTION:    AcpiUtPrintString
  *
  * PARAMETERS:  String          - Null terminated ASCII string
- *              MaxLength       - Maximum output length
+ *              MaxLength       - Maximum output length. Used to constrain the
+ *                                length of strings during debug output only.
  *
  * RETURN:      None
  *
@@ -479,7 +480,7 @@ ErrorExit:
 void
 AcpiUtPrintString (
     char                    *String,
-    UINT8                   MaxLength)
+    UINT16                  MaxLength)
 {
     UINT32                  i;
 
diff --git a/src/acpica/source/include/acdisasm.h b/src/acpica/source/include/acdisasm.h
index 440103e..d328c2b 100644
--- a/src/acpica/source/include/acdisasm.h
+++ b/src/acpica/source/include/acdisasm.h
@@ -180,6 +180,7 @@ typedef enum
     ACPI_DMT_UINT56,
     ACPI_DMT_UINT64,
     ACPI_DMT_BUF7,
+    ACPI_DMT_BUF10,
     ACPI_DMT_BUF16,
     ACPI_DMT_BUF128,
     ACPI_DMT_SIG,
diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h
index 56383de..7042300 100644
--- a/src/acpica/source/include/acpixf.h
+++ b/src/acpica/source/include/acpixf.h
@@ -119,7 +119,7 @@
 
 /* Current ACPICA subsystem version in YYYYMMDD format */
 
-#define ACPI_CA_VERSION                 0x20130517
+#define ACPI_CA_VERSION                 0x20130626
 
 #include "acconfig.h"
 #include "actypes.h"
diff --git a/src/acpica/source/include/actables.h b/src/acpica/source/include/actables.h
index 3e88f73..dc1bb21 100644
--- a/src/acpica/source/include/actables.h
+++ b/src/acpica/source/include/actables.h
@@ -122,6 +122,15 @@ AcpiAllocateRootTable (
     UINT32                  InitialTableCount);
 
 /*
+ * tbxfroot - Root pointer utilities
+ */
+UINT8 *
+AcpiTbScanMemoryForRsdp (
+    UINT8                   *StartAddress,
+    UINT32                  Length);
+
+
+/*
  * tbfadt - FADT parse/convert/validate
  */
 void
diff --git a/src/acpica/source/include/actypes.h b/src/acpica/source/include/actypes.h
index f8c48a3..50d315b 100644
--- a/src/acpica/source/include/actypes.h
+++ b/src/acpica/source/include/actypes.h
@@ -752,13 +752,6 @@ typedef UINT32                          ACPI_EVENT_STATUS;
 #define ACPI_EVENT_FLAG_WAKE_ENABLED    (ACPI_EVENT_STATUS) 0x02
 #define ACPI_EVENT_FLAG_SET             (ACPI_EVENT_STATUS) 0x04
 
-/*
- * General Purpose Events (GPE)
- */
-#define ACPI_GPE_INVALID                0xFF
-#define ACPI_GPE_MAX                    0xFF
-#define ACPI_NUM_GPE                    256
-
 /* Actions for AcpiSetGpe, AcpiGpeWakeup, AcpiHwLowSetGpe */
 
 #define ACPI_GPE_ENABLE                 0
diff --git a/src/acpica/source/include/acutils.h b/src/acpica/source/include/acutils.h
index fdbc142..62442de 100644
--- a/src/acpica/source/include/acutils.h
+++ b/src/acpica/source/include/acutils.h
@@ -975,7 +975,7 @@ AcpiUtStrtoul64 (
 void
 AcpiUtPrintString (
     char                    *String,
-    UINT8                   MaxLength);
+    UINT16                  MaxLength);
 
 void
 UtConvertBackslashes (
diff --git a/src/acpica/source/tools/acpiexec/aehandlers.c b/src/acpica/source/tools/acpiexec/aehandlers.c
index ef869f6..c5024b5 100644
--- a/src/acpica/source/tools/acpiexec/aehandlers.c
+++ b/src/acpica/source/tools/acpiexec/aehandlers.c
@@ -1264,7 +1264,7 @@ AeRegionHandler (
             case AML_FIELD_ATTRIB_QUICK:
             case AML_FIELD_ATTRIB_SEND_RCV:
             case AML_FIELD_ATTRIB_BYTE:
-                
+
                 Length = 1;
                 break;
 
