diff --git a/src/acpica/source/common/dmextern.c b/src/acpica/source/common/dmextern.c
index 0cd094f..87aeddc 100644
--- a/src/acpica/source/common/dmextern.c
+++ b/src/acpica/source/common/dmextern.c
@@ -791,34 +791,54 @@ AcpiDmEmitExternals (
 
     AcpiDmUnresolvedWarning (1);
 
+    /* Emit any unresolved method externals in a single text block */
+
+    NextExternal = AcpiGbl_ExternalList;
+    while (NextExternal)
+    {
+        if ((NextExternal->Type == ACPI_TYPE_METHOD) &&
+            (!NextExternal->Resolved))
+        {
+            AcpiOsPrintf ("    External (%s%s",
+                NextExternal->Path,
+                AcpiDmGetObjectTypeName (NextExternal->Type));
+
+            AcpiOsPrintf (")    // Warning: Unresolved Method, "
+                "guessing %u arguments (may be incorrect, see warning above)\n",
+                NextExternal->Value);
+
+            NextExternal->Emitted = TRUE;
+        }
+
+        NextExternal = NextExternal->Next;
+    }
+
+    AcpiOsPrintf ("\n");
+
     /*
      * Walk the list of externals (unresolved references)
      * found during the AML parsing
      */
     while (AcpiGbl_ExternalList)
     {
-        AcpiOsPrintf ("    External (%s%s",
-            AcpiGbl_ExternalList->Path,
-            AcpiDmGetObjectTypeName (AcpiGbl_ExternalList->Type));
-
-        if (AcpiGbl_ExternalList->Type == ACPI_TYPE_METHOD)
+        if (!AcpiGbl_ExternalList->Emitted)
         {
-            if (AcpiGbl_ExternalList->Resolved)
+            AcpiOsPrintf ("    External (%s%s",
+                AcpiGbl_ExternalList->Path,
+                AcpiDmGetObjectTypeName (AcpiGbl_ExternalList->Type));
+
+            /* For methods, add a comment with the number of arguments */
+
+            if (AcpiGbl_ExternalList->Type == ACPI_TYPE_METHOD)
             {
                 AcpiOsPrintf (")    // %u Arguments\n",
                     AcpiGbl_ExternalList->Value);
             }
             else
             {
-                AcpiOsPrintf (")    // Warning: unresolved Method, "
-                    "assuming %u arguments (may be incorrect, see warning above)\n",
-                    AcpiGbl_ExternalList->Value);
+                AcpiOsPrintf (")\n");
             }
         }
-        else
-        {
-            AcpiOsPrintf (")\n");
-        }
 
         /* Free this external info block and move on to next external */
 
@@ -1003,5 +1023,4 @@ AcpiDmUnresolvedWarning (
                 (AcpiGbl_NumExternalMethods - AcpiGbl_ResolvedExternalMethods));
         }
     }
-
 }
diff --git a/src/acpica/source/compiler/asloffset.c b/src/acpica/source/compiler/asloffset.c
index 3c6551e..1c6911f 100644
--- a/src/acpica/source/compiler/asloffset.c
+++ b/src/acpica/source/compiler/asloffset.c
@@ -129,10 +129,12 @@ static void
 LsEmitOffsetTableEntry (
     UINT32                  FileId,
     ACPI_NAMESPACE_NODE     *Node,
+    UINT32                  NamepathOffset,
     UINT32                  Offset,
     char                    *OpName,
     UINT64                  Value,
-    UINT8                   AmlOpcode);
+    UINT8                   AmlOpcode,
+    UINT16                  ParentOpcode);
 
 
 /*******************************************************************************
@@ -166,7 +168,8 @@ LsAmlOffsetWalk (
     UINT32                  FileId = (UINT32) ACPI_TO_INTEGER (Context);
     ACPI_NAMESPACE_NODE     *Node;
     UINT32                  Length;
-    UINT32                  OffsetOfOpcode;
+    UINT32                  NamepathOffset;
+    UINT32                  DataOffset;
     ACPI_PARSE_OBJECT       *NextOp;
 
 
@@ -191,8 +194,9 @@ LsAmlOffsetWalk (
     if ((Node->Type == ACPI_TYPE_LOCAL_RESOURCE) &&
         (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC))
     {
-        LsEmitOffsetTableEntry (FileId, Node, Gbl_CurrentAmlOffset,
-            Op->Asl.ParseOpName, 0, Op->Asl.Extra);
+        LsEmitOffsetTableEntry (FileId, Node, 0, Gbl_CurrentAmlOffset,
+            Op->Asl.ParseOpName, 0, Op->Asl.Extra, AML_BUFFER_OP);
+
         Gbl_CurrentAmlOffset += Op->Asl.FinalAmlLength;
         return (AE_OK);
     }
@@ -210,22 +214,25 @@ LsAmlOffsetWalk (
         }
 
         Length = Op->Asl.FinalAmlLength;
+        NamepathOffset = Gbl_CurrentAmlOffset + Length;
 
         /* Get to the NameSeg/NamePath Op (and length of the name) */
 
         Op = Op->Asl.Child;
-        OffsetOfOpcode = Length + Op->Asl.FinalAmlLength;
+
+        /* Get offset of last nameseg and the actual data */
+
+        NamepathOffset = Gbl_CurrentAmlOffset + Length +
+            (Op->Asl.FinalAmlLength - ACPI_NAME_SIZE);
+
+        DataOffset = Gbl_CurrentAmlOffset + Length +
+            Op->Asl.FinalAmlLength;
 
         /* Get actual value associated with the name */
 
         Op = Op->Asl.Next;
         switch (Op->Asl.AmlOpcode)
         {
-        /*
-         * We are only interested in integer constants that can be changed
-         * at boot time. Note, the One/Ones/Zero opcodes are considered
-         * non-changeable, so we ignore them here.
-         */
         case AML_BYTE_OP:
         case AML_WORD_OP:
         case AML_DWORD_OP:
@@ -233,22 +240,32 @@ LsAmlOffsetWalk (
 
             /* The +1 is to handle the integer size prefix (opcode) */
 
-            LsEmitOffsetTableEntry (FileId, Node,
-                (Gbl_CurrentAmlOffset + OffsetOfOpcode + 1),
+            LsEmitOffsetTableEntry (FileId, Node, NamepathOffset, (DataOffset + 1),
                 Op->Asl.ParseOpName, Op->Asl.Value.Integer,
-                (UINT8) Op->Asl.AmlOpcode);
+                (UINT8) Op->Asl.AmlOpcode, AML_NAME_OP);
+            break;
+
+        case AML_ONE_OP:
+        case AML_ONES_OP:
+        case AML_ZERO_OP:
+
+            /* For these, offset will point to the opcode */
+
+            LsEmitOffsetTableEntry (FileId, Node, NamepathOffset, DataOffset,
+                Op->Asl.ParseOpName, Op->Asl.Value.Integer,
+                (UINT8) Op->Asl.AmlOpcode, AML_NAME_OP);
             break;
 
         case AML_PACKAGE_OP:
         case AML_VAR_PACKAGE_OP:
 
+            /* Get the package element count */
+
             NextOp = Op->Asl.Child;
 
-            LsEmitOffsetTableEntry (FileId, Node,
-                (Gbl_CurrentAmlOffset + OffsetOfOpcode),
-                Op->Asl.ParseOpName,
-                NextOp->Asl.Value.Integer,
-                (UINT8) Op->Asl.AmlOpcode);
+            LsEmitOffsetTableEntry (FileId, Node, NamepathOffset, DataOffset,
+                Op->Asl.ParseOpName, NextOp->Asl.Value.Integer,
+                (UINT8) Op->Asl.AmlOpcode, AML_NAME_OP);
             break;
 
          default:
@@ -267,7 +284,14 @@ LsAmlOffsetWalk (
         /* Get the name/namepath node */
 
         NextOp = Op->Asl.Child;
-        OffsetOfOpcode = Length + NextOp->Asl.FinalAmlLength + 1;
+
+        /* Get offset of last nameseg and the actual data */
+
+        NamepathOffset = Gbl_CurrentAmlOffset + Length +
+            (NextOp->Asl.FinalAmlLength - ACPI_NAME_SIZE);
+
+        DataOffset = Gbl_CurrentAmlOffset + Length +
+            (NextOp->Asl.FinalAmlLength + 1);
 
         /* Get the SpaceId node, then the Offset (address) node */
 
@@ -286,10 +310,9 @@ LsAmlOffsetWalk (
         case AML_DWORD_OP:
         case AML_QWORD_OP:
 
-            LsEmitOffsetTableEntry (FileId, Node,
-                (Gbl_CurrentAmlOffset + OffsetOfOpcode + 1),
+            LsEmitOffsetTableEntry (FileId, Node, NamepathOffset, (DataOffset + 1),
                 Op->Asl.ParseOpName, NextOp->Asl.Value.Integer,
-                (UINT8) NextOp->Asl.AmlOpcode);
+                (UINT8) NextOp->Asl.AmlOpcode, AML_REGION_OP);
 
             Gbl_CurrentAmlOffset += Length;
             return (AE_OK);
@@ -309,15 +332,62 @@ LsAmlOffsetWalk (
 
         NextOp = Op->Asl.Child;
 
-        /* Point to the *last* nameseg in the namepath */
+        /* Get offset of last nameseg and the actual data (flags byte) */
 
-        OffsetOfOpcode = NextOp->Asl.FinalAmlLength - ACPI_NAME_SIZE;
+        NamepathOffset = Gbl_CurrentAmlOffset + Length +
+            (NextOp->Asl.FinalAmlLength - ACPI_NAME_SIZE);
 
-        LsEmitOffsetTableEntry (FileId, Node,
-            (Gbl_CurrentAmlOffset + OffsetOfOpcode + Length),
-            Op->Asl.ParseOpName,
-            *((UINT32 *) &NextOp->Asl.Value.Buffer[OffsetOfOpcode]),
-            (UINT8) Op->Asl.AmlOpcode);
+        DataOffset = Gbl_CurrentAmlOffset + Length +
+            NextOp->Asl.FinalAmlLength;
+
+        /* Get the flags byte Op */
+
+        NextOp = NextOp->Asl.Next;
+
+        LsEmitOffsetTableEntry (FileId, Node, NamepathOffset, DataOffset,
+            Op->Asl.ParseOpName, NextOp->Asl.Value.Integer,
+            (UINT8) Op->Asl.AmlOpcode, AML_METHOD_OP);
+        break;
+
+    case AML_PROCESSOR_OP:
+
+        /* Processor (Namepath, ProcessorId, Address, Length) */
+
+        Length = Op->Asl.FinalAmlLength;
+        NextOp = Op->Asl.Child;     /* Get Namepath */
+
+        /* Get offset of last nameseg and the actual data (PBlock address) */
+
+        NamepathOffset = Gbl_CurrentAmlOffset + Length +
+            (NextOp->Asl.FinalAmlLength - ACPI_NAME_SIZE);
+
+        DataOffset = Gbl_CurrentAmlOffset + Length +
+            (NextOp->Asl.FinalAmlLength + 1);
+
+        NextOp = NextOp->Asl.Next;  /* Get ProcessorID (BYTE) */
+        NextOp = NextOp->Asl.Next;  /* Get Address (DWORD) */
+
+        LsEmitOffsetTableEntry (FileId, Node, NamepathOffset, DataOffset,
+            Op->Asl.ParseOpName, NextOp->Asl.Value.Integer,
+            (UINT8) AML_DWORD_OP, AML_PROCESSOR_OP);
+        break;
+
+    case AML_DEVICE_OP:
+    case AML_SCOPE_OP:
+    case AML_THERMAL_ZONE_OP:
+
+        /* Device/Scope/ThermalZone (Namepath) */
+
+        Length = Op->Asl.FinalAmlLength;
+        NextOp = Op->Asl.Child;     /* Get Namepath */
+
+        /* Get offset of last nameseg */
+
+        NamepathOffset = Gbl_CurrentAmlOffset + Length +
+            (NextOp->Asl.FinalAmlLength - ACPI_NAME_SIZE);
+
+        LsEmitOffsetTableEntry (FileId, Node, NamepathOffset, 0,
+            Op->Asl.ParseOpName, 0, (UINT8) 0, Op->Asl.AmlOpcode);
         break;
 
     default:
@@ -339,6 +409,7 @@ LsAmlOffsetWalk (
  *              OpName          - Name of the AML opcode
  *              Value           - Current value of the AML field
  *              AmlOpcode       - Opcode associated with the field
+ *              ObjectType      - ACPI object type
  *
  * RETURN:      None
  *
@@ -350,10 +421,12 @@ static void
 LsEmitOffsetTableEntry (
     UINT32                  FileId,
     ACPI_NAMESPACE_NODE     *Node,
+    UINT32                  NamepathOffset,
     UINT32                  Offset,
     char                    *OpName,
     UINT64                  Value,
-    UINT8                   AmlOpcode)
+    UINT8                   AmlOpcode,
+    UINT16                  ParentOpcode)
 {
     ACPI_BUFFER             TargetPath;
     ACPI_STATUS             Status;
@@ -380,8 +453,9 @@ LsEmitOffsetTableEntry (
      * Max Length for Integers is 8 bytes.
      */
     FlPrintFile (FileId,
-        "    {%-29s 0x%8.8X, 0x%2.2X, 0x%8.8X%8.8X}, /* %s */\n",
-        MsgBuffer, Offset, AmlOpcode, ACPI_FORMAT_UINT64 (Value), OpName);
+        "    {%-29s 0x%4.4X, 0x%8.8X, 0x%2.2X, 0x%8.8X, 0x%8.8X%8.8X}, /* %s */\n",
+        MsgBuffer, ParentOpcode, NamepathOffset, AmlOpcode,
+        Offset, ACPI_FORMAT_UINT64 (Value), OpName);
 }
 
 
@@ -407,10 +481,12 @@ LsDoOffsetTableHeader (
         "#define __AML_OFFSET_TABLE_H\n\n");
 
     FlPrintFile (FileId, "typedef struct {\n"
-        "    char                   *Pathname;\n"
-        "    unsigned long          Offset;\n"
-        "    unsigned char          Opcode;\n"
-        "    unsigned long long     Value;\n"
+        "    char                   *Pathname;      /* Full pathname (from root) to the object */\n"
+        "    unsigned short         ParentOpcode;   /* AML opcode for the parent object */\n"
+        "    unsigned long          NamesegOffset;  /* Offset of last nameseg in the parent namepath */\n"
+        "    unsigned char          Opcode;         /* AML opcode for the data */\n"
+        "    unsigned long          Offset;         /* Offset for the data */\n"
+        "    unsigned long long     Value;          /* Original value of the data (as applicable) */\n"
         "} AML_OFFSET_TABLE_ENTRY;\n\n");
 
     FlPrintFile (FileId,
@@ -418,29 +494,37 @@ LsDoOffsetTableHeader (
 
     FlPrintFile (FileId,
         "/*\n"
-        " * Information about supported object types:\n"
+        " * Information specific to the supported object types:\n"
         " *\n"
         " * Integers:\n"
-        " *    Offset points to the actual integer data\n"
         " *    Opcode is the integer prefix, indicates length of the data\n"
+        " *        (One of: BYTE, WORD, DWORD, QWORD, ZERO, ONE, ONES)\n"
+        " *    Offset points to the actual integer data\n"
         " *    Value is the existing value in the AML\n"
         " *\n"
         " * Packages:\n"
-        " *    Offset points to the package opcode\n"
         " *    Opcode is the package or var_package opcode\n"
-        " *    Value is the package element cound\n"
+        " *    Offset points to the package opcode\n"
+        " *    Value is the package element count\n"
         " *\n"
         " * Operation Regions:\n"
-        " *    Offset points to the region address data\n"
         " *    Opcode is the address integer prefix, indicates length of the data\n"
+        " *    Offset points to the region address\n"
         " *    Value is the existing address value in the AML\n"
         " *\n"
         " * Control Methods:\n"
-        " *    Offset points to the first byte of the namepath\n"
+        " *    Offset points to the method flags byte\n"
+        " *    Value is the existing flags value in the AML\n"
+        " *\n"
+        " * Processors:\n"
+        " *    Offset points to the first byte of the PBlock Address\n"
         " *\n"
         " * Resource Descriptors:\n"
-        " *    Offset points to the start of the descriptor\n"
         " *    Opcode is the descriptor type\n"
+        " *    Offset points to the start of the descriptor\n"
+        " *\n"
+        " * Scopes/Devices/ThermalZones:\n"
+        " *    Nameseg offset only\n"
         " */\n");
 
     FlPrintFile (FileId,
@@ -455,6 +539,6 @@ LsDoOffsetTableFooter (
 {
 
     FlPrintFile (FileId,
-        "    {0,0,0,0} /* Table terminator */\n};\n\n");
+        "    {NULL,0,0,0,0,0} /* Table terminator */\n};\n\n");
     Gbl_CurrentAmlOffset = 0;
 }
diff --git a/src/acpica/source/compiler/asloperands.c b/src/acpica/source/compiler/asloperands.c
index a9f08d0..1a85a9f 100644
--- a/src/acpica/source/compiler/asloperands.c
+++ b/src/acpica/source/compiler/asloperands.c
@@ -1043,12 +1043,15 @@ OpnDoDefinitionBlock (
         Gbl_TableId = AcpiOsAllocate (Length + 1);
         ACPI_STRCPY (Gbl_TableId, Child->Asl.Value.String);
 
+        /*
+         * Convert anything non-alphanumeric to an underscore. This
+         * allows us to use the TableID to generate unique C symbols.
+         */
         for (i = 0; i < Length; i++)
         {
-            if (Gbl_TableId[i] == ' ')
+            if (!isalnum ((int) Gbl_TableId[i]))
             {
-                Gbl_TableId[i] = 0;
-                break;
+                Gbl_TableId[i] = '_';
             }
         }
     }
diff --git a/src/acpica/source/compiler/dttemplate.c b/src/acpica/source/compiler/dttemplate.c
index 53cc34c..bdcad38 100644
--- a/src/acpica/source/compiler/dttemplate.c
+++ b/src/acpica/source/compiler/dttemplate.c
@@ -189,13 +189,21 @@ DtCreateTemplates (
 
 
     AslInitializeGlobals ();
-    AcpiUtStrupr (Signature);
 
-    /* Create all known templates if requested */
+    /* Default (no signature) is DSDT */
+
+    if (!Signature)
+    {
+        Signature = "DSDT";
+        goto GetTemplate;
+    }
 
-    if (!ACPI_STRNCMP (Signature, "ALL", 3) ||
+    AcpiUtStrupr (Signature);
+    if (!ACPI_STRCMP (Signature, "ALL") ||
         !ACPI_STRCMP (Signature, "*"))
     {
+        /* Create all available/known templates */
+
         Status = DtCreateAllTemplates ();
         return (Status);
     }
@@ -208,7 +216,9 @@ DtCreateTemplates (
      */
     if (strlen (Signature) != ACPI_NAME_SIZE)
     {
-        fprintf (stderr, "%s, Invalid ACPI table signature\n", Signature);
+        fprintf (stderr,
+            "%s: Invalid ACPI table signature (length must be 4 characters)\n",
+            Signature);
         return (AE_ERROR);
     }
 
@@ -225,19 +235,20 @@ DtCreateTemplates (
         Signature = "FACP";
     }
 
+GetTemplate:
     TableData = AcpiDmGetTableData (Signature);
     if (TableData)
     {
         if (!TableData->Template)
         {
-            fprintf (stderr, "%4.4s, No template available\n", Signature);
+            fprintf (stderr, "%4.4s: No template available\n", Signature);
             return (AE_ERROR);
         }
     }
     else if (!AcpiUtIsSpecialTable (Signature))
     {
         fprintf (stderr,
-            "%4.4s, Unrecognized ACPI table signature\n", Signature);
+            "%4.4s: Unrecognized ACPI table signature\n", Signature);
         return (AE_ERROR);
     }
 
diff --git a/src/acpica/source/components/executer/exoparg1.c b/src/acpica/source/components/executer/exoparg1.c
index ee6ffc1..8bde71a 100644
--- a/src/acpica/source/components/executer/exoparg1.c
+++ b/src/acpica/source/components/executer/exoparg1.c
@@ -1081,10 +1081,17 @@ AcpiExOpcode_1A_0T_1R (
                      * add another reference to the referenced object, however.
                      */
                     ReturnDesc = *(Operand[0]->Reference.Where);
-                    if (ReturnDesc)
+                    if (!ReturnDesc)
                     {
-                        AcpiUtAddReference (ReturnDesc);
+                        /*
+                         * Element is NULL, do not allow the dereference.
+                         * This provides compatibility with other ACPI
+                         * implementations.
+                         */
+                        return_ACPI_STATUS (AE_AML_UNINITIALIZED_ELEMENT);
                     }
+
+                    AcpiUtAddReference (ReturnDesc);
                     break;
 
                 default:
@@ -1102,15 +1109,44 @@ AcpiExOpcode_1A_0T_1R (
                 ReturnDesc = Operand[0]->Reference.Object;
 
                 if (ACPI_GET_DESCRIPTOR_TYPE (ReturnDesc) ==
-                        ACPI_DESC_TYPE_NAMED)
+                    ACPI_DESC_TYPE_NAMED)
                 {
                     ReturnDesc = AcpiNsGetAttachedObject (
-                                    (ACPI_NAMESPACE_NODE *) ReturnDesc);
-                }
+                        (ACPI_NAMESPACE_NODE *) ReturnDesc);
+                    if (!ReturnDesc)
+                    {
+                        break;
+                    }
 
-                /* Add another reference to the object! */
+                   /*
+                    * June 2013:
+                    * BufferFields/FieldUnits require additional resolution
+                    */
+                    switch (ReturnDesc->Common.Type)
+                    {
+                    case ACPI_TYPE_BUFFER_FIELD:
+                    case ACPI_TYPE_LOCAL_REGION_FIELD:
+                    case ACPI_TYPE_LOCAL_BANK_FIELD:
+                    case ACPI_TYPE_LOCAL_INDEX_FIELD:
 
-                AcpiUtAddReference (ReturnDesc);
+                        Status = AcpiExReadDataFromField (WalkState,
+                            ReturnDesc, &TempDesc);
+                        if (ACPI_FAILURE (Status))
+                        {
+                            goto Cleanup;
+                        }
+
+                        ReturnDesc = TempDesc;
+                        break;
+
+                    default:
+
+                        /* Add another reference to the object */
+
+                        AcpiUtAddReference (ReturnDesc);
+                        break;
+                    }
+                }
                 break;
 
             default:
diff --git a/src/acpica/source/components/namespace/nspredef.c b/src/acpica/source/components/namespace/nspredef.c
index e7bc55b..15ba35e 100644
--- a/src/acpica/source/components/namespace/nspredef.c
+++ b/src/acpica/source/components/namespace/nspredef.c
@@ -237,11 +237,16 @@ AcpiNsCheckReturnValue (
         goto Exit;
     }
 
+    /*
+     *
+     * 4) If there is no return value and it is optional, just return
+     * AE_OK (_WAK).
+     */
     if (!(*ReturnObjectPtr))
     {
-        Status = AE_AML_NO_RETURN_VALUE;
         goto Exit;
     }
+
     /*
      * For returned Package objects, check the type of all sub-objects.
      * Note: Package may have been newly created by call above.
@@ -370,7 +375,13 @@ TypeErrorExit:
 
     AcpiUtGetExpectedReturnTypes (TypeBuffer, ExpectedBtypes);
 
-    if (PackageIndex == ACPI_NOT_PACKAGE_ELEMENT)
+    if (!ReturnObject)
+    {
+        ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
+            "Expected return object of type %s",
+            TypeBuffer));
+    }
+    else if (PackageIndex == ACPI_NOT_PACKAGE_ELEMENT)
     {
         ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
             "Return type mismatch - found %s, expected %s",
diff --git a/src/acpica/source/components/namespace/nswalk.c b/src/acpica/source/components/namespace/nswalk.c
index 1084a02..20b1b32 100644
--- a/src/acpica/source/components/namespace/nswalk.c
+++ b/src/acpica/source/components/namespace/nswalk.c
@@ -237,9 +237,9 @@ AcpiNsGetNextNodeTyped (
  *              MaxDepth            - Depth to which search is to reach
  *              Flags               - Whether to unlock the NS before invoking
  *                                    the callback routine
- *              PreOrderVisit       - Called during tree pre-order visit
+ *              DescendingCallback  - Called during tree descent
  *                                    when an object of "Type" is found
- *              PostOrderVisit      - Called during tree post-order visit
+ *              AscendingCallback   - Called during tree ascent
  *                                    when an object of "Type" is found
  *              Context             - Passed to user function(s) above
  *              ReturnValue         - from the UserFunction if terminated
@@ -267,8 +267,8 @@ AcpiNsWalkNamespace (
     ACPI_HANDLE             StartNode,
     UINT32                  MaxDepth,
     UINT32                  Flags,
-    ACPI_WALK_CALLBACK      PreOrderVisit,
-    ACPI_WALK_CALLBACK      PostOrderVisit,
+    ACPI_WALK_CALLBACK      DescendingCallback,
+    ACPI_WALK_CALLBACK      AscendingCallback,
     void                    *Context,
     void                    **ReturnValue)
 {
@@ -346,22 +346,22 @@ AcpiNsWalkNamespace (
             }
 
             /*
-             * Invoke the user function, either pre-order or post-order
+             * Invoke the user function, either descending, ascending,
              * or both.
              */
             if (!NodePreviouslyVisited)
             {
-                if (PreOrderVisit)
+                if (DescendingCallback)
                 {
-                    Status = PreOrderVisit (ChildNode, Level,
+                    Status = DescendingCallback (ChildNode, Level,
                                 Context, ReturnValue);
                 }
             }
             else
             {
-                if (PostOrderVisit)
+                if (AscendingCallback)
                 {
-                    Status = PostOrderVisit (ChildNode, Level,
+                    Status = AscendingCallback (ChildNode, Level,
                                 Context, ReturnValue);
                 }
             }
diff --git a/src/acpica/source/components/namespace/nsxfeval.c b/src/acpica/source/components/namespace/nsxfeval.c
index 901a931..650b774 100644
--- a/src/acpica/source/components/namespace/nsxfeval.c
+++ b/src/acpica/source/components/namespace/nsxfeval.c
@@ -646,9 +646,9 @@ AcpiNsResolveReferences (
  * PARAMETERS:  Type                - ACPI_OBJECT_TYPE to search for
  *              StartObject         - Handle in namespace where search begins
  *              MaxDepth            - Depth to which search is to reach
- *              PreOrderVisit       - Called during tree pre-order visit
+ *              DescendingCallback  - Called during tree descent
  *                                    when an object of "Type" is found
- *              PostOrderVisit      - Called during tree post-order visit
+ *              AscendingCallback   - Called during tree ascent
  *                                    when an object of "Type" is found
  *              Context             - Passed to user function(s) above
  *              ReturnValue         - Location where return value of
@@ -677,8 +677,8 @@ AcpiWalkNamespace (
     ACPI_OBJECT_TYPE        Type,
     ACPI_HANDLE             StartObject,
     UINT32                  MaxDepth,
-    ACPI_WALK_CALLBACK      PreOrderVisit,
-    ACPI_WALK_CALLBACK      PostOrderVisit,
+    ACPI_WALK_CALLBACK      DescendingCallback,
+    ACPI_WALK_CALLBACK      AscendingCallback,
     void                    *Context,
     void                    **ReturnValue)
 {
@@ -692,7 +692,7 @@ AcpiWalkNamespace (
 
     if ((Type > ACPI_TYPE_LOCAL_MAX) ||
         (!MaxDepth)                  ||
-        (!PreOrderVisit && !PostOrderVisit))
+        (!DescendingCallback && !AscendingCallback))
     {
         return_ACPI_STATUS (AE_BAD_PARAMETER);
     }
@@ -727,8 +727,8 @@ AcpiWalkNamespace (
     }
 
     Status = AcpiNsWalkNamespace (Type, StartObject, MaxDepth,
-                ACPI_NS_WALK_UNLOCK, PreOrderVisit,
-                PostOrderVisit, Context, ReturnValue);
+                ACPI_NS_WALK_UNLOCK, DescendingCallback,
+                AscendingCallback, Context, ReturnValue);
 
     (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
 
diff --git a/src/acpica/source/components/tables/tbfadt.c b/src/acpica/source/components/tables/tbfadt.c
index 7e00831..d90baba 100644
--- a/src/acpica/source/components/tables/tbfadt.c
+++ b/src/acpica/source/components/tables/tbfadt.c
@@ -204,7 +204,7 @@ static ACPI_FADT_INFO     FadtInfoTable[] =
         ACPI_FADT_OFFSET (PmTimerBlock),
         ACPI_FADT_OFFSET (PmTimerLength),
         ACPI_PM_TIMER_WIDTH,
-        ACPI_FADT_REQUIRED},
+        ACPI_FADT_SEPARATE_LENGTH},         /* ACPI 5.0A: Timer is optional */
 
     {"Gpe0Block",
         ACPI_FADT_OFFSET (XGpe0Block),
@@ -678,7 +678,7 @@ AcpiTbValidateFadt (
         if (FadtInfoTable[i].Type & ACPI_FADT_REQUIRED)
         {
             /*
-             * Field is required (PM1aEvent, PM1aControl, PmTimer).
+             * Field is required (PM1aEvent, PM1aControl).
              * Both the address and length must be non-zero.
              */
             if (!Address64->Address || !Length)
diff --git a/src/acpica/source/components/tables/tbxfroot.c b/src/acpica/source/components/tables/tbxfroot.c
index 7e6a620..b9db205 100644
--- a/src/acpica/source/components/tables/tbxfroot.c
+++ b/src/acpica/source/components/tables/tbxfroot.c
@@ -123,12 +123,6 @@
 #define _COMPONENT          ACPI_TABLES
         ACPI_MODULE_NAME    ("tbxfroot")
 
-/* Local prototypes */
-
-static ACPI_STATUS
-AcpiTbValidateRsdp (
-    ACPI_TABLE_RSDP         *Rsdp);
-
 
 /*******************************************************************************
  *
@@ -142,7 +136,7 @@ AcpiTbValidateRsdp (
  *
  ******************************************************************************/
 
-static ACPI_STATUS
+ACPI_STATUS
 AcpiTbValidateRsdp (
     ACPI_TABLE_RSDP         *Rsdp)
 {
@@ -153,7 +147,7 @@ AcpiTbValidateRsdp (
      * Note: Sometimes there exists more than one RSDP in memory; the valid
      * RSDP has a valid checksum, all others have an invalid checksum.
      */
-    if (ACPI_STRNCMP ((char *) Rsdp, ACPI_SIG_RSDP,
+    if (ACPI_STRNCMP ((char *) Rsdp->Signature, ACPI_SIG_RSDP,
             sizeof (ACPI_SIG_RSDP)-1) != 0)
     {
         /* Nope, BAD Signature */
diff --git a/src/acpica/source/components/utilities/utglobal.c b/src/acpica/source/components/utilities/utglobal.c
index 330b86b..1ce7610 100644
--- a/src/acpica/source/components/utilities/utglobal.c
+++ b/src/acpica/source/components/utilities/utglobal.c
@@ -391,7 +391,6 @@ AcpiUtInitGlobals (
     AcpiGbl_TraceDbgLayer               = 0;
     AcpiGbl_DebuggerConfiguration       = DEBUGGER_THREADING;
     AcpiGbl_DbOutputFlags               = ACPI_DB_CONSOLE_OUTPUT;
-    AcpiGbl_OsiData                     = 0;
     AcpiGbl_OsiMutex                    = NULL;
     AcpiGbl_RegMethodsExecuted          = FALSE;
 
diff --git a/src/acpica/source/components/utilities/utosi.c b/src/acpica/source/components/utilities/utosi.c
index cda1bfe..55a1d92 100644
--- a/src/acpica/source/components/utilities/utosi.c
+++ b/src/acpica/source/components/utilities/utosi.c
@@ -153,21 +153,20 @@ static ACPI_INTERFACE_INFO    AcpiDefaultSupportedInterfaces[] =
 
     /* Feature Group Strings */
 
-    {"Extended Address Space Descriptor", NULL, 0, 0}
+    {"Extended Address Space Descriptor", NULL, ACPI_OSI_FEATURE, 0},
 
     /*
      * All "optional" feature group strings (features that are implemented
-     * by the host) should be dynamically added by the host via
-     * AcpiInstallInterface and should not be manually added here.
-     *
-     * Examples of optional feature group strings:
-     *
-     * "Module Device"
-     * "Processor Device"
-     * "3.0 Thermal Model"
-     * "3.0 _SCP Extensions"
-     * "Processor Aggregator Device"
+     * by the host) should be dynamically modified to VALID by the host via
+     * AcpiInstallInterface or AcpiUpdateInterfaces. Such optional feature
+     * group strings are set as INVALID by default here.
      */
+
+    {"Module Device",               NULL, ACPI_OSI_OPTIONAL_FEATURE, 0},
+    {"Processor Device",            NULL, ACPI_OSI_OPTIONAL_FEATURE, 0},
+    {"3.0 Thermal Model",           NULL, ACPI_OSI_OPTIONAL_FEATURE, 0},
+    {"3.0 _SCP Extensions",         NULL, ACPI_OSI_OPTIONAL_FEATURE, 0},
+    {"Processor Aggregator Device", NULL, ACPI_OSI_OPTIONAL_FEATURE, 0}
 };
 
 
@@ -244,13 +243,26 @@ AcpiUtInterfaceTerminate (
     {
         AcpiGbl_SupportedInterfaces = NextInterface->Next;
 
-        /* Only interfaces added at runtime can be freed */
-
         if (NextInterface->Flags & ACPI_OSI_DYNAMIC)
         {
+            /* Only interfaces added at runtime can be freed */
+
             ACPI_FREE (NextInterface->Name);
             ACPI_FREE (NextInterface);
         }
+        else
+        {
+            /* Interface is in static list. Reset it to invalid or valid. */
+
+            if (NextInterface->Flags & ACPI_OSI_DEFAULT_INVALID)
+            {
+                NextInterface->Flags |= ACPI_OSI_INVALID;
+            }
+            else
+            {
+                NextInterface->Flags &= ~ACPI_OSI_INVALID;
+            }
+        }
 
         NextInterface = AcpiGbl_SupportedInterfaces;
     }
@@ -379,6 +391,57 @@ AcpiUtRemoveInterface (
 
 /*******************************************************************************
  *
+ * FUNCTION:    AcpiUtUpdateInterfaces
+ *
+ * PARAMETERS:  Action              - Actions to be performed during the
+ *                                    update
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Update _OSI interface strings, disabling or enabling OS vendor
+ *              strings or/and feature group strings.
+ *              Caller MUST hold AcpiGbl_OsiMutex
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtUpdateInterfaces (
+    UINT8                   Action)
+{
+    ACPI_INTERFACE_INFO     *NextInterface;
+
+
+    NextInterface = AcpiGbl_SupportedInterfaces;
+    while (NextInterface)
+    {
+        if (((NextInterface->Flags & ACPI_OSI_FEATURE) &&
+             (Action & ACPI_FEATURE_STRINGS)) ||
+            (!(NextInterface->Flags & ACPI_OSI_FEATURE) &&
+             (Action & ACPI_VENDOR_STRINGS)))
+        {
+            if (Action & ACPI_DISABLE_INTERFACES)
+            {
+                /* Mark the interfaces as invalid */
+
+                NextInterface->Flags |= ACPI_OSI_INVALID;
+            }
+            else
+            {
+                /* Mark the interfaces as valid */
+
+                NextInterface->Flags &= ~ACPI_OSI_INVALID;
+            }
+        }
+
+        NextInterface = NextInterface->Next;
+    }
+
+    return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
  * FUNCTION:    AcpiUtGetInterface
  *
  * PARAMETERS:  InterfaceName       - The interface to find
diff --git a/src/acpica/source/components/utilities/utxface.c b/src/acpica/source/components/utilities/utxface.c
index f5e75ff..c1b3c46 100644
--- a/src/acpica/source/components/utilities/utxface.c
+++ b/src/acpica/source/components/utilities/utxface.c
@@ -571,6 +571,40 @@ ACPI_EXPORT_SYMBOL (AcpiInstallInterfaceHandler)
 
 /*****************************************************************************
  *
+ * FUNCTION:    AcpiUpdateInterfaces
+ *
+ * PARAMETERS:  Action              - Actions to be performed during the
+ *                                    update
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Update _OSI interface strings, disabling or enabling OS vendor
+ *              string or/and feature group strings.
+ *
+ ****************************************************************************/
+
+ACPI_STATUS
+AcpiUpdateInterfaces (
+    UINT8                   Action)
+{
+    ACPI_STATUS             Status;
+
+
+    Status = AcpiOsAcquireMutex (AcpiGbl_OsiMutex, ACPI_WAIT_FOREVER);
+    if (ACPI_FAILURE (Status))
+    {
+        return (Status);
+    }
+
+    Status = AcpiUtUpdateInterfaces (Action);
+
+    AcpiOsReleaseMutex (AcpiGbl_OsiMutex);
+    return (Status);
+}
+
+
+/*****************************************************************************
+ *
  * FUNCTION:    AcpiCheckAddressRange
  *
  * PARAMETERS:  SpaceId             - Address space ID
diff --git a/src/acpica/source/include/acglobal.h b/src/acpica/source/include/acglobal.h
index 66abf13..9056b6d 100644
--- a/src/acpica/source/include/acglobal.h
+++ b/src/acpica/source/include/acglobal.h
@@ -212,6 +212,12 @@ UINT8       ACPI_INIT_GLOBAL (AcpiGbl_DisableAutoRepair, FALSE);
  */
 UINT8       ACPI_INIT_GLOBAL (AcpiGbl_DisableSsdtTableLoad, FALSE);
 
+/*
+ * We keep track of the latest version of Windows that has been requested by
+ * the BIOS.
+ */
+UINT8       ACPI_INIT_GLOBAL (AcpiGbl_OsiData, 0);
+
 
 /* AcpiGbl_FADT is a local copy of the FADT, converted to a common format. */
 
@@ -362,7 +368,6 @@ ACPI_EXTERN UINT8                       AcpiGbl_DebuggerConfiguration;
 ACPI_EXTERN BOOLEAN                     AcpiGbl_StepToNextCall;
 ACPI_EXTERN BOOLEAN                     AcpiGbl_AcpiHardwarePresent;
 ACPI_EXTERN BOOLEAN                     AcpiGbl_EventsInitialized;
-ACPI_EXTERN UINT8                       AcpiGbl_OsiData;
 ACPI_EXTERN ACPI_INTERFACE_INFO        *AcpiGbl_SupportedInterfaces;
 ACPI_EXTERN ACPI_ADDRESS_RANGE         *AcpiGbl_AddressRangeList[ACPI_ADDRESS_RANGE_MAX];
 
diff --git a/src/acpica/source/include/aclocal.h b/src/acpica/source/include/aclocal.h
index dbf5db6..e45b9f5 100644
--- a/src/acpica/source/include/aclocal.h
+++ b/src/acpica/source/include/aclocal.h
@@ -1172,19 +1172,6 @@ typedef struct acpi_bit_register_info
 
 /* Structs and definitions for _OSI support and I/O port validation */
 
-#define ACPI_OSI_WIN_2000               0x01
-#define ACPI_OSI_WIN_XP                 0x02
-#define ACPI_OSI_WIN_XP_SP1             0x03
-#define ACPI_OSI_WINSRV_2003            0x04
-#define ACPI_OSI_WIN_XP_SP2             0x05
-#define ACPI_OSI_WINSRV_2003_SP1        0x06
-#define ACPI_OSI_WIN_VISTA              0x07
-#define ACPI_OSI_WINSRV_2008            0x08
-#define ACPI_OSI_WIN_VISTA_SP1          0x09
-#define ACPI_OSI_WIN_VISTA_SP2          0x0A
-#define ACPI_OSI_WIN_7                  0x0B
-#define ACPI_OSI_WIN_8                  0x0C
-
 #define ACPI_ALWAYS_ILLEGAL             0x00
 
 typedef struct acpi_interface_info
@@ -1198,6 +1185,9 @@ typedef struct acpi_interface_info
 
 #define ACPI_OSI_INVALID                0x01
 #define ACPI_OSI_DYNAMIC                0x02
+#define ACPI_OSI_FEATURE                0x04
+#define ACPI_OSI_DEFAULT_INVALID        0x08
+#define ACPI_OSI_OPTIONAL_FEATURE       (ACPI_OSI_FEATURE | ACPI_OSI_DEFAULT_INVALID | ACPI_OSI_INVALID)
 
 typedef struct acpi_port_info
 {
@@ -1293,6 +1283,7 @@ typedef struct acpi_external_list
     UINT8                       Type;
     UINT8                       Flags;
     BOOLEAN                     Resolved;
+    BOOLEAN                     Emitted;
 
 } ACPI_EXTERNAL_LIST;
 
diff --git a/src/acpica/source/include/acnamesp.h b/src/acpica/source/include/acnamesp.h
index 52e123c..74575ba 100644
--- a/src/acpica/source/include/acnamesp.h
+++ b/src/acpica/source/include/acnamesp.h
@@ -189,8 +189,8 @@ AcpiNsWalkNamespace (
     ACPI_HANDLE             StartObject,
     UINT32                  MaxDepth,
     UINT32                  Flags,
-    ACPI_WALK_CALLBACK      PreOrderVisit,
-    ACPI_WALK_CALLBACK      PostOrderVisit,
+    ACPI_WALK_CALLBACK      DescendingCallback,
+    ACPI_WALK_CALLBACK      AscendingCallback,
     void                    *Context,
     void                    **ReturnValue);
 
diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h
index 7042300..3971f57 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                 0x20130626
+#define ACPI_CA_VERSION                 0x20130725
 
 #include "acconfig.h"
 #include "actypes.h"
@@ -133,6 +133,7 @@ extern UINT32               AcpiCurrentGpeCount;
 extern ACPI_TABLE_FADT      AcpiGbl_FADT;
 extern BOOLEAN              AcpiGbl_SystemAwakeAndRunning;
 extern BOOLEAN              AcpiGbl_ReducedHardware;        /* ACPI 5.0 */
+extern UINT8                AcpiGbl_OsiData;
 
 /* Runtime configuration of debug print levels */
 
@@ -249,6 +250,10 @@ ACPI_STATUS
 AcpiRemoveInterface (
     ACPI_STRING             InterfaceName);
 
+ACPI_STATUS
+AcpiUpdateInterfaces (
+    UINT8                   Action);
+
 UINT32
 AcpiCheckAddressRange (
     ACPI_ADR_SPACE_TYPE     SpaceId,
@@ -340,8 +345,8 @@ AcpiWalkNamespace (
     ACPI_OBJECT_TYPE        Type,
     ACPI_HANDLE             StartObject,
     UINT32                  MaxDepth,
-    ACPI_WALK_CALLBACK      PreOrderVisit,
-    ACPI_WALK_CALLBACK      PostOrderVisit,
+    ACPI_WALK_CALLBACK      DescendingCallback,
+    ACPI_WALK_CALLBACK      AscendingCallback,
     void                    *Context,
     void                    **ReturnValue);
 
diff --git a/src/acpica/source/include/actables.h b/src/acpica/source/include/actables.h
index dc1bb21..219f4c0 100644
--- a/src/acpica/source/include/actables.h
+++ b/src/acpica/source/include/actables.h
@@ -124,6 +124,10 @@ AcpiAllocateRootTable (
 /*
  * tbxfroot - Root pointer utilities
  */
+ACPI_STATUS
+AcpiTbValidateRsdp (
+    ACPI_TABLE_RSDP         *Rsdp);
+
 UINT8 *
 AcpiTbScanMemoryForRsdp (
     UINT8                   *StartAddress,
diff --git a/src/acpica/source/include/actypes.h b/src/acpica/source/include/actypes.h
index 50d315b..efe1e91 100644
--- a/src/acpica/source/include/actypes.h
+++ b/src/acpica/source/include/actypes.h
@@ -1316,4 +1316,32 @@ typedef struct acpi_memory_list
 } ACPI_MEMORY_LIST;
 
 
+/* Definitions of _OSI support */
+
+#define ACPI_VENDOR_STRINGS                 0x01
+#define ACPI_FEATURE_STRINGS                0x02
+#define ACPI_ENABLE_INTERFACES              0x00
+#define ACPI_DISABLE_INTERFACES             0x04
+
+#define ACPI_DISABLE_ALL_VENDOR_STRINGS     (ACPI_DISABLE_INTERFACES | ACPI_VENDOR_STRINGS)
+#define ACPI_DISABLE_ALL_FEATURE_STRINGS    (ACPI_DISABLE_INTERFACES | ACPI_FEATURE_STRINGS)
+#define ACPI_DISABLE_ALL_STRINGS            (ACPI_DISABLE_INTERFACES | ACPI_VENDOR_STRINGS | ACPI_FEATURE_STRINGS)
+#define ACPI_ENABLE_ALL_VENDOR_STRINGS      (ACPI_ENABLE_INTERFACES | ACPI_VENDOR_STRINGS)
+#define ACPI_ENABLE_ALL_FEATURE_STRINGS     (ACPI_ENABLE_INTERFACES | ACPI_FEATURE_STRINGS)
+#define ACPI_ENABLE_ALL_STRINGS             (ACPI_ENABLE_INTERFACES | ACPI_VENDOR_STRINGS | ACPI_FEATURE_STRINGS)
+
+#define ACPI_OSI_WIN_2000               0x01
+#define ACPI_OSI_WIN_XP                 0x02
+#define ACPI_OSI_WIN_XP_SP1             0x03
+#define ACPI_OSI_WINSRV_2003            0x04
+#define ACPI_OSI_WIN_XP_SP2             0x05
+#define ACPI_OSI_WINSRV_2003_SP1        0x06
+#define ACPI_OSI_WIN_VISTA              0x07
+#define ACPI_OSI_WINSRV_2008            0x08
+#define ACPI_OSI_WIN_VISTA_SP1          0x09
+#define ACPI_OSI_WIN_VISTA_SP2          0x0A
+#define ACPI_OSI_WIN_7                  0x0B
+#define ACPI_OSI_WIN_8                  0x0C
+
+
 #endif /* __ACTYPES_H__ */
diff --git a/src/acpica/source/include/acutils.h b/src/acpica/source/include/acutils.h
index 62442de..e6ae828 100644
--- a/src/acpica/source/include/acutils.h
+++ b/src/acpica/source/include/acutils.h
@@ -742,6 +742,10 @@ ACPI_STATUS
 AcpiUtRemoveInterface (
     ACPI_STRING             InterfaceName);
 
+ACPI_STATUS
+AcpiUtUpdateInterfaces (
+    UINT8                   Action);
+
 ACPI_INTERFACE_INFO *
 AcpiUtGetInterface (
     ACPI_STRING             InterfaceName);
