diff --git a/accessible/windows/ia2/ia2Accessible.cpp b/accessible/windows/ia2/ia2Accessible.cpp
index 97cd0d788..c72719b51 100644
--- a/accessible/windows/ia2/ia2Accessible.cpp
+++ b/accessible/windows/ia2/ia2Accessible.cpp
@@ -63,6 +63,8 @@ ia2Accessible::QueryInterface(REFIID iid, void** ppv)
 STDMETHODIMP
 ia2Accessible::get_nRelations(long* aNRelations)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aNRelations)
     return E_INVALIDARG;
   *aNRelations = 0;
@@ -82,12 +84,16 @@ ia2Accessible::get_nRelations(long* aNRelations)
       (*aNRelations)++;
   }
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2Accessible::get_relation(long aRelationIndex,
                             IAccessibleRelation** aRelation)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aRelation || aRelationIndex < 0)
     return E_INVALIDARG;
   *aRelation = nullptr;
@@ -118,6 +124,8 @@ ia2Accessible::get_relation(long aRelationIndex,
   }
 
   return E_INVALIDARG;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
@@ -125,6 +133,8 @@ ia2Accessible::get_relations(long aMaxRelations,
                              IAccessibleRelation** aRelation,
                              long *aNRelations)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aRelation || !aNRelations || aMaxRelations <= 0)
     return E_INVALIDARG;
   *aNRelations = 0;
@@ -150,11 +160,15 @@ ia2Accessible::get_relations(long aMaxRelations,
     }
   }
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2Accessible::role(long* aRole)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aRole)
     return E_INVALIDARG;
   *aRole = 0;
@@ -190,11 +204,15 @@ ia2Accessible::role(long* aRole)
   }
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2Accessible::scrollTo(enum IA2ScrollType aScrollType)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   AccessibleWrap* acc = static_cast<AccessibleWrap*>(this);
   if (acc->IsDefunct())
     return CO_E_OBJNOTCONNECTED;
@@ -204,12 +222,16 @@ ia2Accessible::scrollTo(enum IA2ScrollType aScrollType)
                         aScrollType);
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2Accessible::scrollToPoint(enum IA2CoordinateType aCoordType,
                               long aX, long aY)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   AccessibleWrap* acc = static_cast<AccessibleWrap*>(this);
   if (acc->IsDefunct())
     return CO_E_OBJNOTCONNECTED;
@@ -222,6 +244,8 @@ ia2Accessible::scrollToPoint(enum IA2CoordinateType aCoordType,
   acc->ScrollToPoint(geckoCoordType, aX, aY);
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
@@ -229,6 +253,8 @@ ia2Accessible::get_groupPosition(long* aGroupLevel,
                                  long* aSimilarItemsInGroup,
                                  long* aPositionInGroup)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aGroupLevel || !aSimilarItemsInGroup || !aPositionInGroup)
     return E_INVALIDARG;
 
@@ -253,11 +279,15 @@ ia2Accessible::get_groupPosition(long* aGroupLevel,
   *aPositionInGroup = groupPos.posInSet;
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2Accessible::get_states(AccessibleStates* aStates)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aStates)
     return E_INVALIDARG;
   *aStates = 0;
@@ -317,36 +347,50 @@ ia2Accessible::get_states(AccessibleStates* aStates)
     *aStates |= IA2_STATE_PINNED;
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2Accessible::get_extendedRole(BSTR* aExtendedRole)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aExtendedRole)
     return E_INVALIDARG;
 
   *aExtendedRole = nullptr;
   return E_NOTIMPL;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2Accessible::get_localizedExtendedRole(BSTR* aLocalizedExtendedRole)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aLocalizedExtendedRole)
     return E_INVALIDARG;
 
   *aLocalizedExtendedRole = nullptr;
   return E_NOTIMPL;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2Accessible::get_nExtendedStates(long* aNExtendedStates)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aNExtendedStates)
     return E_INVALIDARG;
 
   *aNExtendedStates = 0;
   return E_NOTIMPL;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
@@ -354,12 +398,16 @@ ia2Accessible::get_extendedStates(long aMaxExtendedStates,
                                   BSTR** aExtendedStates,
                                   long* aNExtendedStates)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aExtendedStates || !aNExtendedStates)
     return E_INVALIDARG;
 
   *aExtendedStates = nullptr;
   *aNExtendedStates = 0;
   return E_NOTIMPL;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
@@ -367,28 +415,38 @@ ia2Accessible::get_localizedExtendedStates(long aMaxLocalizedExtendedStates,
                                            BSTR** aLocalizedExtendedStates,
                                            long* aNLocalizedExtendedStates)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aLocalizedExtendedStates || !aNLocalizedExtendedStates)
     return E_INVALIDARG;
 
   *aLocalizedExtendedStates = nullptr;
   *aNLocalizedExtendedStates = 0;
   return E_NOTIMPL;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2Accessible::get_uniqueID(long* aUniqueID)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aUniqueID)
     return E_INVALIDARG;
 
   AccessibleWrap* acc = static_cast<AccessibleWrap*>(this);
   *aUniqueID = AccessibleWrap::GetChildIDFor(acc);
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2Accessible::get_windowHandle(HWND* aWindowHandle)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aWindowHandle)
     return E_INVALIDARG;
   *aWindowHandle = 0;
@@ -399,11 +457,15 @@ ia2Accessible::get_windowHandle(HWND* aWindowHandle)
 
   *aWindowHandle = AccessibleWrap::GetHWNDFor(acc);
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2Accessible::get_indexInParent(long* aIndexInParent)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aIndexInParent)
     return E_INVALIDARG;
   *aIndexInParent = -1;
@@ -419,11 +481,15 @@ ia2Accessible::get_indexInParent(long* aIndexInParent)
     return S_FALSE;
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2Accessible::get_locale(IA2Locale* aLocale)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aLocale)
     return E_INVALIDARG;
 
@@ -466,11 +532,15 @@ ia2Accessible::get_locale(IA2Locale* aLocale)
   // country abbreviations or if there are more than one subcode.
   aLocale->variant = ::SysAllocString(lang.get());
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2Accessible::get_attributes(BSTR* aAttributes)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aAttributes)
     return E_INVALIDARG;
   *aAttributes = nullptr;
@@ -488,6 +558,8 @@ ia2Accessible::get_attributes(BSTR* aAttributes)
 
   MOZ_ASSERT(!acc->IsProxy());
   return E_UNEXPECTED;
+
+  A11Y_TRYBLOCK_END
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -496,16 +568,22 @@ ia2Accessible::get_attributes(BSTR* aAttributes)
 STDMETHODIMP
 ia2Accessible::get_attribute(BSTR name, VARIANT* aAttribute)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aAttribute)
     return E_INVALIDARG;
 
   return E_NOTIMPL;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2Accessible::get_accessibleWithCaret(IUnknown** aAccessible,
                                        long* aCaretOffset)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aAccessible || !aCaretOffset)
     return E_INVALIDARG;
 
@@ -533,6 +611,8 @@ ia2Accessible::get_accessibleWithCaret(IUnknown** aAccessible,
   (*aAccessible)->AddRef();
   *aCaretOffset = caretOffset;
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
@@ -541,6 +621,8 @@ ia2Accessible::get_relationTargetsOfType(BSTR aType,
                                          IUnknown*** aTargets,
                                          long* aNTargets)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aTargets || !aNTargets || aMaxTargets < 0)
     return E_INVALIDARG;
   *aNTargets = 0;
@@ -581,12 +663,16 @@ ia2Accessible::get_relationTargetsOfType(BSTR aType,
   }
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2Accessible::get_selectionRanges(IA2Range** aRanges,
                                    long *aNRanges)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aRanges || !aNRanges)
     return E_INVALIDARG;
 
@@ -628,6 +714,8 @@ ia2Accessible::get_selectionRanges(IA2Range** aRanges,
   }
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 
diff --git a/accessible/windows/ia2/ia2AccessibleAction.cpp b/accessible/windows/ia2/ia2AccessibleAction.cpp
index ffd19f049..0710b753f 100644
--- a/accessible/windows/ia2/ia2AccessibleAction.cpp
+++ b/accessible/windows/ia2/ia2AccessibleAction.cpp
@@ -39,6 +39,8 @@ ia2AccessibleAction::QueryInterface(REFIID iid, void** ppv)
 STDMETHODIMP
 ia2AccessibleAction::nActions(long* aActionCount)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aActionCount)
     return E_INVALIDARG;
 
@@ -50,22 +52,30 @@ ia2AccessibleAction::nActions(long* aActionCount)
 
   *aActionCount = acc->ActionCount();
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleAction::doAction(long aActionIndex)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   AccessibleWrap* acc = static_cast<AccessibleWrap*>(this);
   if (acc->IsDefunct())
     return CO_E_OBJNOTCONNECTED;
 
   uint8_t index = static_cast<uint8_t>(aActionIndex);
   return acc->DoAction(index) ? S_OK : E_INVALIDARG;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleAction::get_description(long aActionIndex, BSTR *aDescription)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aDescription)
     return E_INVALIDARG;
   *aDescription = nullptr;
@@ -83,6 +93,8 @@ ia2AccessibleAction::get_description(long aActionIndex, BSTR *aDescription)
   *aDescription = ::SysAllocStringLen(description.get(),
                                       description.Length());
   return *aDescription ? S_OK : E_OUTOFMEMORY;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
@@ -90,6 +102,8 @@ ia2AccessibleAction::get_keyBinding(long aActionIndex, long aNumMaxBinding,
                                   BSTR **aKeyBinding,
                                   long *aNumBinding)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aKeyBinding)
     return E_INVALIDARG;
   *aKeyBinding = nullptr;
@@ -129,11 +143,15 @@ ia2AccessibleAction::get_keyBinding(long aActionIndex, long aNumMaxBinding,
 
   *aNumBinding = 1;
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleAction::get_name(long aActionIndex, BSTR *aName)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aName)
     return E_INVALIDARG;
 
@@ -151,14 +169,20 @@ ia2AccessibleAction::get_name(long aActionIndex, BSTR *aName)
 
   *aName = ::SysAllocStringLen(name.get(), name.Length());
   return *aName ? S_OK : E_OUTOFMEMORY;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleAction::get_localizedName(long aActionIndex, BSTR *aLocalizedName)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aLocalizedName)
     return E_INVALIDARG;
 
   *aLocalizedName = nullptr;
   return E_NOTIMPL;
+
+  A11Y_TRYBLOCK_END
 }
diff --git a/accessible/windows/ia2/ia2AccessibleComponent.cpp b/accessible/windows/ia2/ia2AccessibleComponent.cpp
index 2c9cd0ab4..f32c09d1e 100644
--- a/accessible/windows/ia2/ia2AccessibleComponent.cpp
+++ b/accessible/windows/ia2/ia2AccessibleComponent.cpp
@@ -41,6 +41,8 @@ ia2AccessibleComponent::QueryInterface(REFIID iid, void** ppv)
 STDMETHODIMP
 ia2AccessibleComponent::get_locationInParent(long* aX, long* aY)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aX || !aY)
     return E_INVALIDARG;
 
@@ -73,11 +75,15 @@ ia2AccessibleComponent::get_locationInParent(long* aX, long* aY)
   *aX = rect.x - parentRect.x;
   *aY = rect.y - parentRect.y;
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleComponent::get_foreground(IA2Color* aForeground)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aForeground)
     return E_INVALIDARG;
 
@@ -92,11 +98,15 @@ ia2AccessibleComponent::get_foreground(IA2Color* aForeground)
     *aForeground = frame->StyleColor()->mColor;
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleComponent::get_background(IA2Color* aBackground)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aBackground)
     return E_INVALIDARG;
 
@@ -111,5 +121,7 @@ ia2AccessibleComponent::get_background(IA2Color* aBackground)
     *aBackground = frame->StyleBackground()->mBackgroundColor;
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
diff --git a/accessible/windows/ia2/ia2AccessibleEditableText.cpp b/accessible/windows/ia2/ia2AccessibleEditableText.cpp
index 0b433bf6d..361d6a130 100644
--- a/accessible/windows/ia2/ia2AccessibleEditableText.cpp
+++ b/accessible/windows/ia2/ia2AccessibleEditableText.cpp
@@ -22,6 +22,8 @@ using namespace mozilla::a11y;
 STDMETHODIMP
 ia2AccessibleEditableText::copyText(long aStartOffset, long aEndOffset)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   MOZ_ASSERT(!HyperTextProxyFor(this));
 
   HyperTextAccessible* textAcc = static_cast<HyperTextAccessibleWrap*>(this);
@@ -33,11 +35,15 @@ ia2AccessibleEditableText::copyText(long aStartOffset, long aEndOffset)
 
   textAcc->CopyText(aStartOffset, aEndOffset);
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleEditableText::deleteText(long aStartOffset, long aEndOffset)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   MOZ_ASSERT(!HyperTextProxyFor(this));
 
   HyperTextAccessible* textAcc = static_cast<HyperTextAccessibleWrap*>(this);
@@ -49,11 +55,15 @@ ia2AccessibleEditableText::deleteText(long aStartOffset, long aEndOffset)
 
   textAcc->DeleteText(aStartOffset, aEndOffset);
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleEditableText::insertText(long aOffset, BSTR *aText)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   uint32_t length = ::SysStringLen(*aText);
   nsAutoString text(*aText, length);
   MOZ_ASSERT(!HyperTextProxyFor(this));
@@ -67,11 +77,15 @@ ia2AccessibleEditableText::insertText(long aOffset, BSTR *aText)
 
   textAcc->InsertText(text, aOffset);
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleEditableText::cutText(long aStartOffset, long aEndOffset)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   MOZ_ASSERT(!HyperTextProxyFor(this));
 
   HyperTextAccessible* textAcc = static_cast<HyperTextAccessibleWrap*>(this);
@@ -83,11 +97,15 @@ ia2AccessibleEditableText::cutText(long aStartOffset, long aEndOffset)
 
   textAcc->CutText(aStartOffset, aEndOffset);
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleEditableText::pasteText(long aOffset)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   MOZ_ASSERT(!HyperTextProxyFor(this));
 
   HyperTextAccessible* textAcc = static_cast<HyperTextAccessibleWrap*>(this);
@@ -99,12 +117,16 @@ ia2AccessibleEditableText::pasteText(long aOffset)
 
   textAcc->PasteText(aOffset);
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleEditableText::replaceText(long aStartOffset, long aEndOffset,
                                        BSTR *aText)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   HyperTextAccessible* textAcc = static_cast<HyperTextAccessibleWrap*>(this);
   if (textAcc->IsDefunct())
     return CO_E_OBJNOTCONNECTED;
@@ -119,6 +141,8 @@ ia2AccessibleEditableText::replaceText(long aStartOffset, long aEndOffset,
   textAcc->InsertText(text, aStartOffset);
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
diff --git a/accessible/windows/ia2/ia2AccessibleHyperlink.cpp b/accessible/windows/ia2/ia2AccessibleHyperlink.cpp
index d36c0ef25..c6d564103 100644
--- a/accessible/windows/ia2/ia2AccessibleHyperlink.cpp
+++ b/accessible/windows/ia2/ia2AccessibleHyperlink.cpp
@@ -45,6 +45,8 @@ ia2AccessibleHyperlink::QueryInterface(REFIID iid, void** ppv)
 STDMETHODIMP
 ia2AccessibleHyperlink::get_anchor(long aIndex, VARIANT* aAnchor)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aAnchor)
     return E_INVALIDARG;
 
@@ -75,11 +77,15 @@ ia2AccessibleHyperlink::get_anchor(long aIndex, VARIANT* aAnchor)
   aAnchor->punkVal = static_cast<IUnknown*>(instancePtr);
   aAnchor->vt = VT_UNKNOWN;
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleHyperlink::get_anchorTarget(long aIndex, VARIANT* aAnchorTarget)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aAnchorTarget) {
     return E_INVALIDARG;
   }
@@ -118,11 +124,15 @@ ia2AccessibleHyperlink::get_anchorTarget(long aIndex, VARIANT* aAnchorTarget)
   aAnchorTarget->bstrVal = ::SysAllocStringLen(stringURI.get(),
                                                stringURI.Length());
   return aAnchorTarget->bstrVal ? S_OK : E_OUTOFMEMORY;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleHyperlink::get_startIndex(long* aIndex)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aIndex)
     return E_INVALIDARG;
 
@@ -139,11 +149,15 @@ ia2AccessibleHyperlink::get_startIndex(long* aIndex)
 
   *aIndex = thisObj->StartOffset();
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleHyperlink::get_endIndex(long* aIndex)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aIndex)
     return E_INVALIDARG;
 
@@ -160,11 +174,15 @@ ia2AccessibleHyperlink::get_endIndex(long* aIndex)
 
   *aIndex = thisObj->EndOffset();
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleHyperlink::get_valid(boolean* aValid)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aValid)
     return E_INVALIDARG;
 
@@ -181,5 +199,7 @@ ia2AccessibleHyperlink::get_valid(boolean* aValid)
 
   *aValid = thisObj->IsLinkValid();
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
diff --git a/accessible/windows/ia2/ia2AccessibleHypertext.cpp b/accessible/windows/ia2/ia2AccessibleHypertext.cpp
index 555bde686..f4b3bdaf2 100644
--- a/accessible/windows/ia2/ia2AccessibleHypertext.cpp
+++ b/accessible/windows/ia2/ia2AccessibleHypertext.cpp
@@ -19,6 +19,8 @@ using namespace mozilla::a11y;
 STDMETHODIMP
 ia2AccessibleHypertext::get_nHyperlinks(long* aHyperlinkCount)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aHyperlinkCount)
     return E_INVALIDARG;
 
@@ -32,12 +34,16 @@ ia2AccessibleHypertext::get_nHyperlinks(long* aHyperlinkCount)
 
   *aHyperlinkCount = hyperText->LinkCount();
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleHypertext::get_hyperlink(long aLinkIndex,
                                       IAccessibleHyperlink** aHyperlink)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aHyperlink)
     return E_INVALIDARG;
 
@@ -59,11 +65,15 @@ ia2AccessibleHypertext::get_hyperlink(long aLinkIndex,
     static_cast<IAccessibleHyperlink*>(hyperLink);
   (*aHyperlink)->AddRef();
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleHypertext::get_hyperlinkIndex(long aCharIndex, long* aHyperlinkIndex)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aHyperlinkIndex)
     return E_INVALIDARG;
 
@@ -77,5 +87,7 @@ ia2AccessibleHypertext::get_hyperlinkIndex(long aCharIndex, long* aHyperlinkInde
 
   *aHyperlinkIndex = hyperAcc->LinkIndexAtOffset(aCharIndex);
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
diff --git a/accessible/windows/ia2/ia2AccessibleImage.cpp b/accessible/windows/ia2/ia2AccessibleImage.cpp
index 7dc7f765c..989fde925 100644
--- a/accessible/windows/ia2/ia2AccessibleImage.cpp
+++ b/accessible/windows/ia2/ia2AccessibleImage.cpp
@@ -43,6 +43,8 @@ ia2AccessibleImage::QueryInterface(REFIID iid, void** ppv)
 STDMETHODIMP
 ia2AccessibleImage::get_description(BSTR* aDescription)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aDescription)
     return E_INVALIDARG;
 
@@ -59,6 +61,8 @@ ia2AccessibleImage::get_description(BSTR* aDescription)
 
   *aDescription = ::SysAllocStringLen(description.get(), description.Length());
   return *aDescription ? S_OK : E_OUTOFMEMORY;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
@@ -66,6 +70,8 @@ ia2AccessibleImage::get_imagePosition(enum IA2CoordinateType aCoordType,
                                       long* aX,
                                       long* aY)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aX || !aY)
     return E_INVALIDARG;
 
@@ -84,11 +90,15 @@ ia2AccessibleImage::get_imagePosition(enum IA2CoordinateType aCoordType,
   *aX = pos.x;
   *aY = pos.y;
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleImage::get_imageSize(long* aHeight, long* aWidth)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aHeight || !aWidth)
     return E_INVALIDARG;
 
@@ -103,5 +113,7 @@ ia2AccessibleImage::get_imageSize(long* aHeight, long* aWidth)
   *aHeight = size.width;
   *aWidth = size.height;
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
diff --git a/accessible/windows/ia2/ia2AccessibleRelation.cpp b/accessible/windows/ia2/ia2AccessibleRelation.cpp
index 67435ee52..cc6fd83c8 100644
--- a/accessible/windows/ia2/ia2AccessibleRelation.cpp
+++ b/accessible/windows/ia2/ia2AccessibleRelation.cpp
@@ -34,6 +34,8 @@ IMPL_IUNKNOWN_QUERY_TAIL
 STDMETHODIMP
 ia2AccessibleRelation::get_relationType(BSTR* aRelationType)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aRelationType)
     return E_INVALIDARG;
 
@@ -49,31 +51,43 @@ ia2AccessibleRelation::get_relationType(BSTR* aRelationType)
   }
 
   return *aRelationType ? S_OK : E_OUTOFMEMORY;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleRelation::get_localizedRelationType(BSTR *aLocalizedRelationType)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aLocalizedRelationType)
     return E_INVALIDARG;
 
   *aLocalizedRelationType = nullptr;
   return E_NOTIMPL;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleRelation::get_nTargets(long *aNTargets)
 {
+  A11Y_TRYBLOCK_BEGIN
+
  if (!aNTargets)
    return E_INVALIDARG;
 
  *aNTargets = mTargets.Length();
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleRelation::get_target(long aTargetIndex, IUnknown **aTarget)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (aTargetIndex < 0 || (uint32_t)aTargetIndex >= mTargets.Length() || !aTarget)
     return E_INVALIDARG;
 
@@ -83,12 +97,16 @@ ia2AccessibleRelation::get_target(long aTargetIndex, IUnknown **aTarget)
   (*aTarget)->AddRef();
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleRelation::get_targets(long aMaxTargets, IUnknown **aTargets,
                                    long *aNTargets)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aNTargets || !aTargets)
     return E_INVALIDARG;
 
@@ -102,4 +120,6 @@ ia2AccessibleRelation::get_targets(long aMaxTargets, IUnknown **aTargets,
 
   *aNTargets = maxTargets;
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
diff --git a/accessible/windows/ia2/ia2AccessibleTable.cpp b/accessible/windows/ia2/ia2AccessibleTable.cpp
index a99f72def..6ac6bbab4 100644
--- a/accessible/windows/ia2/ia2AccessibleTable.cpp
+++ b/accessible/windows/ia2/ia2AccessibleTable.cpp
@@ -60,6 +60,8 @@ ia2AccessibleTable::get_accessibleAt(long aRowIdx, long aColIdx,
 STDMETHODIMP
 ia2AccessibleTable::get_caption(IUnknown** aAccessible)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aAccessible)
     return E_INVALIDARG;
 
@@ -73,12 +75,16 @@ ia2AccessibleTable::get_caption(IUnknown** aAccessible)
 
   (*aAccessible = static_cast<IAccessible*>(caption))->AddRef();
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleTable::get_childIndex(long aRowIdx, long aColIdx,
                                    long* aChildIdx)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aChildIdx)
     return E_INVALIDARG;
 
@@ -93,11 +99,15 @@ ia2AccessibleTable::get_childIndex(long aRowIdx, long aColIdx,
 
   *aChildIdx = mTable->CellIndexAt(aRowIdx, aColIdx);
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleTable::get_columnDescription(long aColIdx, BSTR* aDescription)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aDescription)
     return E_INVALIDARG;
 
@@ -115,12 +125,16 @@ ia2AccessibleTable::get_columnDescription(long aColIdx, BSTR* aDescription)
 
   *aDescription = ::SysAllocStringLen(descr.get(), descr.Length());
   return *aDescription ? S_OK : E_OUTOFMEMORY;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleTable::get_columnExtentAt(long aRowIdx, long aColIdx,
                                       long* aSpan)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aSpan)
     return E_INVALIDARG;
 
@@ -135,23 +149,31 @@ ia2AccessibleTable::get_columnExtentAt(long aRowIdx, long aColIdx,
 
   *aSpan = mTable->ColExtentAt(aRowIdx, aColIdx);
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleTable::get_columnHeader(IAccessibleTable** aAccessibleTable,
                                     long* aStartingRowIndex)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aAccessibleTable || !aStartingRowIndex)
     return E_INVALIDARG;
 
   *aAccessibleTable = nullptr;
   *aStartingRowIndex = -1;
   return E_NOTIMPL;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleTable::get_columnIndex(long aCellIdx, long* aColIdx)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aColIdx)
     return E_INVALIDARG;
 
@@ -165,11 +187,15 @@ ia2AccessibleTable::get_columnIndex(long aCellIdx, long* aColIdx)
 
   *aColIdx = mTable->ColIndexAt(aCellIdx);
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleTable::get_nColumns(long* aColCount)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aColCount)
     return E_INVALIDARG;
 
@@ -179,11 +205,15 @@ ia2AccessibleTable::get_nColumns(long* aColCount)
 
   *aColCount = mTable->ColCount();
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleTable::get_nRows(long* aRowCount)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aRowCount)
     return E_INVALIDARG;
 
@@ -193,6 +223,8 @@ ia2AccessibleTable::get_nRows(long* aRowCount)
 
   *aRowCount = mTable->RowCount();
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
@@ -204,6 +236,8 @@ ia2AccessibleTable::get_nSelectedChildren(long* aChildCount)
 STDMETHODIMP
 ia2AccessibleTable::get_nSelectedColumns(long* aColCount)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aColCount)
     return E_INVALIDARG;
 
@@ -213,11 +247,15 @@ ia2AccessibleTable::get_nSelectedColumns(long* aColCount)
 
   *aColCount = mTable->SelectedColCount();
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleTable::get_nSelectedRows(long* aRowCount)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aRowCount)
     return E_INVALIDARG;
 
@@ -228,11 +266,15 @@ ia2AccessibleTable::get_nSelectedRows(long* aRowCount)
   *aRowCount = mTable->SelectedRowCount();
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleTable::get_rowDescription(long aRowIdx, BSTR* aDescription)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aDescription)
     return E_INVALIDARG;
 
@@ -250,11 +292,15 @@ ia2AccessibleTable::get_rowDescription(long aRowIdx, BSTR* aDescription)
 
   *aDescription = ::SysAllocStringLen(descr.get(), descr.Length());
   return *aDescription ? S_OK : E_OUTOFMEMORY;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleTable::get_rowExtentAt(long aRowIdx, long aColIdx, long* aSpan)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aSpan)
     return E_INVALIDARG;
 
@@ -269,23 +315,31 @@ ia2AccessibleTable::get_rowExtentAt(long aRowIdx, long aColIdx, long* aSpan)
 
   *aSpan = mTable->RowExtentAt(aRowIdx, aColIdx);
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleTable::get_rowHeader(IAccessibleTable** aAccessibleTable,
                                   long* aStartingColumnIndex)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aAccessibleTable || !aStartingColumnIndex)
     return E_INVALIDARG;
 
   *aAccessibleTable = nullptr;
   *aStartingColumnIndex = -1;
   return E_NOTIMPL;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleTable::get_rowIndex(long aCellIdx, long* aRowIdx)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aRowIdx)
     return E_INVALIDARG;
 
@@ -299,12 +353,16 @@ ia2AccessibleTable::get_rowIndex(long aCellIdx, long* aRowIdx)
 
   *aRowIdx = mTable->RowIndexAt(aCellIdx);
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleTable::get_selectedChildren(long aMaxChildren, long** aChildren,
                                          long* aNChildren)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aChildren || !aNChildren)
     return E_INVALIDARG;
 
@@ -326,24 +384,36 @@ ia2AccessibleTable::get_selectedChildren(long aMaxChildren, long** aChildren,
     (*aChildren)[i] = cellIndices[i];
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleTable::get_selectedColumns(long aMaxColumns, long** aColumns,
                                         long* aNColumns)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   return get_selectedColumns(aColumns, aNColumns);
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleTable::get_selectedRows(long aMaxRows, long** aRows, long* aNRows)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   return get_selectedRows(aRows, aNRows);
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleTable::get_summary(IUnknown** aAccessible)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aAccessible)
     return E_INVALIDARG;
 
@@ -354,11 +424,15 @@ ia2AccessibleTable::get_summary(IUnknown** aAccessible)
 
   *aAccessible = nullptr;
   return S_FALSE;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleTable::get_isColumnSelected(long aColIdx, boolean* aIsSelected)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aIsSelected)
     return E_INVALIDARG;
 
@@ -371,11 +445,15 @@ ia2AccessibleTable::get_isColumnSelected(long aColIdx, boolean* aIsSelected)
 
   *aIsSelected = mTable->IsColSelected(aColIdx);
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleTable::get_isRowSelected(long aRowIdx, boolean* aIsSelected)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aIsSelected)
     return E_INVALIDARG;
 
@@ -388,12 +466,16 @@ ia2AccessibleTable::get_isRowSelected(long aRowIdx, boolean* aIsSelected)
 
   *aIsSelected = mTable->IsRowSelected(aRowIdx);
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleTable::get_isSelected(long aRowIdx, long aColIdx,
                                    boolean* aIsSelected)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aIsSelected)
     return E_INVALIDARG;
 
@@ -408,11 +490,15 @@ ia2AccessibleTable::get_isSelected(long aRowIdx, long aColIdx,
 
   *aIsSelected = mTable->IsCellSelected(aRowIdx, aColIdx);
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleTable::selectRow(long aRowIdx)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!mTable)
     return CO_E_OBJNOTCONNECTED;
 
@@ -421,11 +507,15 @@ ia2AccessibleTable::selectRow(long aRowIdx)
 
   mTable->SelectRow(aRowIdx);
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleTable::selectColumn(long aColIdx)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!mTable)
     return CO_E_OBJNOTCONNECTED;
 
@@ -434,11 +524,15 @@ ia2AccessibleTable::selectColumn(long aColIdx)
 
   mTable->SelectCol(aColIdx);
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleTable::unselectRow(long aRowIdx)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!mTable)
     return CO_E_OBJNOTCONNECTED;
 
@@ -447,11 +541,15 @@ ia2AccessibleTable::unselectRow(long aRowIdx)
 
   mTable->UnselectRow(aRowIdx);
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleTable::unselectColumn(long aColIdx)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!mTable)
     return CO_E_OBJNOTCONNECTED;
 
@@ -460,6 +558,8 @@ ia2AccessibleTable::unselectColumn(long aColIdx)
 
   mTable->UnselectCol(aColIdx);
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
@@ -469,6 +569,8 @@ ia2AccessibleTable::get_rowColumnExtentsAtIndex(long aCellIdx, long* aRowIdx,
                                                 long* aColExtents,
                                                 boolean* aIsSelected)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aRowIdx || !aColIdx || !aRowExtents || !aColExtents || !aIsSelected)
     return E_INVALIDARG;
 
@@ -493,6 +595,8 @@ ia2AccessibleTable::get_rowColumnExtentsAtIndex(long aCellIdx, long* aRowIdx,
   *aIsSelected = mTable->IsCellSelected(rowIdx, colIdx);
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
@@ -507,6 +611,8 @@ ia2AccessibleTable::get_modelChange(IA2TableModelChange* aModelChange)
 STDMETHODIMP
 ia2AccessibleTable::get_cellAt(long aRowIdx, long aColIdx, IUnknown** aCell)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aCell)
     return E_INVALIDARG;
 
@@ -522,11 +628,15 @@ ia2AccessibleTable::get_cellAt(long aRowIdx, long aColIdx, IUnknown** aCell)
 
   (*aCell = static_cast<IAccessible*>(cell))->AddRef();
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleTable::get_nSelectedCells(long* aCellCount)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aCellCount)
     return E_INVALIDARG;
 
@@ -536,11 +646,15 @@ ia2AccessibleTable::get_nSelectedCells(long* aCellCount)
 
   *aCellCount = mTable->SelectedCellCount();
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleTable::get_selectedCells(IUnknown*** aCells, long* aNSelectedCells)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aCells || !aNSelectedCells)
     return E_INVALIDARG;
 
@@ -568,11 +682,15 @@ ia2AccessibleTable::get_selectedCells(IUnknown*** aCells, long* aNSelectedCells)
 
   *aNSelectedCells = cells.Length();
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleTable::get_selectedColumns(long** aColumns, long* aNColumns)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aColumns || !aNColumns)
     return E_INVALIDARG;
 
@@ -594,11 +712,15 @@ ia2AccessibleTable::get_selectedColumns(long** aColumns, long* aNColumns)
     (*aColumns)[i] = colIndices[i];
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleTable::get_selectedRows(long** aRows, long* aNRows)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aRows || !aNRows)
     return E_INVALIDARG;
 
@@ -620,4 +742,6 @@ ia2AccessibleTable::get_selectedRows(long** aRows, long* aNRows)
     (*aRows)[i] = rowIndices[i];
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
diff --git a/accessible/windows/ia2/ia2AccessibleTableCell.cpp b/accessible/windows/ia2/ia2AccessibleTableCell.cpp
index 19cfc55da..e625a7049 100644
--- a/accessible/windows/ia2/ia2AccessibleTableCell.cpp
+++ b/accessible/windows/ia2/ia2AccessibleTableCell.cpp
@@ -46,6 +46,8 @@ ia2AccessibleTableCell::QueryInterface(REFIID iid, void** ppv)
 STDMETHODIMP
 ia2AccessibleTableCell::get_table(IUnknown** aTable)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aTable)
     return E_INVALIDARG;
 
@@ -61,11 +63,15 @@ ia2AccessibleTableCell::get_table(IUnknown** aTable)
   *aTable = static_cast<IAccessible*>(wrap);
   (*aTable)->AddRef();
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleTableCell::get_columnExtent(long* aSpan)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aSpan)
     return E_INVALIDARG;
 
@@ -76,12 +82,16 @@ ia2AccessibleTableCell::get_columnExtent(long* aSpan)
   *aSpan = mTableCell->ColExtent();
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleTableCell::get_columnHeaderCells(IUnknown*** aCellAccessibles,
                                               long* aNColumnHeaderCells)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aCellAccessibles || !aNColumnHeaderCells)
     return E_INVALIDARG;
 
@@ -108,11 +118,15 @@ ia2AccessibleTableCell::get_columnHeaderCells(IUnknown*** aCellAccessibles,
   }
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleTableCell::get_columnIndex(long* aColIdx)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aColIdx)
     return E_INVALIDARG;
 
@@ -122,11 +136,15 @@ ia2AccessibleTableCell::get_columnIndex(long* aColIdx)
 
   *aColIdx = mTableCell->ColIdx();
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleTableCell::get_rowExtent(long* aSpan)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aSpan)
     return E_INVALIDARG;
 
@@ -136,12 +154,16 @@ ia2AccessibleTableCell::get_rowExtent(long* aSpan)
 
   *aSpan = mTableCell->RowExtent();
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleTableCell::get_rowHeaderCells(IUnknown*** aCellAccessibles,
                                            long* aNRowHeaderCells)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aCellAccessibles || !aNRowHeaderCells)
     return E_INVALIDARG;
 
@@ -167,11 +189,15 @@ ia2AccessibleTableCell::get_rowHeaderCells(IUnknown*** aCellAccessibles,
   }
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleTableCell::get_rowIndex(long* aRowIdx)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aRowIdx)
     return E_INVALIDARG;
 
@@ -181,6 +207,8 @@ ia2AccessibleTableCell::get_rowIndex(long* aRowIdx)
 
   *aRowIdx = mTableCell->RowIdx();
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
@@ -189,6 +217,8 @@ ia2AccessibleTableCell::get_rowColumnExtents(long* aRowIdx, long* aColIdx,
                                              long* aColExtents,
                                              boolean* aIsSelected)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aRowIdx || !aColIdx || !aRowExtents || !aColExtents || !aIsSelected)
     return E_INVALIDARG;
 
@@ -204,11 +234,15 @@ ia2AccessibleTableCell::get_rowColumnExtents(long* aRowIdx, long* aColIdx,
   *aIsSelected = mTableCell->Selected();
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleTableCell::get_isSelected(boolean* aIsSelected)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aIsSelected)
     return E_INVALIDARG;
 
@@ -218,4 +252,6 @@ ia2AccessibleTableCell::get_isSelected(boolean* aIsSelected)
 
   *aIsSelected = mTableCell->Selected();
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
diff --git a/accessible/windows/ia2/ia2AccessibleText.cpp b/accessible/windows/ia2/ia2AccessibleText.cpp
index 86b3abdf6..7ac766f30 100644
--- a/accessible/windows/ia2/ia2AccessibleText.cpp
+++ b/accessible/windows/ia2/ia2AccessibleText.cpp
@@ -28,6 +28,8 @@ bool ia2AccessibleText::sLastTextChangeWasInsert = false;
 STDMETHODIMP
 ia2AccessibleText::addSelection(long aStartOffset, long aEndOffset)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   MOZ_ASSERT(!HyperTextProxyFor(this));
 
   HyperTextAccessible* textAcc = static_cast<HyperTextAccessibleWrap*>(this);
@@ -36,12 +38,16 @@ ia2AccessibleText::addSelection(long aStartOffset, long aEndOffset)
 
   return textAcc->AddToSelection(aStartOffset, aEndOffset) ?
     S_OK : E_INVALIDARG;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleText::get_attributes(long aOffset, long *aStartOffset,
                                   long *aEndOffset, BSTR *aTextAttributes)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aStartOffset || !aEndOffset || !aTextAttributes)
     return E_INVALIDARG;
 
@@ -68,11 +74,15 @@ ia2AccessibleText::get_attributes(long aOffset, long *aStartOffset,
   *aEndOffset = endOffset;
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleText::get_caretOffset(long *aOffset)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aOffset)
     return E_INVALIDARG;
 
@@ -87,6 +97,8 @@ ia2AccessibleText::get_caretOffset(long *aOffset)
   *aOffset = textAcc->CaretOffset();
 
   return *aOffset != -1 ? S_OK : S_FALSE;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
@@ -95,6 +107,8 @@ ia2AccessibleText::get_characterExtents(long aOffset,
                                         long* aX, long* aY,
                                         long* aWidth, long* aHeight)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aX || !aY || !aWidth || !aHeight)
     return E_INVALIDARG;
   *aX = *aY = *aWidth = *aHeight = 0;
@@ -115,11 +129,15 @@ ia2AccessibleText::get_characterExtents(long aOffset,
   *aWidth = rect.width;
   *aHeight = rect.height;
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleText::get_nSelections(long* aNSelections)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aNSelections)
     return E_INVALIDARG;
   *aNSelections = 0;
@@ -133,6 +151,8 @@ ia2AccessibleText::get_nSelections(long* aNSelections)
   *aNSelections = textAcc->SelectionCount();
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
@@ -140,6 +160,8 @@ ia2AccessibleText::get_offsetAtPoint(long aX, long aY,
                                      enum IA2CoordinateType aCoordType,
                                      long* aOffset)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aOffset)
     return E_INVALIDARG;
   *aOffset = 0;
@@ -157,12 +179,16 @@ ia2AccessibleText::get_offsetAtPoint(long aX, long aY,
   *aOffset = textAcc->OffsetAtPoint(aX, aY, geckoCoordType);
 
   return *aOffset == -1 ? S_FALSE : S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleText::get_selection(long aSelectionIndex, long* aStartOffset,
                                  long* aEndOffset)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aStartOffset || !aEndOffset)
     return E_INVALIDARG;
   *aStartOffset = *aEndOffset = 0;
@@ -181,11 +207,15 @@ ia2AccessibleText::get_selection(long aSelectionIndex, long* aStartOffset,
   *aStartOffset = startOffset;
   *aEndOffset = endOffset;
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleText::get_text(long aStartOffset, long aEndOffset, BSTR* aText)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aText)
     return E_INVALIDARG;
 
@@ -209,6 +239,8 @@ ia2AccessibleText::get_text(long aStartOffset, long aEndOffset, BSTR* aText)
 
   *aText = ::SysAllocStringLen(text.get(), text.Length());
   return *aText ? S_OK : E_OUTOFMEMORY;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
@@ -217,6 +249,8 @@ ia2AccessibleText::get_textBeforeOffset(long aOffset,
                                         long* aStartOffset, long* aEndOffset,
                                         BSTR* aText)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aStartOffset || !aEndOffset || !aText)
     return E_INVALIDARG;
 
@@ -253,6 +287,8 @@ ia2AccessibleText::get_textBeforeOffset(long aOffset,
 
   *aText = ::SysAllocStringLen(text.get(), text.Length());
   return *aText ? S_OK : E_OUTOFMEMORY;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
@@ -261,6 +297,8 @@ ia2AccessibleText::get_textAfterOffset(long aOffset,
                                        long* aStartOffset, long* aEndOffset,
                                        BSTR* aText)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aStartOffset || !aEndOffset || !aText)
     return E_INVALIDARG;
 
@@ -297,6 +335,8 @@ ia2AccessibleText::get_textAfterOffset(long aOffset,
 
   *aText = ::SysAllocStringLen(text.get(), text.Length());
   return *aText ? S_OK : E_OUTOFMEMORY;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
@@ -305,6 +345,8 @@ ia2AccessibleText::get_textAtOffset(long aOffset,
                                     long* aStartOffset, long* aEndOffset,
                                     BSTR* aText)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aStartOffset || !aEndOffset || !aText)
     return E_INVALIDARG;
 
@@ -339,11 +381,15 @@ ia2AccessibleText::get_textAtOffset(long aOffset,
 
   *aText = ::SysAllocStringLen(text.get(), text.Length());
   return *aText ? S_OK : E_OUTOFMEMORY;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleText::removeSelection(long aSelectionIndex)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   MOZ_ASSERT(!HyperTextProxyFor(this));
 
   HyperTextAccessible* textAcc = static_cast<HyperTextAccessibleWrap*>(this);
@@ -352,11 +398,15 @@ ia2AccessibleText::removeSelection(long aSelectionIndex)
 
   return textAcc->RemoveFromSelection(aSelectionIndex) ?
     S_OK : E_INVALIDARG;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleText::setCaretOffset(long aOffset)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   MOZ_ASSERT(!HyperTextProxyFor(this));
 
   HyperTextAccessible* textAcc = static_cast<HyperTextAccessibleWrap*>(this);
@@ -368,12 +418,16 @@ ia2AccessibleText::setCaretOffset(long aOffset)
 
   textAcc->SetCaretOffset(aOffset);
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleText::setSelection(long aSelectionIndex, long aStartOffset,
                                 long aEndOffset)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   MOZ_ASSERT(!HyperTextProxyFor(this));
 
   HyperTextAccessible* textAcc = static_cast<HyperTextAccessibleWrap*>(this);
@@ -382,11 +436,15 @@ ia2AccessibleText::setSelection(long aSelectionIndex, long aStartOffset,
 
   return textAcc->SetSelectionBoundsAt(aSelectionIndex, aStartOffset, aEndOffset) ?
     S_OK : E_INVALIDARG;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleText::get_nCharacters(long* aNCharacters)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aNCharacters)
     return E_INVALIDARG;
   *aNCharacters = 0;
@@ -399,12 +457,16 @@ ia2AccessibleText::get_nCharacters(long* aNCharacters)
 
   *aNCharacters  = textAcc->CharacterCount();
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleText::scrollSubstringTo(long aStartIndex, long aEndIndex,
                                      enum IA2ScrollType aScrollType)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   MOZ_ASSERT(!HyperTextProxyFor(this));
 
   HyperTextAccessible* textAcc = static_cast<HyperTextAccessibleWrap*>(this);
@@ -416,6 +478,8 @@ ia2AccessibleText::scrollSubstringTo(long aStartIndex, long aEndIndex,
 
   textAcc->ScrollSubstringTo(aStartIndex, aEndIndex, aScrollType);
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
@@ -423,6 +487,8 @@ ia2AccessibleText::scrollSubstringToPoint(long aStartIndex, long aEndIndex,
                                           enum IA2CoordinateType aCoordType,
                                           long aX, long aY)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   uint32_t geckoCoordType = (aCoordType == IA2_COORDTYPE_SCREEN_RELATIVE) ?
     nsIAccessibleCoordinateType::COORDTYPE_SCREEN_RELATIVE :
     nsIAccessibleCoordinateType::COORDTYPE_PARENT_RELATIVE;
@@ -439,18 +505,28 @@ ia2AccessibleText::scrollSubstringToPoint(long aStartIndex, long aEndIndex,
   textAcc->ScrollSubstringToPoint(aStartIndex, aEndIndex,
                                   geckoCoordType, aX, aY);
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleText::get_newText(IA2TextSegment *aNewText)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   return GetModifiedText(true, aNewText);
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleText::get_oldText(IA2TextSegment *aOldText)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   return GetModifiedText(false, aOldText);
+
+  A11Y_TRYBLOCK_END
 }
 
 // ia2AccessibleText
diff --git a/accessible/windows/ia2/ia2AccessibleValue.cpp b/accessible/windows/ia2/ia2AccessibleValue.cpp
index 44d2c31fb..e33442295 100644
--- a/accessible/windows/ia2/ia2AccessibleValue.cpp
+++ b/accessible/windows/ia2/ia2AccessibleValue.cpp
@@ -46,6 +46,8 @@ ia2AccessibleValue::QueryInterface(REFIID iid, void** ppv)
 STDMETHODIMP
 ia2AccessibleValue::get_currentValue(VARIANT* aCurrentValue)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aCurrentValue)
     return E_INVALIDARG;
 
@@ -66,11 +68,15 @@ ia2AccessibleValue::get_currentValue(VARIANT* aCurrentValue)
   aCurrentValue->vt = VT_R8;
   aCurrentValue->dblVal = currentValue;
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleValue::setCurrentValue(VARIANT aValue)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (aValue.vt != VT_R8)
     return E_INVALIDARG;
 
@@ -81,11 +87,15 @@ ia2AccessibleValue::setCurrentValue(VARIANT aValue)
     return CO_E_OBJNOTCONNECTED;
 
   return valueAcc->SetCurValue(aValue.dblVal) ? S_OK : E_FAIL;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleValue::get_maximumValue(VARIANT* aMaximumValue)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aMaximumValue)
     return E_INVALIDARG;
 
@@ -106,11 +116,15 @@ ia2AccessibleValue::get_maximumValue(VARIANT* aMaximumValue)
   aMaximumValue->vt = VT_R8;
   aMaximumValue->dblVal = maximumValue;
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2AccessibleValue::get_minimumValue(VARIANT* aMinimumValue)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aMinimumValue)
     return E_INVALIDARG;
 
@@ -131,5 +145,7 @@ ia2AccessibleValue::get_minimumValue(VARIANT* aMinimumValue)
   aMinimumValue->vt = VT_R8;
   aMinimumValue->dblVal = minimumValue;
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
diff --git a/accessible/windows/msaa/AccessibleWrap.cpp b/accessible/windows/msaa/AccessibleWrap.cpp
index 426270814..6112c370a 100644
--- a/accessible/windows/msaa/AccessibleWrap.cpp
+++ b/accessible/windows/msaa/AccessibleWrap.cpp
@@ -110,6 +110,8 @@ AccessibleWrap::Shutdown()
 STDMETHODIMP
 AccessibleWrap::QueryInterface(REFIID iid, void** ppv)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!ppv)
     return E_INVALIDARG;
 
@@ -163,6 +165,8 @@ AccessibleWrap::QueryInterface(REFIID iid, void** ppv)
 
   (reinterpret_cast<IUnknown*>(*ppv))->AddRef();
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 //-----------------------------------------------------
@@ -172,6 +176,8 @@ AccessibleWrap::QueryInterface(REFIID iid, void** ppv)
 STDMETHODIMP
 AccessibleWrap::get_accParent( IDispatch __RPC_FAR *__RPC_FAR *ppdispParent)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!ppdispParent)
     return E_INVALIDARG;
 
@@ -202,11 +208,15 @@ AccessibleWrap::get_accParent( IDispatch __RPC_FAR *__RPC_FAR *ppdispParent)
 
   *ppdispParent = NativeAccessible(xpParentAcc);
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 AccessibleWrap::get_accChildCount( long __RPC_FAR *pcountChildren)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!pcountChildren)
     return E_INVALIDARG;
 
@@ -220,6 +230,8 @@ AccessibleWrap::get_accChildCount( long __RPC_FAR *pcountChildren)
 
   *pcountChildren = ChildCount();
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
@@ -227,6 +239,8 @@ AccessibleWrap::get_accChild(
       /* [in] */ VARIANT varChild,
       /* [retval][out] */ IDispatch __RPC_FAR *__RPC_FAR *ppdispChild)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!ppdispChild)
     return E_INVALIDARG;
 
@@ -251,6 +265,8 @@ AccessibleWrap::get_accChild(
 
   child.forget(ppdispChild);
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 /**
@@ -315,6 +331,8 @@ AccessibleWrap::get_accName(
       /* [optional][in] */ VARIANT varChild,
       /* [retval][out] */ BSTR __RPC_FAR *pszName)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!pszName || varChild.vt != VT_I4)
     return E_INVALIDARG;
 
@@ -343,6 +361,8 @@ AccessibleWrap::get_accName(
   if (!*pszName)
     return E_OUTOFMEMORY;
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 
@@ -351,6 +371,8 @@ AccessibleWrap::get_accValue(
       /* [optional][in] */ VARIANT varChild,
       /* [retval][out] */ BSTR __RPC_FAR *pszValue)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!pszValue)
     return E_INVALIDARG;
 
@@ -379,12 +401,16 @@ AccessibleWrap::get_accValue(
   if (!*pszValue)
     return E_OUTOFMEMORY;
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 AccessibleWrap::get_accDescription(VARIANT varChild,
                                    BSTR __RPC_FAR *pszDescription)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!pszDescription)
     return E_INVALIDARG;
 
@@ -406,6 +432,8 @@ AccessibleWrap::get_accDescription(VARIANT varChild,
   *pszDescription = ::SysAllocStringLen(description.get(),
                                         description.Length());
   return *pszDescription ? S_OK : E_OUTOFMEMORY;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
@@ -413,6 +441,8 @@ AccessibleWrap::get_accRole(
       /* [optional][in] */ VARIANT varChild,
       /* [retval][out] */ VARIANT __RPC_FAR *pvarRole)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!pvarRole)
     return E_INVALIDARG;
 
@@ -502,6 +532,8 @@ AccessibleWrap::get_accRole(
   }
 
   return E_FAIL;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
@@ -509,6 +541,8 @@ AccessibleWrap::get_accState(
       /* [optional][in] */ VARIANT varChild,
       /* [retval][out] */ VARIANT __RPC_FAR *pvarState)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!pvarState)
     return E_INVALIDARG;
 
@@ -540,6 +574,8 @@ AccessibleWrap::get_accState(
   nsAccUtils::To32States(state, &msaaState, nullptr);
   pvarState->lVal = msaaState;
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 
@@ -548,11 +584,15 @@ AccessibleWrap::get_accHelp(
       /* [optional][in] */ VARIANT varChild,
       /* [retval][out] */ BSTR __RPC_FAR *pszHelp)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!pszHelp)
     return E_INVALIDARG;
 
   *pszHelp = nullptr;
   return S_FALSE;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
@@ -561,12 +601,16 @@ AccessibleWrap::get_accHelpTopic(
       /* [optional][in] */ VARIANT varChild,
       /* [retval][out] */ long __RPC_FAR *pidTopic)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!pszHelpFile || !pidTopic)
     return E_INVALIDARG;
 
   *pszHelpFile = nullptr;
   *pidTopic = 0;
   return S_FALSE;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
@@ -574,6 +618,8 @@ AccessibleWrap::get_accKeyboardShortcut(
       /* [optional][in] */ VARIANT varChild,
       /* [retval][out] */ BSTR __RPC_FAR *pszKeyboardShortcut)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!pszKeyboardShortcut)
     return E_INVALIDARG;
   *pszKeyboardShortcut = nullptr;
@@ -599,12 +645,16 @@ AccessibleWrap::get_accKeyboardShortcut(
   *pszKeyboardShortcut = ::SysAllocStringLen(shortcut.get(),
                                              shortcut.Length());
   return *pszKeyboardShortcut ? S_OK : E_OUTOFMEMORY;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 AccessibleWrap::get_accFocus(
       /* [retval][out] */ VARIANT __RPC_FAR *pvarChild)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!pvarChild)
     return E_INVALIDARG;
 
@@ -635,6 +685,8 @@ AccessibleWrap::get_accFocus(
   }
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 /**
@@ -671,6 +723,8 @@ private:
 STDMETHODIMP
 AccessibleEnumerator::QueryInterface(REFIID iid, void ** ppvObject)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (iid == IID_IEnumVARIANT) {
     *ppvObject = static_cast<IEnumVARIANT*>(this);
     AddRef();
@@ -684,11 +738,15 @@ AccessibleEnumerator::QueryInterface(REFIID iid, void ** ppvObject)
 
   *ppvObject = nullptr;
   return E_NOINTERFACE;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 AccessibleEnumerator::Next(unsigned long celt, VARIANT FAR* rgvar, unsigned long FAR* pceltFetched)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   uint32_t length = mArray.Length();
   HRESULT hr = S_OK;
 
@@ -708,21 +766,29 @@ AccessibleEnumerator::Next(unsigned long celt, VARIANT FAR* rgvar, unsigned long
     *pceltFetched = celt;
 
   return hr;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 AccessibleEnumerator::Clone(IEnumVARIANT FAR* FAR* ppenum)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   *ppenum = new AccessibleEnumerator(*this);
   if (!*ppenum)
     return E_OUTOFMEMORY;
   NS_ADDREF(*ppenum);
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 AccessibleEnumerator::Skip(unsigned long celt)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   uint32_t length = mArray.Length();
   // Check if we can skip the requested number of elements
   if (celt > length - mCurIndex) {
@@ -731,6 +797,8 @@ AccessibleEnumerator::Skip(unsigned long celt)
   }
   mCurIndex += celt;
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 /**
@@ -753,6 +821,8 @@ AccessibleEnumerator::Skip(unsigned long celt)
 STDMETHODIMP
 AccessibleWrap::get_accSelection(VARIANT __RPC_FAR *pvarChildren)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!pvarChildren)
     return E_INVALIDARG;
 
@@ -772,6 +842,8 @@ AccessibleWrap::get_accSelection(VARIANT __RPC_FAR *pvarChildren)
     NS_ADDREF(pvarChildren->punkVal = pEnum);
   }
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
@@ -779,6 +851,8 @@ AccessibleWrap::get_accDefaultAction(
       /* [optional][in] */ VARIANT varChild,
       /* [retval][out] */ BSTR __RPC_FAR *pszDefaultAction)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!pszDefaultAction)
     return E_INVALIDARG;
 
@@ -800,6 +874,8 @@ AccessibleWrap::get_accDefaultAction(
   *pszDefaultAction = ::SysAllocStringLen(defaultAction.get(),
                                           defaultAction.Length());
   return *pszDefaultAction ? S_OK : E_OUTOFMEMORY;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
@@ -807,6 +883,8 @@ AccessibleWrap::accSelect(
       /* [in] */ long flagsSelect,
       /* [optional][in] */ VARIANT varChild)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   RefPtr<IAccessible> accessible;
   HRESULT hr = ResolveChild(varChild, getter_AddRefs(accessible));
   if (FAILED(hr)) {
@@ -848,6 +926,8 @@ AccessibleWrap::accSelect(
   }
 
   return E_FAIL;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
@@ -858,6 +938,8 @@ AccessibleWrap::accLocation(
       /* [out] */ long __RPC_FAR *pcyHeight,
       /* [optional][in] */ VARIANT varChild)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!pxLeft || !pyTop || !pcxWidth || !pcyHeight)
     return E_INVALIDARG;
 
@@ -884,6 +966,8 @@ AccessibleWrap::accLocation(
   *pcxWidth = rect.width;
   *pcyHeight = rect.height;
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
@@ -892,6 +976,8 @@ AccessibleWrap::accNavigate(
       /* [optional][in] */ VARIANT varStart,
       /* [retval][out] */ VARIANT __RPC_FAR *pvarEndUpAt)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!pvarEndUpAt)
     return E_INVALIDARG;
 
@@ -974,6 +1060,8 @@ AccessibleWrap::accNavigate(
   pvarEndUpAt->pdispVal = NativeAccessible(navAccessible);
   pvarEndUpAt->vt = VT_DISPATCH;
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
@@ -982,6 +1070,8 @@ AccessibleWrap::accHitTest(
       /* [in] */ long yTop,
       /* [retval][out] */ VARIANT __RPC_FAR *pvarChild)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!pvarChild)
     return E_INVALIDARG;
 
@@ -1008,12 +1098,16 @@ AccessibleWrap::accHitTest(
     return S_FALSE;
   }
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 AccessibleWrap::accDoDefaultAction(
       /* [optional][in] */ VARIANT varChild)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   RefPtr<IAccessible> accessible;
   HRESULT hr = ResolveChild(varChild, getter_AddRefs(accessible));
   if (FAILED(hr)) {
@@ -1025,6 +1119,8 @@ AccessibleWrap::accDoDefaultAction(
   }
 
   return DoAction(0) ? S_OK : E_INVALIDARG;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
diff --git a/accessible/windows/msaa/ApplicationAccessibleWrap.cpp b/accessible/windows/msaa/ApplicationAccessibleWrap.cpp
index ec9d511e4..b78a8dd55 100644
--- a/accessible/windows/msaa/ApplicationAccessibleWrap.cpp
+++ b/accessible/windows/msaa/ApplicationAccessibleWrap.cpp
@@ -69,6 +69,8 @@ ApplicationAccessibleWrap::QueryInterface(REFIID iid, void** ppv)
 STDMETHODIMP
 ApplicationAccessibleWrap::get_appName(BSTR* aName)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aName)
     return E_INVALIDARG;
 
@@ -84,11 +86,15 @@ ApplicationAccessibleWrap::get_appName(BSTR* aName)
 
   *aName = ::SysAllocStringLen(name.get(), name.Length());
   return *aName ? S_OK : E_OUTOFMEMORY;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ApplicationAccessibleWrap::get_appVersion(BSTR* aVersion)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aVersion)
     return E_INVALIDARG;
 
@@ -104,11 +110,15 @@ ApplicationAccessibleWrap::get_appVersion(BSTR* aVersion)
 
   *aVersion = ::SysAllocStringLen(version.get(), version.Length());
   return *aVersion ? S_OK : E_OUTOFMEMORY;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ApplicationAccessibleWrap::get_toolkitName(BSTR* aName)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aName)
     return E_INVALIDARG;
 
@@ -122,11 +132,15 @@ ApplicationAccessibleWrap::get_toolkitName(BSTR* aName)
 
   *aName = ::SysAllocStringLen(name.get(), name.Length());
   return *aName ? S_OK : E_OUTOFMEMORY;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ApplicationAccessibleWrap::get_toolkitVersion(BSTR* aVersion)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aVersion)
     return E_INVALIDARG;
 
@@ -142,5 +156,7 @@ ApplicationAccessibleWrap::get_toolkitVersion(BSTR* aVersion)
 
   *aVersion = ::SysAllocStringLen(version.get(), version.Length());
   return *aVersion ? S_OK : E_OUTOFMEMORY;
+
+  A11Y_TRYBLOCK_END
 }
 
diff --git a/accessible/windows/msaa/DocAccessibleWrap.cpp b/accessible/windows/msaa/DocAccessibleWrap.cpp
index 895fe9192..6fb89816d 100644
--- a/accessible/windows/msaa/DocAccessibleWrap.cpp
+++ b/accessible/windows/msaa/DocAccessibleWrap.cpp
@@ -65,6 +65,8 @@ DocAccessibleWrap::get_accParent(
 STDMETHODIMP
 DocAccessibleWrap::get_accValue(VARIANT aVarChild, BSTR __RPC_FAR* aValue)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aValue)
     return E_INVALIDARG;
   *aValue = nullptr;
@@ -88,6 +90,8 @@ DocAccessibleWrap::get_accValue(VARIANT aVarChild, BSTR __RPC_FAR* aValue)
 
   *aValue = ::SysAllocStringLen(url.get(), url.Length());
   return *aValue ? S_OK : E_OUTOFMEMORY;
+
+  A11Y_TRYBLOCK_END
 }
 
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/accessible/windows/msaa/EnumVariant.cpp b/accessible/windows/msaa/EnumVariant.cpp
index 2344208a3..86c81a105 100644
--- a/accessible/windows/msaa/EnumVariant.cpp
+++ b/accessible/windows/msaa/EnumVariant.cpp
@@ -21,6 +21,8 @@ STDMETHODIMP
 ChildrenEnumVariant::Next(ULONG aCount, VARIANT FAR* aItems,
                           ULONG FAR* aCountFetched)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aItems || !aCountFetched)
     return E_INVALIDARG;
 
@@ -53,11 +55,15 @@ ChildrenEnumVariant::Next(ULONG aCount, VARIANT FAR* aItems,
   (*aCountFetched) = countFetched;
 
   return countFetched < aCount ? S_FALSE : S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ChildrenEnumVariant::Skip(ULONG aCount)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (mAnchorAcc->IsDefunct() || mAnchorAcc->GetChildAt(mCurIndex) != mCurAcc)
     return CO_E_OBJNOTCONNECTED;
 
@@ -65,11 +71,15 @@ ChildrenEnumVariant::Skip(ULONG aCount)
   mCurAcc = mAnchorAcc->GetChildAt(mCurIndex);
 
   return mCurAcc ? S_OK : S_FALSE;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ChildrenEnumVariant::Reset()
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (mAnchorAcc->IsDefunct())
     return CO_E_OBJNOTCONNECTED;
 
@@ -77,11 +87,15 @@ ChildrenEnumVariant::Reset()
   mCurAcc = mAnchorAcc->GetChildAt(0);
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ChildrenEnumVariant::Clone(IEnumVARIANT** aEnumVariant)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aEnumVariant)
     return E_INVALIDARG;
 
@@ -89,4 +103,6 @@ ChildrenEnumVariant::Clone(IEnumVARIANT** aEnumVariant)
   (*aEnumVariant)->AddRef();
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
diff --git a/accessible/windows/msaa/IUnknownImpl.cpp b/accessible/windows/msaa/IUnknownImpl.cpp
index c5e614b60..5114ddcc0 100644
--- a/accessible/windows/msaa/IUnknownImpl.cpp
+++ b/accessible/windows/msaa/IUnknownImpl.cpp
@@ -33,5 +33,22 @@ GetHRESULT(nsresult aResult)
   }
 }
 
+int
+FilterExceptions(unsigned int aCode, EXCEPTION_POINTERS* aExceptionInfo)
+{
+  if (aCode == EXCEPTION_ACCESS_VIOLATION) {
+#ifdef MOZ_CRASHREPORTER
+    // MSAA swallows crashes (because it is COM-based) but we still need to
+    // learn about those crashes so we can fix them. Make sure to pass them to
+    // the crash reporter.
+    CrashReporter::WriteMinidumpForException(aExceptionInfo);
+#endif
+  } else {
+    NS_NOTREACHED("We should only be catching crash exceptions");
+  }
+
+  return EXCEPTION_CONTINUE_SEARCH;
+}
+
 } // namespace a11y
 } // namespace mozilla
diff --git a/accessible/windows/msaa/IUnknownImpl.h b/accessible/windows/msaa/IUnknownImpl.h
index d939a4dfa..dbf6c1374 100644
--- a/accessible/windows/msaa/IUnknownImpl.h
+++ b/accessible/windows/msaa/IUnknownImpl.h
@@ -79,6 +79,7 @@ virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID, void**);              \
 STDMETHODIMP                                                                   \
 Class::QueryInterface(REFIID aIID, void** aInstancePtr)                        \
 {                                                                              \
+  A11Y_TRYBLOCK_BEGIN                                                          \
   if (!aInstancePtr)                                                           \
     return E_INVALIDARG;                                                       \
   *aInstancePtr = nullptr;                                                     \
@@ -87,14 +88,17 @@ Class::QueryInterface(REFIID aIID, void** aInstancePtr)                        \
 
 #define IMPL_IUNKNOWN_QUERY_TAIL                                               \
   return hr;                                                                   \
+  A11Y_TRYBLOCK_END                                                            \
 }
 
 #define IMPL_IUNKNOWN_QUERY_TAIL_AGGREGATED(Member)                            \
   return Member->QueryInterface(aIID, aInstancePtr);                           \
+  A11Y_TRYBLOCK_END                                                            \
 }
 
 #define IMPL_IUNKNOWN_QUERY_TAIL_INHERITED(BaseClass)                          \
   return BaseClass::QueryInterface(aIID, aInstancePtr);                        \
+  A11Y_TRYBLOCK_END                                                            \
 }
 
 #define IMPL_IUNKNOWN_QUERY_IFACE(Iface)                                       \
@@ -154,6 +158,21 @@ Class::QueryInterface(REFIID aIID, void** aInstancePtr)                        \
   IMPL_IUNKNOWN_QUERY_CLASS(Super2);                                           \
   IMPL_IUNKNOWN_QUERY_TAIL_INHERITED(Super0)
 
+
+/**
+ * Wrap every method body by these macroses to pass exception to the crash
+ * reporter.
+ */
+#define A11Y_TRYBLOCK_BEGIN                                                    \
+  MOZ_SEH_TRY {
+
+#define A11Y_TRYBLOCK_END                                                      \
+  } MOZ_SEH_EXCEPT(mozilla::a11y::FilterExceptions(::GetExceptionCode(),       \
+                                                   GetExceptionInformation())) \
+  { }                                                                          \
+  return E_FAIL;
+
+
 namespace mozilla {
 namespace a11y {
 
@@ -162,6 +181,11 @@ namespace a11y {
  */
 HRESULT GetHRESULT(nsresult aResult);
 
+/**
+ * Used to pass an exception to the crash reporter.
+ */
+int FilterExceptions(unsigned int aCode, EXCEPTION_POINTERS* aExceptionInfo);
+
 } // namespace a11y;
 } //namespace mozilla;
 
diff --git a/accessible/windows/sdn/sdnAccessible.cpp b/accessible/windows/sdn/sdnAccessible.cpp
index d90631c8f..909b0779c 100644
--- a/accessible/windows/sdn/sdnAccessible.cpp
+++ b/accessible/windows/sdn/sdnAccessible.cpp
@@ -28,6 +28,8 @@ using namespace mozilla::a11y;
 STDMETHODIMP
 sdnAccessible::QueryInterface(REFIID aREFIID, void** aInstancePtr)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aInstancePtr)
     return E_FAIL;
   *aInstancePtr = nullptr;
@@ -51,6 +53,8 @@ sdnAccessible::QueryInterface(REFIID aREFIID, void** aInstancePtr)
   }
 
   return E_NOINTERFACE;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
@@ -61,6 +65,8 @@ sdnAccessible::get_nodeInfo(BSTR __RPC_FAR* aNodeName,
                             unsigned int __RPC_FAR* aUniqueID,
                             unsigned short __RPC_FAR* aNodeType)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aNodeName || !aNameSpaceID || !aNodeValue || !aNumChildren ||
       !aUniqueID || !aNodeType)
     return E_INVALIDARG;
@@ -108,6 +114,8 @@ sdnAccessible::get_nodeInfo(BSTR __RPC_FAR* aNodeName,
   *aNumChildren = mNode->GetChildCount();
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
@@ -117,6 +125,8 @@ sdnAccessible::get_attributes(unsigned  short aMaxAttribs,
                               BSTR __RPC_FAR* aAttribValues,
                               unsigned short __RPC_FAR* aNumAttribs)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aAttribNames || !aNameSpaceIDs || !aAttribValues || !aNumAttribs)
     return E_INVALIDARG;
 
@@ -149,6 +159,8 @@ sdnAccessible::get_attributes(unsigned  short aMaxAttribs,
   }
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
@@ -157,6 +169,8 @@ sdnAccessible::get_attributesForNames(unsigned short aMaxAttribs,
                                       short __RPC_FAR* aNameSpaceID,
                                       BSTR __RPC_FAR* aAttribValues)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aAttribNames || !aNameSpaceID || !aAttribValues)
     return E_INVALIDARG;
 
@@ -193,6 +207,8 @@ sdnAccessible::get_attributesForNames(unsigned short aMaxAttribs,
   }
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
@@ -202,6 +218,8 @@ sdnAccessible::get_computedStyle(unsigned short aMaxStyleProperties,
                                  BSTR __RPC_FAR* aStyleValues,
                                  unsigned short __RPC_FAR* aNumStyleProperties)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aStyleProperties || aStyleValues || !aNumStyleProperties)
     return E_INVALIDARG;
 
@@ -239,6 +257,8 @@ sdnAccessible::get_computedStyle(unsigned short aMaxStyleProperties,
   *aNumStyleProperties = static_cast<unsigned short>(realIndex);
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
@@ -247,6 +267,8 @@ sdnAccessible::get_computedStyleForProperties(unsigned short aNumStyleProperties
                                               BSTR __RPC_FAR* aStyleProperties,
                                               BSTR __RPC_FAR* aStyleValues)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aStyleProperties || !aStyleValues)
     return E_INVALIDARG;
 
@@ -269,11 +291,15 @@ sdnAccessible::get_computedStyleForProperties(unsigned short aNumStyleProperties
   }
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 sdnAccessible::scrollTo(boolean aScrollTopLeft)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   DocAccessible* document = GetDocument();
   if (!document) // that's IsDefunct check
     return CO_E_OBJNOTCONNECTED;
@@ -287,11 +313,15 @@ sdnAccessible::scrollTo(boolean aScrollTopLeft)
 
   nsCoreUtils::ScrollTo(document->PresShell(), mNode->AsContent(), scrollType);
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 sdnAccessible::get_parentNode(ISimpleDOMNode __RPC_FAR *__RPC_FAR* aNode)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aNode)
     return E_INVALIDARG;
   *aNode = nullptr;
@@ -306,11 +336,15 @@ sdnAccessible::get_parentNode(ISimpleDOMNode __RPC_FAR *__RPC_FAR* aNode)
   }
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 sdnAccessible::get_firstChild(ISimpleDOMNode __RPC_FAR *__RPC_FAR* aNode)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aNode)
     return E_INVALIDARG;
   *aNode = nullptr;
@@ -325,11 +359,15 @@ sdnAccessible::get_firstChild(ISimpleDOMNode __RPC_FAR *__RPC_FAR* aNode)
   }
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 sdnAccessible::get_lastChild(ISimpleDOMNode __RPC_FAR *__RPC_FAR* aNode)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aNode)
     return E_INVALIDARG;
   *aNode = nullptr;
@@ -344,11 +382,15 @@ sdnAccessible::get_lastChild(ISimpleDOMNode __RPC_FAR *__RPC_FAR* aNode)
   }
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 sdnAccessible::get_previousSibling(ISimpleDOMNode __RPC_FAR *__RPC_FAR* aNode)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aNode)
     return E_INVALIDARG;
   *aNode = nullptr;
@@ -363,11 +405,15 @@ sdnAccessible::get_previousSibling(ISimpleDOMNode __RPC_FAR *__RPC_FAR* aNode)
   }
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 sdnAccessible::get_nextSibling(ISimpleDOMNode __RPC_FAR *__RPC_FAR* aNode)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aNode)
     return E_INVALIDARG;
   *aNode = nullptr;
@@ -382,12 +428,16 @@ sdnAccessible::get_nextSibling(ISimpleDOMNode __RPC_FAR *__RPC_FAR* aNode)
   }
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 sdnAccessible::get_childAt(unsigned aChildIndex,
                            ISimpleDOMNode __RPC_FAR *__RPC_FAR* aNode)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aNode)
     return E_INVALIDARG;
   *aNode = nullptr;
@@ -403,11 +453,15 @@ sdnAccessible::get_childAt(unsigned aChildIndex,
 
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 sdnAccessible::get_innerHTML(BSTR __RPC_FAR* aInnerHTML)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aInnerHTML)
     return E_INVALIDARG;
   *aInnerHTML = nullptr;
@@ -428,11 +482,15 @@ sdnAccessible::get_innerHTML(BSTR __RPC_FAR* aInnerHTML)
     return E_OUTOFMEMORY;
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 sdnAccessible::get_localInterface(void __RPC_FAR *__RPC_FAR* aLocalInterface)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aLocalInterface)
     return E_INVALIDARG;
   *aLocalInterface = nullptr;
@@ -444,11 +502,15 @@ sdnAccessible::get_localInterface(void __RPC_FAR *__RPC_FAR* aLocalInterface)
   AddRef();
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 sdnAccessible::get_language(BSTR __RPC_FAR* aLanguage)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aLanguage)
     return E_INVALIDARG;
   *aLanguage = nullptr;
@@ -472,4 +534,6 @@ sdnAccessible::get_language(BSTR __RPC_FAR* aLanguage)
    return E_OUTOFMEMORY;
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
diff --git a/accessible/windows/sdn/sdnDocAccessible.cpp b/accessible/windows/sdn/sdnDocAccessible.cpp
index a1c5be872..07b39e66f 100644
--- a/accessible/windows/sdn/sdnDocAccessible.cpp
+++ b/accessible/windows/sdn/sdnDocAccessible.cpp
@@ -24,6 +24,8 @@ IMPL_IUNKNOWN_QUERY_TAIL_AGGREGATED(mAccessible)
 STDMETHODIMP
 sdnDocAccessible::get_URL(BSTR __RPC_FAR* aURL)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aURL)
     return E_INVALIDARG;
   *aURL = nullptr;
@@ -38,11 +40,15 @@ sdnDocAccessible::get_URL(BSTR __RPC_FAR* aURL)
 
   *aURL = ::SysAllocStringLen(URL.get(), URL.Length());
   return *aURL ? S_OK : E_OUTOFMEMORY;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 sdnDocAccessible::get_title(BSTR __RPC_FAR* aTitle)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aTitle)
     return E_INVALIDARG;
   *aTitle = nullptr;
@@ -54,11 +60,15 @@ sdnDocAccessible::get_title(BSTR __RPC_FAR* aTitle)
   mAccessible->Title(title);
   *aTitle = ::SysAllocStringLen(title.get(), title.Length());
   return *aTitle ? S_OK : E_OUTOFMEMORY;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 sdnDocAccessible::get_mimeType(BSTR __RPC_FAR* aMimeType)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aMimeType)
     return E_INVALIDARG;
   *aMimeType = nullptr;
@@ -73,11 +83,15 @@ sdnDocAccessible::get_mimeType(BSTR __RPC_FAR* aMimeType)
 
   *aMimeType = ::SysAllocStringLen(mimeType.get(), mimeType.Length());
   return *aMimeType ? S_OK : E_OUTOFMEMORY;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 sdnDocAccessible::get_docType(BSTR __RPC_FAR* aDocType)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aDocType)
     return E_INVALIDARG;
   *aDocType = nullptr;
@@ -92,12 +106,16 @@ sdnDocAccessible::get_docType(BSTR __RPC_FAR* aDocType)
 
   *aDocType = ::SysAllocStringLen(docType.get(), docType.Length());
   return *aDocType ? S_OK : E_OUTOFMEMORY;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 sdnDocAccessible::get_nameSpaceURIForID(short aNameSpaceID,
                                         BSTR __RPC_FAR* aNameSpaceURI)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aNameSpaceURI)
     return E_INVALIDARG;
   *aNameSpaceURI = nullptr;
@@ -120,14 +138,20 @@ sdnDocAccessible::get_nameSpaceURIForID(short aNameSpaceID,
                                        nameSpaceURI.Length());
 
   return *aNameSpaceURI ? S_OK : E_OUTOFMEMORY;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 sdnDocAccessible::put_alternateViewMediaTypes(BSTR __RPC_FAR* aCommaSeparatedMediaTypes)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aCommaSeparatedMediaTypes)
     return E_INVALIDARG;
   *aCommaSeparatedMediaTypes = nullptr;
 
   return mAccessible->IsDefunct() ? CO_E_OBJNOTCONNECTED : E_NOTIMPL;
+
+  A11Y_TRYBLOCK_END
 }
diff --git a/accessible/windows/sdn/sdnTextAccessible.cpp b/accessible/windows/sdn/sdnTextAccessible.cpp
index b6f580ba3..b51caf44e 100644
--- a/accessible/windows/sdn/sdnTextAccessible.cpp
+++ b/accessible/windows/sdn/sdnTextAccessible.cpp
@@ -33,6 +33,8 @@ IMPL_IUNKNOWN_QUERY_TAIL_AGGREGATED(mAccessible)
 STDMETHODIMP
 sdnTextAccessible::get_domText(BSTR __RPC_FAR* aText)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aText)
     return E_INVALIDARG;
   *aText = nullptr;
@@ -49,6 +51,8 @@ sdnTextAccessible::get_domText(BSTR __RPC_FAR* aText)
 
   *aText = ::SysAllocStringLen(nodeValue.get(), nodeValue.Length());
   return *aText ? S_OK : E_OUTOFMEMORY;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
@@ -59,6 +63,8 @@ sdnTextAccessible::get_clippedSubstringBounds(unsigned int aStartIndex,
                                               int __RPC_FAR* aWidth,
                                               int __RPC_FAR* aHeight)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   nscoord x = 0, y = 0, width = 0, height = 0;
   HRESULT rv = get_unclippedSubstringBounds(aStartIndex, aEndIndex,
                                             &x, &y, &width, &height);
@@ -80,6 +86,8 @@ sdnTextAccessible::get_clippedSubstringBounds(unsigned int aStartIndex,
   *aWidth = clippedRect.width;
   *aHeight = clippedRect.height;
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
@@ -90,6 +98,8 @@ sdnTextAccessible::get_unclippedSubstringBounds(unsigned int aStartIndex,
                                                 int __RPC_FAR* aWidth,
                                                 int __RPC_FAR* aHeight)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aX || !aY || !aWidth || !aHeight)
     return E_INVALIDARG;
   *aX = *aY = *aWidth = *aHeight = 0;
@@ -125,12 +135,16 @@ sdnTextAccessible::get_unclippedSubstringBounds(unsigned int aStartIndex,
   *aHeight = presContext->AppUnitsToDevPixels(sum.height);
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 sdnTextAccessible::scrollToSubstring(unsigned int aStartIndex,
                                      unsigned int aEndIndex)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (mAccessible->IsDefunct())
     return CO_E_OBJNOTCONNECTED;
 
@@ -145,11 +159,15 @@ sdnTextAccessible::scrollToSubstring(unsigned int aStartIndex,
     nsCoreUtils::ScrollSubstringTo(mAccessible->GetFrame(), range,
                                    nsIAccessibleScrollType::SCROLL_TYPE_ANYWHERE);
   return GetHRESULT(rv);
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 sdnTextAccessible::get_fontFamily(BSTR __RPC_FAR* aFontFamily)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aFontFamily)
     return E_INVALIDARG;
   *aFontFamily = nullptr;
@@ -171,6 +189,8 @@ sdnTextAccessible::get_fontFamily(BSTR __RPC_FAR* aFontFamily)
 
   *aFontFamily = ::SysAllocStringLen(name.get(), name.Length());
   return *aFontFamily ? S_OK : E_OUTOFMEMORY;
+
+  A11Y_TRYBLOCK_END
 }
 
 nsIFrame*
diff --git a/accessible/windows/uia/uiaRawElmProvider.cpp b/accessible/windows/uia/uiaRawElmProvider.cpp
index 3121661e1..54e54766d 100644
--- a/accessible/windows/uia/uiaRawElmProvider.cpp
+++ b/accessible/windows/uia/uiaRawElmProvider.cpp
@@ -28,18 +28,24 @@ STDMETHODIMP
 uiaRawElmProvider::GetObjectForChild(long aIdChild,
                                      __RPC__deref_out_opt IAccessibleEx** aAccEx)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aAccEx)
     return E_INVALIDARG;
 
   *aAccEx = nullptr;
 
   return mAcc->IsDefunct() ? CO_E_OBJNOTCONNECTED : S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 uiaRawElmProvider::GetIAccessiblePair(__RPC__deref_out_opt IAccessible** aAcc,
                                       __RPC__out long* aIdChild)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aAcc || !aIdChild)
     return E_INVALIDARG;
 
@@ -54,11 +60,15 @@ uiaRawElmProvider::GetIAccessiblePair(__RPC__deref_out_opt IAccessible** aAcc,
   mAcc->AddRef();
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 uiaRawElmProvider::GetRuntimeId(__RPC__deref_out_opt SAFEARRAY** aRuntimeIds)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aRuntimeIds)
     return E_INVALIDARG;
 
@@ -71,12 +81,16 @@ uiaRawElmProvider::GetRuntimeId(__RPC__deref_out_opt SAFEARRAY** aRuntimeIds)
     SafeArrayPutElement(*aRuntimeIds, &i, (void*)&(ids[i]));
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 uiaRawElmProvider::ConvertReturnedElement(__RPC__in_opt IRawElementProviderSimple* aRawElmProvider,
                                           __RPC__deref_out_opt IAccessibleEx** aAccEx)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aRawElmProvider || !aAccEx)
     return E_INVALIDARG;
 
@@ -88,6 +102,8 @@ uiaRawElmProvider::ConvertReturnedElement(__RPC__in_opt IRawElementProviderSimpl
     *aAccEx = static_cast<IAccessibleEx*>(instancePtr);
 
   return hr;
+
+  A11Y_TRYBLOCK_END
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -96,29 +112,39 @@ uiaRawElmProvider::ConvertReturnedElement(__RPC__in_opt IRawElementProviderSimpl
 STDMETHODIMP
 uiaRawElmProvider::get_ProviderOptions(__RPC__out enum ProviderOptions* aOptions)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aOptions)
     return E_INVALIDARG;
 
   // This method is not used with IAccessibleEx implementations.
   *aOptions = ProviderOptions_ServerSideProvider;
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 uiaRawElmProvider::GetPatternProvider(PATTERNID aPatternId,
                                       __RPC__deref_out_opt IUnknown** aPatternProvider)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aPatternProvider)
     return E_INVALIDARG;
 
   *aPatternProvider = nullptr;
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 uiaRawElmProvider::GetPropertyValue(PROPERTYID aPropertyId,
                                     __RPC__out VARIANT* aPropertyValue)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aPropertyValue)
     return E_INVALIDARG;
 
@@ -200,15 +226,21 @@ uiaRawElmProvider::GetPropertyValue(PROPERTYID aPropertyId,
   }
 
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 uiaRawElmProvider::get_HostRawElementProvider(__RPC__deref_out_opt IRawElementProviderSimple** aRawElmProvider)
 {
+  A11Y_TRYBLOCK_BEGIN
+
   if (!aRawElmProvider)
     return E_INVALIDARG;
 
   // This method is not used with IAccessibleEx implementations.
   *aRawElmProvider = nullptr;
   return S_OK;
+
+  A11Y_TRYBLOCK_END
 }
diff --git a/application/basilisk/app/basilisk.exe.manifest b/application/basilisk/app/basilisk.exe.manifest
index 079e15b58..bf5aac416 100644
--- a/application/basilisk/app/basilisk.exe.manifest
+++ b/application/basilisk/app/basilisk.exe.manifest
@@ -37,6 +37,7 @@
       <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
       <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
       <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
+      <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
     </application>
   </compatibility>
 </assembly>
diff --git a/application/basilisk/app/permissions b/application/basilisk/app/permissions
index cf0aa22fb..a2afdded2 100644
--- a/application/basilisk/app/permissions
+++ b/application/basilisk/app/permissions
@@ -6,6 +6,14 @@
 # * permission is an integer between 1 and 15
 # See nsPermissionManager.cpp for more...
 
+# UITour
+origin	uitour	1	https://www.mozilla.org
+origin	uitour	1	https://self-repair.mozilla.org
+origin	uitour	1	https://support.mozilla.org
+origin	uitour	1	https://addons.mozilla.org
+origin	uitour	1	https://discovery.addons.mozilla.org
+origin	uitour	1	about:home
+
 # XPInstall
 origin	install	1	https://addons.mozilla.org
 origin	install	1	https://testpilot.firefox.com
diff --git a/application/basilisk/app/profile/firefox.js b/application/basilisk/app/profile/firefox.js
index 2babde3b0..ede62fd5e 100644
--- a/application/basilisk/app/profile/firefox.js
+++ b/application/basilisk/app/profile/firefox.js
@@ -178,6 +178,20 @@ pref("browser.eme.ui.enabled", true);
 pref("browser.eme.ui.enabled", false);
 #endif
 
+// UI tour experience.
+pref("browser.uitour.enabled", true);
+pref("browser.uitour.loglevel", "Error");
+pref("browser.uitour.requireSecure", true);
+pref("browser.uitour.themeOrigin", "https://addons.mozilla.org/%LOCALE%/firefox/themes/");
+pref("browser.uitour.url", "https://www.mozilla.org/%LOCALE%/firefox/%VERSION%/tour/");
+// This is used as a regexp match against the page's URL.
+pref("browser.uitour.readerViewTrigger", "^https:\\/\\/www\\.mozilla\\.org\\/[^\\/]+\\/firefox\\/reading\\/start");
+// How long to show a Hearbeat survey (two hours, in seconds)
+pref("browser.uitour.surveyDuration", 7200);
+
+pref("browser.customizemode.tip0.shown", false);
+pref("browser.customizemode.tip0.learnMoreUrl", "https://support.mozilla.org/1/firefox/%VERSION%/%OS%/%LOCALE%/customize");
+
 pref("keyword.enabled", true);
 pref("browser.fixup.domainwhitelist.localhost", true);
 
@@ -1287,6 +1301,8 @@ pref("privacy.trackingprotection.ui.enabled", true);
 #else
 pref("privacy.trackingprotection.ui.enabled", false);
 #endif
+pref("privacy.trackingprotection.introCount", 0);
+pref("privacy.trackingprotection.introURL", "https://www.mozilla.org/%LOCALE%/firefox/%VERSION%/tracking-protection/start/");
 
 // Enable Contextual Identity Containers
 #ifdef NIGHTLY_BUILD
diff --git a/application/basilisk/base/content/baseMenuOverlay.xul b/application/basilisk/base/content/baseMenuOverlay.xul
index dce35e92d..fb763fb44 100644
--- a/application/basilisk/base/content/baseMenuOverlay.xul
+++ b/application/basilisk/base/content/baseMenuOverlay.xul
@@ -52,6 +52,10 @@
 #else
                   />
 #endif
+        <menuitem id="menu_openTour"
+                  oncommand="openTourPage();"
+                  label="&helpShowTour2.label;"
+                  accesskey="&helpShowTour2.accesskey;"/>
         <menuitem id="menu_keyboardShortcuts"
                   oncommand="openHelpLink('keyboard-shortcuts')"
                   onclick="checkForMiddleClick(this, event);"
diff --git a/application/basilisk/base/content/browser-media.js b/application/basilisk/base/content/browser-media.js
index bd5c5b227..d500d166f 100644
--- a/application/basilisk/base/content/browser-media.js
+++ b/application/basilisk/base/content/browser-media.js
@@ -203,16 +203,29 @@ let gDecoderDoctorHandler = {
   getLabelForNotificationBox(type) {
     if (type == "adobe-cdm-not-found" &&
         AppConstants.platform == "win") {
+      if (AppConstants.isPlatformAndVersionAtMost("win", "5.9")) {
+        // We supply our own Learn More button so we don't need to populate the message here.
+        return gNavigatorBundle.getFormattedString("emeNotifications.drmContentDisabled.message", [""]);
+      }
       return gNavigatorBundle.getString("decoder.noCodecs.message");
     }
     if (type == "adobe-cdm-not-activated" &&
         AppConstants.platform == "win") {
+      if (AppConstants.isPlatformAndVersionAtMost("win", "5.9")) {
+        return gNavigatorBundle.getString("decoder.noCodecsXP.message");
+      }
+      if (!AppConstants.isPlatformAndVersionAtLeast("win", "6.1")) {
+        return gNavigatorBundle.getString("decoder.noCodecsVista.message");
+      }
       return gNavigatorBundle.getString("decoder.noCodecs.message");
     }
     if (type == "platform-decoder-not-found") {
-      if (AppConstants.platform == "win") {
+      if (AppConstants.isPlatformAndVersionAtLeast("win", "6.1")) {
         return gNavigatorBundle.getString("decoder.noHWAcceleration.message");
       }
+      if (AppConstants.isPlatformAndVersionAtLeast("win", "6")) {
+        return gNavigatorBundle.getString("decoder.noHWAccelerationVista.message");
+      }
       if (AppConstants.platform == "linux") {
         return gNavigatorBundle.getString("decoder.noCodecsLinux.message");
       }
diff --git a/application/basilisk/base/content/browser-trackingprotection.js b/application/basilisk/base/content/browser-trackingprotection.js
index 20917a083..cacb0522c 100644
--- a/application/basilisk/base/content/browser-trackingprotection.js
+++ b/application/basilisk/base/content/browser-trackingprotection.js
@@ -4,6 +4,7 @@
 
 var TrackingProtection = {
   // If the user ignores the doorhanger, we stop showing it after some time.
+  MAX_INTROS: 20,
   PREF_ENABLED_GLOBALLY: "privacy.trackingprotection.enabled",
   PREF_ENABLED_IN_PRIVATE_WINDOWS: "privacy.trackingprotection.pbmode.enabled",
   enabledGlobally: false,
@@ -105,6 +106,16 @@ var TrackingProtection = {
       this.icon.setAttribute("state", "blocked-tracking-content");
       this.content.setAttribute("state", "blocked-tracking-content");
 
+      // Open the tracking protection introduction panel, if applicable.
+      if (this.enabledGlobally) {
+        let introCount = gPrefService.getIntPref("privacy.trackingprotection.introCount");
+        if (introCount < TrackingProtection.MAX_INTROS) {
+          gPrefService.setIntPref("privacy.trackingprotection.introCount", ++introCount);
+          gPrefService.savePrefFile(null);
+          this.showIntroPanel();
+        }
+      }
+
       this.shieldHistogramAdd(2);
     } else if (isAllowing) {
       this.icon.setAttribute("tooltiptext", this.disabledTooltipText);
@@ -174,4 +185,55 @@ var TrackingProtection = {
 
     BrowserReload();
   },
+
+  dontShowIntroPanelAgain() {
+    // This function may be called in private windows, but it does not change
+    // any preference unless Tracking Protection is enabled globally.
+    if (this.enabledGlobally) {
+      gPrefService.setIntPref("privacy.trackingprotection.introCount",
+                              this.MAX_INTROS);
+      gPrefService.savePrefFile(null);
+    }
+  },
+
+  showIntroPanel: Task.async(function*() {
+    let brandBundle = document.getElementById("bundle_brand");
+    let brandShortName = brandBundle.getString("brandShortName");
+
+    let openStep2 = () => {
+      // When the user proceeds in the tour, adjust the counter to indicate that
+      // the user doesn't need to see the intro anymore.
+      this.dontShowIntroPanelAgain();
+
+      let nextURL = Services.urlFormatter.formatURLPref("privacy.trackingprotection.introURL") +
+                    "?step=2&newtab=true";
+      switchToTabHavingURI(nextURL, true, {
+        // Ignore the fragment in case the intro is shown on the tour page
+        // (e.g. if the user manually visited the tour or clicked the link from
+        // about:privatebrowsing) so we can avoid a reload.
+        ignoreFragment: "whenComparingAndReplace",
+      });
+    };
+
+    let buttons = [
+      {
+        label: gNavigatorBundle.getString("trackingProtection.intro.step1of3"),
+        style: "text",
+      },
+      {
+        callback: openStep2,
+        label: gNavigatorBundle.getString("trackingProtection.intro.nextButton.label"),
+        style: "primary",
+      },
+    ];
+
+    let panelTarget = yield UITour.getTarget(window, "trackingProtection");
+    UITour.initForBrowser(gBrowser.selectedBrowser, window);
+    UITour.showInfo(window, panelTarget,
+                    gNavigatorBundle.getString("trackingProtection.intro.title"),
+                    gNavigatorBundle.getFormattedString("trackingProtection.intro.description2",
+                                                        [brandShortName]),
+                    undefined, buttons,
+                    { closeButtonCallback: () => this.dontShowIntroPanelAgain() });
+  }),
 };
diff --git a/application/basilisk/base/content/browser.css b/application/basilisk/base/content/browser.css
index e951985dc..ac5bf9e9b 100644
--- a/application/basilisk/base/content/browser.css
+++ b/application/basilisk/base/content/browser.css
@@ -1152,6 +1152,71 @@ toolbarpaletteitem[place="palette"][hidden] {
   display: none;
 }
 
+/* UI Tour */
+
+@keyframes uitour-wobble {
+  from {
+    transform: rotate(0deg) translateX(3px) rotate(0deg);
+  }
+  50% {
+    transform: rotate(360deg) translateX(3px) rotate(-360deg);
+  }
+  to {
+    transform: rotate(720deg) translateX(0px) rotate(-720deg);
+  }
+}
+
+@keyframes uitour-zoom {
+  from {
+    transform: scale(0.8);
+  }
+  50% {
+    transform: scale(1.0);
+  }
+  to {
+    transform: scale(0.8);
+  }
+}
+
+@keyframes uitour-color {
+  from {
+    border-color: #5B9CD9;
+  }
+  50% {
+    border-color: #FF0000;
+  }
+  to {
+    border-color: #5B9CD9;
+  }
+}
+
+#UITourHighlightContainer,
+#UITourHighlight {
+  pointer-events: none;
+}
+
+#UITourHighlight[active] {
+  animation-delay: 2s;
+  animation-fill-mode: forwards;
+  animation-iteration-count: infinite;
+  animation-timing-function: linear;
+}
+
+#UITourHighlight[active="wobble"] {
+  animation-name: uitour-wobble;
+  animation-delay: 0s;
+  animation-duration: 1.5s;
+  animation-iteration-count: 1;
+}
+#UITourHighlight[active="zoom"] {
+  animation-name: uitour-zoom;
+  animation-duration: 1s;
+}
+#UITourHighlight[active="color"] {
+  animation-name: uitour-color;
+  animation-duration: 2s;
+}
+
 /* Combined context-menu items */
 #context-navigation > .menuitem-iconic > .menu-iconic-text,
 #context-navigation > .menuitem-iconic > .menu-accel-container {
diff --git a/application/basilisk/base/content/browser.js b/application/basilisk/base/content/browser.js
index 64c0d86f5..223895199 100644
--- a/application/basilisk/base/content/browser.js
+++ b/application/basilisk/base/content/browser.js
@@ -48,6 +48,7 @@ Cu.import("resource://gre/modules/NotificationDB.jsm");
   ["Task", "resource://gre/modules/Task.jsm"],
   ["TelemetryStopwatch", "resource://gre/modules/TelemetryStopwatch.jsm"],
   ["Translation", "resource:///modules/translation/Translation.jsm"],
+  ["UITour", "resource:///modules/UITour.jsm"],
   ["UpdateUtils", "resource://gre/modules/UpdateUtils.jsm"],
   ["Weave", "resource://services-sync/main.js"],
   ["fxAccounts", "resource://gre/modules/FxAccounts.jsm"],
@@ -91,6 +92,11 @@ XPCOMUtils.defineLazyGetter(this, "gCustomizeMode", function() {
   return new scope.CustomizeMode(window);
 });
 
+XPCOMUtils.defineLazyGetter(window, "gShowPageResizers", function () {
+  // Only show resizers on Windows 2000 and XP
+  return AppConstants.isPlatformAndVersionAtMost("win", "5.9");
+});
+
 XPCOMUtils.defineLazyGetter(this, "gPrefService", function() {
   return Services.prefs;
 });
@@ -983,6 +989,7 @@ var gBrowserInit = {
     let mm = window.getGroupMessageManager("browsers");
     mm.loadFrameScript("chrome://browser/content/tab-content.js", true);
     mm.loadFrameScript("chrome://browser/content/content.js", true);
+    mm.loadFrameScript("chrome://browser/content/content-UITour.js", true);
     mm.loadFrameScript("chrome://global/content/manifestMessages.js", true);
 
     // initialize observers and listeners
@@ -3320,6 +3327,8 @@ var PrintPreviewListener = {
     this._chromeState.notificationsOpen = !notificationBox.notificationsHidden;
     notificationBox.notificationsHidden = true;
 
+    gBrowser.updateWindowResizers();
+
     this._chromeState.findOpen = gFindBarInitialized && !gFindBar.hidden;
     if (gFindBarInitialized)
       gFindBar.close();
@@ -4472,6 +4481,7 @@ var XULBrowserWindow = {
 
       gIdentityHandler.onLocationChange();
 
+      UITour.onLocationChange(location);
 
       gTabletModePageCounter.inc();
 
@@ -5145,6 +5155,7 @@ function setToolbarVisibility(toolbar, isVisible, persist=true) {
 
   PlacesToolbarHelper.init();
   BookmarkingUI.onToolbarVisibilityChange();
+  gBrowser.updateWindowResizers();
   if (isVisible)
     ToolbarIconColor.inferFromText();
 }
@@ -8082,6 +8093,11 @@ var AboutPrivateBrowsingListener = {
         const PREF = "privacy.trackingprotection.pbmode.enabled";
         Services.prefs.setBoolPref(PREF, !Services.prefs.getBoolPref(PREF));
     });
+    window.messageManager.addMessageListener(
+      "AboutPrivateBrowsing:DontShowIntroPanelAgain",
+      msg => {
+        TrackingProtection.dontShowIntroPanelAgain();
+    });
   }
 };
 
diff --git a/application/basilisk/base/content/browser.xul b/application/basilisk/base/content/browser.xul
index 028df609f..be4895a24 100644
--- a/application/basilisk/base/content/browser.xul
+++ b/application/basilisk/base/content/browser.xul
@@ -232,6 +232,42 @@
       </hbox>
     </panel>
 
+    <!-- UI tour experience -->
+    <panel id="UITourTooltip"
+           type="arrow"
+           hidden="true"
+           noautofocus="true"
+           noautohide="true"
+           align="start"
+           orient="vertical"
+           role="alert">
+     <vbox>
+      <hbox id="UITourTooltipBody">
+        <image id="UITourTooltipIcon"/>
+        <vbox flex="1">
+          <hbox id="UITourTooltipTitleContainer">
+            <label id="UITourTooltipTitle" flex="1"/>
+            <toolbarbutton id="UITourTooltipClose" class="close-icon"
+                           tooltiptext="&uiTour.infoPanel.close;"/>
+          </hbox>
+          <description id="UITourTooltipDescription" flex="1"/>
+        </vbox>
+      </hbox>
+      <hbox id="UITourTooltipButtons" flex="1" align="center"/>
+     </vbox>
+    </panel>
+    <!-- type="default" forces frames to be created so that the panel's size can be determined -->
+    <panel id="UITourHighlightContainer"
+           type="default"
+           hidden="true"
+           noautofocus="true"
+           noautohide="true"
+           flip="none"
+           consumeoutsideclicks="false"
+           mousethrough="always">
+      <box id="UITourHighlight"></box>
+    </panel>
+
     <menupopup id="toolbar-context-menu"
                onpopupshowing="onViewToolbarsPopupShowing(event, document.getElementById('viewToolbarsMenuSeparator'));">
       <menuitem oncommand="gCustomizeMode.addToPanel(document.popupNode)"
@@ -484,7 +520,9 @@
 #ifdef MENUBAR_CAN_AUTOHIDE
              toolbarname="&menubarCmd.label;"
              accesskey="&menubarCmd.accesskey;"
+#if defined(MOZ_WIDGET_GTK)
              autohide="true"
+#endif
 #endif
              context="toolbar-context-menu">
       <toolbaritem id="menubar-items" align="center">
diff --git a/application/basilisk/base/content/tab-content.js b/application/basilisk/base/content/tab-content.js
index 11a9fabce..a57dc6607 100644
--- a/application/basilisk/base/content/tab-content.js
+++ b/application/basilisk/base/content/tab-content.js
@@ -226,6 +226,8 @@ var AboutPrivateBrowsingListener = {
                                   false, true);
     chromeGlobal.addEventListener("AboutPrivateBrowsingToggleTrackingProtection", this,
                                   false, true);
+    chromeGlobal.addEventListener("AboutPrivateBrowsingDontShowIntroPanelAgain", this,
+                                  false, true);
   },
 
   get isAboutPrivateBrowsing() {
@@ -243,6 +245,9 @@ var AboutPrivateBrowsingListener = {
       case "AboutPrivateBrowsingToggleTrackingProtection":
         sendAsyncMessage("AboutPrivateBrowsing:ToggleTrackingProtection");
         break;
+      case "AboutPrivateBrowsingDontShowIntroPanelAgain":
+        sendAsyncMessage("AboutPrivateBrowsing:DontShowIntroPanelAgain");
+        break;
     }
   },
 };
diff --git a/application/basilisk/base/content/tabbrowser.xml b/application/basilisk/base/content/tabbrowser.xml
index 463e74a52..400df40d9 100644
--- a/application/basilisk/base/content/tabbrowser.xml
+++ b/application/basilisk/base/content/tabbrowser.xml
@@ -214,6 +214,18 @@
         ]]></body>
       </method>
 
+      <method name="updateWindowResizers">
+        <body><![CDATA[
+          if (!window.gShowPageResizers)
+            return;
+
+          var show = window.windowState == window.STATE_NORMAL;
+          for (let i = 0; i < this.browsers.length; i++) {
+            this.browsers[i].showWindowResizer = show;
+          }
+        ]]></body>
+      </method>
+
       <method name="_setCloseKeyState">
         <parameter name="aEnabled"/>
         <body><![CDATA[
@@ -1961,6 +1973,10 @@
               b.QueryInterface(Ci.nsIFrameLoaderOwner).presetOpenerWindow(aParams.opener);
             }
 
+            if (window.gShowPageResizers && window.windowState == window.STATE_NORMAL) {
+              b.setAttribute("showresizer", "true");
+            }
+
             if (!aParams.isPreloadBrowser && this.hasAttribute("autocompletepopup")) {
               b.setAttribute("autocompletepopup", this.getAttribute("autocompletepopup"));
             }
@@ -4810,6 +4826,7 @@
           this.appendChild(this._autoScrollPopup);
           this.mCurrentBrowser.setAttribute("autoscrollpopup", this._autoScrollPopup.id);
           this.mCurrentBrowser.droppedLinkHandler = handleDroppedLink;
+          this.updateWindowResizers();
 
           // Hook up the event listeners to the first browser
           var tabListener = this.mTabProgressListener(this.mCurrentTab, this.mCurrentBrowser, true, false);
@@ -5828,6 +5845,8 @@
                 this._handleTabSelect();
                 this.mTabstripWidth = width;
               }
+
+              this.tabbrowser.updateWindowResizers();
               break;
             case "mouseout":
               // If the "related target" (the node to which the pointer went) is not
diff --git a/application/basilisk/base/content/utilityOverlay.js b/application/basilisk/base/content/utilityOverlay.js
index 38ca82f55..4ea6d8f90 100644
--- a/application/basilisk/base/content/utilityOverlay.js
+++ b/application/basilisk/base/content/utilityOverlay.js
@@ -809,6 +809,13 @@ function openFeedbackPage()
   openUILinkIn(url, "tab");
 }
 
+function openTourPage()
+{
+  let scope = {}
+  Components.utils.import("resource:///modules/UITour.jsm", scope);
+  openUILinkIn(scope.UITour.url, "tab");
+}
+
 function buildHelpMenu()
 {
   // Enable/disable the "Report Web Forgery" menu item.
diff --git a/application/basilisk/base/content/win6BrowserOverlay.xul b/application/basilisk/base/content/win6BrowserOverlay.xul
new file mode 100644
index 000000000..a69e3f6bd
--- /dev/null
+++ b/application/basilisk/base/content/win6BrowserOverlay.xul
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+
+<!-- -*- Mode: HTML -*- -->
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<overlay id="win6-browser-overlay"
+         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+  <toolbar id="toolbar-menubar"
+           autohide="true"/>
+</overlay>
diff --git a/application/basilisk/base/jar.mn b/application/basilisk/base/jar.mn
index 5ec92d79a..267425ea2 100644
--- a/application/basilisk/base/jar.mn
+++ b/application/basilisk/base/jar.mn
@@ -8,6 +8,9 @@ browser.jar:
 %  overlay chrome://mozapps/content/update/updates.xul chrome://browser/content/softwareUpdateOverlay.xul
 %  overlay chrome://global/content/console.xul chrome://browser/content/jsConsoleOverlay.xul
 #endif
+#ifdef XP_WIN
+%  overlay chrome://browser/content/browser.xul chrome://browser/content/win6BrowserOverlay.xul os=WINNT osversion>=6
+#endif
 %  overlay chrome://global/content/viewSource.xul chrome://browser/content/viewSourceOverlay.xul
 %  overlay chrome://global/content/viewPartialSource.xul chrome://browser/content/viewSourceOverlay.xul
 
@@ -181,6 +184,9 @@ browser.jar:
 *       content/browser/webrtcIndicator.xul           (content/webrtcIndicator.xul)
         content/browser/webrtcIndicator.js            (content/webrtcIndicator.js)
 #endif
+#ifdef XP_WIN
+        content/browser/win6BrowserOverlay.xul        (content/win6BrowserOverlay.xul)
+#endif
 # the following files are browser-specific overrides
 *       content/browser/license.html                  (/toolkit/content/license.html)
 % override chrome://global/content/license.html chrome://browser/content/license.html
diff --git a/application/basilisk/components/customizableui/CustomizableUI.jsm b/application/basilisk/components/customizableui/CustomizableUI.jsm
index cb0f519b2..3e92b4225 100644
--- a/application/basilisk/components/customizableui/CustomizableUI.jsm
+++ b/application/basilisk/components/customizableui/CustomizableUI.jsm
@@ -253,14 +253,24 @@ var CustomizableUIInternal = {
       defaultCollapsed: false,
     }, true);
 
-    if (AppConstants.MENUBAR_CAN_AUTOHIDE) {
+    if (AppConstants.platform != "macosx") {
       this.registerArea(CustomizableUI.AREA_MENUBAR, {
         legacy: true,
         type: CustomizableUI.TYPE_TOOLBAR,
         defaultPlacements: [
           "menubar-items",
         ],
-        defaultCollapsed: true,
+        get defaultCollapsed() {
+          if (AppConstants.MENUBAR_CAN_AUTOHIDE) {
+            if (AppConstants.platform == "linux") {
+              return true;
+            }
+            // This is duplicated logic from /browser/base/jar.mn
+            // for win6BrowserOverlay.xul.
+            return AppConstants.isPlatformAndVersionAtLeast("win", 6);
+          }
+          return false;
+        }
       }, true);
     }
 
diff --git a/application/basilisk/components/customizableui/CustomizeMode.jsm b/application/basilisk/components/customizableui/CustomizeMode.jsm
index e63e25b0a..49868cdbd 100644
--- a/application/basilisk/components/customizableui/CustomizeMode.jsm
+++ b/application/basilisk/components/customizableui/CustomizeMode.jsm
@@ -90,6 +90,7 @@ function CustomizeMode(aWindow) {
   // to the user when in customizing mode.
   this.visiblePalette = this.document.getElementById(kPaletteId);
   this.paletteEmptyNotice = this.document.getElementById("customization-empty");
+  this.tipPanel = this.document.getElementById("customization-tipPanel");
   if (Services.prefs.getCharPref("general.skins.selectedSkin") != "classic/1.0") {
     let lwthemeButton = this.document.getElementById("customization-lwtheme-button");
     lwthemeButton.setAttribute("hidden", "true");
@@ -354,6 +355,7 @@ CustomizeMode.prototype = {
       this._updateEmptyPaletteNotice();
 
       this._updateLWThemeButtonIcon();
+      this.maybeShowTip(panelHolder);
 
       this._handler.isEnteringCustomizeMode = false;
       panelContents.removeAttribute("customize-transitioning");
@@ -398,6 +400,8 @@ CustomizeMode.prototype = {
       return;
     }
 
+    this.hideTip();
+
     this._handler.isExitingCustomizeMode = true;
 
     if (this._enableOutlinesTimeout) {
@@ -671,6 +675,46 @@ CustomizeMode.prototype = {
     return "url(\"" + aData.headerURL.replace(/"/g, '\\"') + "\")";
   },
 
+  maybeShowTip: function(aAnchor) {
+    let shown = false;
+    const kShownPref = "browser.customizemode.tip0.shown";
+    try {
+      shown = Services.prefs.getBoolPref(kShownPref);
+    } catch (ex) {}
+    if (shown)
+      return;
+
+    let anchorNode = aAnchor || this.document.getElementById("customization-panelHolder");
+    let messageNode = this.tipPanel.querySelector(".customization-tipPanel-contentMessage");
+    if (!messageNode.childElementCount) {
+      // Put the tip contents in the popup.
+      let bundle = this.document.getElementById("bundle_browser");
+      const kLabelClass = "customization-tipPanel-link";
+      messageNode.innerHTML = bundle.getFormattedString("customizeTips.tip0", [
+        "<label class=\"customization-tipPanel-em\" value=\"" +
+          bundle.getString("customizeTips.tip0.hint") + "\"/>",
+        this.document.getElementById("bundle_brand").getString("brandShortName"),
+        "<label class=\"" + kLabelClass + " text-link\" value=\"" +
+        bundle.getString("customizeTips.tip0.learnMore") + "\"/>"
+      ]);
+
+      messageNode.querySelector("." + kLabelClass).addEventListener("click", () => {
+        let url = Services.urlFormatter.formatURLPref("browser.customizemode.tip0.learnMoreUrl");
+        let browser = this.browser;
+        browser.selectedTab = browser.addTab(url);
+        this.hideTip();
+      });
+    }
+
+    this.tipPanel.hidden = false;
+    this.tipPanel.openPopup(anchorNode);
+    Services.prefs.setBoolPref(kShownPref, true);
+  },
+
+  hideTip: function() {
+    this.tipPanel.hidePopup();
+  },
+
   _getCustomizableChildForNode: function(aNode) {
     // NB: adjusted from _getCustomizableParent to keep that method fast
     // (it's used during drags), and avoid multiple DOM loops
diff --git a/application/basilisk/components/customizableui/content/panelUI.inc.xul b/application/basilisk/components/customizableui/content/panelUI.inc.xul
index e389b14bf..077d9c014 100644
--- a/application/basilisk/components/customizableui/content/panelUI.inc.xul
+++ b/application/basilisk/components/customizableui/content/panelUI.inc.xul
@@ -367,6 +367,25 @@
   </vbox>
 </panel>
 
+<panel id="customization-tipPanel"
+       type="arrow"
+       flip="none"
+       side="left"
+       position="leftcenter topright"
+       noautohide="true"
+       hidden="true">
+  <hbox class="customization-tipPanel-wrapper">
+    <vbox class="customization-tipPanel-infoBox"/>
+    <vbox class="customization-tipPanel-content" flex="1">
+      <description class="customization-tipPanel-contentMessage"/>
+      <image class="customization-tipPanel-contentImage"/>
+    </vbox>
+    <vbox pack="start" align="end" class="customization-tipPanel-closeBox">
+      <toolbarbutton oncommand="gCustomizeMode.hideTip()" class="close-icon"/>
+    </vbox>
+  </hbox>
+</panel>
+
 <panel id="panic-button-success-notification"
        type="arrow"
        position="bottomcenter topright"
diff --git a/application/basilisk/components/moz.build b/application/basilisk/components/moz.build
index 07e79bc36..a49580200 100644
--- a/application/basilisk/components/moz.build
+++ b/application/basilisk/components/moz.build
@@ -21,6 +21,7 @@ DIRS += [
     'shell',
     'selfsupport',
     'syncedtabs',
+    'uitour',
     'translation',
 ]
 
diff --git a/application/basilisk/components/nsBrowserGlue.js b/application/basilisk/components/nsBrowserGlue.js
index ae00e30cf..448bb910d 100644
--- a/application/basilisk/components/nsBrowserGlue.js
+++ b/application/basilisk/components/nsBrowserGlue.js
@@ -56,11 +56,13 @@ XPCOMUtils.defineLazyServiceGetter(this, "AlertsService", "@mozilla.org/alerts-s
   ["ReaderParent", "resource:///modules/ReaderParent.jsm"],
   ["RecentWindow", "resource:///modules/RecentWindow.jsm"],
   ["RemotePrompt", "resource:///modules/RemotePrompt.jsm"],
+  ["SelfSupportBackend", "resource:///modules/SelfSupportBackend.jsm"],
   ["SessionStore", "resource:///modules/sessionstore/SessionStore.jsm"],
   ["ShellService", "resource:///modules/ShellService.jsm"],
   ["SimpleServiceDiscovery", "resource://gre/modules/SimpleServiceDiscovery.jsm"],
   ["TabCrashHandler", "resource:///modules/ContentCrashHandlers.jsm"],
   ["Task", "resource://gre/modules/Task.jsm"],
+  ["UITour", "resource:///modules/UITour.jsm"],
   ["URLBarZoom", "resource:///modules/URLBarZoom.jsm"],
   ["UserAgentOverrides", "resource://gre/modules/UserAgentOverrides.jsm"],
   ["WebChannel", "resource://gre/modules/WebChannel.jsm"],
@@ -680,6 +682,8 @@ BrowserGlue.prototype = {
     ReaderParent.init();
     URLBarZoom.init();
 
+    SelfSupportBackend.init();
+
     // Ensure we keep track of places/pw-mananager undo by init'ing this early.
     Cu.import("resource:///modules/AutoMigrate.jsm");
 
@@ -1027,6 +1031,7 @@ BrowserGlue.prototype = {
     }
 
     BrowserUsageTelemetry.uninit();
+    SelfSupportBackend.uninit();
     UserAgentOverrides.uninit();
     PageThumbs.uninit();
     NewTabMessages.uninit();
@@ -2842,3 +2847,12 @@ var E10SAccessibilityCheck = {
 
 var components = [BrowserGlue, ContentPermissionPrompt];
 this.NSGetFactory = XPCOMUtils.generateNSGetFactory(components);
+
+
+// Listen for UITour messages.
+// Do it here instead of the UITour module itself so that the UITour module is lazy loaded
+// when the first message is received.
+var globalMM = Cc["@mozilla.org/globalmessagemanager;1"].getService(Ci.nsIMessageListenerManager);
+globalMM.addMessageListener("UITour:onPageEvent", function(aMessage) {
+  UITour.onPageEvent(aMessage, aMessage.data);
+});
diff --git a/application/basilisk/components/privatebrowsing/content/aboutPrivateBrowsing.js b/application/basilisk/components/privatebrowsing/content/aboutPrivateBrowsing.js
index 4434f7b6a..31ce96347 100644
--- a/application/basilisk/components/privatebrowsing/content/aboutPrivateBrowsing.js
+++ b/application/basilisk/components/privatebrowsing/content/aboutPrivateBrowsing.js
@@ -63,9 +63,13 @@ document.addEventListener("DOMContentLoaded", function () {
  document.getElementById("favicon")
          .setAttribute("href", FAVICON_PRIVACY);
  tpToggle.addEventListener("change", toggleTrackingProtection);
+ document.getElementById("startTour")
+         .addEventListener("click", dontShowIntroPanelAgain);
 
  let formatURLPref = Cc["@mozilla.org/toolkit/URLFormatterService;1"]
                        .getService(Ci.nsIURLFormatter).formatURLPref;
+ document.getElementById("startTour").setAttribute("href",
+                    formatURLPref("privacy.trackingprotection.introURL"));
  document.getElementById("learnMore").setAttribute("href",
                     formatURLPref("app.support.baseURL") + "private-browsing");
 
@@ -85,3 +89,10 @@ function toggleTrackingProtection() {
    new CustomEvent("AboutPrivateBrowsingToggleTrackingProtection",
                    {bubbles: true}));
 }
+
+function dontShowIntroPanelAgain() {
+ // Ask chrome to disable the doorhanger
+ document.dispatchEvent(
+   new CustomEvent("AboutPrivateBrowsingDontShowIntroPanelAgain",
+                   {bubbles: true}));
+}
diff --git a/application/basilisk/components/privatebrowsing/content/aboutPrivateBrowsing.xhtml b/application/basilisk/components/privatebrowsing/content/aboutPrivateBrowsing.xhtml
index 36058efa5..fb5c4ac8e 100644
--- a/application/basilisk/components/privatebrowsing/content/aboutPrivateBrowsing.xhtml
+++ b/application/basilisk/components/privatebrowsing/content/aboutPrivateBrowsing.xhtml
@@ -69,6 +69,9 @@
 
       <section class="section-main">
         <p>&trackingProtection.description2;</p>
+        <p>
+          <a id="startTour" class="button">&trackingProtection.startTour1;</a>
+        </p>
       </section>
 
       <section class="section-main">
diff --git a/application/basilisk/components/shell/nsWindowsShellService.cpp b/application/basilisk/components/shell/nsWindowsShellService.cpp
index 879b0c7f0..cb13c0910 100644
--- a/application/basilisk/components/shell/nsWindowsShellService.cpp
+++ b/application/basilisk/components/shell/nsWindowsShellService.cpp
@@ -648,6 +648,11 @@ nsWindowsShellService::LaunchControlPanelDefaultsSelectionUI()
 nsresult
 nsWindowsShellService::LaunchControlPanelDefaultPrograms()
 {
+  // This Default Programs feature is Win7+ only.
+  if (!IsWin7OrLater()) {
+    return NS_ERROR_FAILURE;
+  }
+
   // Build the path control.exe path safely
   WCHAR controlEXEPath[MAX_PATH + 1] = { '\0' };
   if (!GetSystemDirectoryW(controlEXEPath, MAX_PATH)) {
diff --git a/application/basilisk/components/uitour/UITour-lib.js b/application/basilisk/components/uitour/UITour-lib.js
new file mode 100644
index 000000000..7fe820185
--- /dev/null
+++ b/application/basilisk/components/uitour/UITour-lib.js
@@ -0,0 +1,331 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// create namespace
+if (typeof Mozilla == 'undefined') {
+  var Mozilla = {};
+}
+
+(function($) {
+  'use strict';
+
+  // create namespace
+  if (typeof Mozilla.UITour == 'undefined') {
+    Mozilla.UITour = {};
+  }
+
+  var themeIntervalId = null;
+  function _stopCyclingThemes() {
+    if (themeIntervalId) {
+      clearInterval(themeIntervalId);
+      themeIntervalId = null;
+    }
+  }
+
+  function _sendEvent(action, data) {
+    var event = new CustomEvent('mozUITour', {
+      bubbles: true,
+      detail: {
+	action: action,
+	data: data || {}
+      }
+    });
+
+    document.dispatchEvent(event);
+  }
+
+  function _generateCallbackID() {
+    return Math.random().toString(36).replace(/[^a-z]+/g, '');
+  }
+
+  function _waitForCallback(callback) {
+    var id = _generateCallbackID();
+
+    function listener(event) {
+      if (typeof event.detail != 'object')
+	return;
+      if (event.detail.callbackID != id)
+	return;
+
+      document.removeEventListener('mozUITourResponse', listener);
+      callback(event.detail.data);
+    }
+    document.addEventListener('mozUITourResponse', listener);
+
+    return id;
+  }
+
+  var notificationListener = null;
+  function _notificationListener(event) {
+    if (typeof event.detail != 'object')
+      return;
+    if (typeof notificationListener != 'function')
+      return;
+
+    notificationListener(event.detail.event, event.detail.params);
+  }
+
+  Mozilla.UITour.DEFAULT_THEME_CYCLE_DELAY = 10 * 1000;
+
+  Mozilla.UITour.CONFIGNAME_SYNC = 'sync';
+  Mozilla.UITour.CONFIGNAME_AVAILABLETARGETS = 'availableTargets';
+
+  Mozilla.UITour.ping = function(callback) {
+    var data = {};
+    if (callback) {
+      data.callbackID = _waitForCallback(callback);
+    }
+    _sendEvent('ping', data);
+  };
+
+  Mozilla.UITour.observe = function(listener, callback) {
+    notificationListener = listener;
+
+    if (listener) {
+      document.addEventListener('mozUITourNotification',
+                                _notificationListener);
+      Mozilla.UITour.ping(callback);
+    } else {
+      document.removeEventListener('mozUITourNotification',
+                                   _notificationListener);
+    }
+  };
+
+  Mozilla.UITour.registerPageID = function(pageID) {
+    _sendEvent('registerPageID', {
+      pageID: pageID
+    });
+  };
+
+  Mozilla.UITour.showHeartbeat = function(message, thankyouMessage, flowId, engagementURL,
+					  learnMoreLabel, learnMoreURL, options) {
+    var args = {
+      message: message,
+      thankyouMessage: thankyouMessage,
+      flowId: flowId,
+      engagementURL: engagementURL,
+      learnMoreLabel: learnMoreLabel,
+      learnMoreURL: learnMoreURL,
+    };
+
+    if (options) {
+      for (var option in options) {
+	if (!options.hasOwnProperty(option)) {
+	  continue;
+	}
+	args[option] = options[option];
+      }
+    }
+
+    _sendEvent('showHeartbeat', args);
+  };
+
+  Mozilla.UITour.showHighlight = function(target, effect) {
+    _sendEvent('showHighlight', {
+      target: target,
+      effect: effect
+    });
+  };
+
+  Mozilla.UITour.hideHighlight = function() {
+    _sendEvent('hideHighlight');
+  };
+
+  Mozilla.UITour.showInfo = function(target, title, text, icon, buttons, options) {
+    var buttonData = [];
+    if (Array.isArray(buttons)) {
+      for (var i = 0; i < buttons.length; i++) {
+	buttonData.push({
+	  label: buttons[i].label,
+	  icon: buttons[i].icon,
+	  style: buttons[i].style,
+	  callbackID: _waitForCallback(buttons[i].callback)
+	});
+      }
+    }
+
+    var closeButtonCallbackID, targetCallbackID;
+    if (options && options.closeButtonCallback)
+      closeButtonCallbackID = _waitForCallback(options.closeButtonCallback);
+    if (options && options.targetCallback)
+      targetCallbackID = _waitForCallback(options.targetCallback);
+
+    _sendEvent('showInfo', {
+      target: target,
+      title: title,
+      text: text,
+      icon: icon,
+      buttons: buttonData,
+      closeButtonCallbackID: closeButtonCallbackID,
+      targetCallbackID: targetCallbackID
+    });
+  };
+
+  Mozilla.UITour.hideInfo = function() {
+    _sendEvent('hideInfo');
+  };
+
+  Mozilla.UITour.previewTheme = function(theme) {
+    _stopCyclingThemes();
+
+    _sendEvent('previewTheme', {
+      theme: JSON.stringify(theme)
+    });
+  };
+
+  Mozilla.UITour.resetTheme = function() {
+    _stopCyclingThemes();
+
+    _sendEvent('resetTheme');
+  };
+
+  Mozilla.UITour.cycleThemes = function(themes, delay, callback) {
+    _stopCyclingThemes();
+
+    if (!delay) {
+      delay = Mozilla.UITour.DEFAULT_THEME_CYCLE_DELAY;
+    }
+
+    function nextTheme() {
+      var theme = themes.shift();
+      themes.push(theme);
+
+      _sendEvent('previewTheme', {
+	theme: JSON.stringify(theme),
+	state: true
+      });
+
+      callback(theme);
+    }
+
+    themeIntervalId = setInterval(nextTheme, delay);
+    nextTheme();
+  };
+
+  Mozilla.UITour.showMenu = function(name, callback) {
+    var showCallbackID;
+    if (callback)
+      showCallbackID = _waitForCallback(callback);
+
+    _sendEvent('showMenu', {
+      name: name,
+      showCallbackID: showCallbackID,
+    });
+  };
+
+  Mozilla.UITour.hideMenu = function(name) {
+    _sendEvent('hideMenu', {
+      name: name
+    });
+  };
+
+  Mozilla.UITour.showNewTab = function() {
+    _sendEvent('showNewTab');
+  };
+
+  Mozilla.UITour.getConfiguration = function(configName, callback) {
+    _sendEvent('getConfiguration', {
+      callbackID: _waitForCallback(callback),
+      configuration: configName,
+    });
+  };
+
+  Mozilla.UITour.setConfiguration = function(configName, configValue) {
+    _sendEvent('setConfiguration', {
+      configuration: configName,
+      value: configValue,
+    });
+  };
+
+  /**
+   * Request the browser open the Firefox Accounts page.
+   *
+   * @param {Object} extraURLCampaignParams - An object containing additional
+   * paramaters for the URL opened by the browser for reasons of promotional
+   * campaign tracking. Each attribute of the object must have a name that
+   * is a string, begins with "utm_" and contains only only alphanumeric
+   * characters, dashes or underscores. The values may be any string and will
+   * automatically be encoded.
+   */
+  Mozilla.UITour.showFirefoxAccounts = function(extraURLCampaignParams) {
+    _sendEvent('showFirefoxAccounts', {
+      extraURLCampaignParams: JSON.stringify(extraURLCampaignParams),
+    });
+  };
+
+  Mozilla.UITour.resetFirefox = function() {
+    _sendEvent('resetFirefox');
+  };
+
+  Mozilla.UITour.addNavBarWidget= function(name, callback) {
+    _sendEvent('addNavBarWidget', {
+      name: name,
+      callbackID: _waitForCallback(callback),
+    });
+  };
+
+  Mozilla.UITour.setDefaultSearchEngine = function(identifier) {
+    _sendEvent('setDefaultSearchEngine', {
+      identifier: identifier,
+    });
+  };
+
+  Mozilla.UITour.setTreatmentTag = function(name, value) {
+    _sendEvent('setTreatmentTag', {
+      name: name,
+      value: value
+    });
+  };
+
+  Mozilla.UITour.getTreatmentTag = function(name, callback) {
+    _sendEvent('getTreatmentTag', {
+      name: name,
+      callbackID: _waitForCallback(callback)
+    });
+  };
+
+  Mozilla.UITour.setSearchTerm = function(term) {
+    _sendEvent('setSearchTerm', {
+      term: term
+    });
+  };
+
+  Mozilla.UITour.openSearchPanel = function(callback) {
+    _sendEvent('openSearchPanel', {
+      callbackID: _waitForCallback(callback)
+    });
+  };
+
+  Mozilla.UITour.forceShowReaderIcon = function() {
+    _sendEvent('forceShowReaderIcon');
+  };
+
+  Mozilla.UITour.toggleReaderMode = function() {
+    _sendEvent('toggleReaderMode');
+  };
+
+  Mozilla.UITour.openPreferences = function(pane) {
+    _sendEvent('openPreferences', {
+      pane: pane
+    });
+  };
+
+  /**
+   * Closes the tab where this code is running. As usual, if the tab is in the
+   * foreground, the tab that was displayed before is selected.
+   *
+   * The last tab in the current window will never be closed, in which case
+   * this call will have no effect. The calling code is expected to take an
+   * action after a small timeout in order to handle this case, for example by
+   * displaying a goodbye message or a button to restart the tour.
+   */
+  Mozilla.UITour.closeTab = function() {
+    _sendEvent('closeTab');
+  };
+})();
+
+// Make this library Require-able.
+if (typeof module !== 'undefined' && module.exports) {
+  module.exports = Mozilla.UITour;
+}
diff --git a/application/basilisk/components/uitour/UITour.jsm b/application/basilisk/components/uitour/UITour.jsm
new file mode 100644
index 000000000..b92715963
--- /dev/null
+++ b/application/basilisk/components/uitour/UITour.jsm
@@ -0,0 +1,2111 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+"use strict";
+
+this.EXPORTED_SYMBOLS = ["UITour"];
+
+const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
+
+Cu.import("resource://gre/modules/AppConstants.jsm");
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+Cu.import("resource://gre/modules/Preferences.jsm");
+Cu.import("resource://gre/modules/Promise.jsm");
+Cu.import("resource:///modules/RecentWindow.jsm");
+Cu.import("resource://gre/modules/Task.jsm");
+Cu.import("resource://gre/modules/TelemetryController.jsm");
+Cu.import("resource://gre/modules/Timer.jsm");
+
+Cu.importGlobalProperties(["URL"]);
+
+XPCOMUtils.defineLazyModuleGetter(this, "LightweightThemeManager",
+  "resource://gre/modules/LightweightThemeManager.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "ResetProfile",
+  "resource://gre/modules/ResetProfile.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "CustomizableUI",
+  "resource:///modules/CustomizableUI.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "UITelemetry",
+  "resource://gre/modules/UITelemetry.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "BrowserUITelemetry",
+  "resource:///modules/BrowserUITelemetry.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "PrivateBrowsingUtils",
+  "resource://gre/modules/PrivateBrowsingUtils.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "ReaderMode",
+  "resource://gre/modules/ReaderMode.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "ReaderParent",
+  "resource:///modules/ReaderParent.jsm");
+
+// See LOG_LEVELS in Console.jsm. Common examples: "All", "Info", "Warn", & "Error".
+const PREF_LOG_LEVEL      = "browser.uitour.loglevel";
+const PREF_SEENPAGEIDS    = "browser.uitour.seenPageIDs";
+const PREF_READERVIEW_TRIGGER = "browser.uitour.readerViewTrigger";
+const PREF_SURVEY_DURATION = "browser.uitour.surveyDuration";
+
+const BACKGROUND_PAGE_ACTIONS_ALLOWED = new Set([
+  "forceShowReaderIcon",
+  "getConfiguration",
+  "getTreatmentTag",
+  "hideHighlight",
+  "hideInfo",
+  "hideMenu",
+  "ping",
+  "registerPageID",
+  "setConfiguration",
+  "setTreatmentTag",
+]);
+const MAX_BUTTONS         = 4;
+
+const BUCKET_NAME         = "UITour";
+const BUCKET_TIMESTEPS    = [
+  1 * 60 * 1000, // Until 1 minute after tab is closed/inactive.
+  3 * 60 * 1000, // Until 3 minutes after tab is closed/inactive.
+  10 * 60 * 1000, // Until 10 minutes after tab is closed/inactive.
+  60 * 60 * 1000, // Until 1 hour after tab is closed/inactive.
+];
+
+// Time after which seen Page IDs expire.
+const SEENPAGEID_EXPIRY  = 8 * 7 * 24 * 60 * 60 * 1000; // 8 weeks.
+
+// Prefix for any target matching a search engine.
+const TARGET_SEARCHENGINE_PREFIX = "searchEngine-";
+
+// Create a new instance of the ConsoleAPI so we can control the maxLogLevel with a pref.
+XPCOMUtils.defineLazyGetter(this, "log", () => {
+  let ConsoleAPI = Cu.import("resource://gre/modules/Console.jsm", {}).ConsoleAPI;
+  let consoleOptions = {
+    maxLogLevelPref: PREF_LOG_LEVEL,
+    prefix: "UITour",
+  };
+  return new ConsoleAPI(consoleOptions);
+});
+
+this.UITour = {
+  url: null,
+  seenPageIDs: null,
+  // This map is not persisted and is used for
+  // building the content source of a potential tour.
+  pageIDsForSession: new Map(),
+  pageIDSourceBrowsers: new WeakMap(),
+  /* Map from browser chrome windows to a Set of <browser>s in which a tour is open (both visible and hidden) */
+  tourBrowsersByWindow: new WeakMap(),
+  appMenuOpenForAnnotation: new Set(),
+  availableTargetsCache: new WeakMap(),
+  clearAvailableTargetsCache() {
+    this.availableTargetsCache = new WeakMap();
+  },
+
+  _annotationPanelMutationObservers: new WeakMap(),
+
+  highlightEffects: ["random", "wobble", "zoom", "color"],
+  targets: new Map([
+    ["accountStatus", {
+      query: (aDocument) => {
+        // If the user is logged in, use the avatar element.
+        let fxAFooter = aDocument.getElementById("PanelUI-footer-fxa");
+        if (fxAFooter.getAttribute("fxastatus")) {
+          return aDocument.getElementById("PanelUI-fxa-avatar");
+        }
+
+        // Otherwise use the sync setup icon.
+        let statusButton = aDocument.getElementById("PanelUI-fxa-label");
+        return aDocument.getAnonymousElementByAttribute(statusButton,
+                                                        "class",
+                                                        "toolbarbutton-icon");
+      },
+      // This is a fake widgetName starting with the "PanelUI-" prefix so we know
+      // to automatically open the appMenu when annotating this target.
+      widgetName: "PanelUI-fxa-label",
+    }],
+    ["addons",      {query: "#add-ons-button"}],
+    ["appMenu",     {
+      addTargetListener: (aDocument, aCallback) => {
+        let panelPopup = aDocument.getElementById("PanelUI-popup");
+        panelPopup.addEventListener("popupshown", aCallback);
+      },
+      query: "#PanelUI-button",
+      removeTargetListener: (aDocument, aCallback) => {
+        let panelPopup = aDocument.getElementById("PanelUI-popup");
+        panelPopup.removeEventListener("popupshown", aCallback);
+      },
+    }],
+    ["backForward", {
+      query: "#back-button",
+      widgetName: "urlbar-container",
+    }],
+    ["bookmarks",   {query: "#bookmarks-menu-button"}],
+    ["controlCenter-trackingUnblock", controlCenterTrackingToggleTarget(true)],
+    ["controlCenter-trackingBlock", controlCenterTrackingToggleTarget(false)],
+    ["customize",   {
+      query: (aDocument) => {
+        let customizeButton = aDocument.getElementById("PanelUI-customize");
+        return aDocument.getAnonymousElementByAttribute(customizeButton,
+                                                        "class",
+                                                        "toolbarbutton-icon");
+      },
+      widgetName: "PanelUI-customize",
+    }],
+    ["devtools",    {query: "#developer-button"}],
+    ["help",        {query: "#PanelUI-help"}],
+    ["home",        {query: "#home-button"}],
+    ["forget", {
+      allowAdd: true,
+      query: "#panic-button",
+      widgetName: "panic-button",
+    }],
+    ["pocket", {
+      allowAdd: true,
+      query: "#pocket-button",
+      widgetName: "pocket-button",
+    }],
+    ["privateWindow",  {query: "#privatebrowsing-button"}],
+    ["quit",        {query: "#PanelUI-quit"}],
+    ["readerMode-urlBar", {query: "#reader-mode-button"}],
+    ["search",      {
+      infoPanelOffsetX: 18,
+      infoPanelPosition: "after_start",
+      query: "#searchbar",
+      widgetName: "search-container",
+    }],
+    ["searchIcon", {
+      query: (aDocument) => {
+        let searchbar = aDocument.getElementById("searchbar");
+        return aDocument.getAnonymousElementByAttribute(searchbar,
+                                                        "anonid",
+                                                        "searchbar-search-button");
+      },
+      widgetName: "search-container",
+    }],
+    ["searchPrefsLink", {
+      query: (aDocument) => {
+        let element = null;
+        let popup = aDocument.getElementById("PopupSearchAutoComplete");
+        if (popup.state != "open")
+          return null;
+        element = aDocument.getAnonymousElementByAttribute(popup,
+                                                           "anonid",
+                                                           "search-settings");
+        if (!element || !UITour.isElementVisible(element)) {
+          return null;
+        }
+        return element;
+      },
+    }],
+    ["selectedTabIcon", {
+      query: (aDocument) => {
+        let selectedtab = aDocument.defaultView.gBrowser.selectedTab;
+        let element = aDocument.getAnonymousElementByAttribute(selectedtab,
+                                                               "anonid",
+                                                               "tab-icon-image");
+        if (!element || !UITour.isElementVisible(element)) {
+          return null;
+        }
+        return element;
+      },
+    }],
+    ["trackingProtection", {
+      query: "#tracking-protection-icon",
+    }],
+    ["urlbar",      {
+      query: "#urlbar",
+      widgetName: "urlbar-container",
+    }],
+    ["webide",      {query: "#webide-button"}],
+  ]),
+
+  init: function() {
+    log.debug("Initializing UITour");
+    // Lazy getter is initialized here so it can be replicated any time
+    // in a test.
+    delete this.seenPageIDs;
+    Object.defineProperty(this, "seenPageIDs", {
+      get: this.restoreSeenPageIDs.bind(this),
+      configurable: true,
+    });
+
+    delete this.url;
+    XPCOMUtils.defineLazyGetter(this, "url", function () {
+      return Services.urlFormatter.formatURLPref("browser.uitour.url");
+    });
+
+    // Clear the availableTargetsCache on widget changes.
+    let listenerMethods = [
+      "onWidgetAdded",
+      "onWidgetMoved",
+      "onWidgetRemoved",
+      "onWidgetReset",
+      "onAreaReset",
+    ];
+    CustomizableUI.addListener(listenerMethods.reduce((listener, method) => {
+      listener[method] = () => this.clearAvailableTargetsCache();
+      return listener;
+    }, {}));
+  },
+
+  restoreSeenPageIDs: function() {
+    delete this.seenPageIDs;
+
+    if (UITelemetry.enabled) {
+      let dateThreshold = Date.now() - SEENPAGEID_EXPIRY;
+
+      try {
+        let data = Services.prefs.getCharPref(PREF_SEENPAGEIDS);
+        data = new Map(JSON.parse(data));
+
+        for (let [pageID, details] of data) {
+
+          if (typeof pageID != "string" ||
+              typeof details != "object" ||
+              typeof details.lastSeen != "number" ||
+              details.lastSeen < dateThreshold) {
+
+            data.delete(pageID);
+          }
+        }
+
+        this.seenPageIDs = data;
+      } catch (e) {}
+    }
+
+    if (!this.seenPageIDs)
+      this.seenPageIDs = new Map();
+
+    this.persistSeenIDs();
+
+    return this.seenPageIDs;
+  },
+
+  addSeenPageID: function(aPageID) {
+    if (!UITelemetry.enabled)
+      return;
+
+    this.seenPageIDs.set(aPageID, {
+      lastSeen: Date.now(),
+    });
+
+    this.persistSeenIDs();
+  },
+
+  persistSeenIDs: function() {
+    if (this.seenPageIDs.size === 0) {
+      Services.prefs.clearUserPref(PREF_SEENPAGEIDS);
+      return;
+    }
+
+    Services.prefs.setCharPref(PREF_SEENPAGEIDS,
+                               JSON.stringify([...this.seenPageIDs]));
+  },
+
+  get _readerViewTriggerRegEx() {
+    delete this._readerViewTriggerRegEx;
+    let readerViewUITourTrigger = Services.prefs.getCharPref(PREF_READERVIEW_TRIGGER);
+    return this._readerViewTriggerRegEx = new RegExp(readerViewUITourTrigger, "i");
+  },
+
+  onLocationChange: function(aLocation) {
+    // The ReaderView tour page is expected to run in Reader View,
+    // which disables JavaScript on the page. To get around that, we
+    // automatically start a pre-defined tour on page load (for hysterical
+    // raisins the ReaderView tour is known as "readinglist")
+    let originalUrl = ReaderMode.getOriginalUrl(aLocation);
+    if (this._readerViewTriggerRegEx.test(originalUrl)) {
+      this.startSubTour("readinglist");
+    }
+  },
+
+  onPageEvent: function(aMessage, aEvent) {
+    let browser = aMessage.target;
+    let window = browser.ownerGlobal;
+
+    // Does the window have tabs? We need to make sure since windowless browsers do
+    // not have tabs.
+    if (!window.gBrowser) {
+      // When using windowless browsers we don't have a valid |window|. If that's the case,
+      // use the most recent window as a target for UITour functions (see Bug 1111022).
+      window = Services.wm.getMostRecentWindow("navigator:browser");
+    }
+
+    let messageManager = browser.messageManager;
+
+    log.debug("onPageEvent:", aEvent.detail, aMessage);
+
+    if (typeof aEvent.detail != "object") {
+      log.warn("Malformed event - detail not an object");
+      return false;
+    }
+
+    let action = aEvent.detail.action;
+    if (typeof action != "string" || !action) {
+      log.warn("Action not defined");
+      return false;
+    }
+
+    let data = aEvent.detail.data;
+    if (typeof data != "object") {
+      log.warn("Malformed event - data not an object");
+      return false;
+    }
+
+    if ((aEvent.pageVisibilityState == "hidden" ||
+         aEvent.pageVisibilityState == "unloaded") &&
+        !BACKGROUND_PAGE_ACTIONS_ALLOWED.has(action)) {
+      log.warn("Ignoring disallowed action from a hidden page:", action);
+      return false;
+    }
+
+    switch (action) {
+      case "registerPageID": {
+        if (typeof data.pageID != "string") {
+          log.warn("registerPageID: pageID must be a string");
+          break;
+        }
+
+        this.pageIDsForSession.set(data.pageID, {lastSeen: Date.now()});
+
+        // The rest is only relevant if Telemetry is enabled.
+        if (!UITelemetry.enabled) {
+          log.debug("registerPageID: Telemetry disabled, not doing anything");
+          break;
+        }
+
+        // We don't want to allow BrowserUITelemetry.BUCKET_SEPARATOR in the
+        // pageID, as it could make parsing the telemetry bucket name difficult.
+        if (data.pageID.includes(BrowserUITelemetry.BUCKET_SEPARATOR)) {
+          log.warn("registerPageID: Invalid page ID specified");
+          break;
+        }
+
+        this.addSeenPageID(data.pageID);
+        this.pageIDSourceBrowsers.set(browser, data.pageID);
+        this.setTelemetryBucket(data.pageID);
+
+        break;
+      }
+
+      case "showHeartbeat": {
+        // Validate the input parameters.
+        if (typeof data.message !== "string" || data.message === "") {
+          log.error("showHeartbeat: Invalid message specified.");
+          return false;
+        }
+
+        if (typeof data.thankyouMessage !== "string" || data.thankyouMessage === "") {
+          log.error("showHeartbeat: Invalid thank you message specified.");
+          return false;
+        }
+
+        if (typeof data.flowId !== "string" || data.flowId === "") {
+          log.error("showHeartbeat: Invalid flowId specified.");
+          return false;
+        }
+
+        if (data.engagementButtonLabel && typeof data.engagementButtonLabel != "string") {
+          log.error("showHeartbeat: Invalid engagementButtonLabel specified");
+          return false;
+        }
+
+        let heartbeatWindow = window;
+        if (data.privateWindowsOnly && !PrivateBrowsingUtils.isWindowPrivate(heartbeatWindow)) {
+          heartbeatWindow = RecentWindow.getMostRecentBrowserWindow({ private: true });
+          if (!heartbeatWindow) {
+            log.debug("showHeartbeat: No private window found");
+            return false;
+          }
+        }
+
+        // Finally show the Heartbeat UI.
+        this.showHeartbeat(heartbeatWindow, data);
+        break;
+      }
+
+      case "showHighlight": {
+        let targetPromise = this.getTarget(window, data.target);
+        targetPromise.then(target => {
+          if (!target.node) {
+            log.error("UITour: Target could not be resolved: " + data.target);
+            return;
+          }
+          let effect = undefined;
+          if (this.highlightEffects.indexOf(data.effect) !== -1) {
+            effect = data.effect;
+          }
+          this.showHighlight(window, target, effect);
+        }).catch(log.error);
+        break;
+      }
+
+      case "hideHighlight": {
+        this.hideHighlight(window);
+        break;
+      }
+
+      case "showInfo": {
+        let targetPromise = this.getTarget(window, data.target, true);
+        targetPromise.then(target => {
+          if (!target.node) {
+            log.error("UITour: Target could not be resolved: " + data.target);
+            return;
+          }
+
+          let iconURL = null;
+          if (typeof data.icon == "string")
+            iconURL = this.resolveURL(browser, data.icon);
+
+          let buttons = [];
+          if (Array.isArray(data.buttons) && data.buttons.length > 0) {
+            for (let buttonData of data.buttons) {
+              if (typeof buttonData == "object" &&
+                  typeof buttonData.label == "string" &&
+                  typeof buttonData.callbackID == "string") {
+                let callback = buttonData.callbackID;
+                let button = {
+                  label: buttonData.label,
+                  callback: event => {
+                    this.sendPageCallback(messageManager, callback);
+                  },
+                };
+
+                if (typeof buttonData.icon == "string")
+                  button.iconURL = this.resolveURL(browser, buttonData.icon);
+
+                if (typeof buttonData.style == "string")
+                  button.style = buttonData.style;
+
+                buttons.push(button);
+
+                if (buttons.length == MAX_BUTTONS) {
+                  log.warn("showInfo: Reached limit of allowed number of buttons");
+                  break;
+                }
+              }
+            }
+          }
+
+          let infoOptions = {};
+          if (typeof data.closeButtonCallbackID == "string") {
+            infoOptions.closeButtonCallback = () => {
+              this.sendPageCallback(messageManager, data.closeButtonCallbackID);
+            };
+          }
+          if (typeof data.targetCallbackID == "string") {
+            infoOptions.targetCallback = details => {
+              this.sendPageCallback(messageManager, data.targetCallbackID, details);
+            };
+          }
+
+          this.showInfo(window, target, data.title, data.text, iconURL, buttons, infoOptions);
+        }).catch(log.error);
+        break;
+      }
+
+      case "hideInfo": {
+        this.hideInfo(window);
+        break;
+      }
+
+      case "previewTheme": {
+        this.previewTheme(data.theme);
+        break;
+      }
+
+      case "resetTheme": {
+        this.resetTheme();
+        break;
+      }
+
+      case "showMenu": {
+        this.showMenu(window, data.name, () => {
+          if (typeof data.showCallbackID == "string")
+            this.sendPageCallback(messageManager, data.showCallbackID);
+        });
+        break;
+      }
+
+      case "hideMenu": {
+        this.hideMenu(window, data.name);
+        break;
+      }
+
+      case "showNewTab": {
+        this.showNewTab(window, browser);
+        break;
+      }
+
+      case "getConfiguration": {
+        if (typeof data.configuration != "string") {
+          log.warn("getConfiguration: No configuration option specified");
+          return false;
+        }
+
+        this.getConfiguration(messageManager, window, data.configuration, data.callbackID);
+        break;
+      }
+
+      case "setConfiguration": {
+        if (typeof data.configuration != "string") {
+          log.warn("setConfiguration: No configuration option specified");
+          return false;
+        }
+
+        this.setConfiguration(window, data.configuration, data.value);
+        break;
+      }
+
+      case "openPreferences": {
+        if (typeof data.pane != "string" && typeof data.pane != "undefined") {
+          log.warn("openPreferences: Invalid pane specified");
+          return false;
+        }
+
+        window.openPreferences(data.pane);
+        break;
+      }
+
+      case "showFirefoxAccounts": {
+        // 'signup' is the only action that makes sense currently, so we don't
+        // accept arbitrary actions just to be safe...
+        let p = new URLSearchParams("action=signup&entrypoint=uitour");
+        // Call our helper to validate extraURLCampaignParams and populate URLSearchParams
+        if (!this._populateCampaignParams(p, data.extraURLCampaignParams)) {
+          log.warn("showFirefoxAccounts: invalid campaign args specified");
+          return false;
+        }
+
+        // We want to replace the current tab.
+        browser.loadURI("about:accounts?" + p.toString());
+        break;
+      }
+
+      case "resetFirefox": {
+        // Open a reset profile dialog window.
+        if (ResetProfile.resetSupported()) {
+          ResetProfile.openConfirmationDialog(window);
+        }
+        break;
+      }
+
+      case "addNavBarWidget": {
+        // Add a widget to the toolbar
+        let targetPromise = this.getTarget(window, data.name);
+        targetPromise.then(target => {
+          this.addNavBarWidget(target, messageManager, data.callbackID);
+        }).catch(log.error);
+        break;
+      }
+
+      case "setDefaultSearchEngine": {
+        let enginePromise = this.selectSearchEngine(data.identifier);
+        enginePromise.catch(Cu.reportError);
+        break;
+      }
+
+      case "setTreatmentTag": {
+        let name = data.name;
+        let value = data.value;
+        let string = Cc["@mozilla.org/supports-string;1"].createInstance(Ci.nsISupportsString);
+        string.data = value;
+        Services.prefs.setComplexValue("browser.uitour.treatment." + name,
+                                       Ci.nsISupportsString, string);
+        // The notification is only meant to be used in tests.
+        UITourHealthReport.recordTreatmentTag(name, value)
+                          .then(() => this.notify("TreatmentTag:TelemetrySent"));
+        break;
+      }
+
+      case "getTreatmentTag": {
+        let name = data.name;
+        let value;
+        try {
+          value = Services.prefs.getComplexValue("browser.uitour.treatment." + name,
+                                                 Ci.nsISupportsString).data;
+        } catch (ex) {}
+        this.sendPageCallback(messageManager, data.callbackID, { value: value });
+        break;
+      }
+
+      case "setSearchTerm": {
+        let targetPromise = this.getTarget(window, "search");
+        targetPromise.then(target => {
+          let searchbar = target.node;
+          searchbar.value = data.term;
+          searchbar.updateGoButtonVisibility();
+        });
+        break;
+      }
+
+      case "openSearchPanel": {
+        let targetPromise = this.getTarget(window, "search");
+        targetPromise.then(target => {
+          let searchbar = target.node;
+
+          if (searchbar.textbox.open) {
+            this.sendPageCallback(messageManager, data.callbackID);
+          } else {
+            let onPopupShown = () => {
+              searchbar.textbox.popup.removeEventListener("popupshown", onPopupShown);
+              this.sendPageCallback(messageManager, data.callbackID);
+            };
+
+            searchbar.textbox.popup.addEventListener("popupshown", onPopupShown);
+            searchbar.openSuggestionsPanel();
+          }
+        }).then(null, Cu.reportError);
+        break;
+      }
+
+      case "ping": {
+        if (typeof data.callbackID == "string")
+          this.sendPageCallback(messageManager, data.callbackID);
+        break;
+      }
+
+      case "forceShowReaderIcon": {
+        ReaderParent.forceShowReaderIcon(browser);
+        break;
+      }
+
+      case "toggleReaderMode": {
+        let targetPromise = this.getTarget(window, "readerMode-urlBar");
+        targetPromise.then(target => {
+          ReaderParent.toggleReaderMode({target: target.node});
+        });
+        break;
+      }
+
+      case "closeTab": {
+        // Find the <tabbrowser> element of the <browser> for which the event
+        // was generated originally. If the browser where the UI tour is loaded
+        // is windowless, just ignore the request to close the tab. The request
+        // is also ignored if this is the only tab in the window.
+        let tabBrowser = browser.ownerGlobal.gBrowser;
+        if (tabBrowser && tabBrowser.browsers.length > 1) {
+          tabBrowser.removeTab(tabBrowser.getTabForBrowser(browser));
+        }
+        break;
+      }
+    }
+
+    this.initForBrowser(browser, window);
+
+    return true;
+  },
+
+  initForBrowser(aBrowser, window) {
+    let gBrowser = window.gBrowser;
+
+    if (gBrowser) {
+        gBrowser.tabContainer.addEventListener("TabSelect", this);
+    }
+
+    if (!this.tourBrowsersByWindow.has(window)) {
+      this.tourBrowsersByWindow.set(window, new Set());
+    }
+    this.tourBrowsersByWindow.get(window).add(aBrowser);
+
+    Services.obs.addObserver(this, "message-manager-close", false);
+
+    window.addEventListener("SSWindowClosing", this);
+  },
+
+  handleEvent: function(aEvent) {
+    log.debug("handleEvent: type =", aEvent.type, "event =", aEvent);
+    switch (aEvent.type) {
+      case "TabSelect": {
+        let window = aEvent.target.ownerGlobal;
+
+        // Teardown the browser of the tab we just switched away from.
+        if (aEvent.detail && aEvent.detail.previousTab) {
+          let previousTab = aEvent.detail.previousTab;
+          let openTourWindows = this.tourBrowsersByWindow.get(window);
+          if (openTourWindows.has(previousTab.linkedBrowser)) {
+            this.teardownTourForBrowser(window, previousTab.linkedBrowser, false);
+          }
+        }
+
+        break;
+      }
+
+      case "SSWindowClosing": {
+        let window = aEvent.target;
+        this.teardownTourForWindow(window);
+        break;
+      }
+    }
+  },
+
+  observe: function(aSubject, aTopic, aData) {
+    log.debug("observe: aTopic =", aTopic);
+    switch (aTopic) {
+      // The browser message manager is disconnected when the <browser> is
+      // destroyed and we want to teardown at that point.
+      case "message-manager-close": {
+        let winEnum = Services.wm.getEnumerator("navigator:browser");
+        while (winEnum.hasMoreElements()) {
+          let window = winEnum.getNext();
+          if (window.closed)
+            continue;
+
+          let tourBrowsers = this.tourBrowsersByWindow.get(window);
+          if (!tourBrowsers)
+            continue;
+
+          for (let browser of tourBrowsers) {
+            let messageManager = browser.messageManager;
+            if (aSubject != messageManager) {
+              continue;
+            }
+
+            this.teardownTourForBrowser(window, browser, true);
+            return;
+          }
+        }
+        break;
+      }
+    }
+  },
+
+  // Given a string that is a JSONified represenation of an object with
+  // additional utm_* URL params that should be appended, validate and append
+  // them to the passed URLSearchParams object. Returns true if the params
+  // were validated and appended, and false if the request should be ignored.
+  _populateCampaignParams: function(urlSearchParams, extraURLCampaignParams) {
+    // We are extra paranoid about what params we allow to be appended.
+    if (typeof extraURLCampaignParams == "undefined") {
+      // no params, so it's all good.
+      return true;
+    }
+    if (typeof extraURLCampaignParams != "string") {
+      log.warn("_populateCampaignParams: extraURLCampaignParams is not a string");
+      return false;
+    }
+    let campaignParams;
+    try {
+      if (extraURLCampaignParams) {
+        campaignParams = JSON.parse(extraURLCampaignParams);
+        if (typeof campaignParams != "object") {
+          log.warn("_populateCampaignParams: extraURLCampaignParams is not a stringified object");
+          return false;
+        }
+      }
+    } catch (ex) {
+      log.warn("_populateCampaignParams: extraURLCampaignParams is not a JSON object");
+      return false;
+    }
+    if (campaignParams) {
+      // The regex that the name of each param must match - there's no
+      // character restriction on the value - they will be escaped as necessary.
+      let reSimpleString = /^[-_a-zA-Z0-9]*$/;
+      for (let name in campaignParams) {
+        let value = campaignParams[name];
+        if (typeof name != "string" || typeof value != "string" ||
+            !name.startsWith("utm_") ||
+            value.length == 0 ||
+            !reSimpleString.test(name)) {
+          log.warn("_populateCampaignParams: invalid campaign param specified");
+          return false;
+        }
+        urlSearchParams.append(name, value);
+      }
+    }
+    return true;
+  },
+
+  setTelemetryBucket: function(aPageID) {
+    let bucket = BUCKET_NAME + BrowserUITelemetry.BUCKET_SEPARATOR + aPageID;
+    BrowserUITelemetry.setBucket(bucket);
+  },
+
+  setExpiringTelemetryBucket: function(aPageID, aType) {
+    let bucket = BUCKET_NAME + BrowserUITelemetry.BUCKET_SEPARATOR + aPageID +
+                 BrowserUITelemetry.BUCKET_SEPARATOR + aType;
+
+    BrowserUITelemetry.setExpiringBucket(bucket,
+                                         BUCKET_TIMESTEPS);
+  },
+
+  // This is registered with UITelemetry by BrowserUITelemetry, so that UITour
+  // can remain lazy-loaded on-demand.
+  getTelemetry: function() {
+    return {
+      seenPageIDs: [...this.seenPageIDs.keys()],
+    };
+  },
+
+  /**
+   * Tear down a tour from a tab e.g. upon switching/closing tabs.
+   */
+  teardownTourForBrowser: function(aWindow, aBrowser, aTourPageClosing = false) {
+    log.debug("teardownTourForBrowser: aBrowser = ", aBrowser, aTourPageClosing);
+
+    if (this.pageIDSourceBrowsers.has(aBrowser)) {
+      let pageID = this.pageIDSourceBrowsers.get(aBrowser);
+      this.setExpiringTelemetryBucket(pageID, aTourPageClosing ? "closed" : "inactive");
+    }
+
+    let openTourBrowsers = this.tourBrowsersByWindow.get(aWindow);
+    if (aTourPageClosing && openTourBrowsers) {
+      openTourBrowsers.delete(aBrowser);
+    }
+
+    this.hideHighlight(aWindow);
+    this.hideInfo(aWindow);
+    // Ensure the menu panel is hidden before calling recreatePopup so popup events occur.
+    this.hideMenu(aWindow, "appMenu");
+    this.hideMenu(aWindow, "controlCenter");
+
+    // Clean up panel listeners after calling hideMenu above.
+    aWindow.PanelUI.panel.removeEventListener("popuphiding", this.hideAppMenuAnnotations);
+    aWindow.PanelUI.panel.removeEventListener("ViewShowing", this.hideAppMenuAnnotations);
+    aWindow.PanelUI.panel.removeEventListener("popuphidden", this.onPanelHidden);
+    let controlCenterPanel = aWindow.gIdentityHandler._identityPopup;
+    controlCenterPanel.removeEventListener("popuphidden", this.onPanelHidden);
+    controlCenterPanel.removeEventListener("popuphiding", this.hideControlCenterAnnotations);
+
+    this.resetTheme();
+
+    // If there are no more tour tabs left in the window, teardown the tour for the whole window.
+    if (!openTourBrowsers || openTourBrowsers.size == 0) {
+      this.teardownTourForWindow(aWindow);
+    }
+  },
+
+  /**
+   * Tear down all tours for a ChromeWindow.
+   */
+  teardownTourForWindow: function(aWindow) {
+    log.debug("teardownTourForWindow");
+    aWindow.gBrowser.tabContainer.removeEventListener("TabSelect", this);
+    aWindow.removeEventListener("SSWindowClosing", this);
+
+    let openTourBrowsers = this.tourBrowsersByWindow.get(aWindow);
+    if (openTourBrowsers) {
+      for (let browser of openTourBrowsers) {
+        if (this.pageIDSourceBrowsers.has(browser)) {
+          let pageID = this.pageIDSourceBrowsers.get(browser);
+          this.setExpiringTelemetryBucket(pageID, "closed");
+        }
+      }
+    }
+
+    this.tourBrowsersByWindow.delete(aWindow);
+  },
+
+  // This function is copied to UITourListener.
+  isSafeScheme: function(aURI) {
+    let allowedSchemes = new Set(["https", "about"]);
+    if (!Services.prefs.getBoolPref("browser.uitour.requireSecure"))
+      allowedSchemes.add("http");
+
+    if (!allowedSchemes.has(aURI.scheme)) {
+      log.error("Unsafe scheme:", aURI.scheme);
+      return false;
+    }
+
+    return true;
+  },
+
+  resolveURL: function(aBrowser, aURL) {
+    try {
+      let uri = Services.io.newURI(aURL, null, aBrowser.currentURI);
+
+      if (!this.isSafeScheme(uri))
+        return null;
+
+      return uri.spec;
+    } catch (e) {}
+
+    return null;
+  },
+
+  sendPageCallback: function(aMessageManager, aCallbackID, aData = {}) {
+    let detail = {data: aData, callbackID: aCallbackID};
+    log.debug("sendPageCallback", detail);
+    aMessageManager.sendAsyncMessage("UITour:SendPageCallback", detail);
+  },
+
+  isElementVisible: function(aElement) {
+    let targetStyle = aElement.ownerGlobal.getComputedStyle(aElement);
+    return !aElement.ownerDocument.hidden &&
+             targetStyle.display != "none" &&
+             targetStyle.visibility == "visible";
+  },
+
+  getTarget: function(aWindow, aTargetName, aSticky = false) {
+    log.debug("getTarget:", aTargetName);
+    let deferred = Promise.defer();
+    if (typeof aTargetName != "string" || !aTargetName) {
+      log.warn("getTarget: Invalid target name specified");
+      deferred.reject("Invalid target name specified");
+      return deferred.promise;
+    }
+
+    let targetObject = this.targets.get(aTargetName);
+    if (!targetObject) {
+      log.warn("getTarget: The specified target name is not in the allowed set");
+      deferred.reject("The specified target name is not in the allowed set");
+      return deferred.promise;
+    }
+
+    let targetQuery = targetObject.query;
+    aWindow.PanelUI.ensureReady().then(() => {
+      let node;
+      if (typeof targetQuery == "function") {
+        try {
+          node = targetQuery(aWindow.document);
+        } catch (ex) {
+          log.warn("getTarget: Error running target query:", ex);
+          node = null;
+        }
+      } else {
+        node = aWindow.document.querySelector(targetQuery);
+      }
+
+      deferred.resolve({
+        addTargetListener: targetObject.addTargetListener,
+        infoPanelOffsetX: targetObject.infoPanelOffsetX,
+        infoPanelOffsetY: targetObject.infoPanelOffsetY,
+        infoPanelPosition: targetObject.infoPanelPosition,
+        node: node,
+        removeTargetListener: targetObject.removeTargetListener,
+        targetName: aTargetName,
+        widgetName: targetObject.widgetName,
+        allowAdd: targetObject.allowAdd,
+      });
+    }).catch(log.error);
+    return deferred.promise;
+  },
+
+  targetIsInAppMenu: function(aTarget) {
+    let placement = CustomizableUI.getPlacementOfWidget(aTarget.widgetName || aTarget.node.id);
+    if (placement && placement.area == CustomizableUI.AREA_PANEL) {
+      return true;
+    }
+
+    let targetElement = aTarget.node;
+    // Use the widget for filtering if it exists since the target may be the icon inside.
+    if (aTarget.widgetName) {
+      targetElement = aTarget.node.ownerDocument.getElementById(aTarget.widgetName);
+    }
+
+    // Handle the non-customizable buttons at the bottom of the menu which aren't proper widgets.
+    return targetElement.id.startsWith("PanelUI-")
+             && targetElement.id != "PanelUI-button";
+  },
+
+  /**
+   * Called before opening or after closing a highlight or info panel to see if
+   * we need to open or close the appMenu to see the annotation's anchor.
+   */
+  _setAppMenuStateForAnnotation: function(aWindow, aAnnotationType, aShouldOpenForHighlight, aCallback = null) {
+    log.debug("_setAppMenuStateForAnnotation:", aAnnotationType);
+    log.debug("_setAppMenuStateForAnnotation: Menu is expected to be:", aShouldOpenForHighlight ? "open" : "closed");
+
+    // If the panel is in the desired state, we're done.
+    let panelIsOpen = aWindow.PanelUI.panel.state != "closed";
+    if (aShouldOpenForHighlight == panelIsOpen) {
+      log.debug("_setAppMenuStateForAnnotation: Panel already in expected state");
+      if (aCallback)
+        aCallback();
+      return;
+    }
+
+    // Don't close the menu if it wasn't opened by us (e.g. via showmenu instead).
+    if (!aShouldOpenForHighlight && !this.appMenuOpenForAnnotation.has(aAnnotationType)) {
+      log.debug("_setAppMenuStateForAnnotation: Menu not opened by us, not closing");
+      if (aCallback)
+        aCallback();
+      return;
+    }
+
+    if (aShouldOpenForHighlight) {
+      this.appMenuOpenForAnnotation.add(aAnnotationType);
+    } else {
+      this.appMenuOpenForAnnotation.delete(aAnnotationType);
+    }
+
+    // Actually show or hide the menu
+    if (this.appMenuOpenForAnnotation.size) {
+      log.debug("_setAppMenuStateForAnnotation: Opening the menu");
+      this.showMenu(aWindow, "appMenu", aCallback);
+    } else {
+      log.debug("_setAppMenuStateForAnnotation: Closing the menu");
+      this.hideMenu(aWindow, "appMenu");
+      if (aCallback)
+        aCallback();
+    }
+
+  },
+
+  previewTheme: function(aTheme) {
+    let origin = Services.prefs.getCharPref("browser.uitour.themeOrigin");
+    let data = LightweightThemeManager.parseTheme(aTheme, origin);
+    if (data)
+      LightweightThemeManager.previewTheme(data);
+  },
+
+  resetTheme: function() {
+    LightweightThemeManager.resetPreview();
+  },
+
+  /**
+   * Show the Heartbeat UI to request user feedback. This function reports back to the
+   * caller using |notify|. The notification event name reflects the current status the UI
+   * is in (either "Heartbeat:NotificationOffered", "Heartbeat:NotificationClosed",
+   * "Heartbeat:LearnMore", "Heartbeat:Engaged", "Heartbeat:Voted",
+   * "Heartbeat:SurveyExpired" or "Heartbeat:WindowClosed").
+   * When a "Heartbeat:Voted" event is notified
+   * the data payload contains a |score| field which holds the rating picked by the user.
+   * Please note that input parameters are already validated by the caller.
+   *
+   * @param aChromeWindow
+   *        The chrome window that the heartbeat notification is displayed in.
+   * @param {Object} aOptions Options object.
+   * @param {String} aOptions.message
+   *        The message, or question, to display on the notification.
+   * @param {String} aOptions.thankyouMessage
+   *        The thank you message to display after user votes.
+   * @param {String} aOptions.flowId
+   *        An identifier for this rating flow. Please note that this is only used to
+   *        identify the notification box.
+   * @param {String} [aOptions.engagementButtonLabel=null]
+   *        The text of the engagement button to use instad of stars. If this is null
+   *        or invalid, rating stars are used.
+   * @param {String} [aOptions.engagementURL=null]
+   *        The engagement URL to open in a new tab once user has engaged. If this is null
+   *        or invalid, no new tab is opened.
+   * @param {String} [aOptions.learnMoreLabel=null]
+   *        The label of the learn more link. No link will be shown if this is null.
+   * @param {String} [aOptions.learnMoreURL=null]
+   *        The learn more URL to open when clicking on the learn more link. No learn more
+   *        will be shown if this is an invalid URL.
+   * @param {boolean} [aOptions.privateWindowsOnly=false]
+   *        Whether the heartbeat UI should only be targeted at a private window (if one exists).
+   *        No notifications should be fired when this is true.
+   * @param {String} [aOptions.surveyId]
+   *        An ID for the survey, reflected in the Telemetry ping.
+   * @param {Number} [aOptions.surveyVersion]
+   *        Survey's version number, reflected in the Telemetry ping.
+   * @param {boolean} [aOptions.testing]
+   *        Whether this is a test survey, reflected in the Telemetry ping.
+   */
+  showHeartbeat(aChromeWindow, aOptions) {
+    // Initialize survey state
+    let pingSent = false;
+    let surveyResults = {};
+    let surveyEndTimer = null;
+
+    /**
+     * Accumulates survey events and submits to Telemetry after the survey ends.
+     *
+     * @param {String} aEventName
+     *        Heartbeat event name
+     * @param {Object} aParams
+     *        Additional parameters and their values
+     */
+    let maybeNotifyHeartbeat = (aEventName, aParams = {}) => {
+      // Return if event occurred after the ping was sent
+      if (pingSent) {
+        log.warn("maybeNotifyHeartbeat: event occurred after ping sent:", aEventName, aParams);
+        return;
+      }
+
+      // No Telemetry from private-window-only Heartbeats
+      if (aOptions.privateWindowsOnly) {
+        return;
+      }
+
+      let ts = Date.now();
+      let sendPing = false;
+      switch (aEventName) {
+        case "Heartbeat:NotificationOffered":
+          surveyResults.flowId = aOptions.flowId;
+          surveyResults.offeredTS = ts;
+          break;
+        case "Heartbeat:LearnMore":
+          // record only the first click
+          if (!surveyResults.learnMoreTS) {
+            surveyResults.learnMoreTS = ts;
+          }
+          break;
+        case "Heartbeat:Engaged":
+          surveyResults.engagedTS = ts;
+          break;
+        case "Heartbeat:Voted":
+          surveyResults.votedTS = ts;
+          surveyResults.score = aParams.score;
+          break;
+        case "Heartbeat:SurveyExpired":
+          surveyResults.expiredTS = ts;
+          break;
+        case "Heartbeat:NotificationClosed":
+          // this is the final event in most surveys
+          surveyResults.closedTS = ts;
+          sendPing = true;
+          break;
+        case "Heartbeat:WindowClosed":
+          surveyResults.windowClosedTS = ts;
+          sendPing = true;
+          break;
+        default:
+          log.error("maybeNotifyHeartbeat: unrecognized event:", aEventName);
+          break;
+      }
+
+      aParams.timestamp = ts;
+      aParams.flowId = aOptions.flowId;
+      this.notify(aEventName, aParams);
+
+      if (!sendPing) {
+        return;
+      }
+
+      // Send the ping to Telemetry
+      let payload = Object.assign({}, surveyResults);
+      payload.version = 1;
+      for (let meta of ["surveyId", "surveyVersion", "testing"]) {
+        if (aOptions.hasOwnProperty(meta)) {
+          payload[meta] = aOptions[meta];
+        }
+      }
+
+      log.debug("Sending payload to Telemetry: aEventName:", aEventName,
+                "payload:", payload);
+
+      TelemetryController.submitExternalPing("heartbeat", payload, {
+        addClientId: true,
+        addEnvironment: true,
+      });
+
+      // only for testing
+      this.notify("Heartbeat:TelemetrySent", payload);
+
+      // Survey is complete, clear out the expiry timer & survey configuration
+      if (surveyEndTimer) {
+        clearTimeout(surveyEndTimer);
+        surveyEndTimer = null;
+      }
+
+      pingSent = true;
+      surveyResults = {};
+    };
+
+    let nb = aChromeWindow.document.getElementById("high-priority-global-notificationbox");
+    let buttons = null;
+
+    if (aOptions.engagementButtonLabel) {
+      buttons = [{
+        label: aOptions.engagementButtonLabel,
+        callback: () => {
+          // Let the consumer know user engaged.
+          maybeNotifyHeartbeat("Heartbeat:Engaged");
+
+          userEngaged(new Map([
+            ["type", "button"],
+            ["flowid", aOptions.flowId]
+          ]));
+
+          // Return true so that the notification bar doesn't close itself since
+          // we have a thank you message to show.
+          return true;
+        },
+      }];
+    }
+
+    let defaultIcon = "chrome://browser/skin/heartbeat-icon.svg";
+    let iconURL = defaultIcon;
+    try {
+      // Take the optional icon URL if specified
+      if (aOptions.iconURL) {
+        iconURL = new URL(aOptions.iconURL);
+        // For now, only allow chrome URIs.
+        if (iconURL.protocol != "chrome:") {
+          iconURL = defaultIcon;
+          throw new Error("Invalid protocol");
+        }
+      }
+    } catch (error) {
+      log.error("showHeartbeat: Invalid icon URL specified.");
+    }
+
+    // Create the notification. Prefix its ID to decrease the chances of collisions.
+    let notice = nb.appendNotification(aOptions.message, "heartbeat-" + aOptions.flowId,
+                                       iconURL,
+                                       nb.PRIORITY_INFO_HIGH, buttons,
+                                       (aEventType) => {
+                                         if (aEventType != "removed") {
+                                           return;
+                                         }
+                                         // Let the consumer know the notification bar was closed.
+                                         // This also happens after voting.
+                                         maybeNotifyHeartbeat("Heartbeat:NotificationClosed");
+                                       });
+
+    // Get the elements we need to style.
+    let messageImage =
+      aChromeWindow.document.getAnonymousElementByAttribute(notice, "anonid", "messageImage");
+    let messageText =
+      aChromeWindow.document.getAnonymousElementByAttribute(notice, "anonid", "messageText");
+
+    function userEngaged(aEngagementParams) {
+      // Make the heartbeat icon pulse twice.
+      notice.label = aOptions.thankyouMessage;
+      messageImage.classList.remove("pulse-onshow");
+      messageImage.classList.add("pulse-twice");
+
+      // Remove all the children of the notice (rating container
+      // and the flex).
+      while (notice.firstChild) {
+        notice.removeChild(notice.firstChild);
+      }
+
+      // Make sure that we have a valid URL. If we haven't, do not open the engagement page.
+      let engagementURL = null;
+      try {
+        engagementURL = new URL(aOptions.engagementURL);
+      } catch (error) {
+        log.error("showHeartbeat: Invalid URL specified.");
+      }
+
+      // Just open the engagement tab if we have a valid engagement URL.
+      if (engagementURL) {
+        for (let [param, value] of aEngagementParams) {
+          engagementURL.searchParams.append(param, value);
+        }
+
+        // Open the engagement URL in a new tab.
+        aChromeWindow.gBrowser.selectedTab =
+          aChromeWindow.gBrowser.addTab(engagementURL.toString(), {
+            owner: aChromeWindow.gBrowser.selectedTab,
+            relatedToCurrent: true
+          });
+      }
+
+      // Remove the notification bar after 3 seconds.
+      aChromeWindow.setTimeout(() => {
+        nb.removeNotification(notice);
+      }, 3000);
+    }
+
+    // Create the fragment holding the rating UI.
+    let frag = aChromeWindow.document.createDocumentFragment();
+
+    // Build the Heartbeat star rating.
+    const numStars = aOptions.engagementButtonLabel ? 0 : 5;
+    let ratingContainer = aChromeWindow.document.createElement("hbox");
+    ratingContainer.id = "star-rating-container";
+
+    for (let i = 0; i < numStars; i++) {
+      // Create a star rating element.
+      let ratingElement = aChromeWindow.document.createElement("toolbarbutton");
+
+      // Style it.
+      let starIndex = numStars - i;
+      ratingElement.className = "plain star-x";
+      ratingElement.id = "star" + starIndex;
+      ratingElement.setAttribute("data-score", starIndex);
+
+      // Add the click handler.
+      ratingElement.addEventListener("click", function (evt) {
+        let rating = Number(evt.target.getAttribute("data-score"), 10);
+
+        // Let the consumer know user voted.
+        maybeNotifyHeartbeat("Heartbeat:Voted", { score: rating });
+
+        // Append the score data to the engagement URL.
+        userEngaged(new Map([
+          ["type", "stars"],
+          ["score", rating],
+          ["flowid", aOptions.flowId]
+        ]));
+      }.bind(this));
+
+      // Add it to the container.
+      ratingContainer.appendChild(ratingElement);
+    }
+
+    frag.appendChild(ratingContainer);
+
+    // Make sure the stars are not pushed to the right by the spacer.
+    let rightSpacer = aChromeWindow.document.createElement("spacer");
+    rightSpacer.flex = 20;
+    frag.appendChild(rightSpacer);
+
+    messageText.flex = 0; // Collapse the space before the stars.
+    let leftSpacer = messageText.nextSibling;
+    leftSpacer.flex = 0;
+
+    // Make sure that we have a valid learn more URL.
+    let learnMoreURL = null;
+    try {
+      learnMoreURL = new URL(aOptions.learnMoreURL);
+    } catch (error) {
+      log.error("showHeartbeat: Invalid learnMore URL specified.");
+    }
+
+    // Add the learn more link.
+    if (aOptions.learnMoreLabel && learnMoreURL) {
+      let learnMore = aChromeWindow.document.createElement("label");
+      learnMore.className = "text-link";
+      learnMore.href = learnMoreURL.toString();
+      learnMore.setAttribute("value", aOptions.learnMoreLabel);
+      learnMore.addEventListener("click", () => maybeNotifyHeartbeat("Heartbeat:LearnMore"));
+      frag.appendChild(learnMore);
+    }
+
+    // Append the fragment and apply the styling.
+    notice.appendChild(frag);
+    notice.classList.add("heartbeat");
+    messageImage.classList.add("heartbeat", "pulse-onshow");
+    messageText.classList.add("heartbeat");
+
+    // Let the consumer know the notification was shown.
+    maybeNotifyHeartbeat("Heartbeat:NotificationOffered");
+
+    // End the survey if the user quits, closes the window, or
+    // hasn't responded before expiration.
+    if (!aOptions.privateWindowsOnly) {
+      function handleWindowClosed(aTopic) {
+        maybeNotifyHeartbeat("Heartbeat:WindowClosed");
+        aChromeWindow.removeEventListener("SSWindowClosing", handleWindowClosed);
+      }
+      aChromeWindow.addEventListener("SSWindowClosing", handleWindowClosed);
+
+      let surveyDuration = Services.prefs.getIntPref(PREF_SURVEY_DURATION) * 1000;
+      surveyEndTimer = setTimeout(() => {
+        maybeNotifyHeartbeat("Heartbeat:SurveyExpired");
+        nb.removeNotification(notice);
+      }, surveyDuration);
+    }
+  },
+
+  /**
+   * The node to which a highlight or notification(-popup) is anchored is sometimes
+   * obscured because it may be inside an overflow menu. This function should figure
+   * that out and offer the overflow chevron as an alternative.
+   *
+   * @param {Node} aAnchor The element that's supposed to be the anchor
+   * @type {Node}
+   */
+  _correctAnchor: function(aAnchor) {
+    // If the target is in the overflow panel, just return the overflow button.
+    if (aAnchor.getAttribute("overflowedItem")) {
+      let doc = aAnchor.ownerDocument;
+      let placement = CustomizableUI.getPlacementOfWidget(aAnchor.id);
+      let areaNode = doc.getElementById(placement.area);
+      return areaNode.overflowable._chevron;
+    }
+
+    return aAnchor;
+  },
+
+  /**
+   * @param aChromeWindow The chrome window that the highlight is in. Necessary since some targets
+   *                      are in a sub-frame so the defaultView is not the same as the chrome
+   *                      window.
+   * @param aTarget    The element to highlight.
+   * @param aEffect    (optional) The effect to use from UITour.highlightEffects or "none".
+   * @see UITour.highlightEffects
+   */
+  showHighlight: function(aChromeWindow, aTarget, aEffect = "none") {
+    function showHighlightPanel() {
+      let highlighter = aChromeWindow.document.getElementById("UITourHighlight");
+
+      let effect = aEffect;
+      if (effect == "random") {
+        // Exclude "random" from the randomly selected effects.
+        let randomEffect = 1 + Math.floor(Math.random() * (this.highlightEffects.length - 1));
+        if (randomEffect == this.highlightEffects.length)
+          randomEffect--; // On the order of 1 in 2^62 chance of this happening.
+        effect = this.highlightEffects[randomEffect];
+      }
+      // Toggle the effect attribute to "none" and flush layout before setting it so the effect plays.
+      highlighter.setAttribute("active", "none");
+      aChromeWindow.getComputedStyle(highlighter).animationName;
+      highlighter.setAttribute("active", effect);
+      highlighter.parentElement.setAttribute("targetName", aTarget.targetName);
+      highlighter.parentElement.hidden = false;
+
+      let highlightAnchor = this._correctAnchor(aTarget.node);
+      let targetRect = highlightAnchor.getBoundingClientRect();
+      let highlightHeight = targetRect.height;
+      let highlightWidth = targetRect.width;
+      let minDimension = Math.min(highlightHeight, highlightWidth);
+      let maxDimension = Math.max(highlightHeight, highlightWidth);
+
+      // If the dimensions are within 200% of each other (to include the bookmarks button),
+      // make the highlight a circle with the largest dimension as the diameter.
+      if (maxDimension / minDimension <= 3.0) {
+        highlightHeight = highlightWidth = maxDimension;
+        highlighter.style.borderRadius = "100%";
+      } else {
+        highlighter.style.borderRadius = "";
+      }
+
+      highlighter.style.height = highlightHeight + "px";
+      highlighter.style.width = highlightWidth + "px";
+
+      // Close a previous highlight so we can relocate the panel.
+      if (highlighter.parentElement.state == "showing" || highlighter.parentElement.state == "open") {
+        log.debug("showHighlight: Closing previous highlight first");
+        highlighter.parentElement.hidePopup();
+      }
+      /* The "overlap" position anchors from the top-left but we want to centre highlights at their
+         minimum size. */
+      let highlightWindow = aChromeWindow;
+      let containerStyle = highlightWindow.getComputedStyle(highlighter.parentElement);
+      let paddingTopPx = 0 - parseFloat(containerStyle.paddingTop);
+      let paddingLeftPx = 0 - parseFloat(containerStyle.paddingLeft);
+      let highlightStyle = highlightWindow.getComputedStyle(highlighter);
+      let highlightHeightWithMin = Math.max(highlightHeight, parseFloat(highlightStyle.minHeight));
+      let highlightWidthWithMin = Math.max(highlightWidth, parseFloat(highlightStyle.minWidth));
+      let offsetX = paddingTopPx
+                      - (Math.max(0, highlightWidthWithMin - targetRect.width) / 2);
+      let offsetY = paddingLeftPx
+                      - (Math.max(0, highlightHeightWithMin - targetRect.height) / 2);
+      this._addAnnotationPanelMutationObserver(highlighter.parentElement);
+      highlighter.parentElement.openPopup(highlightAnchor, "overlap", offsetX, offsetY);
+    }
+
+    // Prevent showing a panel at an undefined position.
+    if (!this.isElementVisible(aTarget.node)) {
+      log.warn("showHighlight: Not showing a highlight since the target isn't visible", aTarget);
+      return;
+    }
+
+    this._setAppMenuStateForAnnotation(aChromeWindow, "highlight",
+                                       this.targetIsInAppMenu(aTarget),
+                                       showHighlightPanel.bind(this));
+  },
+
+  hideHighlight: function(aWindow) {
+    let highlighter = aWindow.document.getElementById("UITourHighlight");
+    this._removeAnnotationPanelMutationObserver(highlighter.parentElement);
+    highlighter.parentElement.hidePopup();
+    highlighter.removeAttribute("active");
+
+    this._setAppMenuStateForAnnotation(aWindow, "highlight", false);
+  },
+
+  /**
+   * Show an info panel.
+   *
+   * @param {ChromeWindow} aChromeWindow
+   * @param {Node}     aAnchor
+   * @param {String}   [aTitle=""]
+   * @param {String}   [aDescription=""]
+   * @param {String}   [aIconURL=""]
+   * @param {Object[]} [aButtons=[]]
+   * @param {Object}   [aOptions={}]
+   * @param {String}   [aOptions.closeButtonCallback]
+   * @param {String}   [aOptions.targetCallback]
+   */
+  showInfo(aChromeWindow, aAnchor, aTitle = "", aDescription = "",
+           aIconURL = "", aButtons = [], aOptions = {}) {
+    function showInfoPanel(aAnchorEl) {
+      aAnchorEl.focus();
+
+      let document = aChromeWindow.document;
+      let tooltip = document.getElementById("UITourTooltip");
+      let tooltipTitle = document.getElementById("UITourTooltipTitle");
+      let tooltipDesc = document.getElementById("UITourTooltipDescription");
+      let tooltipIcon = document.getElementById("UITourTooltipIcon");
+      let tooltipButtons = document.getElementById("UITourTooltipButtons");
+
+      if (tooltip.state == "showing" || tooltip.state == "open") {
+        tooltip.hidePopup();
+      }
+
+      tooltipTitle.textContent = aTitle || "";
+      tooltipDesc.textContent = aDescription || "";
+      tooltipIcon.src = aIconURL || "";
+      tooltipIcon.hidden = !aIconURL;
+
+      while (tooltipButtons.firstChild)
+        tooltipButtons.firstChild.remove();
+
+      for (let button of aButtons) {
+        let isButton = button.style != "text";
+        let el = document.createElement(isButton ? "button" : "label");
+        el.setAttribute(isButton ? "label" : "value", button.label);
+
+        if (isButton) {
+          if (button.iconURL)
+            el.setAttribute("image", button.iconURL);
+
+          if (button.style == "link")
+            el.setAttribute("class", "button-link");
+
+          if (button.style == "primary")
+            el.setAttribute("class", "button-primary");
+
+          // Don't close the popup or call the callback for style=text as they
+          // aren't links/buttons.
+          let callback = button.callback;
+          el.addEventListener("command", event => {
+            tooltip.hidePopup();
+            callback(event);
+          });
+        }
+
+        tooltipButtons.appendChild(el);
+      }
+
+      tooltipButtons.hidden = !aButtons.length;
+
+      let tooltipClose = document.getElementById("UITourTooltipClose");
+      let closeButtonCallback = (event) => {
+        this.hideInfo(document.defaultView);
+        if (aOptions && aOptions.closeButtonCallback) {
+          aOptions.closeButtonCallback();
+        }
+      };
+      tooltipClose.addEventListener("command", closeButtonCallback);
+
+      let targetCallback = (event) => {
+        let details = {
+          target: aAnchor.targetName,
+          type: event.type,
+        };
+        aOptions.targetCallback(details);
+      };
+      if (aOptions.targetCallback && aAnchor.addTargetListener) {
+        aAnchor.addTargetListener(document, targetCallback);
+      }
+
+      tooltip.addEventListener("popuphiding", function tooltipHiding(event) {
+        tooltip.removeEventListener("popuphiding", tooltipHiding);
+        tooltipClose.removeEventListener("command", closeButtonCallback);
+        if (aOptions.targetCallback && aAnchor.removeTargetListener) {
+          aAnchor.removeTargetListener(document, targetCallback);
+        }
+      });
+
+      tooltip.setAttribute("targetName", aAnchor.targetName);
+      tooltip.hidden = false;
+      let alignment = "bottomcenter topright";
+      if (aAnchor.infoPanelPosition) {
+        alignment = aAnchor.infoPanelPosition;
+      }
+
+      let { infoPanelOffsetX: xOffset, infoPanelOffsetY: yOffset } = aAnchor;
+
+      this._addAnnotationPanelMutationObserver(tooltip);
+      tooltip.openPopup(aAnchorEl, alignment, xOffset || 0, yOffset || 0);
+      if (tooltip.state == "closed") {
+        document.defaultView.addEventListener("endmodalstate", function endModalStateHandler() {
+          document.defaultView.removeEventListener("endmodalstate", endModalStateHandler);
+          tooltip.openPopup(aAnchorEl, alignment);
+        }, false);
+      }
+    }
+
+    // Prevent showing a panel at an undefined position.
+    if (!this.isElementVisible(aAnchor.node)) {
+      log.warn("showInfo: Not showing since the target isn't visible", aAnchor);
+      return;
+    }
+
+    this._setAppMenuStateForAnnotation(aChromeWindow, "info",
+                                       this.targetIsInAppMenu(aAnchor),
+                                       showInfoPanel.bind(this, this._correctAnchor(aAnchor.node)));
+  },
+
+  isInfoOnTarget(aChromeWindow, aTargetName) {
+    let document = aChromeWindow.document;
+    let tooltip = document.getElementById("UITourTooltip");
+    return tooltip.getAttribute("targetName") == aTargetName && tooltip.state != "closed";
+  },
+
+  hideInfo: function(aWindow) {
+    let document = aWindow.document;
+
+    let tooltip = document.getElementById("UITourTooltip");
+    this._removeAnnotationPanelMutationObserver(tooltip);
+    tooltip.hidePopup();
+    this._setAppMenuStateForAnnotation(aWindow, "info", false);
+
+    let tooltipButtons = document.getElementById("UITourTooltipButtons");
+    while (tooltipButtons.firstChild)
+      tooltipButtons.firstChild.remove();
+  },
+
+  showMenu: function(aWindow, aMenuName, aOpenCallback = null) {
+    log.debug("showMenu:", aMenuName);
+    function openMenuButton(aMenuBtn) {
+      if (!aMenuBtn || !aMenuBtn.boxObject || aMenuBtn.open) {
+        if (aOpenCallback)
+          aOpenCallback();
+        return;
+      }
+      if (aOpenCallback)
+        aMenuBtn.addEventListener("popupshown", onPopupShown);
+      aMenuBtn.boxObject.openMenu(true);
+    }
+    function onPopupShown(event) {
+      this.removeEventListener("popupshown", onPopupShown);
+      aOpenCallback(event);
+    }
+
+    if (aMenuName == "appMenu") {
+      aWindow.PanelUI.panel.setAttribute("noautohide", "true");
+      // If the popup is already opened, don't recreate the widget as it may cause a flicker.
+      if (aWindow.PanelUI.panel.state != "open") {
+        this.recreatePopup(aWindow.PanelUI.panel);
+      }
+      aWindow.PanelUI.panel.addEventListener("popuphiding", this.hideAppMenuAnnotations);
+      aWindow.PanelUI.panel.addEventListener("ViewShowing", this.hideAppMenuAnnotations);
+      aWindow.PanelUI.panel.addEventListener("popuphidden", this.onPanelHidden);
+      if (aOpenCallback) {
+        aWindow.PanelUI.panel.addEventListener("popupshown", onPopupShown);
+      }
+      aWindow.PanelUI.show();
+    } else if (aMenuName == "bookmarks") {
+      let menuBtn = aWindow.document.getElementById("bookmarks-menu-button");
+      openMenuButton(menuBtn);
+    } else if (aMenuName == "controlCenter") {
+      let popup = aWindow.gIdentityHandler._identityPopup;
+
+      // Add the listener even if the panel is already open since it will still
+      // only get registered once even if it was UITour that opened it.
+      popup.addEventListener("popuphiding", this.hideControlCenterAnnotations);
+      popup.addEventListener("popuphidden", this.onPanelHidden);
+
+      popup.setAttribute("noautohide", true);
+      this.clearAvailableTargetsCache();
+
+      if (popup.state == "open") {
+        if (aOpenCallback) {
+          aOpenCallback();
+        }
+        return;
+      }
+
+      this.recreatePopup(popup);
+
+      // Open the control center
+      if (aOpenCallback) {
+        popup.addEventListener("popupshown", onPopupShown);
+      }
+      aWindow.document.getElementById("identity-box").click();
+    } else if (aMenuName == "pocket") {
+      this.getTarget(aWindow, "pocket").then(Task.async(function* onPocketTarget(target) {
+        let widgetGroupWrapper = CustomizableUI.getWidget(target.widgetName);
+        if (widgetGroupWrapper.type != "view" || !widgetGroupWrapper.viewId) {
+          log.error("Can't open the pocket menu without a view");
+          return;
+        }
+        let placement = CustomizableUI.getPlacementOfWidget(target.widgetName);
+        if (!placement || !placement.area) {
+          log.error("Can't open the pocket menu without a placement");
+          return;
+        }
+
+        if (placement.area == CustomizableUI.AREA_PANEL) {
+          // Open the appMenu and wait for it if it's not already opened or showing a subview.
+          yield new Promise((resolve, reject) => {
+            if (aWindow.PanelUI.panel.state != "closed") {
+              if (aWindow.PanelUI.multiView.showingSubView) {
+                reject("A subview is already showing");
+                return;
+              }
+
+              resolve();
+              return;
+            }
+
+            aWindow.PanelUI.panel.addEventListener("popupshown", function onShown() {
+              aWindow.PanelUI.panel.removeEventListener("popupshown", onShown);
+              resolve();
+            });
+
+            aWindow.PanelUI.show();
+          });
+        }
+
+        let widgetWrapper = widgetGroupWrapper.forWindow(aWindow);
+        aWindow.PanelUI.showSubView(widgetGroupWrapper.viewId,
+                                    widgetWrapper.anchor,
+                                    placement.area);
+      })).catch(log.error);
+    }
+  },
+
+  hideMenu: function(aWindow, aMenuName) {
+    log.debug("hideMenu:", aMenuName);
+    function closeMenuButton(aMenuBtn) {
+      if (aMenuBtn && aMenuBtn.boxObject)
+        aMenuBtn.boxObject.openMenu(false);
+    }
+
+    if (aMenuName == "appMenu") {
+      aWindow.PanelUI.hide();
+    } else if (aMenuName == "bookmarks") {
+      let menuBtn = aWindow.document.getElementById("bookmarks-menu-button");
+      closeMenuButton(menuBtn);
+    } else if (aMenuName == "controlCenter") {
+      let panel = aWindow.gIdentityHandler._identityPopup;
+      panel.hidePopup();
+    }
+  },
+
+  showNewTab: function(aWindow, aBrowser) {
+    aWindow.openLinkIn("about:newtab", "current", {targetBrowser: aBrowser});
+  },
+
+  hideAnnotationsForPanel: function(aEvent, aTargetPositionCallback) {
+    let win = aEvent.target.ownerGlobal;
+    let annotationElements = new Map([
+      // [annotationElement (panel), method to hide the annotation]
+      [win.document.getElementById("UITourHighlightContainer"), UITour.hideHighlight.bind(UITour)],
+      [win.document.getElementById("UITourTooltip"), UITour.hideInfo.bind(UITour)],
+    ]);
+    annotationElements.forEach((hideMethod, annotationElement) => {
+      if (annotationElement.state != "closed") {
+        let targetName = annotationElement.getAttribute("targetName");
+        UITour.getTarget(win, targetName).then((aTarget) => {
+          // Since getTarget is async, we need to make sure that the target hasn't
+          // changed since it may have just moved to somewhere outside of the app menu.
+          if (annotationElement.getAttribute("targetName") != aTarget.targetName ||
+              annotationElement.state == "closed" ||
+              !aTargetPositionCallback(aTarget)) {
+            return;
+          }
+          hideMethod(win);
+        }).catch(log.error);
+      }
+    });
+    UITour.appMenuOpenForAnnotation.clear();
+  },
+
+  hideAppMenuAnnotations: function(aEvent) {
+    UITour.hideAnnotationsForPanel(aEvent, UITour.targetIsInAppMenu);
+  },
+
+  hideControlCenterAnnotations(aEvent) {
+    UITour.hideAnnotationsForPanel(aEvent, (aTarget) => {
+      return aTarget.targetName.startsWith("controlCenter-");
+    });
+  },
+
+  onPanelHidden: function(aEvent) {
+    aEvent.target.removeAttribute("noautohide");
+    UITour.recreatePopup(aEvent.target);
+    UITour.clearAvailableTargetsCache();
+  },
+
+  recreatePopup: function(aPanel) {
+    // After changing popup attributes that relate to how the native widget is created
+    // (e.g. @noautohide) we need to re-create the frame/widget for it to take effect.
+    if (aPanel.hidden) {
+      // If the panel is already hidden, we don't need to recreate it but flush
+      // in case someone just hid it.
+      aPanel.clientWidth; // flush
+      return;
+    }
+    aPanel.hidden = true;
+    aPanel.clientWidth; // flush
+    aPanel.hidden = false;
+  },
+
+  getConfiguration: function(aMessageManager, aWindow, aConfiguration, aCallbackID) {
+    switch (aConfiguration) {
+      case "appinfo":
+        let props = ["defaultUpdateChannel", "version"];
+        let appinfo = {};
+        props.forEach(property => appinfo[property] = Services.appinfo[property]);
+
+        // Identifier of the partner repack, as stored in preference "distribution.id"
+        // and included in Firefox and other update pings. Note this is not the same as
+        // Services.appinfo.distributionID (value of MOZ_DISTRIBUTION_ID is set at build time).
+        let distribution = "default";
+        try {
+          distribution = Services.prefs.getDefaultBranch("distribution.").getCharPref("id");
+        } catch (e) {}
+        appinfo["distribution"] = distribution;
+
+        let isDefaultBrowser = null;
+        try {
+          let shell = aWindow.getShellService();
+          if (shell) {
+            isDefaultBrowser = shell.isDefaultBrowser(false);
+          }
+        } catch (e) {}
+        appinfo["defaultBrowser"] = isDefaultBrowser;
+
+        let canSetDefaultBrowserInBackground = true;
+        if (AppConstants.isPlatformAndVersionAtLeast("win", "6.2") ||
+            AppConstants.isPlatformAndVersionAtLeast("macosx", "10.10")) {
+          canSetDefaultBrowserInBackground = false;
+        } else if (AppConstants.platform == "linux") {
+          // The ShellService may not exist on some versions of Linux.
+          try {
+            aWindow.getShellService();
+          } catch (e) {
+            canSetDefaultBrowserInBackground = null;
+          }
+        }
+
+        appinfo["canSetDefaultBrowserInBackground"] =
+          canSetDefaultBrowserInBackground;
+
+        this.sendPageCallback(aMessageManager, aCallbackID, appinfo);
+        break;
+      case "availableTargets":
+        this.getAvailableTargets(aMessageManager, aWindow, aCallbackID);
+        break;
+      case "search":
+      case "selectedSearchEngine":
+        Services.search.init(rv => {
+          let data;
+          if (Components.isSuccessCode(rv)) {
+            let engines = Services.search.getVisibleEngines();
+            data = {
+              searchEngineIdentifier: Services.search.defaultEngine.identifier,
+              engines: engines.filter((engine) => engine.identifier)
+                              .map((engine) => TARGET_SEARCHENGINE_PREFIX + engine.identifier)
+            };
+          } else {
+            data = {engines: [], searchEngineIdentifier: ""};
+          }
+          this.sendPageCallback(aMessageManager, aCallbackID, data);
+        });
+        break;
+      case "sync":
+        this.sendPageCallback(aMessageManager, aCallbackID, {
+          setup: Services.prefs.prefHasUserValue("services.sync.username"),
+          desktopDevices: Preferences.get("services.sync.clients.devices.desktop", 0),
+          mobileDevices: Preferences.get("services.sync.clients.devices.mobile", 0),
+          totalDevices: Preferences.get("services.sync.numClients", 0),
+        });
+        break;
+      case "canReset":
+        this.sendPageCallback(aMessageManager, aCallbackID, ResetProfile.resetSupported());
+        break;
+      default:
+        log.error("getConfiguration: Unknown configuration requested: " + aConfiguration);
+        break;
+    }
+  },
+
+  setConfiguration: function(aWindow, aConfiguration, aValue) {
+    switch (aConfiguration) {
+      case "defaultBrowser":
+        // Ignore aValue in this case because the default browser can only
+        // be set, not unset.
+        try {
+          let shell = aWindow.getShellService();
+          if (shell) {
+            shell.setDefaultBrowser(true, false);
+          }
+        } catch (e) {}
+        break;
+      default:
+        log.error("setConfiguration: Unknown configuration requested: " + aConfiguration);
+        break;
+    }
+  },
+
+  getAvailableTargets: function(aMessageManager, aChromeWindow, aCallbackID) {
+    Task.spawn(function*() {
+      let window = aChromeWindow;
+      let data = this.availableTargetsCache.get(window);
+      if (data) {
+        log.debug("getAvailableTargets: Using cached targets list", data.targets.join(","));
+        this.sendPageCallback(aMessageManager, aCallbackID, data);
+        return;
+      }
+
+      let promises = [];
+      for (let targetName of this.targets.keys()) {
+        promises.push(this.getTarget(window, targetName));
+      }
+      let targetObjects = yield Promise.all(promises);
+
+      let targetNames = [];
+      for (let targetObject of targetObjects) {
+        if (targetObject.node)
+          targetNames.push(targetObject.targetName);
+      }
+
+      data = {
+        targets: targetNames,
+      };
+      this.availableTargetsCache.set(window, data);
+      this.sendPageCallback(aMessageManager, aCallbackID, data);
+    }.bind(this)).catch(err => {
+      log.error(err);
+      this.sendPageCallback(aMessageManager, aCallbackID, {
+        targets: [],
+      });
+    });
+  },
+
+  startSubTour: function (aFeature) {
+    if (aFeature != "string") {
+      log.error("startSubTour: No feature option specified");
+      return;
+    }
+
+    if (aFeature == "readinglist") {
+      ReaderParent.showReaderModeInfoPanel(browser);
+    } else {
+      log.error("startSubTour: Unknown feature option specified");
+      return;
+    }
+  },
+
+  addNavBarWidget: function (aTarget, aMessageManager, aCallbackID) {
+    if (aTarget.node) {
+      log.error("addNavBarWidget: can't add a widget already present:", aTarget);
+      return;
+    }
+    if (!aTarget.allowAdd) {
+      log.error("addNavBarWidget: not allowed to add this widget:", aTarget);
+      return;
+    }
+    if (!aTarget.widgetName) {
+      log.error("addNavBarWidget: can't add a widget without a widgetName property:", aTarget);
+      return;
+    }
+
+    CustomizableUI.addWidgetToArea(aTarget.widgetName, CustomizableUI.AREA_NAVBAR);
+    this.sendPageCallback(aMessageManager, aCallbackID);
+  },
+
+  _addAnnotationPanelMutationObserver: function(aPanelEl) {
+    if (AppConstants.platform == "linux") {
+      let observer = this._annotationPanelMutationObservers.get(aPanelEl);
+      if (observer) {
+        return;
+      }
+      let win = aPanelEl.ownerGlobal;
+      observer = new win.MutationObserver(this._annotationMutationCallback);
+      this._annotationPanelMutationObservers.set(aPanelEl, observer);
+      let observerOptions = {
+        attributeFilter: ["height", "width"],
+        attributes: true,
+      };
+      observer.observe(aPanelEl, observerOptions);
+    }
+  },
+
+  _removeAnnotationPanelMutationObserver: function(aPanelEl) {
+    if (AppConstants.platform == "linux") {
+      let observer = this._annotationPanelMutationObservers.get(aPanelEl);
+      if (observer) {
+        observer.disconnect();
+        this._annotationPanelMutationObservers.delete(aPanelEl);
+      }
+    }
+  },
+
+/**
+ * Workaround for Ubuntu panel craziness in bug 970788 where incorrect sizes get passed to
+ * nsXULPopupManager::PopupResized and lead to incorrect width and height attributes getting
+ * set on the panel.
+ */
+  _annotationMutationCallback: function(aMutations) {
+    for (let mutation of aMutations) {
+      // Remove both attributes at once and ignore remaining mutations to be proccessed.
+      mutation.target.removeAttribute("width");
+      mutation.target.removeAttribute("height");
+      return;
+    }
+  },
+
+  selectSearchEngine(aID) {
+    return new Promise((resolve, reject) => {
+      Services.search.init((rv) => {
+        if (!Components.isSuccessCode(rv)) {
+          reject("selectSearchEngine: search service init failed: " + rv);
+          return;
+        }
+
+        let engines = Services.search.getVisibleEngines();
+        for (let engine of engines) {
+          if (engine.identifier == aID) {
+            Services.search.defaultEngine = engine;
+            resolve();
+            return;
+          }
+        }
+        reject("selectSearchEngine could not find engine with given ID");
+        return;
+      });
+    });
+  },
+
+  notify(eventName, params) {
+    let winEnum = Services.wm.getEnumerator("navigator:browser");
+    while (winEnum.hasMoreElements()) {
+      let window = winEnum.getNext();
+      if (window.closed)
+        continue;
+
+      let openTourBrowsers = this.tourBrowsersByWindow.get(window);
+      if (!openTourBrowsers)
+        continue;
+
+      for (let browser of openTourBrowsers) {
+        let messageManager = browser.messageManager;
+        if (!messageManager) {
+          log.error("notify: Trying to notify a browser without a messageManager", browser);
+          continue;
+        }
+        let detail = {
+          event: eventName,
+          params: params,
+        };
+        messageManager.sendAsyncMessage("UITour:SendPageNotification", detail);
+      }
+    }
+  },
+};
+
+function controlCenterTrackingToggleTarget(aUnblock) {
+  return {
+    infoPanelPosition: "rightcenter topleft",
+    query(aDocument) {
+      let popup = aDocument.defaultView.gIdentityHandler._identityPopup;
+      if (popup.state != "open") {
+        return null;
+      }
+      let buttonId = null;
+      if (aUnblock) {
+        if (PrivateBrowsingUtils.isWindowPrivate(aDocument.defaultView)) {
+          buttonId = "tracking-action-unblock-private";
+        } else {
+          buttonId = "tracking-action-unblock";
+        }
+      } else {
+        buttonId = "tracking-action-block";
+      }
+      let element = aDocument.getElementById(buttonId);
+      return UITour.isElementVisible(element) ? element : null;
+    },
+  };
+}
+
+this.UITour.init();
+
+/**
+ * UITour Health Report
+ */
+/**
+ * Public API to be called by the UITour code
+ */
+const UITourHealthReport = {
+  recordTreatmentTag: function(tag, value) {
+    return TelemetryController.submitExternalPing("uitour-tag",
+      {
+        version: 1,
+        tagName: tag,
+        tagValue: value,
+      },
+      {
+        addClientId: true,
+        addEnvironment: true,
+      });
+  }
+};
diff --git a/application/basilisk/components/uitour/content-UITour.js b/application/basilisk/components/uitour/content-UITour.js
new file mode 100644
index 000000000..c33d687e8
--- /dev/null
+++ b/application/basilisk/components/uitour/content-UITour.js
@@ -0,0 +1,103 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+var {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
+
+const PREF_TEST_WHITELIST = "browser.uitour.testingOrigins";
+const UITOUR_PERMISSION   = "uitour";
+
+var UITourListener = {
+  handleEvent: function (event) {
+    if (!Services.prefs.getBoolPref("browser.uitour.enabled")) {
+      return;
+    }
+    if (!this.ensureTrustedOrigin()) {
+      return;
+    }
+    addMessageListener("UITour:SendPageCallback", this);
+    addMessageListener("UITour:SendPageNotification", this);
+    sendAsyncMessage("UITour:onPageEvent", {
+      detail: event.detail,
+      type: event.type,
+      pageVisibilityState: content.document.visibilityState,
+    });
+  },
+
+  isTestingOrigin: function(aURI) {
+    if (Services.prefs.getPrefType(PREF_TEST_WHITELIST) != Services.prefs.PREF_STRING) {
+      return false;
+    }
+
+    // Add any testing origins (comma-seperated) to the whitelist for the session.
+    for (let origin of Services.prefs.getCharPref(PREF_TEST_WHITELIST).split(",")) {
+      try {
+        let testingURI = Services.io.newURI(origin, null, null);
+        if (aURI.prePath == testingURI.prePath) {
+          return true;
+        }
+      } catch (ex) {
+        Cu.reportError(ex);
+      }
+    }
+    return false;
+  },
+
+  // This function is copied from UITour.jsm.
+  isSafeScheme: function(aURI) {
+    let allowedSchemes = new Set(["https", "about"]);
+    if (!Services.prefs.getBoolPref("browser.uitour.requireSecure"))
+      allowedSchemes.add("http");
+
+    if (!allowedSchemes.has(aURI.scheme))
+      return false;
+
+    return true;
+  },
+
+  ensureTrustedOrigin: function() {
+    if (content.top != content)
+      return false;
+
+    let uri = content.document.documentURIObject;
+
+    if (uri.schemeIs("chrome"))
+      return true;
+
+    if (!this.isSafeScheme(uri))
+      return false;
+
+    let permission = Services.perms.testPermission(uri, UITOUR_PERMISSION);
+    if (permission == Services.perms.ALLOW_ACTION)
+      return true;
+
+    return this.isTestingOrigin(uri);
+  },
+
+  receiveMessage: function(aMessage) {
+    switch (aMessage.name) {
+      case "UITour:SendPageCallback":
+        this.sendPageEvent("Response", aMessage.data);
+        break;
+      case "UITour:SendPageNotification":
+        this.sendPageEvent("Notification", aMessage.data);
+        break;
+      }
+  },
+
+  sendPageEvent: function (type, detail) {
+    if (!this.ensureTrustedOrigin()) {
+      return;
+    }
+
+    let doc = content.document;
+    let eventName = "mozUITour" + type;
+    let event = new doc.defaultView.CustomEvent(eventName, {
+      bubbles: true,
+      detail: Cu.cloneInto(detail, doc.defaultView)
+    });
+    doc.dispatchEvent(event);
+  }
+};
+
+addEventListener("mozUITour", UITourListener, false, true);
diff --git a/application/basilisk/components/uitour/jar.mn b/application/basilisk/components/uitour/jar.mn
new file mode 100644
index 000000000..966a69c96
--- /dev/null
+++ b/application/basilisk/components/uitour/jar.mn
@@ -0,0 +1,6 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+browser.jar:
+       content/browser/content-UITour.js
diff --git a/application/basilisk/components/uitour/moz.build b/application/basilisk/components/uitour/moz.build
new file mode 100644
index 000000000..c8b1450b9
--- /dev/null
+++ b/application/basilisk/components/uitour/moz.build
@@ -0,0 +1,9 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+EXTRA_JS_MODULES += [
+    'UITour.jsm',
+]
+
+JAR_MANIFESTS += ['jar.mn']
diff --git a/application/basilisk/components/webextensions/extension-win-panel.css b/application/basilisk/components/webextensions/extension-win-panel.css
index 9da6da14c..ddafe3ea5 100644
--- a/application/basilisk/components/webextensions/extension-win-panel.css
+++ b/application/basilisk/components/webextensions/extension-win-panel.css
@@ -1,4 +1,6 @@
-@media (-moz-os-version: windows-win7) {
+@media (-moz-os-version: windows-xp),
+       (-moz-os-version: windows-vista),
+       (-moz-os-version: windows-win7) {
   body {
     border-radius: 4px;
   }
diff --git a/application/basilisk/config/mozconfigs/win32/common-opt b/application/basilisk/config/mozconfigs/win32/common-opt
index 816c8926a..d43a9878b 100644
--- a/application/basilisk/config/mozconfigs/win32/common-opt
+++ b/application/basilisk/config/mozconfigs/win32/common-opt
@@ -4,6 +4,7 @@
 
 ac_add_options --enable-update-channel=${MOZ_UPDATE_CHANNEL}
 ac_add_options --enable-jemalloc
+ac_add_options --enable-require-all-d3dc-versions
 
 if [ -f /c/builds/gapi.data ]; then
   _gapi_keyfile=c:/builds/gapi.data
diff --git a/application/basilisk/config/mozconfigs/win32/debug b/application/basilisk/config/mozconfigs/win32/debug
index 815276d0f..6beee93c2 100644
--- a/application/basilisk/config/mozconfigs/win32/debug
+++ b/application/basilisk/config/mozconfigs/win32/debug
@@ -6,6 +6,7 @@ ac_add_options --enable-debug
 ac_add_options --enable-dmd
 ac_add_options --enable-profiling  # needed for --enable-dmd to work on Windows
 ac_add_options --enable-verify-mar
+ac_add_options --enable-require-all-d3dc-versions
 
 # Needed to enable breakpad in application.ini
 export MOZILLA_OFFICIAL=1
diff --git a/application/basilisk/installer/Makefile.in b/application/basilisk/installer/Makefile.in
index 4de368db7..f1489c45d 100644
--- a/application/basilisk/installer/Makefile.in
+++ b/application/basilisk/installer/Makefile.in
@@ -57,6 +57,9 @@ DEFINES += -DMOZ_ANGLE_RENDERER=$(MOZ_ANGLE_RENDERER)
 ifdef MOZ_D3DCOMPILER_VISTA_DLL
 DEFINES += -DMOZ_D3DCOMPILER_VISTA_DLL=$(MOZ_D3DCOMPILER_VISTA_DLL)
 endif
+ifdef MOZ_D3DCOMPILER_XP_DLL
+DEFINES += -DMOZ_D3DCOMPILER_XP_DLL=$(MOZ_D3DCOMPILER_XP_DLL)
+endif
 endif
 
 DEFINES += -DMOZ_CHILD_PROCESS_NAME=$(MOZ_CHILD_PROCESS_NAME)
diff --git a/application/basilisk/installer/allowed-dupes.mn b/application/basilisk/installer/allowed-dupes.mn
index 7baa6ebed..366842598 100644
--- a/application/basilisk/installer/allowed-dupes.mn
+++ b/application/basilisk/installer/allowed-dupes.mn
@@ -171,7 +171,7 @@ chrome/toolkit/skin/classic/global/dialog.css
 chrome/toolkit/skin/classic/global/dropmarker.css
 chrome/toolkit/skin/classic/global/global.css
 chrome/toolkit/skin/classic/global/groupbox.css
-chrome/toolkit/skin/classic/global/icons/close-win7.png
+chrome/toolkit/skin/classic/global/icons/close-XPVista7.png
 chrome/toolkit/skin/classic/global/icons/tabprompts-bgtexture.png
 chrome/toolkit/skin/classic/global/listbox.css
 chrome/toolkit/skin/classic/global/media/clicktoplay-bgtexture.png
@@ -196,6 +196,7 @@ chrome/toolkit/skin/classic/global/toolbarbutton.css
 chrome/toolkit/skin/classic/global/tree.css
 chrome/toolkit/skin/classic/global/wizard.css
 chrome/toolkit/skin/classic/mozapps/downloads/buttons.png
+chrome/toolkit/skin/classic/mozapps/downloads/downloadButtons-XP.png
 chrome/toolkit/skin/classic/mozapps/downloads/downloadButtons.png
 chrome/toolkit/skin/classic/mozapps/extensions/category-dictionaries.png
 chrome/toolkit/skin/classic/mozapps/extensions/category-experiments.png
@@ -208,6 +209,7 @@ chrome/toolkit/skin/classic/mozapps/extensions/localeGeneric.png
 chrome/toolkit/skin/classic/mozapps/extensions/category-extensions.png
 chrome/toolkit/skin/classic/mozapps/extensions/extensionGeneric.png
 chrome/toolkit/skin/classic/mozapps/update/buttons.png
+chrome/toolkit/skin/classic/mozapps/update/downloadButtons-XP.png
 chrome/toolkit/skin/classic/mozapps/update/downloadButtons.png
 chrome/toolkit/skin/classic/mozapps/xpinstall/xpinstallItemGeneric.png
 
diff --git a/application/basilisk/installer/package-manifest.in b/application/basilisk/installer/package-manifest.in
index 27dfc4e05..9e48ae3a7 100644
--- a/application/basilisk/installer/package-manifest.in
+++ b/application/basilisk/installer/package-manifest.in
@@ -596,6 +596,10 @@
 #ifdef MOZ_D3DCOMPILER_VISTA_DLL
 @BINPATH@/@MOZ_D3DCOMPILER_VISTA_DLL@
 #endif
+
+#ifdef MOZ_D3DCOMPILER_XP_DLL
+@BINPATH@/@MOZ_D3DCOMPILER_XP_DLL@
+#endif
 #endif # MOZ_ANGLE_RENDERER
 
 ; [Browser Chrome Files]
@@ -726,10 +730,7 @@
 #endif
 @BINPATH@/@DLL_PREFIX@softokn3@DLL_SUFFIX@
 #endif
-@RESPATH@/chrome/pippki@JAREXT@
-@RESPATH@/chrome/pippki.manifest
 @RESPATH@/components/pipnss.xpt
-@RESPATH@/components/pippki.xpt
 
 ; for Solaris SPARC
 #ifdef SOLARIS
diff --git a/application/basilisk/installer/windows/nsis/defines.nsi.in b/application/basilisk/installer/windows/nsis/defines.nsi.in
index 5ad9b7966..d0f0c443a 100644
--- a/application/basilisk/installer/windows/nsis/defines.nsi.in
+++ b/application/basilisk/installer/windows/nsis/defines.nsi.in
@@ -63,7 +63,7 @@
 !define MinSupportedVer "Microsoft Windows 7 x64"
 #else
 !define ARCH "x86"
-!define MinSupportedVer "Microsoft Windows 7"
+!define MinSupportedVer "Microsoft Windows XP SP2"
 #endif
 
 !define MinSupportedCPU "SSE2"
diff --git a/application/basilisk/locales/en-US/chrome/browser/baseMenuOverlay.dtd b/application/basilisk/locales/en-US/chrome/browser/baseMenuOverlay.dtd
index 1079c3cef..de92ad3aa 100644
--- a/application/basilisk/locales/en-US/chrome/browser/baseMenuOverlay.dtd
+++ b/application/basilisk/locales/en-US/chrome/browser/baseMenuOverlay.dtd
@@ -37,6 +37,9 @@
 <!ENTITY helpFeedbackPage.label      "Submit Feedback…">
 <!ENTITY helpFeedbackPage.accesskey  "S">
 
+<!ENTITY helpShowTour2.label            "&brandShorterName; Tour">
+<!ENTITY helpShowTour2.accesskey        "o">
+
 <!ENTITY preferencesCmdMac.label        "Preferences…">
 <!ENTITY preferencesCmdMac.commandkey   ",">
 
diff --git a/application/basilisk/locales/en-US/chrome/browser/browser.dtd b/application/basilisk/locales/en-US/chrome/browser/browser.dtd
index 0b2e41612..1045977e8 100644
--- a/application/basilisk/locales/en-US/chrome/browser/browser.dtd
+++ b/application/basilisk/locales/en-US/chrome/browser/browser.dtd
@@ -828,6 +828,8 @@ you can use these alternative items. Otherwise, their values should be empty.  -
      a CSS length value. -->
 <!ENTITY pluginNotification.width "28em">
 
+<!ENTITY uiTour.infoPanel.close "Close">
+
 <!ENTITY appMenuSidebars.label         "Sidebars">
 
 <!-- LOCALIZATION NOTE: (panicButton.view.mainTimeframeDesc, panicButton.view.5min, panicButton.view.2hr, panicButton.view.day):
diff --git a/application/basilisk/locales/en-US/chrome/browser/browser.properties b/application/basilisk/locales/en-US/chrome/browser/browser.properties
index 8f4036dcd..f514efb86 100644
--- a/application/basilisk/locales/en-US/chrome/browser/browser.properties
+++ b/application/basilisk/locales/en-US/chrome/browser/browser.properties
@@ -336,6 +336,15 @@ identity.identified.state_and_country=%S, %S
 
 identity.icon.tooltip=Show site information
 
+trackingProtection.intro.title=How Tracking Protection works
+# LOCALIZATION NOTE (trackingProtection.intro.description2):
+# %S is brandShortName. This string should match the one from Step 1 of the tour
+# when it starts from the button shown when a new private window is opened.
+trackingProtection.intro.description2=When you see the shield, %S is blocking some parts of the page that could track your browsing activity.
+# LOCALIZATION NOTE (trackingProtection.intro.step1of3): Indicates that the intro panel is step one of three in a tour.
+trackingProtection.intro.step1of3=1 of 3
+trackingProtection.intro.nextButton.label=Next
+
 trackingProtection.icon.activeTooltip=Tracking attempts blocked
 trackingProtection.icon.disabledTooltip=Tracking content detected
 
@@ -597,6 +606,13 @@ flashHang.message = %S changed some Adobe Flash settings to improve performance.
 flashHang.helpButton.label = Learn More…
 flashHang.helpButton.accesskey = L
 
+# LOCALIZATION NOTE(customizeTips.tip0): %1$S will be replaced with the text defined
+# in customizeTips.tip0.hint, %2$S will be replaced with brandShortName, %3$S will
+# be replaced with a hyperlink containing the text defined in customizeTips.tip0.learnMore.
+customizeTips.tip0 = %1$S: You can customize %2$S to work the way you do. Simply drag any of the above to the menu or toolbar. %3$S about customizing %2$S.
+customizeTips.tip0.hint = Hint
+customizeTips.tip0.learnMore = Learn more
+
 # LOCALIZATION NOTE (customizeMode.tabTitle): %S is brandShortName
 customizeMode.tabTitle = Customize %S
 
@@ -697,8 +713,11 @@ pendingCrashReports.alwaysSend = Always Send
 decoder.noCodecs.button = Learn how
 decoder.noCodecs.accesskey = L
 decoder.noCodecs.message = To play video, you may need to install Microsoft’s Media Feature Pack.
+decoder.noCodecsVista.message = To play video, you may need to install Microsoft’s Platform Update Supplement for Windows Vista.
+decoder.noCodecsXP.message = To play video, you may need to enable Adobe’s Primetime Content Decryption Module.
 decoder.noCodecsLinux.message = To play video, you may need to install the required video codecs.
 decoder.noHWAcceleration.message = To improve video quality, you may need to install Microsoft’s Media Feature Pack.
+decoder.noHWAccelerationVista.message = To improve video quality, you may need to install Microsoft’s Platform Update Supplement for Windows Vista.
 decoder.noPulseAudio.message = To play audio, you may need to install the required PulseAudio software.
 decoder.unsupportedLibavcodec.message = libavcodec may be vulnerable or is not supported, and should be updated to play video.
 
diff --git a/application/basilisk/modules/BrowserUITelemetry.jsm b/application/basilisk/modules/BrowserUITelemetry.jsm
index 2b7cc8c20..2ad319f1a 100644
--- a/application/basilisk/modules/BrowserUITelemetry.jsm
+++ b/application/basilisk/modules/BrowserUITelemetry.jsm
@@ -17,6 +17,8 @@ XPCOMUtils.defineLazyModuleGetter(this, "RecentWindow",
   "resource:///modules/RecentWindow.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "CustomizableUI",
   "resource:///modules/CustomizableUI.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "UITour",
+  "resource:///modules/UITour.jsm");
 XPCOMUtils.defineLazyGetter(this, "Timer", function() {
   let timer = {};
   Cu.import("resource://gre/modules/Timer.jsm", timer);
@@ -172,6 +174,11 @@ this.BrowserUITelemetry = {
                                          this.getToolbarMeasures.bind(this));
     UITelemetry.addSimpleMeasureFunction("contextmenu",
                                          this.getContextMenuInfo.bind(this));
+    // Ensure that UITour.jsm remains lazy-loaded, yet always registers its
+    // simple measure function with UITelemetry.
+    UITelemetry.addSimpleMeasureFunction("UITour",
+                                         () => UITour.getTelemetry());
+
     UITelemetry.addSimpleMeasureFunction("syncstate",
                                          this.getSyncState.bind(this));
 
diff --git a/application/basilisk/modules/SelfSupportBackend.jsm b/application/basilisk/modules/SelfSupportBackend.jsm
new file mode 100644
index 000000000..3a3f8cb8b
--- /dev/null
+++ b/application/basilisk/modules/SelfSupportBackend.jsm
@@ -0,0 +1,331 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+this.EXPORTED_SYMBOLS = ["SelfSupportBackend"];
+
+const Cu = Components.utils;
+const Cc = Components.classes;
+const Ci = Components.interfaces;
+
+Cu.import("resource://gre/modules/Log.jsm");
+Cu.import("resource://gre/modules/Preferences.jsm");
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/Timer.jsm");
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+XPCOMUtils.defineLazyModuleGetter(this, "HiddenFrame",
+  "resource:///modules/HiddenFrame.jsm");
+
+// Enables or disables the Self Support.
+const PREF_ENABLED = "browser.selfsupport.enabled";
+// Url to open in the Self Support browser, in the urlFormatter service format.
+const PREF_URL = "browser.selfsupport.url";
+// Unified Telemetry status.
+const PREF_TELEMETRY_UNIFIED = "toolkit.telemetry.unified";
+// UITour status.
+const PREF_UITOUR_ENABLED = "browser.uitour.enabled";
+
+// Controls the interval at which the self support page tries to reload in case of
+// errors.
+const RETRY_INTERVAL_MS = 30000;
+// Maximum number of SelfSupport page load attempts in case of failure.
+const MAX_RETRIES = 5;
+// The delay after which to load the self-support, at startup.
+const STARTUP_DELAY_MS = 5000;
+
+const LOGGER_NAME = "Browser.SelfSupportBackend";
+const PREF_BRANCH_LOG = "browser.selfsupport.log.";
+const PREF_LOG_LEVEL = PREF_BRANCH_LOG + "level";
+const PREF_LOG_DUMP = PREF_BRANCH_LOG + "dump";
+
+const HTML_NS = "http://www.w3.org/1999/xhtml";
+const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
+
+const UITOUR_FRAME_SCRIPT = "chrome://browser/content/content-UITour.js";
+
+// Whether the FHR/Telemetry unification features are enabled.
+// Changing this pref requires a restart.
+const IS_UNIFIED_TELEMETRY = Preferences.get(PREF_TELEMETRY_UNIFIED, false);
+
+var gLogAppenderDump = null;
+
+this.SelfSupportBackend = Object.freeze({
+  init: function () {
+    SelfSupportBackendInternal.init();
+  },
+
+  uninit: function () {
+    SelfSupportBackendInternal.uninit();
+  },
+});
+
+var SelfSupportBackendInternal = {
+  // The browser element that will load the SelfSupport page.
+  _browser: null,
+  // The Id of the timer triggering delayed SelfSupport page load.
+  _delayedLoadTimerId: null,
+  // The HiddenFrame holding the _browser element.
+  _frame: null,
+  _log: null,
+  _progressListener: null,
+
+  /**
+   * Initializes the self support backend.
+   */
+  init: function () {
+    this._configureLogging();
+
+    this._log.trace("init");
+
+    Preferences.observe(PREF_BRANCH_LOG, this._configureLogging, this);
+
+    // Only allow to use SelfSupport if Unified Telemetry is enabled.
+    let reportingEnabled = IS_UNIFIED_TELEMETRY;
+    if (!reportingEnabled) {
+      this._log.config("init - Disabling SelfSupport because FHR and Unified Telemetry are disabled.");
+      return;
+    }
+
+    // Make sure UITour is enabled.
+    let uiTourEnabled = Preferences.get(PREF_UITOUR_ENABLED, false);
+    if (!uiTourEnabled) {
+      this._log.config("init - Disabling SelfSupport because UITour is disabled.");
+      return;
+    }
+
+    // Check the preferences to see if we want this to be active.
+    if (!Preferences.get(PREF_ENABLED, true)) {
+      this._log.config("init - SelfSupport is disabled.");
+      return;
+    }
+
+    Services.obs.addObserver(this, "sessionstore-windows-restored", false);
+  },
+
+  /**
+   * Shut down the self support backend, if active.
+   */
+  uninit: function () {
+    this._log.trace("uninit");
+
+    Preferences.ignore(PREF_BRANCH_LOG, this._configureLogging, this);
+
+    // Cancel delayed loading, if still active, when shutting down.
+    clearTimeout(this._delayedLoadTimerId);
+
+    // Dispose of the hidden browser.
+    if (this._browser !== null) {
+      if (this._browser.contentWindow) {
+        this._browser.contentWindow.removeEventListener("DOMWindowClose", this, true);
+      }
+
+      if (this._progressListener) {
+        this._browser.removeProgressListener(this._progressListener);
+        this._progressListener.destroy();
+        this._progressListener = null;
+      }
+
+      this._browser.remove();
+      this._browser = null;
+    }
+
+    if (this._frame) {
+      this._frame.destroy();
+      this._frame = null;
+    }
+  },
+
+  /**
+   * Handle notifications. Once all windows are created, we wait a little bit more
+   * since tabs might still be loading. Then, we open the self support.
+   */
+  observe: function (aSubject, aTopic, aData) {
+    this._log.trace("observe - Topic " + aTopic);
+
+    if (aTopic === "sessionstore-windows-restored") {
+      Services.obs.removeObserver(this, "sessionstore-windows-restored");
+      this._delayedLoadTimerId = setTimeout(this._loadSelfSupport.bind(this), STARTUP_DELAY_MS);
+    }
+  },
+
+  /**
+   * Configure the logger based on the preferences.
+   */
+  _configureLogging: function() {
+    if (!this._log) {
+      this._log = Log.repository.getLogger(LOGGER_NAME);
+
+      // Log messages need to go to the browser console.
+      let consoleAppender = new Log.ConsoleAppender(new Log.BasicFormatter());
+      this._log.addAppender(consoleAppender);
+    }
+
+    // Make sure the logger keeps up with the logging level preference.
+    this._log.level = Log.Level[Preferences.get(PREF_LOG_LEVEL, "Warn")];
+
+    // If enabled in the preferences, add a dump appender.
+    let logDumping = Preferences.get(PREF_LOG_DUMP, false);
+    if (logDumping != !!gLogAppenderDump) {
+      if (logDumping) {
+        gLogAppenderDump = new Log.DumpAppender(new Log.BasicFormatter());
+        this._log.addAppender(gLogAppenderDump);
+      } else {
+        this._log.removeAppender(gLogAppenderDump);
+        gLogAppenderDump = null;
+      }
+    }
+  },
+
+  /**
+   * Create an hidden frame to host our |browser|, then load the SelfSupport page in it.
+   * @param aURL The URL to load in the browser.
+   */
+  _makeHiddenBrowser: function(aURL) {
+    this._frame = new HiddenFrame();
+    return this._frame.get().then(aFrame => {
+      let doc = aFrame.document;
+
+      this._browser = doc.createElementNS(XUL_NS, "browser");
+      this._browser.setAttribute("type", "content");
+      this._browser.setAttribute("disableglobalhistory", "true");
+      this._browser.setAttribute("src", aURL);
+
+      doc.documentElement.appendChild(this._browser);
+    });
+  },
+
+  handleEvent: function(aEvent) {
+    this._log.trace("handleEvent - aEvent.type " + aEvent.type + ", Trusted " + aEvent.isTrusted);
+
+    if (aEvent.type === "DOMWindowClose") {
+      let window = this._browser.contentDocument.defaultView;
+      let target = aEvent.target;
+
+      if (target == window) {
+        // preventDefault stops the default window.close(). We need to do that to prevent
+        // Services.appShell.hiddenDOMWindow from being destroyed.
+        aEvent.preventDefault();
+
+        this.uninit();
+      }
+    }
+  },
+
+  /**
+   * Called when the self support page correctly loads.
+   */
+  _pageSuccessCallback: function() {
+    this._log.debug("_pageSuccessCallback - Page correctly loaded.");
+    this._browser.removeProgressListener(this._progressListener);
+    this._progressListener.destroy();
+    this._progressListener = null;
+
+    // Allow SelfSupportBackend to catch |window.close()| issued by the content.
+    this._browser.contentWindow.addEventListener("DOMWindowClose", this, true);
+  },
+
+  /**
+   * Called when the self support page fails to load.
+   */
+  _pageLoadErrorCallback: function() {
+    this._log.info("_pageLoadErrorCallback - Too many failed load attempts. Giving up.");
+    this.uninit();
+  },
+
+  /**
+   * Create a browser and attach it to an hidden window. The browser will contain the
+   * self support page and attempt to load the page content. If loading fails, try again
+   * after an interval.
+   */
+  _loadSelfSupport: function() {
+    // Fetch the Self Support URL from the preferences.
+    let unformattedURL = Preferences.get(PREF_URL, null);
+    let url = Services.urlFormatter.formatURL(unformattedURL);
+    if (!url.startsWith("https:")) {
+      this._log.error("_loadSelfSupport - Non HTTPS URL provided: " + url);
+      return;
+    }
+
+    this._log.config("_loadSelfSupport - URL " + url);
+
+    // Create the hidden browser.
+    this._makeHiddenBrowser(url).then(() => {
+      // Load UITour frame script.
+      this._browser.messageManager.loadFrameScript(UITOUR_FRAME_SCRIPT, true);
+
+      // We need to watch for load errors as well and, in case, try to reload
+      // the self support page.
+      const webFlags = Ci.nsIWebProgress.NOTIFY_STATE_WINDOW |
+                       Ci.nsIWebProgress.NOTIFY_STATE_REQUEST |
+                       Ci.nsIWebProgress.NOTIFY_LOCATION;
+
+      this._progressListener = new ProgressListener(() => this._pageLoadErrorCallback(),
+                                                    () => this._pageSuccessCallback());
+
+      this._browser.addProgressListener(this._progressListener, webFlags);
+    });
+  }
+};
+
+/**
+ * A progress listener object which notifies of page load error and load success
+ * through callbacks. When the page fails to load, the progress listener tries to
+ * reload it up to MAX_RETRIES times. The page is not loaded again immediately, but
+ * after a timeout.
+ *
+ * @param aLoadErrorCallback Called when a page failed to load MAX_RETRIES times.
+ * @param aLoadSuccessCallback Called when a page correctly loads.
+ */
+function ProgressListener(aLoadErrorCallback, aLoadSuccessCallback) {
+  this._loadErrorCallback = aLoadErrorCallback;
+  this._loadSuccessCallback = aLoadSuccessCallback;
+  // The number of page loads attempted.
+  this._loadAttempts = 0;
+  this._log = Log.repository.getLogger(LOGGER_NAME);
+  // The Id of the timer which triggers page load again in case of errors.
+  this._reloadTimerId = null;
+}
+
+ProgressListener.prototype = {
+  onLocationChange: function(aWebProgress, aRequest, aLocation, aFlags) {
+    if (aFlags & Ci.nsIWebProgressListener.LOCATION_CHANGE_ERROR_PAGE) {
+      this._log.warn("onLocationChange - There was a problem fetching the SelfSupport URL (attempt " +
+                     this._loadAttempts + ").");
+
+      // Increase the number of attempts and bail out if we failed too many times.
+      this._loadAttempts++;
+      if (this._loadAttempts > MAX_RETRIES) {
+        this._loadErrorCallback();
+        return;
+      }
+
+      // Reload the page after the retry interval expires. The interval is multiplied
+      // by the number of attempted loads, so that it takes a bit more to try to reload
+      // when frequently failing.
+      this._reloadTimerId = setTimeout(() => {
+        this._log.debug("onLocationChange - Reloading SelfSupport URL in the hidden browser.");
+        aWebProgress.DOMWindow.location.reload();
+      }, RETRY_INTERVAL_MS * this._loadAttempts);
+    }
+  },
+
+  onStateChange: function (aWebProgress, aRequest, aFlags, aStatus) {
+    if (aFlags & Ci.nsIWebProgressListener.STATE_STOP &&
+        aFlags & Ci.nsIWebProgressListener.STATE_IS_NETWORK &&
+        aFlags & Ci.nsIWebProgressListener.STATE_IS_WINDOW &&
+        Components.isSuccessCode(aStatus)) {
+      this._loadSuccessCallback();
+    }
+  },
+
+  destroy: function () {
+    // Make sure we don't try to reload self support when shutting down.
+    clearTimeout(this._reloadTimerId);
+  },
+
+  QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebProgressListener,
+                                         Ci.nsISupportsWeakReference]),
+};
diff --git a/application/basilisk/modules/moz.build b/application/basilisk/modules/moz.build
index 684f662d7..a7bbbc258 100644
--- a/application/basilisk/modules/moz.build
+++ b/application/basilisk/modules/moz.build
@@ -33,6 +33,7 @@ EXTRA_JS_MODULES += [
     'RecentWindow.jsm',
     'RemotePrompt.jsm',
     'Sanitizer.jsm',
+    'SelfSupportBackend.jsm',
     'SitePermissions.jsm',
     'TransientPrefs.jsm',
     'URLBarZoom.jsm',
diff --git a/application/basilisk/themes/linux/browser.css b/application/basilisk/themes/linux/browser.css
index f9bd0bbd0..46760980c 100644
--- a/application/basilisk/themes/linux/browser.css
+++ b/application/basilisk/themes/linux/browser.css
@@ -1543,6 +1543,11 @@ notification.pluginVulnerable > .notification-inner > .messageCloseButton:not(:h
   border-left: 3px solid transparent;
 }
 
+/* The :hover:active style from toolkit doesn't seem to work in this panel so just use :active. */
+.customization-tipPanel-closeBox > .close-icon:active {
+  background-image: -moz-image-rect(url("chrome://global/skin/icons/close.svg"), 0, 48, 16, 32);
+}
+
 /* End customization mode */
 
 
@@ -1551,6 +1556,40 @@ notification.pluginVulnerable > .notification-inner > .messageCloseButton:not(:h
   width: 40px;
 }
 
+%include ../shared/UITour.inc.css
+
+#UITourHighlight {
+  /* Below are some fixes for people without an X compositor on Linux.
+     This is why we can't have nice things: */
+  /* Animations don't repaint properly without an X compositor. */
+  animation-name: none !important;
+  /* Opacity rounds to 0 or 1 on Linux without an X compositor so make the
+     background be transparent in that case by having all alpha values < 0.5 */
+  background-image: radial-gradient(50% 100%, rgba(0,149,220,0.3) 50%, rgba(0,149,220,0.49) 100%);
+  /* The highlight isn't anti-aliased without an X compositor so make it thicker.
+     Make it a darker color since we don't have the box-shadow in this case. */
+  border: 4px solid rgb(0,149,220);
+}
+
+#UITourTooltipDescription {
+  font-size: 1.05rem;
+}
+
+#UITourTooltipClose {
+  margin-inline-end: -4px;
+  height: 16px;
+  width: 16px;
+}
+
+/**
+ * Override the --arrowpanel-padding so the background extends
+ * to the sides and bottom of the panel.
+ */
+#UITourTooltipButtons {
+  margin-left: -10px;
+  margin-bottom: -10px;
+}
+
 %include ../shared/contextmenu.inc.css
 
 #context-navigation > .menuitem-iconic > .menu-iconic-left {
diff --git a/application/basilisk/themes/osx/browser.css b/application/basilisk/themes/osx/browser.css
index 808bb20b1..ab3dd7aa6 100644
--- a/application/basilisk/themes/osx/browser.css
+++ b/application/basilisk/themes/osx/browser.css
@@ -3192,6 +3192,24 @@ menulist.translate-infobar-element > .menulist-dropmarker {
 }
 
 @media (min-resolution: 2dppx) {
+  .customization-tipPanel-infoBox {
+    background-image: url(chrome://browser/skin/customizableui/info-icon-customizeTip@2x.png);
+    background-size: 25px 25px;
+  }
+
+  .customization-tipPanel-contentImage {
+    list-style-image: url(chrome://browser/skin/customizableui/customize-illustration@2x.png);
+  }
+
+  .customization-tipPanel-contentImage:-moz-locale-dir(rtl) {
+    list-style-image: url(chrome://browser/skin/customizableui/customize-illustration-rtl@2x.png);
+  }
+
+  #customization-tipPanel > .panel-arrowcontainer > .panel-arrowbox > .panel-arrow[side="left"],
+  #customization-tipPanel > .panel-arrowcontainer > .panel-arrowbox > .panel-arrow[side="right"] {
+    list-style-image: url("chrome://browser/skin/customizableui/panelarrow-customizeTip@2x.png");
+  }
+
   .customization-lwtheme-menu-theme[defaulttheme] {
     list-style-image: url(chrome://browser/skin/theme-switcher-icon@2x.png);
   }
@@ -3261,6 +3279,24 @@ menulist.translate-infobar-element > .menulist-dropmarker {
   -moz-box-ordinal-group: 0;
 }
 
+%include ../shared/UITour.inc.css
+
+#UITourTooltipDescription {
+  font-size: 1.18rem;
+  line-height: 2rem;
+}
+
+#UITourTooltipClose {
+  margin-inline-end: -10px;
+  margin-top: -14px;
+}
+
+@media (min-resolution: 2dppx) {
+  #UITourTooltipClose > .toolbarbutton-icon {
+    width: 16px;
+  }
+}
+
 %include ../shared/contextmenu.inc.css
 
 #context-navigation > .menuitem-iconic {
diff --git a/application/basilisk/themes/shared/UITour.inc.css b/application/basilisk/themes/shared/UITour.inc.css
new file mode 100644
index 000000000..bc89ade76
--- /dev/null
+++ b/application/basilisk/themes/shared/UITour.inc.css
@@ -0,0 +1,293 @@
+%if 0
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+%endif
+
+/* UI Tour */
+
+#UITourHighlightContainer {
+  -moz-appearance: none;
+  -moz-window-shadow: none;
+  border: none;
+  background-color: transparent;
+  /* This is a buffer to compensate for the movement in the "wobble" effect,
+     and for the box-shadow of #UITourHighlight. */
+  padding: 4px;
+}
+
+#UITourHighlight {
+  background-image: radial-gradient(50% 100%, rgba(0,149,220,0.4) 50%, rgba(0,149,220,0.6) 100%);
+  border-radius: 40px;
+  border: 1px solid white;
+  /* The box-shadow opacity needs to be < 0.5 so it doesn't appear at 100% opacity
+     on Linux without an X compositor where opacity is either 0 or 1. */
+  box-shadow: 0 0 3px 0 rgba(0,0,0,0.49);
+  min-height: 32px;
+  min-width: 32px;
+}
+
+#UITourTooltipBody {
+  -moz-box-align: start;
+}
+
+#UITourTooltipTitleContainer {
+  -moz-box-align: start;
+  margin-bottom: 10px;
+}
+
+#UITourTooltipIcon {
+  width: 48px;
+  height: 48px;
+  margin-inline-end: 10px;
+}
+
+#UITourTooltipTitle,
+#UITourTooltipDescription {
+  max-width: 20rem;
+}
+
+#UITourTooltipTitle {
+  font-size: 1.45rem;
+  font-weight: bold;
+  margin: 0;
+}
+
+#UITourTooltipDescription {
+  margin-inline-start: 0;
+  margin-inline-end: 0;
+  font-size: 1.15rem;
+  line-height: 1.8rem;
+  margin-bottom: 0; /* Override global.css */
+}
+
+#UITourTooltipClose {
+  position: relative;
+  -moz-appearance: none;
+  border: none;
+  background-color: transparent;
+  min-width: 0;
+  margin-inline-start: 4px;
+  margin-top: -2px;
+}
+
+#UITourTooltipClose > .toolbarbutton-text {
+  display: none;
+}
+
+#UITourTooltipButtons {
+  -moz-box-pack: end;
+  background-color: hsla(210,4%,10%,.07);
+  border-top: 1px solid hsla(210,4%,10%,.14);
+  margin: 10px -16px -16px;
+  padding: 16px;
+}
+
+#UITourTooltipButtons > label,
+#UITourTooltipButtons > button {
+  margin: 0 15px;
+}
+
+#UITourTooltipButtons > label:first-child,
+#UITourTooltipButtons > button:first-child {
+  margin-inline-start: 0;
+}
+
+#UITourTooltipButtons > label:last-child,
+#UITourTooltipButtons > button:last-child {
+  margin-inline-end: 0;
+}
+
+#UITourTooltipButtons > button[image] > .button-box > .button-icon {
+  width: 16px;
+  height: 16px;
+  margin-inline-end: 5px;
+}
+
+#UITourTooltipButtons > label,
+#UITourTooltipButtons > button .button-text {
+  font-size: 1.15rem;
+}
+
+#UITourTooltipButtons > button:not(.button-link) {
+  -moz-appearance: none;
+  background-color: rgb(251,251,251);
+  border-radius: 3px;
+  border: 1px solid;
+  border-color: rgb(192,192,192);
+  color: rgb(71,71,71);
+  padding: 4px 30px;
+  transition-property: background-color, border-color;
+  transition-duration: 150ms;
+}
+
+#UITourTooltipButtons > button:not(.button-link):not(:active):hover {
+  background-color: hsla(210,4%,10%,.15);
+  border-color: hsla(210,4%,10%,.15);
+  box-shadow: 0 1px 0 0 hsla(210,4%,10%,.05) inset;
+}
+
+#UITourTooltipButtons > label,
+#UITourTooltipButtons > button.button-link {
+  -moz-appearance: none;
+  background: transparent;
+  border: none;
+  box-shadow: none;
+  color: rgba(0,0,0,0.35);
+  padding-left: 10px;
+  padding-right: 10px;
+}
+
+#UITourTooltipButtons > button.button-link:hover {
+  color: black;
+}
+
+/* The primary button gets the same color as the customize button. */
+#UITourTooltipButtons > button.button-primary {
+  background-color: rgb(116,191,67);
+  color: white;
+  padding-left: 30px;
+  padding-right: 30px;
+}
+
+#UITourTooltipButtons > button.button-primary:not(:active):hover {
+  background-color: rgb(105,173,61);
+}
+
+/* Notification overrides for Heartbeat UI */
+
+notification.heartbeat {
+%ifdef XP_MACOSX
+  background-image: linear-gradient(-179deg, #FBFBFB 0%, #EBEBEB 100%);
+%else
+  background-color: #F1F1F1;
+%endif
+  border-bottom: 1px solid #C1C1C1;
+  height: 40px;
+}
+
+/* In themes/osx/global/notification.css the close icon is inverted because notifications
+   on OSX are usually dark. Heartbeat is light, so override that behaviour. */
+
+%ifdef XP_MACOSX
+notification.heartbeat[type="info"] .close-icon:not(:hover) {
+  -moz-image-region: rect(0, 16px, 16px, 0px) !important;
+}
+@media (min-resolution: 2dppx) {
+  notification.heartbeat[type="info"] .close-icon:not(:hover) {
+    -moz-image-region: rect(0, 32px, 32px, 0px) !important;
+  }
+}
+%endif
+
+@keyframes pulse-onshow {
+ 0% {
+   opacity: 0;
+   transform: scale(1.0);
+ }
+ 25% {
+   opacity: 1;
+   transform: scale(1.1);
+ }
+ 50% {
+   transform: scale(1.0);
+ }
+ 75% {
+   transform: scale(1.1);
+ }
+ 100% {
+   transform: scale(1.0);
+ }
+}
+
+@keyframes pulse-twice {
+ 0% {
+   transform: scale(1.1);
+ }
+ 50% {
+   transform: scale(0.8);
+ }
+ 100% {
+   transform: scale(1);
+ }
+}
+
+.messageText.heartbeat {
+  color: #333333;
+  text-shadow: none;
+  margin-inline-start: 0px;
+  /* The !important is required to override OSX default style. */
+  margin-inline-end: 12px !important;
+}
+
+.messageImage.heartbeat {
+  width: 24px;
+  height: 24px;
+  margin-inline-start: 8px;
+  margin-inline-end: 8px;
+}
+
+.messageImage.heartbeat.pulse-onshow {
+  animation-name: pulse-onshow;
+  animation-duration: 1.5s;
+  animation-iteration-count: 1;
+  animation-timing-function: cubic-bezier(.7,1.8,.9,1.1);
+}
+
+.messageImage.heartbeat.pulse-twice {
+  animation-name: pulse-twice;
+  animation-duration: 1s;
+  animation-iteration-count: 2;
+  animation-timing-function: linear;
+}
+
+/* Learn More link styles */
+.heartbeat > .text-link {
+  color: #0095DD;
+  margin-inline-start: 0px;
+}
+
+.heartbeat > .text-link:hover {
+  color: #008ACB;
+  text-decoration: none;
+}
+
+.heartbeat > .text-link:hover:active {
+  color: #006B9D;
+}
+
+/* Heartbeat UI Rating Star Classes */
+.heartbeat > #star-rating-container {
+  display: -moz-box;
+  margin-bottom: 4px;
+}
+
+.heartbeat > #star-rating-container > #star5 {
+  -moz-box-ordinal-group: 5;
+}
+
+.heartbeat > #star-rating-container > #star4 {
+  -moz-box-ordinal-group: 4;
+}
+
+.heartbeat > #star-rating-container > #star3 {
+  -moz-box-ordinal-group: 3;
+}
+
+.heartbeat > #star-rating-container > #star2 {
+  -moz-box-ordinal-group: 2;
+}
+
+.heartbeat > #star-rating-container > .star-x  {
+  background: url("chrome://browser/skin/heartbeat-star-off.svg");
+  cursor: pointer;
+  /* Overrides the margin-inline-end for all platforms defined in the .plain class */
+  margin-inline-end: 4px !important;
+  width: 16px;
+  height: 16px;
+}
+
+.heartbeat > #star-rating-container > .star-x:hover,
+.heartbeat > #star-rating-container > .star-x:hover ~ .star-x {
+  background: url("chrome://browser/skin/heartbeat-star-lit.svg");
+}
diff --git a/application/basilisk/themes/shared/customizableui/customizeMode.inc.css b/application/basilisk/themes/shared/customizableui/customizeMode.inc.css
index d99933388..48681d9f3 100644
--- a/application/basilisk/themes/shared/customizableui/customizeMode.inc.css
+++ b/application/basilisk/themes/shared/customizableui/customizeMode.inc.css
@@ -457,3 +457,5 @@ toolbarpaletteitem[place="toolbar"]:not([mousedown="true"]):-moz-focusring {
 .customization-lwtheme-menu-footeritem:first-child {
   border-inline-end: 1px solid var(--panel-separator-color);
 }
+
+%include customizeTip.inc.css
diff --git a/application/basilisk/themes/shared/customizableui/customizeTip.inc.css b/application/basilisk/themes/shared/customizableui/customizeTip.inc.css
new file mode 100644
index 000000000..26c6ee1ea
--- /dev/null
+++ b/application/basilisk/themes/shared/customizableui/customizeTip.inc.css
@@ -0,0 +1,77 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#customization-tipPanel > .panel-arrowcontainer > .panel-arrowcontent {
+  padding: 0;
+  margin: 0;
+  min-width: 400px;
+  max-width: 1000px;
+  min-height: 200px;
+  border-radius: 3px;
+  background-image: linear-gradient(90deg, #a0dfff 0%, #ceeeff 100%);
+  border: 0px solid rgba(0,148,221,.5);
+  box-shadow: 0 1px 5px 0 rgba(0,0,0,.5), inset 0 1px 1px 0 #fff;
+  color: rgb(51,51,51);
+}
+
+#customization-tipPanel > .panel-arrowcontainer > .panel-arrowcontent:-moz-locale-dir(rtl) {
+  background-image: linear-gradient(90deg, #ceeeff 0%, #a0dfff 100%);
+}
+
+.customization-tipPanel-infoBox {
+  margin: 20px 25px 25px;
+  width: 25px;
+  background-image: url(chrome://browser/skin/customizableui/info-icon-customizeTip.png);
+  background-repeat: no-repeat;
+}
+
+.customization-tipPanel-content {
+  margin: 25px 0;
+  font-size: 12px;
+  line-height: 18px;
+}
+
+.customization-tipPanel-em {
+  margin: 0;
+  font-weight: bold;
+}
+
+.customization-tipPanel-contentImage {
+  margin-top: 25px;
+  list-style-image: url(chrome://browser/skin/customizableui/customize-illustration.png);
+  min-width: 300px;
+  max-width: 300px;
+  min-height: 190px;
+  max-height: 190px;
+  display: -moz-box;
+}
+
+.customization-tipPanel-contentImage:-moz-locale-dir(rtl) {
+  list-style-image: url(chrome://browser/skin/customizableui/customize-illustration-rtl.png);
+}
+
+.customization-tipPanel-link {
+  -moz-appearance: none;
+  background: transparent;
+  border: none;
+  box-shadow: none;
+  color: rgb(25,82,171);
+  margin: 0;
+  cursor: pointer;
+}
+
+.customization-tipPanel-link > .button-box > .button-text {
+  margin: 0 !important;
+}
+
+.customization-tipPanel-closeBox > .close-icon {
+  -moz-appearance: none;
+  border: 0;
+  margin-inline-end: -25px;
+}
+
+#customization-tipPanel > .panel-arrowcontainer > .panel-arrowbox > .panel-arrow[side="left"],
+#customization-tipPanel > .panel-arrowcontainer > .panel-arrowbox > .panel-arrow[side="right"] {
+  list-style-image: url("chrome://browser/skin/customizableui/panelarrow-customizeTip.png");
+}
diff --git a/application/basilisk/themes/windows/Info-XP.png b/application/basilisk/themes/windows/Info-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..3d0f84edbd2932025555f722eaf0284a0f8fb185
GIT binary patch
literal 585
zcmV-P0=E5$P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0006INkl<ZcwVKG
zK}ZyF6vlruJG)AyDOgD$6fChOM063zx&<W^5rGuYCDuf!E)`uu3J`)W5mBymil}1&
zRdnf6fslraNfczetVFm??z%h9?#%rE&11*~Br^Ko@xFO8-}l}JjG?vWe_(7&=LgN0
zGiI7~)&k#a!-_9TKQou<${5MvthN#XTlXmJd>3oQV$LNrFw7sH3sk<>`1IVP_~FY+
z33|3$tN8JcLyTv8DSe$mV6-22rfbDn{uNCfJF#CLGOUC%&zlGRWbGPjLCNZ5b3!w8
z_9+4jAeHJS1!%1a6a*SPU*ii8q!X47xpeU4BWM_ah(&0iG$^GAlyr^xev%ED+r($4
zF`O!D-Fn>aUF>%^H4GvV1hPep0`P=PP11DbB7B?2BLdY5*1NY{i*2NmO!k>Xr=z5F
z!$i2gdy{%0j~fKor_YglHB0XP3yKGi(NVW$K4OAwH&7ysOvF$!<4#ZEgyM4gJlwfK
z?8zf)on6=iX_-s)TEL315hdzQsf0kE8fLkrjo9dAV!mRze*nk#0a`3*h~#{^Mz+gy
zwW%2$W^OLz2#%b<^%Z*b62`&;mB?TziooyOMifH{hkDO$s!CD0cZ+&HG&y_{H+=zj
z?7GaQCX6k6$2EVz4rh+R!b3W|pR3*#<Lxrv_t)R~acgTIFaq>SW?%`J0InV_mtX$^
XWJpUV&rE-u00000NkvXXu0mjfTUiDN

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/Privacy-16-XP.png b/application/basilisk/themes/windows/Privacy-16-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..6a2de5774958f6f423892afa9f9dab16d749e7bf
GIT binary patch
literal 797
zcmV+&1LFLNP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0008yNkl<ZcwVK`
zy>AnD90u^`cXvLYaU5HAY{#+VBo0M12~j8zQ4}QFfl8HHRVrdYf}!2ns!AQ&1+l>2
zP^nS}RJv6v1E7kw1Y!`7R~#TXFU~pfxqiEM-`($r9C-njO8HFR<#~oj`Vz(%_Ct7a
z=Nq=Wp2zLdb%L(7SBkH<Hz39nJvsnXD#ig_Gn|oJpM!UBzx+A0hOUJLxu;&M{Wv)u
zE*u<@)_G>#;iz#tH;9eHqyE);wffV_vK#_{!t*kD`J#ND{P6wHt#s0_Z0-72qY-}M
zgG155>`(&1pdZbq4%4*37@(>q>XrYnRnkhTN|%EHl2T1KBLwK;)=-}`mKpsj=Mxz;
zjmLJGAshh)QvGPD7FG(oP!tbtTR=J+$q2;Dgn|U~^YvGPMkjXo@bK89XC+fnYDLFx
zEP#lohldZQ&z$)Xnr>t6VF7aK^(G<hSwRRLO{G)WPp0Dm!=$p%RI%zK^wU<O`g<&v
zy#!>iS-i__m%O|z4;-_sHuP5c{`ka+8FW=EOE*1}JJ(db2SO^Cw-u!agXzTAno$cl
zj`%E{nNl66)wE0tl(~q<`&7$NE)zmRg0DTD%Vs`XFKM(~F@7U+H_o!Z<|lD@>PxKe
zSnymI0?)yt1i4%s9h;j~IF1X~_2Bb~7>b+t`+n(GZ*uf=VIX+`)k^V?*@wm0N0Z@G
zQg0LtBFeIYkmP_-iXMp~nu&qA28_lI@{cQp)nfbG6G=b-fU*96zqpwn7aPritAi=!
zVl?7QXsYVn+b*wxG6W@i)TjmcYRyt)h5foA+gGMf9;pL>fUe`GK6U_n_aMJ`&Bv2t
zl(Cj&>vI4g`N=fT*<syqo}8RHx|_^m&sznt`UN~KUjk*hif*X4K!AYcM~7+IvjhYk
z3s08!wxE=N5CRTegz6X$--RexARG^l5OnR`9M=ipJ>25bOLW+-h*)45>EJ)`sD%G(
b-|zeew^LtSlP>fE00000NkvXXu0mjfLDhRG

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/Toolbar-XP.png b/application/basilisk/themes/windows/Toolbar-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..d53ba904c010db465a760af261e413f385d3f7ed
GIT binary patch
literal 19638
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

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/Toolbar-aero.png b/application/basilisk/themes/windows/Toolbar-aero.png
new file mode 100644
index 0000000000000000000000000000000000000000..7b130c350b501992335943b42059e1f7ec6a7a29
GIT binary patch
literal 18275
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
UOt-tq82|tP07*qoM6N<$f^>2?WB>pF

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/Toolbar-aero@2x.png b/application/basilisk/themes/windows/Toolbar-aero@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..22a87c130a14f3466968c9fb76dfa3141662937c
GIT binary patch
literal 47581
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
aZ#<*oY(R6s+$+-mJozZ6CR;6S0s4RVWQnW*

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/Toolbar-lunaSilver.png b/application/basilisk/themes/windows/Toolbar-lunaSilver.png
new file mode 100644
index 0000000000000000000000000000000000000000..30c425c26b347190b99477699ec6bafd1016fc98
GIT binary patch
literal 19034
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
RyQcsE002ovPDHLkV1ni<!Sw(D

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/actionicon-tab-XPVista7.png b/application/basilisk/themes/windows/actionicon-tab-XPVista7.png
new file mode 100644
index 0000000000000000000000000000000000000000..ce5799c2ee36f31e4b572c57412005fd90bb1bc1
GIT binary patch
literal 421
zcmV;W0b2fvP)<h;3K|Lk000e1NJLTq000mG000&U1^@s6$*LTD0004ONkl<Zc-p1Y
zQA@&590l-!*i&D?eD5ptlsyG~wq7DAs3MBhOcFC&HBpsSia2#>iXxchtdJh_DJR~}
zUo?`fx+~y^^X{AjUQl3+jqHcA-orC3avHA=BB>gSr0P@XjNVa(vXkEDfEdojqUk16
z3mtY{e6mIFqM3V!tZEquD&_ZNuFX=K@gvFvqve5R;6y30c=mw{Wi1287dlgJn_Q5c
z9@r35F6q3$WVOLXl8X$Tna_dsgT#^~>nxn8aq%OI&hltrZ7;U66G*oMmnB?Ig$reO
z1DQ5;X&@<v^K|G4b*L+>ZeJ;zM=IO$-#9`Y>e3zji{PG}BlN`s5_IA98{KinV;L9@
zhanuiK<5|F$jWvD1`ZxMb?knE0ZmSZ-9QWKoLW-@cyK`j?l@7_{dHggs-SbKn5MZn
z`7iizfeC!(A;&2{?)Zd$-xTqnLB=7Cy24wpM*}((9MY*vci@HjKk|M6%N<S~=osGm
P00000NkvXXu0mjf$H2R%

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/browser-aero.css b/application/basilisk/themes/windows/browser-aero.css
index dbac6bb7a..28599af7a 100644
--- a/application/basilisk/themes/windows/browser-aero.css
+++ b/application/basilisk/themes/windows/browser-aero.css
@@ -445,7 +445,7 @@
     }
 
     /* The borders on the glass frame are ours, and inside #browser, and on
-     * win7 we want to make sure they are "glassy", so we can't use
+     * vista and win7 we want to make sure they are "glassy", so we can't use
      * #browser as the exclude-glass container. We use #appcontent instead. */
     #browser {
       -moz-appearance: none;
@@ -458,7 +458,7 @@
 
   @media (-moz-os-version: windows-win8) {
     /* Artificially draw window borders that are covered by lwtheme, see bug 591930.
-     * Borders for win7 are below, win10 doesn't need them. */
+     * Borders for vista/win7 are below, win10 doesn't need them. */
     #main-window[sizemode="normal"] > #tab-view-deck > #browser-panel:-moz-lwtheme {
       border-top: 1px solid @toolbarShadowColor@;
     }
@@ -473,9 +473,11 @@
      * On aero, the menubar fog disappears for inactive windows, and renders gray
      * illegible.
      */
-    @media not all and (-moz-os-version: windows-win7) {
-      #toolbar-menubar:not(:-moz-lwtheme):-moz-window-inactive {
-        color: ThreeDShadow;
+    @media not all and (-moz-os-version: windows-vista) {
+      @media not all and (-moz-os-version: windows-win7) {
+        #toolbar-menubar:not(:-moz-lwtheme):-moz-window-inactive {
+          color: ThreeDShadow;
+        }
       }
     }
   }
@@ -485,8 +487,9 @@
     color: white;
   }
 
-  /* Show borders on win7 and win8, but not on win10 and later: */
-  @media (-moz-os-version: windows-win7),
+  /* Show borders on vista through win8, but not on win10 and later: */
+  @media (-moz-os-version: windows-vista),
+         (-moz-os-version: windows-win7),
          (-moz-os-version: windows-win8) {
     /* Vertical toolbar border */
     #main-window:not([customizing])[sizemode=normal] #navigator-toolbox > toolbar:not(#toolbar-menubar):not(#TabsToolbar):not(:-moz-lwtheme),
diff --git a/application/basilisk/themes/windows/browser.css b/application/basilisk/themes/windows/browser.css
index 2ed3e7e6a..3591c43fc 100644
--- a/application/basilisk/themes/windows/browser.css
+++ b/application/basilisk/themes/windows/browser.css
@@ -131,7 +131,8 @@ toolbar:-moz-lwtheme {
 }
 
 @media (-moz-windows-default-theme) {
-  @media (-moz-os-version: windows-win7) {
+  @media (-moz-os-version: windows-vista),
+         (-moz-os-version: windows-win7) {
     #navigator-toolbox::after {
       border-bottom-color: #aabccf;
     }
@@ -159,7 +160,9 @@ toolbar:-moz-lwtheme {
   background-image: linear-gradient(@toolbarHighlight@, @toolbarHighlight@);
 }
 
-@media (-moz-os-version: windows-win7) {
+@media (-moz-os-version: windows-xp),
+       (-moz-os-version: windows-vista),
+       (-moz-os-version: windows-win7) {
   #nav-bar {
     background-image: linear-gradient(@toolbarHighlight@, transparent) !important;
   }
@@ -315,6 +318,64 @@ toolbar:-moz-lwtheme {
   }
 }
 
+/* Render a window top border for lwthemes on WinXP modern themes: */
+@media (-moz-windows-theme: luna-blue) {
+  #main-window[tabsintitlebar][sizemode="normal"] > #tab-view-deck > #browser-panel:-moz-lwtheme {
+    background-image: linear-gradient(to bottom,
+        rgb(8, 49, 216) 0, rgb(8, 49, 216) 1px,
+        rgb(15, 77, 227) 1px, rgb(15, 77, 227) 2px,
+        rgb(22, 106, 238) 2px, rgb(22, 106, 238) 3px,
+        rgb(8, 85, 221) 3px, rgb(8, 85, 221) 4px,
+        transparent 4px);
+  }
+
+  #main-window[tabsintitlebar][sizemode="normal"] > #tab-view-deck > #browser-panel:-moz-lwtheme:-moz-window-inactive {
+    background-image: linear-gradient(to bottom,
+        rgb(91, 104, 205) 0, rgb(91, 104, 205) 1px,
+        rgb(116, 128, 220) 1px, rgb(116, 128, 220) 2px,
+        rgb(117, 140, 221) 2px, rgb(117, 140, 221) 4px,
+        transparent 4px);
+  }
+}
+
+@media (-moz-windows-theme: luna-silver) {
+  #main-window[tabsintitlebar][sizemode="normal"] > #tab-view-deck > #browser-panel:-moz-lwtheme {
+    background-image: linear-gradient(to bottom,
+        rgb(102,102,126) 0, rgb(102,102,126) 1px,
+        rgb(168,167,191) 1px, rgb(168,167,191) 2px,
+        white 2px, white 3px,
+        rgb(188,188,207) 3px, rgb(188,188,207) 4px,
+        transparent 4px);
+  }
+
+  #main-window[tabsintitlebar][sizemode="normal"] > #tab-view-deck > #browser-panel:-moz-lwtheme:-moz-window-inactive {
+    background-image: linear-gradient(to bottom,
+        rgb(186,186,197) 0, rgb(186,186,197) 1px,
+        rgb(236,238,245) 1px, rgb(236,238,245) 2px,
+        white 2px, white 3px,
+        rgb(215,215,227) 3px, rgb(215,215,227) 4px,
+        transparent 4px);
+  }
+}
+
+@media (-moz-windows-theme: luna-olive) {
+  #main-window[tabsintitlebar][sizemode="normal"] > #tab-view-deck > #browser-panel:-moz-lwtheme {
+    background-image: linear-gradient(to bottom,
+        rgb(139,161,105) 0, rgb(139,161,105) 1px,
+        rgb(171, 189, 133) 1px, rgb(171, 189, 133) 2px,
+        rgb(164,178,127) 2px, rgb(164,178,127) 3px,
+        transparent 3px);
+  }
+
+  #main-window[tabsintitlebar][sizemode="normal"] > #tab-view-deck > #browser-panel:-moz-lwtheme:-moz-window-inactive {
+    background-image: linear-gradient(to bottom,
+        rgb(207, 214, 188) 0, rgb(207, 214, 188) 1px,
+        rgb(224, 226, 200) 1px, rgb(224, 226, 200) 2px,
+        rgb(214, 216, 190) 2px, rgb(214, 216, 190) 3px,
+        transparent 3px);
+  }
+}
+
 #TabsToolbar:not([collapsed="true"]) + #nav-bar {
   /* Move up into the TabsToolbar for the inner highlight at the top of the nav-bar */
   margin-top: calc(-1 * var(--navbar-tab-toolbar-highlight-overlap));
@@ -345,6 +406,12 @@ toolbar:-moz-lwtheme {
   background-color: -moz-dialog;
 }
 
+@media (-moz-os-version: windows-xp) and (-moz-windows-default-theme) {
+  #main-window[tabsintitlebar][sizemode="normal"] #toolbar-menubar {
+    margin-top: 4px;
+  }
+}
+
 /* ::::: titlebar ::::: */
 
 #main-window[sizemode="normal"] > #titlebar {
@@ -365,7 +432,7 @@ toolbar:-moz-lwtheme {
  * click and hover mouse events to work properly for the button in the restored
  * window state. Otherwise, elements in the navigator-toolbox, like the menubar,
  * can swallow those events. It will also place the buttons above the fog on
- * Windows 7 with Aero Glass.
+ * themes with Aero Glass.
  */
 #titlebar-buttonbox {
   z-index: 1;
@@ -375,6 +442,12 @@ toolbar:-moz-lwtheme {
   margin-left: 22px; /* space needed for Aero Snap */
 }
 
+@media (-moz-os-version: windows-xp) {
+  .titlebar-placeholder[type="caption-buttons"] {
+    margin-left: 10px; /* less space needed on XP because there's no Aero Snap */
+  }
+}
+
 /* titlebar command buttons */
 
 #titlebar-min {
@@ -597,6 +670,13 @@ menuitem.bookmark-item {
 
 %include ../shared/toolbarbuttons.inc.css
 
+@media (-moz-windows-theme: luna-silver) and (max-resolution: 1dppx) {
+  :-moz-any(@primaryToolbarButtons@),
+  #bookmarks-menu-button.toolbarbutton-1 > .toolbarbutton-menubutton-dropmarker > .dropmarker-icon {
+    list-style-image: url("chrome://browser/skin/Toolbar-lunaSilver.png");
+  }
+}
+
 #main-window:not([customizing]) .toolbarbutton-1[disabled=true] > .toolbarbutton-icon,
 #main-window:not([customizing]) .toolbarbutton-1[disabled=true] > .toolbarbutton-menu-dropmarker,
 #main-window:not([customizing]) .toolbarbutton-1[disabled=true] > .toolbarbutton-menubutton-dropmarker,
@@ -700,7 +780,10 @@ toolbar[brighttext] .toolbarbutton-1 > .toolbarbutton-menubutton-dropmarker {
   max-width: 32px;
 }
 
-@media (-moz-os-version: windows-win7) {
+@media (-moz-os-version: windows-xp),
+       (-moz-os-version: windows-vista),
+       (-moz-os-version: windows-win7) {
+  /* < Win8 */
   :root {
     --toolbarbutton-hover-background: linear-gradient(hsla(0,0%,100%,.6), hsla(0,0%,100%,.1));
     --toolbarbutton-hover-bordercolor: hsla(210,54%,20%,.15) hsla(210,54%,20%,.2) hsla(210,54%,20%,.25);
@@ -1018,7 +1101,9 @@ toolbar[brighttext] #close-button {
   list-style-image: url(chrome://browser/skin/caption-buttons.svg#close-white);
 }
 
-@media (-moz-os-version: windows-win7) {
+@media (-moz-os-version: windows-xp),
+       (-moz-os-version: windows-vista),
+       (-moz-os-version: windows-win7) {
   #window-controls {
     margin-inline-start: 4px;
   }
@@ -1074,7 +1159,8 @@ toolbar[brighttext] #close-button {
   }
 }
 
-@media (-moz-os-version: windows-win7) {
+@media (-moz-os-version: windows-vista),
+       (-moz-os-version: windows-win7) {
   #window-controls {
     -moz-box-align: start;
   }
@@ -1118,7 +1204,8 @@ toolbar[brighttext] #close-button {
 }
 
 @media (-moz-windows-default-theme) {
-  @media (-moz-os-version: windows-win7),
+  @media (-moz-os-version: windows-vista),
+         (-moz-os-version: windows-win7),
          (-moz-os-version: windows-win8) {
     #main-window:not(:-moz-lwtheme) {
       --urlbar-border-color: hsla(210,54%,20%,.25) hsla(210,54%,20%,.27) hsla(210,54%,20%,.3);
@@ -1155,7 +1242,8 @@ toolbar[brighttext] #close-button {
     border-radius: 1px;
   }
 
-  @media (-moz-os-version: windows-win7),
+  @media (-moz-os-version: windows-vista),
+         (-moz-os-version: windows-win7),
          (-moz-os-version: windows-win8) {
     #urlbar:not(:-moz-lwtheme),
     .searchbar-textbox:not(:-moz-lwtheme) {
@@ -1178,9 +1266,11 @@ toolbar[brighttext] #close-button {
     }
   }
 
-  #urlbar:not(:-moz-lwtheme)[focused],
-  .searchbar-textbox:not(:-moz-lwtheme)[focused] {
-    border-color: Highlight;
+  @media not all and (-moz-os-version: windows-xp) {
+    #urlbar:not(:-moz-lwtheme)[focused],
+    .searchbar-textbox:not(:-moz-lwtheme)[focused] {
+      border-color: Highlight;
+    }
   }
 }
 
@@ -1858,7 +1948,9 @@ html|span.ac-emphasize-text-url {
   }
 }
 
-@media (-moz-os-version: windows-win7) {
+@media (-moz-os-version: windows-xp),
+       (-moz-os-version: windows-vista),
+       (-moz-os-version: windows-win7) {
   #sidebar-header > .close-icon {
     padding-top: 4px;
     padding-bottom: 4px;
@@ -1879,28 +1971,39 @@ html|span.ac-emphasize-text-url {
   margin-bottom: calc(-1 * var(--tab-toolbar-navbar-overlap)); /* overlap the nav-bar's top border */
 }
 
+@media (-moz-os-version: windows-xp) and (-moz-windows-default-theme) {
+  #main-window[sizemode=normal] #TabsToolbar {
+    padding-left: 2px;
+    padding-right: 2px;
+  }
+}
+
 %include ../shared/tabs.inc.css
 
 /* Remove border between tab strip and navigation toolbar on Windows 10+ */
-@media not all and (-moz-os-version: windows-win7) {
-  @media not all and (-moz-os-version: windows-win8) {
-    @media (-moz-windows-default-theme) {
-      .tab-background-end[selected=true]::after,
-      .tab-background-start[selected=true]::after {
-        content: none;
-      }
-
-      #TabsToolbar {
-        --tab-stroke-background-size: 0 0;
-      }
-
-      :root {
-        --tab-toolbar-navbar-overlap: 0px;
-      }
-
-      #nav-bar {
-        border-top-style: none !important;
-        box-shadow: none;
+@media not all and (-moz-os-version: windows-xp) {
+  @media not all and (-moz-os-version: windows-vista) {
+    @media not all and (-moz-os-version: windows-win7) {
+      @media not all and (-moz-os-version: windows-win8) {
+        @media (-moz-windows-default-theme) {
+          .tab-background-end[selected=true]::after,
+          .tab-background-start[selected=true]::after {
+            content: none;
+          }
+
+          #TabsToolbar {
+            --tab-stroke-background-size: 0 0;
+          }
+
+          :root {
+            --tab-toolbar-navbar-overlap: 0px;
+          }
+
+          #nav-bar {
+            border-top-style: none !important;
+            box-shadow: none;
+          }
+        }
       }
     }
   }
@@ -2328,6 +2431,14 @@ notification.pluginVulnerable > .notification-inner > .messageCloseButton {
   border-bottom: 1px solid @toolbarShadowColor@;
 }
 
+#customization-tipPanel > .panel-arrowcontainer > .panel-arrowbox > .panel-arrow[side="left"] {
+  margin-right: -2px;
+}
+
+#customization-tipPanel > .panel-arrowcontainer > .panel-arrowbox > .panel-arrow[side="right"] {
+  margin-left: -2px;
+}
+
 /* End customization mode */
 
 /* Private browsing indicators */
@@ -2377,6 +2488,22 @@ notification.pluginVulnerable > .notification-inner > .messageCloseButton {
   position: relative;
 }
 
+@media (-moz-os-version: windows-xp) {
+  @media not all and (-moz-windows-classic) {
+    #private-browsing-indicator-titlebar > .private-browsing-indicator {
+      background-image: url("chrome://browser/skin/privatebrowsing-mask-titlebar-XPVista7-tall.png");
+      height: 28px;
+    }
+
+    #main-window[sizemode="maximized"] > #titlebar > #titlebar-content > #titlebar-buttonbox-container > #private-browsing-indicator-titlebar > .private-browsing-indicator {
+      top: -5px;
+    }
+    #main-window[sizemode="normal"] > #titlebar > #titlebar-content > #titlebar-buttonbox-container > #private-browsing-indicator-titlebar > .private-browsing-indicator {
+      top: -1px;
+    }
+  }
+}
+
 @media (-moz-windows-classic) {
   /**
    * We have to use top instead of background-position in this case, otherwise
@@ -2388,7 +2515,8 @@ notification.pluginVulnerable > .notification-inner > .messageCloseButton {
   }
 }
 
-@media (-moz-os-version: windows-win7) {
+@media (-moz-os-version: windows-vista),
+       (-moz-os-version: windows-win7) {
   @media (-moz-windows-glass) {
     #main-window[sizemode="normal"] > #titlebar > #titlebar-content > #titlebar-buttonbox-container > #private-browsing-indicator-titlebar > .private-browsing-indicator {
       top: 1px;
@@ -2405,7 +2533,7 @@ notification.pluginVulnerable > .notification-inner > .messageCloseButton {
   @media (-moz-windows-default-theme) {
     @media not all and (-moz-windows-compositor) {
       #main-window[sizemode="normal"] > #titlebar > #titlebar-content > #titlebar-buttonbox-container > #private-browsing-indicator-titlebar > .private-browsing-indicator {
-        background-image: url("chrome://browser/skin/privatebrowsing-mask-titlebar-win7-tall.png");
+        background-image: url("chrome://browser/skin/privatebrowsing-mask-titlebar-XPVista7-tall.png");
         height: 28px;
       }
     }
@@ -2414,6 +2542,18 @@ notification.pluginVulnerable > .notification-inner > .messageCloseButton {
 
 /* End private browsing indicators */
 
+%include ../shared/UITour.inc.css
+
+#UITourTooltipButtons {
+  /**
+   * Override the --arrowpanel-padding so the background extends
+   * to the sides and bottom of the panel.
+   */
+  margin-left: -10px;
+  margin-right: -10px;
+  margin-bottom: -10px;
+}
+
 %include ../shared/contextmenu.inc.css
 
 #context-navigation {
@@ -2426,14 +2566,19 @@ notification.pluginVulnerable > .notification-inner > .messageCloseButton {
   margin-top: -4px;
 }
 
+
+@media not all and (-moz-os-version: windows-xp) {
 %include browser-aero.css
+}
 
 .browser-extension-panel > .panel-arrowcontainer > .panel-arrowcontent {
   padding: 0;
   overflow: hidden;
 }
 
-@media (-moz-os-version: windows-win7) {
+@media (-moz-os-version: windows-xp),
+       (-moz-os-version: windows-vista),
+       (-moz-os-version: windows-win7) {
   .cui-widget-panelview[id^=PanelUI-webext-] {
     border-radius: 4px;
   }
diff --git a/application/basilisk/themes/windows/customizableui/panelUI.css b/application/basilisk/themes/windows/customizableui/panelUI.css
index a01a2f3e3..a62e04fc4 100644
--- a/application/basilisk/themes/windows/customizableui/panelUI.css
+++ b/application/basilisk/themes/windows/customizableui/panelUI.css
@@ -123,17 +123,21 @@ menu.subviewbutton > .menu-right:-moz-locale-dir(rtl) {
 }
 
 /* Win8 and beyond. */
-@media not all and (-moz-os-version: windows-win7) {
-  panelview .toolbarbutton-1,
-  .subviewbutton,
-  .widget-overflow-list .toolbarbutton-1,
-  .panelUI-grid .toolbarbutton-1 > .toolbarbutton-menubutton-button,
-  #BMB_bookmarksPopup menupopup[placespopup=true] > hbox,
-  #edit-controls@inAnyPanel@,
-  #zoom-controls@inAnyPanel@,
-  #edit-controls@inAnyPanel@ > toolbarbutton,
-  #zoom-controls@inAnyPanel@ > toolbarbutton {
-    border-radius: 0;
+@media not all and (-moz-os-version: windows-xp) {
+  @media not all and (-moz-os-version: windows-vista) {
+    @media not all and (-moz-os-version: windows-win7) {
+      panelview .toolbarbutton-1,
+      .subviewbutton,
+      .widget-overflow-list .toolbarbutton-1,
+      .panelUI-grid .toolbarbutton-1 > .toolbarbutton-menubutton-button,
+      #BMB_bookmarksPopup menupopup[placespopup=true] > hbox,
+      #edit-controls@inAnyPanel@,
+      #zoom-controls@inAnyPanel@,
+      #edit-controls@inAnyPanel@ > toolbarbutton,
+      #zoom-controls@inAnyPanel@ > toolbarbutton {
+        border-radius: 0;
+      }
+    }
   }
 }
 
diff --git a/application/basilisk/themes/windows/devedition.css b/application/basilisk/themes/windows/devedition.css
index bdf4bb80e..2dc72eeeb 100644
--- a/application/basilisk/themes/windows/devedition.css
+++ b/application/basilisk/themes/windows/devedition.css
@@ -16,7 +16,7 @@
 
 /* The window background is white due to no accentcolor in the lightweight
    theme. It can't be changed to transparent when there is no compositor
-   (Win 7 in classic / basic theme), or else dragging and focus become
+   (Win XP or 7 in classic / basic theme), or else dragging and focus become
    broken. So instead just show the normal titlebar in that case, and override
    the window color as transparent when the compositor is available. */
 @media not all and (-moz-windows-compositor) {
@@ -116,7 +116,9 @@
   }
 }
 
-@media (-moz-os-version: windows-win7),
+@media (-moz-os-version: windows-xp),
+       (-moz-os-version: windows-vista),
+       (-moz-os-version: windows-win7),
        (-moz-os-version: windows-win8) {
   :root {
     --space-above-tabbar: 15px;
@@ -259,7 +261,8 @@
   color: var(--chrome-color);
 }
 
-@media (-moz-os-version: windows-win7),
+@media (-moz-os-version: windows-vista),
+       (-moz-os-version: windows-win7),
        (-moz-os-version: windows-win8) {
   /* And then we add them back on toolbars so that they don't look borderless: */
   #main-window:not([customizing])[sizemode=normal] #navigator-toolbox::after,
diff --git a/application/basilisk/themes/windows/downloads/allDownloadsViewOverlay.css b/application/basilisk/themes/windows/downloads/allDownloadsViewOverlay.css
index 0ee83f669..e288f1e90 100644
--- a/application/basilisk/themes/windows/downloads/allDownloadsViewOverlay.css
+++ b/application/basilisk/themes/windows/downloads/allDownloadsViewOverlay.css
@@ -18,30 +18,32 @@
 
 /*** Highlighted list items ***/
 
-@media (-moz-windows-default-theme) {
-  /*
-  -moz-appearance: menuitem is almost right, but the hover effect is not
-  transparent and is lighter than desired.
-
-  Copied from the autocomplete richlistbox styling in
-  toolkit/themes/windows/global/autocomplete.css
-
-  This styling should be kept in sync with the style from the above file.
-  */
-  @itemFocused@ {
-    color: inherit;
-    background-color: transparent;
-    /* four gradients for the bevel highlights on each edge, one for blue background */
-    background-image:
-      linear-gradient(to bottom, rgba(255,255,255,0.9) 3px, transparent 3px),
-      linear-gradient(to right, rgba(255,255,255,0.5) 3px, transparent 3px),
-      linear-gradient(to left, rgba(255,255,255,0.5) 3px, transparent 3px),
-      linear-gradient(to top, rgba(255,255,255,0.4) 3px, transparent 3px),
-      linear-gradient(to bottom, rgba(163,196,247,0.3), rgba(122,180,246,0.3));
-    background-clip: content-box;
-    border-radius: 6px;
-    outline: 1px solid rgb(124,163,206);
-    -moz-outline-radius: 3px;
-    outline-offset: -2px;
+@media not all and (-moz-os-version: windows-xp) {
+  @media (-moz-windows-default-theme) {
+    /*
+    -moz-appearance: menuitem is almost right, but the hover effect is not
+    transparent and is lighter than desired.
+
+    Copied from the autocomplete richlistbox styling in
+    toolkit/themes/windows/global/autocomplete.css
+
+    This styling should be kept in sync with the style from the above file.
+    */
+    @itemFocused@ {
+      color: inherit;
+      background-color: transparent;
+      /* four gradients for the bevel highlights on each edge, one for blue background */
+      background-image:
+        linear-gradient(to bottom, rgba(255,255,255,0.9) 3px, transparent 3px),
+        linear-gradient(to right, rgba(255,255,255,0.5) 3px, transparent 3px),
+        linear-gradient(to left, rgba(255,255,255,0.5) 3px, transparent 3px),
+        linear-gradient(to top, rgba(255,255,255,0.4) 3px, transparent 3px),
+        linear-gradient(to bottom, rgba(163,196,247,0.3), rgba(122,180,246,0.3));
+      background-clip: content-box;
+      border-radius: 6px;
+      outline: 1px solid rgb(124,163,206);
+      -moz-outline-radius: 3px;
+      outline-offset: -2px;
+    }
   }
 }
diff --git a/application/basilisk/themes/windows/downloads/download-glow-XPVista7.png b/application/basilisk/themes/windows/downloads/download-glow-XPVista7.png
new file mode 100644
index 0000000000000000000000000000000000000000..1424da35948a65be8d479837a114e2074df96771
GIT binary patch
literal 489
zcmV<F0T%v=P)<h;3K|Lk000e1NJLTq000sI000sQ1^@s6R?d!B00057Nkl<Zc-p;_
z(JMny9LMJg8pbxZa}@#qhj&!SGbJgRT?DHI8z>L~5>P4C0AN;;fR+XzPvl)Qc=<Z#
z(#_H6?!~V@_3QgReeSv4uIjG=5cC~YpaVclA-@nEh=`~&%Z`GxYY?1ckzjj7mU)+T
zN+m%Q5?0Uwjb#oR>*6OC2g35(!8&$Eu_)X$23^M?be%^GX{TA>q6l#k`mSRRnguS3
z6sHl>?dG7FB9SDKMdeh~bHYJ0S;X)sF#i0^nyOjE_Ify2CiOge`4+y{cOf*xd>@i)
zL1>;8>cVd5>`oZ^&Nx`cI(8-`rxxlg^Es1oH!2=psE#V1deb(nLEp9m1AP_azy$}*
zXtxb*{VJlx317wdN~wIKZ?d$CneFOWyYto9=K&eI_QMreXRvKN*E#k?04cKIr>tgn
zx6;tG^+E>DAdK8lZW+=}`cGlBZ+aW&4@|tozbw`2*cVB&%O?z8B5w3fLKwUNX?A*B
zmyb&TBrE+*Qfv!{Ceq^a3PYEWXmLHYuepmki9%U&8-04bZRwHn(7Em|0+6KKz{?UT
f>0czM{$oA>HC4u`<nzGT00000NkvXXu0mjf02tg9

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/downloads/download-glow-menuPanel-XPVista7.png b/application/basilisk/themes/windows/downloads/download-glow-menuPanel-XPVista7.png
new file mode 100644
index 0000000000000000000000000000000000000000..7ff7e6a0330012061e5cf4477c196fdc766cecf0
GIT binary patch
literal 893
zcmV-@1A_dCP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80009-Nkl<Zc-q}p
zZAepL6n@|PvF~)LTWeFNb5W^6X2lAFe)&%V2_Y291R;?KAq;_jWq}A-Aeo`51_+o%
zp-_>UM5dTvVUlH<Io0KN=02MD?R{ZV?drVOI|F*)z;<|cpXZ!&2j@T_5(pu<83l*{
zL`X2-ih}~eF(ib<0AYyBzTI=IV|e*G$0&^0_lCt&UiXYGT3OswVB?vPVu0=(bzNn3
zF-A(R1c3~2ZdXLNeY^yJNtMz8J`^FlX^j>@iVkQ1vI^jJe%Gyym?R|{@ToB@gVg~-
zo4jWb0!Y)mwDb-jM1p(}!VSIwgb)d#-0kRqh{_Pyjt+1ngmVAK5dd73;L5h613*Lv
zz_$GhxPLMNxPDg=34s$pfu4ufGZ2MC2{u6A=$sNzwD7l^qJR&30<acvI2b~oUUX^>
z7PmCI8FeE5G3C#s<to7J2p4RCk|}|{sPhBoaq`>Cc~>>S-7#__BY({R(yHYglBrd)
zkX;mH<-D#z><QAC$_X^U$bc+V50F0}A;5W7Xt3g7{TGs$YmW!56<u?6Kpkd;49hbi
z6+|3)J%IW#J6L+seD1U@dIV>u|J;bIrL99zH(xp$IMq&*&qQ#=SLWWAXIOGh9gdvF
z*)Qv@WO3zBKSq_cPt|fNtr;@1poufCg@KAp>)G@J#&1MC&`xN%)i!J@d1kL$Rcd32
z3F+eV{nc6fa?=tGM0`xhQfjGw@!4>tb*vtnh=VkXnQ%+utZTlnIy*iuEy>`(*{@=@
z;@EqyMh%xAj@<PswR?Rg#ESPe<Rs;t*smv*k8foyH#fc>GZfw*s##TN<MB9%2?646
zz`7TDn(~tKY}SYwoV8223(SxD?7IBM!CH?jG=Xn|FRpMec0I^XIiC_6Mk=2O#$giu
z<n5#`xBlH7k6fGl+XP=+=~;Z)oPVeQi<6m82J<qCd_FLxKU33Rg-xXRO#ChWbD^{K
z;?aTxQz)r?O8RNWhpFq+Ohjg7Z<Uh`IYKdVK)_*fwRfql{Zi@$i(W%!J}v4t6ba*-
zky%|<Wp~l6hfRkNaN#m<b4%gzGAvFicZfeu#UliV!7n#~V;P791Ga`GUr5F;SaFjB
T^M-f{00000NkvXXu0mjf!Qqx%

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/downloads/indicator.css b/application/basilisk/themes/windows/downloads/indicator.css
index 7f921f8de..627265088 100644
--- a/application/basilisk/themes/windows/downloads/indicator.css
+++ b/application/basilisk/themes/windows/downloads/indicator.css
@@ -166,9 +166,13 @@ toolbar[brighttext] #downloads-button:not([counter])[attention="success"] > #dow
   font-size: 9px;
   line-height: 9px;
   text-align: center;
+}
 
-  /* Bug 812345 added this... */
-  margin-bottom: -1px;
+@media not all and (-moz-os-version: windows-xp) {
+  #downloads-indicator-counter {
+    /* Bug 812345 added this... */
+    margin-bottom: -1px;
+  }
 }
 
 toolbar[brighttext] #downloads-indicator-counter {
diff --git a/application/basilisk/themes/windows/feeds/feedIcon-XP.png b/application/basilisk/themes/windows/feeds/feedIcon-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..9772e796b9eb8480551936e4061c380c905be506
GIT binary patch
literal 1767
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
JPDHLkV1hxEP&EJm

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/feeds/feedIcon16-XP.png b/application/basilisk/themes/windows/feeds/feedIcon16-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..54b64f876190188032707e141029a2e76d7f4459
GIT binary patch
literal 759
zcmV<T0to$yP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0008MNkl<Zc-oDV
zOGs2v7{~wj&VA{OqfX|GrbQX0+1pA;lz?`Dv=LebR3JgX5S5#Nmbq#Z5K>?Pt!mkm
z2*?PLUK$#c7zmP@raI#|_s%_!zH>5d*}Z(6$36Fde&_pt#~3{mZ!`>}+pDQao34fb
zd4wOL@MEbLLiAhe=VaHpw3Dm{cmT<Z0EJ|#??Z+vRsl6;1wH2e3hZ*PCp$LnT54yf
zx(?Bn3wj~XPJ#W(Ae<TkTllWUNQpv13e^f2ri7CyftQM>EsageupF3f8O&G`c5Ms1
z-JK{-4Wcme5Nz)2Km446!GJ)-HlPnJ2|fGb8Vt*Wm1uyy<rwUm18{eoB(Wn{{csol
z*ketiDL97^j6!S(@P%=R!Xk>3Z-C(kaJIIi^x#=oo0|}8y8_cGL!N}d86*X@nkJHN
zPuwV}Z-Cd_1#8nzAmTvge}XSgkk|kWHx8?67ZDwTTwOpo{h26~NQiJb*dXv4J5^V^
z5dQdx!ti~)cx9kh@8mU|MrrFs%FBBc={uOB5Pt~VR4rhd+66OO4Xa`sociMsxoJvZ
z25e?n5$JitiNeo3Q=1Y&5vJZXEFk~x7M7n}LiYJ(gtK2@mLw2uy9ztG7d$tM{LmeZ
z?QTB-tGXGIsbh#W0p_oHEx_pK+{+%q|3o5{C_UN@!>|yHztVGt8zYepEk=&~6(}Iq
zaUE6X-y(kMHl)9V{2;X~&^AU=`*j5d6R!b)Y(5NVC)Na@7S^=_W`vOUL9l{OR5&vN
zBVxl=0)o+a6aaLsXeWr+R2M@80Ts$4i2NM<Z%_64Ks&PejLwhgRnlBY)=sKK>qH7B
zzykqw8*i5HN%c61C?vhm9&4X<fKkhIf4zuA$WdJ6+1#Y;vxuW#-6}6to;GX~5JDw~
p7H*WS)WO!jabLinmwjaYz26Z#vb(mIXp8^=002ovPDHLkV1h1AR>S}R

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/jar.mn b/application/basilisk/themes/windows/jar.mn
index e8db7eed2..1929e69de 100644
--- a/application/basilisk/themes/windows/jar.mn
+++ b/application/basilisk/themes/windows/jar.mn
@@ -11,17 +11,21 @@ browser.jar:
 * skin/classic/browser/syncedtabs/sidebar.css     (syncedtabs/sidebar.css)
   skin/classic/browser/actionicon-tab.png
   skin/classic/browser/actionicon-tab@2x.png
-  skin/classic/browser/actionicon-tab-win7.png
+  skin/classic/browser/actionicon-tab-XPVista7.png
 * skin/classic/browser/browser.css
 * skin/classic/browser/devedition.css
 * skin/classic/browser/browser-lightweightTheme.css
   skin/classic/browser/caption-buttons.svg
   skin/classic/browser/click-to-play-warning-stripes.png
   skin/classic/browser/Info.png
+  skin/classic/browser/Info-XP.png
   skin/classic/browser/keyhole-forward-mask.svg
   skin/classic/browser/livemark-folder.png
+  skin/classic/browser/livemark-folder-XP.png
   skin/classic/browser/menu-back.png
+  skin/classic/browser/menu-back-XP.png
   skin/classic/browser/menu-forward.png
+  skin/classic/browser/menu-forward-XP.png
   skin/classic/browser/menuPanel-customize.png
   skin/classic/browser/menuPanel-customize@2x.png
   skin/classic/browser/menuPanel-exit.png
@@ -32,33 +36,36 @@ browser.jar:
   skin/classic/browser/monitor_16-10.png
   skin/classic/browser/pageInfo.css
   skin/classic/browser/pageInfo.png
+  skin/classic/browser/pageInfo-XP.png
   skin/classic/browser/privatebrowsing-mask-tabstrip.png
-  skin/classic/browser/privatebrowsing-mask-tabstrip-win7.png
+  skin/classic/browser/privatebrowsing-mask-tabstrip-XPVista7.png
   skin/classic/browser/privatebrowsing-mask-titlebar.png
-  skin/classic/browser/privatebrowsing-mask-titlebar-win7.png
-  skin/classic/browser/privatebrowsing-mask-titlebar-win7-tall.png
+  skin/classic/browser/privatebrowsing-mask-titlebar-XPVista7.png
+  skin/classic/browser/privatebrowsing-mask-titlebar-XPVista7-tall.png
   skin/classic/browser/reload-stop-go.png
   skin/classic/browser/reload-stop-go@2x.png
-  skin/classic/browser/reload-stop-go-win7.png
-  skin/classic/browser/reload-stop-go-win7@2x.png
+  skin/classic/browser/reload-stop-go-XPVista7.png
+  skin/classic/browser/reload-stop-go-XPVista7@2x.png
   skin/classic/browser/searchbar.css
   skin/classic/browser/setDesktopBackground.css
   skin/classic/browser/slowStartup-16.png
   skin/classic/browser/Toolbar.png
   skin/classic/browser/Toolbar@2x.png
-  skin/classic/browser/Toolbar-win7.png
-  skin/classic/browser/Toolbar-win7@2x.png
+  skin/classic/browser/Toolbar-aero.png
+  skin/classic/browser/Toolbar-aero@2x.png
   skin/classic/browser/Toolbar-inverted.png
   skin/classic/browser/Toolbar-inverted@2x.png
+  skin/classic/browser/Toolbar-lunaSilver.png
   skin/classic/browser/Toolbar-win8.png
   skin/classic/browser/Toolbar-win8@2x.png
-  skin/classic/browser/toolbarbutton-dropdown-arrow-win7.png
+  skin/classic/browser/Toolbar-XP.png
+  skin/classic/browser/toolbarbutton-dropdown-arrow-XPVista7.png
   skin/classic/browser/toolbarbutton-dropdown-arrow-inverted.png
   skin/classic/browser/urlbar-popup-blocked.png
   skin/classic/browser/urlbar-history-dropmarker.png
   skin/classic/browser/urlbar-history-dropmarker@2x.png
-  skin/classic/browser/urlbar-history-dropmarker-win7.png
-  skin/classic/browser/urlbar-history-dropmarker-win7@2x.png
+  skin/classic/browser/urlbar-history-dropmarker-XPVista7.png
+  skin/classic/browser/urlbar-history-dropmarker-XPVista7@2x.png
   skin/classic/browser/webRTC-indicator.css
 * skin/classic/browser/controlcenter/panel.css                 (controlcenter/panel.css)
   skin/classic/browser/customizableui/background-noise-toolbar.png  (customizableui/background-noise-toolbar.png)
@@ -71,52 +78,69 @@ browser.jar:
 * skin/classic/browser/customizableui/panelUI.css       (customizableui/panelUI.css)
 * skin/classic/browser/downloads/allDownloadsViewOverlay.css   (downloads/allDownloadsViewOverlay.css)
   skin/classic/browser/downloads/download-glow-menuPanel.png   (downloads/download-glow-menuPanel.png)
-  skin/classic/browser/downloads/download-glow-menuPanel-win7.png   (downloads/download-glow-menuPanel-win7.png)
+  skin/classic/browser/downloads/download-glow-menuPanel-XPVista7.png   (downloads/download-glow-menuPanel-XPVista7.png)
   skin/classic/browser/downloads/download-notification-finish.png (downloads/download-notification-finish.png)
   skin/classic/browser/downloads/download-notification-start.png (downloads/download-notification-start.png)
 * skin/classic/browser/downloads/downloads.css                 (downloads/downloads.css)
   skin/classic/browser/feeds/feedIcon.png                      (feeds/feedIcon.png)
   skin/classic/browser/feeds/feedIcon16.png                    (feeds/feedIcon16.png)
+  skin/classic/browser/feeds/feedIcon-XP.png                   (feeds/feedIcon-XP.png)
+  skin/classic/browser/feeds/feedIcon16-XP.png                 (feeds/feedIcon16-XP.png)
   skin/classic/browser/feeds/subscribe.css                     (feeds/subscribe.css)
   skin/classic/browser/feeds/subscribe-ui.css                  (feeds/subscribe-ui.css)
 * skin/classic/browser/newtab/newTab.css                       (newtab/newTab.css)
   skin/classic/browser/places/autocomplete-star.png            (places/autocomplete-star.png)
   skin/classic/browser/places/autocomplete-star@2x.png         (places/autocomplete-star@2x.png)
-  skin/classic/browser/places/autocomplete-star-win7.png       (places/autocomplete-star-win7.png)
+  skin/classic/browser/places/autocomplete-star-XPVista7.png   (places/autocomplete-star-XPVista7.png)
   skin/classic/browser/places/places.css                       (places/places.css)
 * skin/classic/browser/places/organizer.css                    (places/organizer.css)
   skin/classic/browser/places/query.png                        (places/query.png)
+  skin/classic/browser/places/query-XP.png                     (places/query-XP.png)
   skin/classic/browser/places/bookmarksMenu.png                (places/bookmarksMenu.png)
+  skin/classic/browser/places/bookmarksMenu-XP.png             (places/bookmarksMenu-XP.png)
   skin/classic/browser/places/bookmarksToolbar.png             (places/bookmarksToolbar.png)
+  skin/classic/browser/places/bookmarksToolbar-XP.png          (places/bookmarksToolbar-XP.png)
   skin/classic/browser/places/bookmarksToolbar-menuPanel.png   (places/bookmarksToolbar-menuPanel.png)
+  skin/classic/browser/places/bookmarksToolbar-menuPanel-XP.png (places/bookmarksToolbar-menuPanel-XP.png)
   skin/classic/browser/places/bookmarks-notification-finish.png (places/bookmarks-notification-finish.png)
   skin/classic/browser/places/calendar.png                     (places/calendar.png)
+  skin/classic/browser/places/calendar-XP.png                  (places/calendar-XP.png)
   skin/classic/browser/places/toolbarDropMarker.png            (places/toolbarDropMarker.png)
+  skin/classic/browser/places/toolbarDropMarker-XP.png         (places/toolbarDropMarker-XP.png)
   skin/classic/browser/places/editBookmarkOverlay.css          (places/editBookmarkOverlay.css)
   skin/classic/browser/places/libraryToolbar.png               (places/libraryToolbar.png)
+  skin/classic/browser/places/libraryToolbar-XP.png            (places/libraryToolbar-XP.png)
   skin/classic/browser/places/starred48.png                    (places/starred48.png)
+  skin/classic/browser/places/starred48-XP.png                 (places/starred48-XP.png)
   skin/classic/browser/places/unstarred48.png                  (places/unstarred48.png)
   skin/classic/browser/places/tag.png                          (places/tag.png)
+  skin/classic/browser/places/tag-XP.png                       (places/tag-XP.png)
   skin/classic/browser/places/history.png                      (places/history.png)
+  skin/classic/browser/places/history-XP.png                   (places/history-XP.png)
   skin/classic/browser/places/allBookmarks.png                 (places/allBookmarks.png)
+  skin/classic/browser/places/allBookmarks-XP.png              (places/allBookmarks-XP.png)
   skin/classic/browser/places/unsortedBookmarks.png            (places/unsortedBookmarks.png)
+  skin/classic/browser/places/unsortedBookmarks-XP.png         (places/unsortedBookmarks-XP.png)
   skin/classic/browser/places/downloads.png                    (places/downloads.png)
   skin/classic/browser/places/livemark-item.png                (places/livemark-item.png)
   skin/classic/browser/preferences/alwaysAsk.png               (preferences/alwaysAsk.png)
+  skin/classic/browser/preferences/alwaysAsk-XP.png            (preferences/alwaysAsk-XP.png)
   skin/classic/browser/preferences/application.png             (preferences/application.png)
+  skin/classic/browser/preferences/application-XP.png          (preferences/application-XP.png)
   skin/classic/browser/preferences/saveFile.png                (preferences/saveFile.png)
+  skin/classic/browser/preferences/saveFile-XP.png             (preferences/saveFile-XP.png)
   skin/classic/browser/preferences/preferences.css             (preferences/preferences.css)
 * skin/classic/browser/preferences/in-content/preferences.css  (preferences/in-content/preferences.css)
 * skin/classic/browser/preferences/in-content/dialog.css       (preferences/in-content/dialog.css)
   skin/classic/browser/preferences/applications.css            (preferences/applications.css)
   skin/classic/browser/tabbrowser/newtab.svg                   (tabbrowser/newtab.svg)
-  skin/classic/browser/tabbrowser/newtab-win7.svg              (tabbrowser/newtab-win7.svg)
+  skin/classic/browser/tabbrowser/newtab-XPVista7.svg          (tabbrowser/newtab-XPVista7.svg)
   skin/classic/browser/tabbrowser/newtab-inverted.svg          (tabbrowser/newtab-inverted.svg)
-  skin/classic/browser/tabbrowser/newtab-inverted-win7.svg     (tabbrowser/newtab-inverted-win7.svg)
+  skin/classic/browser/tabbrowser/newtab-inverted-XPVista7.svg (tabbrowser/newtab-inverted-XPVista7.svg)
   skin/classic/browser/tabbrowser/tab-active-middle.png        (tabbrowser/tab-active-middle.png)
   skin/classic/browser/tabbrowser/tab-active-middle@2x.png     (tabbrowser/tab-active-middle@2x.png)
   skin/classic/browser/tabbrowser/tab-arrow-left.svg           (tabbrowser/tab-arrow-left.svg)
-  skin/classic/browser/tabbrowser/tab-arrow-left-win7.svg      (tabbrowser/tab-arrow-left-win7.svg)
+  skin/classic/browser/tabbrowser/tab-arrow-left-XPVista7.svg  (tabbrowser/tab-arrow-left-XPVista7.svg)
   skin/classic/browser/tabbrowser/tab-arrow-left-inverted.svg  (tabbrowser/tab-arrow-left-inverted.svg)
   skin/classic/browser/tabbrowser/tab-background-start.png     (tabbrowser/tab-background-start.png)
   skin/classic/browser/tabbrowser/tab-background-start@2x.png  (tabbrowser/tab-background-start@2x.png)
@@ -148,8 +172,8 @@ browser.jar:
   skin/classic/browser/sync-desktopIcon.svg  (../shared/sync-desktopIcon.svg)
   skin/classic/browser/sync-horizontalbar.png
   skin/classic/browser/sync-horizontalbar@2x.png
-  skin/classic/browser/sync-horizontalbar-win7.png
-  skin/classic/browser/sync-horizontalbar-win7@2x.png
+  skin/classic/browser/sync-horizontalbar-XPVista7.png
+  skin/classic/browser/sync-horizontalbar-XPVista7@2x.png
   skin/classic/browser/sync-mobileIcon.svg  (../shared/sync-mobileIcon.svg)
   skin/classic/browser/sync-notification-24.png
   skin/classic/browser/syncSetup.css
@@ -157,16 +181,16 @@ browser.jar:
   skin/classic/browser/syncQuota.css
   skin/classic/browser/syncProgress-horizontalbar.png
   skin/classic/browser/syncProgress-horizontalbar@2x.png
-  skin/classic/browser/syncProgress-horizontalbar-win7.png
-  skin/classic/browser/syncProgress-horizontalbar-win7@2x.png
+  skin/classic/browser/syncProgress-horizontalbar-XPVista7.png
+  skin/classic/browser/syncProgress-horizontalbar-XPVista7@2x.png
   skin/classic/browser/syncProgress-menuPanel.png
   skin/classic/browser/syncProgress-menuPanel@2x.png
   skin/classic/browser/syncProgress-toolbar.png
   skin/classic/browser/syncProgress-toolbar@2x.png
   skin/classic/browser/syncProgress-toolbar-inverted.png
   skin/classic/browser/syncProgress-toolbar-inverted@2x.png
-  skin/classic/browser/syncProgress-toolbar-win7.png
-  skin/classic/browser/syncProgress-toolbar-win7@2x.png
+  skin/classic/browser/syncProgress-toolbar-XPVista7.png
+  skin/classic/browser/syncProgress-toolbar-XPVista7@2x.png
 
 [extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}] chrome.jar:
 % override chrome://browser/skin/page-livemarks.png                   chrome://browser/skin/feeds/feedIcon16.png
@@ -176,31 +200,58 @@ browser.jar:
 % override chrome://browser/skin/feeds/videoFeedIcon16.png            chrome://browser/skin/feeds/feedIcon16.png
 
 % override chrome://browser/skin/aboutSessionRestore-window-icon.png  chrome://browser/skin/preferences/application.png                 os!=WINNT
+% override chrome://browser/skin/aboutSessionRestore-window-icon.png  chrome://browser/skin/preferences/application.png                 os=WINNT osversion<6
 
-% override chrome://browser/skin/actionicon-tab.png                   chrome://browser/skin/actionicon-tab-win7.png                 os=WINNT osversion<=6.1
-% override chrome://browser/skin/privatebrowsing-mask-tabstrip.png    chrome://browser/skin/privatebrowsing-mask-tabstrip-win7.png  os=WINNT osversion<=6.1
-% override chrome://browser/skin/privatebrowsing-mask-titlebar.png    chrome://browser/skin/privatebrowsing-mask-titlebar-win7.png  os=WINNT osversion<=6.1
-% override chrome://browser/skin/reload-stop-go.png                   chrome://browser/skin/reload-stop-go-win7.png                 os=WINNT osversion<=6.1
-% override chrome://browser/skin/reload-stop-go@2x.png                chrome://browser/skin/reload-stop-go-win7@2x.png              os=WINNT osversion<=6.1
-% override chrome://browser/skin/sync-horizontalbar.png               chrome://browser/skin/sync-horizontalbar-win7.png             os=WINNT osversion<=6.1
-% override chrome://browser/skin/sync-horizontalbar@2x.png            chrome://browser/skin/sync-horizontalbar-win7@2x.png          os=WINNT osversion<=6.1
-% override chrome://browser/skin/syncProgress-horizontalbar.png       chrome://browser/skin/syncProgress-horizontalbar-win7.png     os=WINNT osversion<=6.1
-% override chrome://browser/skin/syncProgress-horizontalbar@2x.png    chrome://browser/skin/syncProgress-horizontalbar-win7@2x.png  os=WINNT osversion<=6.1
-% override chrome://browser/skin/syncProgress-toolbar.png             chrome://browser/skin/syncProgress-toolbar-win7.png           os=WINNT osversion<=6.1
-% override chrome://browser/skin/syncProgress-toolbar@2x.png          chrome://browser/skin/syncProgress-toolbar-win7@2x.png        os=WINNT osversion<=6.1
-% override chrome://browser/skin/toolbarbutton-dropdown-arrow.png     chrome://browser/skin/toolbarbutton-dropdown-arrow-win7.png   os=WINNT osversion<=6.1
-% override chrome://browser/skin/urlbar-history-dropmarker.png        chrome://browser/skin/urlbar-history-dropmarker-win7.png      os=WINNT osversion<=6.1
-% override chrome://browser/skin/urlbar-history-dropmarker@2x.png     chrome://browser/skin/urlbar-history-dropmarker-win7@2x.png   os=WINNT osversion<=6.1
-% override chrome://browser/skin/downloads/download-glow-menuPanel.png  chrome://browser/skin/downloads/download-glow-menuPanel-win7.png os=WINNT osversion<=6.1
-% override chrome://browser/skin/places/autocomplete-star.png         chrome://browser/skin/places/autocomplete-star-win7.png       os=WINNT osversion<=6.1
-% override chrome://browser/skin/tabbrowser/newtab.svg                chrome://browser/skin/tabbrowser/newtab-win7.svg              os=WINNT osversion<=6.1
-% override chrome://browser/skin/tabbrowser/newtab-inverted.svg       chrome://browser/skin/tabbrowser/newtab-inverted-win7.svg     os=WINNT osversion<=6.1
-% override chrome://browser/skin/tabbrowser/tab-arrow-left.svg        chrome://browser/skin/tabbrowser/tab-arrow-left-win7.svg      os=WINNT osversion<=6.1
+% override chrome://browser/skin/Info.png                             chrome://browser/skin/Info-XP.png                                 os=WINNT osversion<6
+% override chrome://browser/skin/livemark-folder.png                  chrome://browser/skin/livemark-folder-XP.png                      os=WINNT osversion<6
+% override chrome://browser/skin/menu-back.png                        chrome://browser/skin/menu-back-XP.png                            os=WINNT osversion<6
+% override chrome://browser/skin/menu-forward.png                     chrome://browser/skin/menu-forward-XP.png                         os=WINNT osversion<6
+% override chrome://browser/skin/pageInfo.png                         chrome://browser/skin/pageInfo-XP.png                             os=WINNT osversion<6
+% override chrome://browser/skin/feeds/feedIcon.png                   chrome://browser/skin/feeds/feedIcon-XP.png                       os=WINNT osversion<6
+% override chrome://browser/skin/feeds/feedIcon16.png                 chrome://browser/skin/feeds/feedIcon16-XP.png                     os=WINNT osversion<6
+% override chrome://browser/skin/places/query.png                     chrome://browser/skin/places/query-XP.png                         os=WINNT osversion<6
+% override chrome://browser/skin/places/bookmarksMenu.png             chrome://browser/skin/places/bookmarksMenu-XP.png                 os=WINNT osversion<6
+% override chrome://browser/skin/places/bookmarksToolbar.png          chrome://browser/skin/places/bookmarksToolbar-XP.png              os=WINNT osversion<6
+% override chrome://browser/skin/places/bookmarksToolbar-menuPanel.png  chrome://browser/skin/places/bookmarksToolbar-menuPanel-XP.png  os=WINNT osversion<6
+% override chrome://browser/skin/places/calendar.png                  chrome://browser/skin/places/calendar-XP.png                      os=WINNT osversion<6
+% override chrome://browser/skin/places/toolbarDropMarker.png         chrome://browser/skin/places/toolbarDropMarker-XP.png             os=WINNT osversion<6
+% override chrome://browser/skin/places/libraryToolbar.png            chrome://browser/skin/places/libraryToolbar-XP.png                os=WINNT osversion<6
+% override chrome://browser/skin/places/starred48.png                 chrome://browser/skin/places/starred48-XP.png                     os=WINNT osversion<6
+% override chrome://browser/skin/places/tag.png                       chrome://browser/skin/places/tag-XP.png                           os=WINNT osversion<6
+% override chrome://browser/skin/places/history.png                   chrome://browser/skin/places/history-XP.png                       os=WINNT osversion<6
+% override chrome://browser/skin/places/allBookmarks.png              chrome://browser/skin/places/allBookmarks-XP.png                  os=WINNT osversion<6
+% override chrome://browser/skin/places/unsortedBookmarks.png         chrome://browser/skin/places/unsortedBookmarks-XP.png             os=WINNT osversion<6
+% override chrome://browser/skin/preferences/alwaysAsk.png            chrome://browser/skin/preferences/alwaysAsk-XP.png                os=WINNT osversion<6
+% override chrome://browser/skin/preferences/application.png          chrome://browser/skin/preferences/application-XP.png              os=WINNT osversion<6
+% override chrome://browser/skin/preferences/saveFile.png             chrome://browser/skin/preferences/saveFile-XP.png                 os=WINNT osversion<6
 
-% override chrome://browser/skin/Toolbar@2x.png                       chrome://browser/skin/Toolbar-win7@2x.png                         os=WINNT osversion=6.1
+% override chrome://browser/skin/actionicon-tab.png                   chrome://browser/skin/actionicon-tab-XPVista7.png                 os=WINNT osversion<=6.1
+% override chrome://browser/skin/privatebrowsing-mask-tabstrip.png    chrome://browser/skin/privatebrowsing-mask-tabstrip-XPVista7.png  os=WINNT osversion<=6.1
+% override chrome://browser/skin/privatebrowsing-mask-titlebar.png    chrome://browser/skin/privatebrowsing-mask-titlebar-XPVista7.png  os=WINNT osversion<=6.1
+% override chrome://browser/skin/reload-stop-go.png                   chrome://browser/skin/reload-stop-go-XPVista7.png                 os=WINNT osversion<=6.1
+% override chrome://browser/skin/reload-stop-go@2x.png                chrome://browser/skin/reload-stop-go-XPVista7@2x.png              os=WINNT osversion<=6.1
+% override chrome://browser/skin/sync-horizontalbar.png               chrome://browser/skin/sync-horizontalbar-XPVista7.png             os=WINNT osversion<=6.1
+% override chrome://browser/skin/sync-horizontalbar@2x.png            chrome://browser/skin/sync-horizontalbar-XPVista7@2x.png          os=WINNT osversion<=6.1
+% override chrome://browser/skin/syncProgress-horizontalbar.png       chrome://browser/skin/syncProgress-horizontalbar-XPVista7.png     os=WINNT osversion<=6.1
+% override chrome://browser/skin/syncProgress-horizontalbar@2x.png    chrome://browser/skin/syncProgress-horizontalbar-XPVista7@2x.png  os=WINNT osversion<=6.1
+% override chrome://browser/skin/syncProgress-toolbar.png             chrome://browser/skin/syncProgress-toolbar-XPVista7.png           os=WINNT osversion<=6.1
+% override chrome://browser/skin/syncProgress-toolbar@2x.png          chrome://browser/skin/syncProgress-toolbar-XPVista7@2x.png        os=WINNT osversion<=6.1
+% override chrome://browser/skin/toolbarbutton-dropdown-arrow.png     chrome://browser/skin/toolbarbutton-dropdown-arrow-XPVista7.png   os=WINNT osversion<=6.1
+% override chrome://browser/skin/urlbar-history-dropmarker.png        chrome://browser/skin/urlbar-history-dropmarker-XPVista7.png      os=WINNT osversion<=6.1
+% override chrome://browser/skin/urlbar-history-dropmarker@2x.png     chrome://browser/skin/urlbar-history-dropmarker-XPVista7@2x.png   os=WINNT osversion<=6.1
+% override chrome://browser/skin/downloads/download-glow-menuPanel.png  chrome://browser/skin/downloads/download-glow-menuPanel-XPVista7.png os=WINNT osversion<=6.1
+% override chrome://browser/skin/places/autocomplete-star.png         chrome://browser/skin/places/autocomplete-star-XPVista7.png       os=WINNT osversion<=6.1
+% override chrome://browser/skin/tabbrowser/newtab.svg                chrome://browser/skin/tabbrowser/newtab-XPVista7.svg              os=WINNT osversion<=6.1
+% override chrome://browser/skin/tabbrowser/newtab-inverted.svg       chrome://browser/skin/tabbrowser/newtab-inverted-XPVista7.svg     os=WINNT osversion<=6.1
+% override chrome://browser/skin/tabbrowser/tab-arrow-left.svg        chrome://browser/skin/tabbrowser/tab-arrow-left-XPVista7.svg      os=WINNT osversion<=6.1
+
+% override chrome://browser/skin/Toolbar@2x.png                       chrome://browser/skin/Toolbar-aero@2x.png                         os=WINNT osversion=6
+% override chrome://browser/skin/Toolbar@2x.png                       chrome://browser/skin/Toolbar-aero@2x.png                         os=WINNT osversion=6.1
 % override chrome://browser/skin/Toolbar@2x.png                       chrome://browser/skin/Toolbar-win8@2x.png                         os=WINNT osversion=6.2
 % override chrome://browser/skin/Toolbar@2x.png                       chrome://browser/skin/Toolbar-win8@2x.png                         os=WINNT osversion=6.3
-% override chrome://browser/skin/Toolbar.png                          chrome://browser/skin/Toolbar-win7.png                            os=WINNT osversion=6.1
+% override chrome://browser/skin/Toolbar.png                          chrome://browser/skin/Toolbar-XP.png                              os=WINNT osversion<6
+% override chrome://browser/skin/Toolbar.png                          chrome://browser/skin/Toolbar-aero.png                            os=WINNT osversion=6
+% override chrome://browser/skin/Toolbar.png                          chrome://browser/skin/Toolbar-aero.png                            os=WINNT osversion=6.1
 % override chrome://browser/skin/Toolbar.png                          chrome://browser/skin/Toolbar-win8.png                            os=WINNT osversion=6.2
 % override chrome://browser/skin/Toolbar.png                          chrome://browser/skin/Toolbar-win8.png                            os=WINNT osversion=6.3
 
diff --git a/application/basilisk/themes/windows/livemark-folder-XP.png b/application/basilisk/themes/windows/livemark-folder-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..00aa0364d3e5003c0d531ba68ad2ed11b1a5f451
GIT binary patch
literal 667
zcmV;M0%ZM(P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0007FNkl<Zc-p0r
z4`fzR7{-6+es^tcZL78awc4_6$x5@zXhn+<+bCL!sDuD2NTLKKD1;;xmWE2C#Hd7A
zQnGB?rio_zw%WJt+qUoAbI+T5cTFjx9-i|YJnwV7&ru@6|G@3K*FsTA=85E#cgb3D
z`3XuXyCgg9Vtjb!%!c}c--a`)ZlVS{_mw8bQ=e;_jx17k3^Ah+L7YOmUp(@b<)@dg
zY3dl_4^V?I_xJk7*6<IAxy~ndcE;3H?KqDU%R{gbP$CkjKd<;81_V%o=s5kauUET9
zTU0Cu>-B}^r)PJPQ(Q@2#d^v%?ItU~GzyG}fKoWI0<;z!t$na2GH7-mZlS)RkgSQv
zyuWpv&#yYbp9MPyb`}Zf&mrRBX&=WJ3u3^g5UWX=a@_I*tlIm4#yzd*p4+^+a{=F*
zMr;ZK`qN;hF`nSsa8->+D%8OzS4d2NlU+vr!BeblF6aBJ%k(|FOU<smAQ~}~SRbqi
zjx`pMIf&BN9cyRn(bH_KoT2O5NoM^lme)3uInv40P&d{aLn2yVaOTUN3HP*ql4QJx
z@zFTx+t0DBv54OLH_(L*RFt}met0|okoe)F5(L<=f^n?(9lQh|Z(n8b;Z26#Jx8x@
zrYh$vi7!3)+0|rD^hfKOu+U)E6#+~lYFV?nsgAU7-At`m3AwrCX29gw2-9vJOPwIV
z1MvfIxPluT)*At}7ywn*hEa#e(8Hn0wA`TBj3UHPTiUR511O0hHuy?~>S}KtN=|wu
zgb+YQR{^DdRVPpukd^JmRiHpRuxMfW?+`!(sUNo8Vg->lBsu^9002ovPDHLkV1mkk
BK`H<M

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/menu-back-XP.png b/application/basilisk/themes/windows/menu-back-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..bbc1f8ab97969e98ed120a5762d5a65faf7e5d94
GIT binary patch
literal 323
zcmV-J0lfZ+P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0003BNkl<ZcwVK`
zPfNmZ7zglPpk`F`BDAVw(Hj_Smo<Lbs6~QZs<WsPKLVL3TN{DVoVhtIw32k_A_Bg3
z3-I#Hfba47!1Hejz`sHQ7-P01Nt+7+`TWJb>$=c&{aX-(bS&UJm$QQ)Koot#aU6)E
zXp(`GQ_b=`AJbU`-|s@x&Ma~ZN7-Yu)$Sk+r+DgkP*v3=4^fsC<KfZ8$2f%3YC}<&
zLEggN{z1dCn;1_b3|~jMyt;10TI1^42Isdm4BtX@djrUajK{u%bY_QFbp!pE5o+~2
zY;Esy0zg0r00AKZ^GNUc9i=kIa%!bQ0OpZG@djB{`}zge7kZ{dGF3?=|B49!JwL_~
V`3}64XoCO%002ovPDHLkV1mpDjHmzr

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/menu-forward-XP.png b/application/basilisk/themes/windows/menu-forward-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..3b91d5f0b2eff46e34441cac204d4301b8ac4873
GIT binary patch
literal 322
zcmV-I0lof-P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0003ANkl<ZcwVKG
zQA@&50EPR3nquOQFsmL5|G;2-S>tA-776xJJx3{V31XsbZ3IPg=H{%(O0uDg2spiW
zgY7EtJ$@e?;4A=`i+=@4l1hXSd!~RO2t{4je_Yo^t#)|B9S}v)bQ}j!^o1Y@a8Rw<
z+!Hiy-}3!FCesL>=VNzIvtj})s;Zg~Jr7|xL8sfpc4fzm39u*%F`P~pAL9^r_by~v
zF=7HNN5?1a;p+(F&j^-%i;c~4n=2r15!xTTVE7h-UN(_iD$vA%mDP3HY+d8=d4wz7
zKyi7EG81^^zwpZOfyGR=abBkwJiRk=(m=kVYTu`47mS>ELMoljr_z}Q$C+m57cZsx
U4ytF01^@s607*qoM6N<$g7;2_(*OVf

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/pageInfo-XP.png b/application/basilisk/themes/windows/pageInfo-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..8cff4ca6eef3f37ebf022c6d2642401e046e0fcc
GIT binary patch
literal 7640
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

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/places/allBookmarks-XP.png b/application/basilisk/themes/windows/places/allBookmarks-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..1f049fc1e18c5087ffbe5b9fee45b50e6b4ccfe4
GIT binary patch
literal 490
zcmV<G0Tup<P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00058Nkl<ZcwUW@
zF>6#&5QV?DF9ux;F<Y1rBtfx|s9P)uqJ^ZjvQ$e;3-@2x2wM0HQfs48?E+$9AsUUV
z3la>7(X47@v5`Axt}r}t!93OjhszY_<IIIAa?Su;ys&fyxW#{JINWCW{?%fl3f};_
zr_U^K>2im0T79<8^=r!j1OVtRF17)<y|jvQM&`IXDG4*fl9S9x$(WvL5gGx|?+<Yo
zr_SypJ4gkt5~+cF0=EKFX5-x#fPVq*9)PTj2LN0-EP*VClZjC^{sM#~%nPgvADG#X
zMYsZZ#!?+X7S5KDGG@^3%+Y9+#4IqQ9$+$(6nnbC(POhrPL^~|&QX>nGACA$cK!oZ
z4GtZdX5qvvl{h#*6@K-6lQ(MvWL5`IwCKP7#K!t}&YeF_B_7@F^Wpsu<Y4ACD_9D;
z37XAa0Ia>(1YoMQ7mIL4@|_!)8B&T}_cV8N?@o`w=b!XmZZUtjg&Sm13y81<0N(bt
zA|Pe9zy0Ft;3Mwf8rQ&uA{b#@;GS_GoogFd*dmyT1`hH50p$XKhYy~N0^&4p0$qT|
gD^D4tIAbdP20hSKGHYQ%*8l(j07*qoM6N<$f{OssCjbBd

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/places/autocomplete-star-XPVista7.png b/application/basilisk/themes/windows/places/autocomplete-star-XPVista7.png
new file mode 100644
index 0000000000000000000000000000000000000000..b4b2ac811ec3e98c4b353967b5f77844cca44a31
GIT binary patch
literal 727
zcmV;|0x127P)<h;3K|Lk000e1NJLTq001BW000mO1^@s6cL04^0007>Nkl<ZcwU{9
zeMnPL7{=do?#FhgQ}1QkaOJYBv{nWX6@WlUR1|Fx5?~-g6;x0G1tHY{N+1vtp<2)a
zk|-z%6p9QafauS%un4Fi$kCk3m~$WZ_6RE1&FyYI@VoEXd!Kur_Y62xOf_9Yk3fk2
zQ-)#O1~-d&Sds7@l571tL(l4&sc)^*VgGoU;oDJ0fDYOjV-qX+I2Dl1;S6$zMna{F
z+mwoHRKCueGR_q;@dBscrdPQ4E&fSZ2heLS<Mb^k?WWd2^qNW<06}YT;_F<gVM`{5
z$|aj}1MfT~gx8~71S}`#65hFU{S1M}P}{&((98t6TGSedD=L|#Ct{R|eJ3NEo<`#n
z_y|T~_YaGxyFfE&0##I8f4~>;8H_U5nKyBgomEUyhy&sR6_uVPJv~bX5K{5Tul}}}
zDYRT7ymQaypyaI0a9gEyIDm)XCAq40u4}I^h|Wonrt&olPVv5g7WVs;tBg^GN)(5;
zqgA=wdq^8(jE$jnqRb)Epc~)574ewDWpOu^F>J#V$sWTXZWSKzDOdXZY8c_u1fjmb
z9%r!}0741j#}@`CzOcdXdq=f_)z$nJS*TGJh6j$Qq4~khef)lo@{FuC2=B|hdjQQy
zG#afW3r$8Mj`@KL80yGcbp`K%lp!>dg;FFI^Q<FlEz97h3&@cs`zo_j<TL{k%LkAf
z;1yQ5fE1MaoOT?{<PHh1kT-zCE^TC@#0e5OCAYYxheO@2j=@f?V^f{@gfp5Why=TA
z6S<f2wbry>0`!BOU^ln}l7N5=JWGdMTx{^D;@2#j@oM5|PrLKM{ubpu+CKmrJ8hpB
z`jB|s`}%L!&v>@Y>rv%N%2O7^!BcRHF=n;|aq1B21#o~&`UiZk(d%|KT?haG002ov
JPDHLkV1mvLPgei{

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/places/bookmarksMenu-XP.png b/application/basilisk/themes/windows/places/bookmarksMenu-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..0c921fc8718df4e0905853cbaca0380d99f2fbfa
GIT binary patch
literal 278
zcmV+x0qOpUP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0002pNkl<Zc-pnk
zu?~VT5P)Hx&xi31jPIb6i4&uPCQK&c;^OY2QAcMLXrYwCc~>ZEEJi{k`DnS4KdE!r
zt)UBNKAS+(Gj&}!UxIIjI?#o)-7KKZQ~mE4I#3h^^hSF^dz4oS!+hHVd9Lb!!u`_s
zKOD~|I<p6|OqLX_DJW!Sis-p!52RASpzmpEDo|3AM1aIq;vDz(fDpV6h=ey?fzIrK
zIF2CZgq3Uj#L>&l9^fp1{%Wi-9spw%{=RZ#4Mfr11ZdxM1w6ai17Udm)qesW4O{SD
c1N7?T0ob=_Rhmu=0ssI207*qoM6N<$f@V2)<^TWy

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/places/bookmarksToolbar-XP.png b/application/basilisk/themes/windows/places/bookmarksToolbar-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..fb16d4e4493f76705ec73578f50fe59b9ec5cef3
GIT binary patch
literal 198
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`y`C<PAr-fhfBgS%?>eK1IWOkc
zY_=o+Paa5b*fEdsh@$Wu#z$3c&eh?6|9^QY8)maIS5!j&R-LG9^ON%ohKCq54rCoz
ztIa>ra24b0u(K?M3I7hgWYS>RxKWyc^@)_j4c6SNn;mE5h#xR;6rYgGV8&Bqq~~*i
w;gCccgMdaOkD{o4w8_U?OYZ%WWS%e0sCLA+sIAH_0q8IWPgg&ebxsLQ05Z`?FaQ7m

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/places/bookmarksToolbar-menuPanel-XP.png b/application/basilisk/themes/windows/places/bookmarksToolbar-menuPanel-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..481f477b5aed9578a7cdc1e143606d1395840147
GIT binary patch
literal 689
zcmV;i0#5yjP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80007bNkl<Zc-rk&
z-D(p-7|k14Ku|@HprTLUop*f!@d307%}?7j+x<zh*-bY4ze&1DYPChY^d0ol8@=%j
zL_jPcDg;Cjq{w(aP$`|6?FMKlkby&%`Of*ync0~ng~eEmGc#5<j3Tf+Clt8=)h%;s
zbVAnXMyCq$ATKUJ+v~GrvOgD)7Z<?xhb$TI=SDo*V^R8)Fq4h|FFt_f4_G|j%ME|{
zm{#%{y0>_qNehi2fH$C3<pQl5{9o&ubrraQ=R?fp){_^12HZY1&ILD_Fs11{|EI<C
z3(V!#!;24Kx(N%@CsG94yUZKxFee`2G>3;(rFrfD4N_XSF!viZ;t)5p7rX=kdNB(j
zJdObG*NIZra-vVF*?YNZ*!`Mr-94_y+&$EW;JgC&02<N?d%}wk&~jo3b~(`28g?))
z%s3jI@ENqip5(;|nodL~n}ge*FtzP|Ua2bA^O}QuQ?<OW&<cCPOAw$NGJmimL^s@K
zYg?_4E0y|{lgz;>uBqk$G}3<LCD^inc}OfnCm6C)&3ONyym?+`j@o5#K7gCq3tr*?
z*s@IMw$HG_+p+);EA>0zWcQH<AYn4j1PLEilqFdJ)GmT^avykcVgr-Ccq9c~D_pTJ
zM>Y3LwM)Q-qjOr@{SIzsFGCc7w$4FOh7Jyu(sJJXHC_Uua=rPpTyOlqvj?1`8g9(H
zZj@&B(uDymk5(xKooaBVs~h?Vrc(`kI&1{2nqlr6YAIg96x_^S=)(ul+8#{OOwf-A
zzF_E6STk&{CIr0r0C>N&%DDhue1LV;oYLWFoHEFRyaazrwPLBJFV6$yRalJ0I4k21
XLpU}}aQt=R00000NkvXXu0mjfIo3PQ

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/places/calendar-XP.png b/application/basilisk/themes/windows/places/calendar-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..3b3dc52f33193318ba6d440c1c313a3358cee891
GIT binary patch
literal 555
zcmV+`0@VG9P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0005<Nkl<ZcwVJa
zJ!lkB5dQ91gow3&a3WeHT6mBjA!-qY;5Ax`RT?`B3mZXDi=ZHKg@Oi??m8PS#3CnX
z4pNARLIklAIaUxvV$9v@?R#%#WahEl38oM~_?T~J`R1GVc1!OUZVR@6h*BasRvyw5
zm#>u)H5{J&h<`=<<zA~c0G~6!2h2U)hQ`b~(9a`(^?}?)?HuOTkE5~u1r)UZg4Hq<
zEPyZ?mqq|)fRv<qP&vLYK*UijuYQuP5J)5sBAFA}=!<;IM85PyIzL42FRrKoWg>!N
z?W@tye3c@fKL-+ErJZ8rMh$_1H}6vHx><uG!29ScQ(*iJt=T$)ME(5il9@E|S?vKF
z1KxQkk`Ty5b*B|eotdgwqJ~UVD{3~=!LfbOOgbRM4T6cdwp^`&c(Aq(Xus`X_pPX3
zx7Ki|UL2tqU>gipEl$)tvuOHf*2kmiJC@wt$Z)T6#rnZVU!s$S);5k;O<U5DsZn^<
z0T@4hO#Aj+1eaaz|6E&j>qBwdXg*%WSUvW?cT#lI6zZi=9Ki=m(?L&8-ZfKiGsDBt
z>!!P#J<RX8XsHEA20v2bT(H#XqX*Pr`o!!ce7t#_I&bO5WKRXeaR9T#0s0k|7M4MQ
tL8K&btRNO}V6d?DM8u54C~5P5@EhSqm{{^3q%r^i002ovPDHLkV1l}>{UHDV

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/places/history-XP.png b/application/basilisk/themes/windows/places/history-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..fcc89bbbf0b6d30d0f33c6dc209b4ff172fe908e
GIT binary patch
literal 821
zcmV-51Iqk~P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0008~Nkl<Zc-m!C
z-%Aux6#nj=ot+uob=-ArlZvuMGb^B=iYg!|=q-wXUV@5%DuRmgy_X=PdefJ{e?S5w
z0;HEnqBN2!k|@c<64F)ohwjYWxpz8qaee8)+{>MF&v(xE-E&wJMX1|@$Nh#<(UFD*
z=X5&NxX-q&LhScEf3i|t9`!u$DP!#Qotsx=J!TEy{=>euWYX+u-?HgKQ#$1eAt2Q%
zINjmgK&4VG&HR}iAYX6Kt*f(j03Do8H}-Gq*m_b*2|<BwO9pAn#ELHv$Owz`3*agS
zV)*%MdZ<>bU5P=AMmKMmrg?YA_Kx#@AkdI;v2*t>tY4qUy?c+a|JVs^-qMC#J`bXS
zYPo`p>vomOWn<*c=u1wV54UgLcu7iyRJIx2JGa9y4AgC6{5^zFP!Yqn?k=RWEfAr^
zy4H1<sQSa41UuupO{qXBbaZt<5v7p8B%NbZGDHmS2O$M2bar(@G7iUfQpsfU3@5es
z3MxI5%Ysv8Nqng)$W?K9!i@iEL6>U+j$@KOEr><7EqgDwEvpbxHZzLFQ-mI^1;qAh
z_yw53G^mIaY%>8vhT2cs6}Y}e%WA^a@`(nOo6EVFo|?jkcjEwKVDyn`Kk?Tw32Kf>
zk|5_r91%H`&=nA8iHp~+W6yz47=Hc?D>Wa74(`_g0$gVlp_t_KG-Gj-EY1}X`ck8k
z%DR$TEkx&zZX7y#9Lwb;<eM9?RPwM?ENZ<d`532Vuu`p7Ir0DT?K@0^!y=wUS8GDA
zqBEa6dkVgg`1tuNIB5_Bel-lmASYfUGrwn_(2k|Kc}#qn0HdJRjDtenMSE)#TALlr
zmsT+Hb{ysTIdI0YuuzO+MszFpKI&_89H)QNh7BhLWs#hrDVrs=C6rPKV4$>61PenL
zM0c+EcgXiW-OBZ0(jbXMqK7){f@9lm5D1W_T5Se^a}Lk<ON)!e0jXp!O{5;C|Hhfl
zM=Z-aZ6&RJiG*1Ipw;$0Z<KaD&bMz|UK{6sU6Z>976_6w00000NkvXXu0mjfRQ7?;

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/places/libraryToolbar-XP.png b/application/basilisk/themes/windows/places/libraryToolbar-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..5d7d8984d3ba6fa415a1d88025460970338da235
GIT binary patch
literal 2025
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
Hu0mjfLTbQ4

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/places/organizer.css b/application/basilisk/themes/windows/places/organizer.css
index 9ae4c8370..4de603b9f 100644
--- a/application/basilisk/themes/windows/places/organizer.css
+++ b/application/basilisk/themes/windows/places/organizer.css
@@ -20,6 +20,13 @@
   list-style-image: url("chrome://browser/skin/Toolbar.png");
 }
 
+@media (-moz-windows-theme: luna-silver) {
+  #back-button,
+  #forward-button {
+    list-style-image: url("chrome://browser/skin/Toolbar-lunaSilver.png");
+  }
+}
+
 #back-button {
   -moz-image-region: rect(0, 54px, 18px, 36px);
 }
@@ -112,6 +119,11 @@
   -moz-image-region: rect(16px, 48px, 32px, 32px);
 }
 
+/* Root View */
+#placesView {
+  border-top: 1px solid ThreeDDarkShadow;
+}
+
 /* Info box */
 #detailsDeck {
   border-top: 1px solid ThreeDShadow;
@@ -139,28 +151,35 @@
   padding-inline-end: 9px;
 }
 
-@media not all and (-moz-windows-classic) {
-  #placesToolbox {
-    -moz-appearance: none;
-    background-color: transparent;
+
+@media not all and (-moz-os-version: windows-xp) {
+  #placesView {
+    border-top: none;
   }
 
-  #placesToolbar {
-    -moz-appearance: none;
-    background-color: -moz-Dialog;
-    color: -moz-dialogText;
+  @media not all and (-moz-windows-classic) {
+    #placesToolbox {
+      -moz-appearance: none;
+      background-color: transparent;
+    }
+
+    #placesToolbar {
+      -moz-appearance: none;
+      background-color: -moz-Dialog;
+      color: -moz-dialogText;
+    }
   }
-}
 
-@media (-moz-windows-default-theme) {
-  #placesView > splitter {
-    border: 0;
-    border-inline-end: 1px solid #A9B7C9;
-    min-width: 0;
-    width: 3px;
-    background-color: transparent;
-    margin-inline-start: -3px;
-    position: relative;
+  @media (-moz-windows-default-theme) {
+    #placesView > splitter {
+      border: 0;
+      border-inline-end: 1px solid #A9B7C9;
+      min-width: 0;
+      width: 3px;
+      background-color: transparent;
+      margin-inline-start: -3px;
+      position: relative;
+    }
   }
 }
 
@@ -174,7 +193,8 @@
   }
 }
 
-@media (-moz-windows-default-theme) and (-moz-os-version: windows-win7) {
+@media (-moz-windows-default-theme) and (-moz-os-version: windows-vista),
+       (-moz-windows-default-theme) and (-moz-os-version: windows-win7) {
   #placesView,
   #infoPane,
   #placesList,
diff --git a/application/basilisk/themes/windows/places/places.css b/application/basilisk/themes/windows/places/places.css
index 769cfcc25..4ec8f6555 100644
--- a/application/basilisk/themes/windows/places/places.css
+++ b/application/basilisk/themes/windows/places/places.css
@@ -24,17 +24,21 @@
   cursor: default;
 }
 
+/* Style Places sidebars as Vista media collection */
 @media (-moz-windows-default-theme) {
-  .sidebar-placesTree {
-    background-color: transparent;
-    border-top: none;
-  }
+  @media not all and (-moz-os-version: windows-xp) {
+    .sidebar-placesTree {
+      background-color: transparent;
+      border-top: none;
+    }
 
-  .sidebar-placesTreechildren::-moz-tree-cell-text(leaf, hover) {
-    text-decoration: none;
+    .sidebar-placesTreechildren::-moz-tree-cell-text(leaf, hover) {
+      text-decoration: none;
+    }
   }
 
-  @media (-moz-os-version: windows-win7) {
+  @media (-moz-os-version: windows-vista),
+         (-moz-os-version: windows-win7) {
     #bookmarksPanel,
     #history-panel,
     #tabs-panel {
diff --git a/application/basilisk/themes/windows/places/query-XP.png b/application/basilisk/themes/windows/places/query-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..8180d4de3cd43ddb1e198b0910b29e79cab74277
GIT binary patch
literal 602
zcmV-g0;T<lP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0006ZNkl<ZcwVKF
z(Mwc89EHD`JFAOjq(MXkMM)7Arfgc9loh=R1Oz=9J_Y?XJ_bG2Q`B2eh2V-|ZW3ZI
z5d}!9xT{8*TDten{3ds}EEf?1`rt5^ANQQ$%#8Bh^FNpePbUC|#3oNfT%HVCM?2c&
z9s|!_KI+>)Kt-latQ{V@-IK5Wc4RqrAj&@<pBdK1yav|T2Q~ES>-*Mx?n1NC&DlC0
zMGEOWOq2?9V(V&~HT&6!v&H)tPoV&>NDbg=2<Lp`Tcu$F`4`i(#d<(6$Ig=o0Tftk
z85tYn<ENQm?C$KMzwag}4S;FV)V)Srj8f@tDtK|?d0QIg%Up$lfqS9C=tP;smAKV^
zhd?6Ky~f2!FpCeyM(5eeDtB*Or}Nwy1n^q%t~^DY{!{aUcS5L;?J9s3Ps^cps;es;
zJ${lzgr&+#m~F+5EJkdMb;4%NvA!!wgIW)^FgZQLLS+@fGrzb<@mi7XMD_+GY&&5i
zcKq5E9zKkZuvlH@#HrI%7Uu9C3RimR=s3%k^Lqlsv6cAHEpbA*^oIHGvvd`%(%VxY
z(i(?nW83j#M~I9ji}B8}lkCb0KiAe-t}b!8(95N+Zsyh#93b9fohPRiO=KY)VhB(Q
zj<g@<;ou-D*UZYM#b`wY2!vH>g>Bqac$F9hQ>DrBd1FkI6CoFAVk?k&m0?X?jsPN(
oc<;X{pbcnArT8a}ygzmQ1x@Zdcwkv2p#T5?07*qoM6N<$f_1kP*Z=?k

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/places/starred48-XP.png b/application/basilisk/themes/windows/places/starred48-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..1cb7bc57d34fbe404e327f9871b174d33b0067c3
GIT binary patch
literal 1848
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

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/places/tag-XP.png b/application/basilisk/themes/windows/places/tag-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..3c083c462f7729f60f108742cb957cb495fcbd73
GIT binary patch
literal 480
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMfr2wB0*Z=?jr-Q+SmHQ{G+COzQ
z5FMDcZvU)x2NrDHzi{LJ<y#J{+kRl(jsshF@87!n!1g@{cI`c|XWs!JICSC+5UjoO
zZQYe`TW@^ZcH`UrJKy);{dVf%_tOu*U40Hj-ygjB{^0HRr|-T$egFOC$8WDbet-A*
z`=>A8zkK`t_1kwK*m~#R&U^oM-TSxi!T<da{_O{n5C0u`^zX=HAo_pu*}qdy|DAgF
z@B9lO`hWHHzpJnR-+KG+*1P|=-~E5^;opM~{~vz%_v|we{eScI|C?|B&Njc%0{Tw7
zB*-tA!J%ObI@rJe3pUU-ZO#Xvwn?5Yjv*DdQqTKxH#rD2Jd|ubarTPKF42<B|NpO6
z`o3oOXVKj&0`^W%lzV3ML7FLPR+{#dfS%^N)tuH3K74v4b6ob!?WXfHGn!}Xy<M6q
z{!Fy0{jT#GwMRS(S8r&pz9ypT{9vbGXz=laLJm_3%mkl#rF%2DJXFas`&lwENol!N
s<y{7qS0Cqov$cuw{_}6siQo0|H<W^>U7r2!HPCeop00i_>zopr0BmD0RsaA1

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/places/toolbarDropMarker-XP.png b/application/basilisk/themes/windows/places/toolbarDropMarker-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..9173b7a7a3c93f57d4d7b71b2e6b948157fe0fd5
GIT binary patch
literal 219
zcmeAS@N?(olHy`uVBq!ia0vp^oIotZ!3-q##j#WYDW?FR5LaE#b^rhW2a=5GXJpFG
zt9z`Uf8-^D<0i&{y+9ErvsFy~dsr;j3i<7n2;CzeyI(2cpmNP+t&F3_#iyM5Zl*4N
z@K4)g3(z$7k|4ie1_t9zCr{pbb}vL0DCFqr;uyjaz4gRF&ISVpmV>dXi#Wc;uWVr{
zuJhsi*S0YxMP;SlZ_Xw6UTqA$)b=PXDqzEx2BtRu(=)VcvugiYF~lXjmebtfw)-#8
OFa}RoKbLh*2~7Zcrcv+!

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/places/unsortedBookmarks-XP.png b/application/basilisk/themes/windows/places/unsortedBookmarks-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..b32063df96c521a9266428a88b7421b074c9d0c2
GIT binary patch
literal 712
zcmV;(0yq7MP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0007yNkl<Zc-o!M
z-Ahw(9LMqZdDy0Bwdt1WbQ^n8U8#wZML`5n7*Jptg3yi9rT;>g-UZ!tQ{8kabSqH>
zC016Dj}>ICrcRyBbnfA}?VOV-vvb`GKEMz7efWL^!!Rg&f3F2YGcW`z7zS3weqSr@
z7{x;NmINT$aQIKta^*f{B4#BE7&5wEL@O4Xyj?wm{!<r+(4<CPa3EV0L_x+(#N_1g
zth0M~zD~<#56jky5qHa3p}Hw7h!)#OLDd|kLY9r#bIcAVJbL(`E$W<`aa9)(1p!Ax
z5LYMy+9y(TZ%MD^F>tb&REX>6+HVdH%>tP3>9t!`>N`$Q;c5jf4*40#t>E^_xI+@^
z;s%*qCGj+Uz%1qof+*f-?773&SCeFZjzZ=m<YKUs*v&TEKXQDFg=p-#3(yDq#Paz*
ze|@V~(y#@uGyUQNl;Tia2R#dD%)HNI30%cuQ}EOuJ@)sH`GUScFhDkwLNBQ(hX8Ay
zlB%MqI!ItwH1yIA>CIKbjS+x;%mr?D4cqA?%dvU<0fnuFZC*YVdHF(QE0)LSwNTiM
zk={yD=kXrQkivdno3qM(`*?dN(^KQDC%%(dSY|ETf#kge)$L5psU()RSjpHaU?Ui6
zC7Dbdc{4uoSO)q%o*G0^;{1gH*v;g`7z+!ZiP-G`=#D6!$Td!#y-Zms6e78r8jyj$
zNF>D6yJw_QzX1q0N0BTxCf~gVpsTZ++S+=akBtIQRplhybR3{p2AT!YN+2BF4SSZC
z;`n?)+D@DXU~^-QjbE#Db)TV3*9rj5a`|Ca?Q*lS_>C`f9|2I5N*erO%tXlwz<xn7
uhnZCbZ-Zwq{}d^yo0uIGj6HeF|M~+~D*o(xphIc^0000<MNUMnLSTY_(Mhxb

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/preferences/alwaysAsk-XP.png b/application/basilisk/themes/windows/preferences/alwaysAsk-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..5a01fd667b324ab9c388d98a2cdb16e375fbad61
GIT binary patch
literal 408
zcmV;J0cZY+P)<h;3K|Lk000e1NJLTq000mG000mO0{{R3C@l|D00027P)t-s|NsAn
zkD{BXzN@~?0cXq)Z_hS{*EfgQP?p_cpx}J3=6<o}hL56&wbhrv?3=>wp2O~^$nmev
z@U_wKx6jzT*73d7_rTZp!Pxb~*!RQP_r}}z$J_VH-S^7f_|D(>&fxgY;Q7zt_R{0|
z)8qNq<@wj;`q$?A+vxh-==$L5`rzvO;OqL}>-*&G`{eHX<?j3G@cZfT{OR%h>hk*S
z^ZfAj{qgnv^!NSu`ThF){b;m!H~;_u1awkPQviRz-<c0I#Q*>Rl1W5CR2Ufrz(GpG
zP!Isnmof-30o9d);0?V0U8F#>5p>hS4>W22jD%qVz*=GY!hZ7kz~4^`RDEAKk8k}#
zpz5hUj@#Bd0$DF}mZ2vCb<aB94$s*U=ylKA;k~jD$USQwGBXj_vu86^7J~EdYvq(z
zAgl|t@d~R@ZO*=o4G_?mu>k~}9vgtbssRuv0Qd*A08{~b<XrXu0000<MNUMnLSTZd
Cqv+QF

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/preferences/application-XP.png b/application/basilisk/themes/windows/preferences/application-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..129bc8e3c873ecbbf7bc591f440533890f80eeb8
GIT binary patch
literal 386
zcmV-|0e$|7P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0003=Nkl<ZcwVKG
zu}T9$6h-fB##p2=5>y01#Uh%{)>;MsLk)sIVs9bV{(;(CSPLmE><rjR5(|S#_Pr~Q
z$z&3-h~~j?cVW(%I}7VbVwQ31$IX+h(7npC{?t%DSb(4FSf0AAvj%-pu)3>gHP`T$
z>AZfymG|#isx1BrRBD^3ZFoG~zDzvV3l})-KjEN#83eueXZ&a8D?9MT?i(I&j?ifJ
zrUpO!3YLmQ{rnEzfNFIcRRAO*3J75dRU)@{37IP)VhIdHVdJBf2GK!jpn{qt$|TL>
zAqtf8b`S)}0EUecfLs_LYa+HB263MdpS~OfB!h%w5*>RNOJ^Wd5wDT1pz5qPBuIiV
z-r0ar?UXtcWEPSd7&x&>()!tKBuJ2qolG|YD@{ntkt7MgVSN|cL>Xg~_%U6&(oo=*
g_pXT<X6E1d8#??q^qj<~eE<Le07*qoM6N<$f&nR{zW@LL

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/preferences/saveFile-XP.png b/application/basilisk/themes/windows/preferences/saveFile-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..e115eaa9fd3ad66c65b6d8b26135a8cef1cb4690
GIT binary patch
literal 740
zcmV<A0vr8_P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00083Nkl<Zc-o~?
zUr19?9RBXTXS=)JyKOEvjW(MYD5?lpqzJ93R*8jC8E8QksDuFl8P!V`6~0Ln?P(#<
zOOHW5^%RsZJqCdhnL72lE!4T)?QXlLbFZ+neCvbno_qNH`+n#A4o4})PH3AVR9|(#
z(1=A7U!Np7`~?E+3`6H};&i0Ee-r&+tve<d85z0T)ZG5apcUYG9=<AP*<oItE&oqG
zeMO7KBDCxp;)`F#qtWPnD}ldy@1fq_Gx$EwLy{!4w<&lW!#@ZgIgh2KC1kVf(6sbn
zR+!`2N2;j_G&mIn;VvHr-}})#;X*0By*qtTLC?Jw3_Xv4;|M&S>UsbbJb-}D=ie<5
z5rqP9^Vm52K@TF`C(FTUCb_m>h25V=fA=-krU2RL^#ceI0F7>UrC2Nx{8$9~>u;f$
zqj>r58EV^hS-}}?4a;x6IM*?RaIg=VOa=~7wgYH36*M_rP9_Tw2r&Ci$MLE$^weC(
zr>WFd@U$0w2S;%<bQ!v?gJaG%y99=PL~(i>wR{B@;zjtY2!u*IvKnx<Wel4e6tAaW
z;KG4XoNBs)TrRiOQaTOMZiB3NTZr4^Yqi-N$mjE*l)!}K07@kuSHpKe;K0R>8<w42
zu~l6ZMYhjCQ7T&r2jW%LRk&OQB$G+gX&WOAmyk-OSi%y_87P=14KOu%u!C1fsbo+|
zsz59jV@X^Hg+i#StFzW%z>NnFC-El+1_qEwBoL3sO*IBjL1iKc&@|05u>LH$hG9V9
z0Yb<&2KM+63<fdtafaCindGwTE6L<?byrs>R8?hx=BRG6MC(u!5@cB_SC?fO^9#$E
zo0~&N=YIT5d|u&(hldA6hvzo2$u2e^rYy<`lNKn2!AO6TV?aSqZ{%}p6V`M7AN&IK
WQw|Xz%HO&G0000<MNUMnLSTYna!5S@

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/privatebrowsing-mask-tabstrip-XPVista7.png b/application/basilisk/themes/windows/privatebrowsing-mask-tabstrip-XPVista7.png
new file mode 100644
index 0000000000000000000000000000000000000000..037c73237bf9052bc65c5979a72b60526ab70fdf
GIT binary patch
literal 948
zcmV;l155mgP)<h;3K|Lk000e1NJLTq001xm001Be1^@s6RMh(%000AfNkl<Zc-rli
zNl#Nz7(n%BAOy-(h{`;O3llfSonfOJSH`#kV$eho5K0v&T9HW^ZD|==Bm#ma2nw&3
zNrukQxdcjq4%jlZ1zq6%NJuIvr7!8?hS=mJ&Aqqz&Uw9Q&;5Vl{5m)|IFAElr6~w1
zrch3kr@qeQJSe0#4wq3o#Ee+J1P8zcoWKnnPki#s%(nX#F+3?Zbz;0bLnP?ADj{$H
zT)+w3n3-&dpm=@y`O)<wa1cI(Bj5&(;OaGi7R8oAEv^CJ29DtB?bn7%kLJogpo2IA
zj^GN;-UBiu1ittY(2WjZ%jp3e6d)#W1{}|DKoknNA|lAZh~bOdQ>TP2iQgw_k!-mq
z4e?*6SxJHk&$UuSOXBDxCuKrd7Tqc3rOye-%mc?014<(~GJd*<@RtfIU;L$LYNax%
zYw_L9ezl-lvbHYW+;N)s++x1gQhvF8;du;4G1;Wp*fF_Wut&U+tkvJ>Q@={%FAmXX
zj4x0GnVH}iumD;FTW%8Bw)Y)>_Prtfq_s<X_12U2O=8=2Uf5e@zyfG!lZOuZO9=|l
zd|S2eAsN8^>-YZ7hI<d*dt=x9@1A1Vu=Oy6sUb6y<~yKG#!H(g`~(HC<ch&18_4w2
z3G>tVIz#pahOX*X$BIQ`cO8jZv<_F@9lkLqn4v33sMGhCj+tRyJfLyphE%D^%mhat
z0c;d7NB9c_OtTgbWh9?9j>>CX?X&P!1+4ey3yntsJq07?oZw1rL0IEL&GjCYe88{?
z>tjuGn~xxX#7yMqBOrn;>q?y?{H5mN;7r@yA)V*7urKdAEh@+Ew#jw$4ZyW>n^krv
z?0KH8z0EVyqqq_>Gr=)n0YGs$ORgMVwu2BE7Df!)SwR)L_enp50ShQWo1N$o8JMws
zvoF(l%2la#_qgPIpUN&l_x$*}NoIBC$JH(sP?{8E=au*j2uA@avjkb_kz8q60#`{i
zi)=RimU~rZaW>!kXvzvI*X0IRse22@)~$Mn%f7PX7P7^gd6%jUu-=|LEg(A!90MKz
zG{lWe7ExLik3*_e*+C2~{JOLxjE;9C&m3N}C!zI9SO?HQu!w{_$pADEV|)h`qfK~X
zI8%JK11M}+d(sSnGvMeWfQ15n5;%h#eFTJ|fJAf<W5Dt31{8)iDO%$QA<lrKXTV>9
WcYWR_bL2$;0000<MNUMnLSTZmr?JNX

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/privatebrowsing-mask-titlebar-XPVista7-tall.png b/application/basilisk/themes/windows/privatebrowsing-mask-titlebar-XPVista7-tall.png
new file mode 100644
index 0000000000000000000000000000000000000000..4a723c54e2316e978062be38a7be8eaa1a0d11f2
GIT binary patch
literal 940
zcmV;d15^BoP)<h;3K|Lk000e1NJLTq001xm001Be1^@s6RMh(%000AXNkl<Zc-rlg
z$xl;J6o(1_1yoX*5x@cn=*F-yu3Q@3nvl3aOi+RVG8+L@W(zb*feJ04fCvJp@M?uJ
zccO(-+8}dVOItdDF7O_cCWS!Wdj`^H<R-t(x#!&TeH}bp&;I_tCrZM7?^1Pf2v1C<
z028nQqbu`~0)>Ii(vB-)j7kBfGl73bpa3<uqaiA#fV9A6F-D<~7idF6lnHr(CL|!j
zs1#uOj|2jcK>RF5r2rFQfqefaDKBmoBa)&Zo~SuSC}1(ZjOF>UWv*dH4358!<c}Vx
z`?F;%#_(8U^r+xTV2h+RcA8IQ4=|m$0KoS>7Os>;wJMm`yOsP3@y4daV6ka;9U`7e
z_cWX%FAQ#)8>^q&vaH+faEFzPH)^hRDWApi6axj5s~~aW0(t(8Qf}M~hL>Ew2HEPY
zZfDo@YwxJYdzTH8PPP8Hdo*i-H;C*4CUOF?Xb>l`Tt28VJAoYAKldzKj@{#ct=fZk
z@*#~G-oW2QR=|%f<zAY`@RIA>AQN>jZUanr!H6~^qDphmyGT`bgR`nzG}@h@I+e*@
zeUrPIOe<1lUaZn|=Z|QiF6mJj;SD0YfQghqD;mN}4qDD<iSz(7_fcakPv}rWEt6g^
z=RO?RbP9B2e%{KU*U90o>}uPB`2Er!X_$o??k=(dxv04X4dJCC^uuJ`t*&L)pM~+e
z)uvl8S<UEA>#SL{4u@W8w!)ojZ~g7AWq5<gu3S<AzDOWu3L}yXdaYdAzhnj=GLe7M
z?7%G1J-~D-0?&gxr?MHfOKTFH^)Td2*Md>pvuHY8Uzh4_*$n1VY0%s0(-VlE#E2%}
zw^5Q7T&c!b(}o{vvtv!Fv$5{HTTh{tDN|@Kl<gTqTD{t2H?CM50=CGI9#*BvBe#Q`
zKn`ktgNDfDW!Rwb!MXB<B(GvsvR8>Ji_V&ZIwxuZOY^BwKt0K;NCiDrp?%|I-_Q9Q
z0jh+&!1)FlCu$O-Qh*6p01h-|(d%Vw#^_i0`l%3L0VZGrMqGi^fO0|2g??cZL&)bu
zPGIf~FaQfM5fzB5z1#LE-KSPj8PYq>3LpOVDuOR?M_@NF01Gpbn+|LqL=KoT6I;_$
z{7MC>v<gKUt$N-aLA&RH0a#o=eWDWaFhr5W<KW`Tc)BAVXXosk{`n1(UhvtS<;6z;
O0000<MNUMnLSTY#G_!92

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/privatebrowsing-mask-titlebar-XPVista7.png b/application/basilisk/themes/windows/privatebrowsing-mask-titlebar-XPVista7.png
new file mode 100644
index 0000000000000000000000000000000000000000..342687aa42dca7d54cab9ef1d328498f6f4f37e1
GIT binary patch
literal 860
zcmV-i1Ec(jP)<h;3K|Lk000e1NJLTq001Ze000yS1^@s6|3-hi0009cNkl<Zc-qy`
z-A__s90&0J4X4gTQ&UTP#qL}eZC!QO>axwP8*Q_kqUI~h#F}b2P;`QdB057&Gj-)r
zO7Imp2#Nri??4F1t94<|?}8AQ<H(J4@x3_T=bY#J8C*L(J<Xxr=*9={$goffn85ab
z0Bg|0K(-7ErPKrqtcw>&d6^5M_SBjA>R7JgY+6&MC7o%aZ~lFkq9YZX@6Hg5YUBFk
z{gl<&Ab?%CAX|zB2*UMC$15b;^mM+8d4E_v+brKdz|D52!Q+++G{)N7JSFXB_u4#r
z?a;pOa={taB-?MfCse<o2vnbFi#xC4dgVm6z~lqQA|OSI1xi&6SFyWlJU+4hKKWNv
zV_RnYz0P#eIr`QPcM#b^CLgdmrVH=STEzmTio{VUC-pY(py%k<iQ~}ixd`Mm_@Ak!
zzT4mqB3obz3Md=iJc6+i8fGX-Vd(S2>6(TIydBe~#pQ*VG*%bmVgJsv2)d?}%+L?l
z%ow1@M>Uq9faqt(`B^Jipj47N6?5%UlLw8hebif;?hdM<D~o0;`Gu1Q&_f1GKOdG}
zZ&kusL(ag4d_;Q$J$wrtku5Nt0djDD<}wy2%}E~?+a3wGyby@xhr?-9TOGDNm&@DP
z4Q{tdZF9ic*>~F>3%B47B3oec0ZAOZFJl=al9H%aB|f3G!Qf@0oYo)1w?uc4$p@@N
z551@)lD7%MrE)S$yDK+3&LdWY8y4B<ruBTkhnt+`DJ*S${LnJdok~AoGy<kCVMJ3+
z;>wE>-sv#*viYaZ=HA7PPWF?by@K!tHDsV<%3#u2U6yUTTf~u?smTm|6^VPP4KVow
z(-yJIgqbucei6~Qkr!5{$q%DzUPiIkpy#D7V8xLwD(LgVUTdDCcNmG|l1tw253Gpp
zRPaz4N&(YfU|Cd~f<vC4>p=&h5U?PV4_Fx6C~8TZ5O<Nqvpwi9y2^k7EMW2ivsh0B
z#necasySgy!cPA3wd2;T=qdu+U;qm<mrn&703kWd+&*dnsa{kV-lQrDXRKdE(DphQ
mzyc<)0nQr=lpzv|*YyW<IUEr`N2-JX0000<MNUMnLSTXmwV0X!

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/reload-stop-go-XPVista7.png b/application/basilisk/themes/windows/reload-stop-go-XPVista7.png
new file mode 100644
index 0000000000000000000000000000000000000000..3f3813360d46967eb8ab0371163d7f53b883b7d0
GIT binary patch
literal 1934
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
UUd85b>i_@%07*qoM6N<$g7+`EH2?qr

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/reload-stop-go-XPVista7@2x.png b/application/basilisk/themes/windows/reload-stop-go-XPVista7@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..4f4a345bac3b809b68d539dd32d88ab7bfe07ce0
GIT binary patch
literal 3633
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
DptI|9

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/sync-horizontalbar-XPVista7.png b/application/basilisk/themes/windows/sync-horizontalbar-XPVista7.png
new file mode 100644
index 0000000000000000000000000000000000000000..2c97ce6dbd09f99c175722c3e9b5129e8f246c28
GIT binary patch
literal 719
zcmV;=0x<oFP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0007(Nkl<ZILob5
zYe-XJ7?vm?5Q!iPDC$=r0TBT~{_S5`w0Wy`vvzj2>D;+(o$Xw9Hs@}x=G>fChFF<p
zf=E&gFiI*CsVIuTjF6zDew7GQ)3^6n&LK$weem#oeDC`_@AqE5qN4w`j-Mh*wR%hH
z#Oa2IMjQLSw$Akx_b+%iinjHC6##%O&B=}oD@Q>Hw}KQ+gWDemC7c*W+d7TTe4xTW
zzSHOk?H>gy^rWSp_k$8|hhWR4CAj_PAk%pzgv4T#ott8$Fp!M6sMQfQtDbM(K~UbD
z7)hf*2Y8#3AVpF$j<bH~8yGrlB<VvWBg~1B6bPYKAe^3Q<ZR6g=qwEp_30|vrNrS{
z-@xsO50k;#dTwUq$>??f*fsj>MVj+Pa=zwvP<>Alj#ys6N{Qn_C<P*-Dc<%93HuQx
z+2N6P+&BEL(Y8d}<@=ss5>#IsElsQlFhb53%K+z#Lf6%s;ex{MEKIfg`YoEpI;g%@
zR-VfnNJgHM@sbup5KUwZYjr9ZOIA6B5Xip-=JN*H8~CIa4s!&HlfO_%Dz7x`TRxi|
zt{zs7Eftya1U|1Q$6JS3DGHuo3s@-c?9pmdS-!nGVywK{xcgX5t=7tj3#t!?B8{<R
zHZSn}<!enHC*}CSc~FJ)7HYP<%A`f15<N-JW80>zthne>nwNsuIr+!%gGYwKDJ;Ix
zKiGqYMcNwz(#d~&{B-PKjmgH<a|*bX81Oh$Y5<2j0O^ZeS>$Y9J<5Cf2k-PcT++uk
zZ^wf)uk1CE%(Pl{FGlq=CV&wm(AnL47k$gt`VXauGl)$_lA`R4FllGSoQ;ve&Poe5
zTKG;lT=$Mt8aDpR=Te8sjNlPIgoI!bn&shA*H1ZPl1&<qrBMI?002ovPDHLkV1gn`
BRYw2-

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/sync-horizontalbar-XPVista7@2x.png b/application/basilisk/themes/windows/sync-horizontalbar-XPVista7@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..98e9564860e45b957105247fe6d9ca4c1854408a
GIT binary patch
literal 1698
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

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/syncProgress-horizontalbar-XPVista7.png b/application/basilisk/themes/windows/syncProgress-horizontalbar-XPVista7.png
new file mode 100644
index 0000000000000000000000000000000000000000..54be0baf6ec66591a7794915e840d3a7f0650c7a
GIT binary patch
literal 767
zcmV<b0s#GqP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0008UNkl<Z7#Xd=
zTS${(00!U>QQdU*i=r!+YX@yxmPiyt&`r>dHzklHP-&W(Gcetpvw^=;9XU@aVS$xN
zP!U8bn`W9snpsX<qE5}TObu=6H0S2_7T`d@@TQ0SH=!v_TyC1~r6BXeNO(@qQn=!a
zMJVeubEUdYLU(wQy#S!3^}`P%@0t-+wTh@JD<VtGh^;iV0q_V*Ydjey)sJv)He4jT
zIhdxu9+5wWW7Qjos&OHz#tBKuA~K#07PDn<{RHw)^P=Jz2vq|vPO2`B?8HgdALJ|h
zZQ=?mj#S$rF8hV(isdyS{T(Gu<1vz~wsYaRM!TfK3UT=g1j;@uJN0!4aSOlQt`QW^
zLsaE}Q1b(MZ>Af*POKIQ<z4Hw?GuLp@LIktRf{yUw!@X15EPlg&uCQ>H&Je{iLYG)
zzjPfjRigs{jsu`-J7yjL@Fsr&U?)ErZRM4$fM2=>VUA&vxP|2oZE(vR;1n)F_S~c;
z+W_#$4(f*SRE~N9-103PP@1-gTd2}x3)OCcO)uioePa^&hZwCPj!iEhwA6`^oDnB+
zlhA{6!5SNa)D}c2K0hKm_+D-}LALSa-7kXF76fZ-IGR5+N8DoX8JnoQp9m<lfs&8f
zS&90yWLrRTbFY6wlbD&<9KSDn+!;``35vELrrf9}Ztn*z=K~dE8!WXAth^O4(|aAv
ztGalS@{aPmWpJ>vMizbLQ!W<023CO`{@IgTbsy)h5H|q6g^knoO!>5nac3DJGNa{H
zkNFIBqg~;nFoQvFfRVomM!p@4oCREaY-#}zNOl4su5L3w73KC#b&ajirwY0yKI#2d
zFO?NuY8SlJE_kV|NUWP|1#p_|27mxSA^>W?v_s0vHca`+Cw_Zm&ca(Z>!7lRtvp$`
xjwEz2$X)<M14sg(06+s!0muSy0e~mj_6P5|oC>qJ(*FPe002ovPDHLkV1hIVQLq32

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/syncProgress-horizontalbar-XPVista7@2x.png b/application/basilisk/themes/windows/syncProgress-horizontalbar-XPVista7@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..60e76409a65c7ac1a454494649833a988c340b07
GIT binary patch
literal 1774
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
Q`2YX_07*qoM6N<$f?c&?p#T5?

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/syncProgress-toolbar-XPVista7.png b/application/basilisk/themes/windows/syncProgress-toolbar-XPVista7.png
new file mode 100644
index 0000000000000000000000000000000000000000..576d857ec716bb301b9cf43bf4039f03ff663cbd
GIT binary patch
literal 848
zcmV-W1F!svP)<h;3K|Lk000e1NJLTq000sI000sQ1^@s6R?d!B0009QNkl<Zc-pm-
ze=O8t9LL-3oRbt4H=@n~aH=l<v{h@3YSkJYt0qHIIu@MW4sl(Ibh?z;DwV}aG73P|
z1V*Z{qE__N35ST|&f(qn+p>jQ^^ec?+Vkx5JkM*-_Pn1(3sL|KluD(UHUKRDUkNSb
zO4UaFeW^t{9vPh!u56IP%^9Y6X7<weNS}4c2P^=X{Fa*hOU87IuSlWrUV*}wgA&yZ
zO2}(Ch34M}VCF8!-9_6i?Q{yf9z+VYO2`E({|r7guogNoL!gN#K|4JOo$yY0o_iQu
zSpVLN?w#F3J>CqePwBK{P{y%&G61y5^h%DdZ;^^F?17$W40K^H45Pb-bc359%5K`T
zO_1+R_bXHD#V9}*$U*lh92I9bumMnK-G=3N^OAmeI}8$3SR(j5edzMD^rB|@k!3!2
zhD)D+B@ftNt#}(|7}-8%AXY*@ybYHAHzWW|XNeerh3!W1{V);_VXd&H4!}ABrbyNt
z4Zxh-r&6h`cbut~8OHU&NHhTBfWl7l>@3lW;Kxdnq;af_{Q_TU^(g>`<l2nn_gp_B
zqak30umg<qY8aiU*31(zLTkp%B@<x8bl^a8c@Ti5e+U-O<cxc^%$Fg22lEsSj6-WD
z=ZS119(6D;jKV_P1vc+)=FA2%h#s*yJIRsk*&WZjXCan@DN({c^6~pwA^@iD@ugXo
zXXUV#{D65_&4gQ&%xfmqre3Kp1CvWOyYe!FS4A{TS*MJEb?zIs#}?<#6;Z2NzPMWp
znnoQijlw3e8>UAKG_Jgx!CB?4c4k2Z8fMs&zBT;DY1`yJI9whFOZY-_y{wfBKzDAI
zR!7}xOtgu6J>`(p1-tOd-Us#Xws1mZVxk8p>32A%j)0vu4!eX8I4F6NNxULUYr55H
zwR1vV%jpgLlD3K$AN@sH4VzdY#Um~k72sT(`h|<MABWSLZUf*DQ2zGcED78Q%(n7#
zqSi+|c*Bl=IpQR42m4Ih1UtHJkaIGx_-X4WOYI`<H*^HxPOy()KY<6qUV_aEg~DLb
aLex*QD;F+cgqP+30000<MNUMnLSTZ=C5?3e

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/syncProgress-toolbar-XPVista7@2x.png b/application/basilisk/themes/windows/syncProgress-toolbar-XPVista7@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..a9d93159815a5516ba4ea56350f18d26fb6379db
GIT binary patch
literal 2129
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
Hu0mjf+HMqw

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/tabbrowser/newtab-XPVista7.svg b/application/basilisk/themes/windows/tabbrowser/newtab-XPVista7.svg
new file mode 100644
index 000000000..3f431c9db
--- /dev/null
+++ b/application/basilisk/themes/windows/tabbrowser/newtab-XPVista7.svg
@@ -0,0 +1,16 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="16" height="18" xmlns="http://www.w3.org/2000/svg">
+  <defs>
+    <linearGradient id="gradient" x1="0%" x2="0%" y1="0%" y2="100%">
+      <stop offset="0%" stop-color="#1c2835"/>
+      <stop offset="60%" stop-color="#606e7b"/>
+      <stop offset="100%" stop-color="#465765"/>
+    </linearGradient>
+  </defs>
+  <g fill="url(#gradient)">
+    <rect width="10" height="2" x="3" y="8"/>
+    <rect width="2" height="10" x="7" y="4"/>
+  </g>
+</svg>
diff --git a/application/basilisk/themes/windows/tabbrowser/newtab-inverted-XPVista7.svg b/application/basilisk/themes/windows/tabbrowser/newtab-inverted-XPVista7.svg
new file mode 100644
index 000000000..10ffbc745
--- /dev/null
+++ b/application/basilisk/themes/windows/tabbrowser/newtab-inverted-XPVista7.svg
@@ -0,0 +1,13 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="16" height="18" xmlns="http://www.w3.org/2000/svg">
+  <g stroke="#666" stroke-width="2" fill="none">
+    <rect x="7" y="4" width="2" height="10" rx="0.25" ry="0.25"/>
+    <rect x="3" y="8" width="10" height="2" rx="0.25" ry="0.25"/>
+  </g>
+  <g fill="#fff">
+    <rect width="2" height="10" x="7" y="4"/>
+    <rect width="10" height="2" x="3" y="8"/>
+  </g>
+</svg>
diff --git a/application/basilisk/themes/windows/tabbrowser/tab-arrow-left-XPVista7.svg b/application/basilisk/themes/windows/tabbrowser/tab-arrow-left-XPVista7.svg
new file mode 100644
index 000000000..41bb5ab13
--- /dev/null
+++ b/application/basilisk/themes/windows/tabbrowser/tab-arrow-left-XPVista7.svg
@@ -0,0 +1,13 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="15" height="17" xmlns="http://www.w3.org/2000/svg">
+  <defs>
+    <linearGradient id="gradient" x1="0%" x2="0%" y1="0%" y2="100%">
+      <stop offset="0%" stop-color="#1c2835"/>
+      <stop offset="60%" stop-color="#606e7b"/>
+      <stop offset="100%" stop-color="#465765"/>
+    </linearGradient>
+  </defs>
+  <path d="M11 4L9.5 2.5l-5.875 6 5.875 6L11 13 6.625 8.5z" fill="url(#gradient)"/>
+</svg>
diff --git a/application/basilisk/themes/windows/toolbarbutton-dropdown-arrow-XPVista7.png b/application/basilisk/themes/windows/toolbarbutton-dropdown-arrow-XPVista7.png
new file mode 100644
index 0000000000000000000000000000000000000000..a155c4db19295f51ba2362c1da6ff2d7a25658d3
GIT binary patch
literal 175
zcmeAS@N?(olHy`uVBq!ia0vp^oIuRZ!3HF6%}!4MQe~bljv*Ddl7IaFzu!<G`q9B-
z3a;;Xcy#1%xIX>=*<-cShAFS=%>-xuclfBTP&q+KQ=u=!eA~~or;>l}pELioe`)lE
zdePeMaD~DNHXed83!BR?Y=6<y^#7Y2qkICF!zTq+4X(S)hXO?uL>6kfXdDP>3Fy#c
aV|X-Y)jFOfKcj#yVDNPHb6Mw<&;$URUPDI!

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/urlbar-history-dropmarker-XPVista7.png b/application/basilisk/themes/windows/urlbar-history-dropmarker-XPVista7.png
new file mode 100644
index 0000000000000000000000000000000000000000..b03338822c37e8924e33ce1f09cd242374560b63
GIT binary patch
literal 479
zcmV<50U-W~P)<h;3K|Lk000e1NJLTq001EX000gM1^@s6p&oUN0004|Nkl<Zc-rmM
z-z!657zc1O(ONbMla<IRSLYAdJ=d=N3I2oq0WuX)By%eiQ9?A>Y@DtAvSu5boz2+F
zBFco5)#H2A)`{(Gt|+QcZ|6Nv?|IJqKF?c2L_h97iQkpP{PMbCX>BXNb8t+%cGnl%
z`$x36x+x%zWvq_|$OFj`fYr@j8XylOLjYFHM6-LyE%;7jbe>34G?^(9pFP1S?b)4X
z#HpdC$8v81l3^_Tp>BpZ0m(2HkK-}-)NAFuy!g>%=C<gJPm}G~8+v&ax(f?;ZDi{q
z2vh<G%0g`GRIDC?KqYXXl-5LTB+3uE{NcCw)y+o&;^_2;pQG{10lZg8&#-glngsz!
zA_vUp^KO}pupj_Q<bWwvm}(p6F$W?%63Eg?_<|fR-#F$~rHV;EA2$L?43#Uq=CPm=
zNMfjLcZl0=J@SP7p%@)F+#bwzlv}ucF02F&2rP2d-!$q|0tW<^N-e4ow|~Q8%O+Ck
z{z|RYHXUFf1^P;{nh`exDbQDQPpIzhANnvhRMX=v6JD)2R-<v)sr}AnRrlv^%y;DN
VGcn#d^zQ%w002ovPDHLkV1kje+hqU%

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/urlbar-history-dropmarker-XPVista7@2x.png b/application/basilisk/themes/windows/urlbar-history-dropmarker-XPVista7@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..c4e7d082e3275cdf6f583a31a44d2ae58cc1aca6
GIT binary patch
literal 780
zcmV+n1M~ceP)<h;3K|Lk000e1NJLTq002S&000~a1^@s6)zE2g0008hNkl<ZcwX(+
z-A__+9LMp)*zCeGBh~0>6<)e^@A?B=e}Mmj>tE>FY1Mjk$!hDOEwysaCj=1CNJJ13
zIEaWxKvK{w*P7nAF}{7~&fFr;&g13pyS?t@ees)LzHn?9hG7_n(dy%;Q8NTbC!I9u
z^6B8Ek@0Cl>kEfz^ZzkJ5Xc}W-Bx?S3_&1+pexSM$hghv4IC~kB`6$AX%dXYY0Bd-
z4~>jjIB{$<zin^`q*EDAyR8Fx8yo`ZR0gpt8lU!bFU8ZeCKM@?+g1gip~V<q9dmf@
zb2W3v^{X35hbsKnZF#fV4WvUAYPvAt^qPEuMHe1`3Z<Wl<#+Zey|G1}+4*<e8FSmQ
zZvq#PMrU@L`vnuYfHXo^Vy4_aYbcsL5Q@8sA7W#xO!MJb4&M{!rMkB!cCBy#q*4wf
zyUnk&RyY7sDF<R#g2OZ06;BJ4+x{W<2>6>lit+0ehsS@9lbM^NJ6%93R6w@d^fJ>0
zq(TM6u8f(vh2gc$qU=hfvITPa0*^U`bK`Sy7)T+--OJC@!$1lt>;lfACAbtX;on~J
zA+q@$3WTCO&gMC#-RpyS3zUFl@SwPBd6u$32}lMH5?$#P>0C)=t7omq=J!2{Cf1Ip
z-2S_q%DMVsqZ6t?5{^N2_tMiuCsctX90R%<#_gZC<025&;GdP?*Yh+zGy9O!IM(+W
zJCFp;-Nq*?b|4Aby5fq|e+$QiY@u}e5bODEnhQokIJai4-79Zb>p=jj5dzKK#z)Kb
zAOO_}0lGQ{7olUB&s1<BPF5lkUp>M~v~fD8b%5`H3XtdsbayZIMmwMaBsv1ItCQ3F
zwU5u_D1ozz^ZI}@Xj=N?eLy0^x(&UNJ|K}nUBG3i!!O4qPNf?wVKS=Q{A#5RlHdlz
zx(z+yI!J;W&^2(d4(<5md5tr8nqDlogW=r^J&WyNWS3zWhRt8u^?mXy@zB8l0000<
KMNUMnLSTX)&vj7%

literal 0
HcmV?d00001

diff --git a/application/basilisk/themes/windows/windowsShared.inc b/application/basilisk/themes/windows/windowsShared.inc
index 199a62292..0cb2ab163 100644
--- a/application/basilisk/themes/windows/windowsShared.inc
+++ b/application/basilisk/themes/windows/windowsShared.inc
@@ -8,4 +8,6 @@
 %define fgTabTexture linear-gradient(transparent 2px, @toolbarHighlight@ 2px, @toolbarHighlight@)
 %define fgTabBackgroundColor -moz-dialog
 %define fgTabTextureLWT @fgTabTexture@
+
+% Aero-only defines
 %define customToolbarColor hsl(210,75%,92%)
diff --git a/application/basilisk/tools/mozscreenshots/mozscreenshots/extension/configurations/ControlCenter.jsm b/application/basilisk/tools/mozscreenshots/mozscreenshots/extension/configurations/ControlCenter.jsm
index 1201ed692..ed4d92b4f 100644
--- a/application/basilisk/tools/mozscreenshots/mozscreenshots/extension/configurations/ControlCenter.jsm
+++ b/application/basilisk/tools/mozscreenshots/mozscreenshots/extension/configurations/ControlCenter.jsm
@@ -195,6 +195,7 @@ this.ControlCenter = {
     trackingProtectionEnabled: {
       applyConfig: Task.async(function* () {
         Services.prefs.setBoolPref("privacy.trackingprotection.enabled", true);
+        Services.prefs.setIntPref("privacy.trackingprotection.introCount", 20);
         yield UrlClassifierTestUtils.addTestTrackers();
 
         yield loadPage(TRACKING_PAGE);
@@ -207,6 +208,7 @@ this.ControlCenter = {
         let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
         let gBrowser = browserWindow.gBrowser;
         Services.prefs.setBoolPref("privacy.trackingprotection.enabled", true);
+        Services.prefs.setIntPref("privacy.trackingprotection.introCount", 20);
         yield UrlClassifierTestUtils.addTestTrackers();
 
         yield loadPage(TRACKING_PAGE);
diff --git a/build/moz.configure/old.configure b/build/moz.configure/old.configure
index 20bde1eee..f938f84d0 100644
--- a/build/moz.configure/old.configure
+++ b/build/moz.configure/old.configure
@@ -221,6 +221,7 @@ def old_configure_options(*options):
     '--enable-readline',
     '--enable-reflow-perf',
     '--enable-release',
+    '--enable-require-all-d3dc-versions',
     '--enable-safe-browsing',
     '--enable-sandbox',
     '--enable-signmar',
diff --git a/dom/media/DecoderDoctorDiagnostics.cpp b/dom/media/DecoderDoctorDiagnostics.cpp
index 778e8c4c5..91c2d8dfb 100644
--- a/dom/media/DecoderDoctorDiagnostics.cpp
+++ b/dom/media/DecoderDoctorDiagnostics.cpp
@@ -576,9 +576,16 @@ DecoderDoctorDocumentWatcher::SynthesizeAnalysis()
       // going through expected decoders from most to least desirable.
 #if defined(XP_WIN)
       if (!formatsRequiringWMF.IsEmpty()) {
-        DD_INFO("DecoderDoctorDocumentWatcher[%p, doc=%p]::SynthesizeAnalysis() - unplayable formats: %s -> Cannot play media because WMF was not found",
-                this, mDocument, NS_ConvertUTF16toUTF8(formatsRequiringWMF).get());
-        ReportAnalysis(mDocument, sMediaWMFNeeded, false, formatsRequiringWMF);
+        if (IsVistaOrLater()) {
+          DD_INFO("DecoderDoctorDocumentWatcher[%p, doc=%p]::SynthesizeAnalysis() - unplayable formats: %s -> Cannot play media because WMF was not found",
+                  this, mDocument, NS_ConvertUTF16toUTF8(formatsRequiringWMF).get());
+          ReportAnalysis(mDocument, sMediaWMFNeeded, false, formatsRequiringWMF);
+        } else {
+          DD_INFO("DecoderDoctorDocumentWatcher[%p, doc=%p]::SynthesizeAnalysis() - unplayable formats: %s -> Cannot play media before Windows Vista",
+                  this, mDocument, NS_ConvertUTF16toUTF8(formatsRequiringWMF).get());
+          ReportAnalysis(mDocument, sMediaUnsupportedBeforeWindowsVista,
+                         false, formatsRequiringWMF);
+        }
         return;
       }
 #endif
diff --git a/dom/media/MediaManager.cpp b/dom/media/MediaManager.cpp
index ba6b4cd47..f978d3cc0 100644
--- a/dom/media/MediaManager.cpp
+++ b/dom/media/MediaManager.cpp
@@ -1842,18 +1842,20 @@ MediaManager::GetNonE10sParent()
 MediaManager::StartupInit()
 {
 #ifdef WIN32
-  // Bug 1107702 - Some Windows versions fail in GetAdaptersInfo (and others)
-  // if the first(?) call occurs after the process size is over 2GB (kb/2588507).
-  // Attempt to 'prime' the pump by making a call at startup.
-  unsigned long out_buf_len = sizeof(IP_ADAPTER_INFO);
-  PIP_ADAPTER_INFO pAdapterInfo = (IP_ADAPTER_INFO *) moz_xmalloc(out_buf_len);
-  if (GetAdaptersInfo(pAdapterInfo, &out_buf_len) == ERROR_BUFFER_OVERFLOW) {
-    free(pAdapterInfo);
-    pAdapterInfo = (IP_ADAPTER_INFO *) moz_xmalloc(out_buf_len);
-    GetAdaptersInfo(pAdapterInfo, &out_buf_len);
-  }
-  if (pAdapterInfo) {
-    free(pAdapterInfo);
+  if (IsVistaOrLater() && !IsWin8OrLater()) {
+    // Bug 1107702 - Older Windows fail in GetAdaptersInfo (and others) if the
+    // first(?) call occurs after the process size is over 2GB (kb/2588507).
+    // Attempt to 'prime' the pump by making a call at startup.
+    unsigned long out_buf_len = sizeof(IP_ADAPTER_INFO);
+    PIP_ADAPTER_INFO pAdapterInfo = (IP_ADAPTER_INFO *) moz_xmalloc(out_buf_len);
+    if (GetAdaptersInfo(pAdapterInfo, &out_buf_len) == ERROR_BUFFER_OVERFLOW) {
+      free(pAdapterInfo);
+      pAdapterInfo = (IP_ADAPTER_INFO *) moz_xmalloc(out_buf_len);
+      GetAdaptersInfo(pAdapterInfo, &out_buf_len);
+    }
+    if (pAdapterInfo) {
+      free(pAdapterInfo);
+    }
   }
 #endif
 }
@@ -2117,11 +2119,19 @@ if (privileged) {
       case MediaSourceEnum::Application:
       case MediaSourceEnum::Window:
         // Deny screensharing request if support is disabled, or
-        // the requesting document is not from a host on the whitelist
+        // the requesting document is not from a host on the whitelist, or
+        // we're on WinXP until proved that it works
         if (!Preferences::GetBool(((videoType == MediaSourceEnum::Browser)?
                                    "media.getusermedia.browser.enabled" :
                                    "media.getusermedia.screensharing.enabled"),
                                   false) ||
+#if defined(XP_WIN)
+            (
+              // Allow tab sharing for all platforms including XP
+              (videoType != MediaSourceEnum::Browser) &&
+              !Preferences::GetBool("media.getusermedia.screensharing.allow_on_old_platforms",
+                                    false) && !IsVistaOrLater()) ||
+#endif
             (!privileged && !HostIsHttps(*docURI))) {
           RefPtr<MediaStreamError> error =
               new MediaStreamError(aWindow,
diff --git a/dom/media/eme/MediaKeySystemAccess.cpp b/dom/media/eme/MediaKeySystemAccess.cpp
index 4cff464e7..7007d3a03 100644
--- a/dom/media/eme/MediaKeySystemAccess.cpp
+++ b/dom/media/eme/MediaKeySystemAccess.cpp
@@ -140,12 +140,26 @@ MediaKeySystemAccess::GetKeySystemStatus(const nsAString& aKeySystem,
         aOutMessage = NS_LITERAL_CSTRING("Adobe EME disabled");
         return MediaKeySystemStatus::Cdm_disabled;
       }
+#ifdef XP_WIN
+      // Win Vista and later only.
+      if (!IsVistaOrLater()) {
+        aOutMessage = NS_LITERAL_CSTRING("Minimum Windows version (Vista) not met for Adobe EME");
+        return MediaKeySystemStatus::Cdm_not_supported;
+      }
+#endif
       return EnsureCDMInstalled(aKeySystem, aOutMessage);
     }
   }
 
   if (IsWidevineKeySystem(aKeySystem)) {
     if (Preferences::GetBool("media.gmp-widevinecdm.visible", false)) {
+#ifdef XP_WIN
+      // Win Vista and later only.
+      if (!IsVistaOrLater()) {
+        aOutMessage = NS_LITERAL_CSTRING("Minimum Windows version (Vista) not met for Widevine EME");
+        return MediaKeySystemStatus::Cdm_not_supported;
+      }
+#endif
       if (!Preferences::GetBool("media.gmp-widevinecdm.enabled", false)) {
         aOutMessage = NS_LITERAL_CSTRING("Widevine EME disabled");
         return MediaKeySystemStatus::Cdm_disabled;
diff --git a/dom/media/fmp4/MP4Decoder.cpp b/dom/media/fmp4/MP4Decoder.cpp
index fdd6f2c7e..4cf07ddbd 100644
--- a/dom/media/fmp4/MP4Decoder.cpp
+++ b/dom/media/fmp4/MP4Decoder.cpp
@@ -52,6 +52,14 @@ IsWhitelistedH264Codec(const nsAString& aCodec)
     return false;
   }
 
+#ifdef XP_WIN
+  // Disable 4k video on windows vista since it performs poorly.
+  if (!IsWin7OrLater() &&
+      level >= H264_LEVEL_5) {
+    return false;
+  }
+#endif
+
   // Just assume what we can play on all platforms the codecs/formats that
   // WMF can play, since we don't have documentation about what other
   // platforms can play... According to the WMF documentation:
diff --git a/dom/media/gtest/MockMediaDecoderOwner.h b/dom/media/gtest/MockMediaDecoderOwner.h
index 324f18141..1009ca30a 100644
--- a/dom/media/gtest/MockMediaDecoderOwner.h
+++ b/dom/media/gtest/MockMediaDecoderOwner.h
@@ -34,8 +34,10 @@ public:
   void DownloadProgressed() override {}
   void UpdateReadyState() override {}
   void FirstFrameLoaded() override {}
+#ifdef MOZ_EME
   void DispatchEncrypted(const nsTArray<uint8_t>& aInitData,
                          const nsAString& aInitDataType) override {}
+#endif
   bool IsActive() const override { return true; }
   bool IsHidden() const override { return false; }
   void DownloadSuspended() override {}
diff --git a/dom/media/gtest/TestGMPCrossOrigin.cpp b/dom/media/gtest/TestGMPCrossOrigin.cpp
index 33ac98388..036282153 100644
--- a/dom/media/gtest/TestGMPCrossOrigin.cpp
+++ b/dom/media/gtest/TestGMPCrossOrigin.cpp
@@ -1521,6 +1521,11 @@ TEST(GeckoMediaPlugins, GMPPluginVoucher) {
 
 #if defined(XP_WIN)
 TEST(GeckoMediaPlugins, GMPOutputProtection) {
+  // Output Protection is not available pre-Vista.
+  if (!IsVistaOrLater()) {
+    return;
+  }
+
   RefPtr<GMPStorageTest> runner = new GMPStorageTest();
   runner->DoTest(&GMPStorageTest::TestOutputProtection);
 }
diff --git a/dom/media/platforms/PDMFactory.cpp b/dom/media/platforms/PDMFactory.cpp
index c1e58fdc2..a72d910f5 100644
--- a/dom/media/platforms/PDMFactory.cpp
+++ b/dom/media/platforms/PDMFactory.cpp
@@ -47,6 +47,10 @@
 #include "MP4Decoder.h"
 #include "mozilla/dom/RemoteVideoDecoder.h"
 
+#ifdef XP_WIN
+#include "mozilla/WindowsVersion.h"
+#endif
+
 #include "mp4_demuxer/H264.h"
 
 namespace mozilla {
@@ -363,7 +367,16 @@ PDMFactory::CreatePDMs()
   }
 #endif
 #ifdef XP_WIN
-  if (MediaPrefs::PDMWMFEnabled()) {
+  if (MediaPrefs::PDMWMFEnabled() && IsVistaOrLater() && !IsWin7AndPre2000Compatible()) {
+    // *Only* use WMF on Vista and later, as if Firefox is run in Windows 95
+    // compatibility mode on Windows 7 (it does happen!) we may crash trying
+    // to startup WMF. So we need to detect the OS version here, as in
+    // compatibility mode IsVistaOrLater() and friends behave as if we're on
+    // the emulated version of Windows. See bug 1279171.
+    // Additionally, we don't want to start the RemoteDecoderModule if we
+    // expect it's not going to work (i.e. on Windows older than Vista).
+    // IsWin7AndPre2000Compatible() uses GetVersionEx as the user specified OS version can
+    // be reflected when compatibility mode is in effect.
     m = new WMFDecoderModule();
     RefPtr<PlatformDecoderModule> remote = new dom::RemoteDecoderModule(m);
     StartupPDM(remote);
diff --git a/dom/media/platforms/wmf/WMF.h b/dom/media/platforms/wmf/WMF.h
index 6988ef083..5ede0d361 100644
--- a/dom/media/platforms/wmf/WMF.h
+++ b/dom/media/platforms/wmf/WMF.h
@@ -7,6 +7,18 @@
 #ifndef WMF_H_
 #define WMF_H_
 
+#if WINVER < _WIN32_WINNT_WIN7
+#error \
+You must include WMF.h before including mozilla headers, \
+otherwise mozconfig.h will be included \
+and that sets WINVER to WinXP, \
+which makes Windows Media Foundation unavailable.
+#endif
+
+#pragma push_macro("WINVER")
+#undef WINVER
+#define WINVER _WIN32_WINNT_WIN7
+
 #include <windows.h>
 #include <mfapi.h>
 #include <mfidl.h>
@@ -23,7 +35,7 @@
 #include <codecapi.h>
 
 // The Windows headers helpfully declare min and max macros, which don't
-// compile in the presence of std::min and std::max and unified builds.
+// compile in the prescence of std::min and std::max and unified builds.
 // So undef them here.
 #ifdef min
 #undef min
@@ -85,4 +97,8 @@ HRESULT MFCreateDXGISurfaceBuffer(REFIID riid,
 } // end namespace wmf
 } // end namespace mozilla
 
+
+
+#pragma pop_macro("WINVER")
+
 #endif
diff --git a/dom/media/platforms/wmf/WMFUtils.cpp b/dom/media/platforms/wmf/WMFUtils.cpp
index 055012d0f..8aec8a8af 100644
--- a/dom/media/platforms/wmf/WMFUtils.cpp
+++ b/dom/media/platforms/wmf/WMFUtils.cpp
@@ -205,17 +205,31 @@ LoadDLLs()
 HRESULT
 MFStartup()
 {
+  if (!IsVistaOrLater() || IsWin7AndPre2000Compatible()) {
+    // *Only* use WMF on Vista and later, as if Firefox is run in Windows 95
+    // compatibility mode on Windows 7 (it does happen!) we may crash trying
+    // to startup WMF. So we need to detect the OS version here, as in
+    // compatibility mode IsVistaOrLater() and friends behave as if we're on
+    // the emulated version of Windows. See bug 1279171.
+    // Using GetVersionEx API which takes compatibility mode into account.
+    return E_FAIL;
+  }
+
   HRESULT hr = LoadDLLs();
   if (FAILED(hr)) {
     return hr;
   }
 
+  const int MF_VISTA_VERSION = (0x0001 << 16 | MF_API_VERSION);
   const int MF_WIN7_VERSION = (0x0002 << 16 | MF_API_VERSION);
 
   // decltype is unusable for functions having default parameters
   DECL_FUNCTION_PTR(MFStartup, ULONG, DWORD);
   ENSURE_FUNCTION_PTR_(MFStartup, Mfplat.dll)
-  return MFStartupPtr(MF_WIN7_VERSION, MFSTARTUP_FULL);
+  if (!IsWin7OrLater())
+    return MFStartupPtr(MF_VISTA_VERSION, MFSTARTUP_FULL);
+  else
+    return MFStartupPtr(MF_WIN7_VERSION, MFSTARTUP_FULL);
 }
 
 HRESULT
diff --git a/dom/media/webrtc/MediaEngineWebRTC.cpp b/dom/media/webrtc/MediaEngineWebRTC.cpp
index a77800424..b71f5eb9b 100644
--- a/dom/media/webrtc/MediaEngineWebRTC.cpp
+++ b/dom/media/webrtc/MediaEngineWebRTC.cpp
@@ -268,7 +268,11 @@ MediaEngineWebRTC::EnumerateVideoDevices(dom::MediaSourceEnum aMediaSource,
 bool
 MediaEngineWebRTC::SupportsDuplex()
 {
+#ifndef XP_WIN
   return mFullDuplex;
+#else
+  return IsVistaOrLater() && mFullDuplex;
+#endif
 }
 
 void
diff --git a/dom/plugins/ipc/hangui/plugin-hang-ui.exe.manifest b/dom/plugins/ipc/hangui/plugin-hang-ui.exe.manifest
index f5b7345f9..8d6149c58 100644
--- a/dom/plugins/ipc/hangui/plugin-hang-ui.exe.manifest
+++ b/dom/plugins/ipc/hangui/plugin-hang-ui.exe.manifest
@@ -32,6 +32,7 @@
       <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
       <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
       <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
+      <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
     </application>
   </compatibility>
 </assembly>
diff --git a/gfx/angle/Makefile.in b/gfx/angle/Makefile.in
index 0394b352b..da63a55ca 100755
--- a/gfx/angle/Makefile.in
+++ b/gfx/angle/Makefile.in
@@ -9,6 +9,10 @@ ifdef MOZ_D3DCOMPILER_VISTA_DLL_PATH
 	cp -fp "$(MOZ_D3DCOMPILER_VISTA_DLL_PATH)" "$(DIST)/bin"
 endif
 
+ifdef MOZ_D3DCOMPILER_XP_CAB
+	expand '$(MOZ_D3DCOMPILER_XP_CAB)' -F:$(MOZ_D3DCOMPILER_XP_DLL) '$(DIST)/bin'
+endif
+
 endif
 
 include $(topsrcdir)/config/rules.mk
diff --git a/gfx/angle/moz.build b/gfx/angle/moz.build
index 2a40e0ac6..1da8356a5 100755
--- a/gfx/angle/moz.build
+++ b/gfx/angle/moz.build
@@ -139,6 +139,9 @@ if CONFIG['GNU_CXX']:
             '-Wno-shadow-local',
         ]
 
+if CONFIG['MOZ_DIRECTX_SDK_PATH'] and not CONFIG['MOZ_HAS_WINSDK_WITH_D3D']:
+    LOCAL_INCLUDES += ['%' + '%s/include/' % CONFIG['MOZ_DIRECTX_SDK_PATH']]
+
 DEFINES['_CRT_SECURE_NO_DEPRECATE'] = True
 DEFINES['_HAS_EXCEPTIONS'] = 0
 
diff --git a/gfx/angle/src/libANGLE/moz.build b/gfx/angle/src/libANGLE/moz.build
index e127ccce1..0a2a4437f 100755
--- a/gfx/angle/src/libANGLE/moz.build
+++ b/gfx/angle/src/libANGLE/moz.build
@@ -353,6 +353,9 @@ if CONFIG['GNU_CXX']:
             '-Wno-shadow-local',
         ]
 
+if CONFIG['MOZ_DIRECTX_SDK_PATH'] and not CONFIG['MOZ_HAS_WINSDK_WITH_D3D']:
+    LOCAL_INCLUDES += ['%' + '%s/include/' % CONFIG['MOZ_DIRECTX_SDK_PATH']]
+
 DEFINES['_CRT_SECURE_NO_DEPRECATE'] = True
 DEFINES['_HAS_EXCEPTIONS'] = 0
 
@@ -385,6 +388,11 @@ DEFINES['ANGLE_DEFAULT_D3D11'] = "0"
 
 if CONFIG['MOZ_HAS_WINSDK_WITH_D3D']:
   OS_LIBS += [ 'd3d9', 'dxguid' ]
+else:
+  EXTRA_DSO_LDOPTS += [
+    '\'%s/lib/%s/d3d9.lib\'' % (CONFIG['MOZ_DIRECTX_SDK_PATH'], CONFIG['MOZ_D3D_CPU_SUFFIX']),
+    '\'%s/lib/%s/dxguid.lib\'' % (CONFIG['MOZ_DIRECTX_SDK_PATH'], CONFIG['MOZ_D3D_CPU_SUFFIX']),
+  ]
 
 Library('libANGLE')
 
diff --git a/gfx/angle/src/libEGL/moz.build b/gfx/angle/src/libEGL/moz.build
index c1e33c86e..8e99d44ff 100755
--- a/gfx/angle/src/libEGL/moz.build
+++ b/gfx/angle/src/libEGL/moz.build
@@ -32,6 +32,9 @@ if CONFIG['GNU_CXX']:
             '-Wno-shadow-local',
         ]
 
+if CONFIG['MOZ_DIRECTX_SDK_PATH'] and not CONFIG['MOZ_HAS_WINSDK_WITH_D3D']:
+    LOCAL_INCLUDES += ['%' + '%s/include/' % CONFIG['MOZ_DIRECTX_SDK_PATH']]
+
 DEFINES['_CRT_SECURE_NO_DEPRECATE'] = True
 DEFINES['_HAS_EXCEPTIONS'] = 0
 
@@ -64,6 +67,11 @@ DEFINES['ANGLE_ENABLE_KEYEDMUTEX'] = "1"
 
 if CONFIG['MOZ_HAS_WINSDK_WITH_D3D']:
   OS_LIBS += [ 'd3d9', 'dxguid' ]
+else:
+  EXTRA_DSO_LDOPTS += [
+    '\'%s/lib/%s/d3d9.lib\'' % (CONFIG['MOZ_DIRECTX_SDK_PATH'], CONFIG['MOZ_D3D_CPU_SUFFIX']),
+    '\'%s/lib/%s/dxguid.lib\'' % (CONFIG['MOZ_DIRECTX_SDK_PATH'], CONFIG['MOZ_D3D_CPU_SUFFIX']),
+  ]
 
 
 GeckoSharedLibrary('libEGL', linkage=None)
diff --git a/gfx/angle/src/libGLESv2/moz.build b/gfx/angle/src/libGLESv2/moz.build
index 08c60c213..1d40b3b67 100755
--- a/gfx/angle/src/libGLESv2/moz.build
+++ b/gfx/angle/src/libGLESv2/moz.build
@@ -39,6 +39,9 @@ if CONFIG['GNU_CXX']:
             '-Wno-shadow-local',
         ]
 
+if CONFIG['MOZ_DIRECTX_SDK_PATH'] and not CONFIG['MOZ_HAS_WINSDK_WITH_D3D']:
+    LOCAL_INCLUDES += ['%' + '%s/include/' % CONFIG['MOZ_DIRECTX_SDK_PATH']]
+
 DEFINES['_CRT_SECURE_NO_DEPRECATE'] = True
 DEFINES['_HAS_EXCEPTIONS'] = 0
 
@@ -70,6 +73,11 @@ DEFINES['ANGLE_ENABLE_KEYEDMUTEX'] = "1"
 
 if CONFIG['MOZ_HAS_WINSDK_WITH_D3D']:
   OS_LIBS += [ 'd3d9', 'dxguid' ]
+else:
+  EXTRA_DSO_LDOPTS += [
+    '\'%s/lib/%s/d3d9.lib\'' % (CONFIG['MOZ_DIRECTX_SDK_PATH'], CONFIG['MOZ_D3D_CPU_SUFFIX']),
+    '\'%s/lib/%s/dxguid.lib\'' % (CONFIG['MOZ_DIRECTX_SDK_PATH'], CONFIG['MOZ_D3D_CPU_SUFFIX']),
+  ]
 
 GeckoSharedLibrary('libGLESv2', linkage=None)
 
diff --git a/gfx/cairo/cairo/src/cairo-hash.c b/gfx/cairo/cairo/src/cairo-hash.c
index 81a48a235..a5fa8dd9a 100644
--- a/gfx/cairo/cairo/src/cairo-hash.c
+++ b/gfx/cairo/cairo/src/cairo-hash.c
@@ -59,21 +59,20 @@
 #define ENTRY_IS_DEAD(entry) ((entry) == DEAD_ENTRY)
 #define ENTRY_IS_LIVE(entry) ((entry) >  DEAD_ENTRY)
 
-/* We expect keys will not be destroyed frequently, so our table does not
- * contain any explicit shrinking code nor any chain-coalescing code for
- * entries randomly deleted by memory pressure (except during rehashing, of
- * course). These assumptions are potentially bad, but they make the
- * implementation straightforward.
- *
- * Revisit later if evidence appears that we're using excessive memory from
- * a mostly-dead table.
- *
- * This table is open-addressed with double hashing. Each table size is a
- * prime chosen to be a little more than double the high water mark for a
- * given arrangement, so the tables should remain < 50% full. The table
- * size makes for the "first" hash modulus; a second prime (2 less than the
- * first prime) serves as the "second" hash modulus, which is co-prime and
- * thus guarantees a complete permutation of table indices.
+/*
+ * This table is open-addressed with double hashing. Each table size
+ * is a prime and it makes for the "first" hash modulus; a second
+ * prime (2 less than the first prime) serves as the "second" hash
+ * modulus, which is smaller and thus guarantees a complete
+ * permutation of table indices.
+ *
+ * Hash tables are rehashed in order to keep between 12.5% and 50%
+ * entries in the hash table alive and at least 25% free. When table
+ * size is changed, the new table has about 25% live elements.
+ *
+ * The free entries guarantee an expected constant-time lookup.
+ * Doubling/halving the table in the described fashion guarantees
+ * amortized O(1) insertion/removal.
  *
  * This structure, and accompanying table, is borrowed/modified from the
  * file xserver/render/glyph.c in the freedesktop.org x server, with
@@ -124,6 +123,7 @@ struct _cairo_hash_table {
     cairo_hash_entry_t **entries;
 
     unsigned long live_entries;
+    unsigned long free_entries;
     unsigned long iterating;   /* Iterating, no insert, no resize */
 };
 
@@ -167,6 +167,7 @@ _cairo_hash_table_create (cairo_hash_keys_equal_func_t keys_equal)
     }
 
     hash_table->live_entries = 0;
+    hash_table->free_entries = hash_table->arrangement->size;
     hash_table->iterating = 0;
 
     return hash_table;
@@ -236,44 +237,54 @@ _cairo_hash_table_lookup_unique_key (cairo_hash_table_t *hash_table,
 }
 
 /**
- * _cairo_hash_table_resize:
+ * _cairo_hash_table_manage:
  * @hash_table: a hash table
  *
  * Resize the hash table if the number of entries has gotten much
  * bigger or smaller than the ideal number of entries for the current
- * size.
+ * size and guarantee some free entries to be used as lookup
+ * termination points.
  *
  * Return value: %CAIRO_STATUS_SUCCESS if successful or
  * %CAIRO_STATUS_NO_MEMORY if out of memory.
  **/
 static cairo_status_t
-_cairo_hash_table_resize (cairo_hash_table_t *hash_table)
+_cairo_hash_table_manage (cairo_hash_table_t *hash_table)
 {
     cairo_hash_table_t tmp;
     unsigned long new_size, i;
 
-    /* This keeps the hash table between 25% and 50% full. */
-    unsigned long high = hash_table->arrangement->high_water_mark;
-    unsigned long low = high >> 2;
-
-    if (hash_table->live_entries >= low && hash_table->live_entries <= high)
-	return CAIRO_STATUS_SUCCESS;
+    /* Keep between 12.5% and 50% entries in the hash table alive and
+     * at least 25% free. */
+     unsigned long live_high = hash_table->arrangement->size >> 1;
+     unsigned long live_low = live_high >> 2;
+     unsigned long free_low = live_high >> 1;
 
     tmp = *hash_table;
 
-    if (hash_table->live_entries > high)
+    if (hash_table->live_entries > live_high)
     {
 	tmp.arrangement = hash_table->arrangement + 1;
 	/* This code is being abused if we can't make a table big enough. */
 	assert (tmp.arrangement - hash_table_arrangements <
 		NUM_HASH_TABLE_ARRANGEMENTS);
     }
-    else /* hash_table->live_entries < low */
+    else if (hash_table->live_entries < live_low)
     {
 	/* Can't shrink if we're at the smallest size */
 	if (hash_table->arrangement == &hash_table_arrangements[0])
-	    return CAIRO_STATUS_SUCCESS;
-	tmp.arrangement = hash_table->arrangement - 1;
+        tmp.arrangement = hash_table->arrangement;
+    else
+        tmp.arrangement = hash_table->arrangement - 1;
+    }
+
+    if (tmp.arrangement == hash_table->arrangement &&
+        hash_table->free_entries > free_low)
+    {
+    /* The number of live entries is within the desired bounds
+     * (we're not going to resize the table) and we have enough
+     * free entries. Do nothing. */
+        return CAIRO_STATUS_SUCCESS;
     }
 
     new_size = tmp.arrangement->size;
@@ -291,6 +302,7 @@ _cairo_hash_table_resize (cairo_hash_table_t *hash_table)
     free (hash_table->entries);
     hash_table->entries = tmp.entries;
     hash_table->arrangement = tmp.arrangement;
+    hash_table->free_entries = new_size - hash_table->live_entries;
 
     return CAIRO_STATUS_SUCCESS;
 }
@@ -340,6 +352,7 @@ _cairo_hash_table_lookup (cairo_hash_table_t *hash_table,
 	    return NULL;
     } while (++i < table_size);
 
+    ASSERT_NOT_REACHED;
     return NULL;
 }
 
@@ -421,21 +434,23 @@ cairo_status_t
 _cairo_hash_table_insert (cairo_hash_table_t *hash_table,
 			  cairo_hash_entry_t *key_and_value)
 {
+    cairo_hash_entry_t **entry;
     cairo_status_t status;
 
     /* Insert is illegal while an iterator is running. */
     assert (hash_table->iterating == 0);
 
-    hash_table->live_entries++;
-    status = _cairo_hash_table_resize (hash_table);
-    if (unlikely (status)) {
-	/* abort the insert... */
-	hash_table->live_entries--;
+    status = _cairo_hash_table_manage (hash_table);
+    if (unlikely (status))
 	return status;
-    }
 
-    *_cairo_hash_table_lookup_unique_key (hash_table,
-					  key_and_value) = key_and_value;
+    entry = _cairo_hash_table_lookup_unique_key (hash_table, key_and_value);
+
+    if (ENTRY_IS_FREE (*entry))
+        hash_table->free_entries--;
+
+    *entry = key_and_value;
+    hash_table->live_entries++;
 
     return CAIRO_STATUS_SUCCESS;
 }
@@ -496,7 +511,7 @@ _cairo_hash_table_remove (cairo_hash_table_t *hash_table,
 	 * memory to shrink the hash table. It does leave the table in a
 	 * consistent state, and we've already succeeded in removing the
 	 * entry, so we don't examine the failure status of this call. */
-	_cairo_hash_table_resize (hash_table);
+	_cairo_hash_table_manage (hash_table);
     }
 }
 
@@ -537,6 +552,6 @@ _cairo_hash_table_foreach (cairo_hash_table_t	      *hash_table,
     if (--hash_table->iterating == 0) {
 	/* Should we fail to shrink the hash table, it is left unaltered,
 	 * and we don't need to propagate the error status. */
-	_cairo_hash_table_resize (hash_table);
+	_cairo_hash_table_manage (hash_table);
     }
 }
diff --git a/gfx/cairo/cairo/src/cairo-mutex-impl-private.h b/gfx/cairo/cairo/src/cairo-mutex-impl-private.h
index 6c67f6ebb..25223f3ea 100644
--- a/gfx/cairo/cairo/src/cairo-mutex-impl-private.h
+++ b/gfx/cairo/cairo/src/cairo-mutex-impl-private.h
@@ -36,7 +36,6 @@
  *	Carl D. Worth <cworth@cworth.org>
  *	Mathias Hasselmann <mathias.hasselmann@gmx.de>
  *	Behdad Esfahbod <behdad@behdad.org>
- *  Mark Straver <moonchild@palemoon.org>
  */
 
 #ifndef CAIRO_MUTEX_IMPL_PRIVATE_H
@@ -179,24 +178,24 @@
 #elif defined(_WIN32) /******************************************************/
 
 #define WIN32_LEAN_AND_MEAN
-/* We require Windows 7 features */
-#if !defined(WINVER) || (WINVER < 0x0601)
-# define WINVER 0x0601
+/* We require Windows 2000 features such as ETO_PDY */
+#if !defined(WINVER) || (WINVER < 0x0500)
+# define WINVER 0x0500
 #endif
-#if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0601)
-# define _WIN32_WINNT 0x0601
+#if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500)
+# define _WIN32_WINNT 0x0500
 #endif
 
 # include <windows.h>
 
-  typedef SRWLOCK cairo_mutex_impl_t;
+  typedef CRITICAL_SECTION cairo_mutex_impl_t;
 
 # define CAIRO_MUTEX_IMPL_WIN32 1
-# define CAIRO_MUTEX_IMPL_LOCK(mutex) AcquireSRWLockExclusive (&(mutex))
-# define CAIRO_MUTEX_IMPL_UNLOCK(mutex) ReleaseSRWLockExclusive (&(mutex))
-# define CAIRO_MUTEX_IMPL_INIT(mutex) InitializeSRWLock (&(mutex))
-# define CAIRO_MUTEX_IMPL_FINI(mutex) CAIRO_MUTEX_IMPL_NOOP
-# define CAIRO_MUTEX_IMPL_NIL_INITIALIZER SRWLOCK_INIT
+# define CAIRO_MUTEX_IMPL_LOCK(mutex) EnterCriticalSection (&(mutex))
+# define CAIRO_MUTEX_IMPL_UNLOCK(mutex) LeaveCriticalSection (&(mutex))
+# define CAIRO_MUTEX_IMPL_INIT(mutex) InitializeCriticalSection (&(mutex))
+# define CAIRO_MUTEX_IMPL_FINI(mutex) DeleteCriticalSection (&(mutex))
+# define CAIRO_MUTEX_IMPL_NIL_INITIALIZER { NULL, 0, 0, NULL, NULL, 0 }
 
 #elif defined __OS2__ /******************************************************/
 
diff --git a/gfx/gl/moz.build b/gfx/gl/moz.build
index 6f43a495d..596612bb8 100644
--- a/gfx/gl/moz.build
+++ b/gfx/gl/moz.build
@@ -150,6 +150,8 @@ FINAL_LIBRARY = 'xul'
 
 if CONFIG['MOZ_D3DCOMPILER_VISTA_DLL']:
     DEFINES['MOZ_D3DCOMPILER_VISTA_DLL'] = CONFIG['MOZ_D3DCOMPILER_VISTA_DLL']
+if CONFIG['MOZ_D3DCOMPILER_XP_DLL']:
+    DEFINES['MOZ_D3DCOMPILER_XP_DLL'] = CONFIG['MOZ_D3DCOMPILER_XP_DLL']
 
 CXXFLAGS += CONFIG['MOZ_CAIRO_CFLAGS']
 CXXFLAGS += CONFIG['TK_CFLAGS']
diff --git a/gfx/thebes/gfxGDIFont.cpp b/gfx/thebes/gfxGDIFont.cpp
index d6e98105c..e6ceeaf6d 100644
--- a/gfx/thebes/gfxGDIFont.cpp
+++ b/gfx/thebes/gfxGDIFont.cpp
@@ -461,7 +461,8 @@ gfxGDIFont::FillLogFont(LOGFONTW& aLogFont, gfxFloat aSize,
         weight = mNeedsBold ? 700 : fe->Weight();
     }
 
-    fe->FillLogFont(&aLogFont, weight, aSize);
+    fe->FillLogFont(&aLogFont, weight, aSize, 
+                    (mAntialiasOption == kAntialiasSubpixel) ? true : false);
 
     // If GDI synthetic italic is wanted, force the lfItalic field to true
     if (aUseGDIFakeItalic) {
diff --git a/gfx/thebes/gfxGDIFontList.cpp b/gfx/thebes/gfxGDIFontList.cpp
index cc047ef38..d80c49356 100644
--- a/gfx/thebes/gfxGDIFontList.cpp
+++ b/gfx/thebes/gfxGDIFontList.cpp
@@ -37,6 +37,11 @@ using namespace mozilla;
 
 #define ROUND(x) floor((x) + 0.5)
 
+
+#ifndef CLEARTYPE_QUALITY
+#define CLEARTYPE_QUALITY 5
+#endif
+
 #define LOG_FONTLIST(args) MOZ_LOG(gfxPlatform::GetLog(eGfxLog_fontlist), \
                                LogLevel::Debug, args)
 #define LOG_FONTLIST_ENABLED() MOZ_LOG_TEST( \
@@ -217,7 +222,16 @@ GDIFontEntry::IsSymbolFont()
 gfxFont *
 GDIFontEntry::CreateFontInstance(const gfxFontStyle* aFontStyle, bool aNeedsBold)
 {
-    return new gfxGDIFont(this, aFontStyle, aNeedsBold);
+    bool isXP = !IsVistaOrLater();
+
+    bool useClearType = isXP && !aFontStyle->systemFont &&
+        (gfxWindowsPlatform::GetPlatform()->UseClearTypeAlways() ||
+         (mIsDataUserFont &&
+          gfxWindowsPlatform::GetPlatform()->UseClearTypeForDownloadableFonts()));
+
+    return new gfxGDIFont(this, aFontStyle, aNeedsBold, 
+                          (useClearType ? gfxFont::kAntialiasSubpixel
+                                        : gfxFont::kAntialiasDefault));
 }
 
 nsresult
@@ -249,7 +263,8 @@ GDIFontEntry::CopyFontTable(uint32_t aTableTag, nsTArray<uint8_t>& aBuffer)
 
 void
 GDIFontEntry::FillLogFont(LOGFONTW *aLogFont,
-                          uint16_t aWeight, gfxFloat aSize)
+                          uint16_t aWeight, gfxFloat aSize,
+                          bool aUseCleartype)
 {
     memcpy(aLogFont, &mLogFont, sizeof(LOGFONTW));
 
@@ -275,6 +290,8 @@ GDIFontEntry::FillLogFont(LOGFONTW *aLogFont,
     if (mIsDataUserFont) {
         aLogFont->lfItalic = 0;
     }
+
+    aLogFont->lfQuality = (aUseCleartype ? CLEARTYPE_QUALITY : DEFAULT_QUALITY);
 }
 
 #define MISSING_GLYPH 0x1F // glyph index returned for missing characters
@@ -862,8 +879,15 @@ gfxGDIFontList::MakePlatformFont(const nsAString& aFontName,
         gfxWindowsFontType(isCFF ? GFX_FONT_TYPE_PS_OPENTYPE : GFX_FONT_TYPE_TRUETYPE) /*type*/,
         aStyle, w, aStretch, winUserFontData, false);
 
-    if (fe) {
-      fe->mIsDataUserFont = true;
+    if (!fe)
+        return fe;
+
+    fe->mIsDataUserFont = true;
+
+    // Uniscribe doesn't place CFF fonts loaded privately
+    // via AddFontMemResourceEx on XP/Vista
+    if (isCFF && !IsWin7OrLater()) {
+        fe->mForceGDI = true;
     }
 
     return fe;
diff --git a/gfx/thebes/gfxGDIFontList.h b/gfx/thebes/gfxGDIFontList.h
index 60fb292e8..ffb513d64 100644
--- a/gfx/thebes/gfxGDIFontList.h
+++ b/gfx/thebes/gfxGDIFontList.h
@@ -112,7 +112,8 @@ public:
 
     virtual bool IsSymbolFont();
 
-    void FillLogFont(LOGFONTW *aLogFont, uint16_t aWeight, gfxFloat aSize);
+    void FillLogFont(LOGFONTW *aLogFont, uint16_t aWeight, gfxFloat aSize,
+                     bool aUseCleartype);
 
     static gfxWindowsFontType DetermineFontType(const NEWTEXTMETRICW& metrics, 
                                                 DWORD fontType)
diff --git a/gfx/thebes/gfxWindowsPlatform.cpp b/gfx/thebes/gfxWindowsPlatform.cpp
index a988859eb..639cf7957 100755
--- a/gfx/thebes/gfxWindowsPlatform.cpp
+++ b/gfx/thebes/gfxWindowsPlatform.cpp
@@ -146,6 +146,9 @@ public:
 
 NS_IMPL_ISUPPORTS(GfxD2DVramReporter, nsIMemoryReporter)
 
+#define GFX_USE_CLEARTYPE_ALWAYS "gfx.font_rendering.cleartype.always_use_for_content"
+#define GFX_DOWNLOADABLE_FONTS_USE_CLEARTYPE "gfx.font_rendering.cleartype.use_for_downloadable_fonts"
+
 #define GFX_CLEARTYPE_PARAMS           "gfx.font_rendering.cleartype_params."
 #define GFX_CLEARTYPE_PARAMS_GAMMA     "gfx.font_rendering.cleartype_params.gamma"
 #define GFX_CLEARTYPE_PARAMS_CONTRAST  "gfx.font_rendering.cleartype_params.enhanced_contrast"
@@ -191,6 +194,10 @@ public:
         HMODULE gdi32Handle;
         PFND3DKMTQS queryD3DKMTStatistics = nullptr;
 
+        // GPU memory reporting is not available before Windows 7
+        if (!IsWin7OrLater())
+            return NS_OK;
+
         if ((gdi32Handle = LoadLibrary(TEXT("gdi32.dll"))))
             queryD3DKMTStatistics = (PFND3DKMTQS)GetProcAddress(gdi32Handle, "D3DKMTQueryStatistics");
 
@@ -313,6 +320,9 @@ NS_IMPL_ISUPPORTS(D3DSharedTexturesReporter, nsIMemoryReporter)
 gfxWindowsPlatform::gfxWindowsPlatform()
   : mRenderMode(RENDER_GDI)
 {
+  mUseClearTypeForDownloadableFonts = UNINITIALIZED_VALUE;
+  mUseClearTypeAlways = UNINITIALIZED_VALUE;
+
   /*
    * Initialize COM
    */
@@ -392,6 +402,10 @@ gfxWindowsPlatform::CanUseHardwareVideoDecoding()
 bool
 gfxWindowsPlatform::InitDWriteSupport()
 {
+  if (!IsVistaOrLater()) {
+    return false;
+  }
+
   // DWrite is only supported on Windows 7 with the platform update and higher.
   // We check this by seeing if D2D1 support is available.
   if (!Factory::SupportsD2D1()) {
@@ -977,6 +991,26 @@ gfxWindowsPlatform::GetPlatformCMSOutputProfile(void* &mem, size_t &mem_size)
 #endif // _WIN32
 }
 
+bool
+gfxWindowsPlatform::UseClearTypeForDownloadableFonts()
+{
+    if (mUseClearTypeForDownloadableFonts == UNINITIALIZED_VALUE) {
+        mUseClearTypeForDownloadableFonts = Preferences::GetBool(GFX_DOWNLOADABLE_FONTS_USE_CLEARTYPE, true);
+    }
+
+    return mUseClearTypeForDownloadableFonts;
+}
+
+bool
+gfxWindowsPlatform::UseClearTypeAlways()
+{
+    if (mUseClearTypeAlways == UNINITIALIZED_VALUE) {
+        mUseClearTypeAlways = Preferences::GetBool(GFX_USE_CLEARTYPE_ALWAYS, false);
+    }
+
+    return mUseClearTypeAlways;
+}
+
 void
 gfxWindowsPlatform::GetDLLVersion(char16ptr_t aDLLPath, nsAString& aVersion)
 {
@@ -1120,7 +1154,14 @@ gfxWindowsPlatform::FontsPrefsChanged(const char *aPref)
 
     gfxPlatform::FontsPrefsChanged(aPref);
 
-    if (aPref && !strncmp(GFX_CLEARTYPE_PARAMS, aPref, strlen(GFX_CLEARTYPE_PARAMS))) {
+    if (!aPref) {
+        mUseClearTypeForDownloadableFonts = UNINITIALIZED_VALUE;
+        mUseClearTypeAlways = UNINITIALIZED_VALUE;
+    } else if (!strcmp(GFX_DOWNLOADABLE_FONTS_USE_CLEARTYPE, aPref)) {
+        mUseClearTypeForDownloadableFonts = UNINITIALIZED_VALUE;
+    } else if (!strcmp(GFX_USE_CLEARTYPE_ALWAYS, aPref)) {
+        mUseClearTypeAlways = UNINITIALIZED_VALUE;
+    } else if (!strncmp(GFX_CLEARTYPE_PARAMS, aPref, strlen(GFX_CLEARTYPE_PARAMS))) {
         SetupClearTypeParams();
     } else {
         clearTextFontCaches = false;
@@ -1368,13 +1409,17 @@ gfxWindowsPlatform::InitializeD3D9Config()
     return;
   }
 
-  d3d9.SetDefaultFromPref(
-    gfxPrefs::GetLayersAllowD3D9FallbackPrefName(),
-    true,
-    gfxPrefs::GetLayersAllowD3D9FallbackPrefDefault());
+  if (!IsVistaOrLater()) {
+    d3d9.EnableByDefault();
+  } else {
+    d3d9.SetDefaultFromPref(
+      gfxPrefs::GetLayersAllowD3D9FallbackPrefName(),
+      true,
+      gfxPrefs::GetLayersAllowD3D9FallbackPrefDefault());
 
-  if (!d3d9.IsEnabled() && gfxPrefs::LayersPreferD3D9()) {
-    d3d9.UserEnable("Direct3D9 enabled via layers.prefer-d3d9");
+    if (!d3d9.IsEnabled() && gfxPrefs::LayersPreferD3D9()) {
+      d3d9.UserEnable("Direct3D9 enabled via layers.prefer-d3d9");
+    }
   }
 
   nsCString message;
@@ -1545,6 +1590,11 @@ gfxWindowsPlatform::InitializeD2DConfig()
                           NS_LITERAL_CSTRING("FEATURE_FAILURE_D2D_D3D11_COMP"));
     return;
   }
+  if (!IsVistaOrLater()) {
+    d2d1.DisableByDefault(FeatureStatus::Unavailable, "Direct2D is not available on Windows XP",
+                          NS_LITERAL_CSTRING("FEATURE_FAILURE_D2D_XP"));
+    return;
+  }
 
   d2d1.SetDefaultFromPref(
     gfxPrefs::GetDirect2DDisabledPrefName(),
@@ -1633,12 +1683,14 @@ gfxWindowsPlatform::InitGPUProcessSupport()
       "Not using GPU Process since D3D11 is unavailable",
       NS_LITERAL_CSTRING("FEATURE_FAILURE_NO_D3D11"));
   } else if (!IsWin7SP1OrLater()) {
-    // On Windows 7 Pre-SP1, DXGI 1.2 is not available and remote presentation
-    // for D3D11 will not work. Rather than take a regression and use D3D9, we
-    // revert back to in-process rendering.
+    // For Windows XP, we simply don't care enough to support this
+    // configuration. On Windows Vista and 7 Pre-SP1, DXGI 1.2 is not
+    // available and remote presentation for D3D11 will not work. Rather
+    // than take a regression and use D3D9, we revert back to in-process
+    // rendering.
     gpuProc.Disable(
       FeatureStatus::Unavailable,
-      "Windows 7 Pre-SP1 cannot use the GPU process",
+      "Windows XP, Vista, and 7 Pre-SP1 cannot use the GPU process",
       NS_LITERAL_CSTRING("FEATURE_FAILURE_OLD_WINDOWS"));
   } else if (!IsWin8OrLater()) {
     // Windows 7 SP1 can have DXGI 1.2 only via the Platform Update, so we
@@ -1661,10 +1713,14 @@ gfxWindowsPlatform::InitGPUProcessSupport()
 bool
 gfxWindowsPlatform::DwmCompositionEnabled()
 {
-  MOZ_ASSERT(WinUtils::dwmIsCompositionEnabledPtr);
+  if (!IsVistaOrLater()) {
+    return false;
+  }
+
+  //MOZ_ASSERT(WinUtils::dwmIsCompositionEnabledPtr);
   BOOL dwmEnabled = false;
 
-  if (FAILED(WinUtils::dwmIsCompositionEnabledPtr(&dwmEnabled))) {
+  if (!WinUtils::dwmIsCompositionEnabledPtr || FAILED(WinUtils::dwmIsCompositionEnabledPtr(&dwmEnabled))) {
     return false;
   }
 
diff --git a/gfx/thebes/gfxWindowsPlatform.h b/gfx/thebes/gfxWindowsPlatform.h
index f401038fc..56c520e56 100644
--- a/gfx/thebes/gfxWindowsPlatform.h
+++ b/gfx/thebes/gfxWindowsPlatform.h
@@ -183,6 +183,11 @@ public:
 
     mozilla::gfx::BackendType GetContentBackendFor(mozilla::layers::LayersBackend aLayers) override;
 
+    // ClearType is not always enabled even when available (e.g. Windows XP)
+    // if either of these prefs are enabled and apply, use ClearType rendering
+    bool UseClearTypeForDownloadableFonts();
+    bool UseClearTypeAlways();
+
     static void GetDLLVersion(char16ptr_t aDLLPath, nsAString& aVersion);
 
     // returns ClearType tuning information for each display
@@ -241,6 +246,9 @@ protected:
 protected:
     RenderMode mRenderMode;
 
+    int8_t mUseClearTypeForDownloadableFonts;
+    int8_t mUseClearTypeAlways;
+
 private:
     void Init();
     void InitAcceleration() override;
diff --git a/hal/windows/WindowsBattery.cpp b/hal/windows/WindowsBattery.cpp
index 520330242..c1b9a31e6 100644
--- a/hal/windows/WindowsBattery.cpp
+++ b/hal/windows/WindowsBattery.cpp
@@ -5,20 +5,45 @@
 
 #include "Hal.h"
 #include "HalImpl.h"
+#include "nsITimer.h"
 #include "mozilla/Preferences.h"
 #include "mozilla/dom/battery/Constants.h"
+#include "nsComponentManagerUtils.h"
 
 #include <windows.h>
+#include "mozilla/WindowsVersion.h"
 
 using namespace mozilla::dom::battery;
 
 namespace mozilla {
 namespace hal_impl {
 
+static nsCOMPtr<nsITimer> sUpdateTimer;
+
+/* Power Event API is Vista or later */
+static decltype(RegisterPowerSettingNotification)* sRegisterPowerSettingNotification = nullptr;
+static decltype(UnregisterPowerSettingNotification)* sUnregisterPowerSettingNotification = nullptr;
 static HPOWERNOTIFY sPowerHandle = nullptr;
 static HPOWERNOTIFY sCapacityHandle = nullptr;
 static HWND sHWnd = nullptr;
 
+static void
+UpdateHandler(nsITimer* aTimer, void* aClosure) {
+  NS_ASSERTION(!IsVistaOrLater(),
+               "We shouldn't call this function for Vista or later version!");
+
+  static hal::BatteryInformation sLastInfo;
+  hal::BatteryInformation currentInfo;
+
+  hal_impl::GetCurrentBatteryInformation(&currentInfo);
+  if (sLastInfo.level() != currentInfo.level() ||
+      sLastInfo.charging() != currentInfo.charging() ||
+      sLastInfo.remainingTime() != currentInfo.remainingTime()) {
+    hal::NotifyBatteryChange(currentInfo);
+    sLastInfo = currentInfo;
+  }
+}
+
 static
 LRESULT CALLBACK
 BatteryWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
@@ -38,56 +63,94 @@ BatteryWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
 void
 EnableBatteryNotifications()
 {
-  // Create custom window to watch battery event
-  // If we can get Gecko's window handle, this is unnecessary.
-
-  if (sHWnd == nullptr) {
-    WNDCLASSW wc;
-    HMODULE hSelf = GetModuleHandle(nullptr);
-
-    if (!GetClassInfoW(hSelf, L"MozillaBatteryClass", &wc)) {
-      ZeroMemory(&wc, sizeof(WNDCLASSW));
-      wc.hInstance = hSelf;
-      wc.lpfnWndProc = BatteryWindowProc;
-      wc.lpszClassName = L"MozillaBatteryClass";
-      RegisterClassW(&wc);
+  if (IsVistaOrLater()) {
+    // RegisterPowerSettingNotification is from Vista or later.
+    // Use this API if available.
+    HMODULE hUser32 = GetModuleHandleW(L"USER32.DLL");
+    if (!sRegisterPowerSettingNotification)
+      sRegisterPowerSettingNotification = (decltype(RegisterPowerSettingNotification)*)
+        GetProcAddress(hUser32, "RegisterPowerSettingNotification");
+    if (!sUnregisterPowerSettingNotification)
+      sUnregisterPowerSettingNotification = (decltype(UnregisterPowerSettingNotification)*)
+        GetProcAddress(hUser32, "UnregisterPowerSettingNotification");
+
+    if (!sRegisterPowerSettingNotification ||
+        !sUnregisterPowerSettingNotification) {
+      NS_ASSERTION(false, "Canot find PowerSettingNotification functions.");
+      return;
     }
 
-    sHWnd = CreateWindowW(L"MozillaBatteryClass", L"Battery Watcher",
-                          0, 0, 0, 0, 0,
-                          nullptr, nullptr, hSelf, nullptr);
-  }
+    // Create custom window to watch battery event
+    // If we can get Gecko's window handle, this is unnecessary.
 
-  if (sHWnd == nullptr) {
-    return;
-  }
+    if (sHWnd == nullptr) {
+      WNDCLASSW wc;
+      HMODULE hSelf = GetModuleHandle(nullptr);
+
+      if (!GetClassInfoW(hSelf, L"MozillaBatteryClass", &wc)) {
+        ZeroMemory(&wc, sizeof(WNDCLASSW));
+        wc.hInstance = hSelf;
+        wc.lpfnWndProc = BatteryWindowProc;
+        wc.lpszClassName = L"MozillaBatteryClass";
+        RegisterClassW(&wc);
+      }
 
-  sPowerHandle =
-    RegisterPowerSettingNotification(sHWnd,
-                                     &GUID_ACDC_POWER_SOURCE,
-                                     DEVICE_NOTIFY_WINDOW_HANDLE);
-  sCapacityHandle =
-    RegisterPowerSettingNotification(sHWnd,
-                                     &GUID_BATTERY_PERCENTAGE_REMAINING,
-                                     DEVICE_NOTIFY_WINDOW_HANDLE);
+      sHWnd = CreateWindowW(L"MozillaBatteryClass", L"Battery Watcher",
+                            0, 0, 0, 0, 0,
+                            nullptr, nullptr, hSelf, nullptr);
+    }
+
+    if (sHWnd == nullptr) {
+      return;
+    }
+
+    sPowerHandle =
+      sRegisterPowerSettingNotification(sHWnd,
+                                        &GUID_ACDC_POWER_SOURCE,
+                                        DEVICE_NOTIFY_WINDOW_HANDLE);
+    sCapacityHandle =
+      sRegisterPowerSettingNotification(sHWnd,
+                                        &GUID_BATTERY_PERCENTAGE_REMAINING,
+                                        DEVICE_NOTIFY_WINDOW_HANDLE);
+  } else
+  {
+    // for Windows XP.  If we remove Windows XP support,
+    // we should remove timer-based power notification
+    sUpdateTimer = do_CreateInstance(NS_TIMER_CONTRACTID);
+    if (sUpdateTimer) {
+      sUpdateTimer->InitWithFuncCallback(UpdateHandler,
+                                         nullptr,
+                                         Preferences::GetInt("dom.battery.timer",
+                                                             30000 /* 30s */),
+                                         nsITimer::TYPE_REPEATING_SLACK);
+    } 
+  }
 }
 
 void
 DisableBatteryNotifications()
 {
-  if (sPowerHandle) {
-    UnregisterPowerSettingNotification(sPowerHandle);
-    sPowerHandle = nullptr;
-  }
+  if (IsVistaOrLater()) {
+    if (sPowerHandle) {
+      sUnregisterPowerSettingNotification(sPowerHandle);
+      sPowerHandle = nullptr;
+    }
 
-  if (sCapacityHandle) {
-    UnregisterPowerSettingNotification(sCapacityHandle);
-    sCapacityHandle = nullptr;
-  }
+    if (sCapacityHandle) {
+      sUnregisterPowerSettingNotification(sCapacityHandle);
+      sCapacityHandle = nullptr;
+    }
 
-  if (sHWnd) {
-    DestroyWindow(sHWnd);
-    sHWnd = nullptr;
+    if (sHWnd) {
+      DestroyWindow(sHWnd);
+      sHWnd = nullptr;
+    }
+  } else
+  {
+    if (sUpdateTimer) {
+      sUpdateTimer->Cancel();
+      sUpdateTimer = nullptr;
+    }
   }
 }
 
diff --git a/image/decoders/icon/win/nsIconChannel.cpp b/image/decoders/icon/win/nsIconChannel.cpp
index 04680627a..9ddcbbc48 100644
--- a/image/decoders/icon/win/nsIconChannel.cpp
+++ b/image/decoders/icon/win/nsIconChannel.cpp
@@ -29,6 +29,11 @@
 #include "nsContentSecurityManager.h"
 #include "nsContentUtils.h"
 
+#ifdef _WIN32_WINNT
+#undef _WIN32_WINNT
+#endif
+#define _WIN32_WINNT 0x0600
+
 // we need windows.h to read out registry information...
 #include <windows.h>
 #include <shellapi.h>
@@ -411,27 +416,41 @@ nsIconChannel::GetStockHIcon(nsIMozIconURI* aIconURI,
 {
   nsresult rv = NS_OK;
 
-  uint32_t desiredImageSize;
-  aIconURI->GetImageSize(&desiredImageSize);
-  nsAutoCString stockIcon;
-  aIconURI->GetStockIcon(stockIcon);
-
-  SHSTOCKICONID stockIconID = GetStockIconIDForName(stockIcon);
-  if (stockIconID == SIID_INVALID) {
-    return NS_ERROR_NOT_AVAILABLE;
-  }
+  // We can only do this on Vista or above
+  HMODULE hShellDLL = ::LoadLibraryW(L"shell32.dll");
+  decltype(SHGetStockIconInfo)* pSHGetStockIconInfo =
+    (decltype(SHGetStockIconInfo)*) ::GetProcAddress(hShellDLL,
+                                                    "SHGetStockIconInfo");
+
+  if (pSHGetStockIconInfo) {
+    uint32_t desiredImageSize;
+    aIconURI->GetImageSize(&desiredImageSize);
+    nsAutoCString stockIcon;
+    aIconURI->GetStockIcon(stockIcon);
+
+    SHSTOCKICONID stockIconID = GetStockIconIDForName(stockIcon);
+    if (stockIconID == SIID_INVALID) {
+      return NS_ERROR_NOT_AVAILABLE;
+    }
 
-  UINT infoFlags = SHGSI_ICON;
-  infoFlags |= GetSizeInfoFlag(desiredImageSize);
+    UINT infoFlags = SHGSI_ICON;
+    infoFlags |= GetSizeInfoFlag(desiredImageSize);
 
-  SHSTOCKICONINFO sii = {0};
-  sii.cbSize = sizeof(sii);
-  HRESULT hr = SHGetStockIconInfo(stockIconID, infoFlags, &sii);
+    SHSTOCKICONINFO sii = {0};
+    sii.cbSize = sizeof(sii);
+    HRESULT hr = pSHGetStockIconInfo(stockIconID, infoFlags, &sii);
 
-  if (SUCCEEDED(hr)) {
-    *hIcon = sii.hIcon;
+    if (SUCCEEDED(hr)) {
+      *hIcon = sii.hIcon;
+    } else {
+      rv = NS_ERROR_FAILURE;
+    }
   } else {
-    rv = NS_ERROR_FAILURE;
+    rv = NS_ERROR_NOT_AVAILABLE;
+  }
+
+  if (hShellDLL) {
+    ::FreeLibrary(hShellDLL);
   }
 
   return rv;
diff --git a/ipc/app/plugin-container.exe.manifest b/ipc/app/plugin-container.exe.manifest
index 303109523..d61ddec1a 100644
--- a/ipc/app/plugin-container.exe.manifest
+++ b/ipc/app/plugin-container.exe.manifest
@@ -37,6 +37,7 @@
       <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
       <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
       <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
+      <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
     </application>
   </compatibility>
 </assembly>
diff --git a/ipc/chromium/src/base/process_util_win.cc b/ipc/chromium/src/base/process_util_win.cc
index f22f7216f..12fbc23a5 100644
--- a/ipc/chromium/src/base/process_util_win.cc
+++ b/ipc/chromium/src/base/process_util_win.cc
@@ -297,6 +297,43 @@ bool LaunchApp(const std::wstring& cmdline,
   startup_info.wShowWindow = start_hidden ? SW_HIDE : SW_SHOW;
 
   LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList = NULL;
+  // Don't even bother trying pre-Vista...
+  if (mozilla::IsVistaOrLater()) {
+    // setup our handle array first - if we end up with no handles that can
+    // be inherited we can avoid trying to do the ThreadAttributeList dance...
+    HANDLE handlesToInherit[2];
+    int handleCount = 0;
+    HANDLE stdOut = ::GetStdHandle(STD_OUTPUT_HANDLE);
+    HANDLE stdErr = ::GetStdHandle(STD_ERROR_HANDLE);
+
+    if (IsInheritableHandle(stdOut))
+      handlesToInherit[handleCount++] = stdOut;
+    if (stdErr != stdOut && IsInheritableHandle(stdErr))
+      handlesToInherit[handleCount++] = stdErr;
+
+    if (handleCount) {
+      lpAttributeList = CreateThreadAttributeList(handlesToInherit, handleCount);
+      if (lpAttributeList) {
+        // it's safe to inherit handles, so arrange for that...
+        startup_info.cb = sizeof(startup_info_ex);
+        startup_info.dwFlags |= STARTF_USESTDHANDLES;
+        startup_info.hStdOutput = stdOut;
+        startup_info.hStdError = stdErr;
+        startup_info.hStdInput = INVALID_HANDLE_VALUE;
+        startup_info_ex.lpAttributeList = lpAttributeList;
+        dwCreationFlags |= EXTENDED_STARTUPINFO_PRESENT;
+        bInheritHandles = TRUE;
+      }
+    }
+  } else if (PR_GetEnv("MOZ_WIN_INHERIT_STD_HANDLES_PRE_VISTA")) {
+    // Even if we can't limit what gets inherited, we sometimes want to inherit
+    // stdout/err for testing purposes.
+    startup_info.dwFlags |= STARTF_USESTDHANDLES;
+    startup_info.hStdOutput = ::GetStdHandle(STD_OUTPUT_HANDLE);
+    startup_info.hStdError = ::GetStdHandle(STD_ERROR_HANDLE);
+    startup_info.hStdInput = INVALID_HANDLE_VALUE;
+    bInheritHandles = TRUE;
+  }
 
   PROCESS_INFORMATION process_info;
   BOOL createdOK = CreateProcess(NULL,
diff --git a/ipc/glue/WindowsMessageLoop.cpp b/ipc/glue/WindowsMessageLoop.cpp
index 8f3471efc..8057ee25d 100644
--- a/ipc/glue/WindowsMessageLoop.cpp
+++ b/ipc/glue/WindowsMessageLoop.cpp
@@ -1034,7 +1034,7 @@ MessageChannel::WaitForSyncNotify(bool aHandleWindowsMessages)
   MOZ_ASSERT(gUIThreadId, "InitUIThread was not called!");
 
 #if defined(ACCESSIBILITY)
-  if (mFlags & REQUIRE_A11Y_REENTRY) {
+  if (IsVistaOrLater() && (mFlags & REQUIRE_A11Y_REENTRY)) {
     MOZ_ASSERT(!(mFlags & REQUIRE_DEFERRED_MESSAGE_PROTECTION));
     return WaitForSyncNotifyWithA11yReentry();
   }
diff --git a/ipc/mscom/MainThreadRuntime.cpp b/ipc/mscom/MainThreadRuntime.cpp
index a061eaf54..d86317966 100644
--- a/ipc/mscom/MainThreadRuntime.cpp
+++ b/ipc/mscom/MainThreadRuntime.cpp
@@ -44,6 +44,13 @@ MainThreadRuntime::MainThreadRuntime()
     return;
   }
 
+  // Windows XP doesn't support setting of the COM exception policy, so we'll
+  // just stop here in that case.
+  if (!IsVistaOrLater()) {
+    mInitResult = S_OK;
+    return;
+  }
+
   // We are required to initialize security in order to configure global options.
   mInitResult = InitializeSecurity();
   MOZ_ASSERT(SUCCEEDED(mInitResult));
@@ -60,8 +67,11 @@ MainThreadRuntime::MainThreadRuntime()
     return;
   }
 
-  // Use the strictest policy available.
-  ULONG_PTR exceptionSetting = COMGLB_EXCEPTION_DONOT_HANDLE_ANY;
+  // Windows 7 has a policy that is even more strict. We should use that one
+  // whenever possible.
+  ULONG_PTR exceptionSetting = IsWin7OrLater() ?
+                               COMGLB_EXCEPTION_DONOT_HANDLE_ANY :
+                               COMGLB_EXCEPTION_DONOT_HANDLE;
   mInitResult = globalOpts->Set(COMGLB_EXCEPTION_HANDLING, exceptionSetting);
   MOZ_ASSERT(SUCCEEDED(mInitResult));
 }
diff --git a/js/src/frontend/Parser.cpp b/js/src/frontend/Parser.cpp
index 623379f61..4cef4d2da 100644
--- a/js/src/frontend/Parser.cpp
+++ b/js/src/frontend/Parser.cpp
@@ -1395,8 +1395,10 @@ Parser<ParseHandler>::propagateFreeNamesAndMarkClosedOverBindings(ParseContext::
     if (handler.canSkipLazyClosedOverBindings()) {
         // Scopes are nullptr-delimited in the LazyScript closed over bindings
         // array.
-        while (JSAtom* name = handler.nextLazyClosedOverBinding())
-            scope.lookupDeclaredName(name)->value()->setClosedOver();
+        while (JSAtom* name = handler.nextLazyClosedOverBinding()) {
+            DeclaredNamePtr p = scope.lookupDeclaredName(name);
+            if(p) p->value()->setClosedOver();
+        }
         return true;
     }
 
diff --git a/js/src/jit/MacroAssembler.cpp b/js/src/jit/MacroAssembler.cpp
index 9dbbe7624..f633b9b7b 100644
--- a/js/src/jit/MacroAssembler.cpp
+++ b/js/src/jit/MacroAssembler.cpp
@@ -2214,12 +2214,6 @@ MacroAssembler::finish()
     }
 
     MacroAssemblerSpecific::finish();
-
-    MOZ_RELEASE_ASSERT(size() <= MaxCodeBytesPerProcess,
-                       "AssemblerBuffer should ensure we don't exceed MaxCodeBytesPerProcess");
-
-    if (bytesNeeded() > MaxCodeBytesPerProcess)
-        setOOM();
 }
 
 void
diff --git a/js/src/jit/ProcessExecutableMemory.cpp b/js/src/jit/ProcessExecutableMemory.cpp
index 301541541..71c2ab0dc 100644
--- a/js/src/jit/ProcessExecutableMemory.cpp
+++ b/js/src/jit/ProcessExecutableMemory.cpp
@@ -385,6 +385,14 @@ class PageBitSet
 #endif
 };
 
+// Limit on the number of bytes of executable memory to prevent JIT spraying
+// attacks.
+#if JS_BITS_PER_WORD == 32
+static const size_t MaxCodeBytesPerProcess = 128 * 1024 * 1024;
+#else
+static const size_t MaxCodeBytesPerProcess = 1 * 1024 * 1024 * 1024;
+#endif
+
 // Per-process executable memory allocator. It reserves a block of memory of
 // MaxCodeBytesPerProcess bytes, then allocates/deallocates pages from that.
 //
diff --git a/js/src/jit/ProcessExecutableMemory.h b/js/src/jit/ProcessExecutableMemory.h
index a0e2fab98..078ce7cb7 100644
--- a/js/src/jit/ProcessExecutableMemory.h
+++ b/js/src/jit/ProcessExecutableMemory.h
@@ -17,14 +17,6 @@ namespace jit {
 // alignment though.
 static const size_t ExecutableCodePageSize = 64 * 1024;
 
-// Limit on the number of bytes of executable memory to prevent JIT spraying
-// attacks.
-#if JS_BITS_PER_WORD == 32
-static const size_t MaxCodeBytesPerProcess = 128 * 1024 * 1024;
-#else
-static const size_t MaxCodeBytesPerProcess = 1 * 1024 * 1024 * 1024;
-#endif
-
 enum class ProtectionSetting {
     Protected, // Not readable, writable, or executable.
     Writable,
diff --git a/js/src/jit/shared/IonAssemblerBuffer.h b/js/src/jit/shared/IonAssemblerBuffer.h
index 3a6552696..cc20e26d2 100644
--- a/js/src/jit/shared/IonAssemblerBuffer.h
+++ b/js/src/jit/shared/IonAssemblerBuffer.h
@@ -181,10 +181,6 @@ class AssemblerBuffer
 
   protected:
     virtual Slice* newSlice(LifoAlloc& a) {
-        if (size() > MaxCodeBytesPerProcess - sizeof(Slice)) {
-            fail_oom();
-            return nullptr;
-        }
         Slice* tmp = static_cast<Slice*>(a.alloc(sizeof(Slice)));
         if (!tmp) {
             fail_oom();
diff --git a/js/src/jit/x86-shared/AssemblerBuffer-x86-shared.h b/js/src/jit/x86-shared/AssemblerBuffer-x86-shared.h
index fe678fc7d..8cb557784 100644
--- a/js/src/jit/x86-shared/AssemblerBuffer-x86-shared.h
+++ b/js/src/jit/x86-shared/AssemblerBuffer-x86-shared.h
@@ -68,33 +68,6 @@ namespace js {
 
 namespace jit {
 
-    // AllocPolicy for AssemblerBuffer. OOMs when trying to allocate more than
-    // MaxCodeBytesPerProcess bytes. Use private inheritance to make sure we
-    // explicitly have to expose SystemAllocPolicy methods.
-    class AssemblerBufferAllocPolicy : private SystemAllocPolicy
-    {
-      public:
-        using SystemAllocPolicy::checkSimulatedOOM;
-        using SystemAllocPolicy::reportAllocOverflow;
-        using SystemAllocPolicy::free_;
-
-        template <typename T> T* pod_realloc(T* p, size_t oldSize, size_t newSize) {
-            static_assert(sizeof(T) == 1,
-                          "AssemblerBufferAllocPolicy should only be used with byte vectors");
-            MOZ_ASSERT(oldSize <= MaxCodeBytesPerProcess);
-            if (MOZ_UNLIKELY(newSize > MaxCodeBytesPerProcess))
-                return nullptr;
-            return SystemAllocPolicy::pod_realloc<T>(p, oldSize, newSize);
-        }
-        template <typename T> T* pod_malloc(size_t numElems) {
-            static_assert(sizeof(T) == 1,
-                          "AssemblerBufferAllocPolicy should only be used with byte vectors");
-            if (MOZ_UNLIKELY(numElems > MaxCodeBytesPerProcess))
-                return nullptr;
-            return SystemAllocPolicy::pod_malloc<T>(numElems);
-        }
-    };
-
     class AssemblerBuffer
     {
         template<size_t size, typename T>
@@ -120,9 +93,6 @@ namespace jit {
 
         void ensureSpace(size_t space)
         {
-            // This should only be called with small |space| values to ensure
-            // we don't overflow below.
-            MOZ_ASSERT(space <= 16);
             if (MOZ_UNLIKELY(!m_buffer.reserve(m_buffer.length() + space)))
                 oomDetected();
         }
@@ -198,7 +168,7 @@ namespace jit {
             m_buffer.clear();
         }
 
-        PageProtectingVector<unsigned char, 256, AssemblerBufferAllocPolicy> m_buffer;
+        PageProtectingVector<unsigned char, 256, SystemAllocPolicy> m_buffer;
         bool m_oom;
     };
 
diff --git a/js/src/jsutil.cpp b/js/src/jsutil.cpp
index 705d21975..bb9f33df9 100644
--- a/js/src/jsutil.cpp
+++ b/js/src/jsutil.cpp
@@ -39,7 +39,7 @@ mozilla::Atomic<AutoEnterOOMUnsafeRegion*> AutoEnterOOMUnsafeRegion::owner_;
 namespace oom {
 
 JS_PUBLIC_DATA(uint32_t) targetThread = 0;
-MOZ_THREAD_LOCAL(uint32_t) threadType;
+JS_PUBLIC_DATA(MOZ_THREAD_LOCAL(uint32_t)) threadType;
 JS_PUBLIC_DATA(uint64_t) maxAllocations = UINT64_MAX;
 JS_PUBLIC_DATA(uint64_t) counter = 0;
 JS_PUBLIC_DATA(bool) failAlways = true;
diff --git a/js/src/old-configure.in b/js/src/old-configure.in
index 8abea5956..b6d4ba28b 100644
--- a/js/src/old-configure.in
+++ b/js/src/old-configure.in
@@ -143,7 +143,8 @@ MOZ_TOOL_VARIABLES
 dnl Special win32 checks
 dnl ========================================================
 
-WINVER=601
+# Target the Windows 8.1 SDK by default
+WINVER=502
 
 case "$target" in
 *-mingw*)
@@ -721,7 +722,12 @@ case "$target" in
         IMPORT_LIB_SUFFIX=lib
         MKSHLIB='$(LD) -NOLOGO -DLL -OUT:$@ -PDB:$(LINK_PDBFILE) $(DSO_LDOPTS)'
         MKCSHLIB='$(LD) -NOLOGO -DLL -OUT:$@ -PDB:$(LINK_PDBFILE) $(DSO_LDOPTS)'
-        WIN32_SUBSYSTEM_VERSION=6.01
+        dnl Set subsystem version 5 for Windows XP.
+        if test "$CPU_ARCH" = "x86"; then
+            WIN32_SUBSYSTEM_VERSION=5.01
+        else
+            WIN32_SUBSYSTEM_VERSION=5.02
+        fi
         WIN32_CONSOLE_EXE_LDFLAGS=-SUBSYSTEM:CONSOLE,$WIN32_SUBSYSTEM_VERSION
         WIN32_GUI_EXE_LDFLAGS=-SUBSYSTEM:WINDOWS,$WIN32_SUBSYSTEM_VERSION
         DSO_LDOPTS=-SUBSYSTEM:WINDOWS,$WIN32_SUBSYSTEM_VERSION
diff --git a/js/src/threading/windows/ConditionVariable.cpp b/js/src/threading/windows/ConditionVariable.cpp
index 92e0249b7..868c35141 100644
--- a/js/src/threading/windows/ConditionVariable.cpp
+++ b/js/src/threading/windows/ConditionVariable.cpp
@@ -28,34 +28,342 @@
   _InterlockedIncrement((volatile long*)(addend))
 #endif
 
+// Windows XP and Server 2003 don't support condition variables natively. The
+// NativeImports class is responsible for detecting native support and
+// retrieving the appropriate function pointers. It gets instantiated once,
+// using a static initializer.
+class ConditionVariableNativeImports
+{
+public:
+  ConditionVariableNativeImports() {
+    HMODULE kernel32_dll = GetModuleHandle("kernel32.dll");
+    MOZ_RELEASE_ASSERT(kernel32_dll != NULL);
+
+#define LOAD_SYMBOL(symbol) loadSymbol(kernel32_dll, #symbol, symbol)
+    supported_ = LOAD_SYMBOL(InitializeConditionVariable) &&
+                 LOAD_SYMBOL(WakeConditionVariable) &&
+                 LOAD_SYMBOL(WakeAllConditionVariable) &&
+                 LOAD_SYMBOL(SleepConditionVariableCS);
+#undef LOAD_SYMBOL
+  }
+
+  inline bool supported() const {
+    return supported_;
+  }
+
+  void(WINAPI* InitializeConditionVariable)(CONDITION_VARIABLE* ConditionVariable);
+  void(WINAPI* WakeAllConditionVariable)(PCONDITION_VARIABLE ConditionVariable);
+  void(WINAPI* WakeConditionVariable)(CONDITION_VARIABLE* ConditionVariable);
+  BOOL(WINAPI* SleepConditionVariableCS)(CONDITION_VARIABLE* ConditionVariable,
+                                         CRITICAL_SECTION* CriticalSection,
+                                         DWORD dwMilliseconds);
+
+private:
+  template <typename T>
+  inline bool loadSymbol(HMODULE module, const char* name, T& fn) {
+    FARPROC ptr = GetProcAddress(module, name);
+    if (!ptr)
+      return false;
+
+    fn = reinterpret_cast<T>(ptr);
+    return true;
+  }
+
+  bool supported_;
+};
+
+static ConditionVariableNativeImports sNativeImports;
+
 // Wrapper for native condition variable APIs.
-struct js::ConditionVariable::PlatformData
+struct ConditionVariableNative
 {
+  inline void initialize() {
+    sNativeImports.InitializeConditionVariable(&cv_);
+  }
+
+  inline void destroy() {
+    // Native condition variables don't require cleanup.
+  }
+
+  inline void notify_one() { sNativeImports.WakeConditionVariable(&cv_); }
+
+  inline void notify_all() { sNativeImports.WakeAllConditionVariable(&cv_); }
+
+  inline bool wait(CRITICAL_SECTION* cs, DWORD msec) {
+    return sNativeImports.SleepConditionVariableCS(&cv_, cs, msec);
+  }
+
+private:
   CONDITION_VARIABLE cv_;
 };
 
+// Fallback condition variable support for Windows XP and Server 2003. Given the
+// difficulty of testing on these antiquated platforms and their rapidly
+// diminishing market share, this implementation trades performance for
+// predictable behavior.
+struct ConditionVariableFallback
+{
+  static const uint32_t WAKEUP_MODE_NONE = 0;
+  static const uint32_t WAKEUP_MODE_ONE = 0x40000000;
+  static const uint32_t WAKEUP_MODE_ALL = 0x80000000;
+
+  static const uint32_t WAKEUP_MODE_MASK = WAKEUP_MODE_ONE | WAKEUP_MODE_ALL;
+  static const uint32_t SLEEPERS_COUNT_MASK = ~WAKEUP_MODE_MASK;
+
+  void initialize()
+  {
+    // Initialize the state variable to 0 sleepers, no wakeup.
+    sleepersCountAndWakeupMode_ = 0 | WAKEUP_MODE_NONE;
+
+    // Create a semaphore that prevents threads from entering sleep,
+    // or waking other threads while a wakeup is ongoing.
+    sleepWakeupSemaphore_ = CreateSemaphoreW(NULL, 1, 1, NULL);
+    MOZ_RELEASE_ASSERT(sleepWakeupSemaphore_);
+
+    // Use an auto-reset event for waking up a single sleeper.
+    wakeOneEvent_ = CreateEventW(NULL, FALSE, FALSE, NULL);
+    MOZ_RELEASE_ASSERT(wakeOneEvent_);
+
+    // Use a manual-reset event for waking up all sleepers.
+    wakeAllEvent_ = CreateEventW(NULL, TRUE, FALSE, NULL);
+    MOZ_RELEASE_ASSERT(wakeAllEvent_);
+  }
+
+  void destroy()
+  {
+    BOOL r;
+
+    MOZ_RELEASE_ASSERT(sleepersCountAndWakeupMode_ == (0 | WAKEUP_MODE_NONE));
+
+    r = CloseHandle(sleepWakeupSemaphore_);
+    MOZ_RELEASE_ASSERT(r);
+
+    r = CloseHandle(wakeOneEvent_);
+    MOZ_RELEASE_ASSERT(r);
+
+    r = CloseHandle(wakeAllEvent_);
+    MOZ_RELEASE_ASSERT(r);
+  }
+
+private:
+  void wakeup(uint32_t wakeupMode, HANDLE wakeEvent)
+  {
+    // Ensure that only one thread at a time can wake up others.
+    BOOL result = WaitForSingleObject(sleepWakeupSemaphore_, INFINITE);
+    MOZ_RELEASE_ASSERT(result == WAIT_OBJECT_0);
+
+    // Atomically set the wakeup mode and retrieve the number of sleepers.
+    uint32_t wcwm = InterlockedExchangeAdd(&sleepersCountAndWakeupMode_,
+                                           wakeupMode);
+    uint32_t sleepersCount = wcwm & SLEEPERS_COUNT_MASK;
+    MOZ_RELEASE_ASSERT((wcwm & WAKEUP_MODE_MASK) == WAKEUP_MODE_NONE);
+
+    if (sleepersCount > 0) {
+      // If there are any sleepers, set the wake event. The (last) woken
+      // up thread is responsible for releasing the semaphore.
+      BOOL success = SetEvent(wakeEvent);
+      MOZ_RELEASE_ASSERT(success);
+
+    } else {
+      // If there are no sleepers, set the wakeup mode back to 'none'
+      // and release the semaphore ourselves.
+      sleepersCountAndWakeupMode_ = 0 | WAKEUP_MODE_NONE;
+
+      BOOL success = ReleaseSemaphore(sleepWakeupSemaphore_, 1, NULL);
+      MOZ_RELEASE_ASSERT(success);
+    }
+  }
+
+public:
+  void notify_one() { wakeup(WAKEUP_MODE_ONE, wakeOneEvent_); }
+
+  void notify_all() { wakeup(WAKEUP_MODE_ALL, wakeAllEvent_); }
+
+  bool wait(CRITICAL_SECTION* userLock, DWORD msec)
+  {
+    // Make sure that we can't enter sleep when there are other threads
+    // that still need to wake up on either of the wake events being set.
+    DWORD result = WaitForSingleObject(sleepWakeupSemaphore_, INFINITE);
+    MOZ_RELEASE_ASSERT(result == WAIT_OBJECT_0);
+
+    // Register ourselves as a sleeper. Use an atomic operation, because
+    // if another thread times out at the same time, it will decrement the
+    // sleepers count without acquiring the semaphore.
+    uint32_t wcwm = InterlockedIncrement(&sleepersCountAndWakeupMode_);
+    MOZ_RELEASE_ASSERT((wcwm & WAKEUP_MODE_MASK) == WAKEUP_MODE_NONE);
+
+    // Now that that this thread has been enlisted as a sleeper, it is safe
+    // again for other threads to do a wakeup.
+    BOOL success = ReleaseSemaphore(sleepWakeupSemaphore_, 1, NULL);
+    MOZ_RELEASE_ASSERT(success);
+
+    // Release the caller's mutex.
+    LeaveCriticalSection(userLock);
+
+    // Wait for either event to become signaled, which happens when
+    // notify_one() or notify_all() is called, or for a timeout.
+    HANDLE handles[2] = { wakeOneEvent_, wakeAllEvent_ };
+    DWORD waitResult = WaitForMultipleObjects(2, handles, FALSE, msec);
+    MOZ_RELEASE_ASSERT(waitResult == WAIT_OBJECT_0 ||
+                       waitResult == WAIT_OBJECT_0 + 1 ||
+                       (waitResult == WAIT_TIMEOUT && msec != INFINITE));
+
+    // Atomically decrease the sleepers count and retrieve the wakeup mode
+    // and new sleepers count.
+    // If the wait returned because wakeOneEvent_ was set, we are certain
+    // that the wakeup mode will be WAKEUP_MODE_ONE. In that case,
+    // atomically reset the wakeup mode to 'none', because if another
+    // thread's sleep times out at same time and it finds that it was the
+    // last sleeper, it decides whether or not to reset the wakeOneEvent_
+    // based on the current wakeup mode.
+    uint32_t sub;
+    if (waitResult == WAIT_OBJECT_0)
+      sub = 1 | WAKEUP_MODE_ONE;
+    else
+      sub = 1;
+    // Note that InterlockedExchangeAdd returns the old value, but it's
+    // easier to work with the new value.
+    wcwm = InterlockedExchangeAdd(&sleepersCountAndWakeupMode_, -sub) - sub;
+
+    uint32_t wakeupMode = wcwm & WAKEUP_MODE_MASK;
+    uint32_t sleepersCount = wcwm & SLEEPERS_COUNT_MASK;
+
+    bool releaseSleepWakeupSemaphore = false;
+
+    if (waitResult == WAIT_OBJECT_0) {
+      // The wake-one event is an auto-reset event so if we're woken by
+      // it, it should already have been reset. We also already removed
+      // the WAKEUP_MODE_ONE bit so the wakeup mode should now be 'none'
+      // again.
+      MOZ_RELEASE_ASSERT(wakeupMode == WAKEUP_MODE_NONE);
+
+      // The signaling thread has acquired the enter-wakeup semaphore and
+      // expects the woken (this) thread to release it again.
+      releaseSleepWakeupSemaphore = true;
+
+    } else if (waitResult == WAIT_TIMEOUT && wakeupMode == WAKEUP_MODE_ONE &&
+               sleepersCount == 0) {
+      // In theory a race condition is possible where the last sleeper
+      // times out right at the moment that another thread signals it.
+      // If that just happened we now have a dangling signal event and
+      // mode, but no threads to be woken up by it, and we need to clean
+      // that up.
+      BOOL success = ResetEvent(wakeOneEvent_);
+      MOZ_RELEASE_ASSERT(success);
+
+      // This is safe - we are certain there are no other sleepers that
+      // could wake up right now, and the semaphore ensures that no
+      // non-sleeping threads are messing with
+      // sleepersCountAndWakeupMode_.
+      sleepersCountAndWakeupMode_ = 0 | WAKEUP_MODE_NONE;
+
+      // The signaling thread has acquired the sleep-wakeup semaphore and
+      // expects the woken thread to release it. But since there are no
+      // sleeping threads left this thread will do it instead.
+      releaseSleepWakeupSemaphore = true;
+
+    } else if (wakeupMode == WAKEUP_MODE_ALL && sleepersCount == 0) {
+      // If this was the last thread waking up in response to a
+      // notify_all, clear the wakeup mode and reset the wake-all event.
+      // A race condition similar to the case described above could
+      // occur, so waitResult could be WAIT_TIMEOUT, but that doesn't
+      // matter for the actions that need to be taken.
+      MOZ_RELEASE_ASSERT(waitResult = WAIT_OBJECT_0 + 1 ||
+                         waitResult == WAIT_TIMEOUT);
+
+      BOOL success = ResetEvent(wakeAllEvent_);
+      MOZ_RELEASE_ASSERT(success);
+
+      sleepersCountAndWakeupMode_ = 0 | WAKEUP_MODE_NONE;
+
+      // The broadcasting thread has acquired the enter-wakeup semaphore
+      // and expects the last thread that wakes up to release it.
+      releaseSleepWakeupSemaphore = true;
+
+    } else if ((waitResult == WAIT_TIMEOUT && msec != INFINITE) ||
+               (waitResult == WAIT_OBJECT_0 + 1 &&
+                wakeupMode == WAKEUP_MODE_ALL)) {
+      // Either:
+      //   * The wait timed out but found no active notify_one or notify_all
+      //     the moment it decreased the wait count.
+      //   * A notify_all woke up this thread but there are more threads
+      //     that need to be woken up by the wake-all event.
+      // These are ordinary conditions in which we don't have to do
+      // anything.
+
+    } else {
+      MOZ_CRASH("invalid wakeup condition");
+    }
+
+    // Release the enter-wakeup semaphore if the wakeup condition requires
+    // us to do it.
+    if (releaseSleepWakeupSemaphore) {
+      BOOL success = ReleaseSemaphore(sleepWakeupSemaphore_, 1, NULL);
+      MOZ_RELEASE_ASSERT(success);
+    }
+
+    // Reacquire the user mutex.
+    EnterCriticalSection(userLock);
+
+    // Return true if woken up, false when timed out.
+    if (waitResult == WAIT_TIMEOUT) {
+      SetLastError(ERROR_TIMEOUT);
+      return false;
+    }
+    return true;
+  }
+
+private:
+  uint32_t sleepersCountAndWakeupMode_;
+  HANDLE sleepWakeupSemaphore_;
+  HANDLE wakeOneEvent_;
+  HANDLE wakeAllEvent_;
+};
+
+struct js::ConditionVariable::PlatformData
+{
+  union
+  {
+    ConditionVariableNative native;
+    ConditionVariableFallback fallback;
+  };
+};
+
 js::ConditionVariable::ConditionVariable()
 {
-  InitializeConditionVariable(&platformData()->cv_);
+  if (sNativeImports.supported())
+    platformData()->native.initialize();
+  else
+    platformData()->fallback.initialize();
 }
 
 void
 js::ConditionVariable::notify_one()
 {
-  WakeConditionVariable(&platformData()->cv_);
+  if (sNativeImports.supported())
+    platformData()->native.notify_one();
+  else
+    platformData()->fallback.notify_one();
 }
 
 void
 js::ConditionVariable::notify_all()
 {
-  WakeAllConditionVariable(&platformData()->cv_);
+  if (sNativeImports.supported())
+    platformData()->native.notify_all();
+  else
+    platformData()->fallback.notify_all();
 }
 
 void
 js::ConditionVariable::wait(UniqueLock<Mutex>& lock)
 {
-  SRWLOCK* srwlock = &lock.lock.platformData()->lock;
-  bool r = SleepConditionVariableSRW(&platformData()->cv_, srwlock, INFINITE, 0);
+  CRITICAL_SECTION* cs = &lock.lock.platformData()->criticalSection;
+  bool r;
+  if (sNativeImports.supported())
+    r = platformData()->native.wait(cs, INFINITE);
+  else
+    r = platformData()->fallback.wait(cs, INFINITE);
   MOZ_RELEASE_ASSERT(r);
 }
 
@@ -70,7 +378,7 @@ js::CVStatus
 js::ConditionVariable::wait_for(UniqueLock<Mutex>& lock,
                                 const mozilla::TimeDuration& rel_time)
 {
-  SRWLOCK* srwlock = &lock.lock.platformData()->lock;
+  CRITICAL_SECTION* cs = &lock.lock.platformData()->criticalSection;
 
   // Note that DWORD is unsigned, so we have to be careful to clamp at 0.
   // If rel_time is Forever, then ToMilliseconds is +inf, which evaluates as
@@ -82,7 +390,11 @@ js::ConditionVariable::wait_for(UniqueLock<Mutex>& lock,
                  ? INFINITE
                  : static_cast<DWORD>(msecd);
 
-  BOOL r = SleepConditionVariableSRW(&platformData()->cv_, srwlock, msec, 0);
+  BOOL r;
+  if (sNativeImports.supported())
+    r = platformData()->native.wait(cs, msec);
+  else
+    r = platformData()->fallback.wait(cs, msec);
   if (r)
     return CVStatus::NoTimeout;
   MOZ_RELEASE_ASSERT(GetLastError() == ERROR_TIMEOUT);
@@ -91,7 +403,10 @@ js::ConditionVariable::wait_for(UniqueLock<Mutex>& lock,
 
 js::ConditionVariable::~ConditionVariable()
 {
-  // Native condition variables don't require cleanup.
+  if (sNativeImports.supported())
+    platformData()->native.destroy();
+  else
+    platformData()->fallback.destroy();
 }
 
 inline js::ConditionVariable::PlatformData*
diff --git a/js/src/threading/windows/MutexImpl.cpp b/js/src/threading/windows/MutexImpl.cpp
index e838459b5..385d1c8de 100644
--- a/js/src/threading/windows/MutexImpl.cpp
+++ b/js/src/threading/windows/MutexImpl.cpp
@@ -13,6 +13,35 @@
 #include "threading/Mutex.h"
 #include "threading/windows/MutexPlatformData.h"
 
+namespace {
+
+// We build with a toolkit that supports WinXP, so we have to probe
+// for modern features at runtime. This is necessary because Vista and
+// later automatically allocate and subsequently leak a debug info
+// object for each critical section that we allocate unless we tell it
+// not to. In order to tell it not to, we need the extra flags field
+// provided by the Ex version of InitializeCriticalSection.
+struct MutexNativeImports
+{
+  using InitializeCriticalSectionExT = BOOL (WINAPI*)(CRITICAL_SECTION*, DWORD, DWORD);
+  InitializeCriticalSectionExT InitializeCriticalSectionEx;
+
+  MutexNativeImports() {
+    HMODULE kernel32_dll = GetModuleHandle("kernel32.dll");
+    MOZ_RELEASE_ASSERT(kernel32_dll != NULL);
+    InitializeCriticalSectionEx = reinterpret_cast<InitializeCriticalSectionExT>(
+      GetProcAddress(kernel32_dll, "InitializeCriticalSectionEx"));
+  }
+
+  bool hasInitializeCriticalSectionEx() const {
+    return InitializeCriticalSectionEx;
+  }
+};
+
+static MutexNativeImports NativeImports;
+
+} // (anonymous namespace)
+
 js::detail::MutexImpl::MutexImpl()
 {
   AutoEnterOOMUnsafeRegion oom;
@@ -20,7 +49,18 @@ js::detail::MutexImpl::MutexImpl()
   if (!platformData_)
     oom.crash("js::Mutex::Mutex");
 
-  InitializeSRWLock(&platformData()->lock);
+  // This number was adopted from NSPR.
+  const static DWORD LockSpinCount = 1500;
+  BOOL r;
+  if (NativeImports.hasInitializeCriticalSectionEx()) {
+    r = NativeImports.InitializeCriticalSectionEx(&platformData()->criticalSection,
+                                                  LockSpinCount,
+                                                  CRITICAL_SECTION_NO_DEBUG_INFO);
+  } else {
+    r = InitializeCriticalSectionAndSpinCount(&platformData()->criticalSection,
+                                              LockSpinCount);
+  }
+  MOZ_RELEASE_ASSERT(r);
 }
 
 js::detail::MutexImpl::~MutexImpl()
@@ -28,17 +68,18 @@ js::detail::MutexImpl::~MutexImpl()
   if (!platformData_)
     return;
 
+  DeleteCriticalSection(&platformData()->criticalSection);
   js_delete(platformData());
 }
 
 void
 js::detail::MutexImpl::lock()
 {
-  AcquireSRWLockExclusive(&platformData()->lock);
+  EnterCriticalSection(&platformData()->criticalSection);
 }
 
 void
 js::detail::MutexImpl::unlock()
 {
-  ReleaseSRWLockExclusive(&platformData()->lock);
+  LeaveCriticalSection(&platformData()->criticalSection);
 }
diff --git a/js/src/threading/windows/MutexPlatformData.h b/js/src/threading/windows/MutexPlatformData.h
index 1d741c5d0..fbe7fc80d 100644
--- a/js/src/threading/windows/MutexPlatformData.h
+++ b/js/src/threading/windows/MutexPlatformData.h
@@ -13,7 +13,7 @@
 
 struct js::detail::MutexImpl::PlatformData
 {
-  SRWLOCK lock;
+  CRITICAL_SECTION criticalSection;
 };
 
 #endif // platform_win_MutexPlatformData_h
diff --git a/js/src/vm/Stopwatch.h b/js/src/vm/Stopwatch.h
index 38a3eb801..a1b8bbbcb 100644
--- a/js/src/vm/Stopwatch.h
+++ b/js/src/vm/Stopwatch.h
@@ -301,9 +301,9 @@ struct PerformanceMonitoring {
 
 #if WINVER >= 0x0600
 struct cpuid_t {
-    uint16_t group_;
-    uint8_t number_;
-    cpuid_t(uint16_t group, uint8_t number)
+    WORD group_;
+    BYTE number_;
+    cpuid_t(WORD group, BYTE number)
         : group_(group),
           number_(number)
     { }
diff --git a/js/xpconnect/shell/xpcshell.exe.manifest b/js/xpconnect/shell/xpcshell.exe.manifest
index c35b77af4..db2aa0861 100644
--- a/js/xpconnect/shell/xpcshell.exe.manifest
+++ b/js/xpconnect/shell/xpcshell.exe.manifest
@@ -25,6 +25,7 @@
       <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
       <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
       <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
+      <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
     </application>
   </compatibility>
 </assembly>
diff --git a/layout/style/nsMediaFeatures.cpp b/layout/style/nsMediaFeatures.cpp
index 5a54d5455..052ce58e8 100644
--- a/layout/style/nsMediaFeatures.cpp
+++ b/layout/style/nsMediaFeatures.cpp
@@ -70,6 +70,8 @@ struct OperatingSystemVersionInfo {
 
 // Os version identities used in the -moz-os-version media query.
 const OperatingSystemVersionInfo osVersionStrings[] = {
+  { LookAndFeel::eOperatingSystemVersion_WindowsXP,     L"windows-xp" },
+  { LookAndFeel::eOperatingSystemVersion_WindowsVista,  L"windows-vista" },
   { LookAndFeel::eOperatingSystemVersion_Windows7,      L"windows-win7" },
   { LookAndFeel::eOperatingSystemVersion_Windows8,      L"windows-win8" },
   { LookAndFeel::eOperatingSystemVersion_Windows10,     L"windows-win10" }
diff --git a/layout/style/test/chrome/bug418986-2.js b/layout/style/test/chrome/bug418986-2.js
index b083f48ee..4336f4abd 100644
--- a/layout/style/test/chrome/bug418986-2.js
+++ b/layout/style/test/chrome/bug418986-2.js
@@ -53,6 +53,8 @@ var suppressed_toggles = [
 
 // Possible values for '-moz-os-version'
 var windows_versions = [
+  "windows-xp",
+  "windows-vista",
   "windows-win7",
   "windows-win8",
   "windows-win10",
diff --git a/layout/style/test/test_media_queries.html b/layout/style/test/test_media_queries.html
index d503fad0b..479306a55 100644
--- a/layout/style/test/test_media_queries.html
+++ b/layout/style/test/test_media_queries.html
@@ -713,6 +713,8 @@ function run() {
   expression_should_not_be_parseable("-moz-windows-theme: ");
 
   // os version media queries (currently windows only)
+  expression_should_be_parseable("-moz-os-version: windows-xp");
+  expression_should_be_parseable("-moz-os-version: windows-vista");
   expression_should_be_parseable("-moz-os-version: windows-win7");
   expression_should_be_parseable("-moz-os-version: windows-win8");
   expression_should_be_parseable("-moz-os-version: windows-win10");
diff --git a/media/mtransport/third_party/nrappkit/src/util/util.c b/media/mtransport/third_party/nrappkit/src/util/util.c
index 1e2801259..31a245f45 100644
--- a/media/mtransport/third_party/nrappkit/src/util/util.c
+++ b/media/mtransport/third_party/nrappkit/src/util/util.c
@@ -506,7 +506,7 @@ strlcat(dst, src, siz)
 
 #endif  /* LINUX or WIN32 */
 
-#if defined(USE_OWN_INET_NTOP) || (defined(WIN32) && WINVER < 0x0600)
+#if defined(USE_OWN_INET_NTOP) || defined(WIN32)
 #include <errno.h>
 #ifdef WIN32
 #include <Ws2ipdef.h>
@@ -775,5 +775,18 @@ int gettimeofday(struct timeval *tv, void *tz)
     return 0;
   }
 
+#if _MSC_VER < 1900
+int snprintf(char *buffer, size_t n, const char *format, ...)
+{
+  va_list argp;
+  int ret;
+  va_start(argp, format);
+  ret = _vscprintf(format, argp);
+  vsnprintf_s(buffer, n, _TRUNCATE, format, argp);
+  va_end(argp);
+  return ret;
+}
+#endif
+
 #endif
 
diff --git a/media/mtransport/third_party/nrappkit/src/util/util.h b/media/mtransport/third_party/nrappkit/src/util/util.h
index 975baa4aa..869b72863 100644
--- a/media/mtransport/third_party/nrappkit/src/util/util.h
+++ b/media/mtransport/third_party/nrappkit/src/util/util.h
@@ -64,7 +64,8 @@ int nr_write_pid_file(char *pid_filename);
 int nr_reg_uint4_fetch_and_check(NR_registry key, UINT4 min, UINT4 max, int log_fac, int die, UINT4 *val);
 int nr_reg_uint8_fetch_and_check(NR_registry key, UINT8 min, UINT8 max, int log_fac, int die, UINT8 *val);
 
-#if defined(WIN32) && WINVER < 0x0600
+#ifdef WIN32
+int snprintf(char *buffer, size_t n, const char *format, ...);
 const char *inet_ntop(int af, const void *src, char *dst, size_t size);
 int inet_pton(int af, const char *src, void *dst);
 #endif
diff --git a/memory/mozjemalloc/jemalloc.c b/memory/mozjemalloc/jemalloc.c
index c0c189abf..c842f2383 100644
--- a/memory/mozjemalloc/jemalloc.c
+++ b/memory/mozjemalloc/jemalloc.c
@@ -204,6 +204,9 @@
 
 #ifdef MOZ_MEMORY_WINDOWS
 
+/* Some defines from the CRT internal headers that we need here. */
+#define _CRT_SPINCOUNT 5000
+#define __crtInitCritSecAndSpinCount InitializeCriticalSectionAndSpinCount
 #include <io.h>
 #include <windows.h>
 #include <intrin.h>
@@ -592,8 +595,8 @@ void *_mmap(void *addr, size_t length, int prot, int flags,
  * issues in some cases.
  */
 #if defined(MOZ_MEMORY_WINDOWS)
-#define malloc_mutex_t SRWLOCK
-#define malloc_spinlock_t SRWLOCK
+#define malloc_mutex_t CRITICAL_SECTION
+#define malloc_spinlock_t CRITICAL_SECTION
 #elif defined(MOZ_MEMORY_DARWIN)
 typedef struct {
 	OSSpinLock	lock;
@@ -1558,7 +1561,8 @@ static bool
 malloc_mutex_init(malloc_mutex_t *mutex)
 {
 #if defined(MOZ_MEMORY_WINDOWS)
-    InitializeSRWLock(mutex);
+	if (! __crtInitCritSecAndSpinCount(mutex, _CRT_SPINCOUNT))
+		return (true);
 #elif defined(MOZ_MEMORY_DARWIN)
 	mutex->lock = OS_SPINLOCK_INIT;
 #elif defined(MOZ_MEMORY_LINUX) && !defined(MOZ_MEMORY_ANDROID)
@@ -1587,7 +1591,7 @@ malloc_mutex_lock(malloc_mutex_t *mutex)
 {
 
 #if defined(MOZ_MEMORY_WINDOWS)
-	AcquireSRWLockExclusive(mutex);
+	EnterCriticalSection(mutex);
 #elif defined(MOZ_MEMORY_DARWIN)
 	OSSpinLockLock(&mutex->lock);
 #elif defined(MOZ_MEMORY)
@@ -1602,7 +1606,7 @@ malloc_mutex_unlock(malloc_mutex_t *mutex)
 {
 
 #if defined(MOZ_MEMORY_WINDOWS)
-	ReleaseSRWLockExclusive(mutex);
+	LeaveCriticalSection(mutex);
 #elif defined(MOZ_MEMORY_DARWIN)
 	OSSpinLockUnlock(&mutex->lock);
 #elif defined(MOZ_MEMORY)
@@ -1619,7 +1623,8 @@ static bool
 malloc_spin_init(malloc_spinlock_t *lock)
 {
 #if defined(MOZ_MEMORY_WINDOWS)
-	InitializeSRWLock(lock);
+	if (! __crtInitCritSecAndSpinCount(lock, _CRT_SPINCOUNT))
+		return (true);
 #elif defined(MOZ_MEMORY_DARWIN)
 	lock->lock = OS_SPINLOCK_INIT;
 #elif defined(MOZ_MEMORY_LINUX) && !defined(MOZ_MEMORY_ANDROID)
@@ -1646,7 +1651,7 @@ malloc_spin_lock(malloc_spinlock_t *lock)
 {
 
 #if defined(MOZ_MEMORY_WINDOWS)
-	AcquireSRWLockExclusive(lock);
+	EnterCriticalSection(lock);
 #elif defined(MOZ_MEMORY_DARWIN)
 	OSSpinLockLock(&lock->lock);
 #elif defined(MOZ_MEMORY)
@@ -1660,7 +1665,7 @@ static inline void
 malloc_spin_unlock(malloc_spinlock_t *lock)
 {
 #if defined(MOZ_MEMORY_WINDOWS)
-	ReleaseSRWLockExclusive(lock);
+	LeaveCriticalSection(lock);
 #elif defined(MOZ_MEMORY_DARWIN)
 	OSSpinLockUnlock(&lock->lock);
 #elif defined(MOZ_MEMORY)
diff --git a/mfbt/ThreadLocal.h b/mfbt/ThreadLocal.h
index 391e748ad..880e67735 100644
--- a/mfbt/ThreadLocal.h
+++ b/mfbt/ThreadLocal.h
@@ -9,7 +9,20 @@
 #ifndef mozilla_ThreadLocal_h
 #define mozilla_ThreadLocal_h
 
-#if !defined(XP_WIN)
+#if defined(XP_WIN)
+// This file will get included in any file that wants to add a profiler mark.
+// In order to not bring <windows.h> together we could include windef.h and
+// winbase.h which are sufficient to get the prototypes for the Tls* functions.
+// # include <windef.h>
+// # include <winbase.h>
+// Unfortunately, even including these headers causes us to add a bunch of ugly
+// stuff to our namespace e.g #define CreateEvent CreateEventW
+extern "C" {
+__declspec(dllimport) void* __stdcall TlsGetValue(unsigned long);
+__declspec(dllimport) int __stdcall TlsSetValue(unsigned long, void*);
+__declspec(dllimport) unsigned long __stdcall TlsAlloc();
+}
+#else
 #  include <pthread.h>
 #  include <signal.h>
 #endif
@@ -31,7 +44,7 @@ typedef sig_atomic_t sig_safe_t;
 
 namespace detail {
 
-#if defined(HAVE_THREAD_TLS_KEYWORD) || defined(XP_WIN) || defined(XP_MACOSX)
+#if defined(HAVE_THREAD_TLS_KEYWORD)
 #define MOZ_HAS_THREAD_LOCAL
 #endif
 
@@ -78,7 +91,11 @@ template<typename T>
 class ThreadLocal
 {
 #ifndef MOZ_HAS_THREAD_LOCAL
+#if defined(XP_WIN)
+  typedef unsigned long key_t;
+#else
   typedef pthread_key_t key_t;
+#endif
 
   // Integral types narrower than void* must be extended to avoid
   // warnings from valgrind on some platforms.  This helper type
@@ -144,7 +161,12 @@ ThreadLocal<T>::init()
   return true;
 #else
   if (!initialized()) {
+#ifdef XP_WIN
+    mKey = TlsAlloc();
+    mInited = mKey != 0xFFFFFFFFUL; // TLS_OUT_OF_INDEXES
+#else
     mInited = !pthread_key_create(&mKey, nullptr);
+#endif
   }
   return mInited;
 #endif
@@ -159,7 +181,11 @@ ThreadLocal<T>::get() const
 #else
   MOZ_ASSERT(initialized());
   void* h;
+#ifdef XP_WIN
+  h = TlsGetValue(mKey);
+#else
   h = pthread_getspecific(mKey);
+#endif
   return static_cast<T>(reinterpret_cast<typename Helper<T>::Type>(h));
 #endif
 }
@@ -173,7 +199,11 @@ ThreadLocal<T>::set(const T aValue)
 #else
   MOZ_ASSERT(initialized());
   void* h = reinterpret_cast<void*>(static_cast<typename Helper<T>::Type>(aValue));
+#ifdef XP_WIN
+  bool succeeded = TlsSetValue(mKey, h);
+#else
   bool succeeded = !pthread_setspecific(mKey, h);
+#endif
   if (!succeeded) {
     MOZ_CRASH();
   }
@@ -181,11 +211,7 @@ ThreadLocal<T>::set(const T aValue)
 }
 
 #ifdef MOZ_HAS_THREAD_LOCAL
-#if defined(XP_WIN) || defined(XP_MACOSX)
-#define MOZ_THREAD_LOCAL(TYPE) thread_local mozilla::detail::ThreadLocal<TYPE>
-#else
 #define MOZ_THREAD_LOCAL(TYPE) __thread mozilla::detail::ThreadLocal<TYPE>
-#endif
 #else
 #define MOZ_THREAD_LOCAL(TYPE) mozilla::detail::ThreadLocal<TYPE>
 #endif
diff --git a/mfbt/WindowsVersion.h b/mfbt/WindowsVersion.h
index 4d0cb374b..4a73fb3ff 100644
--- a/mfbt/WindowsVersion.h
+++ b/mfbt/WindowsVersion.h
@@ -84,11 +84,82 @@ IsWindowsBuildOrLater(uint32_t aBuild)
   return false;
 }
 
-// Although many of the older versions are not supported, we should keep
-// these entries for completeness (since they don't take any resources of
-// note), and to cater to corner cases for applications running e.g. in
-// Windows' compatibility mode.
+inline bool
+IsWindows10BuildOrLater(uint32_t aBuild)
+{
+  static uint32_t minBuild = 0;
+  static uint32_t maxBuild = UINT32_MAX;
+
+  if (minBuild >= aBuild) {
+    return true;
+  }
+
+  if (aBuild >= maxBuild) {
+    return false;
+  }
+
+  OSVERSIONINFOEX info;
+  ZeroMemory(&info, sizeof(OSVERSIONINFOEX));
+  info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
+  info.dwMajorVersion = 10;
+  info.dwBuildNumber = aBuild;
 
+  DWORDLONG conditionMask = 0;
+  VER_SET_CONDITION(conditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL);
+  VER_SET_CONDITION(conditionMask, VER_MINORVERSION, VER_GREATER_EQUAL);
+  VER_SET_CONDITION(conditionMask, VER_BUILDNUMBER, VER_GREATER_EQUAL);
+  VER_SET_CONDITION(conditionMask, VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL);
+  VER_SET_CONDITION(conditionMask, VER_SERVICEPACKMINOR, VER_GREATER_EQUAL);
+
+  if (VerifyVersionInfo(&info, VER_MAJORVERSION | VER_MINORVERSION |
+                        VER_BUILDNUMBER | VER_SERVICEPACKMAJOR |
+                        VER_SERVICEPACKMINOR, conditionMask)) {
+    minBuild = aBuild;
+    return true;
+  }
+
+  maxBuild = aBuild;
+  return false;
+}
+
+#if 0//defined(_M_X64) || defined(_M_AMD64)
+// We support only Win7 or later on Win64.
+MOZ_ALWAYS_INLINE bool
+IsXPSP3OrLater()
+{
+  return true;
+}
+
+MOZ_ALWAYS_INLINE bool
+IsWin2003OrLater()
+{
+  return true;
+}
+
+MOZ_ALWAYS_INLINE bool
+IsWin2003SP2OrLater()
+{
+  return true;
+}
+
+MOZ_ALWAYS_INLINE bool
+IsVistaOrLater()
+{
+  return true;
+}
+
+MOZ_ALWAYS_INLINE bool
+IsVistaSP1OrLater()
+{
+  return true;
+}
+
+MOZ_ALWAYS_INLINE bool
+IsWin7OrLater()
+{
+  return true;
+}
+#else
 MOZ_ALWAYS_INLINE bool
 IsXPSP3OrLater()
 {
@@ -124,6 +195,7 @@ IsWin7OrLater()
 {
   return IsWindowsVersionOrLater(0x06010000ul);
 }
+#endif
 
 MOZ_ALWAYS_INLINE bool
 IsWin7SP1OrLater()
@@ -149,6 +221,12 @@ IsWin10OrLater()
   return IsWindowsVersionOrLater(0x0a000000ul);
 }
 
+MOZ_ALWAYS_INLINE bool
+IsWin10CreatorsUpdateOrLater()
+{
+  return IsWindows10BuildOrLater(15063);
+}
+
 MOZ_ALWAYS_INLINE bool
 IsNotWin7PreRTM()
 {
@@ -156,6 +234,41 @@ IsNotWin7PreRTM()
          IsWindowsBuildOrLater(7600);
 }
 
+MOZ_ALWAYS_INLINE bool
+IsWin7AndPre2000Compatible() {
+  /*
+   * See Bug 1279171.
+   * We'd like to avoid using WMF on specific OS version when compatibility
+   * mode is in effect. The purpose of this function is to check if FF runs on
+   * Win7 OS with application compatibility mode being set to 95/98/ME.
+   * Those compatibility mode options (95/98/ME) can only display and
+   * be selected for 32-bit application.
+   * If the compatibility mode is in effect, the GetVersionEx function will
+   * report the OS as it identifies itself, which may not be the OS that is
+   * installed.
+   * Note : 1) We only target for Win7 build number greater than 7600.
+   *        2) GetVersionEx may be altered or unavailable for release after
+   *           Win8.1. Set pragma to avoid build warning as error.
+   */
+  bool isWin7 = IsNotWin7PreRTM() && !IsWin8OrLater();
+  if (!isWin7) {
+    return false;
+  }
+
+  OSVERSIONINFOEX info;
+  ZeroMemory(&info, sizeof(OSVERSIONINFOEX));
+
+  info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
+#pragma warning(push)
+#pragma warning(disable:4996)
+  bool success = GetVersionEx((LPOSVERSIONINFO) &info);
+#pragma warning(pop)
+  if (!success) {
+    return false;
+  }
+  return info.dwMajorVersion < 5;
+}
+
 } // namespace mozilla
 
 #endif /* mozilla_WindowsVersion_h */
diff --git a/modules/libpref/init/all.js b/modules/libpref/init/all.js
index d2266f812..65c21a452 100644
--- a/modules/libpref/init/all.js
+++ b/modules/libpref/init/all.js
@@ -548,7 +548,7 @@ pref("media.getusermedia.screensharing.allowed_domains", "webex.com,*.webex.com,
  // includes Mozilla's test domain: mozilla.github.io (not intended for release)
 pref("media.getusermedia.screensharing.allowed_domains", "mozilla.github.io,webex.com,*.webex.com,ciscospark.com,*.ciscospark.com,projectsquared.com,*.projectsquared.com,*.room.co,room.co,beta.talky.io,talky.io,*.clearslide.com,appear.in,*.appear.in,tokbox.com,*.tokbox.com,*.sso.francetelecom.fr,*.si.francetelecom.fr,*.sso.infra.ftgroup,*.multimedia-conference.orange-business.com,*.espacecollaboration.orange-business.com,free.gotomeeting.com,g2m.me,*.g2m.me,*.mypurecloud.com,*.mypurecloud.com.au,spreed.me,*.spreed.me,*.spreed.com,air.mozilla.org,*.circuit.com,*.yourcircuit.com,circuit.siemens.com,yourcircuit.siemens.com,circuitsandbox.net,*.unify.com,tandi.circuitsandbox.net,*.ericsson.net,*.cct.ericsson.net,*.opentok.com,*.conf.meetecho.com,meet.jit.si,*.meet.jit.si,web.stage.speakeasyapp.net,web.speakeasyapp.net,*.hipchat.me,*.beta-wspbx.com,*.wspbx.com,*.unifiedcloudit.com,*.smartboxuc.com,*.smartbox-uc.com,*.panterranetworks.com,pexipdemo.com,*.pexipdemo.com,pex.me,*.pex.me,*.rd.pexip.com,1click.io,*.1click.io,*.fuze.com,*.fuzemeeting.com,*.thinkingphones.com,gotomeeting.com,*.gotomeeting.com,gotowebinar.com,*.gotowebinar.com,gototraining.com,*.gototraining.com,citrix.com,*.citrix.com,expertcity.com,*.expertcity.com,citrixonline.com,*.citrixonline.com,g2m.me,*.g2m.me,gotomeet.me,*.gotomeet.me,gotomeet.at,*.gotomeet.at,miriadaxdes.miriadax.net,certificacion.miriadax.net,miriadax.net,*.wire.com,sylaps.com,*.sylaps.com,bluejeans.com,*.bluejeans.com,*.a.bluejeans.com,*.bbcollab.com");
 #endif
-// OS/X 10.6 has screen/window sharing off by default due to various issues - Caveat emptor
+// OS/X 10.6 and XP have screen/window sharing off by default due to various issues - Caveat emptor
 pref("media.getusermedia.screensharing.allow_on_old_platforms", false);
 
 pref("media.getusermedia.audiocapture.enabled", false);
@@ -3343,6 +3343,14 @@ pref("font.name.sans-serif.x-math", "Arial");
 pref("font.name.monospace.x-math", "Courier New");
 pref("font.name.cursive.x-math", "Comic Sans MS");
 
+// cleartype settings - false implies default system settings
+
+// use cleartype rendering for downloadable fonts (win xp only)
+pref("gfx.font_rendering.cleartype.use_for_downloadable_fonts", true);
+
+// use cleartype rendering for all fonts always (win xp only)
+pref("gfx.font_rendering.cleartype.always_use_for_content", false);
+
 // ClearType tuning parameters for directwrite/d2d.
 //
 // Allows overriding of underlying registry values in:
diff --git a/mozglue/build/WindowsDllBlocklist.cpp b/mozglue/build/WindowsDllBlocklist.cpp
index 9b63d6673..a3c662723 100644
--- a/mozglue/build/WindowsDllBlocklist.cpp
+++ b/mozglue/build/WindowsDllBlocklist.cpp
@@ -67,6 +67,7 @@ struct DllBlockInfo {
   enum {
     FLAGS_DEFAULT = 0,
     BLOCK_WIN8PLUS_ONLY = 1,
+    BLOCK_XP_ONLY = 2,
     USE_TIMESTAMP = 4,
   } flags;
 };
@@ -155,6 +156,9 @@ static DllBlockInfo sWindowsDllBlocklist[] = {
   // Topcrash with Conduit SearchProtect, bug 944542
   { "spvc32.dll", ALL_VERSIONS },
 
+  // XP topcrash with F-Secure, bug 970362
+  { "fs_ccf_ni_umh32.dll", MAKE_VERSION(1, 42, 101, 0), DllBlockInfo::BLOCK_XP_ONLY },
+
   // Topcrash with V-bates, bug 1002748 and bug 1023239
   { "libinject.dll", UNVERSIONED },
   { "libinject2.dll", 0x537DDC93, DllBlockInfo::USE_TIMESTAMP },
@@ -672,6 +676,11 @@ patched_LdrLoadDll (PWCHAR filePath, PULONG flags, PUNICODE_STRING moduleFileNam
       goto continue_loading;
     }
 
+    if ((info->flags == DllBlockInfo::BLOCK_XP_ONLY) &&
+        IsWin2003OrLater()) {
+      goto continue_loading;
+    }
+
     unsigned long long fVersion = ALL_VERSIONS;
 
     if (info->maxVersion != ALL_VERSIONS) {
@@ -740,7 +749,7 @@ continue_loading:
       return STATUS_DLL_NOT_FOUND;
     }
 
-    if (!CheckASLR(full_fname.get())) {
+    if (IsVistaOrLater() && !CheckASLR(full_fname.get())) {
       printf_stderr("LdrLoadDll: Blocking load of '%s'.  XPCOM components must support ASLR.\n", dllName);
       return STATUS_DLL_NOT_FOUND;
     }
diff --git a/mozglue/misc/TimeStamp_windows.cpp b/mozglue/misc/TimeStamp_windows.cpp
index 683c2209a..cd519affd 100644
--- a/mozglue/misc/TimeStamp_windows.cpp
+++ b/mozglue/misc/TimeStamp_windows.cpp
@@ -5,7 +5,7 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 // Implement TimeStamp::Now() with QueryPerformanceCounter() controlled with
-// values of GetTickCount64().
+// values of GetTickCount().
 
 #include "mozilla/MathAlgorithms.h"
 #include "mozilla/TimeStamp.h"
@@ -69,7 +69,7 @@ static const DWORD kDefaultTimeIncrement = 156001;
  * further just referred as [mt], meaning milli-ticks.
  *
  * This is needed to preserve maximum precision of the performance frequency
- * representation.  GetTickCount64 values in milliseconds are multiplied with
+ * representation.  GetTickCount values in milliseconds are multiplied with
  * frequency per second.  Therefor we need to multiply QPC value by 1000 to
  * have the same units to allow simple arithmentic with both QPC and GTC.
  */
@@ -156,8 +156,41 @@ static CRITICAL_SECTION sTimeStampLock;
 // Kept in [mt]
 static ULONGLONG sFaultIntoleranceCheckpoint = 0;
 
+// Used only when GetTickCount64 is not available on the platform.
+// Last result of GetTickCount call.
+//
+// Kept in [ms]
+static DWORD sLastGTCResult = 0;
+
+// Higher part of the 64-bit value of MozGetTickCount64,
+// incremented atomically.
+static DWORD sLastGTCRollover = 0;
+
 namespace mozilla {
 
+typedef ULONGLONG (WINAPI* GetTickCount64_t)();
+static GetTickCount64_t sGetTickCount64 = nullptr;
+
+// Function protecting GetTickCount result from rolling over,
+// result is in [ms]
+static ULONGLONG WINAPI
+MozGetTickCount64()
+{
+  DWORD GTC = ::GetTickCount();
+
+  // Cheaper then CMPXCHG8B
+  AutoCriticalSection lock(&sTimeStampLock);
+
+  // Pull the rollover counter forward only if new value of GTC goes way
+  // down under the last saved result
+  if ((sLastGTCResult > GTC) && ((sLastGTCResult - GTC) > (1UL << 30))) {
+    ++sLastGTCRollover;
+  }
+
+  sLastGTCResult = GTC;
+  return ULONGLONG(sLastGTCRollover) << 32 | sLastGTCResult;
+}
+
 // Result is in [mt]
 static inline ULONGLONG
 PerformanceCounter()
@@ -322,7 +355,7 @@ TimeStampValue::CheckQPC(const TimeStampValue& aOther) const
   if (duration < sHardFailureLimit) {
     // Interval between the two time stamps is very short, consider
     // QPC as unstable and record a failure.
-    uint64_t now = ms2mt(GetTickCount64());
+    uint64_t now = ms2mt(sGetTickCount64());
 
     AutoCriticalSection lock(&sTimeStampLock);
 
@@ -452,6 +485,17 @@ TimeStamp::Startup()
 
   gInitialized = true;
 
+  // Decide which implementation to use for the high-performance timer.
+
+  HMODULE kernelDLL = GetModuleHandleW(L"kernel32.dll");
+  sGetTickCount64 = reinterpret_cast<GetTickCount64_t>(
+    GetProcAddress(kernelDLL, "GetTickCount64"));
+  if (!sGetTickCount64) {
+    // If the platform does not support the GetTickCount64 (Windows XP doesn't),
+    // then use our fallback implementation based on GetTickCount.
+    sGetTickCount64 = MozGetTickCount64;
+  }
+
   InitializeCriticalSectionAndSpinCount(&sTimeStampLock, kLockSpinCount);
 
   sHasStableTSC = HasStableTSC();
@@ -460,10 +504,10 @@ TimeStamp::Startup()
   LARGE_INTEGER freq;
   sUseQPC = ::QueryPerformanceFrequency(&freq);
   if (!sUseQPC) {
-    // No Performance Counter.  Fall back to use GetTickCount64.
+    // No Performance Counter.  Fall back to use GetTickCount.
     InitResolution();
 
-    LOG(("TimeStamp: using GetTickCount64"));
+    LOG(("TimeStamp: using GetTickCount"));
     return;
   }
 
@@ -490,7 +534,7 @@ TimeStamp::Now(bool aHighResolution)
 
   // Both values are in [mt] units.
   ULONGLONG QPC = useQPC ? PerformanceCounter() : uint64_t(0);
-  ULONGLONG GTC = ms2mt(GetTickCount64());
+  ULONGLONG GTC = ms2mt(sGetTickCount64());
   return TimeStamp(TimeStampValue(GTC, QPC, useQPC));
 }
 
diff --git a/netwerk/base/nsSocketTransport2.cpp b/netwerk/base/nsSocketTransport2.cpp
index 184757d33..1bfd1fc91 100644
--- a/netwerk/base/nsSocketTransport2.cpp
+++ b/netwerk/base/nsSocketTransport2.cpp
@@ -40,6 +40,7 @@
 #include "xpcpublic.h"
 
 #if defined(XP_WIN)
+#include "mozilla/WindowsVersion.h"
 #include "ShutdownLayer.h"
 #endif
 
@@ -1723,6 +1724,21 @@ nsSocketTransport::OnSocketConnected()
         NS_ASSERTION(mFDref == 1, "wrong socket ref count");
         SetSocketName(mFD);
         mFDconnected = true;
+
+#ifdef XP_WIN
+        if (!IsWin2003OrLater()) { // windows xp
+            PRSocketOptionData opt;
+            opt.option = PR_SockOpt_RecvBufferSize;
+            if (PR_GetSocketOption(mFD, &opt) == PR_SUCCESS) {
+                SOCKET_LOG(("%p checking rwin on xp originally=%u\n",
+                            this, opt.value.recv_buffer_size));
+                if (opt.value.recv_buffer_size < 65535) {
+                    opt.value.recv_buffer_size = 65535;
+                    PR_SetSocketOption(mFD, &opt);
+                }
+            }
+        }
+#endif
     }
 
     // Ensure keepalive is configured correctly if previously enabled.
diff --git a/netwerk/base/nsSocketTransportService2.cpp b/netwerk/base/nsSocketTransportService2.cpp
index 068bf0eca..d2f20651e 100644
--- a/netwerk/base/nsSocketTransportService2.cpp
+++ b/netwerk/base/nsSocketTransportService2.cpp
@@ -28,6 +28,10 @@
 #include "nsIWidget.h"
 #include "mozilla/dom/FlyWebService.h"
 
+#if defined(XP_WIN)
+#include "mozilla/WindowsVersion.h"
+#endif
+
 namespace mozilla {
 namespace net {
 
@@ -1200,7 +1204,12 @@ nsSocketTransportService::UpdateSendBufferPref(nsIPrefBranch *pref)
     }
 
 #if defined(XP_WIN)
-    mSendBufferSize = 131072 * 4;
+    // If the pref is not set but this is windows set it depending on windows version
+    if (!IsWin2003OrLater()) { // windows xp
+        mSendBufferSize = 131072;
+    } else { // vista or later
+        mSendBufferSize = 131072 * 4;
+    }
 #endif
 }
 
diff --git a/netwerk/base/security-prefs.js b/netwerk/base/security-prefs.js
index 5351d7c04..cfbbf4a45 100644
--- a/netwerk/base/security-prefs.js
+++ b/netwerk/base/security-prefs.js
@@ -3,7 +3,7 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 pref("security.tls.version.min", 1);
-pref("security.tls.version.max", 3);
+pref("security.tls.version.max", 4);
 pref("security.tls.version.fallback-limit", 3);
 pref("security.tls.insecure_fallback_hosts", "");
 pref("security.tls.unrestricted_rc4_fallback", false);
diff --git a/netwerk/test/TestUDPSocket.cpp b/netwerk/test/TestUDPSocket.cpp
index 0ec43a650..9236d2ea3 100644
--- a/netwerk/test/TestUDPSocket.cpp
+++ b/netwerk/test/TestUDPSocket.cpp
@@ -13,6 +13,9 @@
 #include "nsIScriptSecurityManager.h"
 #include "nsITimer.h"
 #include "mozilla/net/DNS.h"
+#ifdef XP_WIN
+#include "mozilla/WindowsVersion.h"
+#endif
 #include "prerror.h"
 
 #define REQUEST  0x68656c6f
@@ -331,6 +334,16 @@ main(int32_t argc, char *argv[])
   }
   RefPtr<MulticastTimerCallback> timerCb = new MulticastTimerCallback();
 
+  // The following multicast tests using multiple sockets require a firewall
+  // exception on Windows XP (the earliest version of Windows we now support)
+  // before they pass. For now, we'll skip them here. Later versions of Windows
+  // (Win2003 and onward) don't seem to have this issue.
+#ifdef XP_WIN
+  if (!mozilla::IsWin2003OrLater()) {   // i.e. if it is WinXP
+    goto close;
+  }
+#endif
+
   // Join multicast group
   printf("Joining multicast group\n");
   phase = TEST_MULTICAST;
diff --git a/netwerk/wifi/moz.build b/netwerk/wifi/moz.build
index 28149cb78..c60939e7b 100644
--- a/netwerk/wifi/moz.build
+++ b/netwerk/wifi/moz.build
@@ -40,6 +40,7 @@ elif CONFIG['OS_ARCH'] == 'WINNT':
         'nsWifiScannerWin.cpp',
         'win_wifiScanner.cpp',
         'win_wlanLibrary.cpp',
+        'win_xp_wifiScanner.cpp'
     ]
 elif CONFIG['OS_ARCH'] == 'SunOS':
     CXXFLAGS += CONFIG['GLIB_CFLAGS']
diff --git a/netwerk/wifi/nsWifiMonitor.h b/netwerk/wifi/nsWifiMonitor.h
index c44f6804b..ddf420f6f 100644
--- a/netwerk/wifi/nsWifiMonitor.h
+++ b/netwerk/wifi/nsWifiMonitor.h
@@ -75,7 +75,7 @@ class nsWifiMonitor final : nsIRunnable, nsIWifiMonitor, nsIObserver
   mozilla::ReentrantMonitor mReentrantMonitor;
 
 #ifdef XP_WIN
-  nsAutoPtr<WinWifiScanner> mWinWifiScanner;
+  nsAutoPtr<WindowsWifiScannerInterface> mWinWifiScanner;
 #endif
 };
 
diff --git a/netwerk/wifi/nsWifiScannerWin.cpp b/netwerk/wifi/nsWifiScannerWin.cpp
index 6089c45c6..ef18706e4 100644
--- a/netwerk/wifi/nsWifiScannerWin.cpp
+++ b/netwerk/wifi/nsWifiScannerWin.cpp
@@ -12,6 +12,8 @@
 #include "nsServiceManagerUtils.h"
 #include "nsWifiAccessPoint.h"
 #include "win_wifiScanner.h"
+#include "win_xp_wifiScanner.h"
+#include "mozilla/WindowsVersion.h"
 
 using namespace mozilla;
 
@@ -29,7 +31,14 @@ nsresult
 nsWifiMonitor::DoScan()
 {
     if (!mWinWifiScanner) {
-      mWinWifiScanner = new WinWifiScanner();
+      if (IsWin2003OrLater()) {
+        mWinWifiScanner = new WinWifiScanner();
+        LOG(("Using Windows 2003+ wifi scanner."));
+      } else {
+        mWinWifiScanner = new WinXPWifiScanner();
+        LOG(("Using Windows XP wifi scanner."));
+      }
+
       if (!mWinWifiScanner) {
         // TODO: Probably return OOM error
         return NS_ERROR_FAILURE;
diff --git a/netwerk/wifi/win_wifiScanner.h b/netwerk/wifi/win_wifiScanner.h
index 79b1bf132..b43c23899 100644
--- a/netwerk/wifi/win_wifiScanner.h
+++ b/netwerk/wifi/win_wifiScanner.h
@@ -11,10 +11,19 @@
 
 class nsWifiAccessPoint;
 
-class WinWifiScanner final {
+// This class allows the wifi monitor to use WinWifiScanner and WinXPWifiScanner interchangeably.
+class WindowsWifiScannerInterface {
+public:
+  virtual ~WindowsWifiScannerInterface() {}
+
+  virtual nsresult GetAccessPointsFromWLAN(nsCOMArray<nsWifiAccessPoint> &accessPoints) = 0;
+};
+
+
+class WinWifiScanner : public WindowsWifiScannerInterface {
  public:
   WinWifiScanner();
-  ~WinWifiScanner();
+  virtual ~WinWifiScanner();
 
   /**
    * GetAccessPointsFromWLAN
diff --git a/netwerk/wifi/win_xp_wifiScanner.cpp b/netwerk/wifi/win_xp_wifiScanner.cpp
new file mode 100644
index 000000000..4dcd34034
--- /dev/null
+++ b/netwerk/wifi/win_xp_wifiScanner.cpp
@@ -0,0 +1,399 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Windows Vista uses the Native Wifi (WLAN) API for accessing WiFi cards. See
+// http://msdn.microsoft.com/en-us/library/ms705945(VS.85).aspx. Windows XP
+// Service Pack 3 (and Windows XP Service Pack 2, if upgraded with a hot fix)
+// also support a limited version of the WLAN API. See
+// http://msdn.microsoft.com/en-us/library/bb204766.aspx. The WLAN API uses
+// wlanapi.h, which is not part of the SDK used by Gears, so is replicated
+// locally using data from the MSDN.
+//\
+// Windows XP from Service Pack 2 onwards supports the Wireless Zero
+// Configuration (WZC) programming interface. See
+// http://msdn.microsoft.com/en-us/library/ms706587(VS.85).aspx.
+//
+// The MSDN recommends that one use the WLAN API where available, and WZC
+// otherwise.
+//
+// However, it seems that WZC fails for some wireless cards. Also, WLAN seems
+// not to work on XP SP3. So we use WLAN on Vista, and use NDIS directly
+// otherwise.
+
+// MOZILLA NOTE:
+// This code is ported from chromium:
+// https://chromium.googlesource.com/chromium/src/+/master/content/browser/geolocation/wifi_data_provider_win.cc
+// Based on changeset 42c5878
+
+#include "win_xp_wifiScanner.h"
+#include "nsWifiAccessPoint.h"
+#include <windows.h>
+#include <winioctl.h>
+#include <wlanapi.h>
+#include <string>
+#include <vector>
+
+// Taken from ndis.h for WinCE.
+#define NDIS_STATUS_INVALID_LENGTH   ((NDIS_STATUS)0xC0010014L)
+#define NDIS_STATUS_BUFFER_TOO_SHORT ((NDIS_STATUS)0xC0010016L)
+
+namespace {
+// The limits on the size of the buffer used for the OID query.
+const int kInitialBufferSize = 2 << 12;  // Good for about 50 APs.
+const int kMaximumBufferSize = 2 << 20;  // 2MB
+
+// Length for generic string buffers passed to Win32 APIs.
+const int kStringLength = 512;
+
+// WlanOpenHandle
+typedef DWORD (WINAPI* WlanOpenHandleFunction)(DWORD dwClientVersion,
+                                               PVOID pReserved,
+                                               PDWORD pdwNegotiatedVersion,
+                                               PHANDLE phClientHandle);
+
+// WlanEnumInterfaces
+typedef DWORD (WINAPI* WlanEnumInterfacesFunction)(
+    HANDLE hClientHandle,
+    PVOID pReserved,
+    PWLAN_INTERFACE_INFO_LIST* ppInterfaceList);
+
+// WlanGetNetworkBssList
+typedef DWORD (WINAPI* WlanGetNetworkBssListFunction)(
+    HANDLE hClientHandle,
+    const GUID* pInterfaceGuid,
+    const  PDOT11_SSID pDot11Ssid,
+    DOT11_BSS_TYPE dot11BssType,
+    BOOL bSecurityEnabled,
+    PVOID pReserved,
+    PWLAN_BSS_LIST* ppWlanBssList
+);
+
+// WlanFreeMemory
+typedef VOID (WINAPI* WlanFreeMemoryFunction)(PVOID pMemory);
+
+// WlanCloseHandle
+typedef DWORD (WINAPI* WlanCloseHandleFunction)(HANDLE hClientHandle,
+                                                PVOID pReserved);
+
+// Extracts data for an access point and converts to Gears format.
+bool UndefineDosDevice(const std::string& device_name);
+bool DefineDosDeviceIfNotExists(const std::string& device_name);
+HANDLE GetFileHandle(const std::string& device_name);
+// Makes the OID query and returns a Win32 error code.
+int PerformQuery(HANDLE adapter_handle, std::vector<char>& buffer, DWORD* bytes_out);
+bool ResizeBuffer(size_t requested_size, std::vector<char>& buffer);
+// Gets the system directory and appends a trailing slash if not already
+// present.
+bool GetSystemDirectory(std::string* path);
+
+bool ConvertToAccessPointData(const NDIS_WLAN_BSSID& data, nsWifiAccessPoint* access_point_data);
+int GetDataFromBssIdList(const NDIS_802_11_BSSID_LIST& bss_id_list,
+                         int list_size,
+                         nsCOMArray<nsWifiAccessPoint>& outData);
+} // namespace
+
+class WindowsNdisApi
+{
+public:
+  virtual ~WindowsNdisApi();
+  static WindowsNdisApi* Create();
+  virtual bool GetAccessPointData(nsCOMArray<nsWifiAccessPoint>& outData);
+
+private:
+  static bool GetInterfacesNDIS(std::vector<std::string>& interface_service_names_out);
+  // Swaps in content of the vector passed
+  explicit WindowsNdisApi(std::vector<std::string>* interface_service_names);
+  bool GetInterfaceDataNDIS(HANDLE adapter_handle, nsCOMArray<nsWifiAccessPoint>& outData);
+  // NDIS variables.
+  std::vector<std::string> interface_service_names_;
+  std::vector<char> _buffer;
+};
+
+// WindowsNdisApi
+WindowsNdisApi::WindowsNdisApi(
+    std::vector<std::string>* interface_service_names)
+    : _buffer(kInitialBufferSize) {
+  interface_service_names_.swap(*interface_service_names);
+}
+
+WindowsNdisApi::~WindowsNdisApi() {
+}
+
+WindowsNdisApi* WindowsNdisApi::Create() {
+  std::vector<std::string> interface_service_names;
+  if (GetInterfacesNDIS(interface_service_names)) {
+    return new WindowsNdisApi(&interface_service_names);
+  }
+  return NULL;
+}
+
+bool WindowsNdisApi::GetAccessPointData(nsCOMArray<nsWifiAccessPoint>& outData) {
+  int interfaces_failed = 0;
+  int interfaces_succeeded = 0;
+
+  for (int i = 0; i < static_cast<int>(interface_service_names_.size()); ++i) {
+    // First, check that we have a DOS device for this adapter.
+    if (!DefineDosDeviceIfNotExists(interface_service_names_[i])) {
+      continue;
+    }
+
+    // Get the handle to the device. This will fail if the named device is not
+    // valid.
+    HANDLE adapter_handle = GetFileHandle(interface_service_names_[i]);
+    if (adapter_handle == INVALID_HANDLE_VALUE) {
+      continue;
+    }
+
+    // Get the data.
+    if (GetInterfaceDataNDIS(adapter_handle, outData)) {
+      ++interfaces_succeeded;
+    } else {
+      ++interfaces_failed;
+    }
+
+    // Clean up.
+    CloseHandle(adapter_handle);
+    UndefineDosDevice(interface_service_names_[i]);
+  }
+
+  // Return true if at least one interface succeeded, or at the very least none
+  // failed.
+  return interfaces_succeeded > 0 || interfaces_failed == 0;
+}
+
+bool WindowsNdisApi::GetInterfacesNDIS(std::vector<std::string>& interface_service_names_out) {
+  HKEY network_cards_key = NULL;
+  if (RegOpenKeyEx(
+      HKEY_LOCAL_MACHINE,
+      "Software\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards",
+      0,
+      KEY_READ,
+      &network_cards_key) != ERROR_SUCCESS) {
+    return false;
+  }
+  if (!network_cards_key) {
+    return false;
+  }
+
+  for (int i = 0; ; ++i) {
+    TCHAR name[kStringLength];
+    DWORD name_size = kStringLength;
+    FILETIME time;
+    if (RegEnumKeyEx(network_cards_key,
+                     i,
+                     name,
+                     &name_size,
+                     NULL,
+                     NULL,
+                     NULL,
+                     &time) != ERROR_SUCCESS) {
+      break;
+    }
+    HKEY hardware_key = NULL;
+    if (RegOpenKeyEx(network_cards_key, name, 0, KEY_READ, &hardware_key) !=
+        ERROR_SUCCESS) {
+      break;
+    }
+    if (!hardware_key) {
+      return false;
+    }
+
+    TCHAR service_name[kStringLength];
+    DWORD service_name_size = kStringLength;
+    DWORD type = 0;
+    if (RegQueryValueEx(hardware_key,
+                        "ServiceName",
+                        NULL,
+                        &type,
+                        reinterpret_cast<LPBYTE>(service_name),
+                        &service_name_size) == ERROR_SUCCESS) {
+      interface_service_names_out.push_back(service_name);
+    }
+    RegCloseKey(hardware_key);
+  }
+
+  RegCloseKey(network_cards_key);
+  return true;
+}
+
+bool WindowsNdisApi::GetInterfaceDataNDIS(HANDLE adapter_handle,
+                                          nsCOMArray<nsWifiAccessPoint>& outData) {
+  DWORD bytes_out;
+  int result;
+
+  while (true) {
+    bytes_out = 0;
+    result = PerformQuery(adapter_handle, _buffer, &bytes_out);
+    if (result == ERROR_GEN_FAILURE ||  // Returned by some Intel cards.
+        result == ERROR_INSUFFICIENT_BUFFER ||
+        result == ERROR_MORE_DATA ||
+        result == NDIS_STATUS_INVALID_LENGTH ||
+        result == NDIS_STATUS_BUFFER_TOO_SHORT) {
+      // The buffer we supplied is too small, so increase it. bytes_out should
+      // provide the required buffer size, but this is not always the case.
+      size_t newSize;
+      if (bytes_out > static_cast<DWORD>(_buffer.size())) {
+        newSize = bytes_out;
+      } else {
+        newSize = _buffer.size() * 2;
+      }
+      if (!ResizeBuffer(newSize, _buffer)) {
+        return false;
+      }
+    } else {
+      // The buffer is not too small.
+      break;
+    }
+  }
+
+  if (result == ERROR_SUCCESS) {
+    NDIS_802_11_BSSID_LIST* bssid_list =
+        reinterpret_cast<NDIS_802_11_BSSID_LIST*>(&_buffer[0]);
+    GetDataFromBssIdList(*bssid_list, _buffer.size(), outData);
+  }
+
+  return true;
+}
+
+namespace {
+#define uint8 unsigned char
+
+bool ConvertToAccessPointData(const NDIS_WLAN_BSSID& data, nsWifiAccessPoint* access_point_data)
+{
+  access_point_data->setMac(data.MacAddress);
+  access_point_data->setSignal(data.Rssi);
+  // Note that _NDIS_802_11_SSID::Ssid::Ssid is not null-terminated.
+  const unsigned char* ssid = data.Ssid.Ssid;
+  size_t len = data.Ssid.SsidLength;
+  access_point_data->setSSID(reinterpret_cast<const char*>(ssid), len);
+  return true;
+}
+
+int GetDataFromBssIdList(const NDIS_802_11_BSSID_LIST& bss_id_list,
+                         int list_size,
+                         nsCOMArray<nsWifiAccessPoint>& outData)
+{
+  // Walk through the BSS IDs.
+  int found = 0;
+  const uint8* iterator = reinterpret_cast<const uint8*>(&bss_id_list.Bssid[0]);
+  const uint8* end_of_buffer =
+      reinterpret_cast<const uint8*>(&bss_id_list) + list_size;
+  for (int i = 0; i < static_cast<int>(bss_id_list.NumberOfItems); ++i) {
+    const NDIS_WLAN_BSSID *bss_id =
+        reinterpret_cast<const NDIS_WLAN_BSSID*>(iterator);
+    // Check that the length of this BSS ID is reasonable.
+    if (bss_id->Length < sizeof(NDIS_WLAN_BSSID) ||
+        iterator + bss_id->Length > end_of_buffer) {
+      break;
+    }
+    nsWifiAccessPoint* ap = new nsWifiAccessPoint();
+    if (ConvertToAccessPointData(*bss_id, ap)) {
+      outData.AppendObject(ap);
+      ++found;
+    }
+    // Move to the next BSS ID.
+    iterator += bss_id->Length;
+  }
+  return found;
+}
+
+
+bool UndefineDosDevice(const std::string& device_name) {
+  // We remove only the mapping we use, that is \Device\<device_name>.
+  std::string target_path = "\\Device\\" + device_name;
+  return DefineDosDevice(
+      DDD_RAW_TARGET_PATH | DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE,
+      device_name.c_str(),
+      target_path.c_str()) == TRUE;
+}
+
+bool DefineDosDeviceIfNotExists(const std::string& device_name) {
+  // We create a DOS device name for the device at \Device\<device_name>.
+  std::string target_path = "\\Device\\" + device_name;
+
+  TCHAR target[kStringLength];
+  if (QueryDosDevice(device_name.c_str(), target, kStringLength) > 0 &&
+      target_path.compare(target) == 0) {
+    // Device already exists.
+    return true;
+  }
+
+  if (GetLastError() != ERROR_FILE_NOT_FOUND) {
+    return false;
+  }
+
+  if (!DefineDosDevice(DDD_RAW_TARGET_PATH,
+                       device_name.c_str(),
+                       target_path.c_str())) {
+    return false;
+  }
+
+  // Check that the device is really there.
+  return QueryDosDevice(device_name.c_str(), target, kStringLength) > 0 &&
+      target_path.compare(target) == 0;
+}
+
+HANDLE GetFileHandle(const std::string& device_name) {
+  // We access a device with DOS path \Device\<device_name> at
+  // \\.\<device_name>.
+  std::string formatted_device_name = "\\\\.\\" + device_name;
+
+  return CreateFile(formatted_device_name.c_str(),
+                    GENERIC_READ,
+                    FILE_SHARE_READ | FILE_SHARE_WRITE,  // share mode
+                    0,  // security attributes
+                    OPEN_EXISTING,
+                    0,  // flags and attributes
+                    INVALID_HANDLE_VALUE);
+}
+
+int PerformQuery(HANDLE adapter_handle,
+                 std::vector<char>& buffer,
+                 DWORD* bytes_out) {
+  DWORD oid = OID_802_11_BSSID_LIST;
+  if (!DeviceIoControl(adapter_handle,
+                       IOCTL_NDIS_QUERY_GLOBAL_STATS,
+                       &oid,
+                       sizeof(oid),
+                       &buffer[0],
+                       buffer.size(),
+                       bytes_out,
+                       NULL)) {
+    return GetLastError();
+  }
+  return ERROR_SUCCESS;
+}
+
+bool ResizeBuffer(size_t requested_size, std::vector<char>& buffer) {
+  if (requested_size > kMaximumBufferSize) {
+    buffer.resize(kInitialBufferSize);
+    return false;
+  }
+
+  buffer.resize(requested_size);
+  return true;
+}
+
+} // namespace
+
+
+nsresult
+WinXPWifiScanner::GetAccessPointsFromWLAN(nsCOMArray<nsWifiAccessPoint> &accessPoints)
+{
+  if (!mImplementation) {
+    mImplementation = WindowsNdisApi::Create();
+    if (!mImplementation) {
+      return NS_ERROR_FAILURE;
+    }
+  }
+
+  accessPoints.Clear();
+  bool isOk = mImplementation->GetAccessPointData(accessPoints);
+  if (!isOk) {
+    mImplementation = 0;
+    return NS_ERROR_FAILURE;
+  }
+
+  return NS_OK;
+}
diff --git a/netwerk/wifi/win_xp_wifiScanner.h b/netwerk/wifi/win_xp_wifiScanner.h
new file mode 100644
index 000000000..33ae4cae4
--- /dev/null
+++ b/netwerk/wifi/win_xp_wifiScanner.h
@@ -0,0 +1,25 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef WINXPWIFISCANNER_H_
+#define WINXPWIFISCANNER_H_
+
+#include "nsAutoPtr.h"
+#include "nsCOMArray.h"
+#include "win_wifiScanner.h"
+
+class nsWifiAccessPoint;
+class WindowsNdisApi;
+
+// This class is wrapper into the Chromium WindowNdisApi class for scanning wifis
+// on Windows XP. When Firefox drops XP support, this code can go.
+class WinXPWifiScanner : public WindowsWifiScannerInterface {
+public:
+  nsresult GetAccessPointsFromWLAN(nsCOMArray<nsWifiAccessPoint> &accessPoints);
+  virtual ~WinXPWifiScanner() {}
+private:
+  nsAutoPtr<WindowsNdisApi> mImplementation;
+};
+
+#endif
\ No newline at end of file
diff --git a/old-configure.in b/old-configure.in
index 120abdf8a..c7f98fefc 100644
--- a/old-configure.in
+++ b/old-configure.in
@@ -161,7 +161,7 @@ dnl ========================================================
 dnl Special win32 checks
 dnl ========================================================
 
-WINVER=601
+WINVER=502
 
 case "$target" in
 *-mingw*)
@@ -946,7 +946,12 @@ case "$target" in
         IMPORT_LIB_SUFFIX=lib
         MKSHLIB='$(LD) -NOLOGO -DLL -OUT:$@ -PDB:$(LINK_PDBFILE) $(DSO_LDOPTS)'
         MKCSHLIB='$(LD) -NOLOGO -DLL -OUT:$@ -PDB:$(LINK_PDBFILE) $(DSO_LDOPTS)'
-        WIN32_SUBSYSTEM_VERSION=6.01
+        dnl Set subsystem version 5 for Windows XP.
+        if test "$CPU_ARCH" = "x86"; then
+            WIN32_SUBSYSTEM_VERSION=5.01
+        else
+            WIN32_SUBSYSTEM_VERSION=5.02
+        fi
         WIN32_CONSOLE_EXE_LDFLAGS=-SUBSYSTEM:CONSOLE,$WIN32_SUBSYSTEM_VERSION
         WIN32_GUI_EXE_LDFLAGS=-SUBSYSTEM:WINDOWS,$WIN32_SUBSYSTEM_VERSION
         DSO_LDOPTS=-SUBSYSTEM:WINDOWS,$WIN32_SUBSYSTEM_VERSION
@@ -2044,7 +2049,7 @@ MOZ_ARG_WITH_BOOL(system-nss,
     _USE_SYSTEM_NSS=1 )
 
 if test -n "$_USE_SYSTEM_NSS"; then
-    AM_PATH_NSS(3.28.6, [MOZ_SYSTEM_NSS=1], [AC_MSG_ERROR([you don't have NSS installed or your version is too old])])
+    AM_PATH_NSS(3.35, [MOZ_SYSTEM_NSS=1], [AC_MSG_ERROR([you don't have NSS installed or your version is too old])])
 fi
 
 if test -z "$MOZ_SYSTEM_NSS"; then
@@ -3248,6 +3253,9 @@ MOZ_D3D_CPU_SUFFIX=
 MOZ_HAS_WINSDK_WITH_D3D=
 MOZ_D3DCOMPILER_VISTA_DLL=
 MOZ_D3DCOMPILER_VISTA_DLL_PATH=
+MOZ_DIRECTX_SDK_PATH=
+MOZ_D3DCOMPILER_XP_DLL=
+MOZ_D3DCOMPILER_XP_CAB=
 
 if test "$COMPILE_ENVIRONMENT" ; then
 case "$target_os" in
@@ -3266,6 +3274,11 @@ x86_64)
   ;;
 esac
 
+MOZ_ARG_ENABLE_BOOL(require-all-d3dc-versions,
+[  --enable-require-all-d3dc-versions Require all versions of the D3D compiler needed for supported Windows systems.],
+    MOZ_REQUIRE_ALL_D3DCS=1,
+    MOZ_REQUIRE_ALL_D3DCS=)
+
 # This is potentially set in external mozconfig files; if it's set,
 # then the build exposes the "webgl" context name, which is reserved
 # for conformant implementations.
@@ -3323,19 +3336,89 @@ if test -n "$MOZ_ANGLE_RENDERER"; then
     MOZ_CHECK_HEADER(d3d10.h, MOZ_HAS_WINSDK_WITH_D3D=1)
   fi
 
+  ######################################
+  # Find _43 for use by XP.
+
+  if test "$HAVE_64BIT_BUILD"; then
+    AC_MSG_RESULT([We are building a 64-bit binary, skip checking d3dcompiler_43.])
+  else
+    # Get the SDK path from the registry.
+    # First try to get the June 2010 SDK
+    MOZ_DIRECTX_SDK_REG_KEY=`reg query 'HKLM\Software\Microsoft\DirectX' //s | grep 'Microsoft DirectX SDK (June 2010)' | head -n 1`
+    if test -z "$MOZ_DIRECTX_SDK_REG_KEY" ; then
+      # Otherwise just take whatever comes first
+      MOZ_DIRECTX_SDK_REG_KEY=`reg query 'HKLM\Software\Microsoft\DirectX' //s | grep 'Microsoft DirectX SDK' | head -n 1`
+    fi
+    MOZ_DIRECTX_SDK_PATH=`reg query "$MOZ_DIRECTX_SDK_REG_KEY" //v InstallPath | grep REG_SZ | sed 's/.*\([[a-zA-Z]]\)\\:\\\\/\\1\\:\\\\/' | sed 's,\\\\,/,g'`
+
+    if test -n "$MOZ_DIRECTX_SDK_PATH" &&
+       test -f "$MOZ_DIRECTX_SDK_PATH"/lib/$MOZ_D3D_CPU_SUFFIX/dxguid.lib ; then
+      AC_MSG_RESULT([Found DirectX SDK via registry, using $MOZ_DIRECTX_SDK_PATH])
+    else
+      AC_MSG_RESULT([DirectX SDK not found.])
+      MOZ_DIRECTX_SDK_PATH=
+    fi
+
+    # Check that our DirectX SDK is acceptable.
+    if test -n "$MOZ_DIRECTX_SDK_PATH"; then
+      if test -n "`echo $MOZ_DIRECTX_SDK_REG_KEY | grep 'February 2010'`" ; then
+        AC_MSG_RESULT([Found the February 2010 DirectX SDK, which is unacceptable to ANGLE.])
+        MOZ_DIRECTX_SDK_PATH=
+      fi
+    fi
+
+    if test -n "$MOZ_DIRECTX_SDK_PATH"; then
+      # Find a D3D compiler DLL in the DirectX SDK, if we didn't find one already.
+      # Get the SDK numeric version (e.g. 43) by looking at the dependencies of d3dx9.lib
+      MOZ_D3DX9_VERSION=`dumpbin //headers "$MOZ_DIRECTX_SDK_PATH"/lib/$MOZ_D3D_CPU_SUFFIX/d3dx9.lib | egrep d3dx9_[[0-9]][[0-9]]\.dll | head -n1 | sed 's/.*\([[0-9]][[0-9]]\).*/\\1/g'`
+
+      if test -n "$MOZ_D3DX9_VERSION" ; then
+        MOZ_D3DCOMPILER_XP_CAB=`find "$MOZ_DIRECTX_SDK_PATH"/Redist -name *D3DCompiler_${MOZ_D3DX9_VERSION}_${MOZ_D3D_CPU_SUFFIX}.cab | head -n1`
+
+        if test -n "$MOZ_D3DCOMPILER_XP_CAB"; then
+          MOZ_D3DCOMPILER_XP_DLL=D3DCompiler_$MOZ_D3DX9_VERSION.dll
+        else
+          AC_MSG_RESULT([Couldn't find a CAB containing the D3D compiler DLL.])
+          AC_MSG_ERROR([DirectX SDK at "$MOZ_DIRECTX_SDK_PATH" appears broken.])
+          MOZ_DIRECTX_SDK_PATH=
+        fi
+      else
+        AC_MSG_RESULT([Couldn't determine the D3DX9 version for the DirectX SDK.])
+        MOZ_DIRECTX_SDK_PATH=
+      fi
+    else
+      AC_MSG_RESULT([Couldn't find an acceptable DirectX SDK for ANGLE, needed for d3dcompiler_43.])
+    fi
+  fi
+
   ######################################
   # Check that we found what we needed.
   MOZ_FOUND_A_D3D_COMPILER=
+  MOZ_FOUND_BOTH_D3D_COMPILERS=1
 
   if test -n "$MOZ_D3DCOMPILER_VISTA_DLL"; then
     MOZ_FOUND_A_D3D_COMPILER=1
     AC_MSG_RESULT([Found d3dcompiler DLL for Vista+: $MOZ_D3DCOMPILER_VISTA_DLL])
+  else
+    MOZ_FOUND_BOTH_D3D_COMPILERS=
+  fi
+
+  if test -n "$MOZ_D3DCOMPILER_XP_DLL"; then
+    MOZ_FOUND_A_D3D_COMPILER=1
+    AC_MSG_RESULT([Found d3dcompiler DLL for XP: $MOZ_D3DCOMPILER_XP_DLL])
+  else
+    MOZ_FOUND_BOTH_D3D_COMPILERS=
   fi
 
   if test -z "$CROSS_COMPILE"; then
     if test -z "MOZ_FOUND_A_D3D_COMPILER"; then
       AC_MSG_ERROR([Couldn't find an acceptable D3D compiler DLL.])
     fi
+
+    if test -n "$MOZ_REQUIRE_ALL_D3DCS" -a -z "$MOZ_FOUND_BOTH_D3D_COMPILERS"; then
+      AC_MSG_ERROR([Both D3D compilers _43 and _46+ are required by --enable-require-d3d-compilers.])
+      AC_MSG_ERROR([  Install Windows SDK 8.0+, as well as DirectX SDK (June 2010 version or newer), or reconfigure without this flag.])
+    fi
   fi
 fi # MOZ_ANGLE_RENDERER
 
@@ -5117,6 +5200,9 @@ AC_SUBST(MOZ_D3D_CPU_SUFFIX)
 AC_SUBST(MOZ_HAS_WINSDK_WITH_D3D)
 AC_SUBST(MOZ_D3DCOMPILER_VISTA_DLL)
 AC_SUBST(MOZ_D3DCOMPILER_VISTA_DLL_PATH)
+AC_SUBST(MOZ_DIRECTX_SDK_PATH)
+AC_SUBST(MOZ_D3DCOMPILER_XP_DLL)
+AC_SUBST(MOZ_D3DCOMPILER_XP_CAB)
 
 AC_SUBST(MOZ_ANDROID_APPLICATION_CLASS)
 AC_SUBST(MOZ_ANDROID_BROWSER_INTENT_CLASS)
diff --git a/toolkit/components/alerts/nsAlertsService.cpp b/toolkit/components/alerts/nsAlertsService.cpp
index dd67ad983..35418dd17 100644
--- a/toolkit/components/alerts/nsAlertsService.cpp
+++ b/toolkit/components/alerts/nsAlertsService.cpp
@@ -22,10 +22,6 @@
 #include "nsIFaviconService.h"
 #endif // MOZ_PLACES
 
-#ifdef XP_WIN
-#include <shellapi.h>
-#endif
-
 using namespace mozilla;
 
 using mozilla::dom::ContentChild;
@@ -158,12 +154,23 @@ bool nsAlertsService::ShouldShowAlert()
   bool result = true;
 
 #ifdef XP_WIN
-  QUERY_USER_NOTIFICATION_STATE qstate;
-  if (SUCCEEDED(SHQueryUserNotificationState(&qstate))) {
-    if (qstate != QUNS_ACCEPTS_NOTIFICATIONS) {
-       result = false;
+  HMODULE shellDLL = ::LoadLibraryW(L"shell32.dll");
+  if (!shellDLL)
+    return result;
+
+  SHQueryUserNotificationStatePtr pSHQueryUserNotificationState =
+    (SHQueryUserNotificationStatePtr) ::GetProcAddress(shellDLL, "SHQueryUserNotificationState");
+
+  if (pSHQueryUserNotificationState) {
+    MOZ_QUERY_USER_NOTIFICATION_STATE qstate;
+    if (SUCCEEDED(pSHQueryUserNotificationState(&qstate))) {
+      if (qstate != QUNS_ACCEPTS_NOTIFICATIONS) {
+         result = false;
+      }
     }
   }
+
+  ::FreeLibrary(shellDLL);
 #endif
 
   return result;
diff --git a/toolkit/components/alerts/nsAlertsService.h b/toolkit/components/alerts/nsAlertsService.h
index d2b2e1e6c..3f23eaabf 100644
--- a/toolkit/components/alerts/nsAlertsService.h
+++ b/toolkit/components/alerts/nsAlertsService.h
@@ -10,6 +10,23 @@
 #include "nsCOMPtr.h"
 #include "nsXULAlerts.h"
 
+#ifdef XP_WIN
+typedef enum tagMOZ_QUERY_USER_NOTIFICATION_STATE {
+    QUNS_NOT_PRESENT = 1,
+    QUNS_BUSY = 2,
+    QUNS_RUNNING_D3D_FULL_SCREEN = 3,
+    QUNS_PRESENTATION_MODE = 4,
+    QUNS_ACCEPTS_NOTIFICATIONS = 5,
+    QUNS_QUIET_TIME = 6,
+    QUNS_IMMERSIVE = 7
+} MOZ_QUERY_USER_NOTIFICATION_STATE;
+
+extern "C" {
+// This function is Windows Vista or later
+typedef HRESULT (__stdcall *SHQueryUserNotificationStatePtr)(MOZ_QUERY_USER_NOTIFICATION_STATE *pquns);
+}
+#endif // defined(XP_WIN)
+
 class nsAlertsService : public nsIAlertsService,
                         public nsIAlertsDoNotDisturb
 {
diff --git a/toolkit/components/maintenanceservice/maintenanceservice.exe.manifest b/toolkit/components/maintenanceservice/maintenanceservice.exe.manifest
index e6bfba8ca..cb317c47d 100644
--- a/toolkit/components/maintenanceservice/maintenanceservice.exe.manifest
+++ b/toolkit/components/maintenanceservice/maintenanceservice.exe.manifest
@@ -20,6 +20,7 @@
       <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
       <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
       <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
+      <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
     </application>
   </compatibility>
 </assembly>
diff --git a/toolkit/crashreporter/client/crashreporter.exe.manifest b/toolkit/crashreporter/client/crashreporter.exe.manifest
index e6b2ceefb..f8587bfad 100644
--- a/toolkit/crashreporter/client/crashreporter.exe.manifest
+++ b/toolkit/crashreporter/client/crashreporter.exe.manifest
@@ -32,6 +32,7 @@
       <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
       <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
       <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
+      <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
     </application>
   </compatibility>
 </assembly>
diff --git a/toolkit/library/libxul.mk b/toolkit/library/libxul.mk
index 9e7e8beee..d918d9c84 100644
--- a/toolkit/library/libxul.mk
+++ b/toolkit/library/libxul.mk
@@ -16,6 +16,16 @@ EXTRA_DEPS += symverscript
 endif
 endif
 
+ifdef MOZ_WEBRTC
+ifeq (WINNT,$(OS_TARGET))
+ifndef MOZ_HAS_WINSDK_WITH_D3D
+OS_LDFLAGS += \
+  -LIBPATH:'$(MOZ_DIRECTX_SDK_PATH)/lib/$(MOZ_D3D_CPU_SUFFIX)' \
+  $(NULL)
+endif
+endif
+endif
+
 # Generate GDB pretty printer-autoload files only on Linux. OSX's GDB is
 # too old to support Python pretty-printers; if this changes, we could make
 # this 'ifdef GNU_CC'.
diff --git a/toolkit/mozapps/update/updater/updater.exe.comctl32.manifest b/toolkit/mozapps/update/updater/updater.exe.comctl32.manifest
index 6bb850199..9a6cdb565 100644
--- a/toolkit/mozapps/update/updater/updater.exe.comctl32.manifest
+++ b/toolkit/mozapps/update/updater/updater.exe.comctl32.manifest
@@ -32,6 +32,7 @@
       <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
       <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
       <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
+      <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
     </application>
   </compatibility>
 </assembly>
diff --git a/toolkit/mozapps/update/updater/updater.exe.manifest b/toolkit/mozapps/update/updater/updater.exe.manifest
index 619b4abfe..cd229c954 100644
--- a/toolkit/mozapps/update/updater/updater.exe.manifest
+++ b/toolkit/mozapps/update/updater/updater.exe.manifest
@@ -20,6 +20,7 @@
       <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
       <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
       <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
+      <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
     </application>
   </compatibility>
 </assembly>
diff --git a/toolkit/themes/windows/global/dirListing/folder-XP.png b/toolkit/themes/windows/global/dirListing/folder-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..27404ae387ca85a4b11dfe597d118c61bfa268e5
GIT binary patch
literal 398
zcmV;90df9`P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00041Nkl<ZcwVKG
zF-rq67>1vuX{8R=g0xV<p^Kv;{RIx{s9VL&rGLcPA7Ce^g5W5{{sI?4baZhL3w98}
zw%6<3B_5#|%4I1&kbK|r<a-kc#+ZLC@o|4}1$6Kc)Vgb>;^ju``V~L+0JC{?mvhrm
zkI$zbQ7O1-?%$r`2ZiMU_`(5&dWC9phwrzS_Hc06#!pvaiGc`*0bqT*Wfz>_V>meO
z*emGzE)cRBW#s4?m8OQRy>l=XKmg{iIz%oVqQrau43(M`l1GS#fN(zedt*QdC^pDk
zlu1&ELzw-rgaot%sewh01{PIR$y`*dHN<0xC%L$8vfY-G$T69VN)io82-C5R=fy@B
z&K5u+By&+(1Mw6S&Jg6WitjnfQ?v%9(*%+TCK7`m<EkTw$XwKXo`8;^79b>`U2dcS
sy_hd?J=md{i|Ai8+-F*y?!UkDFLYY>Zk1_m6#xJL07*qoM6N<$f@G$zeE<Le

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/global/dirListing/local-XP.png b/toolkit/themes/windows/global/dirListing/local-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..32e42860e66d82b82ef1190bbfabda8b8a5441bd
GIT binary patch
literal 633
zcmV-<0*3vGP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0006&Nkl<ZcwVJb
zO=}ZT6g@NZW+s!F$;Z&76%$NQu(TGzidX{bFOcrLa+UrA!Idfk?p$V-pJV@kAP8b?
zo3@igX_}b%p67iJN)(qlaOMqj?>q0E!ySclj#a>jI6ORjwY9zbKIcWKs*2j03n9yM
zAS0$JM;ylp!;s!n1dB@yPrtnB^?I+RKz;qzll}eY_<pRyvMlW0cOZ~uK%4+k3@id*
z@-xEO*%=m#DS}}3j1E>*dRQA9jk~Vn;Ay9ZM-P^plT->I2!W7j7zRAggQ750D(kla
z6jcC?TCILVV<wUW$a8@6B}quGQY?;zMWP1V_38jxLSVC8u9|7a@Z%H+BTxe*IA03t
z40N)B@pz1c)C#6;0N7>#w%n3SML=V~*KaXg#{hkTu1m@cu4Vy7qmj6U6w(a~ggeY}
zz0Dvh;$)bjzQ&+c4H=j}&gFGE=M-3g`Ft)n3e09Rn1&A9@$Rv5rM9E%1w>Iq%?tuo
zL3mfmw^$V!o^9JgP>PtQN&Ua!IMp4dfO)<@LaCHsGMR{`|Cr}F31xBy5=vSiq_8M>
zhh<sLEvtxrzfU41v|25++ikfv8)dwG_Yr^N;NU<8IUEj!rCjCUHq$ielM2!w*^#Ge
zD!>@~hmD&xG@DHveLAALX0vcHy_ihS*E^j(_`XjY#i-6nXi7m^<lVwGL=ML%=NJqI
zc)a%zzs8?0ly0~C!You?GTkoGfQV~xA_T98At&-B6#|lYb`^z}A6EVwRji0Vwh0rc
TWlPP700000NkvXXu0mjf^q?5!

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/global/dirListing/remote-XP.png b/toolkit/themes/windows/global/dirListing/remote-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..1d1ca942da75d5322d641d7c141130dded127542
GIT binary patch
literal 512
zcmV+b0{{JqP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0005UNkl<ZcwU{7
zy>1gh6ot?1h80f0NJN$piYP4M!lFY$=_wMRppNL_2?CX?lzD<pi)d&fs<=n+2x$OQ
zK@-IgZ12v`?p*Gjk!{(I5OAbBvuAhan{!vAhzJJ<?+E{)Uhk<|o0`47`?yR*aUdxu
zc%I>b*KY?91wdKf2<G_s1O7%kI}c`NmY}XZek4t($B)oj2X0C=fMy14a1{=?Fu=$B
z1lH860P8$No*2gEy+8qZJ#jqO>^(5#L$s|{0nYmHaf9Ke0!psT0VIo3pz<+=$m$x!
zXbE7L`gv^&9S2NO;7WoZ%fK{|(<4;YXmhccKxl@kqOoOa*c{^*3`>&O+O&18D_Fgh
zK%3at$cT%Pg_#LJMSz_HmJ*C3^~t^KfFA-Sq%PGKuhCz>!I~LhPQ6up0eONaFFl9n
z=)pxZZ`dd49KbY%{z-v<lZqn|1)JyZ!%3rG*>ka{r+NX<?Oql0LaFf)dEn)%hf5d9
z)F^c$Y;LzRr0FEa2Z3s!-ELwqusP8+IQR2t<s#|$i}T&x+re*d-@)eQIz;E^1%|@{
zoet3Nf6rY-0$6N8w7>s`&dxsJPinR9;_&d9n)=_54*Xj+mTt`e0000<MNUMnLSTY`
C8t~8n

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/global/dirListing/up-XP.png b/toolkit/themes/windows/global/dirListing/up-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..b9121e6667180691eaf7a8250821cfa032736b6e
GIT binary patch
literal 540
zcmV+%0^|LOP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0005wNkl<ZcwVKG
zy=zlp6o;RCduy<0QYmfKR-ssmAO=-%snSU*qTnbl(nWXiKX4W|(X2{A2SF$?MF$l`
zkxD^I29bzpf{7BX`Mh~Qj@(xy_d*8IXF2aXJil`|a6A#=Z<xO^w<t(KL=f!dS650o
z0Iys)c^kOIAkyQx)Ry7vXP>{A*)f?ZOwUe|8cFf~?FYV9>Ze{`{kR$h$nM1zl7Oi#
zQ(a%?NmD<&7j7<0&F*CT*jB2wGMispwCjo=wV$U094~=7afT)`jLu}ax$<Bkdwjo>
zzf{W@qe!KFddiS$4CezJ3JB>V0F2BXrCPkt<KhMY$1YB|fH!x)^9L93d3_b=Fo=ie
z4gs)KTtjPxHj4DVE_V)|z-v?pj1l%6UINJg9w4y_)6Vy>8%NNlhc+4!L-x!qKIJbE
z7%`yNKve**??d8k#qfIqjTH;}5s@2+HlRAtZIHkRtPj5J2N;EM0S0u3$PJXWpqijs
z0I~M*DTHQe8}CX23<0AMHi_IoYwOZzH$jAfc<}W6f%xA!ksDYGs5a8+CVMB>z}~5`
z#A?uOA~&!`gASqPBMe58)j>KWa)Vw^gAHLkjpr5@o6{Gto>TGZzri()TrYoZmpdl@
ejhs8@|KS&L+5w76GnFC$0000<MNUMnLSTXm?du5u

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/global/global.css b/toolkit/themes/windows/global/global.css
index aaddef882..20a190684 100644
--- a/toolkit/themes/windows/global/global.css
+++ b/toolkit/themes/windows/global/global.css
@@ -350,7 +350,9 @@ popupnotificationcontent {
   width: 20px;
 }
 
-@media (-moz-os-version: windows-win7) {
+@media (-moz-os-version: windows-xp),
+       (-moz-os-version: windows-vista),
+       (-moz-os-version: windows-win7) {
   .close-icon {
     -moz-image-region: rect(0, 16px, 16px, 0);
   }
@@ -384,7 +386,9 @@ popupnotificationcontent {
     -moz-image-region: rect(0, 120px, 40px, 80px);
   }
 
-  @media (-moz-os-version: windows-win7) {
+  @media (-moz-os-version: windows-xp),
+         (-moz-os-version: windows-vista),
+         (-moz-os-version: windows-win7) {
     .close-icon {
       -moz-image-region: rect(0, 32px, 32px, 0);
     }
diff --git a/toolkit/themes/windows/global/icons/Landscape-XP.png b/toolkit/themes/windows/global/icons/Landscape-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..ed346809bdadfae244fe504d2e41c481351fda63
GIT binary patch
literal 730
zcmV<00ww*4P)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv0007^Nkl<ZcwWtw
zO>5Oq5Qg8A<lbJX)nd1HBdXnqx>3}k8x>F#1iBTl>c)*fLl6W(TG5riKv5CsN&)dl
zh^>Of7A?0Qrb+HOGovI!h9*c?MF)oSk$ayflQ|(yM6i>w^Ma>yi|J@rhA2>JVhW%T
zDuBw<em`L%aJ>%zTuzJJV`XLYW19KNNB5_=DM&^VPNvT9kDF%YsHaNS4Kg>Dmww>k
z?1$4n+jt4!T1&uz{sK0j!cAavcpu^5$wTO`4zAw5^>{As?z-}1X4*p|Vh+$S7&lTX
zC~-S|U=-;9>CqD?4jjKI>FOKzCu#v{1uP1x)AoYGf&f8fo~sPR@M*wW4lEp-#M0q2
zm+stn@b2dH%uv|_h*-&JJZl@l3|n*6Vg+D+mGJ%xu(Z5}&FBbDbr;V~<O^?|a~Bd3
z+45&mfC&_?BcN62Jl;Km@vw~RpI;!S1bF~3HVph6Jqutw;Sj6>g%cEPqB2cv^1b_p
zarfS3q#0p@hcJj7`isEpXRiQYxD*6!q`|fm*u3unl1`c0D~$E*JxQEH2b3eAS2sJT
zz<|2n7SvFJovdyQ#IXvXVNk0^fnYm9Th=frf*k~i1DLatorGfGJPC4wm2U#8ifwIu
zG69K=9R~=97(kTxY_kM-ZVSkOdUC8<>rY#N7+`H`lC5vRGb0PF1{$#0gXTLSD%JE3
zAPSX$iUPE?eCvln^rW?a!=e&c4_Ht~!onaHeMAOo_P{DLnO!q5D@R06kx(??(ChAr
z6bitpU371K0Ehri*W>^)0i51FYt`Kz@GBGr08YMrU(cS;&PBl&f=003PL^ez3L^Es
z-eCzBVb8)~;?k7Gk^40N)z_a)=iCH<XuGf9HrEC1;D7$n|NjNQ0kX|>CL#+LC;$Ke
M07*qoM6N<$f}cf74FCWD

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/global/icons/Portrait-XP.png b/toolkit/themes/windows/global/icons/Portrait-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..0aec4c225fcee9cc66e89d04206dfc9acc933645
GIT binary patch
literal 773
zcmV+g1N!`lP)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv0008aNkl<ZcwUW^
zPiquG5XE2bOg4#|U`URdn_?~^UKBCtMS~~`0=Wt#DxeoXh9C%nWQCyMCs0%b;za=w
zKZ1yfiqQlOn?FouXS=IPnC`Wb+03pDO-=W}@AZ2H6^jS}VE)a|WTYzn<Vctt$T>g+
zNuv=n5jZ~s03&N!tgUT-NK!lb;O;b|%ZfwAaLn=a*@F>u<vbC;SpW*>)s^44Uw?nf
zrd!VeT=_2nc7!6F748K>wYGvoCk~^r-nx9_`oo2&I(X^P+^p>`z)s-`g&=?#D&QDd
z(n50dII`vB{NSgLuZ%GlL_|sjC^+DqaA`xeItCmuY~rxd1eT6XVpO83o7e8Wotd4R
zdh+;IRuIr<lY#?u_v?uP&TR`8*9q^w0xPQ<*sdJG$?Ec%iRRL4W6ZgoPGaRt0EJi>
z3Wu*Qh(trf7<a3<`sEp#6r<??jMacYBc}n31Ngp2lbyz)P>_VJ-`GD|!|gj4k)(tz
z?nkR)&{zgu&c6VFT0nLRIPQ!_1++FSK+>0Q$Np|?Ag7?T$;O}$)P%zTSTqi8t_nC-
zmlVFM5fDWs0=g9Jp_;vu_P0Wvx`Y^jIgLvNT&rb>WhY2q424o#IInt_8Gy(}0L<PF
z+EI|^uAt6Xv?uDIVhl<JY`UGpEUSP<QH-Qh01?0}<vmC@w?HD^cCo4Iq$sX4Di`R{
zWEN2e`ubwt0j&Qx+=+A%pe*x11$Q`5K^+@91bdBZVGs+f0z)kdweJ+{lj-3A;^&d2
zV%{pCuk}^hHHY_TGP7&3p!yH&t7ffkG;{18>qL}waUdXOXft&yIP8$WgbMg-d{$gC
zi~13xh695>9usVDwtO{ax1fOvkpM&cfM(Psq94CD)2H=?inEz$Y>YHb`#enYvj_)q
zwk!+|%}Jw*`MmhemI~D8W=4!L696jcTn2kD>2>!PX6gz+^FG1b00000NkvXXu0mjf
DneJTw

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/global/icons/Print-preview-XP.png b/toolkit/themes/windows/global/icons/Print-preview-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..b037858009cde42a9cb2d035b795e8d78742a6ca
GIT binary patch
literal 582
zcmV-M0=fN(P)<h;3K|Lk000e1NJLTq001BW000mO1^@s6cL04^0006FNkl<ZcwWVo
zziJdw6o<b%bBz`fu?R+OB%LB#Xd#MVC#h3QY_!qJ2N0hi5rx>8M${)rV`HU-t&Iv2
zk)%uzg1fUb_pj_8hQkg)7$W$=a_<)B{JwK$U`)=L*YAG3KXb}nsz(*oaBQn#RgQ+W
z9gk{TS54_%u&2*2eAxc7ySnjwb%%e51vpv8#oO1H7WoTXpLTEkJV;v)?rp5R*nGH+
zFqL1Jw>J?e48M8|A_Dce&UDCtPY@HBoY_C{d^~$?Fuyz8x_|fS%F9=ezP0kpH<sp5
zdJSR$ymKWTe1wohA{)cG`GV#B9qP+V7y17CD_{<j?>mSEaP_Q!({NlAnZe)!SFXa|
zUS@OsGc8^DzJtgH8WG4^fJ@W6{sKe?l?x~;uk;(F6*x9y8$}>QDU4YJnhe>XsJzm1
z5D{>`OdK8_B%C@xDnw3Ed8OYVBH*J9DdUpCPgkblE<hu9LXakk$}7DF5rN=?^-?6^
zLBneal?e<?L=}}+=rf22q!_I`B)n<YHaQbCK#I)Z>gL4AGsD<-`{-6e+s9`Wh#}d~
z4R7z$a5-HDlTox*p<f>nNV$|%NrCGWHSKc*azxQug<gF`plN~$Ns1bM<^(CycOyg5
z39Bl9eC^5GqkW80!eR|3fh{3V&IB<)DgQ}PYzyX4V14b50gfh+b1t4ee#8IZ5Bnun
UHC1cezyJUM07*qoM6N<$g0<KGVgLXD

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/global/icons/Question-XP.png b/toolkit/themes/windows/global/icons/Question-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..c70f6228c8a818326f5db1f35687ef95e26297a3
GIT binary patch
literal 1640
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

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/global/icons/Search-close-XP.png b/toolkit/themes/windows/global/icons/Search-close-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..8be09af0aaa6415fa891a14fde3fb051de5ec252
GIT binary patch
literal 389
zcmV;00eb$4P)<h;3K|Lk000e1NJLTq001xm000mO1^@s6P_F#30003@Nkl<ZcwX(*
zF)K!K6bA733(z%rg)acX7f=R^vJeK-yBG{_F<2}*8T42!28%N3Kll!oJ4vxnN>WG4
zM>w80r`vzH_5a_ps5|`X^wg>I-0tmm%<Nxl3;eaVz|`5dlGNlvnkq1Q@Tnv<xlnR{
zX!}-4%ChXlm<egJ!1U>tkP)H`o=K`exBnqzgeZe&$^GHYAY=qDFv#GUWW7Q&Ckiq`
zJo{2ockc~kglNv$|2=s924sYIW|{nNVD|VOWDcHZ8{2&Wnakd<p8DD~$Q(S+FEDrX
z3NqKYz<BQwWUg_6V)Y7Su33Tk!)K5YqB*<7#Lhj)2=Sa-pjf#C86lpt3M}kD2^k^E
z;F%<k-ztTS5M}Tzxj(XeA!JlNb<Xfik_8s~4@#jX52UFAlN)zRp(YQM+%J~Sm4Y8%
j8DymGpV+y!KwIDk0X=hn_TztJ00000NkvXXu0mjfjP$S9

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/global/icons/Search-glass-XP.png b/toolkit/themes/windows/global/icons/Search-glass-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..9a8a3a3f02e0a34cb8720ef5c83948a1891b978f
GIT binary patch
literal 1329
zcmV-11<v}3P)<h;3K|Lk000e1NJLTq001xm000mO1^@s6P_F#3000E|Nkl<Zc-ozn
zZA?>l6vmstC%-JiWcqo@lsU=bK%A~lbaQby5X-P`A;tg%p%k`GLr_6p1!i`KqJwIA
z%MizyqcRkcAV4Suw!tN!*VpLSh|vaNFt>E8eRj^h9VGRlbsv6t?*E>1(&wCe@~;NK
zf*j2MUP}msNH|$NXD!E{MO?C3O9+HWI9WaCx%$Du!39~fAxTRJgh)79J!kEIISc-H
zR$)^tAystV!08)PIP3UFRzCB4jz7(Oyy0XlA?2JM#+SnnP%-hhtbFG89DiB^Yr|4v
z2`MJqg2bweFgDv{<ukwM_<{{&7g@E0G~#%KM~{KASvP905o3@s_e_H0gzA?_Fj};P
z)H^YQ85dxma^v%#2s>nQ&)oyZIZw^}x=krsLMlJsgWiDwob2jHoW+K?a)q7wE#Nrk
zsWxz^q**X`--7g~8~6WGOxIln8g2rOw-r6!avPkdR-c$&CFEL1@FO)o{)b{(7zD~h
z;HyzZ57dl;^VAx6>s_Ou&#6LXPe0E04#=hx%r+!f+hC|wRA;IN=czW3d!$9Izd6m5
zm(8EK4mAG;v`+$^(~35X{SMAkt4}i3h^3-~Coh{nIs{bRqMCc4RaCUhJ_*iKYhe9*
z>0)Aa8&6&~pHykX-o`#;UFbvJB}J3V+rW9M4de+IoV@eAHavMY-$RoedJK$0(XN@t
z;5@bZJ^Q|P^3L<x@Z{P2xoN6#0ew)k>7fgpr`EvR?|<s#o#(aT$+P*xopv0v+hHbH
z^E>*$d8!Q*l(vfXx2Adeye>R(+4L^}98k3D{tP%ztv)5APAna9$kQ(qdE$!cYXByo
zXw&#ZaGqKN8@HOo#F{pqKCcT;TsGa<-;dUT0a^2#JHUCW4HTBO2^QNOZh&`QUYk*m
zdACQc!*{`XYW0Tw^+Lh<E8GC@yu3Dj9`kOGTDm20o@xV;`-G1QYq<g5d0rcyylkH0
zvZj}w2ItNH@bzyP`8g`}NZk(87dX{7t@;IizBi4c6YUZ)e+vyAW8~-1?WQ`delPMb
zI8?tt=UoSkSq%~~cMI7n_b~GF;=oOHOM*7z<HHwKzrayzJKl-PkO-}J0}%wW(@ZcH
zRb#uc2o;yc@$J=FbkojvKbS@H$T*72J0wEB$GsYeAdnEPht61xH98}5=mt13I0Y;1
zy!F>9RP|m*+Mz~?kn6n~h#;`$)gY|csK?^K4cL)ck7RQP3TWpGez*+N@iW-0%ajPO
z{{fGAG<^Vj<`!fbO^7s<SW3*71wtg8te&&?{Xb_OCxg+t>vhEI^jIC0Zb{GmP9Q|W
z$?7?K{}a!d?@oOQc_A+#G%yGO%fl?2WA+P#NH|$N=eaNUg!wy#T9l>5Bhz4VaZH_s
z&0jIRg8k83uq#UMQ@ywO%CJS)y5eQLv3#YAW6$CV^VYNvk&<%2t%*Dp_J7P<qSs;D
zw%u;c>U^K-z0D`TwiL^j1-tzNbYVU<;B7v`@EMt}i1u~*-sWSYc9QuVpX<HNuUa1D
z_6vxNW^=xv`NWvzZpn_GpL|3`jL+tY7+t)(CSmRT<U?|vtA1r*sN4AFlDWzIy%-t8
z#(YJyNM9X((3s&$O*!DwM3{AS^Jt#OfZzJ!@HkzpYx}m{E=@?Tj&7dks`p<S6CM({
n$`!aQ*ySG(rK6jNjrq*KvELyVYO17}00000NkvXXu0mjfG3=Uh

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/global/icons/Warning-XP.png b/toolkit/themes/windows/global/icons/Warning-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..047dc485a78611a5b1483f7ab62d2b066097c605
GIT binary patch
literal 1226
zcmV;*1U37KP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000D$Nkl<Zc-rmN
ze^AqP9LMqRcV9NPF=DX|Hd7D;1`Pl&I0Q)SDlXxoyRxIauJjM<G_AT@YS-m;o*ia!
zS_T(a;2ET)MJXwurTivL00BWEbVKB)V`Ka*?OuKMnK9-7B_aRubNBded~e+Qx!w2k
z{W1XVDSEgckeHY_Yp1gUn23l7PA-@8vfmOh9LLRM&I4Ey@LJ2SQK<UH+eiW;?kXTT
zIeAtNex%WKHm<~tu}F*>m!tSARXG{r^nV3#b@@>hV}oJ%dt5~#ROoC7#y+ihwLl<X
zrdcxwq@<+Wv7?`=llt4A!1ZAzu8(-)#)uN*CSOz?SkyrRg!3IBXex^C7&rRkFSCc8
zzBUaGZ4;%ES?sI>0s;bVYxnDmnUfhywwkWQ<4>ak?M(`#ZdV|EkAnU^W_Sp7M|?~h
zRti+}6`*V@ebhA8zYu+w<xmHx5EvK;wOWns?|Wg~Acs*GgrljF17sd=t^?ST?7%O~
zoy#!RE5oUuWgzDe92`t(-;TvtpA4hD3N)YaL)uzF^sEBH!^3CvrB?N@u6j8}x)d1g
za!2b~clymkLP8K48j7vjc#L+tW3<N|gB|`T+9NF|Go9utfUC?6DmPyV#qbsB1V2AN
zIy@{a3<t9#G1B=UMy^`8<5Gn`GB*fbWLfsk0%Buhr}gbNkCj~w@fgxeF{E>|(z_w$
zIWLen#Kgp)tU!(74(SB5&I`qviVhMWyxRbN&EZhJS+@k{_6MvkS?%2Bfu&2AA|W9G
zz0EQVU3Rk}k)1XE$khtyw!CeCSS)t%;Y)Jn$PW3IzLq!)wz*=k^`<tflZT}A7udA^
zaSZ<9I*B!Ou-y~Yxhm7T$2ir04e)F__K3;Urh>7>1*QuU2O5nAS$m^lx+t;NDxtBx
z4SqQMp1`s#x!DG=MY|Vd7%oO);Jg?EO$2#0o_Ddc>X{(?xIYZWW*4iLTU?alT;4+L
zOyQzu3?R>RJD;s{3v4}Q87_sPLF8bdfdn;*@#d>)oH_1I-&0MF`WqJ`e}~AjE%}UX
z%^1L)PG3|u&=QPmb;7CD3t^}iq3j1G+Dc{gz2TfA8r<lD3x(d;yM~)`ThfD%kI#gC
zZ-}4LS1rS}T2g=3*-?#6;eJ<CeD6X&E1ZfgxM2ZKd?KOS@^%6IiY#Bfq0t9@)dELn
zY@SV2S#Cn~Ld@AMNB{56Hd91jD)vV9dd^{6(u4L%9`)Tj;>}$(QRw}RkDf{=^j7k1
zs%+|y3h8iipP;lGW9k3gG-Z5$tqi3ZQq$U4RyAFKqWWuJQ{Pzyy305_J!MYlDYy4@
zQas|~;^>Viedh}FR5+1nYT9^xu@X6(c=Ty$7hqYLuP~cik15ez!b4Z_BqbC%&)Jl6
zsQpQS^wbr|N{hkeUqs{_jh!+6Y6%|&+j*9Ol3N4VwC9<Pm7lX{&u5`KK8=EZ@vI7M
z^ph1i(h(Q(c*xtrn#nwweSmdI-%VmZ*!41#yK4<|;N!{G&W+U7OwJ3D%qlWVI8^{k
ohzU92F;8TKv%^JrFWnFL2Q!T{Kr7llcK`qY07*qoM6N<$f`Pn9*8l(j

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/global/icons/autoscroll-XP.png b/toolkit/themes/windows/global/icons/autoscroll-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..e99e4211f44e15527e1bc11fc8e91a3b036b9ba2
GIT binary patch
literal 2127
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
FV1m0C9N7Q>

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/global/icons/blacklist_favicon-XP.png b/toolkit/themes/windows/global/icons/blacklist_favicon-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..155c43471956e56424bcd50820d36b7eb91e5ecb
GIT binary patch
literal 542
zcmV+(0^$9MP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0005yNkl<ZcwVKG
zF>4f26otRp*)=gJDA<S=YWxF15^RJNQN<7iL9nw7DJ&F0tZV|N3uyj=DFP}+j3}g3
zP=%B#K@_x5RB>k~*`0as-RtaS++B+$MGhQzQ=ISJdma<1D%+6(l9Qt|14o8uCC|~|
z!F#l{xE!2A%()rw$&$vc10Q}Y7$BRz)QE?6?vgK`QLrEq5Fb$QFi;4nYoDE+>q+Vl
zum7%9fi^XdzJ4dHzlSIyK6`<9{0x<mQ2_kfYuxGzt>q;&1Vo|LbP8YqZPPVEi*RlF
z8nv10^s07h%FMw-Y}~z#pr}}$3INXA?$zRE3-{5`l^YC9U9@oM0a%z2sEnUxEA5z=
zL_`RMyDNB`fOuq#@a6^S<@2bGDRz^pB8B(fdqVBlaa6^=yMR1LyvNSkb{P^nVG*Is
zAhrS>K<BCa+N+|hbL@Hdi+<W%d5Ea|-+|cMdfe($wo>!?aygas0NN`!N9)lN&4oGo
zsXjkTdVdiWMYOwu0V45;2GToo<exq=FfnO`0c3Aq(tP%q#)Cz$u$9>T7k-WnC$ae5
zKB*&W?ORc9aFD1HqsgDL)PLm)-<lduBwDozvU+lJGlY4cIW#Ci%t+e6moQPvn?X^I
g?%#K{Gr@NB7YLVsHrxk}ssI2007*qoM6N<$f}>jb$p8QV

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/global/icons/blacklist_large-XP.png b/toolkit/themes/windows/global/icons/blacklist_large-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..520e75840cd5799d5cb5ec000766111db394209d
GIT binary patch
literal 3430
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
IM6N<$g0Ea}KmY&$

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/global/icons/close-XPVista7.png b/toolkit/themes/windows/global/icons/close-XPVista7.png
new file mode 100644
index 0000000000000000000000000000000000000000..6e67facb67f920e528a2ebaaf772bd176193f4aa
GIT binary patch
literal 788
zcmeAS@N?(olHy`uVBq!ia0vp^20$#p!3-qR3wW9t7#QONd_r7--2Y%8t7ENf=AmNl
zW#JwM6j;7y<MOqeS8mw8YU7UOYqtW$1EW(F3>=h<U8K}ar8O;p>gDw96^xvfjNKp_
zC#kB=)6m#zVR6RJ?yQ|1kUK|93n(%lEO^|>2`G5Z-X16dWB{dr;y^*52t?z2P0a;b
zS_`$c7wPCM*416Cr?*63f0?%Savh!Jy1Fa$^j7NYuQD)LZD_d0$Y_nR@fr(@wI(KO
zEiKoXn5?t1T4!y&-r9PDt?foTyN&ktn;aZ~F4-9#zCSS$V()nehYL<l7oD9ixw>BV
z^Sk2ab|oO-s)xtbz`(0PLDxJzuX%Z03kkXI<#pZL`+8{T4R7xo;o&!dC?eukWaQoQ
z^81@NKiInU(T*LDckO!8-27zk-lzNbKRbBv`JqF<-@W_&;lrQLpZ|XQ_V>q+f4_hK
z|Mw3VjH?1p0z;TVrzFTPn1PXvo12?QNE!%aG)(L28la#R1b#xnuU~(FK&dOt3m8Qf
zo-U3d5|UdFIObnUkZJhX9>lO)kuf!?Eb>5#;hZlIzVH7jnlfX?3_<?l$W0eF8UC{S
zclp@mbH6{nvf5K%w`0lHx?4>0)%lrs?f)x2Z~b_^=i2V~EgyB3oBrgLOf-4#m~Xe}
z<IzVt>tFv_^FjKdiFR1?6t>k$vmM<u<~;j(rO7RJzQxP$>hrD$`H1VaA6_c%d4e<b
zponJXl{<bj6}Fo)?D}~`=;z7_f~V%TH}CFp^Wryen;q-LqHEsfyK;iCjh5Wfi3`M5
z2<sX$dY$07JF)WJ3UBA%#)sD|XQ|z6pwq@BnYbo&X|mKW$L-N`wH?K)N|$=K_7rTX
zs##-m>B6PghacVw;@nlb_x}33S|uEj?-l0$D`raA`e47j^n=ft?bGV(FRDfeXJzud
pzjygo$ajbTn%3J+{bgSNUfww5$gXeOw4Q(h-_zC4Wt~$(6977tXbb=V

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/global/icons/close-XPVista7@2x.png b/toolkit/themes/windows/global/icons/close-XPVista7@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..ddaa95ed07bc85880e5de8a92a7a458babaeca27
GIT binary patch
literal 1690
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
XBpflo$?@L^?kYqjyV(~J=?Q-V7QqJi

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/global/icons/close-inverted-XPVista7.png b/toolkit/themes/windows/global/icons/close-inverted-XPVista7.png
new file mode 100644
index 0000000000000000000000000000000000000000..c9bf9938b09dc54bbba895eea97e9e356a7f7711
GIT binary patch
literal 732
zcmeAS@N?(olHy`uVBq!ia0vp^20$#p!3-qR3wW9t7#J-Ad_r7-TyY60Ao>pm*RNj(
zvLmBnVq)Wf0-LvNnWU;ZPeWs?g~b^=yR&w7KtZ6$94#%N;C!(7aVICB_&Ixfpa_rw
zlmdza1%V<Ez4J9S7ieiM)Ye|4qqA67cd?${5`Fz;+S<!?be8MtuF%t4sjt7vz+knZ
z;Tj{OHO9tkEG*WVn5?z5TxVjk&dO??we@;y>kYQH8|~~i+S_k(Z~!`HXL$Jj#6*a_
z=N%j_I5}N(cE055dfCtKiksV&fPkwW9#;bcuLcEO^Ypyt<#jD2<hqyFb#L$Mp`kat
zy>Env-vpwFh+C17cgxG~Z{GZ1>()m*c0As->q&F-lf8SN?%)6H;KApI4*h=j?)Qfe
ze?EWy`|aD`A3y&6{{8>oKVTp%cV{gFhMjy#kY6wZi-53*xUrM7M|LX+Jo^a+zkdAz
z0^j1E6~N#&@pN$vk&xVa(9vJYQRdh~`OVroI@u20UlV#5h56^bI{3c+vv$XqD;}3z
ze5DFyCFfTD-8^}o&2O8U-E#3JS6Od<%4NRtw|3L>3qhZbJ~=f}_FhiI$u%mo|78}=
zc(|k?$!N)E@5PIaj(y5ll6~ezuO7Q5ubz7z8=vt4&8{}axf0pFzyGd$rO|U~rda6K
z3z0%oW^C_b`%t3f&+a4WKT$Tb^c>U2Xr}g?RXzMALAPv9*z8%-GV#{bGpnX9IHHj_
z>4i!MQ<9RfS3^tTj7`U`u*$BqpFH!er$na3^qJv87H1^(w72zr365I7G?`QR?9$!V
znTm~vS!y`uIk;z)${*Sr#i_h@>zBHfTUl&-wC}s-zgON^Z1sHq?fnN%?r>jr+?}gO
tNv-S6ef~|MyIC(?t4(>E{or>k)0Q<`C$~I*a0?jJ44$rjF6*2UngCa~RK5TJ

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/global/icons/close-inverted-XPVista7@2x.png b/toolkit/themes/windows/global/icons/close-inverted-XPVista7@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..0155d726b38334177e18a31f2a0c6c56b5864381
GIT binary patch
literal 1383
zcmV-t1(^DYP)<h;3K|Lk000e1NJLTq003YB001Be1^@s6?ZACh000FpNkl<ZcwX(7
zOH5Q(9LBpMb<qXss_tz^o&ql1h|2gx)1+Gk@Rg`5NV)?QMM0Xh3DYL(qV^%QR<#YH
z<^3`)8ceIL0=Vh$8eE7ophgu2=HLH!lYcUuIcM&8@0|pbOY%$Rod0*elYHMLH}^gF
z&&9>X#bu@N`-Tl^jE@O2<Pafv!rScruh*<eV|+}IA%_UT6W;Ga0Zk00h{hxeXksWu
zG`<T31c$s{8Z9oSN4s}B0=(b}Z?pTq;V1uMMh0EU%cI}cuXhA^!4uvqz5oP;&{Dx4
zMMY$GKZ5!xHy6P<3Ov7MZ(HFI(Z@+>KCyGh$gW*9R$Q#afApxV^_pYHv@>{{-QS#(
zLoFQEuN+z|9bBTUb#(06qnyDL-gd(OoS9}m)oCz;23o84=)#+AX(3u#qQKd++JI+x
z1`V_tjcEV~N>#w!>S~%99Hha+hqd8j2F(y_RRsV$;Xejaf-Zc~SuJ6dpVC;2@FNie
zqlAWrI1P%yOmt70n@Qo7)PDfDUQi&=P*oK@zJ1$ZW?+B@4;_-3fIZAahco}1i?5aN
zJrb<01pL-$Ja1jV&Ycv^zekQxWO0!q9Ik-%bbY;OD8Ro}8k~*sGcO=Jo51z_e1mp=
zfd~5f5UyaX2M!(-4Sp*%I4c_Qwe$jbI6PV&i9`ab5>(+sJ398L%+fo6Ly84qM-~<+
z5)KQ-diu;6?F{>IUKR>S5HR+ENkKLX_~66UtC;-u&hAQ8399g+#TlG^+xv!h>>w3W
z9CqZ*8$8(p*2+C-H9n>RT;h<xH4ZJBehzfHx0eF_{Q}miJ!s?3i!bi5QbM}61bz7F
zR_+?!zMXVTojy&=uU^qIhpYlKXcBms7m$@j;96c@9Q_9l&~#4^o^TbIL8Ck?zPQ7o
z5}XeoJlwX85;0j<N6Rl?((>!q(O}P*nVe6$fUE1)Dd{UOr>U+kgdGj`Fw>p0Ux1X*
z(bZF-D*!V);e!VpQX(c#ouZ`|FA#V%*uxAOJq{Hx+0lW(qrqP43sAjqRWD{+1#I0)
zIwnq@q@`!i5VjJ`ph@6iUO;9hfvdT>arBjy(PVo&O?7svzziDYS@Cr=d_48Q$rAqY
zdP&7ZZ7qf8=V|Hra{+7R9<&-C(*S<tkiZoVEt=laQkuAR3n2?wtM;IcJ1@SDhL86F
zaI%EIi;5_g@e?O#ac+*n{Dccwj~_p-onc?$Wg5T_85snA$;lC@r=&y`H1-qDqCLdd
z@`sr2g$ojt;IUi4*#7;r7z|RFLlv+duc;9Yico2A)^-7H{N5OEYeT4lvF_QoFS;O=
z250RT0OscAt2N=L162vZV5r8*UH7+ap;%@vT%d3$WU%=3Dfz3b<1~IQ1T)dioIg(r
zFVg_NU%QsT<?L*M?o?LN_|2OJ{u?)_d+%PE3DnJnU?w`8iJptE<qt9b8vZgieBF1#
zgW-{{tbT~y-@KVrAkc-`S@Ks^kxqkRpb4Bir_)#}KuYkpwo3R)FoWh!MFrN56d(bw
zW(sQS8a|5+KemLr`bKC9n2)U7b&o^RF;Y?@YrUqlR6n;-0BH4k75hq!vjs>Aitv>s
zSPdWC+q8*Nh<O1X4}r^BS&kyUc0a`4PeQZG&K-Xh76utg5ka&2zw>y43^nr$^XJS=
zN4UgKK6?VWf5n0Vno?N67fBS*#88Tm`&TY^H*QS(v#`*|gcx!Nc=_OMcK=0>Cyj&h
pF(C(ohnElDa*vCPi;Ii<_aEibHYm`6UPJ%@002ovPDHLkV1gd<i_ic7

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/global/icons/error-16-XP.png b/toolkit/themes/windows/global/icons/error-16-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..a0b4eee699bf833fcdcaed26dc4657cf406d5a71
GIT binary patch
literal 672
zcmV;R0$=@!P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0007KNkl<ZcwTK%
zK}Zx)82;zIH>0sK&2C7j=5DM+R+3g13(8BNKo^BHNC?79UJ|lPKoK2-2&jMxs7rcD
z^RmYP3$2T2Xr)?)kjm_=rpoNhdppy=k8xaAKlqv9|Nifv?|t(W-}j*ycNjBbgfvGP
zYXC)oH0L8ro;Utnhzt~A*MdG2p3wCt$0{pt9Ert1Wefm$j<uM{z>H-*`@FJp|CJEd
zo(1<*wc&hK)nI*1O@f;yIF<z-=b!|GRMUVO2F!Tg)a!+X%kMc~3K#UE<%<;+<BiqT
ziGOo*QW#n+w3{zVVOrCsKA2|nJ0a2p5VeuW?Njl1!kV9lvbHv8Tw8-kOA83(IDmX_
zz@FaG0d6h_N3+?JbtNTtLkGjj<Z4`1jm_m{xPanq{OIhI&*T05VQ<thq?2ja{d?24
zYe^4dmku91Xsny24C`AU3WU4FQ^<)R)I*e3wo`hJ=!7Ul2*?T{?XIL!FoA=`z@FrA
zMwY55-~p5~2T6x>;01vR*o&MLhG9w<J`yD3d4JNjy<-gnJBzl9aRz&_*48lC49@<<
zUn)a<8jb$0&gBw-XkTC72@F%uqiJ9u><#I<<R)Bq_JQM^CV-gT+IqO*d2;hucefOc
zpm;HrlJzNA^cA`M%qq@K3h@{}ZYw>iD#<cJ-qxvV7gdyfFOWoV_Aibz{DSkVNI8WZ
z>D9D1Nye^62-#P>f#ONm9eT-m7gC#mpas0&MCssnAx2%_FLwZH^U2#NO5^SOCB(-u
z&ie+0c!cdN><4rJ*BIM&ec+0w#c!3C)+423(N;>K82<q?L?+uFw30sn0000<MNUMn
GLSTZ74LcP8

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/global/icons/error-64-XP.png b/toolkit/themes/windows/global/icons/error-64-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..2206081dce8100d84b7399eef740e6cce50ef94b
GIT binary patch
literal 3711
zcmV-_4uJ8AP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF000g~Nkl<ZcwX&W
zdyHIV6+hp7%*@X0bN1P7yWQ<}3q@j)BD4rZ1p>qrqbN~cC8$V{SAdX23<Q*5ME=4M
zFecH6Awpw?f)Y@J0VuQx)GfB9Lc81Uw%hG?xBHma{T}|lnJ>AMnVp$C(=9fEll*e$
z&ScM=-|su;-1FVJ%al^|X*P>K-S(LP4xM0YZftbA80%Wb`O2u{tO&bqce4-;-I+`~
z)VIf7_t+uZp5mMzNpgN*jA-XR#tux(&Q8)NU^Vvu#u&|O;V^YXBH>k1t~-_J;!~Ac
z+a3;|0W`-V5vwi~BFA;f0^o!c=OjFjGC0nqQZ$)LrN+|f;UUl4vV*Z#cPjOdy+RDD
zOok{gR>Xax1gIUSG&gsxQ|dckQ0mJ5y1H{ZT3W1z=4Oi2)sX|T76>p9B@k9ZXk<lT
zjzh|_NZB?C96c#%Zg!TYjvb@nsj0E8p7+8QrGERbxw+R*z6`*M_eG;EU*`PAa~b>L
zig>)QqqCD@_4VX{hyoEYGedH2jzl`GS3I|RAW8bjSQbnJ<aK6P(I~N4j0ni!{psmx
z8a{kD^Y+}_roSom*t<f!A>r$!$bhfK<KMWH^9N6l$4~ECvV`if+6<)m(WB%caDlW|
zAZt|f9Tb+3iG!Kf`pA$GHbk)FapE{m!SBbTqluRjiC_Oksb7vJlOz8(0ea){ru9-j
zbdl@+sBigl-Ry`!+&grLJfyDFDQ;HR5G!j8Q07QvUhCKZ3+EOx&1!3-48CW4VuIco
z9UXjH%Dc8DldmwCf_-8FoDq+&ygHr!-50yM)-LYtr3mMg86Bkz0u!dLed2+wyinlB
z04ow9*40Hb@V{$#cxGcF@srI`K8{8z6zqfxa8_H}+8fg8r_b!|?d?P$gj7!*I6yp^
z%r-K{DpO`PiQ#93rGc_Y0ed0*A15at+NjinJd^Ph?1Tvb^6P$(PH#MGV4%BI*X76v
zr4Ak>p=;c-sv%cnhWNrTDYMNo)6qdgM~=|b6B7?VE9C>ogp7hMxB#o;@zZYfyqC`z
z7+Bl}^69;MDK$Rs*LjUAZBUzdQf4oq-l9b`gz|gp=+U2U65^*)2we_x!A9YM#>UR8
zQ>ovd+1Ix?u2b*hk0}B2!m_dgD54x7rXE<75ZQBSpaMerDCN_C50DT-a!xifaY<7X
zeXFVI$LCqrHONMU#jFJpAQp>RmvjEen(pp1+mUYRp`k2!3G(>_G--*T1g;1o7Slod
z#A+48_~eB?edI)tk{ra;)6`^tyRPn$UfW)$-7wg33-DFOu3Fd7aBX)_4{_9ca%@bK
zFAkJ*k~iH%u}zyO`s9-&&>&SZS$>tvL5SR#44+Z>jKC*{Pg&#>Fe7z%YKl&4X=(kY
zZU4-%?N-CDb^-bt8kSzf*h77NePm;jOQ7R&{bfK=pts&iZFk;Drwk0x%CCQ&njU|g
zIBL^~P>gay7(qFFw&wY4G(Jm-z%U&~fpv|IUpb$#4aBl$)hxgTQr^0%v$Ll@5~1Yq
zFnMOUk@<ld^6enM3@c=rEoT3vms0Z+Pxt``tbLj1v#p%ZRH|4!WTu@+P@8SjC6UM-
zEta*Ch*(VmtY~N$SQ`r6(9zvZ9@0LA3{d&0uT(C8TW+CFknhWq_s!Nm5O9kxf+1Ns
z?Ip-}l<?Vad~(F4JkR*_!GI9NSs95eS<BdUT05NuRSR&olpFfn+FC;hDychuF718j
z8UNgKsq?P8s2AjYnTtheMZo#xAbk|2y&+%LXTSD&@4Y0HA|+)}DcJB8g*fL})_0>s
zy+l-<0Il`)ZD-i_Rjugy9>{yT`xXeG8zI9KxF{U<$(IqK4I&6%gn65&0{KouzLL)v
zQe6sB9GBUth9L~D20g17yF~M3u)qSGrqqS~jg5UFI7&@Ul4Pv7X@R)6eLH=0{q@AL
z`SGoCCZHUO(w;!Rs}gyG@r@g4`2PEeLZRF&Fi%ejVS$=#o7UL&<v48y>_7szp^)`C
zr7ml2Z6%5Atd~v~t89*hQFQ$I=V|A4*98(`03x)TOh6MeX<t40J>UCYcAHHgSbRnC
zdqExI?z613!G5{s8c2YsZO50n?w6w2*Qb%<**eQdf!Y?fr$->df3Cfj_|#M&5jr4(
zM0x2<U?9J!3i7)(dC$|UUvhv_1}+5XwCx5hf?oy|1n5z!zbg{ybwJibotev?@3>G9
zBf|LR&GbPvB0TmOv3u^J?%Qt<ME)?y?*e%V@+=$<G)>yz8$&5{GPYXl0az6Uh!cIj
zITmwtm*<>o0Rl~Nwie-q7idR75msQZ8Gr!Gy1OfrfA-ldd6CKF>K?+&^6~hWM8v<`
zvIZEa1rh)y&>w}uy2hkZ0fv`i5e5T@-~gS?&16*=*T+EqKZZO5d8O36ka<uB1UR|_
zGS+9~P*DKeao7?m7rCxWym-<IG}2l|gntJR0SH9i)O=0x*g%A_IEdC)7J#u(jIn0D
zDjeNk=GT8E6o_#6I7K)F@*kL*$I92dvn1UIh}<s5+Vz>Xk^<l)9JZ_$(!_-*Bp3Y4
zO*xD~gzeW{LmqaKK}`uk2mkN~+VTDGm+kf{U@R=Ru*?BB!?&~m=A3ErvS7rlWm~In
zX&-v=Mf&Kkf2E+tvFF(R@WaHXrwh7$?XhT6IpXCngSv4D_z_b2oi=a)K2+X#TYvZ6
z6uS6g_y}Mob2=Y+gji1xiA18>%qxxq5C97@2!V8ZPKYC3iOZh~1fP5zhMZ-3v$S+6
zu_}J9UU}JNv=lc$RN>fMgBSuxDJ72)%~Z?)L6jL|Y?3SG-}R~X%L~Yx{d`qs1E*qG
z>M0?DL7-VcbD32tIi=LG${8Sp7?*M+?Roy*KX3!`S3U~zeTF=v+RQQ{EHfeqBSN(?
zc@SVuslzx;=8{~=vV%}Uh&?kHI;89728^IJXUN9_lMgOJFGL_CLN%9T0c3z9N{!(4
zwEn1U1~AwN(ayuE)Er8{pRy_l0peNIS3!RGsi)|zE3P1KYATQjeZB~R`;n=C`bf$T
zDc1u;#Zh<yY8_0cccmH2F9Rb)@yMA^etAIh2cCI`-oN=~I`F4I(KZZA)rx?g5U4q4
zKz>q6odJV5<>fQLfJ-^C+w<N`fRwWBK;6Faw%e$`3i9um+1_nvpivA<TQMvJ5n&ZX
zSZ+k%dF3GIfdG;qKPu(HeK`TViW#7CIWP7I@iNLla<loER{&EMjad1h<oAR8HZ$8Z
zGuzu*1Pn{nh|mua*y6={OrCdRM1X02v`dJsU_F}ahpKW00BpZf@9jw@-%l}CatP78
z#RzVSuBe&3@nu99fe3F^lL`0TM^eg?6Ke|Zj|-tbkn$Cr&H-M~dxFxFa{L|7du9^B
za>to}AhIkH_*J$u9Io8(K>lr?ydUUsh!B~XAt7b{?-aSCVLGD}?dE)NM5%2!O#?iT
z01BoLJB4_DcOtQO7D|eOGLQg)cw%snwr<!!83bHAc^?i$H~<m07!k^4(;zZ{xvmz#
zkIDE+=*A}my)ET4I3LsP0JKCP0SrV!seNx`GEW>%rzu$?U>1$iel)Q+5b%5=41xTX
zg0wF}2@&2jK1&J8^KOdfBV$${3pn_ZQh(Rv&D#`M0MjhQzoq=+pb&3OL(NQ?Rojn%
zjR+;l2j9T>KHr?j=UbY5i5nyWn3Ix5IOnel@f-L$Wa?j3{eXn|IVs%E*hSa5?$gU%
zH`a){w+(^92O2V{$))Sp)9MEvpowkU=w00J)2rlY@-;p%;lbyU0-q8-E%=<zkmoec
zIc?5lo_$TqpHZ&+Pl99h0vHkWH$~54?C$lU(7m0Gqwli%L<)!rl#3IKWw)^mVll@#
z?x#Uyo=<{LtAx+A9(r`$d)@~dIlqGw?Ixme@Jk)f^8p@^en+V%U*r6_qe4((p0QXO
zFf>MvfXQ`<94FYur5uWV7XOVQKLzq1az61A=f42?y+m{j$Q;+h(h9~H(@rM;Da5_?
zMDcZuov)iuU5UH7rZELJRge{xeHvl%c6(D&(mu`;&vE|qDWa`Jgo9oyB^Tr&soX6!
zipGde`<iY4YPIXGi93!Kp)lxA?qMl2>mL(>hB#0D8RUnQ+C)T$P2Fb}^eHij;NlPq
z5v{n;vVOkSbuWx#Wum$<&ac`Dc~+3}(q3Pk{>%B%&7Sw@2+?M}^97EAQ+nZ_6ZD&6
z4AhpKYgu=l=QtZWbYleBP~~h0PLi>bpL4Ux(KWw=^F6O{{^$hJ>zX()nbih%q6A>3
zZ^VF>0miPpz_xGib(}@|5*fkAPM#2I0n=ZaRo7GAm=Nl1&R@W!_nS1)hgtHb=`F;Q
zqJet?P~S+j`b^9E!5NOTzQeYiC<F*Y46Ty20NEgb3`i$Uv-?np-CKnC{r=pPH*Uz!
z0{p~3D_lG%MT`*fF2>ILJRV6|W!o3DSyo6l$cPpKN2>}klmRze+LUQ@A4|DsyOb~O
zlJZ5c+;3JKC^hHTE<i0MQD=l`Z6{jOZ&{ZN*!Gt?8S81bET;Q|3)mW3JOe763p8nS
zX`9s>8YyRoq<n9Wl&|eo>UEhTJ_AgX+2ShL$?!iz7U1S(L=0~%SwwU?vSH0q##Xjk
zRxg@mE0l7>$R3uL@*aSd_U4pIOe=L@RLXs0O6?d?YI}lc$fS9~q<X^Cx;*LrXULR=
z1B6Uggw5-?P1F*`v6-kH<q_AS83FX9H8-o&#59Nsq_rZNG(^)tiVW%U#6S5AsMO1h
z7~~efHsqOs%Bu!$;2C7hxiFufg#R@bJTo*{0eLEF1?E_8rBC(@sC~c-Yzv<OpITV-
d>9)@V_#YD^1#}#WE9(FN002ovPDHLkV1lq~8Mgoc

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/global/icons/folder-item-XP.png b/toolkit/themes/windows/global/icons/folder-item-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..e2274b6025e6bbfcf29e77fca05a42b0467e0f48
GIT binary patch
literal 1482
zcmV;*1vUDKP)<h;3K|Lk000e1NJLTq001BW001xu1^@s6aIAQ5000G%Nkl<ZcwWU=
zO>9(E6#nk}=}cSNj%7d#(KKK|qPmfVD@|FrFyao0O}YTog)W+yGz3WuYD{TZ6JkVT
zFa{e}5OE<9#RM0y(T0T)Kxqor7TZea=gs@M*Lz;x$y|rYGxlQqk}v1Z&D{5W_nb2`
zCnJ<nAiR6{^O0g_@fpu`5hn?PdVtDG4J&slApCmm#<b`8mrkF4?;`FYJYJCa_}I=@
zkwGe=!p(&mF5jr&(T95EYkLp9xpU`%zAwJ|@~mq72*SnBUcmhWU2jxYqDd*02LnO~
zxu(ZIJU>@E_{5Xz(2C;FhfM=?bAnQtIDj}&=qvzpOAS2zc-i^jlXoUw8GY-(^Upq4
z18_kT<#nAK{#Xbm9^0|k6Y@4xya0xB);pKKJvCll-+5Gv-O9}XrQH;#s34F?AW0Nl
zN1(UM7e_xjH1Yc0LkHM^>pSO4{e_O%A3jAp+*dC60B&ACw;Qc+J?CdOkk(wGDV_=|
zk*yUzK05;iV4&0ijR#qvUW>O54ZjV??T4b%L`CFvl14yB6>9<z3M!n()$iZm!UocY
zW8pMrYb9JfwWWw^y^-#PQ7m*b`p6K662k3;jINNFCSOBB@md)q2SRAW>kx*jSpw>I
z7G`mxa68abDxt6@L6iWVj9?-R6F|n9KnSI1tqj4YFd0-7;XpYNqA+PO03gnULroG4
zm4nzTf@C8{L56jhi0J@{$_A7Q0XATWt2A;sGIOGeI5IL&tJXo6sYalfGLl4Nod^^(
zO~_P-Zr-4nilm}k4kXQ9kXe@EJCO8J83v*-LY(A?XVF(M0U486KpD{F5^z?um?jX>
zx@k-sfbt;|GGHK9dE!}l6bx{tYd}(mlyw~gfU=>5n5tP0V=sWZ%Ye)mCrX&evKlWz
zMvIh%tOpXa?i|@fnk6C0Fj_N^FP<n(n8?Z;F9R~jN|2ahEo);>hIf~s=mXseP#`g)
zYEovg7{f&R5E=arh)xg$LI9#EMr%kYq0$H;A(RUx11Ke$27;h+>E#y>A`j+!dELFn
z|Lwx5Zw8QpL_{++Li{~C6v04uk2lXh#}Gmk0hBZ;=IU!M>vKVNt{Xr>vxC)h(R3PW
zHrT-b1`k%Sp9icnaQ*Au8<v+Ezvy|Oqs=@3Jr6|sCwXwwj;VI@fW3hm-@Wux63eYv
z1$Z8?g8e*T3Hy1#687_eCG6(`OW4l?mav}(EMY$nSi*iDu!Q|QU<vzqzykMd9<ac@
zn+J{^JGQA<EI#16E|Mfc5Co`Jt5{iCL8Vebtya4eMbX^x<Hv9RC-VS_@7c3wEi#ZX
zDJ2#c7co0Ki;WvMu0473<l24v_FXx1=FF|Rxj7Jy965q)lG@T{zL1(%HE)lPkLMep
zo3k*JGU0h1mY0{YZQC}Cj*j-8IB{YKK&&~hNd{eQbZByNax*k^mca0RAN%+3ClgDW
zNv;7BV_~M53CD5J)zyWOk&#~g&;d5k-{1ep@bK`%)6>&vhh4jNZPpjqJT*0iR?N)I
zOdC^iz=9^(0M4I3pRP-#Qd%*iRDIjGZ^vpdF)`7{2B_g$MJZC3V{mW~^?IGlLeXvh
z8pc>HNQVtjx3jPr)86Ro>!bAZURn-Y1KclcfIez0%r|9{AU7$$wl=`eVgvL!rwwvt
zijyH;v$@uXtV)<JWEvo0637*&NIhYK_WucdG0rUYQ@LDD^}Lpc<%v_wHDH#7#ms1y
zI0%Ba2J*!D`=G4>7UnZ7#xxC(LC$!qfjn_?-mV9@glvGt+8SVnVaPqu1byxLzE2I(
z_9MwO!FzO$%0pyPT2sc%^PENQ3G<t9VQg#+c`)B=WMG-jtrCBl{|`6-d`%bmNHimT
kPG;vk01okA&I6M87tZ&7xv(4;4gdfE07*qoM6N<$f>E`ktN;K2

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/global/icons/information-16-XP.png b/toolkit/themes/windows/global/icons/information-16-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..2eebf042e6d9fab44c47f7b589e3b74cacbd3cab
GIT binary patch
literal 706
zcmV;z0zLhSP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0007sNkl<ZcwT*z
zUr19?9LK-EvwL@^PPeI;O%oJCke-r75nA=4Q9wjk;quJ_q=i&(0YXA=kw}6R1qhUo
zKm<fVgj8=@1Qi4XnK)gW?#}7vz4!cyUF2dl`oNES4sbu`1Dr!jDU`zq*6;F%8+U_<
zY;z@L<<m)&;U7U=$FY+wCx(Utt+5!_!!=S7$TBy!7CwGTzM2?c`}}gctbmx`Xzv>t
zZ|qGBW(onw%{&-9IUJ)JH3moK&BXN2nVXk|Q_KN?hHcu<k3MMVy&g|3n_!{{0&qWG
z>k0;^bI>-j$QLz4jt-ww6bKX1DWw!=01$4C9d9^tDV|<j1=%)~5bi`Om^*UIa`()(
zP&C&NiVgHswRQD*1<|g7D}{mv@S+z@O5)7DB)9@Jf(Mrl{CWVP{TGLb=n3=bf$FN}
z*kNb0038Ab2~_$d;s>koJQ2l<t5I-UcmiEXz$zfv(%DJ=;2x$`gd3oR!f<R*DV<B$
z7RS_E6FVqL+|eOHoJ02q4WAKe(x4=S?SM3i(i#N#0N9Si-&8OO5&#qc;Vu+&3fYun
zF0V46RNz%a4CM&|(s74L2?z-$0luCtib6KYq;NLOZ?m&L(p&+AbiZOpf#L$bQr-3e
zj5Mr&e>bN@aghN)YJTd@R%S^uFt1|dLX#(mch>@Z`)3fGTn4N2kM1g^q<0f*_w|pp
z_1sDj99WhEpW)pxuR_yxfEieLeS0SJVY2TJ0TF4Ty{AW8x~|;_griI<2V8JZ;MXf*
z<$q!E{n*3om&e0Osr9mtNe?!4*LR#v)HEMB#I;BrBO)epW`1dIKJ)eIq@DZm?0>J(
ogNW)#t7-(m6yHoMrB+ae-_!_H<|YjuvH$=807*qoM6N<$f{{8lwEzGB

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/global/icons/information-24-XP.png b/toolkit/themes/windows/global/icons/information-24-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..ca4d611712f3021dfca7d0a1790a0b0a5d8f9730
GIT binary patch
literal 1182
zcmV;P1Y!G$P)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv000DKNkl<ZcwV)Z
zUx-w76vscm-@P-lv+j;=&ZN1nq>5My!S*aYX&ONal7S`|)LZJ(dqD*CQri;IqaYYb
ziBZ1jLNEJTMv#V^+N!Rr&h9chv$Hez&+nY{?#yLe)t>q?UzmG;=YGHEaL(miqpCa(
z+m4<q06T!~z#y<0C;??)9JqiohGF#2kyooc0gp9!edx@-vgQtYrP3RPHP4aj?ZMCZ
zSPLQ$g%ORpDz(Ym)TZao11B$jwd=%F4AQIzfT7;vietr18%<YF7mWbs7c^nL0jT0x
zLoV;r+hd`6kJ|OC+MI8Gi86fg>)kh(8nngxfX|=Z^!(xFYx@Z!rBZR!=9Oj)Su3;=
ztHm=Q3O3`@lXXNl{-9Z{A4mD<(l@WACYBb8CVcOKc;7%jb5+OGWXN2_5rj&n+2Dsa
z9lsyx;j>+NtO|(Yp_nM5R#)gB#Q63wqC<4RCfOf3cPJ>X`gD2!8fIrA%6CG-KtO~b
zbO3BwS0t0ov3qMb)<P6J5J_mo5iEpc242R6jiWETd-hOju<iYGUBH2r>o=HMHD=~s
z2u?7Pkem?!MlVMI{4yS(VNAwo8e{YU9S$F_xWS@&V9Pr{7XbW?Uj6NIaotXn$uT>*
zuqY0IS^SAojSR<5%>barf&tHHD@H-VU_e6r(nji2<2!x7dk1jZUWxKsdsnTdG93^%
z9f*P|h!Dq;2o<v0F%|8swe??H6iDbWx#gg`9l%#*@Im&qsUQi&0Bt>i^(*1*k+pQ<
zr4MhQzQ<A+48}$Hh1E!TVi3T3B7-irNZPcNWKsUQE$sT@HjPLCxO6uLX!WSGf>uS&
z;pLa3s+$3PCz_9fR>KUarum>KIje|^37nA2SW<`rq~)fS8}KqYaFhUi5iJL`<|;&5
zeKik1D2i2sDmW6P6{IkLw0dqpnjxxM2Jn|5K~$?_#7_=E(T87k5Q8X4`(7LaurwFc
zfCV={1ES*qc0M*|;(DbeBnjJ7kxq#!E;()+xWyQ^v=4&85LWJh$OQn4$XHmL##)aw
zSOpS81t+NJ;w2rBju?@SYlEv*Kp6wDmrv|Dop;TvQEe8ZbX1WNiG^6eX=e{y`#hz^
zQlA{h^YiCbbriq?R73mm!t{jDet|j+T;wSA2)V3H2gd~wanv4XO=uKcBOoYGh^n5v
zdS-t$HTe76y(f$^QoDN%1L;FyB)r&fIQU9|dzFZrcLOZK2YXi1n^h!kC4zz&=KlE=
z>n|I*_T&C^`S`S;s>2#KR#d019PTZx$5=zwD7VV+$#=7a(R4aFxr|NBJq*Tp#9>VJ
z`fnIA$BpXn6F1tXecunD45`FNyPsKS^MxYfB1D8v7-O)W2gav9eT#*e39)|n2rzu@
zr?+nY=T6?R_tYWa0OEG$mi3YC?!(V@W4#O#hlI^K!TdB~eHQC=B|G`P@Kbm4qb7S!
w6;R!QvK?avQGN8Q0>*&R`{Gaks`x+gFOp@=1y=ZI)c^nh07*qoM6N<$f{t%AlmGw#

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/global/icons/information-32-XP.png b/toolkit/themes/windows/global/icons/information-32-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..b5ff69315b778365ea2d1ee5c706001152aa4897
GIT binary patch
literal 1547
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

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/global/icons/question-16-XP.png b/toolkit/themes/windows/global/icons/question-16-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..3f8c2c73f0e8bdfcbd4043d38bd6a8ced57a63b0
GIT binary patch
literal 799
zcmV+)1K|9LP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0008!Nkl<Zc-n1K
zT}V?=0RGOo_ij_?Hk;Z~v#e4P2+&qUDAki;fkjx91wj!Y2~t8pL4ZJkgkcI{859&!
zM!r>&YS~LDQB;t)u*Rlq)BSJm{+-T-2;n|BoCD|kJBM=!V+`3~G#73(*c_Wc2$4gJ
zzEsrj&Bj}2V6QpYRDQUv!&KpPs*=s3GXjzd#a4cQ{^EVx-@E+n%}`bYLJh{MmYcnf
z#`cSWgb7L_j*?szk^n3uM94xeEJhW9@&2Jd!`ClqN-_)%5v!;=)%Bpb@oKBb6GnAG
z3^$rh*uB*ZDp1V%WZWJPV{BeP!GVsGjF@bMkRv=?%`~u8I1lZ*Hu}yVP#{3X%kz1t
zEU{qPts<!~)NhmEk19Ai5JFfcFc^$*^);P|x!yme;3%m-cR9gpLRC?g&tS>R#n@~L
zrw9FL8SrCbHi@Eq2~|bhKBWMRz*>8@jklnpAer)OJ16$b@dPAjSPTJ8y*{Wqpvw$S
zhlU-61aTGc1r<n42T}=`%j@ch!MvG@IksYmRvQ!<MAN{yQckISXsEWU=x;4V*#;AO
zM??6vn1Tcygg2E8W}{%VmWtqxnyi3`I?`(pKmZ^sIxaL=QD)CW_v;`Yjt7xzpgaTs
z1E6IVj4FwsPYEq7Q6Sx5twn*6VQ-}ku4RVD6U)e<3{=;-Q0FtCM*K-F5%f}BQ(~c?
zlam4wGh$B2%o=adJ>tWy=N@jTK}fe-4WOJGaZOD#E$OD<@Xb8Avl8&=6m+eH1P!%Y
z1UR>gFp_lSsu%=HIDn;@M?H)&uHld)?oXZ%J@=ps5I~{H8XOji;|&fRt9QU^BAFJM
z04BjZ)i*2$=U)B)lnD{7JDa=8>#ua0Y$cQ{(CD-xmeeu%H3C62AQk-!_s6?~!SByH
zxGs|QGfC#shQgW??Uu4V`&6;OPPsGH!l9^VdM5DW#eF$EKeFyKWdqmQiJ0dAK$#l%
dbKYV$-ao%`ceau{VO#(J002ovPDHLkV1mO_W-$N&

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/global/icons/question-64-XP.png b/toolkit/themes/windows/global/icons/question-64-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..ed4263f1896e72b7aa92adec6e592a0b661fca91
GIT binary patch
literal 4067
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
VqDFRT%NPIv002ovPDHLkV1oSnwf_JB

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/global/icons/sslWarning-XP.png b/toolkit/themes/windows/global/icons/sslWarning-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..6e2c36d9054cb561fb1d2b362f473367d5b80516
GIT binary patch
literal 3638
zcmV-64$1L}P)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF000gBNkl<ZcwXh2
z3$$Eib;p0-dClCLn|ChPkS762l?q5u$|```&;ko7#qdT;(nW+Im=b^`)MYRgY$3Fe
z0)-k1vTAr$1hh*m1=6Yrp(rW}6#@wo^CE%V+<BgJb`R%UoxNtAIWu!-Wu@4DYwdL=
zbHB{D_kZvG-}~D$23=frMuBVZtGWXN173fBzgs92oMah(i&qpyQmIsAWMm{Rm&+j#
ziAaoHc<6F~DUW`2%*qM-IOq0H2yy)w1JDWrlk<<<t$SYtKp?CMBRhPyZ*tZ=^knTy
zW6WkClw^6>WiC6lF!+h1{qM~>bnL-XX3wQKb{dZB?@jGH!)JO!APz&yyWV8$D=(c@
z>>oaOS4mEO_?ht6K+VH0@94w58)qIe_TXv1dlZHK2^bS0>;S4g`PS?e;JS~*pl?DV
zM-qoWJm`!a@n0tZoNtVYJir7&P?$L6oIN;uZfZR2K;joch5_k4{0#rg;OQ~O7=r#W
zOq?;9!T0U{6mS_(P66<JztBI<qcAWP*o{R02~rsq`udi>iRA8Y3#>@*Bw}(m3yw34
z=Y{x1126!1DFCkPdXDd493SGBA+FHXlB{xqwAtSgyspnt8O8a4aT*a80B#CEvTUs*
zCXU|%k<KXREBD?7Prw+#s0)nO6n7FqTx}VhYyYFh>l-3AY>Yal!t9wYhtKo*;0L_-
z9C#8pYwfB1fJiD5OXh%QpQ}?YOK0yu3KYNxf5*!W(Jfnri<Xx8{tsgcg$QH7a}D)S
zT5^KxfB^M6yz`DQ^43H!y;Q~K0QZ^?l2ni^%H@(OHe<TW=?e<<_qEnw#aBmC5JV(5
zM27|qS6@-&lrwg)X_Ey&39z$B+l}3mvy=HiQ6bjXpz_AABUb)xiD#azgV2?TNJb7l
z*l^u7156li5b54{Q2ly3AIU}l0yH8(auGl8+&=FA=L)5=@Yv&3o`0dvnG1>}MkvaH
zK0B<lPAeobIO?(|BE6BLw2lB3X&nU`x(>@O>F0>UeE_y?i&=GBi7i{=CWKRw?j?I>
z4-$9qe4KS~a}|Kx2tYu20*?EHpM<c>y$@DXQhNHCI;WgeXxdBM*_*%FES$5b!jFF%
z<2VsfBpB1&6*|VM6vYrl05H5|{OBu-v?D>u4_*CRb3_bIcKFy)J`aDV#;dO>>2*s~
z<uZKXOYf#pEqPs|)pBg(LKL+rZFI|=S)IIQ3J@?I6qjbt&YA6kK(#7a042X29x1`q
z*HroDBQ>hkTEkcioP8a~_O&qzh6q@ZQFo3a%5_-|5Z#r}qS@T`To44u(7cEC`CSa)
zilqV1t?lQ@?~Laohj|TSMXbj~R6I}BL%lgFA$<b*DWH+io<%b)X4|JAEkk?i5P-w<
zX$}X>aas3#2&nh%vacO=6(5=Bb*wPi$kS#o!vX4ei&8efvLx8do$8IO5}iZTcVX`P
z3qaN8IvNR%V+9nHgm(~;9-5!5PEOa&1y(90LBlz3|L8*0afDBw>GJzWcuf)Fx(ad_
z0>B|3^0;7Ov6tpcg_aRuEotdVtTJIJ+<Zs5CCc?0eC7Ib!?QD|J0RVM=+u1-x869w
zm;b87cOS1aQfl7d`*6bifX^*1GWC5%b<FpC{<)(rgTSoBpjTgyI^VwqX3cP!cZiFO
z@>>1={Tx>Q<rq#puFkg~tMT^RwkIeS;SWC^@W~VWgf|?B(M9(+L(y{A{xXzRoCJN3
zJO3%BWIe--X$}ic4)8p~^{dJRzTxtVi_Hqj=!X}Bli|!${Zw*V;NGv*0+K_5?O7fe
zH(*%$*#eJzx6aRh8S%!OF@JMgh55&N4P&~!p>5r2Soag*XTOZO@z#(iYHp%LBz-S#
zlmeaWd7hU(cdj3!pSK+*jE5lT2!NH=9H1K{766Q7N75(%k<W)e<nrJnc0Ta<Q=u}n
zboR)<{kw4c-4WmaQH@>0Rk~XW%%lks%dadp&e}Z!U%WPA=i4z${><f=BOM$k$Nshv
zpyjM}{Z^xxKK0#b2>92vA?to@0Vo7YOnKnlbcb;FePPlzmxv<Kdaq?KecJc60Wv^6
zgmGgH%PuPL>C=OTAuDec9(cG)wOZws^)6rd^J0>kehvaAp9HlB$j{wfyWrWMz}xQ#
z`^|#+M|&K4kjtZw)sx&cx&3(*!JXeA0ie#-Z6!PX@$CDqtMxt%L931$4tD>Ng#{L!
z9W>6lYt6gSWQ_-S`IU&<@2axkldS<z?@Mk3<dWddci@hDgulD9&hT(8DRU$W6*=cq
z9t+R%+4h#?_UGUF7r5aTYrOA4EY?_Ktf!4>(f<Q68Xc#c;Irr)pF&`DeEz4f>T6+g
z6RkAe6Mpq-g#O1|e#-$sC9{6?9DMzLd!XyW>l<Ok$}%s$<Z;=B#iaBZkSw$R>?K%v
zTg0Z#B`m-i_BP}d08oi_AG2pTT(z{A^a>6LY}p2Xab27kTf#<*0=a#MbwrknTDQWE
z+AobXkgTL1yls0G0Amqnc(){=)LDF4DFG;^UQ+-`y#d$VBne1mRn!`d>uSD>WPx!E
z0BLGndO?8$_Ol#QsR%1>jFa;!&75Pvb#(HZGbB;t^KXN#WyVyPG*JME{)eDkYrxab
zMVx)%2&>oBs8%gt<w^q1gTiA^R?>3jrCzeK&t$`?C;Idi4N;`mUC{P7j9~15;qoPg
zB+Yz?tzoNH3->-$qh7D$xf(sLTGH+|m>U85#~k_Sp>X9zMP}^lsK?T$hTiqJRQdAC
zYSJSJ_dEdiKVlU%rnvz-alXg03j)UUYpQA<>*eRTV_i-@-otfL9g-3X|F|Zyq^FM1
zD|Fm;tfz+OcY<I<T5>?KApGfRE(h*c;M!F+ey}bgj%^f#Hvdv0yydPMPy8Tc<C~JE
zh*kmsIO?M=pIaEP|11a3)qJ;Mtb30;#$)-i0#gSqdOv>|mamKwa7(zZ-QzgA-$p~5
zNt75(kJe*xEneASrOJ`>Ty9=b;G*+<rc5$~5rC$I2)y`moEq<YswBXHa~!U|Bw)@=
zo6p8k{9Om4$jbD64WB>XXGZcwY^S&U21z>5GOnBD3fI+nVTJ=FJMk7IF9obS^s3uB
zpJq=teCg7Ft1b?hJkcn~D6x5|QaaEanqs(gagYLtkcw*)mpE3ZOqyW0;=+L6JIuuZ
zVI<ss53GH<W?N%DBYoO4lvsgW=c(k*1M>1GE3Scsr+civp};XmxQ)T3h~}d)mdtz)
z&OgUbh|kSLmnA+8<HhItEI7%-a{z${9)&yaty8PjY~^U46a$%Or+GkrA0Pm_sjGEt
zV*Kps4mYi?asRiY^d7HsJpedqzQ<=4c=)cOucC^db&AKLGd%iivy<?Q;riQRcI>QV
zhNT#kj4db`0P<I-c|hF#_w#}<b6>dT(tv%3>iol+Fv(dx{fG}cNvilvnV2OfV|3It
zcYlXvivtEH8W4DGBYfp%Vf}`3BjiCtK2#C}z_A>X9owlWzvbQqvJ;`Mr!E8i@cBhP
zhaKeb^>2o}{)TYCY{Qbz`0PK^WIckC*{o@X%RlR<K#B;ZGOW7GVciQAKycM~>-7{6
z3q&OL8OItOVk0Dfq>qfc70$Mm*-fdUA3M@XBtRsuEGc+VZ08JDF7Y|_c(-xx>iZ1e
z_*R`T3>!peOJ=jz!$<?xvHRLZfc65pQ(?U`=ZwU={{qthNIUSX0jHhha^lBzeD>ti
zhPxk>wAry_N2cj9D9M6-it>PZ+GM$g91_$WdGi3e=7p}o`{VhBOV0Bc+Ybo5y3ugm
zttQF)5hYSl!$3PwKmk##J4ArVp9s+dgXVzHHF#HC0F%apy*t1y_c*-pi>i7H+P+3Z
zzhxE3-UhYN%cel{U4UMf!E_DYq;U#%F@WWlM66iqVT{)tkg5)Sea%J<&8t{mP;i<_
zP`Vn6XOYWaoyoD+HMZaM@C#9GiH%VXv-5$RGDvPCq)`C9=J(zOuTTimE-{u|FL#ar
zWk`K?pWnTc<D5ST((AJA@q1hKdac0&z6bTN4GHEpLJCdWR@h+nBsr$WS1J{HU*I}g
z6~d@}1V~#B(9)96qU=#}Y<OOcP@|$)pQb6_b$=Y|P)3PRz1;Hr{4yw=yFvDJejC6V
zq4xsoNw>)$ofa9r2c)6~g0$fPX`XfD{zS%#x+4oj=lt$LbgJt(sApp}Ttvs{3XFDw
zs<J9AlF_M$v3L*p-931QLV#XuVl_xXQRDUJGWH4j<w_XojKB!3x>-#R$Z3SSDua8D
z95+4@1D<*_2YZp6zFyDA7_0z}$@`!^5drLZay07oyiHjUOeWOy_8I3yo`7V3A7I(o
zdO>-h_x#?g;Em=tN!Gq7+XqM(h7wj|qI#%hu=o6a&w?j0L?OhHG%WA{l2$Sv*%`5W
z`)2wI1&}(@bAG=!!4rXc4a&QPY6*ZCh&@1}D5`JT#6y#R@vA=>nq8z2SZ2j!mB+Nv
zTcGRBSwQl^Gx>WB?Z7l3`YW^H9m3Ad!iG)qJ)i<a9w0#VYfrJ_;$rQfTB&y6geiug
z4;=lrr8hA$syk9|oAU_|q%obYjKIz<u>QYz?eCxBCSVw-8|4DVe_)8Y3y<cDGlw|d
zFMx4617Hk$f0^z#h;68-mSO#y^28l$xp~7*UIKmt>^A5MfN{VSU=lC}u!->7y~GNk
z^*V1^VYi5c&6O2Apa}E<!T%uuumDg6N<dXaA^;;I{C{5m4gACnLO`U@hyVZp07*qo
IM6N<$g1Wc~b^rhX

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/global/icons/warning-16-XP.png b/toolkit/themes/windows/global/icons/warning-16-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..7471cfe84aa0e3a51761685f7e7126c6902bb768
GIT binary patch
literal 524
zcmV+n0`vWeP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0005gNkl<Zc-mw9
z|NlP&C4dD)EGyx}CMRI*t8)MQr(X{Z{cafn`Tx)rfGh_az|M}TTUJ-1U)k)h!0+!r
z1UB_bq+C7sb`~~Um~gnvK*5MF;mW1A49{QwV9+pS=>m!gV^hcoa>m964irIo1KIum
zM1MMj#DX2jaOL=ShGXmgwO=~%zN&c9Zxk<Jb3uT-E~|r-$QK3{78V93CME{Pf4>-1
z4OuIJa;jLp@bbZLFlJ+CV^B7g>t|(o#lXY<kAa=-F9RpXe}=!m|1t<meq%6m5bg)L
z8ebUH%cwIb{Qdcp;ot9n3_=2b!T8^=e?a~p1|>ZP?>X5luDA>kP&O4W`2X`MSo7as
ze;K%dK?A}N1O72^aeZdcwG`|{)(443Rt5$cExvvc$!`K6#V}Bp{SHinG{XZ}<FC%L
za_*GtSHI0dc7cJSK7YcWFR#HigADoj;XgxSr4$&0#K7V}gP8w+WzaBShes>e068tL
zdLEun5T^n$DA2fA|1gM)Fo7}53owHu<$m(3sW7I&z3}Skmm3VH880)!!WT+6M&AI_
z*Dphbp$h)|`p)p^#s9bPganiTxr75fitqqX4*UVs`;U>*+{na0ApihIA<f@?vM751
O0000<MNUMnLSTXg-tQIw

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/global/icons/warning-64-XP.png b/toolkit/themes/windows/global/icons/warning-64-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..2704dae556bb51ac0d397eb9289016c57b99f926
GIT binary patch
literal 3381
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
LNkvXXu0mjfB%4G+

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/global/icons/warning-large-XP.png b/toolkit/themes/windows/global/icons/warning-large-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..83da48917d37ca73392806d4403c5a9deed58274
GIT binary patch
literal 2049
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

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/global/icons/windowControls-XP.png b/toolkit/themes/windows/global/icons/windowControls-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..dbaa3466387f6390bf272f044974ad457494cbb0
GIT binary patch
literal 1381
zcmV-r1)BPaP)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm000FnNkl<ZcwX(9
z-ES0S6vq1>s1czeV8MPZZDE_zQd+E7AQp@CW7`6B`>}=Hp|)wbXfY&KgPVwe2?Yuj
z1~CwY?UxuU5gG|3T!5rh^#T*$XsccpE_#76(fIg2#7QR0`wo+oi5t_C{Bm-h^PFVP
z?q-vdN&2tj+^TgxNmL@-LO<t{5+Ob=TpRs)SLZZ(df*oNIhPO%oGEx&{C(g6$arTL
zhQkIkYdGng^K60C)D%-ky!Z5q67kpGy|~@cfuZIQ7|g7lbk2FUz>b!nsUzNN=B^fh
z?%s{Tt=nJ^)??v_Qm3DD-Yu{_Xab1DLp|Qxw``U8qrDxs8XD0bsDUk%HGTAR?y)bB
zmbTa=VYvXa9rnYD1&(GFi2I=s$c@@MoZq+!s-Vuk<>lOCUm(0AXzH-~@iT`q^Tf9~
zIj|VaUWUUGd$6W%_i^sAFAxc<e>&8g8tY8v_?d%gexZMO{Sus;!9R#@fd*5jTg$}v
z_ASW~-{<CH$nVFI<$l;gS<^>9=hP1&zh(`OULe8+-0LKovQ*s3&qr@=9_+#TLf#6c
zPCw_A3jm1dc=Q5|reOphg1T<z?S&aa6c=M;Wg+_V3&3Dz?WA)qY34EW<=>p2Dt=qP
z9^~>%YjCP~H8X2C>6}YSgxHh3Bzm*5X8QMCyWkf3IhPO%?4FzAlSC!LE%bBFT40vh
zd*GdSr!hPXx6q$h_dqNLGJf!V48O65nKc}AZ|{NR<T<7W^*wO*EN<_64?~?@U@)_G
z(7n9}0@dZF2K7B~{5S^NJ75piW8H5lb^1NM2WkT4%6ovi@*dc~AGbO?(I1Y$7Rs7F
z`Z?#pPiL-4Y62S{WIOCrSKb5N-5@t!Z^QY9Ca8is`<B;}d!SZ6pbo3Ax(Du*l)&Ob
zQ4xAq7Q!B^soQ+s+yk{W8<qC}^~#D@OlH+RpnrJ%5}cdCKZt$-jqZ34{IGT{K9dU^
zD=LO9lr??yYwrPmQW|Emfa5*zV_6ycUMzt<SdWyJDs}ojxd-ZMUo)#J%N~Nd(>?H0
zRTVClZNQ1rbzm^FcF+^+9{9DP0pxOZHBP-+&deGPdV<{pJ9bXr@9BYCq<{7vn8l)f
zvCk)oN`!kJ_!HwBXiLeA4%Tg*{-&!7ZlRxZ39&%y^BH1X9_r*$#6YY$#LOB_I_JE6
zKVayH_wHPjE^fEB;>%D7vHE&UUB8b0U=X7%E%>gjjhQud_UQxtob&SifT1Ja8(Ekt
z#+sXPK2VFPt5<RN+BMvh4A*VOSM@<=*3{Xj5A<`+%l89@TYdY27sS_FwqT?>fODHF
zFm>e$?)}SfRW&oA&OUvhpL1TkA23K*F2HPu{jg$z(EP>XMnwh47v<%Mm2JS?(NWy9
z!J0bzmX~v0ydN-hSpE2!rsNdSpOywPBsratfg>52n2g2nOMgEzYwGO7@^a3L_XCDb
zm+uD*RX;dyk+lF$rl;eueAtOt43jokQ)l1ua&89yAlml>hLf&h+cOKqKxQUR_<T6z
zTZ##O>SSO5y-Ty0SyN}9KG4rO-TMJUhl}?EhLf&h^PK0zr&(F($;!rreAtP>K}<@H
zW#{0GgqbyU_UWTv&Ux??iZmLA5qt>h+9T-cXT|4!KR#OS$5F}T&=7iMJ|ne@xw*`&
zsk2WX=;vHgB1GV+WO1pm5ag4BmG~gPfSEO%bj~Hj0##4Wi+;GKboyp}J={V+=MrLp
n$|vUfBvFZQ&jbJe;~w}2iMKM*1m7;M00000NkvXXu0mjfA5ykM

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/global/jar.mn b/toolkit/themes/windows/global/jar.mn
index 75f4cc650..8e76d6354 100644
--- a/toolkit/themes/windows/global/jar.mn
+++ b/toolkit/themes/windows/global/jar.mn
@@ -45,10 +45,10 @@ toolkit.jar:
   skin/classic/global/icons/autocomplete-search.svg        (icons/autocomplete-search.svg)
   skin/classic/global/icons/blacklist_favicon.png          (icons/blacklist_favicon.png)
   skin/classic/global/icons/blacklist_large.png            (icons/blacklist_large.png)
-  skin/classic/global/icons/close-win7.png                 (icons/close-win7.png)
-  skin/classic/global/icons/close-win7@2x.png              (icons/close-win7@2x.png)
-  skin/classic/global/icons/close-inverted-win7.png        (icons/close-inverted-win7.png)
-  skin/classic/global/icons/close-inverted-win7@2x.png     (icons/close-inverted-win7@2x.png)
+  skin/classic/global/icons/close-XPVista7.png             (icons/close-XPVista7.png)
+  skin/classic/global/icons/close-XPVista7@2x.png          (icons/close-XPVista7@2x.png)
+  skin/classic/global/icons/close-inverted-XPVista7.png    (icons/close-inverted-XPVista7.png)
+  skin/classic/global/icons/close-inverted-XPVista7@2x.png (icons/close-inverted-XPVista7@2x.png)
   skin/classic/global/icons/find.png                       (icons/find.png)
   skin/classic/global/icons/loading_16.png                 (icons/loading_16.png)
   skin/classic/global/icons/notloading_16.png              (icons/notloading_16.png)
@@ -58,26 +58,92 @@ toolkit.jar:
 * skin/classic/global/in-content/info-pages.css            (in-content/info-pages.css)
   skin/classic/global/toolbar/spring.png                   (toolbar/spring.png)
 
-  skin/classic/global/icons/autoscroll.png                 (icons/autoscroll.png)
-  skin/classic/global/tree/twisty.svg                      (tree/twisty.svg)
-  skin/classic/global/tree/twisty-preWin10.svg             (tree/twisty-preWin10.svg)
+  skin/classic/global/dirListing/folder-XP.png                   (dirListing/folder-XP.png)
+  skin/classic/global/dirListing/local-XP.png                    (dirListing/local-XP.png)
+  skin/classic/global/dirListing/remote-XP.png                   (dirListing/remote-XP.png)
+  skin/classic/global/dirListing/up-XP.png                       (dirListing/up-XP.png)
+  skin/classic/global/icons/autoscroll.png                       (icons/autoscroll.png)
+  skin/classic/global/icons/autoscroll-XP.png                    (icons/autoscroll-XP.png)
+  skin/classic/global/icons/blacklist_favicon-XP.png             (icons/blacklist_favicon-XP.png)
+  skin/classic/global/icons/blacklist_large-XP.png               (icons/blacklist_large-XP.png)
+  skin/classic/global/icons/Error-XP.png                         (icons/Error-XP.png)
+  skin/classic/global/icons/error-16-XP.png                      (icons/error-16-XP.png)
+  skin/classic/global/icons/error-64-XP.png                      (icons/error-64-XP.png)
+  skin/classic/global/icons/folder-item-XP.png                   (icons/folder-item-XP.png)
+  skin/classic/global/icons/information-16-XP.png                (icons/information-16-XP.png)
+  skin/classic/global/icons/information-24-XP.png                (icons/information-24-XP.png)
+  skin/classic/global/icons/information-32-XP.png                (icons/information-32-XP.png)
+  skin/classic/global/icons/Print-preview-XP.png                 (icons/Print-preview-XP.png)
+  skin/classic/global/icons/Portrait-XP.png                      (icons/Portrait-XP.png)
+  skin/classic/global/icons/Landscape-XP.png                     (icons/Landscape-XP.png)
+  skin/classic/global/icons/Question-XP.png                      (icons/Question-XP.png)
+  skin/classic/global/icons/question-16-XP.png                   (icons/question-16-XP.png)
+  skin/classic/global/icons/question-64-XP.png                   (icons/question-64-XP.png)
+  skin/classic/global/icons/Search-close-XP.png                  (icons/Search-close-XP.png)
+  skin/classic/global/icons/Search-glass-XP.png                  (icons/Search-glass-XP.png)
+  skin/classic/global/icons/sslWarning-XP.png                    (icons/sslWarning-XP.png)
+  skin/classic/global/icons/Warning-XP.png                       (icons/Warning-XP.png)
+  skin/classic/global/icons/warning-large-XP.png                 (icons/warning-large-XP.png)
+  skin/classic/global/icons/warning-16-XP.png                    (icons/warning-16-XP.png)
+  skin/classic/global/icons/warning-64-XP.png                    (icons/warning-64-XP.png)
+  skin/classic/global/icons/windowControls-XP.png                (icons/windowControls-XP.png)
+  skin/classic/global/toolbar/spring-XP.png                      (toolbar/spring-XP.png)
+  skin/classic/global/tree/sort-asc-XP.png                       (tree/sort-asc-XP.png)
+  skin/classic/global/tree/sort-dsc-XP.png                       (tree/sort-dsc-XP.png)
+  skin/classic/global/tree/twisty.svg                            (tree/twisty.svg)
+  skin/classic/global/tree/twisty-XP.svg                         (tree/twisty-XP.svg)
+  skin/classic/global/tree/twisty-Vista78.svg                    (tree/twisty-Vista78.svg)
 
 #ifdef MOZ_PHOENIX
 [browser/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}] chrome.jar:
 #elif MOZ_SEPARATE_MANIFEST_FOR_THEME_OVERRIDES
 [extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}] chrome.jar:
 #endif
+% override chrome://global/skin/dirListing/folder.png             chrome://global/skin/dirListing/folder-XP.png            osversion<6
+% override chrome://global/skin/dirListing/local.png              chrome://global/skin/dirListing/local-XP.png             osversion<6
+% override chrome://global/skin/dirListing/remote.png             chrome://global/skin/dirListing/remote-XP.png            osversion<6
+% override chrome://global/skin/dirListing/up.png                 chrome://global/skin/dirListing/up-XP.png                osversion<6
+% override chrome://global/skin/icons/autoscroll.png              chrome://global/skin/icons/autoscroll-XP.png             osversion<6
+% override chrome://global/skin/icons/blacklist_favicon.png       chrome://global/skin/icons/blacklist_favicon-XP.png      osversion<6
+% override chrome://global/skin/icons/blacklist_large.png         chrome://global/skin/icons/blacklist_large-XP.png        osversion<6
+% override chrome://global/skin/icons/Error.png                   chrome://global/skin/icons/Error-XP.png                  osversion<6
+% override chrome://global/skin/icons/error-16.png                chrome://global/skin/icons/error-16-XP.png               osversion<6
+% override chrome://global/skin/icons/error-64.png                chrome://global/skin/icons/error-64-XP.png               osversion<6
+% override chrome://global/skin/icons/folder-item.png             chrome://global/skin/icons/folder-item-XP.png            osversion<6
+% override chrome://global/skin/icons/information-16.png          chrome://global/skin/icons/information-16-XP.png         osversion<6
+% override chrome://global/skin/icons/information-24.png          chrome://global/skin/icons/information-24-XP.png         osversion<6
+% override chrome://global/skin/icons/information-32.png          chrome://global/skin/icons/information-32-XP.png         osversion<6
+% override chrome://global/skin/icons/Print-preview.png           chrome://global/skin/icons/Print-preview-XP.png          osversion<6
+% override chrome://global/skin/icons/Portrait.png                chrome://global/skin/icons/Portrait-XP.png               osversion<6
+% override chrome://global/skin/icons/Landscape.png               chrome://global/skin/icons/Landscape-XP.png              osversion<6
+% override chrome://global/skin/icons/Question.png                chrome://global/skin/icons/Question-XP.png               osversion<6
+% override chrome://global/skin/icons/question-16.png             chrome://global/skin/icons/question-16-XP.png            osversion<6
+% override chrome://global/skin/icons/question-64.png             chrome://global/skin/icons/question-64-XP.png            osversion<6
+% override chrome://global/skin/icons/Search-close.png            chrome://global/skin/icons/Search-close-XP.png           osversion<6
+% override chrome://global/skin/icons/Search-glass.png            chrome://global/skin/icons/Search-glass-XP.png           osversion<6
+% override chrome://global/skin/icons/sslWarning.png              chrome://global/skin/icons/sslWarning-XP.png             osversion<6
+% override chrome://global/skin/icons/Warning.png                 chrome://global/skin/icons/Warning-XP.png                osversion<6
+% override chrome://global/skin/icons/warning-large.png           chrome://global/skin/icons/warning-large-XP.png          osversion<6
+% override chrome://global/skin/icons/warning-16.png              chrome://global/skin/icons/warning-16-XP.png             osversion<6
+% override chrome://global/skin/icons/warning-64.png              chrome://global/skin/icons/warning-64-XP.png             osversion<6
+% override chrome://global/skin/icons/windowControls.png          chrome://global/skin/icons/windowControls-XP.png         osversion<6
+% override chrome://global/skin/toolbar/spring.png                chrome://global/skin/toolbar/spring-XP.png               osversion<6
+% override chrome://global/skin/tree/sort-asc.png                 chrome://global/skin/tree/sort-asc-XP.png                osversion<6
+% override chrome://global/skin/tree/sort-dsc.png                 chrome://global/skin/tree/sort-dsc-XP.png                osversion<6
 
-% override chrome://global/skin/icons/close.png                   chrome://global/skin/icons/close-win7.png            osversion<=6.1
-% override chrome://global/skin/icons/close@2x.png                chrome://global/skin/icons/close-win7@2x.png         osversion<=6.1
-% override chrome://global/skin/icons/close-inverted.png          chrome://global/skin/icons/close-inverted-win7.png   osversion<=6.1
-% override chrome://global/skin/icons/close-inverted@2x.png       chrome://global/skin/icons/close-inverted-win7@2x.png osversion<=6.1
+% override chrome://global/skin/icons/close.png                   chrome://global/skin/icons/close-XPVista7.png            osversion<=6.1
+% override chrome://global/skin/icons/close@2x.png                chrome://global/skin/icons/close-XPVista7@2x.png         osversion<=6.1
+% override chrome://global/skin/icons/close-inverted.png          chrome://global/skin/icons/close-inverted-XPVista7.png   osversion<=6.1
+% override chrome://global/skin/icons/close-inverted@2x.png       chrome://global/skin/icons/close-inverted-XPVista7@2x.png osversion<=6.1
 
-% override chrome://global/skin/tree/twisty.svg#clsd              chrome://global/skin/tree/twisty-preWin10.svg#clsd           osversion<=6.3
-% override chrome://global/skin/tree/twisty.svg#clsd-rtl          chrome://global/skin/tree/twisty-preWin10.svg#clsd-rtl       osversion<=6.3
-% override chrome://global/skin/tree/twisty.svg#clsd-hover        chrome://global/skin/tree/twisty-preWin10.svg#clsd-hover     osversion<=6.3
-% override chrome://global/skin/tree/twisty.svg#clsd-hover-rtl    chrome://global/skin/tree/twisty-preWin10.svg#clsd-hover-rtl osversion<=6.3
-% override chrome://global/skin/tree/twisty.svg#open              chrome://global/skin/tree/twisty-preWin10.svg#open           osversion<=6.3
-% override chrome://global/skin/tree/twisty.svg#open-rtl          chrome://global/skin/tree/twisty-preWin10.svg#open-rtl       osversion<=6.3
-% override chrome://global/skin/tree/twisty.svg#open-hover        chrome://global/skin/tree/twisty-preWin10.svg#open-hover     osversion<=6.3
-% override chrome://global/skin/tree/twisty.svg#open-hover-rtl    chrome://global/skin/tree/twisty-preWin10.svg#open-hover-rtl osversion<=6.3
+% override chrome://global/skin/tree/twisty.svg#clsd              chrome://global/skin/tree/twisty-Vista78.svg#clsd           osversion<=6.3
+% override chrome://global/skin/tree/twisty.svg#clsd-rtl          chrome://global/skin/tree/twisty-Vista78.svg#clsd-rtl       osversion<=6.3
+% override chrome://global/skin/tree/twisty.svg#clsd-hover        chrome://global/skin/tree/twisty-Vista78.svg#clsd-hover     osversion<=6.3
+% override chrome://global/skin/tree/twisty.svg#clsd-hover-rtl    chrome://global/skin/tree/twisty-Vista78.svg#clsd-hover-rtl osversion<=6.3
+% override chrome://global/skin/tree/twisty.svg#open              chrome://global/skin/tree/twisty-Vista78.svg#open           osversion<=6.3
+% override chrome://global/skin/tree/twisty.svg#open-rtl          chrome://global/skin/tree/twisty-Vista78.svg#open-rtl       osversion<=6.3
+% override chrome://global/skin/tree/twisty.svg#open-hover        chrome://global/skin/tree/twisty-Vista78.svg#open-hover     osversion<=6.3
+% override chrome://global/skin/tree/twisty.svg#open-hover-rtl    chrome://global/skin/tree/twisty-Vista78.svg#open-hover-rtl osversion<=6.3
+# to be sure osversion<6 has always higher precedence than osversion<=6.3 we override twisty-Vista78.svg instead of twisty.svg
+% override chrome://global/skin/tree/twisty-Vista78.svg#clsd      chrome://global/skin/tree/twisty-XP.svg#clsd                osversion<6
+% override chrome://global/skin/tree/twisty-Vista78.svg#open      chrome://global/skin/tree/twisty-XP.svg#open                osversion<6
diff --git a/toolkit/themes/windows/global/listbox.css b/toolkit/themes/windows/global/listbox.css
index ddea3f8fa..fd60b1693 100644
--- a/toolkit/themes/windows/global/listbox.css
+++ b/toolkit/themes/windows/global/listbox.css
@@ -144,67 +144,70 @@ listheader[sortable="true"]:hover:active {
 }
 
 @media (-moz-windows-default-theme) {
-  listitem {
-    --listitem-selectedColor: rgb(217,217,217);
-    --listitem-selectedBorder: var(--listitem-selectedColor);
-    --listitem-selectedBottomBorder: rgb(204,204,204);
-    --listitem-selectedBackground: var(--listitem-selectedColor);
-    --listitem-selectedImage: none;
-    --listitem-selectedCurrentBorder: rgb(123,195,255);
-    --listitem-selectedFocusColor: rgb(205,232,255);
-    --listitem-selectedFocusBorder: var(--listitem-selectedFocusColor);
-    --listitem-selectedFocusBottomBorder: rgb(165,214,255);
-    --listitem-selectedFocusBackground: var(--listitem-selectedFocusColor);
-    --listitem-selectedFocusImage: none;
-    --listitem-selectedFocusCurrentBorder: var(--listitem-selectedFocusColor);
-    --listitem-selectedFocusCurrentBottomBorder: var(--listitem-selectedFocusBottomBorder);
-    --listitem-selectedFocusCurrentBackground: var(--listitem-selectedFocusColor);
-
-    color: -moz-FieldText;
-    margin-inline-start: 1px;
-    margin-inline-end: 1px;
-    padding-top: 1px;
-    padding-bottom: 1px;
-    border-width: 1px;
-    background-repeat: no-repeat;
-    background-size: 100% 100%;
-  }
+  @media not all and (-moz-os-version: windows-xp) {
+    listitem {
+      --listitem-selectedColor: rgb(217,217,217);
+      --listitem-selectedBorder: var(--listitem-selectedColor);
+      --listitem-selectedBottomBorder: rgb(204,204,204);
+      --listitem-selectedBackground: var(--listitem-selectedColor);
+      --listitem-selectedImage: none;
+      --listitem-selectedCurrentBorder: rgb(123,195,255);
+      --listitem-selectedFocusColor: rgb(205,232,255);
+      --listitem-selectedFocusBorder: var(--listitem-selectedFocusColor);
+      --listitem-selectedFocusBottomBorder: rgb(165,214,255);
+      --listitem-selectedFocusBackground: var(--listitem-selectedFocusColor);
+      --listitem-selectedFocusImage: none;
+      --listitem-selectedFocusCurrentBorder: var(--listitem-selectedFocusColor);
+      --listitem-selectedFocusCurrentBottomBorder: var(--listitem-selectedFocusBottomBorder);
+      --listitem-selectedFocusCurrentBackground: var(--listitem-selectedFocusColor);
+
+      color: -moz-FieldText;
+      margin-inline-start: 1px;
+      margin-inline-end: 1px;
+      padding-top: 1px;
+      padding-bottom: 1px;
+      border-width: 1px;
+      background-repeat: no-repeat;
+      background-size: 100% 100%;
+    }
 
-  listitem[selected="true"] {
-    border-top-color: var(--listitem-selectedBorder);
-    border-right-color: var(--listitem-selectedBorder);
-    border-left-color: var(--listitem-selectedBorder);
-    border-bottom-color: var(--listitem-selectedBottomBorder);
-    background-image: var(--listitem-selectedImage);
-    background-color: var(--listitem-selectedBackground);
-    color: -moz-DialogText;
-  }
+    listitem[selected="true"] {
+      border-top-color: var(--listitem-selectedBorder);
+      border-right-color: var(--listitem-selectedBorder);
+      border-left-color: var(--listitem-selectedBorder);
+      border-bottom-color: var(--listitem-selectedBottomBorder);
+      background-image: var(--listitem-selectedImage);
+      background-color: var(--listitem-selectedBackground);
+      color: -moz-DialogText;
+    }
 
-  listbox:focus > listitem[selected="true"] {
-    border-top-color: var(--listitem-selectedFocusBorder);
-    border-right-color: var(--listitem-selectedFocusBorder);
-    border-left-color: var(--listitem-selectedFocusBorder);
-    border-bottom-color: var(--listitem-selectedFocusBottomBorder);
-    background-image: var(--listitem-selectedFocusImage);
-    background-color: var(--listitem-selectedFocusBackground);
-    color: -moz-DialogText;
-  }
+    listbox:focus > listitem[selected="true"] {
+      border-top-color: var(--listitem-selectedFocusBorder);
+      border-right-color: var(--listitem-selectedFocusBorder);
+      border-left-color: var(--listitem-selectedFocusBorder);
+      border-bottom-color: var(--listitem-selectedFocusBottomBorder);
+      background-image: var(--listitem-selectedFocusImage);
+      background-color: var(--listitem-selectedFocusBackground);
+      color: -moz-DialogText;
+    }
 
-  listbox:focus > listitem[current="true"] {
-    border-color: var(--listitem-selectedCurrentBorder);
-    outline: none;
-  }
+    listbox:focus > listitem[current="true"] {
+      border-color: var(--listitem-selectedCurrentBorder);
+      outline: none;
+    }
 
-  listbox:focus > listitem[selected="true"][current="true"] {
-    border-top-color: var(--listitem-selectedFocusCurrentBorder);
-    border-right-color: var(--listitem-selectedFocusCurrentBorder);
-    border-left-color: var(--listitem-selectedFocusCurrentBorder);
-    border-bottom-color: var(--listitem-selectedFocusCurrentBottomBorder);
-    background-color: var(--listitem-selectedFocusCurrentBackground);
-    outline: none;
+    listbox:focus > listitem[selected="true"][current="true"] {
+      border-top-color: var(--listitem-selectedFocusCurrentBorder);
+      border-right-color: var(--listitem-selectedFocusCurrentBorder);
+      border-left-color: var(--listitem-selectedFocusCurrentBorder);
+      border-bottom-color: var(--listitem-selectedFocusCurrentBottomBorder);
+      background-color: var(--listitem-selectedFocusCurrentBackground);
+      outline: none;
+    }
   }
 
-  @media (-moz-os-version: windows-win7) {
+  @media (-moz-os-version: windows-vista),
+         (-moz-os-version: windows-win7) {
     listitem {
       --listitem-selectedBottomBorder: var(--listitem-selectedColor);
       --listitem-selectedBackground: rgba(190,190,190,.15);
diff --git a/toolkit/themes/windows/global/menu.css b/toolkit/themes/windows/global/menu.css
index c22aedd7a..2a228251d 100644
--- a/toolkit/themes/windows/global/menu.css
+++ b/toolkit/themes/windows/global/menu.css
@@ -148,13 +148,15 @@ menubar > menu:-moz-lwtheme[_moz-menuactive="true"]:not([disabled="true"]) {
 }
 
 @media (-moz-windows-default-theme) {
-  menubar > menu:-moz-lwtheme {
-    -moz-appearance: menuitem;
-  }
-
-  menubar > menu:-moz-lwtheme[_moz-menuactive="true"]:not([disabled="true"]) {
-    color: inherit !important;
-    text-shadow: inherit;
+  @media not all and (-moz-os-version: windows-xp) {
+    menubar > menu:-moz-lwtheme {
+      -moz-appearance: menuitem;
+    }
+
+    menubar > menu:-moz-lwtheme[_moz-menuactive="true"]:not([disabled="true"]) {
+      color: inherit !important;
+      text-shadow: inherit;
+    }
   }
 }
 
diff --git a/toolkit/themes/windows/global/menulist.css b/toolkit/themes/windows/global/menulist.css
index de24dbdde..9480bffda 100644
--- a/toolkit/themes/windows/global/menulist.css
+++ b/toolkit/themes/windows/global/menulist.css
@@ -82,6 +82,12 @@ menulist:-moz-focusring:not([open="true"]) > .menulist-label-box {
   border: 1px dotted ThreeDDarkShadow;
 }
 
+@media (-moz-os-version: windows-xp) {
+  menulist:-moz-focusring:not([open="true"]) > .menulist-label-box {
+    border: 1px dotted #F5DB95;
+  }
+}
+
 /* ..... disabled state ..... */
 
 menulist[disabled="true"] {
@@ -107,29 +113,31 @@ html|*.menulist-editable-input {
 }
 
 @media (-moz-windows-default-theme) {
-  .menulist-label-box {
-    background-color: transparent !important;
-    color: inherit !important;
-  }
-
-  .menulist-label {
-    margin-top: -1px !important;
-    margin-bottom: -1px !important;
-    margin-inline-start: 0 !important;
-  }
-
-  .menulist-description {
-    margin-inline-start: 1ex !important;
-  }
-
-  menulist:not([editable="true"]) > .menulist-dropmarker {
-    margin-top: -2px;
-    margin-inline-start: 3px;
-    margin-inline-end: -3px;
-  }
-
-  .menulist-icon {
-    margin-top: -1px;
-    margin-bottom: -1px;
+  @media not all and (-moz-os-version: windows-xp) {
+    .menulist-label-box {
+      background-color: transparent !important;
+      color: inherit !important;
+    }
+
+    .menulist-label {
+      margin-top: -1px !important;
+      margin-bottom: -1px !important;
+      margin-inline-start: 0 !important;
+    }
+
+    .menulist-description {
+      margin-inline-start: 1ex !important;
+    }
+
+    menulist:not([editable="true"]) > .menulist-dropmarker {
+      margin-top: -2px;
+      margin-inline-start: 3px;
+      margin-inline-end: -3px;
+    }
+
+    .menulist-icon {
+      margin-top: -1px;
+      margin-bottom: -1px;
+    }
   }
 }
diff --git a/toolkit/themes/windows/global/popup.css b/toolkit/themes/windows/global/popup.css
index e5c3c4500..010e85a93 100644
--- a/toolkit/themes/windows/global/popup.css
+++ b/toolkit/themes/windows/global/popup.css
@@ -58,7 +58,9 @@ panel[type="arrow"][side="right"] {
 }
 
 %ifdef XP_WIN
-@media (-moz-os-version: windows-win7) {
+@media (-moz-os-version: windows-xp),
+       (-moz-os-version: windows-vista),
+       (-moz-os-version: windows-win7) {
 %endif
 .panel-arrowcontent {
   border-radius: 4px;
diff --git a/toolkit/themes/windows/global/textbox.css b/toolkit/themes/windows/global/textbox.css
index 7b136a0ea..78ca7f320 100644
--- a/toolkit/themes/windows/global/textbox.css
+++ b/toolkit/themes/windows/global/textbox.css
@@ -37,8 +37,10 @@ html|*.textbox-textarea {
 }
 
 @media (-moz-windows-default-theme) {
-  textbox html|*.textbox-input::placeholder {
-    font-style: italic;
+  @media not all and (-moz-os-version: windows-xp) {
+    textbox html|*.textbox-input::placeholder {
+      font-style: italic;
+    }
   }
 }
 
diff --git a/toolkit/themes/windows/global/toolbar/spring-XP.png b/toolkit/themes/windows/global/toolbar/spring-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..ead2a723c2463acc82ffb7cd85bda7cbff9e2e80
GIT binary patch
literal 393
zcmV;40e1e0P)<h;3K|Lk000e1NJLTq001BW001Be1ONa4*>kdg0003{Nkl<Zc-rlh
z%}N6?5Xb*Qy%fYk@h18xs>M&-+<b-ZGj(4fw**9>sv!6t>djV#;umh~IGfET6x=4_
zr9cCOUnk6OXJ)f)5dOCsm;=E=aNIjf>yM8d(eKm?RzNd|!Yxo;V!Xia^#bodOwM(r
zAc6J*mre>xkpcw)J=MZN(pFD@XkkqaSm7$zPgYe6Lvy%yij076UjiLwFcULu9I_C!
zk*gO$x)5-BQ#Jk5vh^15kU<u_!F-<?LAKc<+?8?eb%hlpVJpb-j!7k8CdY4p`^D_y
zBYfbi8e(5}#8@p?huxtmwd6tB0*d|7#7oIDK9LtKoR|tO^e!t(!KH+RUDt9;y5UKZ
zezdRn_CqvjdPhLT-^7WqH^JY7E4?jZUn979OJ2YQ>wv(MX7YlVZ*f}Txn2-VM4*CD
nq8Hqxv(j%7Sm`|cD=!2;x(~l+Ga3Sx00000NkvXXu0mjfQf91Z

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/global/toolbarbutton.css b/toolkit/themes/windows/global/toolbarbutton.css
index ac3c7ba4a..e96e529cf 100644
--- a/toolkit/themes/windows/global/toolbarbutton.css
+++ b/toolkit/themes/windows/global/toolbarbutton.css
@@ -84,11 +84,17 @@ toolbarbutton[checked="true"]:not([disabled="true"]) {
     text-shadow: none;
   }
 
-  toolbarbutton:-moz-lwtheme:not([disabled="true"]) {
+  toolbarbutton:-moz-lwtheme:not(:hover):not([checked="true"]):not([open="true"]):not([disabled="true"]) {
     color: inherit;
     text-shadow: inherit;
   }
 
+  @media not all and (-moz-os-version: windows-xp) {
+    toolbarbutton:-moz-lwtheme:not([disabled="true"]) {
+      color: inherit;
+      text-shadow: inherit;
+    }
+  }
 }
 
 @media not all and (-moz-windows-default-theme) {
diff --git a/toolkit/themes/windows/global/tree.css b/toolkit/themes/windows/global/tree.css
index 2b4957c6c..130096824 100644
--- a/toolkit/themes/windows/global/tree.css
+++ b/toolkit/themes/windows/global/tree.css
@@ -310,7 +310,7 @@ treecol:not([hideheader="true"]) > .treecol-sortdirection[sortDirection="descend
 /* ::::: twisty :::::  */
 
 treechildren::-moz-tree-twisty {
-  padding-inline-end: 1px;
+  padding-inline-end: 4px;
   padding-top: 1px;
   width: 9px; /* The image's width is 9 pixels */
   list-style-image: url("chrome://global/skin/tree/twisty.svg#clsd");
@@ -320,32 +320,8 @@ treechildren::-moz-tree-twisty(open) {
   list-style-image: url("chrome://global/skin/tree/twisty.svg#open");
 }
 
-treechildren::-moz-tree-twisty(hover) {
-  list-style-image: url("chrome://global/skin/tree/twisty.svg#clsd-hover");
-}
-
-treechildren::-moz-tree-twisty(hover, open) {
-  list-style-image: url("chrome://global/skin/tree/twisty.svg#open-hover");
-}
-
-treechildren:-moz-locale-dir(rtl)::-moz-tree-twisty {
-  list-style-image: url("chrome://global/skin/tree/twisty.svg#clsd-rtl");
-}
-
-treechildren:-moz-locale-dir(rtl)::-moz-tree-twisty(open) {
-  list-style-image: url("chrome://global/skin/tree/twisty.svg#open-rtl");
-}
-
-treechildren:-moz-locale-dir(rtl)::-moz-tree-twisty(hover) {
-  list-style-image: url("chrome://global/skin/tree/twisty.svg#clsd-hover-rtl");
-}
-
-treechildren:-moz-locale-dir(rtl)::-moz-tree-twisty(hover, open) {
-  list-style-image: url("chrome://global/skin/tree/twisty.svg#open-hover-rtl");
-}
-
 treechildren::-moz-tree-indentation {
-  width: 12px;
+  width: 18px;
 }
 
 /* ::::: gridline style ::::: */
@@ -394,196 +370,233 @@ treechildren::-moz-tree-cell-text(active, selected, editing) {
 }
 
 %ifdef XP_WIN
-@media (-moz-windows-default-theme) {
-  treechildren {
-    --treechildren-outline: none;
-    --treechildren-2ndBorderColor: rgba(255,255,255,.4);
-    --treechildren-selectedColor: rgb(217,217,217);
-    --treechildren-focusColor: rgb(123,195,255);
-    --treechildren-selectedFocusColor: rgb(205,232,255);
-    --treechildren-currentColor: rgb(125,162,206);
-    --treechildren-hoverColor: rgb(229,243,255);
-    --treechildren-selectedBorder: var(--treechildren-selectedColor);
-    --treechildren-selectedBottomBorder: rgb(204,204,204);
-    --treechildren-selectedImage: linear-gradient(rgb(217,217,217), rgb(217,217,217));
-    --treechildren-selectedBackground: transparent;
-    --treechildren-currentFocusBorder: var(--treechildren-focusColor);
-    --treechildren-currentFocusBottomBorder: var(--treechildren-focusColor);
-    --treechildren-selectedFocusBorder: var(--treechildren-selectedFocusColor);
-    --treechildren-selectedFocusBottomBorder: rgb(165,214,255);
-    --treechildren-selectedFocusImage: none;
-    --treechildren-selectedFocusBackground: var(--treechildren-selectedFocusColor);
-    --treechildren-selectedFocusCurrentBorder: var(--treechildren-focusColor);
-    --treechildren-selectedFocusCurrentBottomBorder: var(--treechildren-focusColor);
-    --treechildren-selectedFocusCurrentImage: linear-gradient(rgb(205,232,255), rgb(205,232,255));
-    --treechildren-hoverBorder: var(--treechildren-hoverColor);
-    --treechildren-hoverBottomBorder: var(--treechildren-hoverColor);
-    --treechildren-hoverImage: linear-gradient(rgb(229,243,255), rgb(229,243,255));
-    --treechildren-hoverCurrentBorder: var(--treechildren-currentColor);
-    --treechildren-hoverCurrentBottomBorder: var(--treechildren-currentColor);
-    --treechildren-hoverCurrentImage: linear-gradient(rgba(131,183,249,.16), rgba(131,183,249,.16));
-    --treechildren-hoverSelectedBorder: var(--treechildren-focusColor);
-    --treechildren-hoverSelectedBottomBorder: var(--treechildren-focusColor);
-    --treechildren-hoverSelectedImage: linear-gradient(rgb(205,232,255), rgb(205,232,255));
-  }
+@media not all and (-moz-os-version: windows-xp) {
+  /* ::::: twisty :::::  */
 
-  treechildren:not(.autocomplete-treebody)::-moz-tree-row {
-    height: 1.8em;
-    color: -moz-FieldText;
-    margin-inline-start: 1px;
-    margin-inline-end: 1px;
-    border-width: 1px;
-    border-color: transparent;
-    background-repeat: no-repeat;
-    background-size: 100% 100%;
+  treechildren::-moz-tree-indentation {
+    width: 12px;
   }
 
-  treechildren:not(.autocomplete-treebody)::-moz-tree-row(selected) {
-    -moz-border-top-colors: var(--treechildren-selectedBorder);
-    -moz-border-right-colors: var(--treechildren-selectedBorder);
-    -moz-border-left-colors: var(--treechildren-selectedBorder);
-    -moz-border-bottom-colors: var(--treechildren-selectedBottomBorder);
-    background-image: var(--treechildren-selectedImage);
-    background-color: var(--treechildren-selectedBackground);
-    outline: var(--treechildren-outline);
+  treechildren::-moz-tree-twisty {
+    padding-inline-end: 1px;
   }
 
-  treechildren:not(.autocomplete-treebody)::-moz-tree-row(current, focus) {
-    border-style: solid;
-    -moz-border-top-colors: var(--treechildren-currentFocusBorder);
-    -moz-border-right-colors: var(--treechildren-currentFocusBorder);
-    -moz-border-left-colors: var(--treechildren-currentFocusBorder);
-    -moz-border-bottom-colors: var(--treechildren-currentFocusBottomBorder);
-    outline: var(--treechildren-outline);
+  treechildren::-moz-tree-twisty(hover) {
+    list-style-image: url("chrome://global/skin/tree/twisty.svg#clsd-hover");
   }
 
-  treechildren:not(.autocomplete-treebody)::-moz-tree-row(selected, focus),
-  treechildren::-moz-tree-row(dropOn) {
-    -moz-border-top-colors: var(--treechildren-selectedFocusBorder);
-    -moz-border-right-colors: var(--treechildren-selectedFocusBorder);
-    -moz-border-left-colors: var(--treechildren-selectedFocusBorder);
-    -moz-border-bottom-colors: var(--treechildren-selectedFocusBottomBorder);
-    background-image: var(--treechildren-selectedFocusImage);
-    background-color: var(--treechildren-selectedFocusBackground);
+  treechildren::-moz-tree-twisty(hover, open) {
+    list-style-image: url("chrome://global/skin/tree/twisty.svg#open-hover");
   }
 
-  treechildren:not(.autocomplete-treebody)::-moz-tree-row(selected, current, focus) {
-    border-style: solid;
-    -moz-border-top-colors: var(--treechildren-selectedFocusCurrentBorder);
-    -moz-border-right-colors: var(--treechildren-selectedFocusCurrentBorder);
-    -moz-border-left-colors: var(--treechildren-selectedFocusCurrentBorder);
-    -moz-border-bottom-colors: var(--treechildren-selectedFocusCurrentBottomBorder);
-    background-image: var(--treechildren-selectedFocusCurrentImage);
+  treechildren:-moz-locale-dir(rtl)::-moz-tree-twisty {
+    list-style-image: url("chrome://global/skin/tree/twisty.svg#clsd-rtl");
   }
 
-  treechildren:not(.autocomplete-treebody)::-moz-tree-row(hover) {
-    -moz-border-top-colors: var(--treechildren-hoverBorder);
-    -moz-border-right-colors: var(--treechildren-hoverBorder);
-    -moz-border-left-colors: var(--treechildren-hoverBorder);
-    -moz-border-bottom-colors: var(--treechildren-hoverBottomBorder);
-    background-image: var(--treechildren-hoverImage);
-    outline: var(--treechildren-outline);
+  treechildren:-moz-locale-dir(rtl)::-moz-tree-twisty(open) {
+    list-style-image: url("chrome://global/skin/tree/twisty.svg#open-rtl");
   }
 
-  treechildren:not(.autocomplete-treebody)::-moz-tree-row(hover, current) {
-    -moz-border-top-colors: var(--treechildren-hoverCurrentBorder);
-    -moz-border-right-colors: var(--treechildren-hoverCurrentBorder);
-    -moz-border-left-colors: var(--treechildren-hoverCurrentBorder);
-    -moz-border-bottom-colors: var(--treechildren-hoverCurrentBottomBorder);
-    background-image: var(--treechildren-hoverCurrentImage);
+  treechildren:-moz-locale-dir(rtl)::-moz-tree-twisty(hover) {
+    list-style-image: url("chrome://global/skin/tree/twisty.svg#clsd-hover-rtl");
   }
 
-  treechildren:not(.autocomplete-treebody)::-moz-tree-row(hover, selected) {
-    -moz-border-top-colors: var(--treechildren-hoverSelectedBorder);
-    -moz-border-right-colors: var(--treechildren-hoverSelectedBorder);
-    -moz-border-left-colors: var(--treechildren-hoverSelectedBorder);
-    -moz-border-bottom-colors: var(--treechildren-hoverSelectedBottomBorder);
-    background-image: var(--treechildren-hoverSelectedImage);
+  treechildren:-moz-locale-dir(rtl)::-moz-tree-twisty(hover, open) {
+    list-style-image: url("chrome://global/skin/tree/twisty.svg#open-hover-rtl");
   }
 
-  tree[disabled="true"] > treechildren::-moz-tree-row {
-    background: none;
-    -moz-border-top-colors: transparent;
-    -moz-border-right-colors: transparent;
-    -moz-border-left-colors: transparent;
-    -moz-border-bottom-colors: transparent;
-  }
+  @media (-moz-windows-default-theme) {
+    treechildren {
+      --treechildren-outline: none;
+      --treechildren-2ndBorderColor: rgba(255,255,255,.4);
+      --treechildren-selectedColor: rgb(217,217,217);
+      --treechildren-focusColor: rgb(123,195,255);
+      --treechildren-selectedFocusColor: rgb(205,232,255);
+      --treechildren-currentColor: rgb(125,162,206);
+      --treechildren-hoverColor: rgb(229,243,255);
+      --treechildren-selectedBorder: var(--treechildren-selectedColor);
+      --treechildren-selectedBottomBorder: rgb(204,204,204);
+      --treechildren-selectedImage: linear-gradient(rgb(217,217,217), rgb(217,217,217));
+      --treechildren-selectedBackground: transparent;
+      --treechildren-currentFocusBorder: var(--treechildren-focusColor);
+      --treechildren-currentFocusBottomBorder: var(--treechildren-focusColor);
+      --treechildren-selectedFocusBorder: var(--treechildren-selectedFocusColor);
+      --treechildren-selectedFocusBottomBorder: rgb(165,214,255);
+      --treechildren-selectedFocusImage: none;
+      --treechildren-selectedFocusBackground: var(--treechildren-selectedFocusColor);
+      --treechildren-selectedFocusCurrentBorder: var(--treechildren-focusColor);
+      --treechildren-selectedFocusCurrentBottomBorder: var(--treechildren-focusColor);
+      --treechildren-selectedFocusCurrentImage: linear-gradient(rgb(205,232,255), rgb(205,232,255));
+      --treechildren-hoverBorder: var(--treechildren-hoverColor);
+      --treechildren-hoverBottomBorder: var(--treechildren-hoverColor);
+      --treechildren-hoverImage: linear-gradient(rgb(229,243,255), rgb(229,243,255));
+      --treechildren-hoverCurrentBorder: var(--treechildren-currentColor);
+      --treechildren-hoverCurrentBottomBorder: var(--treechildren-currentColor);
+      --treechildren-hoverCurrentImage: linear-gradient(rgba(131,183,249,.16), rgba(131,183,249,.16));
+      --treechildren-hoverSelectedBorder: var(--treechildren-focusColor);
+      --treechildren-hoverSelectedBottomBorder: var(--treechildren-focusColor);
+      --treechildren-hoverSelectedImage: linear-gradient(rgb(205,232,255), rgb(205,232,255));
+    }
 
-  treechildren::-moz-tree-cell(dropOn) {
-    background-image: none;
-    background-color: transparent;
-    border-radius: 0;
-  }
+    treechildren:not(.autocomplete-treebody)::-moz-tree-row {
+      height: 1.8em;
+      color: -moz-FieldText;
+      margin-inline-start: 1px;
+      margin-inline-end: 1px;
+      border-width: 1px;
+      border-color: transparent;
+      background-repeat: no-repeat;
+      background-size: 100% 100%;
+    }
 
-  treechildren::-moz-tree-cell-text(primary, dropOn) {
-    color: -moz-FieldText;
-  }
+    treechildren:not(.autocomplete-treebody)::-moz-tree-row(selected) {
+      -moz-border-top-colors: var(--treechildren-selectedBorder);
+      -moz-border-right-colors: var(--treechildren-selectedBorder);
+      -moz-border-left-colors: var(--treechildren-selectedBorder);
+      -moz-border-bottom-colors: var(--treechildren-selectedBottomBorder);
+      background-image: var(--treechildren-selectedImage);
+      background-color: var(--treechildren-selectedBackground);
+      outline: var(--treechildren-outline);
+    }
 
-  treechildren:not(.autocomplete-treebody)::-moz-tree-cell-text {
-    padding-bottom: initial;
-    border-color: transparent;
-    background-color: transparent;
-  }
+    treechildren:not(.autocomplete-treebody)::-moz-tree-row(current, focus) {
+      border-style: solid;
+      -moz-border-top-colors: var(--treechildren-currentFocusBorder);
+      -moz-border-right-colors: var(--treechildren-currentFocusBorder);
+      -moz-border-left-colors: var(--treechildren-currentFocusBorder);
+      -moz-border-bottom-colors: var(--treechildren-currentFocusBottomBorder);
+      outline: var(--treechildren-outline);
+    }
 
-  treechildren:not(.autocomplete-treebody)::-moz-tree-cell-text(selected, focus) {
-    color: -moz-DialogText;
-  }
+    treechildren:not(.autocomplete-treebody)::-moz-tree-row(selected, focus),
+    treechildren::-moz-tree-row(dropOn) {
+      -moz-border-top-colors: var(--treechildren-selectedFocusBorder);
+      -moz-border-right-colors: var(--treechildren-selectedFocusBorder);
+      -moz-border-left-colors: var(--treechildren-selectedFocusBorder);
+      -moz-border-bottom-colors: var(--treechildren-selectedFocusBottomBorder);
+      background-image: var(--treechildren-selectedFocusImage);
+      background-color: var(--treechildren-selectedFocusBackground);
+    }
 
-  @media (-moz-os-version: windows-win7) {
-    treechildren {
-      --treechildren-outline: 1px solid var(--treechildren-2ndBorderColor);
-      --treechildren-2ndBottomBorderColor: rgba(255,255,255,.6);
-      --treechildren-selectedBorder: var(--treechildren-selectedColor) var(--treechildren-2ndBorderColor);
-      --treechildren-selectedBottomBorder: var(--treechildren-selectedColor) var(--treechildren-2ndBottomBorderColor);
-      --treechildren-selectedImage: linear-gradient(rgba(190,190,190,.1), rgba(190,190,190,.4));
-      --treechildren-currentFocusBorder: var(--treechildren-currentColor) var(--treechildren-2ndBorderColor);
-      --treechildren-currentFocusBottomBorder: var(--treechildren-currentColor) var(--treechildren-2ndBottomBorderColor);
-      --treechildren-selectedFocusBorder: rgb(132,172,221) var(--treechildren-2ndBorderColor);
-      --treechildren-selectedFocusBottomBorder: var(--treechildren-currentColor) var(--treechildren-2ndBottomBorderColor);
-      --treechildren-selectedFocusImage: linear-gradient(rgba(131,183,249,.16), rgba(131,183,249,.375));
-      --treechildren-selectedFocusBackground: transparent;
-      --treechildren-selectedFocusCurrentBorder: var(--treechildren-currentColor) var(--treechildren-2ndBorderColor);
-      --treechildren-selectedFocusCurrentBottomBorder: var(--treechildren-currentColor) var(--treechildren-2ndBottomBorderColor);
-      --treechildren-selectedFocusCurrentImage: linear-gradient(rgba(131,183,249,.28), rgba(131,183,249,.5));
-      --treechildren-hoverBorder: rgb(184,214,251) var(--treechildren-2ndBorderColor);
-      --treechildren-hoverBottomBorder: rgb(184,214,251) var(--treechildren-2ndBottomBorderColor);
-      --treechildren-hoverImage: linear-gradient(rgba(131,183,249,.05), rgba(131,183,249,.16));
-      --treechildren-hoverCurrentBorder: var(--treechildren-currentColor) var(--treechildren-2ndBorderColor);
-      --treechildren-hoverCurrentBottomBorder: var(--treechildren-currentColor) var(--treechildren-2ndBottomBorderColor);
-      --treechildren-hoverCurrentImage: linear-gradient(rgba(131,183,249,.05), rgba(131,183,249,.16));
-      --treechildren-hoverSelectedBorder: var(--treechildren-currentColor) var(--treechildren-2ndBorderColor);
-      --treechildren-hoverSelectedBottomBorder: var(--treechildren-currentColor) var(--treechildren-2ndBottomBorderColor);
-      --treechildren-hoverSelectedImage: linear-gradient(rgba(131,183,249,.28), rgba(131,183,249,.5));
+    treechildren:not(.autocomplete-treebody)::-moz-tree-row(selected, current, focus) {
+      border-style: solid;
+      -moz-border-top-colors: var(--treechildren-selectedFocusCurrentBorder);
+      -moz-border-right-colors: var(--treechildren-selectedFocusCurrentBorder);
+      -moz-border-left-colors: var(--treechildren-selectedFocusCurrentBorder);
+      -moz-border-bottom-colors: var(--treechildren-selectedFocusCurrentBottomBorder);
+      background-image: var(--treechildren-selectedFocusCurrentImage);
     }
 
-    treechildren:not(.autocomplete-treebody)::-moz-tree-row {
-      border-width: 2px;
-      border-radius: 3px;
-      -moz-outline-radius: 3px;
+    treechildren:not(.autocomplete-treebody)::-moz-tree-row(hover) {
+      -moz-border-top-colors: var(--treechildren-hoverBorder);
+      -moz-border-right-colors: var(--treechildren-hoverBorder);
+      -moz-border-left-colors: var(--treechildren-hoverBorder);
+      -moz-border-bottom-colors: var(--treechildren-hoverBottomBorder);
+      background-image: var(--treechildren-hoverImage);
+      outline: var(--treechildren-outline);
     }
-  }
 
-  @media (-moz-os-version: windows-win8) {
-    treechildren {
-      --treechildren-outline: 1px solid var(--treechildren-2ndBorderColor);
-      --treechildren-selectedBorder: var(--treechildren-selectedColor);
-      --treechildren-selectedBottomBorder: var(--treechildren-selectedColor);
-      --treechildren-selectedImage: linear-gradient(rgba(190,190,190,.4), rgba(190,190,190,.4));
-      --treechildren-currentFocusBorder: var(--treechildren-currentColor);
-      --treechildren-currentFocusBottomBorder: var(--treechildren-currentColor);
-      --treechildren-selectedFocusBorder: rgb(132,172,221) var(--treechildren-2ndBorderColor);
-      --treechildren-selectedFocusBottomBorder: var(--treechildren-currentColor);
-      --treechildren-selectedFocusImage: linear-gradient(rgba(131,183,249,.375), rgba(131,183,249,.375));
-      --treechildren-selectedFocusBackground: transparent;
-      --treechildren-selectedFocusCurrentBorder: var(--treechildren-currentColor);
-      --treechildren-selectedFocusCurrentBottomBorder: var(--treechildren-currentColor);
-      --treechildren-selectedFocusCurrentImage: linear-gradient(rgba(131,183,249,.5), rgba(131,183,249,.5));
-      --treechildren-hoverBorder: rgb(184,214,251);
-      --treechildren-hoverBottomBorder: rgb(184,214,251);
-      --treechildren-hoverImage: linear-gradient(rgba(131,183,249,.16), rgba(131,183,249,.16));
-      --treechildren-hoverSelectedBorder: var(--treechildren-currentColor);
-      --treechildren-hoverSelectedBottomBorder: var(--treechildren-currentColor);
-      --treechildren-hoverSelectedImage: linear-gradient(rgba(131,183,249,.5), rgba(131,183,249,.5));
+    treechildren:not(.autocomplete-treebody)::-moz-tree-row(hover, current) {
+      -moz-border-top-colors: var(--treechildren-hoverCurrentBorder);
+      -moz-border-right-colors: var(--treechildren-hoverCurrentBorder);
+      -moz-border-left-colors: var(--treechildren-hoverCurrentBorder);
+      -moz-border-bottom-colors: var(--treechildren-hoverCurrentBottomBorder);
+      background-image: var(--treechildren-hoverCurrentImage);
+    }
+
+    treechildren:not(.autocomplete-treebody)::-moz-tree-row(hover, selected) {
+      -moz-border-top-colors: var(--treechildren-hoverSelectedBorder);
+      -moz-border-right-colors: var(--treechildren-hoverSelectedBorder);
+      -moz-border-left-colors: var(--treechildren-hoverSelectedBorder);
+      -moz-border-bottom-colors: var(--treechildren-hoverSelectedBottomBorder);
+      background-image: var(--treechildren-hoverSelectedImage);
+    }
+
+    tree[disabled="true"] > treechildren::-moz-tree-row {
+      background: none;
+      -moz-border-top-colors: transparent;
+      -moz-border-right-colors: transparent;
+      -moz-border-left-colors: transparent;
+      -moz-border-bottom-colors: transparent;
+    }
+
+    treechildren::-moz-tree-cell(dropOn) {
+      background-image: none;
+      background-color: transparent;
+      border-radius: 0;
+    }
+
+    treechildren::-moz-tree-cell-text(primary, dropOn) {
+      color: -moz-FieldText;
+    }
+
+    treechildren:not(.autocomplete-treebody)::-moz-tree-cell-text {
+      padding-bottom: initial;
+      border-color: transparent;
+      background-color: transparent;
+    }
+
+    treechildren:not(.autocomplete-treebody)::-moz-tree-cell-text(selected, focus) {
+      color: -moz-DialogText;
+    }
+
+    @media (-moz-os-version: windows-vista),
+           (-moz-os-version: windows-win7) {
+      treechildren {
+        --treechildren-outline: 1px solid var(--treechildren-2ndBorderColor);
+        --treechildren-2ndBottomBorderColor: rgba(255,255,255,.6);
+        --treechildren-selectedBorder: var(--treechildren-selectedColor) var(--treechildren-2ndBorderColor);
+        --treechildren-selectedBottomBorder: var(--treechildren-selectedColor) var(--treechildren-2ndBottomBorderColor);
+        --treechildren-selectedImage: linear-gradient(rgba(190,190,190,.1), rgba(190,190,190,.4));
+        --treechildren-currentFocusBorder: var(--treechildren-currentColor) var(--treechildren-2ndBorderColor);
+        --treechildren-currentFocusBottomBorder: var(--treechildren-currentColor) var(--treechildren-2ndBottomBorderColor);
+        --treechildren-selectedFocusBorder: rgb(132,172,221) var(--treechildren-2ndBorderColor);
+        --treechildren-selectedFocusBottomBorder: var(--treechildren-currentColor) var(--treechildren-2ndBottomBorderColor);
+        --treechildren-selectedFocusImage: linear-gradient(rgba(131,183,249,.16), rgba(131,183,249,.375));
+        --treechildren-selectedFocusBackground: transparent;
+        --treechildren-selectedFocusCurrentBorder: var(--treechildren-currentColor) var(--treechildren-2ndBorderColor);
+        --treechildren-selectedFocusCurrentBottomBorder: var(--treechildren-currentColor) var(--treechildren-2ndBottomBorderColor);
+        --treechildren-selectedFocusCurrentImage: linear-gradient(rgba(131,183,249,.28), rgba(131,183,249,.5));
+        --treechildren-hoverBorder: rgb(184,214,251) var(--treechildren-2ndBorderColor);
+        --treechildren-hoverBottomBorder: rgb(184,214,251) var(--treechildren-2ndBottomBorderColor);
+        --treechildren-hoverImage: linear-gradient(rgba(131,183,249,.05), rgba(131,183,249,.16));
+        --treechildren-hoverCurrentBorder: var(--treechildren-currentColor) var(--treechildren-2ndBorderColor);
+        --treechildren-hoverCurrentBottomBorder: var(--treechildren-currentColor) var(--treechildren-2ndBottomBorderColor);
+        --treechildren-hoverCurrentImage: linear-gradient(rgba(131,183,249,.05), rgba(131,183,249,.16));
+        --treechildren-hoverSelectedBorder: var(--treechildren-currentColor) var(--treechildren-2ndBorderColor);
+        --treechildren-hoverSelectedBottomBorder: var(--treechildren-currentColor) var(--treechildren-2ndBottomBorderColor);
+        --treechildren-hoverSelectedImage: linear-gradient(rgba(131,183,249,.28), rgba(131,183,249,.5));
+      }
+
+      treechildren:not(.autocomplete-treebody)::-moz-tree-row {
+        border-width: 2px;
+        border-radius: 3px;
+        -moz-outline-radius: 3px;
+      }
+    }
+
+    @media (-moz-os-version: windows-win8) {
+      treechildren {
+        --treechildren-outline: 1px solid var(--treechildren-2ndBorderColor);
+        --treechildren-selectedBorder: var(--treechildren-selectedColor);
+        --treechildren-selectedBottomBorder: var(--treechildren-selectedColor);
+        --treechildren-selectedImage: linear-gradient(rgba(190,190,190,.4), rgba(190,190,190,.4));
+        --treechildren-currentFocusBorder: var(--treechildren-currentColor);
+        --treechildren-currentFocusBottomBorder: var(--treechildren-currentColor);
+        --treechildren-selectedFocusBorder: rgb(132,172,221) var(--treechildren-2ndBorderColor);
+        --treechildren-selectedFocusBottomBorder: var(--treechildren-currentColor);
+        --treechildren-selectedFocusImage: linear-gradient(rgba(131,183,249,.375), rgba(131,183,249,.375));
+        --treechildren-selectedFocusBackground: transparent;
+        --treechildren-selectedFocusCurrentBorder: var(--treechildren-currentColor);
+        --treechildren-selectedFocusCurrentBottomBorder: var(--treechildren-currentColor);
+        --treechildren-selectedFocusCurrentImage: linear-gradient(rgba(131,183,249,.5), rgba(131,183,249,.5));
+        --treechildren-hoverBorder: rgb(184,214,251);
+        --treechildren-hoverBottomBorder: rgb(184,214,251);
+        --treechildren-hoverImage: linear-gradient(rgba(131,183,249,.16), rgba(131,183,249,.16));
+        --treechildren-hoverSelectedBorder: var(--treechildren-currentColor);
+        --treechildren-hoverSelectedBottomBorder: var(--treechildren-currentColor);
+        --treechildren-hoverSelectedImage: linear-gradient(rgba(131,183,249,.5), rgba(131,183,249,.5));
+      }
     }
   }
 }
diff --git a/toolkit/themes/windows/global/tree/sort-asc-XP.png b/toolkit/themes/windows/global/tree/sort-asc-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..d76ec42ed9d15d6726844ffb94a3cbffbce043c7
GIT binary patch
literal 121
zcmeAS@N?(olHy`uVBq!ia0vp^oIuRV!3HF!2OrA@QVyOjjv*Ddl576HGGjKfsCjUp
zUb?#4O`)ONP*K}rOa1@<_5c4hW-1&AY0+yulin2BxQ5|o)&z^kvqX&zQ!g?w=;!DQ
U+|E{G1)9a+>FVdQ&MBb@0AJT9u>b%7

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/global/tree/sort-dsc-XP.png b/toolkit/themes/windows/global/tree/sort-dsc-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..c336bea64d0b27c282f890b7ef5023af70b6248c
GIT binary patch
literal 116
zcmeAS@N?(olHy`uVBq!ia0vp^oIuRV!3HF!2OrA@Qr4a>jv*Ddl4EukU8`3}IKVz5
zM^;9nkzqO01RG(G#<`1?!$K7b)zsA3)Mhm7oh+=pi)jY0&kdCea~T-E9pmAZVAFR7
P8pGh}>gTe~DWM4fdSV~D

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/global/tree/twisty-Vista78.svg b/toolkit/themes/windows/global/tree/twisty-Vista78.svg
new file mode 100644
index 000000000..0a6908634
--- /dev/null
+++ b/toolkit/themes/windows/global/tree/twisty-Vista78.svg
@@ -0,0 +1,39 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="9" height="9">
+  <style>
+    use:not(:target) {
+      display: none;
+    }
+    use {
+      stroke: #74747b;
+      stroke-opacity: 0.85;
+      fill: none;
+    }
+    use[id^="open"] {
+      stroke: #636363;
+      stroke-opacity: 1;
+    }
+    use[id*="-hover"] {
+      stroke: #1cc4f7;
+      stroke-opacity: 1;
+      fill: #c0e8f9;
+    }
+  </style>
+  <defs>
+    <path id="clsd-shape" d="m 2.5,0.5 4,4 -4,4 z"/>
+    <path id="open-shape" d="M 7.5,3 7.5,7.5 3,7.5 3,6.5 6.5,3 Z"/>
+    <path id="clsd-rtl-shape" d="m 6.5,0.5 -4,4 4,4 z"/>
+    <path id="open-rtl-shape" d="m 1.5,3 0,4.5 4.5,0 0,-1 L 2.5,3 Z"/>
+  </defs>
+  <use id="clsd" xlink:href="#clsd-shape"/>
+  <use id="clsd-hover" xlink:href="#clsd-shape"/>
+  <use id="open" xlink:href="#open-shape"/>
+  <use id="open-hover" xlink:href="#open-shape"/>
+  <use id="clsd-rtl" xlink:href="#clsd-rtl-shape"/>
+  <use id="clsd-hover-rtl" xlink:href="#clsd-rtl-shape"/>
+  <use id="open-rtl" xlink:href="#open-rtl-shape"/>
+  <use id="open-hover-rtl" xlink:href="#open-rtl-shape"/>
+</svg>
diff --git a/toolkit/themes/windows/global/tree/twisty-XP.svg b/toolkit/themes/windows/global/tree/twisty-XP.svg
new file mode 100644
index 000000000..66219d513
--- /dev/null
+++ b/toolkit/themes/windows/global/tree/twisty-XP.svg
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="9" height="9">
+  <style>
+    use:not(:target) {
+      display: none;
+    }
+    use {
+      stroke: #000000;
+      stroke-width: 1;
+    }
+  </style>
+  <defs>
+    <linearGradient id="linearGradient1">
+      <stop style="stop-color: #ffffff;" offset="0"/>
+      <stop style="stop-color: #e0e0e0;" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient2">
+      <stop style="stop-color: #c9c9c9;" offset="0"/>
+      <stop style="stop-color: #f8f8f8;" offset="1"/>
+    </linearGradient>
+    <linearGradient id="gradient1" xlink:href="#linearGradient1" gradientUnits="userSpaceOnUse" x1="4.5" y1="2" x2="4.5" y2="7"/>
+    <linearGradient id="gradient2" xlink:href="#linearGradient2" gradientUnits="userSpaceOnUse" x1="4.5" y1="6" x2="4.5" y2="3"/>
+    <path id="clsd-shape" d="m 2,4.5 5,0 M 4.5,2 l 0,5"/>
+    <path id="open-shape" d="m 2,4.5 5,0"/>
+  </defs>
+  <rect style="fill: url(#gradient1); stroke: #5d5cc2; stroke-linejoin: round; stroke-opacity: 0.8" width="8" height="8" x="0.5" y="0.5"/>
+  <rect style="fill: url(#gradient2);" width="5" height="5" x="2" y="2"/>
+  <use id="clsd" xlink:href="#clsd-shape"/>
+  <use id="open" xlink:href="#open-shape"/>
+</svg>
diff --git a/toolkit/themes/windows/mozapps/downloads/downloadButtons-XP.png b/toolkit/themes/windows/mozapps/downloads/downloadButtons-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..75777feb3e131e6597b038224489522d46e1c16b
GIT binary patch
literal 3057
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

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/mozapps/downloads/downloadIcon-XP.png b/toolkit/themes/windows/mozapps/downloads/downloadIcon-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..52b11378b0d7f4ea4dcc952d8bb2e8162a8d6757
GIT binary patch
literal 1306
zcmV+#1?BpQP)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv000ExNkl<ZcwV(s
zU1%I-6g~61yR$Rd+5b&yG)bG*&;*jSp{Z(1OH~l15-kPQCkri9pZu#7eDTc+D54aq
zuZ0>^q_r=ifdUq+##$^?N?V)Ik~II>&F<{{`rS(gB9!=|2M%{;zuj~0J@;d!D2lKi
zdf$B@ZQ7|?Ah}qJ+F}j$MbEtb+42h3fr@`Y%1js}KKxuS8jTe=ZUbJ_z@^g;^mJeV
zSl1w)07s4-*>BsWcUs#zT6J9k!S#SfP*uKiPqg<v(ZL2y&w&>@xcY4sFPGn#)FUH^
z!U#ba079!)ot>%G<~}@m^5mDX0g21mY~{xT2VdEpNLDa?Zwaz2p;FF3Rvo-FI)M8b
zoO<DB1WlmnHsN_bTu~9Z82{z`Ps>ZwdxVKAgMo)SyS8?1>2AgRf`fDC&SPxs0>a2Z
zcSjC{rq_TgNYxW2gw0(Kp<HQ$W!cd6q+kjynIc--Hgy5$Ub}<tVyTpipkwEdfyZ|q
z0%6-nCCF|H1jng^yC;S&02#a9dk}>0-k#t(KR=Hk2+`6~$gdh)jVIVtC}h*JtZ?qW
z4}>9bZ0KWzdIKGgX5jDy4qTt&aM8AhcZ=8dy)Q%q*tU&iGRaYymaS1Lf?xwpOKxnj
zOhl0cMFu2^4X~?cACB+%6gMwT!6RYc6=EJD1h{iHhqs>j0DF56!gXDQVYq7GQB*{V
z3Ch&el%C5~4s9RW(PO4fI4+=TfT93KB8{%n!ziH>-(NWkHOJz(doG7#`%hqZ&jCcC
z1iC21rKKgXfu`c#^zDVw(bHek1i5Uk(v?aXAS^5be@*fPY@(?Oo*o>*oBf|)<%Z6k
zA0Ih^y<49b=L!-D4VtE5W@ZM}Y84Dgp=ECbP*efr^M$renwH}HTP$Gmj)UK?MkwS{
z$Y;SFJv%f4-wzP<08jRhAc|Bt4zRe?fJg!LdYz1D0*YD~6zB$I$)GKp&6}#KQrFD(
z4N1%`05h|7A)twDHKYWe>VHv)04sH1xeAVCd3hNG%Aa;YQH5cIv}q?un+$qQ)57!&
z1R~^Yi6^m4AZ-}jWe@_j6($S#zE5I&dlHERBuPTE*`)4ilGW%q^6jdT&h%I!m&=zg
zgRpzo0Q>-mJQCv@MTmvzwvaH9p2>`a*H$)5CXz6%e4lFD<wr_I6B{<Pv!JGeuWF1S
zj143~ZS@(#0PuXkb%R)xcEH_RrjDDpZo@Ql+f+$b)E~zF!06~VJZ?Ij76&FQ%VK6S
z8G7f>bzR4qGiNY3IEeA_arE`|;o7xp7#J8psZ@%0!DeogqEbUO3Zts;`EV#~fJ9lW
zP$-~WE~8SZ@N*$=!bm|hB6H@lEE6dz-ba6bKL~V2?^mw;MzJo6@2C|;)sWBU>5xf?
zv!+~$PLm^95ApvIMaGkmwhRfnEJQmyJ5eka<2=`P$y5}?%f4@oF)=Yg5%DfaTXo&W
z-7xe^!^6Y;<=NR;%+1Zk<I-L@`(y&lY&J_jrb=ftIq#@etATLw;zcmvgS4fiM_>PZ
z<K{iD+SyhimR#*tSzBYq9miKRjxnxu#`|-e2JTE=$E_O|zEFMNJ+&}*{jts6?OO~Z
z#a;gsA@lx_nQOo%n&M$`;l`h&Ege35m=uQuw+WW<-(XtsSHVjXIsTvc8^^JTnrcL7
Q+5i9m07*qoM6N<$g1ISXZvX%Q

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/mozapps/jar.mn b/toolkit/themes/windows/mozapps/jar.mn
index 0d77a4e79..53c69eb5b 100644
--- a/toolkit/themes/windows/mozapps/jar.mn
+++ b/toolkit/themes/windows/mozapps/jar.mn
@@ -22,8 +22,16 @@ toolkit.jar:
   skin/classic/mozapps/extensions/localeGeneric.png          (webextensions/localeGeneric.png)
   skin/classic/mozapps/extensions/heart.png                  (webextensions/heart.png)
 * skin/classic/mozapps/extensions/newaddon.css               (webextensions/newaddon.css)
+  skin/classic/mozapps/extensions/category-discover-XP.png   (webextensions/category-discover-XP.png)
+  skin/classic/mozapps/extensions/category-plugins-XP.png    (webextensions/category-plugins-XP.png)
+  skin/classic/mozapps/extensions/category-recent-XP.png     (webextensions/category-recent-XP.png)
+  skin/classic/mozapps/extensions/category-available-XP.png  (webextensions/category-available-XP.png)
+  skin/classic/mozapps/extensions/extensionGeneric-16-XP.png (webextensions/extensionGeneric-16-XP.png)
+  skin/classic/mozapps/extensions/themeGeneric-XP.png        (webextensions/themeGeneric-XP.png)
+  skin/classic/mozapps/extensions/themeGeneric-16-XP.png     (webextensions/themeGeneric-16-XP.png)
+  skin/classic/mozapps/extensions/localeGeneric-XP.png       (webextensions/localeGeneric-XP.png)
 #else
-  skin/classic/mozapps/extensions/about.css                  (extensions/about.css)
+ skin/classic/mozapps/extensions/about.css                  (extensions/about.css)
   skin/classic/mozapps/extensions/blocklist.css              (extensions/blocklist.css)
 * skin/classic/mozapps/extensions/extensions.css             (extensions/extensions.css)
 * skin/classic/mozapps/extensions/selectAddons.css           (extensions/selectAddons.css)
@@ -78,9 +86,33 @@ toolkit.jar:
   skin/classic/mozapps/profile/profileicon.png               (profile/profileicon.png)
   skin/classic/mozapps/update/updates.css                    (update/updates.css)
   skin/classic/mozapps/viewsource/viewsource.css             (viewsource/viewsource.css)
+  skin/classic/mozapps/downloads/downloadButtons-XP.png      (downloads/downloadButtons-XP.png)
+  skin/classic/mozapps/downloads/downloadIcon-XP.png         (downloads/downloadIcon-XP.png)
+  skin/classic/mozapps/plugins/pluginGeneric-XP.png          (plugins/pluginGeneric-XP.png)
+  skin/classic/mozapps/plugins/pluginBlocked-XP.png          (plugins/pluginBlocked-XP.png)
+  skin/classic/mozapps/plugins/pluginGeneric-16-XP.png       (plugins/pluginGeneric-16-XP.png)
+  skin/classic/mozapps/profile/profileicon-XP.png            (profile/profileicon-XP.png)
+  skin/classic/mozapps/update/downloadButtons-XP.png         (update/downloadButtons-XP.png)
 
 #ifdef MOZ_PHOENIX
 [browser/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}] chrome.jar:
 #elif MOZ_SEPARATE_MANIFEST_FOR_THEME_OVERRIDES
 [extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}] chrome.jar:
 #endif
+% override chrome://mozapps/skin/downloads/downloadButtons.png            chrome://mozapps/skin/downloads/downloadButtons-XP.png        osversion<6
+% override chrome://mozapps/skin/downloads/downloadIcon.png               chrome://mozapps/skin/downloads/downloadIcon-XP.png           osversion<6
+#ifdef MOZ_WEBEXTENSIONS
+% override chrome://mozapps/skin/extensions/category-discover.png         chrome://mozapps/skin/extensions/category-discover-XP.png     osversion<6
+% override chrome://mozapps/skin/extensions/category-plugins.png          chrome://mozapps/skin/extensions/category-plugins-XP.png      osversion<6
+% override chrome://mozapps/skin/extensions/category-recent.png           chrome://mozapps/skin/extensions/category-recent-XP.png       osversion<6
+% override chrome://mozapps/skin/extensions/category-available.png        chrome://mozapps/skin/extensions/category-available-XP.png    osversion<6
+% override chrome://mozapps/skin/extensions/extensionGeneric-16.png       chrome://mozapps/skin/extensions/extensionGeneric-16-XP.png   osversion<6
+% override chrome://mozapps/skin/extensions/themeGeneric.png              chrome://mozapps/skin/extensions/themeGeneric-XP.png          osversion<6
+% override chrome://mozapps/skin/extensions/themeGeneric-16.png           chrome://mozapps/skin/extensions/themeGeneric-16-XP.png       osversion<6
+% override chrome://mozapps/skin/extensions/localeGeneric.png             chrome://mozapps/skin/extensions/localeGeneric-XP.png         osversion<6
+#endif
+% override chrome://mozapps/skin/plugins/pluginGeneric.png                chrome://mozapps/skin/plugins/pluginGeneric-XP.png            osversion<6
+% override chrome://mozapps/skin/plugins/pluginBlocked.png                chrome://mozapps/skin/plugins/pluginBlocked-XP.png            osversion<6
+% override chrome://mozapps/skin/plugins/pluginGeneric-16.png             chrome://mozapps/skin/plugins/pluginGeneric-16-XP.png         osversion<6
+% override chrome://mozapps/skin/profile/profileicon.png                  chrome://mozapps/skin/profile/profileicon-XP.png              osversion<6
+% override chrome://mozapps/skin/update/downloadButtons.png               chrome://mozapps/skin/update/downloadButtons-XP.png           osversion<6
diff --git a/toolkit/themes/windows/mozapps/plugins/pluginBlocked-XP.png b/toolkit/themes/windows/mozapps/plugins/pluginBlocked-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..6acbf269d8d084cd7a02c5215efb57b610e28dff
GIT binary patch
literal 1017
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U_2V&6XN>r#?}A-{{scFf}8m%
zSjBIZXJZuy3PPl=#sywaivprMbtOOq;-*Gkjr6(_;d!^U8i;`0>sfJE!aeS`*8$0^
z@j>_6Yk?$Ca0)lWbRLEoybN>r80PXbEEHr|!q2cofN{AX!)js14Z@6@M3}aSGH(-O
z-XX!dN1SD^ILm$s)&ml(ha}k!NwFW1WIdJ=c`P;RxD?xQ8IBY3+$R)xPbl%9P!>F?
zDtuC1^puvwX&vd)x-w_<<<1x@o-tEBYbbx#Oy#VF`dLejb2i%N9Q4mQ8eVWQz3gFm
zIn)j4yenx@SGt>l?gx4V=*X*Cao3VUAzrwV5pyFa;YMyEFsyDCrrs>gyp<IP41`-%
zdAIWtfquVRk#n~)7v$^qI-no#wb$M6Y`EXodVfOO{Yjk<rgT4=HR;jp$&cnvecadb
zWMaqjxl^C--uis^wpV+$y*aq&!=b$&k01JU>gcC4$A5kN@cYxpKVQH6{r>Imk01Yj
z{`~jr7clxJZ;JX040^+oAirQ>#4@pQa`W)=@d*eD2}`JI8yFdzSlBr^ySaG>$0rsw
zwai+*cEj$&w_m(?`S$IHZ+kv4+yZLa<muuVQW3Xw^1<vY4kGRK`D(_6<y&X3jbO}<
z7H8?7=emdU(cS-B#T%O{K5KP^tPES|x?+QGq4~`3lPixH1iU!<{>zE)PtUS+aO53(
zSl`U0(DOIqb=qg%YQtS$pRu$(Nmx+ncF;QEpUjl+Vi8K)9zN8b<CC6azT2YLICK5C
zkKep^Du(TmZZ!=3V0fbDk?Jf7=8xU$_>D_%lvaLt8TM1OLb7h1#nV@JeiuvEh3GFk
z+V<9~Ztl~A@(B{(?mWuk+3@t?WY)(50^Ph9AAfv$^wqgXWrkB63-)YRmOReMJ9QVw
zyc*Z0<Wo%{zMZEkD_tA{4t-x@&{+|xb^Jg;)8B)BXTRQbFVhrvozV1ixo_R3oW3)c
zr)b}+zjEM4+^p+L1vfw2u}yn++ImKMuXAYGOW)i&n?tQ?sq0%Rk3N|FAcxuIOtEbx
z@8kZ;E}n9M<8Ll&vH=a?Wt?Nae!gBp&5zu9cHa603+ohoR@vljce#D|eb&6`u}Z5R
zcBFi_{+ILJ*uTg9!~Aev+Y=A>d;Gn%JZ0UN7s8B!9kY)<ND#@`o;lTWL2>AWY{uPj
kp*juC53E`aHO>CXy;;q1@!9oRhM=tI>FVdQ&MBb@09wh-xc~qF

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/mozapps/plugins/pluginGeneric-16-XP.png b/toolkit/themes/windows/mozapps/plugins/pluginGeneric-16-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..96dbad332b35ad004b631e4da98eea077e718ac7
GIT binary patch
literal 521
zcmV+k0`~ohP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0005dNkl<Zc-o~?
z!AiqG5S`7&q^4RUT4_NoQXmz<-w;7mz;E#A#k+tfF9II@4u8Tw&;kOYVv7~pYFkWp
zcAbgoYFk0TC6C#Cv-93$LWD5}{<GY1;{5#iqSrIK`MkI~J}w{q&V4W2!RcvpA5opX
zygWqtd;q;(AJ(JgG<Q>fgdtZfuEbKxqmz@;<wys<@9k@?qqVhFh+_eZiy8(WGR;*g
zE1;AEOG}2L@PzQUi5?g5t4~iYxWB)HFr0;M_nkyaX|C03K%p=L?e-gqRS65_VVyJF
z<Z{#1Fbn}vkVq2-10<n&2Je|mb9^TVyz0ad9Y>Tal_IHc!T74xR!7eLJ}gWK+}>V;
z5DvNM6iP9Wk)4rdqX-EkiGst!gHZw3_0njJW>80p1ewvGHIN8U<UEsv@eUA?lbIuu
z3qvu88=e!p9~okKb8o|Oa#{Px?PmpcZ-p2DQ!pRxY}gL^uMdGSKuLDAZiGo^M1D0F
zK01$q6;SBNuZ!$vMJAjP8JYx;OQjXi2<}&_NmlTyGl2)Hxq=_}#}K73#sgz~rYI@~
zkBB0>F<f>g@D~b*m%{!`(wi%Jg(#xS+}2<Jw-7>N+^yF!?le9D+bv(5$x!WP00000
LNkvXXu0mjf^giZg

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/mozapps/plugins/pluginGeneric-XP.png b/toolkit/themes/windows/mozapps/plugins/pluginGeneric-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..8b1b89061dad5c94aa82d9dd6bea123d5a49443c
GIT binary patch
literal 835
zcmV-J1HAl+P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80009DNkl<ZcwX&R
z&ubG=5T3XDHc4Z$(lpQ%S_-HXnih;+DpbV^cqt(2UA*)!=us#IyamO-K)ieO<Wao`
ziY>i}fQ1GOLX%qaYu`BY+=cM+qr32=7Y9D(y*I;r-^}B&D-aPb(j2&8`!7JoNvc+l
zpEaBPO{H+1w&=RzQ$8=>Z*R}N4dYK+t^Q^Z;BDFp#}S`>U&r5A5Wr}^@_p}ezb`=u
z0M`wkAhtIspaszSWj^l}f<V$5K+50|K>I$0&J{5B73}UFKPLB%0Q>u2AeT#n?`JhZ
zvv~$*XI)rcE(6=a!9HZODUP#19X~zoK)JjU@x0jCnR}jS0#eEc?1fM;GgBmjOOVN=
zq22C)=W$#SWRy#1S@OQlaorB2)4%A<0Yv@K?k2th*LClaBVq+hOS9CGf=)-l^mG;$
z7IM(<2hi*3;!vqvA#!&p$MY1lS{|p|O!^AAtE(Qhy0`Zgj*fnS5M3w~BzwI-Jp2w6
zXYhJtPObKh>oBIO)utbN0<T~HzRu)A2&mT^L|7js5LQ=pcN23~R-~>&wnq36X98S&
zgTU9II~-wr9(6Y<XE1L)?gW_lPPDF6D%4>e8jS|s@hQEA92AR1D3wZ_7dMA-E4BbB
zoi(KZ90y>2z66VlOa?>XN5FYZR4$hw2*3o#8EiLV3#ipT&Zbf+K;#{=Cm<1^-Yccg
z$SZw@$X=h557={z5alTLg{`fJ@dPk=CX)#TKvV#v)Fc{FVIfd^#DKtihoJNWLmU)?
z@t+|Ro8*W?<YC9W4nnWO7!I5T(PWZ*4be7v(g|26=d&aN&^kF{d;wg{Hu?Dz5Pxlo
za1FpdIXA?$Lk?jI7~H4+1v!Ijo1CTqK}aKlb#ku9wL=b=JOTUUV<#Yu?zI3W5W*_C
zDS)|f+!c7bh<$Q~M-Y>~1;}6`M0@0B{c!>~5D-qf-5x)gabLAW<c6Ju960n_F37?W
z6$ta8_rQ+z2tNr&q3<Etpa4@udhot107DU-h}@ijDFO^~TOt4r!aqdKd(kC!YRUir
N002ovPDHLkV1kYhaeV*)

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/mozapps/profile/profileicon-XP.png b/toolkit/themes/windows/mozapps/profile/profileicon-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..e47705a53ce724e555504e5532342b1854314bc3
GIT binary patch
literal 760
zcmV<U0tfwxP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0008NNkl<Zc-noF
zT}V@57{~uRXP>&%IdvOMv{jm+&89^V83h(b_ay~|1_ne(5J3=ubmwJ&bX5=$kR=6K
zcSV|!StcV*XHDI7&bjaN^`4!b)0wC&m0tMs-aNk_56|<y8vN%x>AvXD>J87NOvV{a
zFt@rN4Ge6p*(P{-x9hsBC|yz}TPR7A-BMa?GU#>qGaJbI0?Rjg2S4@!P&Vr6e7OJ4
z)ibh!r&fEpjqt>xfub`R4Vd-KK@bRKq^VYumij&&j`=niDqlc|)LCY;Y6^^c#3C`I
zQVfVO1Czx7B8U))sNY*w`T&4^XMsSPEk%WxnwVB)A}X8RINo{+jYsQY+g%J9A~ad4
z@{pta@{R&2BUxsD`H@JZ;XLR<)3IjgbvjtBW!PW057u%62FAX<9S=pmZp=@cFJL)7
z!g6d$MRh6a8(h!|aWEVQj$x3MvM?7EfYNHifb;=?vaN%O-%HoLlVg)kryUtiz)Ell
ztDzMnR%2iiDJ=K{;#^9a0U+<Vg&)C?-($rv1-jF0Hq&gHSp(DY1eW}B7)*JxKG`vd
z*!1X*0vx$llss_ZVM*=D+WDb=C`?q{#wwN<!x)v_pby`tC7ty|G%_~?Ca|z|1{zmQ
z)$@)^?WYyRh+)=*wsSTZ=`3t}>fn7m0)Zu{bTkzB9iARBG;$UIzu5uR($jIJ{rpX%
zu>>3s7)%bl8ks?qWbx+nJf;?kprcF>c@eBgDp=p^cK{YQJMg&Ow=EWX4ql6_nBZ`>
zU?E9B1Odfn0)Z1ictO3RGJt9|Up58NSadlYN!QTyE>)m_=Owk6<bX|ZH5NiJ@F|@f
z?|Ywv|NTskrZTOqvDfMHw3#i{r4((@ibPa+CYoX6K`t5o8P7z#Gg$Gy1LPL~g872{
qtyHP0QDa?yCnA7o4p<M95Bvq4s8CNb6lVqi0000<MNUMnLSTZYAW|s+

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/mozapps/update/downloadButtons-XP.png b/toolkit/themes/windows/mozapps/update/downloadButtons-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..75777feb3e131e6597b038224489522d46e1c16b
GIT binary patch
literal 3057
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

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/mozapps/webextensions/category-available-XP.png b/toolkit/themes/windows/mozapps/webextensions/category-available-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..7b22f9cc85a6c4342325524f38cf41b61cdc5669
GIT binary patch
literal 1631
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

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/mozapps/webextensions/category-discover-XP.png b/toolkit/themes/windows/mozapps/webextensions/category-discover-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..dbdf9a12ba89f4bac0cb7c3ded3b2c2e3fb8d29f
GIT binary patch
literal 1289
zcmV+k1@`)hP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000EgNkl<ZcwW7i
z&u>&!6vw}J+M%VL>96T@N=s=G5N#U+Bub2GAVk<nG?A4H(;Zu5h;eVif8frAapQmC
z){WpoRFI%l1GJ?-Xv)0z?m6fB?s@a((i!ZuN#Uj^=iDFjKHqcBZRgcE=dhP?cwxXD
zKXU}k3=swkY0ONxfAcX`euxbAFuJkF;o<Y=UjcCfOL1z!Tbp37qk#P#FJ1sMs}I=+
z&%!TWfMk$1xa9=GFF^ncsc(f-8q3S5z>{Q2eJh;UqPqkg`~F)n@L{(*adrZwYHto`
zgA<biPJZ3%>dS)Vn-=vSo!J)wj@|Wgt@q3Mw_gL`4Q+4{!q7>8<1QEjIEU-l#dz)?
zqHnLBJy06#kE@4A;e-HV@ZIfOxc&MThL85ZbyFK$oPcA8jeCr@?$6+}xw#Br3Rqj(
z!20sWnT2nDy0NP}U<!o`$4<>+V#=Ue-NaaGU%WGgQ}>E^_{RpKt@wZ8=T{El+PNeC
zGitS3gcE1p@Xx%o>lXBt%b%7j<5>IW7M?sM<m026No@W0H-5Hj7?|#YDe^Y>n~P)k
zczy~GRwKXxFh0WwM`wpIIx+qUfa@JA@cri>n99VV3q5^3SX`<jig}w|Id&NHcLuO}
zH-e402|xYUD6X8CYCFHO9-~+k4Ap9<(`OeuSHQ_oxl$Peui^f~I)=+d<msql16&**
zNBwukukos`&D|Tp#p&@BmH^0)I{n#rN}y;J2M2}?9Hs&MxuXD6D4rV_oixejFL<z0
z*N5f;3XPfx9A>+Rv3kQQZ+3JDcNVuYb&}WBY0M&sHy2T^ya!Y0dS3<X)PnLz<!b+M
zCELs&1oa9QaTz4_?~YW}bPio>fV~AsSFsQMgCiIkt1WbF!C<vIUF<!8{^OT%?W@ZO
zDTPLaAXqq{=iAmPNl>a(COZlkskv7rzKb{poD*+8$YSB(#qV*5g~PmUO&~(pe6%#v
zQGhEz%j^sXI13B}>>=y{P9b`RGN4I~ATUI_&xUj_2o+uLEPxr3XR7_o0P<|+8WS8l
z?-c;?0;!of!e=t?7?!EC0NZ%KbI!G>_rk<0)JlM}J<*uK*}0}*ZorL5bB~BS3t(~}
z61bpVA;x<S{bk_*(>Sb!{y*y-EbXENmIy?o(Dn*svE*Q8Agl#(+LCQ>_14mEDnPK-
zLYg1}TC&W=NTbB$J!jS8TzEFuR>Fx^FecggjmV@Uu@;FXRZHFzA=Y{Bv;8C?*q9K-
z={&W_?<YQH-AjmJZDvVoQ6jMHJfpBv1-h&i56~>a1=EZ)b7J0B8PR#(qHy6%^AdY=
z5CB9jXC|!zG<yICe1<l$jj~JLYlTP?7<x=W49J63MCiLwcs3H&s3%2PmyRGHw4+zc
zYwb3m@o~sr_rN+=NVuF5E?u+#;X8_0nY{p>0^sKfDA~jd$iU8d-zY0Fq@@xN0p)NA
zj6VyP`PNsx(1H?xjUXVD-^Znd8I%yjF_?T7q)_s}0M|W1qyHp;@j?Kn!b3^|mpTIx
z<f8gLD{n*VC6vdHR*^(DfS4dGT0RzTtZUC3!jOFrG)ivrZ{+;NM4?98u)g9e4{m!a
z4i&&4fJp#j01ocsKd%Cy4qzF;zW~+&kgvdhKTJ9*kJ8zF00000NkvXXu0mjfpYCL1

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/mozapps/webextensions/category-plugins-XP.png b/toolkit/themes/windows/mozapps/webextensions/category-plugins-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..f21efa4511a575703243738bd9319fe0bcfb0e4c
GIT binary patch
literal 868
zcmV-q1DpJbP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80009kNkl<Zc-rli
z>q}Ho6va~@h)T);{0I6JKvaN=3K}Y^_(UB=O%>nx78GA-sw0l5f*>ZAWJsoFW~QiR
z<Ev^Y`x=p?;$)FfK?Xsr_8Mm(QZIMtLIepv&bfQ<v)8)UbIu$B@K^aa4E#4>Fqo68
zs@6v;D%Rc$Th-O;LlV1W%X7{cbF5)4*Jx;9^^?J{0lnUgrY18uZ*E@Qw&gizj5*eD
z&NY8zpr*zgDS$*pO(Qwki2QsL^72ebN-`okdIr`!=ZrDO8rE_Rb2jSjHc(&x;fjEU
zhAm`fzCcmYE0mYNwTx+LCd9?fLGpxi#(u5g8m_g~EZA*8uit(xprd08ZEc&VtJ^?j
z<r+uJv%#>A#>S6?^L=YNJI#<DWXEm;2E%8xw0uEo>Jo~JU&>p&L2K(KM?PEPQbW|#
z5GU0J+S_-|3i9^f5EL{9fB%s^FfKJjv8Ju<tF6vYwSmsg??nPgSlIo2n=@`l4Y{n^
zKv&m~I|4{;?K@;;t;nvPK|sJLM?PEPcGQp=)dqTcu+`lS$cWxvpsx?;?*|43fWbjv
zco-NR1;)pLu`$jWV~#bf<r=Qt?IFF$wrT^}*+vu;JeD&}mgRgeBR6*m+1ZQ2f*i4V
zWMs_C(R+lHlsP%~50IERi}?5%#Kuk`CT3E;!UQ5CClDS!j*yTs1P6~owE>Ekm93z(
zbeEEn=W@19C@g#?hMtO<C&<ZJ79)#DPhXJTZj_7YArca1<xZG}PB$e6CJ_;F522xV
zE#iTJx78bvH`iR;-+#y+1IwC=`}*EeZ$SR%nv47R+*EHsHk{_--rfVS;}k4vF7D-Z
zL)n1*IS5CD({j`_7x(n+2YXvJ91b#YR5&B&Tyt>`kLzG>YA6{vCY+N?Mssm@_dc*U
zHIxiE39fR(X)f;Ob`9)Jje`t03MT|Fxn4CFcXhoA_O@y`9%SI8a8d4d&BY0OTQwY&
zzJQPXuxKt$*jwofI0(mu^E%z6!mpbB;x^cu8cLh+u;3zG5d4H7jqtPfbfLyx1A9%-
urL%BKBb?dOCa!oDv%rd@#yF7Q^?m}WFO&?B7>=I+0000<MNUMnLSTXdHj|YA

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/mozapps/webextensions/category-recent-XP.png b/toolkit/themes/windows/mozapps/webextensions/category-recent-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..245dbcceeab0cb19f8568055fb416630dfdc2af7
GIT binary patch
literal 1605
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
Dgdz@O

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/mozapps/webextensions/extensionGeneric-16-XP.png b/toolkit/themes/windows/mozapps/webextensions/extensionGeneric-16-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..6153afd2e9f85da7b79bc7fd915c79158f01b558
GIT binary patch
literal 364
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}SAb85>;M1%IYJqDVi|!XR|JE2
zHluVQqihMI$25b8`HljqjMA0Nay4vn^~_3bEXo}$8jbuKlUQ`8a_P-sHR_TuUdm>&
zg3W3*uiXk!ht*<^eOivw)ST9d`)pG7n`R!q-5_?oL)=1-ge6|dd+bwI`sN?>FWnVg
zb}+K$KvM1T_|9WR-DeACUT#`^txrFIkqPK3u96_XU<QYR{SY8~q#yz)+V1J%7*Y{e
z+WSz*$w8#G+;!udO-ZdnLSB3SzkWC`P3m&VzuNn@>3Y9s*FMd0{i?I=kn~-BnOWOj
zx9{>%l3rA~f7$WBWqY46y8M1vtfpx7K{KrBU#0E4jYlp1O0$1){xbK_+RolM=_y5b
z+kdT?+Tf9qpP8)UG9^9h<EbTfEwUa5CB-k@-#Gt_)d}vO3NtS!0-eO*>FVdQ&MBb@
E09{v&JOBUy

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/mozapps/webextensions/localeGeneric-XP.png b/toolkit/themes/windows/mozapps/webextensions/localeGeneric-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..7122e88a473cfc4e8cf874753d7568a290c58ae3
GIT binary patch
literal 2387
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
FV1i74L(>2N

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/mozapps/webextensions/themeGeneric-16-XP.png b/toolkit/themes/windows/mozapps/webextensions/themeGeneric-16-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..eb4737f7097abd6fa6c1578848713e0bce4f1b45
GIT binary patch
literal 834
zcmV-I1HJr-P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0009CNkl<Zc-p0s
zaV(T^9LDc7sZC9jRauKM`75$2tESb|ENxoNGHqcfn@NJsh|-h`(7BGo4eADz?sVs_
z<1RNiU7UjpISo3;O^tI7^z;%ov-+p+_SyFR{`P#{ZSO+@@L&A(;eIUpFfCu~^7^gf
z9G&&?Bs0h@o$Ys|=bwVG`$gNIrf~uUqV5J|uV!Lsbncht$1<cs5gOv%@V+2hM=g|7
zgQKhWZxKXNURiVbiVw4fdHk7aK%Wa;KNU@>*U|JM1QWBs_Zgr}&_Cc8&UV@m5MSQO
z7j`ybZI%d(lO-^yT+os43i*@s=<e*muzm)EQ?nQ%+>A<Pr+0Aiu2n%gjqfvKSitgv
z5hGGArpL7~OgE#AeHraZrywuOL6cSiMh6uvITQ8$3bd$=xE=e>e^pQ`P(E4&pp#Ug
z)6WrIDWUkPRH8S}2W_d|7#aTwp<03{zAq@;P&BGFkZS-+mXx(BU=&J1=KyHM)sVQE
zg70Y$dEOoLJUfk+dNBs|K<n@fIK6!k4va%O42Zq~4|Ch<R|TPwr8Y9f$P@r*6f*Fh
zMnIM6fqHrz+9!ZdV?Y~$XaI;U(;}6pg>VRX%u=*&{Dp{wnhO;|wMZ=On5f7Xf}LJ~
zPhUpySqrp|0?h>30v)a-cOj6j0;eB{$&vB56eu(79_M8oQ=jp?NYKzXza$$2BtuK6
zQyG!Q8%Hohg=CHf70N{f#Pj1eg=sgAUn)$<0mJu9(8`{eE2j%pbD(5MXaUi0Zqm8x
zfjTwto*<=iaMClN#CjuK;Op#~7wD#A26>gQ-;$W^k)>h{t_2nEUD?B_lFV8n%xX5k
zH=5_asfpP>PF2Oh&c=%lmJaK;yGb=^yuM{br8m-U#njx&;*O0LNcD?X@8mt$sIm!}
zOg?L8=^p3dC~~#63?Y$72MO#54mi1bMWvN17hiDtkjRq3pHkFrf7HXDY+`1*Nnmef
z?qp?dW=n*25bRmQf=u3KVX@cd#J)q0?iN<I$4I1YyNSCgf!Vs?H)kKPlRWm<;s5{u
M07*qoM6N<$g0G#4=Kufz

literal 0
HcmV?d00001

diff --git a/toolkit/themes/windows/mozapps/webextensions/themeGeneric-XP.png b/toolkit/themes/windows/mozapps/webextensions/themeGeneric-XP.png
new file mode 100644
index 0000000000000000000000000000000000000000..53ab2b992082566240378c5dc8f817b0aa64e767
GIT binary patch
literal 2165
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

literal 0
HcmV?d00001

diff --git a/toolkit/xre/nsAppRunner.cpp b/toolkit/xre/nsAppRunner.cpp
index e43aea926..a3bbe3675 100644
--- a/toolkit/xre/nsAppRunner.cpp
+++ b/toolkit/xre/nsAppRunner.cpp
@@ -98,6 +98,7 @@
 #include <intrin.h>
 #include <math.h>
 #include "cairo/cairo-features.h"
+#include "mozilla/WindowsVersion.h"
 #include "mozilla/mscom/MainThreadRuntime.h"
 #include "mozilla/widget/AudioSession.h"
 
@@ -2822,7 +2823,10 @@ XREMain::XRE_mainInit(bool* aExitFlag)
     // manual font file I/O on _all_ system fonts.  To avoid this, load the
     // dwrite library and create a factory as early as possible so that the
     // FntCache service is ready by the time it's needed.
-    CreateThread(nullptr, 0, &InitDwriteBG, nullptr, 0, nullptr);
+
+    if (IsVistaOrLater()) {
+      CreateThread(nullptr, 0, &InitDwriteBG, nullptr, 0, nullptr);
+    }
   }
 #endif
 
@@ -4206,7 +4210,7 @@ enum {
   kE10sDisabledForAddons = 7,
   kE10sForceDisabled = 8,
   // kE10sDisabledForXPAcceleration = 9, removed in bug 1296353
-  // kE10sDisabledForOperatingSystem = 10, removed due to xp-eol
+  kE10sDisabledForOperatingSystem = 10,
 };
 
 const char* kAccessibilityLastRunDatePref = "accessibility.lastLoadDate";
diff --git a/toolkit/xre/nsEmbedFunctions.cpp b/toolkit/xre/nsEmbedFunctions.cpp
index 1498b0d17..a5a60af8a 100644
--- a/toolkit/xre/nsEmbedFunctions.cpp
+++ b/toolkit/xre/nsEmbedFunctions.cpp
@@ -24,7 +24,6 @@
 
 #ifdef XP_WIN
 #include <process.h>
-#include <shobjidl.h>
 #include "mozilla/ipc/WindowsMessageLoop.h"
 #endif
 
@@ -107,6 +106,10 @@ using mozilla::startup::sChildProcessType;
 
 static NS_DEFINE_CID(kAppShellCID, NS_APPSHELL_CID);
 
+#ifdef XP_WIN
+static const wchar_t kShellLibraryName[] =  L"shell32.dll";
+#endif
+
 nsresult
 XRE_LockProfileDirectory(nsIFile* aDirectory,
                          nsISupports* *aLockObject)
@@ -230,9 +233,26 @@ XRE_SetProcessType(const char* aProcessTypeString)
 void
 SetTaskbarGroupId(const nsString& aId)
 {
-    if (FAILED(SetCurrentProcessExplicitAppUserModelID(aId.get()))) {
+    typedef HRESULT (WINAPI * SetCurrentProcessExplicitAppUserModelIDPtr)(PCWSTR AppID);
+
+    SetCurrentProcessExplicitAppUserModelIDPtr funcAppUserModelID = nullptr;
+
+    HMODULE hDLL = ::LoadLibraryW(kShellLibraryName);
+
+    funcAppUserModelID = (SetCurrentProcessExplicitAppUserModelIDPtr)
+                          GetProcAddress(hDLL, "SetCurrentProcessExplicitAppUserModelID");
+
+    if (!funcAppUserModelID) {
+        ::FreeLibrary(hDLL);
+        return;
+    }
+
+    if (FAILED(funcAppUserModelID(aId.get()))) {
         NS_WARNING("SetCurrentProcessExplicitAppUserModelID failed for child process.");
     }
+
+    if (hDLL)
+        ::FreeLibrary(hDLL);
 }
 #endif
 
diff --git a/toolkit/xre/nsXREDirProvider.cpp b/toolkit/xre/nsXREDirProvider.cpp
index d904cb83a..b12abf2a7 100644
--- a/toolkit/xre/nsXREDirProvider.cpp
+++ b/toolkit/xre/nsXREDirProvider.cpp
@@ -48,6 +48,7 @@
 #ifdef XP_WIN
 #include <windows.h>
 #include <shlobj.h>
+#include "mozilla/WindowsVersion.h"
 #endif
 #ifdef XP_MACOSX
 #include "nsILocalFileMac.h"
diff --git a/toolkit/xre/test/win/TestDllInterceptor.cpp b/toolkit/xre/test/win/TestDllInterceptor.cpp
index 57d68ea77..dff71817f 100644
--- a/toolkit/xre/test/win/TestDllInterceptor.cpp
+++ b/toolkit/xre/test/win/TestDllInterceptor.cpp
@@ -2,6 +2,11 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
+#if _WIN32_WINNT < 0x0600
+#undef _WIN32_WINNT
+#define _WIN32_WINNT 0x0600
+#endif
+
 #include <shlobj.h>
 #include <stdio.h>
 
diff --git a/widget/GfxInfoBase.cpp b/widget/GfxInfoBase.cpp
index c937f5099..953c8c902 100644
--- a/widget/GfxInfoBase.cpp
+++ b/widget/GfxInfoBase.cpp
@@ -241,7 +241,13 @@ RemovePrefForDriverVersion()
 static OperatingSystem
 BlacklistOSToOperatingSystem(const nsAString& os)
 {
-  if (os.EqualsLiteral("WINNT 6.1"))
+  if (os.EqualsLiteral("WINNT 5.1"))
+    return OperatingSystem::WindowsXP;
+  else if (os.EqualsLiteral("WINNT 5.2"))
+    return OperatingSystem::WindowsServer2003;
+  else if (os.EqualsLiteral("WINNT 6.0"))
+    return OperatingSystem::WindowsVista;
+  else if (os.EqualsLiteral("WINNT 6.1"))
     return OperatingSystem::Windows7;
   else if (os.EqualsLiteral("WINNT 6.2"))
     return OperatingSystem::Windows8;
diff --git a/widget/LookAndFeel.h b/widget/LookAndFeel.h
index cf84b3308..e2502c559 100644
--- a/widget/LookAndFeel.h
+++ b/widget/LookAndFeel.h
@@ -440,7 +440,9 @@ public:
    * Operating system versions.
    */
   enum OperatingSystemVersion {
-    eOperatingSystemVersion_Windows7 = 2,
+    eOperatingSystemVersion_WindowsXP = 0,
+    eOperatingSystemVersion_WindowsVista,
+    eOperatingSystemVersion_Windows7,
     eOperatingSystemVersion_Windows8,
     eOperatingSystemVersion_Windows10,
     eOperatingSystemVersion_Unknown
diff --git a/widget/windows/GfxInfo.cpp b/widget/windows/GfxInfo.cpp
index 8a429ad32..5c80703a4 100644
--- a/widget/windows/GfxInfo.cpp
+++ b/widget/windows/GfxInfo.cpp
@@ -235,6 +235,9 @@ ParseIDFromDeviceID(const nsAString &key, const char *prefix, int length)
 // based on http://msdn.microsoft.com/en-us/library/ms724834(VS.85).aspx
 enum {
   kWindowsUnknown = 0,
+  kWindowsXP = 0x50001,
+  kWindowsServer2003 = 0x50002,
+  kWindowsVista = 0x60000,
   kWindows7 = 0x60001,
   kWindows8 = 0x60002,
   kWindows8_1 = 0x60003,
@@ -725,6 +728,12 @@ static OperatingSystem
 WindowsVersionToOperatingSystem(int32_t aWindowsVersion)
 {
   switch(aWindowsVersion) {
+    case kWindowsXP:
+      return OperatingSystem::WindowsXP;
+    case kWindowsServer2003:
+      return OperatingSystem::WindowsServer2003;
+    case kWindowsVista:
+      return OperatingSystem::WindowsVista;
     case kWindows7:
       return OperatingSystem::Windows7;
     case kWindows8:
@@ -753,6 +762,11 @@ GfxInfo::GetGfxDriverInfo()
     /*
      * NVIDIA entries
      */
+    APPEND_TO_DRIVER_BLOCKLIST(OperatingSystem::WindowsXP,
+      (nsAString&) GfxDriverInfo::GetDeviceVendor(VendorNVIDIA), GfxDriverInfo::allDevices,
+      GfxDriverInfo::allFeatures, nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION,
+      DRIVER_LESS_THAN_OR_EQUAL, V(6,14,11,8745), "FEATURE_FAILURE_NV_XP", "nVidia driver > 187.45" );
+
     /*
      * The last 5 digit of the NVIDIA driver version maps to the version that
      * NVIDIA uses. The minor version (15, 16, 17) corresponds roughtly to the
@@ -763,17 +777,33 @@ GfxInfo::GetGfxDriverInfo()
      * 187.45 (late October 2009) and earlier contain a bug which can cause us
      * to crash on shutdown.
      */
+    APPEND_TO_DRIVER_BLOCKLIST(OperatingSystem::WindowsVista,
+      (nsAString&) GfxDriverInfo::GetDeviceVendor(VendorNVIDIA), GfxDriverInfo::allDevices,
+      GfxDriverInfo::allFeatures, nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION,
+      DRIVER_LESS_THAN_OR_EQUAL, V(8,15,11,8745),
+      "FEATURE_FAILURE_NV_VISTA_15", "nVidia driver > 187.45" );
     APPEND_TO_DRIVER_BLOCKLIST(OperatingSystem::Windows7,
       (nsAString&) GfxDriverInfo::GetDeviceVendor(VendorNVIDIA), GfxDriverInfo::allDevices,
       GfxDriverInfo::allFeatures, nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION,
       DRIVER_LESS_THAN_OR_EQUAL, V(8,15,11,8745),
       "FEATURE_FAILURE_NV_W7_15", "nVidia driver > 187.45" );
+    APPEND_TO_DRIVER_BLOCKLIST_RANGE(OperatingSystem::WindowsVista,
+      (nsAString&) GfxDriverInfo::GetDeviceVendor(VendorNVIDIA), GfxDriverInfo::allDevices,
+      GfxDriverInfo::allFeatures, nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION,
+      DRIVER_BETWEEN_INCLUSIVE_START, V(8,16,10,0000), V(8,16,11,8745),
+      "FEATURE_FAILURE_NV_VISTA_16", "nVidia driver > 187.45" );
     APPEND_TO_DRIVER_BLOCKLIST_RANGE(OperatingSystem::Windows7,
       (nsAString&) GfxDriverInfo::GetDeviceVendor(VendorNVIDIA), GfxDriverInfo::allDevices,
       GfxDriverInfo::allFeatures, nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION,
       DRIVER_BETWEEN_INCLUSIVE_START, V(8,16,10,0000), V(8,16,11,8745),
       "FEATURE_FAILURE_NV_W7_16", "nVidia driver > 187.45" );
     // Telemetry doesn't show any driver in this range so it might not even be required.
+    APPEND_TO_DRIVER_BLOCKLIST_RANGE(OperatingSystem::WindowsVista,
+      (nsAString&) GfxDriverInfo::GetDeviceVendor(VendorNVIDIA), GfxDriverInfo::allDevices,
+      GfxDriverInfo::allFeatures, nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION,
+      DRIVER_BETWEEN_INCLUSIVE_START, V(8,17,10,0000), V(8,17,11,8745),
+      "FEATURE_FAILURE_NV_VISTA_17", "nVidia driver > 187.45" );
+    // Telemetry doesn't show any driver in this range so it might not even be required.
     APPEND_TO_DRIVER_BLOCKLIST_RANGE(OperatingSystem::Windows7,
       (nsAString&) GfxDriverInfo::GetDeviceVendor(VendorNVIDIA), GfxDriverInfo::allDevices,
       GfxDriverInfo::allFeatures, nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION,
@@ -871,6 +901,13 @@ GfxInfo::GetGfxDriverInfo()
         nsIGfxInfo::FEATURE_DIRECT2D, nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION,                                               \
         DRIVER_BUILD_ID_LESS_THAN, driverVer, ruleId )
 
+    IMPLEMENT_INTEL_DRIVER_BLOCKLIST_D2D(OperatingSystem::WindowsVista, IntelGMA500,   1006, "FEATURE_FAILURE_594877_1");
+    IMPLEMENT_INTEL_DRIVER_BLOCKLIST_D2D(OperatingSystem::WindowsVista, IntelGMA900,   GfxDriverInfo::allDriverVersions, "FEATURE_FAILURE_594877_2");
+    IMPLEMENT_INTEL_DRIVER_BLOCKLIST_D2D(OperatingSystem::WindowsVista, IntelGMA950,   1504, "FEATURE_FAILURE_594877_3");
+    IMPLEMENT_INTEL_DRIVER_BLOCKLIST_D2D(OperatingSystem::WindowsVista, IntelGMA3150,  2124, "FEATURE_FAILURE_594877_4");
+    IMPLEMENT_INTEL_DRIVER_BLOCKLIST_D2D(OperatingSystem::WindowsVista, IntelGMAX3000, 1666, "FEATURE_FAILURE_594877_5");
+    IMPLEMENT_INTEL_DRIVER_BLOCKLIST_D2D(OperatingSystem::WindowsVista, IntelHDGraphicsToSandyBridge, 2202, "FEATURE_FAILURE_594877_6");
+
     IMPLEMENT_INTEL_DRIVER_BLOCKLIST_D2D(OperatingSystem::Windows7, IntelGMA500,   2026, "FEATURE_FAILURE_594877_7");
     IMPLEMENT_INTEL_DRIVER_BLOCKLIST_D2D(OperatingSystem::Windows7, IntelGMA900,   GfxDriverInfo::allDriverVersions, "FEATURE_FAILURE_594877_8");
     IMPLEMENT_INTEL_DRIVER_BLOCKLIST_D2D(OperatingSystem::Windows7, IntelGMA950,   1930, "FEATURE_FAILURE_594877_9");
@@ -887,6 +924,31 @@ GfxInfo::GetGfxDriverInfo()
       nsIGfxInfo::FEATURE_DIRECT2D, nsIGfxInfo::FEATURE_BLOCKED_DEVICE,
       DRIVER_LESS_THAN, GfxDriverInfo::allDriverVersions, "FEATURE_FAILURE_1180379");
 
+    IMPLEMENT_INTEL_DRIVER_BLOCKLIST(OperatingSystem::WindowsXP, IntelGMA500,   V(3,0,20,3200), "FEATURE_FAILURE_INTEL_1");
+    IMPLEMENT_INTEL_DRIVER_BLOCKLIST(OperatingSystem::WindowsXP, IntelGMA900,   V(6,14,10,4764), "FEATURE_FAILURE_INTEL_2");
+    IMPLEMENT_INTEL_DRIVER_BLOCKLIST(OperatingSystem::WindowsXP, IntelGMA950,   V(6,14,10,4926), "FEATURE_FAILURE_INTEL_3");
+    IMPLEMENT_INTEL_DRIVER_BLOCKLIST(OperatingSystem::WindowsXP, IntelGMA3150,  V(6,14,10,5134), "FEATURE_FAILURE_INTEL_4");
+    IMPLEMENT_INTEL_DRIVER_BLOCKLIST(OperatingSystem::WindowsXP, IntelGMAX3000, V(6,14,10,5218), "FEATURE_FAILURE_INTEL_5");
+    IMPLEMENT_INTEL_DRIVER_BLOCKLIST(OperatingSystem::WindowsXP, IntelGMAX4500HD, V(6,14,10,4969), "FEATURE_FAILURE_INTEL_6");
+    IMPLEMENT_INTEL_DRIVER_BLOCKLIST(OperatingSystem::WindowsXP, IntelHDGraphicsToSandyBridge, V(6,14,10,4969), "FEATURE_FAILURE_INTEL_7");
+
+    // StrechRect seems to suffer from precision issues which leads to artifacting
+    // during content drawing starting with at least version 6.14.10.5082
+    // and going until 6.14.10.5218. See bug 919454 and bug 949275 for more info.
+    APPEND_TO_DRIVER_BLOCKLIST_RANGE(OperatingSystem::WindowsXP,
+      const_cast<nsAString&>(GfxDriverInfo::GetDeviceVendor(VendorIntel)),
+      const_cast<GfxDeviceFamily*>(GfxDriverInfo::GetDeviceFamily(IntelGMAX4500HD)),
+      GfxDriverInfo::allFeatures, nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION,
+      DRIVER_BETWEEN_EXCLUSIVE, V(6,14,10,5076), V(6,14,10,5218), "FEATURE_FAILURE_INTEL_8", "6.14.10.5218");
+
+    IMPLEMENT_INTEL_DRIVER_BLOCKLIST(OperatingSystem::WindowsVista, IntelGMA500,   V(3,0,20,3200), "FEATURE_FAILURE_INTEL_9");
+    IMPLEMENT_INTEL_DRIVER_BLOCKLIST(OperatingSystem::WindowsVista, IntelGMA900,   GfxDriverInfo::allDriverVersions, "FEATURE_FAILURE_INTEL_10");
+    IMPLEMENT_INTEL_DRIVER_BLOCKLIST(OperatingSystem::WindowsVista, IntelGMA950,   V(7,14,10,1504), "FEATURE_FAILURE_INTEL_11");
+    IMPLEMENT_INTEL_DRIVER_BLOCKLIST(OperatingSystem::WindowsVista, IntelGMA3150,  V(7,14,10,1910), "FEATURE_FAILURE_INTEL_12");
+    IMPLEMENT_INTEL_DRIVER_BLOCKLIST(OperatingSystem::WindowsVista, IntelGMAX3000, V(7,15,10,1666), "FEATURE_FAILURE_INTEL_13");
+    IMPLEMENT_INTEL_DRIVER_BLOCKLIST(OperatingSystem::WindowsVista, IntelGMAX4500HD, V(7,15,10,1666), "FEATURE_FAILURE_INTEL_14");
+    IMPLEMENT_INTEL_DRIVER_BLOCKLIST(OperatingSystem::WindowsVista, IntelHDGraphicsToSandyBridge, V(7,15,10,1666), "FEATURE_FAILURE_INTEL_15");
+
     IMPLEMENT_INTEL_DRIVER_BLOCKLIST(OperatingSystem::Windows7, IntelGMA500,   V(5,0,0,2026), "FEATURE_FAILURE_INTEL_16");
     IMPLEMENT_INTEL_DRIVER_BLOCKLIST(OperatingSystem::Windows7, IntelGMA900,   GfxDriverInfo::allDriverVersions, "FEATURE_FAILURE_INTEL_17");
     IMPLEMENT_INTEL_DRIVER_BLOCKLIST(OperatingSystem::Windows7, IntelGMA950,   V(8,15,10,1930), "FEATURE_FAILURE_INTEL_18");
@@ -1140,6 +1202,23 @@ GfxInfo::GetFeatureStatusImpl(int32_t aFeature,
       return NS_OK;
     }
 
+    // special-case the WinXP test slaves: they have out-of-date drivers, but we still want to
+    // whitelist them, actually we do know that this combination of device and driver version
+    // works well.
+    if (mWindowsVersion == kWindowsXP &&
+        adapterVendorID.Equals(GfxDriverInfo::GetDeviceVendor(VendorNVIDIA), nsCaseInsensitiveStringComparator()) &&
+        adapterDeviceID.LowerCaseEqualsLiteral("0x0861") && // GeForce 9400
+        driverVersion == V(6,14,11,7756))
+    {
+      *aStatus = FEATURE_STATUS_OK;
+      return NS_OK;
+    }
+
+    // Windows Server 2003 should be just like Windows XP for present purpose, but still has a different version number.
+    // OTOH Windows Server 2008 R1 and R2 already have the same version numbers as Vista and Seven respectively
+    if (os == OperatingSystem::WindowsServer2003)
+      os = OperatingSystem::WindowsXP;
+
     if (mHasDriverVersionMismatch) {
       *aStatus = nsIGfxInfo::FEATURE_BLOCKED_MISMATCHED_VERSION;
       return NS_OK;
diff --git a/widget/windows/KeyboardLayout.cpp b/widget/windows/KeyboardLayout.cpp
index 9166d97d7..06257625c 100644
--- a/widget/windows/KeyboardLayout.cpp
+++ b/widget/windows/KeyboardLayout.cpp
@@ -1360,6 +1360,34 @@ NativeKey::InitWithKeyChar()
         break;
       }
 
+      if (!CanComputeVirtualKeyCodeFromScanCode()) {
+        // The right control key and the right alt key are extended keys.
+        // Therefore, we never get VK_RCONTRL and VK_RMENU for the result of
+        // MapVirtualKeyEx() on WinXP or WinServer2003.
+        //
+        // If VK_SHIFT, VK_CONTROL or VK_MENU key message is caused by well
+        // known scan code, we should decide it as Right key.  Otherwise,
+        // decide it as Left key.
+        switch (mOriginalVirtualKeyCode) {
+          case VK_CONTROL:
+            mVirtualKeyCode =
+              mIsExtended && mScanCode == 0x1D ? VK_RCONTROL : VK_LCONTROL;
+            break;
+          case VK_MENU:
+            mVirtualKeyCode =
+              mIsExtended && mScanCode == 0x38 ? VK_RMENU : VK_LMENU;
+            break;
+          case VK_SHIFT:
+            // Neither left shift nor right shift is an extended key,
+            // let's use VK_LSHIFT for unknown mapping.
+            mVirtualKeyCode = VK_LSHIFT;
+            break;
+          default:
+            MOZ_CRASH("Unsupported mOriginalVirtualKeyCode");
+        }
+        break;
+      }
+
       NS_ASSERTION(!mVirtualKeyCode,
                    "mVirtualKeyCode has been computed already");
 
@@ -1416,6 +1444,11 @@ NativeKey::InitWithKeyChar()
       //       scancode, we cannot compute virtual keycode.  I.e., with such
       //       applications, we cannot generate proper KeyboardEvent.code value.
 
+      // We cannot compute the virtual key code from WM_CHAR message on WinXP
+      // if it's caused by an extended key.
+      if (!CanComputeVirtualKeyCodeFromScanCode()) {
+        break;
+      }
       mVirtualKeyCode = mOriginalVirtualKeyCode =
         ComputeVirtualKeyCodeFromScanCodeEx();
       NS_ASSERTION(mVirtualKeyCode, "Failed to compute virtual keycode");
@@ -1833,6 +1866,18 @@ NativeKey::GetKeyLocation() const
   }
 }
 
+bool
+NativeKey::CanComputeVirtualKeyCodeFromScanCode() const
+{
+  // Vista or later supports ScanCodeEx.
+  if (IsVistaOrLater()) {
+    return true;
+  }
+  // Otherwise, MapVirtualKeyEx() can compute virtual keycode only with
+  // non-extended key.
+  return !mIsExtended;
+}
+
 uint8_t
 NativeKey::ComputeVirtualKeyCodeFromScanCode() const
 {
@@ -1846,6 +1891,12 @@ NativeKey::ComputeVirtualKeyCodeFromScanCodeEx() const
   // MapVirtualKeyEx() has been improved for supporting extended keys since
   // Vista.  When we call it for mapping a scancode of an extended key and
   // a virtual keycode, we need to add 0xE000 to the scancode.
+  // On the other hand, neither WinXP nor WinServer2003 doesn't support 0xE000.
+  // Therefore, we have no way to get virtual keycode from scan code of
+  // extended keys.
+  if (NS_WARN_IF(!CanComputeVirtualKeyCodeFromScanCode())) {
+    return 0;
+  }
   return static_cast<uint8_t>(
            ::MapVirtualKeyEx(GetScanCodeWithExtendedFlag(), MAPVK_VSC_TO_VK_EX,
                              mKeyboardLayout));
@@ -1856,7 +1907,8 @@ NativeKey::ComputeScanCodeExFromVirtualKeyCode(UINT aVirtualKeyCode) const
 {
   return static_cast<uint16_t>(
            ::MapVirtualKeyEx(aVirtualKeyCode,
-                             MAPVK_VK_TO_VSC_EX,
+                             IsVistaOrLater() ? MAPVK_VK_TO_VSC_EX :
+                                                MAPVK_VK_TO_VSC,
                              mKeyboardLayout));
 }
 
@@ -4176,7 +4228,8 @@ KeyboardLayout::LoadLayout(HKL aLayout)
 
   if (MOZ_LOG_TEST(sKeyboardLayoutLogger, LogLevel::Verbose)) {
     static const UINT kExtendedScanCode[] = { 0x0000, 0xE000 };
-    static const UINT kMapType = MAPVK_VSC_TO_VK_EX;
+    static const UINT kMapType =
+      IsVistaOrLater() ? MAPVK_VSC_TO_VK_EX : MAPVK_VSC_TO_VK;
     MOZ_LOG(sKeyboardLayoutLogger, LogLevel::Verbose,
       ("Logging virtual keycode values for scancode (0x%p)...",
        mKeyboardLayout));
@@ -4188,6 +4241,11 @@ KeyboardLayout::LoadLayout(HKL aLayout)
         MOZ_LOG(sKeyboardLayoutLogger, LogLevel::Verbose,
           ("0x%04X, %s", scanCode, kVirtualKeyName[virtualKeyCode]));
       }
+      // XP and Server 2003 don't support 0xE0 prefix of the scancode.
+      // Therefore, we don't need to continue on them.
+      if (!IsVistaOrLater()) {
+        break;
+      }
     }
   }
 }
diff --git a/widget/windows/KeyboardLayout.h b/widget/windows/KeyboardLayout.h
index 70aacc80e..dd2ac0bfc 100644
--- a/widget/windows/KeyboardLayout.h
+++ b/widget/windows/KeyboardLayout.h
@@ -559,6 +559,11 @@ private:
    */
   bool GetFollowingCharMessage(MSG& aCharMsg);
 
+  /**
+   * Whether the key event can compute virtual keycode from the scancode value.
+   */
+  bool CanComputeVirtualKeyCodeFromScanCode() const;
+
   /**
    * Wraps MapVirtualKeyEx() with MAPVK_VSC_TO_VK.
    */
diff --git a/widget/windows/TSFTextStore.cpp b/widget/windows/TSFTextStore.cpp
index 7224126b8..fb0505aa3 100644
--- a/widget/windows/TSFTextStore.cpp
+++ b/widget/windows/TSFTextStore.cpp
@@ -5762,7 +5762,8 @@ TSFTextStore::Initialize()
     return;
   }
 
-  bool enableTsf = Preferences::GetBool(kPrefNameEnableTSF, false);
+  bool enableTsf =
+    IsVistaOrLater() && Preferences::GetBool(kPrefNameEnableTSF, false);
   MOZ_LOG(sTextStoreLog, LogLevel::Info,
     ("  TSFTextStore::Initialize(), TSF is %s",
      enableTsf ? "enabled" : "disabled"));
diff --git a/widget/windows/TaskbarPreview.cpp b/widget/windows/TaskbarPreview.cpp
index 6c15df2e0..c897af021 100644
--- a/widget/windows/TaskbarPreview.cpp
+++ b/widget/windows/TaskbarPreview.cpp
@@ -28,9 +28,7 @@
 #include "mozilla/Telemetry.h"
 
 // Defined in dwmapi in a header that needs a higher numbered _WINNT #define
-#ifndef DWM_SIT_DISPLAYFRAME
 #define DWM_SIT_DISPLAYFRAME 0x1
-#endif
 
 namespace mozilla {
 namespace widget {
diff --git a/widget/windows/WinMouseScrollHandler.cpp b/widget/windows/WinMouseScrollHandler.cpp
index e157b1be2..10937ba51 100644
--- a/widget/windows/WinMouseScrollHandler.cpp
+++ b/widget/windows/WinMouseScrollHandler.cpp
@@ -992,7 +992,10 @@ MouseScrollHandler::SystemSettings::InitScrollChars()
                                      &mScrollChars, 0)) {
     MOZ_LOG(gMouseScrollLog, LogLevel::Info,
       ("MouseScroll::SystemSettings::InitScrollChars(): ::SystemParametersInfo("
-       "SPI_GETWHEELSCROLLCHARS) failed, this is unexpected on Vista or later"));
+       "SPI_GETWHEELSCROLLCHARS) failed, %s",
+       IsVistaOrLater() ?
+         "this is unexpected on Vista or later" :
+         "but on XP or earlier, this is not a problem"));
     // XXX Should we use DefaultScrollChars()?
     mScrollChars = 1;
   }
@@ -1078,7 +1081,7 @@ bool
 MouseScrollHandler::SystemSettings::IsOverridingSystemScrollSpeedAllowed()
 {
   return mScrollLines == DefaultScrollLines() &&
-         mScrollChars == DefaultScrollChars();
+         (!IsVistaOrLater() || mScrollChars == DefaultScrollChars());
 }
 
 /******************************************************************************
diff --git a/widget/windows/WinTaskbar.cpp b/widget/windows/WinTaskbar.cpp
index 530cfd5b9..698b7ec0e 100644
--- a/widget/windows/WinTaskbar.cpp
+++ b/widget/windows/WinTaskbar.cpp
@@ -34,6 +34,8 @@
 #include <propkey.h>
 #include <shellapi.h>
 
+const wchar_t kShellLibraryName[] =  L"shell32.dll";
+
 static NS_DEFINE_CID(kJumpListBuilderCID, NS_WIN_JUMPLISTBUILDER_CID);
 
 namespace {
@@ -75,14 +77,30 @@ SetWindowAppUserModelProp(mozIDOMWindow *aParent,
   if (!toplevelHWND)
     return NS_ERROR_INVALID_ARG;
 
-  RefPtr<IPropertyStore> pPropStore;
-  if (FAILED(SHGetPropertyStoreForWindow(toplevelHWND, IID_IPropertyStore,
-                                         getter_AddRefs(pPropStore)))) {
+  typedef HRESULT (WINAPI * SHGetPropertyStoreForWindowPtr)
+                    (HWND hwnd, REFIID riid, void** ppv);
+  SHGetPropertyStoreForWindowPtr funcGetProStore = nullptr;
+
+  HMODULE hDLL = ::LoadLibraryW(kShellLibraryName);
+  funcGetProStore = (SHGetPropertyStoreForWindowPtr)
+    GetProcAddress(hDLL, "SHGetPropertyStoreForWindow");
+
+  if (!funcGetProStore) {
+    FreeLibrary(hDLL);
+    return NS_ERROR_NO_INTERFACE;
+  }
+
+  IPropertyStore* pPropStore;
+  if (FAILED(funcGetProStore(toplevelHWND,
+                             IID_PPV_ARGS(&pPropStore)))) {
+    FreeLibrary(hDLL);
     return NS_ERROR_INVALID_ARG;
   }
 
   PROPVARIANT pv;
   if (FAILED(InitPropVariantFromString(aIdentifier.get(), &pv))) {
+    pPropStore->Release();
+    FreeLibrary(hDLL);
     return NS_ERROR_UNEXPECTED;
   }
 
@@ -93,6 +111,8 @@ SetWindowAppUserModelProp(mozIDOMWindow *aParent,
   }
 
   PropVariantClear(&pv);
+  pPropStore->Release();
+  FreeLibrary(hDLL);
 
   return rv;
 }
@@ -319,18 +339,40 @@ WinTaskbar::GetDefaultGroupId(nsAString & aDefaultGroupId) {
 // (static) Called from AppShell
 bool
 WinTaskbar::RegisterAppUserModelID() {
+  if (!IsWin7OrLater())
+    return false;
+
+  SetCurrentProcessExplicitAppUserModelIDPtr funcAppUserModelID = nullptr;
+  bool retVal = false;
+
   nsAutoString uid;
   if (!GetAppUserModelID(uid))
     return false;
 
-  return SUCCEEDED(SetCurrentProcessExplicitAppUserModelID(uid.get()));
+  HMODULE hDLL = ::LoadLibraryW(kShellLibraryName);
+
+  funcAppUserModelID = (SetCurrentProcessExplicitAppUserModelIDPtr)
+                        GetProcAddress(hDLL, "SetCurrentProcessExplicitAppUserModelID");
+
+  if (!funcAppUserModelID) {
+    ::FreeLibrary(hDLL);
+    return false;
+  }
+
+  if (SUCCEEDED(funcAppUserModelID(uid.get())))
+    retVal = true;
+
+  if (hDLL)
+    ::FreeLibrary(hDLL);
+
+  return retVal;
 }
 
 NS_IMETHODIMP
 WinTaskbar::GetAvailable(bool *aAvailable) {
   // ITaskbarList4::HrInit() may fail with shell extensions like blackbox
   // installed. Initialize early to return available=false in those cases.
-  *aAvailable = Initialize();
+  *aAvailable = IsWin7OrLater() && Initialize();
 
   return NS_OK;
 }
diff --git a/widget/windows/WinUtils.cpp b/widget/windows/WinUtils.cpp
index bd42e78f6..a6e8f0361 100644
--- a/widget/windows/WinUtils.cpp
+++ b/widget/windows/WinUtils.cpp
@@ -462,7 +462,7 @@ static NtTestAlertPtr sNtTestAlert = nullptr;
 void
 WinUtils::Initialize()
 {
-  if (!sDwmDll) {
+  if (!sDwmDll && IsVistaOrLater()) {
     sDwmDll = ::LoadLibraryW(kDwmLibraryName);
 
     if (sDwmDll) {
@@ -601,7 +601,7 @@ WinUtils::SystemScaleFactor()
   return systemScale;
 }
 
-#if WINVER < 0x603
+#ifndef WM_POINTERDEVICECHANGE
 typedef enum {
   MDT_EFFECTIVE_DPI = 0,
   MDT_ANGULAR_DPI = 1,
@@ -628,14 +628,16 @@ GETPROCESSDPIAWARENESSPROC sGetProcessDpiAwareness;
 static bool
 SlowIsPerMonitorDPIAware()
 {
-  // Intentionally leak the handle.
-  HMODULE shcore =
-    LoadLibraryEx(L"shcore", NULL, LOAD_LIBRARY_SEARCH_SYSTEM32);
-  if (shcore) {
-    sGetDpiForMonitor =
-      (GETDPIFORMONITORPROC) GetProcAddress(shcore, "GetDpiForMonitor");
-    sGetProcessDpiAwareness =
-      (GETPROCESSDPIAWARENESSPROC) GetProcAddress(shcore, "GetProcessDpiAwareness");
+  if (IsVistaOrLater()) {
+    // Intentionally leak the handle.
+    HMODULE shcore =
+      LoadLibraryEx(L"shcore", NULL, LOAD_LIBRARY_SEARCH_SYSTEM32);
+    if (shcore) {
+      sGetDpiForMonitor =
+        (GETDPIFORMONITORPROC) GetProcAddress(shcore, "GetDpiForMonitor");
+      sGetProcessDpiAwareness =
+        (GETPROCESSDPIAWARENESSPROC) GetProcAddress(shcore, "GetProcessDpiAwareness");
+    }
   }
   PROCESS_DPI_AWARENESS dpiAwareness;
   return sGetDpiForMonitor && sGetProcessDpiAwareness &&
@@ -758,7 +760,7 @@ static DWORD
 GetWaitFlags()
 {
   DWORD result = MWMO_INPUTAVAILABLE;
-  if (XRE_IsContentProcess()) {
+  if (IsVistaOrLater() && XRE_IsContentProcess()) {
     result |= MWMO_ALERTABLE;
   }
   return result;
@@ -1877,7 +1879,7 @@ WinUtils::IsTouchDeviceSupportPresent()
 uint32_t
 WinUtils::GetMaxTouchPoints()
 {
-  if (IsTouchDeviceSupportPresent()) {
+  if (IsWin7OrLater() && IsTouchDeviceSupportPresent()) {
     return GetSystemMetrics(SM_MAXIMUMTOUCHES);
   }
   return 0;
@@ -1892,6 +1894,11 @@ typedef DWORD (WINAPI * GetFinalPathNameByHandlePtr)(HANDLE hFile,
 bool
 WinUtils::ResolveJunctionPointsAndSymLinks(std::wstring& aPath)
 {
+  // Users folder was introduced with Vista.
+  if (!IsVistaOrLater()) {
+    return true;
+  }
+
   wchar_t path[MAX_PATH] = { 0 };
 
   nsAutoHandle handle(
@@ -2019,19 +2026,21 @@ WinUtils::GetAppInitDLLs(nsAString& aOutput)
   }
   nsAutoRegKey key(hkey);
   LONG status;
-  const wchar_t kLoadAppInitDLLs[] = L"LoadAppInit_DLLs";
-  DWORD loadAppInitDLLs = 0;
-  DWORD loadAppInitDLLsLen = sizeof(loadAppInitDLLs);
-  status = RegQueryValueExW(hkey, kLoadAppInitDLLs, nullptr,
-                            nullptr, (LPBYTE)&loadAppInitDLLs,
-                            &loadAppInitDLLsLen);
-  if (status != ERROR_SUCCESS) {
-    return false;
-  }
-  if (!loadAppInitDLLs) {
-    // If loadAppInitDLLs is zero then AppInit_DLLs is disabled.
-    // In this case we'll return true along with an empty output string.
-    return true;
+  if (IsVistaOrLater()) {
+    const wchar_t kLoadAppInitDLLs[] = L"LoadAppInit_DLLs";
+    DWORD loadAppInitDLLs = 0;
+    DWORD loadAppInitDLLsLen = sizeof(loadAppInitDLLs);
+    status = RegQueryValueExW(hkey, kLoadAppInitDLLs, nullptr,
+                              nullptr, (LPBYTE)&loadAppInitDLLs,
+                              &loadAppInitDLLsLen);
+    if (status != ERROR_SUCCESS) {
+      return false;
+    }
+    if (!loadAppInitDLLs) {
+      // If loadAppInitDLLs is zero then AppInit_DLLs is disabled.
+      // In this case we'll return true along with an empty output string.
+      return true;
+    }
   }
   DWORD numBytes = 0;
   const wchar_t kAppInitDLLs[] = L"AppInit_DLLs";
diff --git a/widget/windows/WindowsUIUtils.cpp b/widget/windows/WindowsUIUtils.cpp
index 1c270b5ec..223511859 100644
--- a/widget/windows/WindowsUIUtils.cpp
+++ b/widget/windows/WindowsUIUtils.cpp
@@ -5,8 +5,7 @@
 
 #include <windows.h>
 #include <winsdkver.h>
-#include <wrl.h>
-
+#include "mozwrlbase.h"
 #include "nsServiceManagerUtils.h"
 
 #include "WindowsUIUtils.h"
@@ -180,3 +179,4 @@ WindowsUIUtils::UpdateTabletModeState()
 
   return NS_OK;
 }
+
diff --git a/widget/windows/mozwrlbase.h b/widget/windows/mozwrlbase.h
new file mode 100644
index 000000000..d82be8f04
--- /dev/null
+++ b/widget/windows/mozwrlbase.h
@@ -0,0 +1,77 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#pragma once
+
+/*
+ * Includes <wrl.h> and it's children. Defines imports needed by
+ * corewrappers.h in the case where windows.h has already been
+ * included w/WINVER < 0x600. Also ups WINVER/_WIN32_WINNT prior
+ * to including wrl.h. Mozilla's build currently has WINVER set to
+ * 0x502 for XP support.
+ */
+
+#if _WIN32_WINNT < 0x600
+
+#include <windows.h>
+
+VOID
+WINAPI
+ReleaseSRWLockExclusive(
+    _Inout_ PSRWLOCK SRWLock
+    );
+
+VOID
+WINAPI
+ReleaseSRWLockShared(
+    _Inout_ PSRWLOCK SRWLock
+    );
+
+BOOL
+WINAPI
+InitializeCriticalSectionEx(
+    _Out_ LPCRITICAL_SECTION lpCriticalSection,
+    _In_ DWORD dwSpinCount,
+    _In_ DWORD Flags
+    );
+
+VOID
+WINAPI
+InitializeSRWLock(
+    _Out_ PSRWLOCK SRWLock
+    );
+
+VOID
+WINAPI
+AcquireSRWLockExclusive(
+    _Inout_ PSRWLOCK SRWLock
+    );
+
+BOOLEAN
+WINAPI
+TryAcquireSRWLockExclusive(
+    _Inout_ PSRWLOCK SRWLock
+    );
+
+BOOLEAN
+WINAPI
+TryAcquireSRWLockShared(
+    _Inout_ PSRWLOCK SRWLock
+    );
+
+VOID
+WINAPI
+AcquireSRWLockShared(
+    _Inout_ PSRWLOCK SRWLock
+    );
+
+#undef WINVER
+#undef _WIN32_WINNT
+#define WINVER 0x600
+#define _WIN32_WINNT 0x600
+
+#endif // _WIN32_WINNT < 0x600
+
+#include <wrl.h>
diff --git a/widget/windows/nsDataObj.cpp b/widget/windows/nsDataObj.cpp
index 977a87c08..64a455bce 100644
--- a/widget/windows/nsDataObj.cpp
+++ b/widget/windows/nsDataObj.cpp
@@ -1219,7 +1219,8 @@ nsDataObj :: GetFileContentsInternetShortcut ( FORMATETC& aFE, STGMEDIUM& aSTG )
   const char *shortcutFormatStr;
   int totalLen;
   nsCString path;
-  if (!Preferences::GetBool(kShellIconPref, true)) {
+  if (!Preferences::GetBool(kShellIconPref, true) ||
+      !IsVistaOrLater()) {
     shortcutFormatStr = "[InternetShortcut]\r\nURL=%s\r\n";
     const int formatLen = strlen(shortcutFormatStr) - 2;  // don't include %s
     totalLen = formatLen + asciiUrl.Length();  // don't include null character
diff --git a/widget/windows/nsFilePicker.cpp b/widget/windows/nsFilePicker.cpp
index 4e942968a..53857cf5e 100644
--- a/widget/windows/nsFilePicker.cpp
+++ b/widget/windows/nsFilePicker.cpp
@@ -28,6 +28,7 @@
 #include "nsPIDOMWindow.h"
 #include "GeckoProfiler.h"
 
+using mozilla::IsVistaOrLater;
 using mozilla::IsWin8OrLater;
 using mozilla::MakeUnique;
 using mozilla::mscom::EnsureMTA;
@@ -218,6 +219,191 @@ STDMETHODIMP nsFilePicker::QueryInterface(REFIID refiid, void** ppvResult)
   return E_NOINTERFACE;
 }
 
+/*
+ * XP picker callbacks
+ */
+
+// Show - Display the file dialog
+int CALLBACK
+BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
+{
+  if (uMsg == BFFM_INITIALIZED)
+  {
+    char16_t * filePath = (char16_t *) lpData;
+    if (filePath)
+      ::SendMessageW(hwnd, BFFM_SETSELECTIONW,
+                     TRUE /* true because lpData is a path string */,
+                     lpData);
+  }
+  return 0;
+}
+
+static void
+EnsureWindowVisible(HWND hwnd) 
+{
+  // Obtain the monitor which has the largest area of intersection 
+  // with the window, or nullptr if there is no intersection.
+  HMONITOR monitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONULL);
+  if (!monitor) {
+    // The window is not visible, we should reposition it to the same place as its parent
+    HWND parentHwnd = GetParent(hwnd);
+    RECT parentRect;
+    GetWindowRect(parentHwnd, &parentRect);
+    SetWindowPos(hwnd, nullptr, parentRect.left, parentRect.top, 0, 0,
+                 SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER);
+  }
+}
+
+// Callback hook which will ensure that the window is visible. Currently
+// only in use on os <= XP.
+UINT_PTR CALLBACK
+nsFilePicker::FilePickerHook(HWND hwnd,
+                             UINT msg,
+                             WPARAM wParam,
+                             LPARAM lParam) 
+{
+  switch(msg) {
+    case WM_NOTIFY:
+      {
+        LPOFNOTIFYW lpofn = (LPOFNOTIFYW) lParam;
+        if (!lpofn || !lpofn->lpOFN) {
+          return 0;
+        }
+        
+        if (CDN_INITDONE == lpofn->hdr.code) {
+          // The Window will be automatically moved to the last position after
+          // CDN_INITDONE.  We post a message to ensure the window will be visible
+          // so it will be done after the automatic last position window move.
+          PostMessage(hwnd, MOZ_WM_ENSUREVISIBLE, 0, 0);
+        }
+      }
+      break;
+    case MOZ_WM_ENSUREVISIBLE:
+      EnsureWindowVisible(GetParent(hwnd));
+      break;
+    case WM_INITDIALOG:
+      {
+        OPENFILENAMEW* pofn = reinterpret_cast<OPENFILENAMEW*>(lParam);
+        SetProp(hwnd, kDialogPtrProp, (HANDLE)pofn->lCustData);
+        nsFilePicker* picker = reinterpret_cast<nsFilePicker*>(pofn->lCustData);
+        if (picker) {
+          picker->SetDialogHandle(hwnd);
+          SetTimer(hwnd, kDialogTimerID, kDialogTimerTimeout, nullptr);
+        }
+      }
+      break;
+    case WM_TIMER:
+      {
+        // Check to see if our parent has been torn down, if so, we close too.
+        if (wParam == kDialogTimerID) {
+          nsFilePicker* picker = 
+            reinterpret_cast<nsFilePicker*>(GetProp(hwnd, kDialogPtrProp));
+          if (picker && picker->ClosePickerIfNeeded(true)) {
+            KillTimer(hwnd, kDialogTimerID);
+          }
+        }
+      }
+      break;
+  }
+  return 0;
+}
+
+
+// Callback hook which will dynamically allocate a buffer large enough
+// for the file picker dialog.  Currently only in use on  os <= XP.
+UINT_PTR CALLBACK
+nsFilePicker::MultiFilePickerHook(HWND hwnd,
+                                  UINT msg,
+                                  WPARAM wParam,
+                                  LPARAM lParam)
+{
+  switch (msg) {
+    case WM_INITDIALOG:
+      {
+        // Finds the child drop down of a File Picker dialog and sets the 
+        // maximum amount of text it can hold when typed in manually.
+        // A wParam of 0 mean 0x7FFFFFFE characters.
+        HWND comboBox = FindWindowEx(GetParent(hwnd), nullptr, 
+                                     L"ComboBoxEx32", nullptr );
+        if(comboBox)
+          SendMessage(comboBox, CB_LIMITTEXT, 0, 0);
+        // Store our nsFilePicker ptr for future use
+        OPENFILENAMEW* pofn = reinterpret_cast<OPENFILENAMEW*>(lParam);
+        SetProp(hwnd, kDialogPtrProp, (HANDLE)pofn->lCustData);
+        nsFilePicker* picker =
+          reinterpret_cast<nsFilePicker*>(pofn->lCustData);
+        if (picker) {
+          picker->SetDialogHandle(hwnd);
+          SetTimer(hwnd, kDialogTimerID, kDialogTimerTimeout, nullptr);
+        }
+      }
+      break;
+    case WM_NOTIFY:
+      {
+        LPOFNOTIFYW lpofn = (LPOFNOTIFYW) lParam;
+        if (!lpofn || !lpofn->lpOFN) {
+          return 0;
+        }
+        // CDN_SELCHANGE is sent when the selection in the list box of the file
+        // selection dialog changes
+        if (lpofn->hdr.code == CDN_SELCHANGE) {
+          HWND parentHWND = GetParent(hwnd);
+
+          // Get the required size for the selected files buffer
+          UINT newBufLength = 0; 
+          int requiredBufLength = CommDlg_OpenSave_GetSpecW(parentHWND, 
+                                                            nullptr, 0);
+          if(requiredBufLength >= 0)
+            newBufLength += requiredBufLength;
+          else
+            newBufLength += MAX_PATH;
+
+          // If the user selects multiple files, the buffer contains the 
+          // current directory followed by the file names of the selected 
+          // files. So make room for the directory path.  If the user
+          // selects a single file, it is no harm to add extra space.
+          requiredBufLength = CommDlg_OpenSave_GetFolderPathW(parentHWND, 
+                                                              nullptr, 0);
+          if(requiredBufLength >= 0)
+            newBufLength += requiredBufLength;
+          else
+            newBufLength += MAX_PATH;
+
+          // Check if lpstrFile and nMaxFile are large enough
+          if (newBufLength > lpofn->lpOFN->nMaxFile) {
+            if (lpofn->lpOFN->lpstrFile)
+              delete[] lpofn->lpOFN->lpstrFile;
+
+            // We allocate FILE_BUFFER_SIZE more bytes than is needed so that
+            // if the user selects a file and holds down shift and down to 
+            // select  additional items, we will not continuously reallocate
+            newBufLength += FILE_BUFFER_SIZE;
+
+            wchar_t* filesBuffer = new wchar_t[newBufLength];
+            ZeroMemory(filesBuffer, newBufLength * sizeof(wchar_t));
+
+            lpofn->lpOFN->lpstrFile = filesBuffer;
+            lpofn->lpOFN->nMaxFile  = newBufLength;
+          }
+        }
+      }
+      break;
+    case WM_TIMER:
+      {
+        // Check to see if our parent has been torn down, if so, we close too.
+        if (wParam == kDialogTimerID) {
+          nsFilePicker* picker =
+            reinterpret_cast<nsFilePicker*>(GetProp(hwnd, kDialogPtrProp));
+          if (picker && picker->ClosePickerIfNeeded(true)) {
+            KillTimer(hwnd, kDialogTimerID);
+          }
+        }
+      }
+      break;
+  }
+
+  return FilePickerHook(hwnd, msg, wParam, lParam);
+}
 
 /*
  * Vista+ callbacks
@@ -290,18 +476,25 @@ nsFilePicker::OnOverwrite(IFileDialog *pfd,
  */
 
 bool
-nsFilePicker::ClosePickerIfNeeded()
+nsFilePicker::ClosePickerIfNeeded(bool aIsXPDialog)
 {
   if (!mParentWidget || !mDlgWnd)
     return false;
 
   nsWindow *win = static_cast<nsWindow *>(mParentWidget.get());
-  if (IsWindow(mDlgWnd) && IsWindowVisible(mDlgWnd) && win->DestroyCalled()) {
+  // Note, the xp callbacks hand us an inner window, so we have to step up
+  // one to get the actual dialog.
+  HWND dlgWnd;
+  if (aIsXPDialog)
+    dlgWnd = GetParent(mDlgWnd);
+  else
+    dlgWnd = mDlgWnd;
+  if (IsWindow(dlgWnd) && IsWindowVisible(dlgWnd) && win->DestroyCalled()) {
     wchar_t className[64];
     // Make sure we have the right window
-    if (GetClassNameW(mDlgWnd, className, mozilla::ArrayLength(className)) &&
+    if (GetClassNameW(dlgWnd, className, mozilla::ArrayLength(className)) &&
         !wcscmp(className, L"#32770") &&
-        DestroyWindow(mDlgWnd)) {
+        DestroyWindow(dlgWnd)) {
       mDlgWnd = nullptr;
       return true;
     }
@@ -313,7 +506,7 @@ void
 nsFilePicker::PickerCallbackTimerFunc(nsITimer *aTimer, void *aCtx)
 {
   nsFilePicker* picker = (nsFilePicker*)aCtx;
-  if (picker->ClosePickerIfNeeded()) {
+  if (picker->ClosePickerIfNeeded(false)) {
     aTimer->Cancel();
   }
 }
@@ -330,15 +523,62 @@ nsFilePicker::SetDialogHandle(HWND aWnd)
  * Folder picker invocation
  */
 
+// Open the older XP style folder picker dialog. We end up in this call
+// on XP systems or when platform is built without the longhorn SDK.
+bool
+nsFilePicker::ShowXPFolderPicker(const nsString& aInitialDir)
+{
+  bool result = false;
+
+  auto dirBuffer = MakeUnique<wchar_t[]>(FILE_BUFFER_SIZE);
+  wcsncpy(dirBuffer.get(), aInitialDir.get(), FILE_BUFFER_SIZE);
+  dirBuffer[FILE_BUFFER_SIZE-1] = '\0';
+
+  AutoDestroyTmpWindow adtw((HWND)(mParentWidget.get() ?
+    mParentWidget->GetNativeData(NS_NATIVE_TMP_WINDOW) : nullptr));
+
+  BROWSEINFOW browserInfo = {0};
+  browserInfo.pidlRoot       = nullptr;
+  browserInfo.pszDisplayName = dirBuffer.get();
+  browserInfo.lpszTitle      = mTitle.get();
+  browserInfo.ulFlags        = BIF_USENEWUI | BIF_RETURNONLYFSDIRS;
+  browserInfo.hwndOwner      = adtw.get(); 
+  browserInfo.iImage         = 0;
+  browserInfo.lParam         = reinterpret_cast<LPARAM>(this);
+
+  if (!aInitialDir.IsEmpty()) {
+    // the dialog is modal so that |initialDir.get()| will be valid in 
+    // BrowserCallbackProc. Thus, we don't need to clone it.
+    browserInfo.lParam = (LPARAM) aInitialDir.get();
+    browserInfo.lpfn   = &BrowseCallbackProc;
+  } else {
+    browserInfo.lParam = 0;
+    browserInfo.lpfn   = nullptr;
+  }
+
+  LPITEMIDLIST list = ::SHBrowseForFolderW(&browserInfo);
+  if (list) {
+    result = ::SHGetPathFromIDListW(list, dirBuffer.get());
+    if (result)
+      mUnicodeFile.Assign(static_cast<const wchar_t*>(dirBuffer.get()));
+    // free PIDL
+    CoTaskMemFree(list);
+  }
+
+  return result;
+}
+
 /*
- * Show a folder picker.
- *
+ * Show a folder picker post Windows XP
+ * 
  * @param aInitialDir   The initial directory, the last used directory will be
  *                      used if left blank.
+ * @param aWasInitError Out parameter will hold true if there was an error
+ *                      before the folder picker is shown.
  * @return true if a file was selected successfully.
 */
 bool
-nsFilePicker::ShowFolderPicker(const nsString& aInitialDir)
+nsFilePicker::ShowFolderPicker(const nsString& aInitialDir, bool &aWasInitError)
 {
   if (!IsWin8OrLater()) {
     // Some Windows 7 users are experiencing a race condition when some dlls
@@ -353,8 +593,10 @@ nsFilePicker::ShowFolderPicker(const nsString& aInitialDir)
   if (FAILED(CoCreateInstance(CLSID_FileOpenDialog, nullptr, CLSCTX_INPROC,
                               IID_IFileOpenDialog,
                               getter_AddRefs(dialog)))) {
+    aWasInitError = true;
     return false;
   }
+  aWasInitError = false;
 
   // hook up event callbacks
   dialog->Advise(this, &mFDECookie);
@@ -416,15 +658,233 @@ nsFilePicker::ShowFolderPicker(const nsString& aInitialDir)
  * File open and save picker invocation
  */
 
+/* static */ bool
+nsFilePicker::GetFileNameWrapper(OPENFILENAMEW* ofn, PickerType aType)
+{
+  MOZ_SEH_TRY {
+    if (aType == PICKER_TYPE_OPEN)
+      return ::GetOpenFileNameW(ofn);
+    else if (aType == PICKER_TYPE_SAVE)
+      return ::GetSaveFileNameW(ofn);
+  } MOZ_SEH_EXCEPT(true) {
+    NS_ERROR("nsFilePicker GetFileName win32 call generated an exception! This is bad!");
+  }
+  return false;
+}
+
+bool
+nsFilePicker::FilePickerWrapper(OPENFILENAMEW* ofn, PickerType aType)
+{
+  if (!ofn)
+    return false;
+  AutoWidgetPickerState awps(mParentWidget);
+  return GetFileNameWrapper(ofn, aType);
+}
+
+bool
+nsFilePicker::ShowXPFilePicker(const nsString& aInitialDir)
+{
+  OPENFILENAMEW ofn = {0};
+  ofn.lStructSize = sizeof(ofn);
+  nsString filterBuffer = mFilterList;
+                                
+  auto fileBuffer = MakeUnique<wchar_t[]>(FILE_BUFFER_SIZE);
+  wcsncpy(fileBuffer.get(),  mDefaultFilePath.get(), FILE_BUFFER_SIZE);
+  fileBuffer[FILE_BUFFER_SIZE-1] = '\0'; // null terminate in case copy truncated
+
+  if (!aInitialDir.IsEmpty()) {
+    ofn.lpstrInitialDir = aInitialDir.get();
+  }
+
+  AutoDestroyTmpWindow adtw((HWND) (mParentWidget.get() ?
+    mParentWidget->GetNativeData(NS_NATIVE_TMP_WINDOW) : nullptr));
+
+  ofn.lpstrTitle   = (LPCWSTR)mTitle.get();
+  ofn.lpstrFilter  = (LPCWSTR)filterBuffer.get();
+  ofn.nFilterIndex = mSelectedType;
+  ofn.lpstrFile    = fileBuffer.get();
+  ofn.nMaxFile     = FILE_BUFFER_SIZE;
+  ofn.hwndOwner    = adtw.get();
+  ofn.lCustData    = reinterpret_cast<LPARAM>(this);
+  ofn.Flags = OFN_SHAREAWARE | OFN_LONGNAMES | OFN_OVERWRITEPROMPT |
+              OFN_HIDEREADONLY | OFN_PATHMUSTEXIST | OFN_ENABLESIZING | 
+              OFN_EXPLORER;
+
+  // Windows Vista and up won't allow you to use the new looking dialogs with
+  // a hook procedure.  The hook procedure fixes a problem on XP dialogs for
+  // file picker visibility.  Vista and up automatically ensures the file 
+  // picker is always visible.
+  if (!IsVistaOrLater()) {
+    ofn.lpfnHook = FilePickerHook;
+    ofn.Flags |= OFN_ENABLEHOOK;
+  }
+
+  // Handle add to recent docs settings
+  if (IsPrivacyModeEnabled() || !mAddToRecentDocs) {
+    ofn.Flags |= OFN_DONTADDTORECENT;
+  }
+
+  NS_NAMED_LITERAL_STRING(htmExt, "html");
+
+  if (!mDefaultExtension.IsEmpty()) {
+    ofn.lpstrDefExt = mDefaultExtension.get();
+  } else if (IsDefaultPathHtml()) {
+    // Get file extension from suggested filename to detect if we are
+    // saving an html file.
+    // This is supposed to append ".htm" if user doesn't supply an
+    // extension but the behavior is sort of weird:
+    // - Often appends ".html" even if you have an extension
+    // - It obeys your extension if you put quotes around name
+    ofn.lpstrDefExt = htmExt.get();
+  }
+
+  // When possible, instead of using OFN_NOCHANGEDIR to ensure the current
+  // working directory will not change from this call, we will retrieve the
+  // current working directory before the call and restore it after the 
+  // call.  This flag causes problems on Windows XP for paths that are
+  // selected like  C:test.txt where the user is currently at C:\somepath
+  // In which case expected result should be C:\somepath\test.txt
+  AutoRestoreWorkingPath restoreWorkingPath;
+  // If we can't get the current working directory, the best case is to
+  // use the OFN_NOCHANGEDIR flag
+  if (!restoreWorkingPath.HasWorkingPath()) {
+    ofn.Flags |= OFN_NOCHANGEDIR;
+  }
+
+  bool result = false;
+
+  switch(mMode) {
+    case modeOpen:
+      // FILE MUST EXIST!
+      ofn.Flags |= OFN_FILEMUSTEXIST;
+      result = FilePickerWrapper(&ofn, PICKER_TYPE_OPEN);
+      break;
+
+    case modeOpenMultiple:
+      ofn.Flags |= OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT;
+
+      // The hook set here ensures that the buffer returned will always be
+      // large enough to hold all selected files.  The hook may modify the
+      // value of ofn.lpstrFile and deallocate the old buffer that it pointed
+      // to (fileBuffer). The hook assumes that the passed in value is heap 
+      // allocated and that the returned value should be freed by the caller.
+      // If the hook changes the buffer, it will deallocate the old buffer.
+      // This fix would be nice to have in Vista and up, but it would force
+      // the file picker to use the old style dialogs because hooks are not
+      // allowed in the new file picker UI.  We need to eventually move to
+      // the new Common File Dialogs for Vista and up.
+      if (!IsVistaOrLater()) {
+        ofn.lpfnHook = MultiFilePickerHook;
+        fileBuffer.release();
+        result = FilePickerWrapper(&ofn, PICKER_TYPE_OPEN);
+        fileBuffer.reset(ofn.lpstrFile);
+      } else {
+        result = FilePickerWrapper(&ofn, PICKER_TYPE_OPEN);
+      }
+      break;
+
+    case modeSave:
+      {
+        ofn.Flags |= OFN_NOREADONLYRETURN;
+
+        // Don't follow shortcuts when saving a shortcut, this can be used
+        // to trick users (bug 271732)
+        if (IsDefaultPathLink())
+          ofn.Flags |= OFN_NODEREFERENCELINKS;
+
+        result = FilePickerWrapper(&ofn, PICKER_TYPE_SAVE);
+        if (!result) {
+          // Error, find out what kind.
+          if (GetLastError() == ERROR_INVALID_PARAMETER ||
+              CommDlgExtendedError() == FNERR_INVALIDFILENAME) {
+            // Probably the default file name is too long or contains illegal
+            // characters. Try again, without a starting file name.
+            ofn.lpstrFile[0] = L'\0';
+            result = FilePickerWrapper(&ofn, PICKER_TYPE_SAVE);
+          }
+        }
+      }
+      break;
+
+    default:
+      NS_NOTREACHED("unsupported file picker mode");
+      return false;
+  }
+
+  if (!result)
+    return false;
+
+  // Remember what filter type the user selected
+  mSelectedType = (int16_t)ofn.nFilterIndex;
+
+  // Single file selection, we're done
+  if (mMode != modeOpenMultiple) {
+    GetQualifiedPath(fileBuffer.get(), mUnicodeFile);
+    return true;
+  }
+
+  // Set user-selected location of file or directory.  From msdn's "Open and
+  // Save As Dialog Boxes" section:
+  // If you specify OFN_EXPLORER, the directory and file name strings are '\0'
+  // separated, with an extra '\0' character after the last file name. This
+  // format enables the Explorer-style dialog boxes to return long file names
+  // that include spaces. 
+  wchar_t *current = fileBuffer.get();
+  
+  nsAutoString dirName(current);
+  // Sometimes dirName contains a trailing slash and sometimes it doesn't:
+  if (current[dirName.Length() - 1] != '\\')
+    dirName.Append((char16_t)'\\');
+  
+  while (current && *current && *(current + wcslen(current) + 1)) {
+    current = current + wcslen(current) + 1;
+    
+    nsCOMPtr<nsIFile> file = do_CreateInstance("@mozilla.org/file/local;1");
+    NS_ENSURE_TRUE(file, false);
+
+    // Only prepend the directory if the path specified is a relative path
+    nsAutoString path;
+    if (PathIsRelativeW(current)) {
+      path = dirName + nsDependentString(current);
+    } else {
+      path = current;
+    }
+
+    nsAutoString canonicalizedPath;
+    GetQualifiedPath(path.get(), canonicalizedPath);
+    if (NS_FAILED(file->InitWithPath(canonicalizedPath)) ||
+        !mFiles.AppendObject(file))
+      return false;
+  }
+  
+  // Handle the case where the user selected just one file. From msdn: If you
+  // specify OFN_ALLOWMULTISELECT and the user selects only one file the
+  // lpstrFile string does not have a separator between the path and file name.
+  if (current && *current && (current == fileBuffer.get())) {
+    nsCOMPtr<nsIFile> file = do_CreateInstance("@mozilla.org/file/local;1");
+    NS_ENSURE_TRUE(file, false);
+    
+    nsAutoString canonicalizedPath;
+    GetQualifiedPath(current, canonicalizedPath);
+    if (NS_FAILED(file->InitWithPath(canonicalizedPath)) ||
+        !mFiles.AppendObject(file))
+      return false;
+  }
+
+  return true;
+}
+
 /*
- * Show a file picker.
- *
+ * Show a file picker post Windows XP
+ * 
  * @param aInitialDir   The initial directory, the last used directory will be
  *                      used if left blank.
+ * @param aWasInitError Out parameter will hold true if there was an error
+ *                      before the file picker is shown.
  * @return true if a file was selected successfully.
 */
 bool
-nsFilePicker::ShowFilePicker(const nsString& aInitialDir)
+nsFilePicker::ShowFilePicker(const nsString& aInitialDir, bool &aWasInitError)
 {
   PROFILER_LABEL_FUNC(js::ProfileEntry::Category::OTHER);
 
@@ -442,15 +902,18 @@ nsFilePicker::ShowFilePicker(const nsString& aInitialDir)
     if (FAILED(CoCreateInstance(CLSID_FileOpenDialog, nullptr, CLSCTX_INPROC,
                                 IID_IFileOpenDialog,
                                 getter_AddRefs(dialog)))) {
+      aWasInitError = true;
       return false;
     }
   } else {
     if (FAILED(CoCreateInstance(CLSID_FileSaveDialog, nullptr, CLSCTX_INPROC,
                                 IID_IFileSaveDialog,
                                 getter_AddRefs(dialog)))) {
+      aWasInitError = true;
       return false;
     }
   }
+  aWasInitError = false;
 
   // hook up event callbacks
   dialog->Advise(this, &mFDECookie);
@@ -617,11 +1080,22 @@ nsFilePicker::ShowW(int16_t *aReturnVal)
   // with our context set temporarily to system-dpi-aware
   WinUtils::AutoSystemDpiAware dpiAwareness;
 
-  bool result = false;
+  // Launch the XP file/folder picker on XP and as a fallback on Vista+. 
+  // The CoCreateInstance call to CLSID_FileOpenDialog fails with "(0x80040111)
+  // ClassFactory cannot supply requested class" when the checkbox for
+  // Disable Visual Themes is on in the compatability tab within the shortcut
+  // properties.
+  bool result = false, wasInitError = true;
   if (mMode == modeGetFolder) {
-    result = ShowFolderPicker(initialDir);
+    if (IsVistaOrLater())
+      result = ShowFolderPicker(initialDir, wasInitError);
+    if (!result && wasInitError)
+      result = ShowXPFolderPicker(initialDir);
   } else {
-    result = ShowFilePicker(initialDir);
+    if (IsVistaOrLater())
+      result = ShowFilePicker(initialDir, wasInitError);
+    if (!result && wasInitError)
+      result = ShowXPFilePicker(initialDir);
   }
 
   // exit, and return returnCancel in aReturnVal
@@ -773,10 +1247,48 @@ nsFilePicker::InitNative(nsIWidget *aParent,
   mTitle.Assign(aTitle);
 }
 
+void 
+nsFilePicker::GetQualifiedPath(const wchar_t *aInPath, nsString &aOutPath)
+{
+  // Prefer a qualified path over a non qualified path.
+  // Things like c:file.txt would be accepted in Win XP but would later
+  // fail to open from the download manager.
+  wchar_t qualifiedFileBuffer[MAX_PATH];
+  if (PathSearchAndQualifyW(aInPath, qualifiedFileBuffer, MAX_PATH)) {
+    aOutPath.Assign(qualifiedFileBuffer);
+  } else {
+    aOutPath.Assign(aInPath);
+  }
+}
+
+void
+nsFilePicker::AppendXPFilter(const nsAString& aTitle, const nsAString& aFilter)
+{
+  mFilterList.Append(aTitle);
+  mFilterList.Append(char16_t('\0'));
+
+  if (aFilter.EqualsLiteral("..apps"))
+    mFilterList.AppendLiteral("*.exe;*.com");
+  else
+  {
+    nsAutoString filter(aFilter);
+    filter.StripWhitespace();
+    if (filter.EqualsLiteral("*"))
+      filter.AppendLiteral(".*");
+    mFilterList.Append(filter);
+  }
+
+  mFilterList.Append(char16_t('\0'));
+}
+
 NS_IMETHODIMP
 nsFilePicker::AppendFilter(const nsAString& aTitle, const nsAString& aFilter)
 {
-  mComFilterList.Append(aTitle, aFilter);
+  if (IsVistaOrLater()) {
+    mComFilterList.Append(aTitle, aFilter);
+  } else {
+    AppendXPFilter(aTitle, aFilter);
+  }
   return NS_OK;
 }
 
diff --git a/widget/windows/nsFilePicker.h b/widget/windows/nsFilePicker.h
index 740f07a7d..90d8c15bc 100644
--- a/widget/windows/nsFilePicker.h
+++ b/widget/windows/nsFilePicker.h
@@ -9,6 +9,17 @@
 
 #include <windows.h>
 
+// For Vista IFileDialog interfaces which aren't exposed
+// unless _WIN32_WINNT >= _WIN32_WINNT_LONGHORN.
+#if _WIN32_WINNT < _WIN32_WINNT_LONGHORN
+#define _WIN32_WINNT_bak _WIN32_WINNT
+#undef _WIN32_WINNT
+#define _WIN32_WINNT _WIN32_WINNT_LONGHORN
+#define _WIN32_IE_bak _WIN32_IE
+#undef _WIN32_IE
+#define _WIN32_IE _WIN32_IE_IE70
+#endif
+
 #include "nsIFile.h"
 #include "nsITimer.h"
 #include "nsISimpleEnumerator.h"
@@ -76,19 +87,32 @@ public:
   HRESULT STDMETHODCALLTYPE OnOverwrite(IFileDialog *pfd, IShellItem *psi, FDE_OVERWRITE_RESPONSE *pResponse);
 
 protected:
+  enum PickerType {
+    PICKER_TYPE_OPEN,
+    PICKER_TYPE_SAVE,
+  };
+
   /* method from nsBaseFilePicker */
   virtual void InitNative(nsIWidget *aParent,
                           const nsAString& aTitle);
+  static void GetQualifiedPath(const wchar_t *aInPath, nsString &aOutPath);
   void GetFilterListArray(nsString& aFilterList);
-  bool ShowFolderPicker(const nsString& aInitialDir);
-  bool ShowFilePicker(const nsString& aInitialDir);
+  static bool GetFileNameWrapper(OPENFILENAMEW* ofn, PickerType aType);
+  bool FilePickerWrapper(OPENFILENAMEW* ofn, PickerType aType);
+  bool ShowXPFolderPicker(const nsString& aInitialDir);
+  bool ShowXPFilePicker(const nsString& aInitialDir);
+  bool ShowFolderPicker(const nsString& aInitialDir, bool &aWasInitError);
+  bool ShowFilePicker(const nsString& aInitialDir, bool &aWasInitError);
+  void AppendXPFilter(const nsAString& aTitle, const nsAString& aFilter);
   void RememberLastUsedDirectory();
   bool IsPrivacyModeEnabled();
   bool IsDefaultPathLink();
   bool IsDefaultPathHtml();
   void SetDialogHandle(HWND aWnd);
-  bool ClosePickerIfNeeded();
+  bool ClosePickerIfNeeded(bool aIsXPDialog);
   static void PickerCallbackTimerFunc(nsITimer *aTimer, void *aPicker);
+  static UINT_PTR CALLBACK MultiFilePickerHook(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
+  static UINT_PTR CALLBACK FilePickerHook(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
 
   nsCOMPtr<nsILoadContext> mLoadContext;
   nsCOMPtr<nsIWidget>    mParentWidget;
@@ -130,4 +154,11 @@ protected:
   DWORD                  mFDECookie;
 };
 
+#if defined(_WIN32_WINNT_bak)
+#undef _WIN32_WINNT
+#define _WIN32_WINNT _WIN32_WINNT_bak
+#undef _WIN32_IE
+#define _WIN32_IE _WIN32_IE_bak
+#endif
+
 #endif // nsFilePicker_h__
diff --git a/widget/windows/nsLookAndFeel.cpp b/widget/windows/nsLookAndFeel.cpp
index 06eee3771..e649802b1 100644
--- a/widget/windows/nsLookAndFeel.cpp
+++ b/widget/windows/nsLookAndFeel.cpp
@@ -32,8 +32,12 @@ nsLookAndFeel::GetOperatingSystemVersion()
     version = eOperatingSystemVersion_Windows10;
   } else if (IsWin8OrLater()) {
     version = eOperatingSystemVersion_Windows8;
-  } else {
+  } else if (IsWin7OrLater()) {
     version = eOperatingSystemVersion_Windows7;
+  } else if (IsVistaOrLater()) {
+    version = eOperatingSystemVersion_WindowsVista;
+  } else {
+    version = eOperatingSystemVersion_WindowsXP;
   }
 
   return version;
@@ -179,7 +183,8 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor &aColor)
       idx = COLOR_HIGHLIGHT;
       break;
     case eColorID__moz_menubarhovertext:
-      if (!IsAppThemed()) {
+      if (!IsVistaOrLater() || !IsAppThemed())
+      {
         idx = nsUXThemeData::sFlatMenus ?
                 COLOR_HIGHLIGHTTEXT :
                 COLOR_MENUTEXT;
@@ -187,7 +192,8 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor &aColor)
       }
       // Fall through
     case eColorID__moz_menuhovertext:
-      if (IsAppThemed()) {
+      if (IsVistaOrLater() && IsAppThemed())
+      {
         res = ::GetColorFromTheme(eUXMenu,
                                   MENU_POPUPITEM, MPI_HOT, TMT_TEXTCOLOR, aColor);
         if (NS_SUCCEEDED(res))
@@ -279,7 +285,7 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor &aColor)
       aColor = NS_RGB(0, 0, 0);
       return NS_OK;
     case eColorID__moz_win_mediatext:
-      if (IsAppThemed()) {
+      if (IsVistaOrLater() && IsAppThemed()) {
         res = ::GetColorFromTheme(eUXMediaToolbar,
                                   TP_BUTTON, TS_NORMAL, TMT_TEXTCOLOR, aColor);
         if (NS_SUCCEEDED(res))
@@ -289,7 +295,8 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor &aColor)
       idx = COLOR_WINDOWTEXT;
       break;
     case eColorID__moz_win_communicationstext:
-      if (IsAppThemed()) {
+      if (IsVistaOrLater() && IsAppThemed())
+      {
         res = ::GetColorFromTheme(eUXCommunicationsToolbar,
                                   TP_BUTTON, TS_NORMAL, TMT_TEXTCOLOR, aColor);
         if (NS_SUCCEEDED(res))
diff --git a/widget/windows/nsLookAndFeel.h b/widget/windows/nsLookAndFeel.h
index a77808322..ecc1e8304 100644
--- a/widget/windows/nsLookAndFeel.h
+++ b/widget/windows/nsLookAndFeel.h
@@ -5,7 +5,6 @@
 
 #ifndef __nsLookAndFeel
 #define __nsLookAndFeel
-
 #include "nsXPLookAndFeel.h"
 #include "nsIWindowsRegKey.h"
 
@@ -30,6 +29,20 @@
 #define SM_CONVERTIBLESLATEMODE 0x00002003
 #define SM_SYSTEMDOCKED         0x00002004
 #endif
+#ifndef WM_GESTURE
+typedef enum _AR_STATE
+{
+  AR_ENABLED        = 0x0,
+  AR_DISABLED       = 0x1,
+  AR_SUPPRESSED     = 0x2,
+  AR_REMOTESESSION  = 0x4,
+  AR_MULTIMON       = 0x8,
+  AR_NOSENSOR       = 0x10,
+  AR_NOT_SUPPORTED  = 0x20,
+  AR_DOCKED         = 0x40,
+  AR_LAPTOP         = 0x80
+} AR_STATE, *PAR_STATE;
+#endif
 
 class nsLookAndFeel: public nsXPLookAndFeel {
   static OperatingSystemVersion GetOperatingSystemVersion();
diff --git a/widget/windows/nsNativeThemeWin.cpp b/widget/windows/nsNativeThemeWin.cpp
index 8950dcf90..4ff6b0af9 100644
--- a/widget/windows/nsNativeThemeWin.cpp
+++ b/widget/windows/nsNativeThemeWin.cpp
@@ -39,6 +39,7 @@
 #include "nsUXThemeConstants.h"
 #include <algorithm>
 
+using mozilla::IsVistaOrLater;
 using namespace mozilla;
 using namespace mozilla::widget;
 
@@ -300,6 +301,10 @@ DrawThemeBGRTLAware(HANDLE aTheme, HDC aHdc, int aPart, int aState,
  *  aero basic max          0        2        1        2
  *  aero basic close        1        2        1        2
  *
+ *  xp theme min            0        2        0        2
+ *  xp theme max            0        2        1        2
+ *  xp theme close          1        2        2        2
+ *
  *  'cold' button padding - generic button padding, should
  *  be handled in css.
  *                       left      top    right   bottom
@@ -310,11 +315,16 @@ DrawThemeBGRTLAware(HANDLE aTheme, HDC aHdc, int aPart, int aState,
  *  aero basic min          0        0        1        0
  *  aero basic max          1        0        0        0
  *  aero basic close        0        0        0        0
+ *
+ *  xp theme min            0        0        1        0
+ *  xp theme max            1        0        0        0
+ *  xp theme close          0        0        0        0
  */
 
 enum CaptionDesktopTheme {
   CAPTION_CLASSIC = 0,
   CAPTION_BASIC,
+  CAPTION_XPTHEME,
 };
 
 enum CaptionButton {
@@ -348,6 +358,8 @@ AddPaddingRect(LayoutDeviceIntSize* aSize, CaptionButton button) {
   RECT offset;
   if (!IsAppThemed())
     offset = buttonData[CAPTION_CLASSIC].hotPadding[button];
+  else if (!IsVistaOrLater())
+    offset = buttonData[CAPTION_XPTHEME].hotPadding[button];
   else
     offset = buttonData[CAPTION_BASIC].hotPadding[button];
   aSize->width += offset.left + offset.right;
@@ -361,6 +373,8 @@ OffsetBackgroundRect(RECT& rect, CaptionButton button) {
   RECT offset;
   if (!IsAppThemed())
     offset = buttonData[CAPTION_CLASSIC].hotPadding[button];
+  else if (!IsVistaOrLater())
+    offset = buttonData[CAPTION_XPTHEME].hotPadding[button];
   else
     offset = buttonData[CAPTION_BASIC].hotPadding[button];
   rect.left += offset.left;
@@ -405,7 +419,9 @@ OffsetBackgroundRect(RECT& rect, CaptionButton button) {
 static const double kProgressDeterminateTimeSpan = 3.0;
 static const double kProgressIndeterminateTimeSpan = 5.0;
 // The width of the overlay used to animate the horizontal progress bar (Vista and later).
-static const int32_t kProgressHorizontalOverlaySize = 120;
+static const int32_t kProgressHorizontalVistaOverlaySize = 120;
+// The width of the overlay used for the horizontal indeterminate progress bars on XP.
+static const int32_t kProgressHorizontalXPOverlaySize = 55;
 // The height of the overlay used to animate the vertical progress bar (Vista and later).
 static const int32_t kProgressVerticalOverlaySize = 45;
 // The height of the overlay used for the vertical indeterminate progress bar (Vista and later).
@@ -419,8 +435,18 @@ static const int32_t kProgressClassicOverlaySize = 40;
  */
 static int32_t
 GetProgressOverlayStyle(bool aIsVertical)
-{
-  return aIsVertical ? PP_MOVEOVERLAYVERT : PP_MOVEOVERLAY;
+{ 
+  if (aIsVertical) {
+    if (IsVistaOrLater()) {
+      return PP_MOVEOVERLAYVERT;
+    }
+    return PP_CHUNKVERT;
+  } else {
+    if (IsVistaOrLater()) {
+      return PP_MOVEOVERLAY;
+    }
+    return PP_CHUNK;
+  }
 }
 
 /*
@@ -431,11 +457,14 @@ GetProgressOverlayStyle(bool aIsVertical)
 static int32_t
 GetProgressOverlaySize(bool aIsVertical, bool aIsIndeterminate)
 {
-  if (aIsVertical) {
-    return aIsIndeterminate ? kProgressVerticalIndeterminateOverlaySize
-                            : kProgressVerticalOverlaySize;
+  if (IsVistaOrLater()) {
+    if (aIsVertical) {
+      return aIsIndeterminate ? kProgressVerticalIndeterminateOverlaySize
+                              : kProgressVerticalOverlaySize;
+    }
+    return kProgressHorizontalVistaOverlaySize;
   }
-  return kProgressHorizontalOverlaySize;
+  return kProgressHorizontalXPOverlaySize;
 }
 
 /*
@@ -524,6 +553,87 @@ nsNativeThemeWin::CalculateProgressOverlayRect(nsIFrame* aFrame,
   return overlayRect;
 }
 
+/*
+ * DrawChunkProgressMeter - renders an xp style chunked progress meter. Called
+ * by DrawProgressMeter.
+ *
+ * @param aTheme       progress theme handle
+ * @param aHdc         hdc returned by gfxWindowsNativeDrawing
+ * @param aPart        the PP_X progress part
+ * @param aState       the theme state
+ * @param aFrame       the elements frame
+ * @param aWidgetRect  bounding rect for the widget
+ * @param aClipRect    dirty rect that needs drawing.
+ * @param aAppUnits    app units per device pixel
+ * @param aIsIndeterm  is an indeterminate progress?
+ * @param aIsVertical  render a vertical progress?
+ * @param aIsRtl       direction is rtl
+ */
+static void
+DrawChunkProgressMeter(HTHEME aTheme, HDC aHdc, int aPart,
+                       int aState, nsIFrame* aFrame, RECT* aWidgetRect,
+                       RECT* aClipRect, gfxFloat aAppUnits, bool aIsIndeterm,
+                       bool aIsVertical, bool aIsRtl)
+{
+  NS_ASSERTION(aTheme, "Bad theme.");
+  NS_ASSERTION(aHdc, "Bad hdc.");
+  NS_ASSERTION(aWidgetRect, "Bad rect.");
+  NS_ASSERTION(aClipRect, "Bad clip rect.");
+  NS_ASSERTION(aFrame, "Bad frame.");
+
+  // For horizontal meters, the theme lib paints the right graphic but doesn't
+  // paint the chunks, so we do that manually. For vertical meters, the theme
+  // library draws everything correctly.
+  if (aIsVertical) {
+    DrawThemeBackground(aTheme, aHdc, aPart, aState, aWidgetRect, aClipRect);
+    return;
+  }
+
+  // query for the proper chunk metrics
+  int chunkSize, spaceSize;
+  if (FAILED(GetThemeMetric(aTheme, aHdc, aPart, aState,
+                            TMT_PROGRESSCHUNKSIZE, &chunkSize)) ||
+      FAILED(GetThemeMetric(aTheme, aHdc, aPart, aState,
+                            TMT_PROGRESSSPACESIZE, &spaceSize))) {
+    DrawThemeBackground(aTheme, aHdc, aPart, aState, aWidgetRect, aClipRect);
+    return;
+  }
+
+  // render chunks
+  if (!aIsRtl || aIsIndeterm) {
+    for (int chunk = aWidgetRect->left; chunk <= aWidgetRect->right;
+         chunk += (chunkSize+spaceSize)) {
+      if (!aIsIndeterm && ((chunk + chunkSize) > aWidgetRect->right)) {
+        // aWidgetRect->right represents the end of the meter. Partial blocks
+        // don't get rendered with one exception, so exit here if we don't have
+        // a full chunk to draw.
+        // The above is true *except* when the meter is at 100% fill, in which
+        // case Windows renders any remaining partial block. Query the parent
+        // frame to find out if we're at 100%.
+        if (!IsProgressMeterFilled(aFrame)) {
+          break;
+        }
+      }
+      RECT bounds =
+        { chunk, aWidgetRect->top, chunk + chunkSize, aWidgetRect->bottom };
+      DrawThemeBackground(aTheme, aHdc, aPart, aState, &bounds, aClipRect);
+    }
+  } else {
+    // rtl needs to grow in the opposite direction to look right.
+    for (int chunk = aWidgetRect->right; chunk >= aWidgetRect->left;
+         chunk -= (chunkSize+spaceSize)) {
+      if ((chunk - chunkSize) < aWidgetRect->left) {
+        if (!IsProgressMeterFilled(aFrame)) {
+          break;
+        }
+      }
+      RECT bounds =
+        { chunk - chunkSize, aWidgetRect->top, chunk, aWidgetRect->bottom };
+      DrawThemeBackground(aTheme, aHdc, aPart, aState, &bounds, aClipRect);
+    }
+  }
+}
+
 /*
  * DrawProgressMeter - render an appropriate progress meter based on progress
  * meter style, orientation, and os. Note, this does not render the underlying
@@ -543,7 +653,8 @@ void
 nsNativeThemeWin::DrawThemedProgressMeter(nsIFrame* aFrame, int aWidgetType,
                                           HANDLE aTheme, HDC aHdc,
                                           int aPart, int aState,
-                                          RECT* aWidgetRect, RECT* aClipRect)
+                                          RECT* aWidgetRect, RECT* aClipRect,
+                                          gfxFloat aAppUnits)
 {
   if (!aFrame || !aTheme || !aHdc)
     return;
@@ -554,6 +665,12 @@ nsNativeThemeWin::DrawThemedProgressMeter(nsIFrame* aFrame, int aWidgetType,
   RECT adjWidgetRect, adjClipRect;
   adjWidgetRect = *aWidgetRect;
   adjClipRect = *aClipRect;
+  if (!IsVistaOrLater()) {
+    // Adjust clipping out by one pixel. XP progress meters are inset,
+    // Vista+ are not.
+    InflateRect(&adjWidgetRect, 1, 1);
+    InflateRect(&adjClipRect, 1, 1);
+  }
 
   nsIFrame* parentFrame = aFrame->GetParent();
   if (!parentFrame) {
@@ -568,13 +685,20 @@ nsNativeThemeWin::DrawThemedProgressMeter(nsIFrame* aFrame, int aWidgetType,
   bool indeterminate = IsIndeterminateProgress(parentFrame, eventStates);
   bool animate = indeterminate;
 
-  // Vista and up progress meter is fill style, rendered here. We render
-  // the pulse overlay in the follow up section below.
-  DrawThemeBackground(aTheme, aHdc, aPart, aState,
-                      &adjWidgetRect, &adjClipRect);
-  if (!IsProgressMeterFilled(aFrame)) {
-    animate = true;
-  }
+  if (IsVistaOrLater()) {
+    // Vista and up progress meter is fill style, rendered here. We render
+    // the pulse overlay in the follow up section below.
+    DrawThemeBackground(aTheme, aHdc, aPart, aState,
+                        &adjWidgetRect, &adjClipRect);
+    if (!IsProgressMeterFilled(aFrame)) {
+      animate = true;
+    }
+  } else if (!indeterminate) {
+    // XP progress meters are 'chunk' style.
+    DrawChunkProgressMeter(aTheme, aHdc, aPart, aState, aFrame,
+                           &adjWidgetRect, &adjClipRect, aAppUnits,
+                           indeterminate, vertical, IsFrameRTL(aFrame));
+  }    
 
   if (animate) {
     // Indeterminate rendering
@@ -582,8 +706,14 @@ nsNativeThemeWin::DrawThemedProgressMeter(nsIFrame* aFrame, int aWidgetType,
     RECT overlayRect =
       CalculateProgressOverlayRect(aFrame, &adjWidgetRect, vertical,
                                    indeterminate, false);
-    DrawThemeBackground(aTheme, aHdc, overlayPart, aState, &overlayRect,
-                        &adjClipRect);
+    if (IsVistaOrLater()) {
+      DrawThemeBackground(aTheme, aHdc, overlayPart, aState, &overlayRect,
+                          &adjClipRect);
+    } else {
+      DrawChunkProgressMeter(aTheme, aHdc, overlayPart, aState, aFrame,
+                             &overlayRect, &adjClipRect, aAppUnits,
+                             indeterminate, vertical, IsFrameRTL(aFrame));
+    }
 
     if (!QueueAnimatedContentForRefresh(aFrame->GetContent(), 60)) {
       NS_WARNING("unable to animate progress widget!");
@@ -594,6 +724,15 @@ nsNativeThemeWin::DrawThemedProgressMeter(nsIFrame* aFrame, int aWidgetType,
 HANDLE
 nsNativeThemeWin::GetTheme(uint8_t aWidgetType)
 { 
+  if (!IsVistaOrLater()) {
+    // On XP or earlier, render dropdowns as textfields;
+    // doing it the right way works fine with the MS themes,
+    // but breaks on a lot of custom themes (presumably because MS
+    // apps do the textfield border business as well).
+    if (aWidgetType == NS_THEME_MENULIST)
+      aWidgetType = NS_THEME_TEXTFIELD;
+  }
+
   switch (aWidgetType) {
     case NS_THEME_BUTTON:
     case NS_THEME_RADIO:
@@ -606,7 +745,9 @@ nsNativeThemeWin::GetTheme(uint8_t aWidgetType)
     case NS_THEME_FOCUS_OUTLINE:
       return nsUXThemeData::GetTheme(eUXEdit);
     case NS_THEME_TOOLTIP:
-      return nsUXThemeData::GetTheme(eUXTooltip);
+      // XP/2K3 should force a classic treatment of tooltips
+      return !IsVistaOrLater() ?
+        nullptr : nsUXThemeData::GetTheme(eUXTooltip);
     case NS_THEME_TOOLBOX:
       return nsUXThemeData::GetTheme(eUXRebar);
     case NS_THEME_WIN_MEDIA_TOOLBOX:
@@ -733,6 +874,12 @@ nsresult
 nsNativeThemeWin::GetThemePartAndState(nsIFrame* aFrame, uint8_t aWidgetType, 
                                        int32_t& aPart, int32_t& aState)
 {
+  if (!IsVistaOrLater()) {
+    // See GetTheme
+    if (aWidgetType == NS_THEME_MENULIST)
+      aWidgetType = NS_THEME_TEXTFIELD;
+  }
+
   switch (aWidgetType) {
     case NS_THEME_BUTTON: {
       aPart = BP_BUTTON;
@@ -805,43 +952,63 @@ nsNativeThemeWin::GetThemePartAndState(nsIFrame* aFrame, uint8_t aWidgetType,
     case NS_THEME_TEXTFIELD_MULTILINE: {
       EventStates eventState = GetContentState(aFrame, aWidgetType);
 
-      /* Note: the NOSCROLL type has a rounded corner in each corner.  The more
-       * specific HSCROLL, VSCROLL, HVSCROLL types have side and/or top/bottom
-       * edges rendered as straight horizontal lines with sharp corners to
-       * accommodate a scrollbar.  However, the scrollbar gets rendered on top
-       * of this for us, so we don't care, and can just use NOSCROLL here.
-       */
-      aPart = TFP_EDITBORDER_NOSCROLL;
+      if (IsVistaOrLater()) {
+        /* Note: the NOSCROLL type has a rounded corner in each
+         * corner.  The more specific HSCROLL, VSCROLL, HVSCROLL types
+         * have side and/or top/bottom edges rendered as straight
+         * horizontal lines with sharp corners to accommodate a
+         * scrollbar.  However, the scrollbar gets rendered on top of
+         * this for us, so we don't care, and can just use NOSCROLL
+         * here.
+         */
+        aPart = TFP_EDITBORDER_NOSCROLL;
 
-      if (!aFrame) {
-        aState = TFS_EDITBORDER_NORMAL;
-      } else if (IsDisabled(aFrame, eventState)) {
-        aState = TFS_EDITBORDER_DISABLED;
-      } else if (IsReadOnly(aFrame)) {
-        /* no special read-only state */
-        aState = TFS_EDITBORDER_NORMAL;
-      } else {
-        nsIContent* content = aFrame->GetContent();
+        if (!aFrame) {
+          aState = TFS_EDITBORDER_NORMAL;
+        } else if (IsDisabled(aFrame, eventState)) {
+          aState = TFS_EDITBORDER_DISABLED;
+        } else if (IsReadOnly(aFrame)) {
+          /* no special read-only state */
+          aState = TFS_EDITBORDER_NORMAL;
+        } else {
+          nsIContent* content = aFrame->GetContent();
 
-        /* XUL textboxes don't get focused themselves, because they have child
-         * html:input.. but we can check the XUL focused attributes on them
-         */
-        if (content && content->IsXULElement() && IsFocused(aFrame))
-          aState = TFS_EDITBORDER_FOCUSED;
-        else if (eventState.HasAtLeastOneOfStates(NS_EVENT_STATE_ACTIVE | NS_EVENT_STATE_FOCUS))
-          aState = TFS_EDITBORDER_FOCUSED;
-        else if (eventState.HasState(NS_EVENT_STATE_HOVER))
-          aState = TFS_EDITBORDER_HOVER;
+          /* XUL textboxes don't get focused themselves, because they have child
+           * html:input.. but we can check the XUL focused attributes on them
+           */
+          if (content && content->IsXULElement() && IsFocused(aFrame))
+            aState = TFS_EDITBORDER_FOCUSED;
+          else if (eventState.HasAtLeastOneOfStates(NS_EVENT_STATE_ACTIVE | NS_EVENT_STATE_FOCUS))
+            aState = TFS_EDITBORDER_FOCUSED;
+          else if (eventState.HasState(NS_EVENT_STATE_HOVER))
+            aState = TFS_EDITBORDER_HOVER;
+          else
+            aState = TFS_EDITBORDER_NORMAL;
+        }
+      } else {
+        aPart = TFP_TEXTFIELD;
+        
+        if (!aFrame)
+          aState = TS_NORMAL;
+        else if (IsDisabled(aFrame, eventState))
+          aState = TS_DISABLED;
+        else if (IsReadOnly(aFrame))
+          aState = TFS_READONLY;
         else
-          aState = TFS_EDITBORDER_NORMAL;
+          aState = StandardGetState(aFrame, aWidgetType, true);
       }
 
       return NS_OK;
     }
     case NS_THEME_FOCUS_OUTLINE: {
-      // XXX the EDITBORDER values don't respect DTBG_OMITCONTENT
-      aPart = TFP_TEXTFIELD; //TFP_EDITBORDER_NOSCROLL;
-      aState = TS_FOCUSED; //TFS_EDITBORDER_FOCUSED;
+      if (IsVistaOrLater()) {
+        // XXX the EDITBORDER values don't respect DTBG_OMITCONTENT
+        aPart = TFP_TEXTFIELD; //TFP_EDITBORDER_NOSCROLL;
+        aState = TS_FOCUSED; //TFS_EDITBORDER_FOCUSED;
+      } else {
+        aPart = TFP_TEXTFIELD;
+        aState = TS_FOCUSED;
+      }
       return NS_OK;
     }
     case NS_THEME_TOOLTIP: {
@@ -865,9 +1032,11 @@ nsNativeThemeWin::GetThemePartAndState(nsIFrame* aFrame, uint8_t aWidgetType,
       nsIFrame* parentFrame = aFrame->GetParent();
       if (aWidgetType == NS_THEME_PROGRESSCHUNK_VERTICAL ||
           IsVerticalProgress(parentFrame)) {
-        aPart = PP_FILLVERT;
+        aPart = IsVistaOrLater() ?
+          PP_FILLVERT : PP_CHUNKVERT;
       } else {
-        aPart = PP_FILL;
+        aPart = IsVistaOrLater() ?
+          PP_FILL : PP_CHUNK;
       }
 
       aState = PBBVS_NORMAL;
@@ -931,7 +1100,8 @@ nsNativeThemeWin::GetThemePartAndState(nsIFrame* aFrame, uint8_t aWidgetType,
           aState += TS_ACTIVE;
         else if (eventState.HasState(NS_EVENT_STATE_HOVER))
           aState += TS_HOVER;
-        else if (parentState.HasState(NS_EVENT_STATE_HOVER))
+        else if (IsVistaOrLater() &&
+                 parentState.HasState(NS_EVENT_STATE_HOVER))
           aState = (aWidgetType - NS_THEME_SCROLLBARBUTTON_UP) + SP_BUTTON_IMPLICIT_HOVER_BASE;
         else
           aState += TS_NORMAL;
@@ -1034,7 +1204,14 @@ nsNativeThemeWin::GetThemePartAndState(nsIFrame* aFrame, uint8_t aWidgetType,
     case NS_THEME_SCROLLBAR:
     case NS_THEME_SCROLLBAR_SMALL: {
       aState = 0;
-      aPart = RP_BACKGROUND;
+      if (IsVistaOrLater()) {
+        // On vista, they have a part
+        aPart = RP_BACKGROUND;
+      } else {
+        // Otherwise, they don't.  (But I bet
+        // RP_BACKGROUND would work here, too);
+        aPart = 0;
+      }
       return NS_OK;
     }
     case NS_THEME_TOOLBAR: {
@@ -1159,7 +1336,8 @@ nsNativeThemeWin::GetThemePartAndState(nsIFrame* aFrame, uint8_t aWidgetType,
         aFrame = parentFrame;
 
       EventStates eventState = GetContentState(aFrame, aWidgetType);
-      aPart = CBP_DROPMARKER_VISTA;
+      aPart = IsVistaOrLater() ?
+        CBP_DROPMARKER_VISTA : CBP_DROPMARKER;
 
       // For HTML controls with author styling, we should fall
       // back to the old dropmarker style to avoid clashes with
@@ -1179,25 +1357,28 @@ nsNativeThemeWin::GetThemePartAndState(nsIFrame* aFrame, uint8_t aWidgetType,
       else
         isOpen = IsOpenButton(aFrame);
 
-      if (isHTML || IsMenuListEditable(aFrame)) {
-        if (isOpen) {
-          /* Hover is propagated, but we need to know whether we're hovering
-           * just the combobox frame, not the dropdown frame. But, we can't get
-           * that information, since hover is on the content node, and they
-           * share the same content node.  So, instead, we cheat -- if the
-           * dropdown is open, we always show the hover state.  This looks fine
-           * in practice.
+      if (IsVistaOrLater()) {
+        if (isHTML || IsMenuListEditable(aFrame)) {
+          if (isOpen) {
+            /* Hover is propagated, but we need to know whether we're
+             * hovering just the combobox frame, not the dropdown frame.
+             * But, we can't get that information, since hover is on the
+             * content node, and they share the same content node.  So,
+             * instead, we cheat -- if the dropdown is open, we always
+             * show the hover state.  This looks fine in practice.
+             */
+            aState = TS_HOVER;
+            return NS_OK;
+          }
+        } else {
+          /* On Vista, the dropdown indicator on a menulist button in  
+           * chrome is not given a hover effect. When the frame isn't
+           * isn't HTML content, we cheat and force the dropdown state
+           * to be normal. (Bug 430434)
            */
-          aState = TS_HOVER;
+          aState = TS_NORMAL;
           return NS_OK;
         }
-      } else {
-        /* The dropdown indicator on a menulist button in chrome is not given a
-         * hover effect. When the frame isn't isn't HTML content, we cheat and
-         * force the dropdown state to be normal. (Bug 430434)
-         */
-        aState = TS_NORMAL;
-        return NS_OK;
       }
 
       aState = TS_NORMAL;
@@ -1698,7 +1879,7 @@ RENDER_AGAIN:
   else if (aWidgetType == NS_THEME_PROGRESSCHUNK ||
            aWidgetType == NS_THEME_PROGRESSCHUNK_VERTICAL) {
     DrawThemedProgressMeter(aFrame, aWidgetType, theme, hdc, part, state,
-                            &widgetRect, &clipRect);
+                            &widgetRect, &clipRect, p2a);
   }
   else if (aWidgetType == NS_THEME_FOCUS_OUTLINE) {
     // Inflate 'widgetRect' with the focus outline size.
@@ -1964,39 +2145,41 @@ nsNativeThemeWin::GetWidgetPadding(nsDeviceContext* aContext,
     return ok;
   }
 
-  if (aWidgetType == NS_THEME_NUMBER_INPUT ||
-      aWidgetType == NS_THEME_TEXTFIELD ||
-      aWidgetType == NS_THEME_TEXTFIELD_MULTILINE ||
-      aWidgetType == NS_THEME_MENULIST)
-  {
-    // If we have author-specified padding for these elements, don't do the
-    // fixups below.
-    if (aFrame->PresContext()->HasAuthorSpecifiedRules(aFrame, NS_AUTHOR_SPECIFIED_PADDING))
-      return false;
-  }
+  if (IsVistaOrLater()) {
+    if (aWidgetType == NS_THEME_NUMBER_INPUT ||
+        aWidgetType == NS_THEME_TEXTFIELD ||
+        aWidgetType == NS_THEME_TEXTFIELD_MULTILINE ||
+        aWidgetType == NS_THEME_MENULIST)
+    {
+      /* If we have author-specified padding for these elements, don't do the fixups below */
+      if (aFrame->PresContext()->HasAuthorSpecifiedRules(aFrame, NS_AUTHOR_SPECIFIED_PADDING))
+        return false;
+    }
 
-  /* textfields need extra pixels on all sides, otherwise they wrap their
-   * content too tightly.  The actual border is drawn 1px inside the specified
-   * rectangle, so Gecko will end up making the contents look too small.
-   * Instead, we add 2px padding for the contents and fix this. (Used to be 1px
-   * added, see bug 430212)
-   */
-  if (aWidgetType == NS_THEME_NUMBER_INPUT ||
-      aWidgetType == NS_THEME_TEXTFIELD ||
-      aWidgetType == NS_THEME_TEXTFIELD_MULTILINE) {
-    aResult->top = aResult->bottom = 2;
-    aResult->left = aResult->right = 2;
-    ScaleForFrameDPI(aResult, aFrame);
-    return ok;
-  } else if (IsHTMLContent(aFrame) && aWidgetType == NS_THEME_MENULIST) {
-    /* For content menulist controls, we need an extra pixel so that we have
-     * room to draw our focus rectangle stuff. Otherwise, the focus rect might
-     * overlap the control's border.
+    /* textfields need extra pixels on all sides, otherwise they
+     * wrap their content too tightly.  The actual border is drawn 1px
+     * inside the specified rectangle, so Gecko will end up making the
+     * contents look too small.  Instead, we add 2px padding for the
+     * contents and fix this. (Used to be 1px added, see bug 430212)
      */
-    aResult->top = aResult->bottom = 1;
-    aResult->left = aResult->right = 1;
-    ScaleForFrameDPI(aResult, aFrame);
-    return ok;
+    if (aWidgetType == NS_THEME_NUMBER_INPUT ||
+        aWidgetType == NS_THEME_TEXTFIELD ||
+        aWidgetType == NS_THEME_TEXTFIELD_MULTILINE) {
+      aResult->top = aResult->bottom = 2;
+      aResult->left = aResult->right = 2;
+      ScaleForFrameDPI(aResult, aFrame);
+      return ok;
+    } else if (IsHTMLContent(aFrame) && aWidgetType == NS_THEME_MENULIST) {
+      /* For content menulist controls, we need an extra pixel so
+       * that we have room to draw our focus rectangle stuff.
+       * Otherwise, the focus rect might overlap the control's
+       * border.
+       */
+      aResult->top = aResult->bottom = 1;
+      aResult->left = aResult->right = 1;
+      ScaleForFrameDPI(aResult, aFrame);
+      return ok;
+    }
   }
 
   int32_t right, left, top, bottom;
@@ -2061,21 +2244,23 @@ nsNativeThemeWin::GetWidgetOverflow(nsDeviceContext* aContext,
    * a border only shows up if the widget is being hovered.
    */
 #if 0
-  /* We explicitly draw dropdown buttons in HTML content 1px bigger up, right,
-   * and bottom so that they overlap the dropdown's border like they're
-   * supposed to.
-   */
-  if (aWidgetType == NS_THEME_MENULIST_BUTTON &&
-      IsHTMLContent(aFrame) &&
-      !IsWidgetStyled(aFrame->GetParent()->PresContext(),
-                      aFrame->GetParent(),
-                      NS_THEME_MENULIST))
-  {
-    int32_t p2a = aContext->AppUnitsPerDevPixel();
-    /* Note: no overflow on the left */
-    nsMargin m(p2a, p2a, p2a, 0);
-    aOverflowRect->Inflate (m);
-    return true;
+  if (IsVistaOrLater()) {
+    /* We explicitly draw dropdown buttons in HTML content 1px bigger
+     * up, right, and bottom so that they overlap the dropdown's border
+     * like they're supposed to.
+     */
+    if (aWidgetType == NS_THEME_MENULIST_BUTTON &&
+        IsHTMLContent(aFrame) &&
+        !IsWidgetStyled(aFrame->GetParent()->PresContext(),
+                        aFrame->GetParent(),
+                        NS_THEME_MENULIST))
+    {
+      int32_t p2a = aContext->AppUnitsPerDevPixel();
+      /* Note: no overflow on the left */
+      nsMargin m(p2a, p2a, p2a, 0);
+      aOverflowRect->Inflate (m);
+      return true;
+    }
   }
 #endif
 
@@ -2199,18 +2384,22 @@ nsNativeThemeWin::GetMinimumWidgetSize(nsPresContext* aPresContext, nsIFrame* aF
     case NS_THEME_SCALETHUMB_VERTICAL:
     {
       *aIsOverridable = false;
-      // On Vista, GetThemePartAndState returns odd values for
+      // on Vista, GetThemePartAndState returns odd values for
       // scale thumbs, so use a hardcoded size instead.
-      if (aWidgetType == NS_THEME_SCALETHUMB_HORIZONTAL ||
-          (aWidgetType == NS_THEME_RANGE_THUMB && IsRangeHorizontal(aFrame))) {
-        aResult->width = 12;
-        aResult->height = 20;
-      } else {
-        aResult->width = 20;
-        aResult->height = 12;
+      if (IsVistaOrLater()) {
+        if (aWidgetType == NS_THEME_SCALETHUMB_HORIZONTAL ||
+            (aWidgetType == NS_THEME_RANGE_THUMB && IsRangeHorizontal(aFrame))) {
+          aResult->width = 12;
+          aResult->height = 20;
+        }
+        else {
+          aResult->width = 20;
+          aResult->height = 12;
+        }
+        ScaleForFrameDPI(aResult, aFrame);
+        return rv;
       }
-      ScaleForFrameDPI(aResult, aFrame);
-      return rv;
+      break;
     }
 
     case NS_THEME_SCROLLBAR:
@@ -2249,6 +2438,11 @@ nsNativeThemeWin::GetMinimumWidgetSize(nsPresContext* aPresContext, nsIFrame* aF
       // stores that info in nsUXThemeData.
       aResult->width = nsUXThemeData::sCommandButtons[CMDBUTTONIDX_RESTORE].cx;
       aResult->height = nsUXThemeData::sCommandButtons[CMDBUTTONIDX_RESTORE].cy;
+      // For XP, subtract 4 from system metrics dimensions.
+      if (!IsVistaOrLater()) {
+        aResult->width -= 4;
+        aResult->height -= 4;
+      }
       AddPaddingRect(aResult, CAPTIONBUTTON_RESTORE);
       *aIsOverridable = false;
       return rv;
@@ -2256,6 +2450,10 @@ nsNativeThemeWin::GetMinimumWidgetSize(nsPresContext* aPresContext, nsIFrame* aF
     case NS_THEME_WINDOW_BUTTON_MINIMIZE:
       aResult->width = nsUXThemeData::sCommandButtons[CMDBUTTONIDX_MINIMIZE].cx;
       aResult->height = nsUXThemeData::sCommandButtons[CMDBUTTONIDX_MINIMIZE].cy;
+      if (!IsVistaOrLater()) {
+        aResult->width -= 4;
+        aResult->height -= 4;
+      }
       AddPaddingRect(aResult, CAPTIONBUTTON_MINIMIZE);
       *aIsOverridable = false;
       return rv;
@@ -2263,6 +2461,10 @@ nsNativeThemeWin::GetMinimumWidgetSize(nsPresContext* aPresContext, nsIFrame* aF
     case NS_THEME_WINDOW_BUTTON_CLOSE:
       aResult->width = nsUXThemeData::sCommandButtons[CMDBUTTONIDX_CLOSE].cx;
       aResult->height = nsUXThemeData::sCommandButtons[CMDBUTTONIDX_CLOSE].cy;
+      if (!IsVistaOrLater()) {
+        aResult->width -= 4;
+        aResult->height -= 4;
+      }
       AddPaddingRect(aResult, CAPTIONBUTTON_CLOSE);
       *aIsOverridable = false;
       return rv;
@@ -2392,9 +2594,18 @@ nsNativeThemeWin::WidgetStateChanged(nsIFrame* aFrame, uint8_t aWidgetType,
     return NS_OK;
   }
 
+  // On Vista, the scrollbar buttons need to change state when the track has/doesn't have hover
+  if (!IsVistaOrLater() &&
+      (aWidgetType == NS_THEME_SCROLLBAR_VERTICAL || 
+      aWidgetType == NS_THEME_SCROLLBAR_HORIZONTAL)) {
+    *aShouldRepaint = false;
+    return NS_OK;
+  }
+
   // We need to repaint the dropdown arrow in vista HTML combobox controls when
   // the control is closed to get rid of the hover effect.
-  if ((aWidgetType == NS_THEME_MENULIST || aWidgetType == NS_THEME_MENULIST_BUTTON) &&
+  if (IsVistaOrLater() &&
+      (aWidgetType == NS_THEME_MENULIST || aWidgetType == NS_THEME_MENULIST_BUTTON) &&
       IsHTMLContent(aFrame))
   {
     *aShouldRepaint = true;
diff --git a/widget/windows/nsNativeThemeWin.h b/widget/windows/nsNativeThemeWin.h
index 32b82b1e1..f20649444 100644
--- a/widget/windows/nsNativeThemeWin.h
+++ b/widget/windows/nsNativeThemeWin.h
@@ -117,7 +117,8 @@ protected:
   void DrawThemedProgressMeter(nsIFrame* aFrame, int aWidgetType,
                                HANDLE aTheme, HDC aHdc,
                                int aPart, int aState,
-                               RECT* aWidgetRect, RECT* aClipRect);
+                               RECT* aWidgetRect, RECT* aClipRect,
+                               gfxFloat aAppUnits);
 
 private:
   TimeStamp mProgressDeterminateTimeStamp;
diff --git a/widget/windows/nsUXThemeConstants.h b/widget/windows/nsUXThemeConstants.h
index ba7afde82..731dcedf2 100644
--- a/widget/windows/nsUXThemeConstants.h
+++ b/widget/windows/nsUXThemeConstants.h
@@ -67,7 +67,7 @@
 #define SP_GRIPPERHOR      8
 #define SP_GRIPPERVERT     9
 
-// Implicit hover state.
+// Vista only; implict hover state.
 // BASE + 0 = UP, + 1 = DOWN, etc.
 #define SP_BUTTON_IMPLICIT_HOVER_BASE   17
 
diff --git a/widget/windows/nsUXThemeData.cpp b/widget/windows/nsUXThemeData.cpp
index 4d9ac9570..bcbd32484 100644
--- a/widget/windows/nsUXThemeData.cpp
+++ b/widget/windows/nsUXThemeData.cpp
@@ -143,8 +143,10 @@ nsUXThemeData::InitTitlebarInfo()
   sCommandButtons[3].cx = sCommandButtons[0].cx * 3;
   sCommandButtons[3].cy = sCommandButtons[0].cy;
 
-  // Trigger a refresh on the next layout.
-  sTitlebarInfoPopulatedAero = sTitlebarInfoPopulatedThemed = false;
+  // Use system metrics for pre-vista, otherwise trigger a
+  // refresh on the next layout.
+  sTitlebarInfoPopulatedAero = sTitlebarInfoPopulatedThemed =
+    !IsVistaOrLater();
 }
 
 // static
@@ -304,7 +306,7 @@ void
 nsUXThemeData::UpdateNativeThemeInfo()
 {
   // Trigger a refresh of themed button metrics if needed
-  sTitlebarInfoPopulatedThemed = false;
+  sTitlebarInfoPopulatedThemed = !IsVistaOrLater();
 
   sIsDefaultWindowsTheme = false;
   sThemeId = LookAndFeel::eWindowsTheme_Generic;
diff --git a/widget/windows/nsWinGesture.h b/widget/windows/nsWinGesture.h
index fdd1588b6..f5561166a 100644
--- a/widget/windows/nsWinGesture.h
+++ b/widget/windows/nsWinGesture.h
@@ -17,6 +17,155 @@
 #include "mozilla/EventForwards.h"
 #include "mozilla/TouchEvents.h"
 
+// Desktop builds target apis for 502. Win8 Metro builds target 602.
+#if WINVER < 0x0601
+
+DECLARE_HANDLE(HGESTUREINFO);
+
+/*
+ * Gesture flags - GESTUREINFO.dwFlags
+ */
+#define GF_BEGIN                        0x00000001
+#define GF_INERTIA                      0x00000002
+#define GF_END                          0x00000004
+
+/*
+ * Gesture configuration structure
+ *   - Used in SetGestureConfig and GetGestureConfig
+ *   - Note that any setting not included in either GESTURECONFIG.dwWant or
+ *     GESTURECONFIG.dwBlock will use the parent window's preferences or
+ *     system defaults.
+ */
+typedef struct tagGESTURECONFIG {
+    DWORD dwID;                     // gesture ID
+    DWORD dwWant;                   // settings related to gesture ID that are to be turned on
+    DWORD dwBlock;                  // settings related to gesture ID that are to be turned off
+} GESTURECONFIG, *PGESTURECONFIG;
+
+/*
+ * Gesture information structure
+ *   - Pass the HGESTUREINFO received in the WM_GESTURE message lParam into the
+ *     GetGestureInfo function to retrieve this information.
+ *   - If cbExtraArgs is non-zero, pass the HGESTUREINFO received in the WM_GESTURE
+ *     message lParam into the GetGestureExtraArgs function to retrieve extended
+ *     argument information.
+ */
+typedef struct tagGESTUREINFO {
+    UINT cbSize;                    // size, in bytes, of this structure (including variable length Args field)
+    DWORD dwFlags;                  // see GF_* flags
+    DWORD dwID;                     // gesture ID, see GID_* defines
+    HWND hwndTarget;                // handle to window targeted by this gesture
+    POINTS ptsLocation;             // current location of this gesture
+    DWORD dwInstanceID;             // internally used
+    DWORD dwSequenceID;             // internally used
+    ULONGLONG ullArguments;         // arguments for gestures whose arguments fit in 8 BYTES
+    UINT cbExtraArgs;               // size, in bytes, of extra arguments, if any, that accompany this gesture
+} GESTUREINFO, *PGESTUREINFO;
+typedef GESTUREINFO const * PCGESTUREINFO;
+
+/*
+ * Gesture notification structure
+ *   - The WM_GESTURENOTIFY message lParam contains a pointer to this structure.
+ *   - The WM_GESTURENOTIFY message notifies a window that gesture recognition is
+ *     in progress and a gesture will be generated if one is recognized under the
+ *     current gesture settings.
+ */
+typedef struct tagGESTURENOTIFYSTRUCT {
+    UINT cbSize;                    // size, in bytes, of this structure
+    DWORD dwFlags;                  // unused
+    HWND hwndTarget;                // handle to window targeted by the gesture
+    POINTS ptsLocation;             // starting location
+    DWORD dwInstanceID;             // internally used
+} GESTURENOTIFYSTRUCT, *PGESTURENOTIFYSTRUCT;
+
+
+/*
+ * Gesture argument helpers
+ *   - Angle should be a double in the range of -2pi to +2pi
+ *   - Argument should be an unsigned 16-bit value
+ */
+#define GID_ROTATE_ANGLE_TO_ARGUMENT(_arg_)     ((USHORT)((((_arg_) + 2.0 * 3.14159265) / (4.0 * 3.14159265)) * 65535.0))
+#define GID_ROTATE_ANGLE_FROM_ARGUMENT(_arg_)   ((((double)(_arg_) / 65535.0) * 4.0 * 3.14159265) - 2.0 * 3.14159265)
+
+/*
+ * Gesture configuration flags
+ */
+#define GC_ALLGESTURES                              0x00000001
+
+#define GC_ZOOM                                     0x00000001
+
+#define GC_PAN                                      0x00000001
+#define GC_PAN_WITH_SINGLE_FINGER_VERTICALLY        0x00000002
+#define GC_PAN_WITH_SINGLE_FINGER_HORIZONTALLY      0x00000004
+#define GC_PAN_WITH_GUTTER                          0x00000008
+#define GC_PAN_WITH_INERTIA                         0x00000010
+
+#define GC_ROTATE                                   0x00000001
+
+#define GC_TWOFINGERTAP                             0x00000001
+
+#define GC_PRESSANDTAP                              0x00000001
+
+/*
+ * Gesture IDs
+ */
+#define GID_BEGIN                       1
+#define GID_END                         2
+#define GID_ZOOM                        3
+#define GID_PAN                         4
+#define GID_ROTATE                      5
+#define GID_TWOFINGERTAP                6
+#define GID_PRESSANDTAP                 7
+
+// Maximum number of gestures that can be included
+// in a single call to SetGestureConfig / GetGestureConfig
+#define GESTURECONFIGMAXCOUNT           256
+
+// If specified, GetGestureConfig returns consolidated configuration
+// for the specified window and it's parent window chain
+#define GCF_INCLUDE_ANCESTORS           0x00000001
+
+// Window events we need to respond to or receive
+#define WM_GESTURE                         0x0119
+#define WM_GESTURENOTIFY                   0x011A
+
+typedef struct _TOUCHINPUT {
+  LONG      x;
+  LONG      y;
+  HANDLE    hSource;
+  DWORD     dwID;
+  DWORD     dwFlags;
+  DWORD     dwMask;
+  DWORD     dwTime;
+  ULONG_PTR dwExtraInfo;
+  DWORD     cxContact;
+  DWORD     cyContact;
+} TOUCHINPUT, *PTOUCHINPUT;
+
+typedef HANDLE HTOUCHINPUT;
+
+#define WM_TOUCH 0x0240
+
+#define TOUCHEVENTF_MOVE       0x0001
+#define TOUCHEVENTF_DOWN       0x0002
+#define TOUCHEVENTF_UP         0x0004
+#define TOUCHEVENTF_INRANGE    0x0008
+#define TOUCHEVENTF_PRIMARY    0x0010
+#define TOUCHEVENTF_NOCOALESCE 0x0020
+#define TOUCHEVENTF_PEN        0x0040
+#define TOUCHEVENTF_PALM       0x0080
+
+#define TOUCHINPUTMASKF_TIMEFROMSYSTEM 0x0001
+#define TOUCHINPUTMASKF_EXTRAINFO      0x0002
+#define TOUCHINPUTMASKF_CONTACTAREA    0x0004
+
+#define TOUCH_COORD_TO_PIXEL(C) (C/100)
+
+#define TWF_FINETOUCH          0x0001
+#define TWF_WANTPALM           0x0002
+
+#endif // WINVER < 0x0602
+
 // WM_TABLET_QUERYSYSTEMGESTURESTATUS return values
 #define TABLET_ROTATE_GESTURE_ENABLE    0x02000000
 
@@ -56,7 +205,7 @@ public:
   bool GetTouchInputInfo(HTOUCHINPUT hTouchInput, uint32_t cInputs, PTOUCHINPUT pInputs);
   bool CloseTouchInputHandle(HTOUCHINPUT hTouchInput);
   bool IsAvailable();
-
+  
   // Simple gesture process
   bool ProcessGestureMessage(HWND hWnd, WPARAM wParam, LPARAM lParam, mozilla::WidgetSimpleGestureEvent& evt);
 
@@ -67,7 +216,7 @@ public:
   void UpdatePanFeedbackX(HWND hWnd, int32_t scrollOverflow, bool& endFeedback);
   void UpdatePanFeedbackY(HWND hWnd, int32_t scrollOverflow, bool& endFeedback);
   void PanFeedbackFinalize(HWND hWnd, bool endFeedback);
-
+  
 public:
   // Helpers
   bool GetGestureInfo(HGESTUREINFO hGestureInfo, PGESTUREINFO pGestureInfo);
@@ -135,3 +284,5 @@ private:
 };
 
 #endif /* WinGesture_h__ */
+
+
diff --git a/widget/windows/nsWindow.cpp b/widget/windows/nsWindow.cpp
index b2bb59bd3..a8923f78e 100644
--- a/widget/windows/nsWindow.cpp
+++ b/widget/windows/nsWindow.cpp
@@ -266,7 +266,8 @@ LONG            nsWindow::sLastMouseDownTime      = 0L;
 LONG            nsWindow::sLastClickCount         = 0L;
 BYTE            nsWindow::sLastMouseButton        = 0;
 
-bool            nsWindow::sHaveInitializedPrefs   = false;
+// Trim heap on minimize. (initialized, but still true.)
+int             nsWindow::sTrimOnMinimize         = 2;
 
 TriStateBool nsWindow::sHasBogusPopupsDropShadowOnMultiMonitor = TRI_UNKNOWN;
 
@@ -782,7 +783,7 @@ nsWindow::Create(nsIWidget* aParent,
       parent = nullptr;
     }
 
-    if (!IsWin8OrLater() &&
+    if (IsVistaOrLater() && !IsWin8OrLater() &&
         HasBogusPopupsDropShadowOnMultiMonitor()) {
       extendedStyle |= WS_EX_COMPOSITED;
     }
@@ -907,13 +908,20 @@ nsWindow::Create(nsIWidget* aParent,
   mDefaultIMC.Init(this);
   IMEHandler::InitInputContext(this, mInputContext);
 
-  // Do some initialization work, but only if (a) it hasn't already been done,
-  // and (b) this is the hidden window (which is conveniently created before
-  // any visible windows but after the profile has been initialized).
-  if (!sHaveInitializedPrefs && mWindowType == eWindowType_invisible) {
+  // If the internal variable set by the config.trim_on_minimize pref has not
+  // been initialized, and if this is the hidden window (conveniently created
+  // before any visible windows, and after the profile has been initialized),
+  // do some initialization work.
+  if (sTrimOnMinimize == 2 && mWindowType == eWindowType_invisible) {
+    // Our internal trim prevention logic is effective on 2K/XP at maintaining
+    // the working set when windows are minimized, but on Vista and up it has
+    // little to no effect. Since this feature has been the source of numerous
+    // bugs over the years, disable it (sTrimOnMinimize=1) on Vista and up.
+    sTrimOnMinimize =
+      Preferences::GetBool("config.trim_on_minimize",
+        IsVistaOrLater() ? 1 : 0);
     sSwitchKeyboardLayout =
       Preferences::GetBool("intl.keyboard.per_window_layout", false);
-    sHaveInitializedPrefs = true;
   }
 
   // Query for command button metric data for rendering the titlebar. We
@@ -1639,10 +1647,9 @@ bool nsWindow::IsVisible() const
 
 // XP and Vista visual styles sometimes require window clipping regions to be applied for proper
 // transparency. These routines are called on size and move operations.
-// XXX this is apparently still needed in Windows 7 and later
 void nsWindow::ClearThemeRegion()
 {
-  if (!HasGlass() &&
+  if (IsVistaOrLater() && !HasGlass() &&
       (mWindowType == eWindowType_popup && !IsPopupWithTitleBar() &&
        (mPopupType == ePopupTypeTooltip || mPopupType == ePopupTypePanel))) {
     SetWindowRgn(mWnd, nullptr, false);
@@ -1656,7 +1663,7 @@ void nsWindow::SetThemeRegion()
   // so default constants are used for part and state. At some point we might need part and
   // state values from nsNativeThemeWin's GetThemePartAndState, but currently windows that
   // change shape based on state haven't come up.
-  if (!HasGlass() &&
+  if (IsVistaOrLater() && !HasGlass() &&
       (mWindowType == eWindowType_popup && !IsPopupWithTitleBar() &&
        (mPopupType == ePopupTypeTooltip || mPopupType == ePopupTypePanel))) {
     HRGN hRgn = nullptr;
@@ -2073,7 +2080,13 @@ nsWindow::SetSizeMode(nsSizeMode aMode)
         break;
 
       case nsSizeMode_Minimized :
-        mode = SW_MINIMIZE;
+        // Using SW_SHOWMINIMIZED prevents the working set from being trimmed but
+        // keeps the window active in the tray. So after the window is minimized,
+        // windows will fire WM_WINDOWPOSCHANGED (OnWindowPosChanged) at which point
+        // we will do some additional processing to get the active window set right.
+        // If sTrimOnMinimize is set, we let windows handle minimization normally
+        // using SW_MINIMIZE.
+        mode = sTrimOnMinimize ? SW_MINIMIZE : SW_SHOWMINIMIZED;
         break;
 
       default :
@@ -5815,6 +5828,12 @@ nsWindow::ProcessMessage(UINT msg, WPARAM& wParam, LPARAM& lParam,
     case WM_SYSCOMMAND:
     {
       WPARAM filteredWParam = (wParam &0xFFF0);
+      // prevent Windows from trimming the working set. bug 76831
+      if (!sTrimOnMinimize && filteredWParam == SC_MINIMIZE) {
+        ::ShowWindow(mWnd, SW_SHOWMINIMIZED);
+        result = true;
+      }
+
       if (mSizeMode == nsSizeMode_Fullscreen &&
           filteredWParam == SC_RESTORE &&
           GetCurrentShowCmd(mWnd) != SW_SHOWMINIMIZED) {
@@ -6432,6 +6451,14 @@ void nsWindow::OnWindowPosChanged(WINDOWPOS* wp)
     else
       mSizeMode = nsSizeMode_Normal;
 
+    // If !sTrimOnMinimize, we minimize windows using SW_SHOWMINIMIZED (See
+    // SetSizeMode for internal calls, and WM_SYSCOMMAND for external). This
+    // prevents the working set from being trimmed but keeps the window active.
+    // After the window is minimized, we need to do some touch up work on the
+    // active window. (bugs 76831 & 499816)
+    if (!sTrimOnMinimize && nsSizeMode_Minimized == mSizeMode)
+      ActivateOtherWindowHelper(mWnd);
+
 #ifdef WINSTATE_DEBUG_OUTPUT
     switch (mSizeMode) {
       case nsSizeMode_Normal:
@@ -6552,6 +6579,31 @@ void nsWindow::OnWindowPosChanged(WINDOWPOS* wp)
   }
 }
 
+// static
+void nsWindow::ActivateOtherWindowHelper(HWND aWnd)
+{
+  // Find the next window that is enabled, visible, and not minimized.
+  HWND hwndBelow = ::GetNextWindow(aWnd, GW_HWNDNEXT);
+  while (hwndBelow && (!::IsWindowEnabled(hwndBelow) || !::IsWindowVisible(hwndBelow) ||
+                       ::IsIconic(hwndBelow))) {
+    hwndBelow = ::GetNextWindow(hwndBelow, GW_HWNDNEXT);
+  }
+
+  // Push ourselves to the bottom of the stack, then activate the
+  // next window.
+  ::SetWindowPos(aWnd, HWND_BOTTOM, 0, 0, 0, 0,
+                 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
+  if (hwndBelow)
+    ::SetForegroundWindow(hwndBelow);
+
+  // Play the minimize sound while we're here, since that is also
+  // forgotten when we use SW_SHOWMINIMIZED.
+  nsCOMPtr<nsISound> sound(do_CreateInstance("@mozilla.org/sound;1"));
+  if (sound) {
+    sound->PlaySystemSound(NS_LITERAL_STRING("Minimize"));
+  }
+}
+
 void nsWindow::OnWindowPosChanging(LPWINDOWPOS& info)
 {
   // Update non-client margins if the frame size is changing, and let the
diff --git a/widget/windows/nsWindow.h b/widget/windows/nsWindow.h
index 199500e9c..248978bd7 100644
--- a/widget/windows/nsWindow.h
+++ b/widget/windows/nsWindow.h
@@ -486,6 +486,7 @@ protected:
                                               bool aIntersectWithExisting) override;
   nsIntRegion             GetRegionToPaint(bool aForceFullRepaint,
                                            PAINTSTRUCT ps, HDC aDC);
+  static void             ActivateOtherWindowHelper(HWND aWnd);
   void                    ClearCachedResources();
   nsIWidgetListener*      GetPaintListener();
 
@@ -551,7 +552,7 @@ protected:
   static bool           sJustGotDeactivate;
   static bool           sJustGotActivate;
   static bool           sIsInMouseCapture;
-  static bool           sHaveInitializedPrefs;
+  static int            sTrimOnMinimize;
 
   // Always use the helper method to read this property.  See bug 603793.
   static TriStateBool   sHasBogusPopupsDropShadowOnMultiMonitor;
diff --git a/xpcom/build/XPCOMInit.cpp b/xpcom/build/XPCOMInit.cpp
index e8ee5828a..a404fcc1e 100644
--- a/xpcom/build/XPCOMInit.cpp
+++ b/xpcom/build/XPCOMInit.cpp
@@ -111,6 +111,7 @@ extern nsresult nsStringInputStreamConstructor(nsISupports*, REFNSIID, void**);
 #include "SpecialSystemDirectory.h"
 
 #if defined(XP_WIN)
+#include "mozilla/WindowsVersion.h"
 #include "nsWindowsRegKey.h"
 #endif
 
@@ -581,6 +582,8 @@ NS_InitXPCOM2(nsIServiceManager** aResult,
 
   NS_StartupLocalFile();
 
+  StartupSpecialSystemDirectory();
+
   nsDirectoryService::RealInit();
 
   bool value;
diff --git a/xpcom/glue/nsThreadUtils.cpp b/xpcom/glue/nsThreadUtils.cpp
index 2f2383fd8..287ada7be 100644
--- a/xpcom/glue/nsThreadUtils.cpp
+++ b/xpcom/glue/nsThreadUtils.cpp
@@ -20,10 +20,15 @@
 
 #ifdef XP_WIN
 #include <windows.h>
+#include "mozilla/WindowsVersion.h"
+using mozilla::IsVistaOrLater;
 #elif defined(XP_MACOSX)
 #include <sys/resource.h>
 #endif
 
+#include <pratom.h>
+#include <prthread.h>
+
 using namespace mozilla;
 
 #ifndef XPCOM_GLUE_AVOID_NSPR
@@ -438,7 +443,8 @@ nsThreadPoolNaming::SetThreadPoolName(const nsACString& aPoolName,
 nsAutoLowPriorityIO::nsAutoLowPriorityIO()
 {
 #if defined(XP_WIN)
-  lowIOPrioritySet = SetThreadPriority(GetCurrentThread(),
+  lowIOPrioritySet = IsVistaOrLater() &&
+                     SetThreadPriority(GetCurrentThread(),
                                        THREAD_MODE_BACKGROUND_BEGIN);
 #elif defined(XP_MACOSX)
   oldPriority = getiopolicy_np(IOPOL_TYPE_DISK, IOPOL_SCOPE_THREAD);
diff --git a/xpcom/io/SpecialSystemDirectory.cpp b/xpcom/io/SpecialSystemDirectory.cpp
index 158431088..e2ae655d9 100644
--- a/xpcom/io/SpecialSystemDirectory.cpp
+++ b/xpcom/io/SpecialSystemDirectory.cpp
@@ -12,6 +12,7 @@
 #if defined(XP_WIN)
 
 #include <windows.h>
+#include <shlobj.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
@@ -19,6 +20,9 @@
 #include <shlobj.h>
 #include <knownfolders.h>
 #include <guiddef.h>
+#include "mozilla/WindowsVersion.h"
+
+using mozilla::IsWin7OrLater;
 
 #elif defined(XP_UNIX)
 
@@ -47,17 +51,40 @@
 #endif
 #endif
 
+#ifdef XP_WIN
+typedef HRESULT (WINAPI* nsGetKnownFolderPath)(GUID& rfid,
+                                               DWORD dwFlags,
+                                               HANDLE hToken,
+                                               PWSTR* ppszPath);
+
+static nsGetKnownFolderPath gGetKnownFolderPath = nullptr;
+#endif
+
+void
+StartupSpecialSystemDirectory()
+{
+#if defined (XP_WIN)
+  // SHGetKnownFolderPath is only available on Windows Vista
+  // so that we need to use GetProcAddress to get the pointer.
+  HMODULE hShell32DLLInst = GetModuleHandleW(L"shell32.dll");
+  if (hShell32DLLInst) {
+    gGetKnownFolderPath = (nsGetKnownFolderPath)
+      GetProcAddress(hShell32DLLInst, "SHGetKnownFolderPath");
+  }
+#endif
+}
+
 #if defined (XP_WIN)
 
 static nsresult
 GetKnownFolder(GUID* aGuid, nsIFile** aFile)
 {
-  if (!aGuid) {
+  if (!aGuid || !gGetKnownFolderPath) {
     return NS_ERROR_FAILURE;
   }
 
   PWSTR path = nullptr;
-  SHGetKnownFolderPath(*aGuid, 0, nullptr, &path);
+  gGetKnownFolderPath(*aGuid, 0, nullptr, &path);
 
   if (!path) {
     return NS_ERROR_FAILURE;
@@ -112,13 +139,19 @@ SHLoadLibraryFromKnownFolder(REFKNOWNFOLDERID aFolderId, DWORD aMode,
 }
 
 /*
- * Return the default save-to location for the Windows Library passed in
- * through aFolderId.
+ * Check to see if we're on Win7 and up, and if so, returns the default
+ * save-to location for the Windows Library passed in through aFolderId.
+ * Otherwise falls back on pre-win7 GetWindowsFolder.
  */
 static nsresult
 GetLibrarySaveToPath(int aFallbackFolderId, REFKNOWNFOLDERID aFolderId,
                      nsIFile** aFile)
 {
+  // Skip off checking for library support if the os is Vista or lower.
+  if (!IsWin7OrLater()) {
+    return GetWindowsFolder(aFallbackFolderId, aFile);
+  }
+
   RefPtr<IShellLibrary> shellLib;
   RefPtr<IShellItem> savePath;
   HRESULT hr =
diff --git a/xpcom/io/SpecialSystemDirectory.h b/xpcom/io/SpecialSystemDirectory.h
index b1ce31b74..9142f2278 100644
--- a/xpcom/io/SpecialSystemDirectory.h
+++ b/xpcom/io/SpecialSystemDirectory.h
@@ -16,6 +16,9 @@
 #include "prenv.h"
 #endif
 
+extern void StartupSpecialSystemDirectory();
+
+
 enum SystemDirectories {
   OS_DriveDirectory         =   1,
   OS_TemporaryDirectory     =   2,
diff --git a/xpcom/io/nsLocalFileWin.cpp b/xpcom/io/nsLocalFileWin.cpp
index 66e267807..3a7e570f5 100644
--- a/xpcom/io/nsLocalFileWin.cpp
+++ b/xpcom/io/nsLocalFileWin.cpp
@@ -7,6 +7,7 @@
 #include "mozilla/ArrayUtils.h"
 #include "mozilla/DebugOnly.h"
 #include "mozilla/UniquePtrExtensions.h"
+#include "mozilla/WindowsVersion.h"
 
 #include "nsCOMPtr.h"
 #include "nsAutoPtr.h"
@@ -1969,11 +1970,13 @@ nsLocalFile::CopySingleFile(nsIFile* aSourceFile, nsIFile* aDestParent,
   // So we only use COPY_FILE_NO_BUFFERING when we have a remote drive.
   int copyOK;
   DWORD dwCopyFlags = COPY_FILE_ALLOW_DECRYPTED_DESTINATION;
-  bool path1Remote, path2Remote;
-  if (!IsRemoteFilePath(filePath.get(), path1Remote) ||
-      !IsRemoteFilePath(destPath.get(), path2Remote) ||
-      path1Remote || path2Remote) {
-    dwCopyFlags |= COPY_FILE_NO_BUFFERING;
+  if (IsVistaOrLater()) {
+    bool path1Remote, path2Remote;
+    if (!IsRemoteFilePath(filePath.get(), path1Remote) ||
+        !IsRemoteFilePath(destPath.get(), path2Remote) ||
+        path1Remote || path2Remote) {
+      dwCopyFlags |= COPY_FILE_NO_BUFFERING;
+    }
   }
 
   if (!move) {
