Merge inbound to m-c a=merge
authorWes Kocher <wkocher@mozilla.com>
Thu, 21 Jan 2016 16:24:42 -0800
changeset 281005 8a72770299f19f93f281874098ac8e94c76c8265
parent 280947 f36a4a4ff73f1184f569fd9152b98fe8d8d3866a (current diff)
parent 281004 b9b9318b8aefdf32c115f2e5e6514622388bb976 (diff)
child 281006 7f3168c2fb0a71dfbd787965b686e91509ca42d9
push id29925
push userkwierso@gmail.com
push dateFri, 22 Jan 2016 00:27:20 +0000
treeherdermozilla-central@cea2883034cb [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone46.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge inbound to m-c a=merge
configure.in
dom/media/platforms/ffmpeg/FFmpegH264Decoder.cpp
dom/media/platforms/ffmpeg/FFmpegH264Decoder.h
testing/web-platform/meta/2dcontext/path-objects/2d.path.arc.shape.1.html.ini
toolkit/components/telemetry/Histograms.json
--- a/browser/base/content/aboutNetError.xhtml
+++ b/browser/base/content/aboutNetError.xhtml
@@ -489,17 +489,17 @@
         <!-- Override section - For ssl errors only.  Removed on init for other
              error types.  -->
         <div id="securityOverrideDiv">
           <a id="securityOverrideLink" href="javascript:showSecuritySection();" >&securityOverride.linkText;</a>
           <div id="securityOverrideContent" style="display: none;">&securityOverride.warningContent;</div>
         </div>
 
         <div id="learnMoreContainer">
-          <p><a href="https://support.mozilla.org/kb/tls-error-reports" id="learnMoreLink" target="new">&errorReporting.learnMore;</a></p>
+          <p><a href="https://support.mozilla.org/kb/what-does-your-connection-is-not-secure-mean" id="learnMoreLink" target="new">&errorReporting.learnMore;</a></p>
         </div>
 
         <div id="buttonContainer">
           <button id="returnButton" autocomplete="off" autofocus="true">&returnToPreviousPage.label;</button>
           <div id="buttonSpacer"></div>
           <button id="advancedButton" autocomplete="off" autofocus="true">&advanced.label;</button>
         </div>
       </div>
--- a/browser/base/content/aboutcerterror/aboutCertError.xhtml
+++ b/browser/base/content/aboutcerterror/aboutCertError.xhtml
@@ -267,17 +267,17 @@
       <div id="errorLongContent">
 
         <!-- Short Description -->
         <div id="errorShortDesc">
           <p>&certerror.introPara;</p>
         </div>
         <p id="badStsCertExplanation">&certerror.whatShouldIDo.badStsCertExplanation;</p>
         <div>
-          <p><a href="https://support.mozilla.org/kb/tls-error-reports" id="learnMoreLink" target="new">&certerror.learnMore;</a></p>
+          <p><a href="https://support.mozilla.org/kb/what-does-your-connection-is-not-secure-mean" id="learnMoreLink" target="new">&certerror.learnMore;</a></p>
         </div>
 
         <div id="buttonContainer">
           <button id="returnButton" autocomplete="off" autofocus="true">&certerror.returnToPreviousPage.label;</button>
           <div id="buttonSpacer"></div>
           <button id="advancedButton" autocomplete="off" onclick="toggleVisibility('advancedPanel');" autofocus="true">&certerror.advanced.label;</button>
         </div>
       </div>
--- a/config/rules.mk
+++ b/config/rules.mk
@@ -458,24 +458,29 @@ EXTRA_DSO_LDOPTS += -Wl,-Bsymbolic
 endif
 ifdef LD_VERSION_SCRIPT
 EXTRA_DSO_LDOPTS += -Wl,--version-script,$(LD_VERSION_SCRIPT)
 EXTRA_DEPS += $(LD_VERSION_SCRIPT)
 endif
 endif
 
 ifdef SYMBOLS_FILE
+ifeq ($(OS_TARGET),WINNT)
+ifndef GNU_CC
+EXTRA_DSO_LDOPTS += -DEF:$(call normalizepath,$(SYMBOLS_FILE))
+else
+EXTRA_DSO_LDOPTS += $(call normalizepath,$(SYMBOLS_FILE))
+endif
+else
 ifdef GCC_USE_GNU_LD
 EXTRA_DSO_LDOPTS += -Wl,--version-script,$(SYMBOLS_FILE)
 else
 ifeq ($(OS_TARGET),Darwin)
 EXTRA_DSO_LDOPTS += -Wl,-exported_symbols_list,$(SYMBOLS_FILE)
 endif
-ifeq ($(OS_TARGET),WINNT)
-EXTRA_DSO_LDOPTS += -DEF:$(call normalizepath,$(SYMBOLS_FILE))
 endif
 endif
 EXTRA_DEPS += $(SYMBOLS_FILE)
 endif
 #
 # GNU doesn't have path length limitation
 #
 
--- a/configure.in
+++ b/configure.in
@@ -70,17 +70,17 @@ GTK2_VERSION=2.18.0
 GTK3_VERSION=3.4.0
 GDK_VERSION_MIN_REQUIRED=GDK_VERSION_3_4
 WINDRES_VERSION=2.14.90
 W32API_VERSION=3.14
 GNOMEUI_VERSION=2.2.0
 GCONF_VERSION=1.2.1
 STARTUP_NOTIFICATION_VERSION=0.8
 DBUS_VERSION=0.60
-SQLITE_VERSION=3.10.1
+SQLITE_VERSION=3.10.2
 
 MSMANIFEST_TOOL=
 
 dnl Set various checks
 dnl ========================================================
 MISSING_X=
 AC_PROG_AWK
 
@@ -3741,17 +3741,17 @@ MOZ_SAMPLE_TYPE_FLOAT32=
 MOZ_SAMPLE_TYPE_S16=
 MOZ_DIRECTSHOW=
 MOZ_WMF=
 if test -n "$MOZ_FMP4"; then
   MOZ_FMP4=1
 else
   MOZ_FMP4=
 fi
-MOZ_FFMPEG=1
+MOZ_FFMPEG=
 MOZ_WEBRTC=1
 MOZ_PEERCONNECTION=
 MOZ_SRTP=
 MOZ_WEBRTC_SIGNALING=
 MOZ_WEBRTC_ASSERT_ALWAYS=1
 MOZ_WEBRTC_HARDWARE_AEC_NS=
 MOZ_SCTP=
 MOZ_ANDROID_OMX=
@@ -5221,16 +5221,24 @@ MOZ_ARG_DISABLE_BOOL(wmf,
 
 if test -n "$MOZ_WMF"; then
     AC_DEFINE(MOZ_WMF)
 fi;
 
 dnl ========================================================
 dnl FFmpeg H264/AAC Decoding Support
 dnl ========================================================
+case "$OS_TARGET" in
+WINNT|Android)
+    ;;
+*)
+    MOZ_FFMPEG=1
+    ;;
+esac
+
 MOZ_ARG_DISABLE_BOOL(ffmpeg,
 [  --disable-ffmpeg         Disable FFmpeg for fragmented H264/AAC decoding],
     MOZ_FFMPEG=,
     MOZ_FFMPEG=1
 )
 
 if test -n "$MOZ_FFMPEG"; then
     AC_DEFINE(MOZ_FFMPEG)
--- a/db/sqlite3/src/sqlite3.c
+++ b/db/sqlite3/src/sqlite3.c
@@ -1,11 +1,11 @@
 /******************************************************************************
 ** This file is an amalgamation of many separate C source files from SQLite
-** version 3.10.1.  By combining all the individual C code files into this 
+** version 3.10.2.  By combining all the individual C code files into this 
 ** single large file, the entire code can be compiled as a single translation
 ** unit.  This allows many compilers to do optimizations that would not be
 ** possible if the files were compiled separately.  Performance improvements
 ** of 5% or more are commonly seen when SQLite is compiled as a single
 ** translation unit.
 **
 ** This file is all you need to compile SQLite.  To use SQLite in other
 ** programs, you need this file and the "sqlite3.h" header file that defines
@@ -320,19 +320,19 @@ extern "C" {
 ** within its configuration management system.  ^The SQLITE_SOURCE_ID
 ** string contains the date and time of the check-in (UTC) and an SHA1
 ** hash of the entire source tree.
 **
 ** See also: [sqlite3_libversion()],
 ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
 ** [sqlite_version()] and [sqlite_source_id()].
 */
-#define SQLITE_VERSION        "3.10.1"
-#define SQLITE_VERSION_NUMBER 3010001
-#define SQLITE_SOURCE_ID      "2016-01-13 21:41:56 254419c36766225ca542ae873ed38255e3fb8588"
+#define SQLITE_VERSION        "3.10.2"
+#define SQLITE_VERSION_NUMBER 3010002
+#define SQLITE_SOURCE_ID      "2016-01-20 15:27:19 17efb4209f97fb4971656086b138599a91a75ff9"
 
 /*
 ** CAPI3REF: Run-Time Library Version Numbers
 ** KEYWORDS: sqlite3_version, sqlite3_sourceid
 **
 ** These interfaces provide the same information as the [SQLITE_VERSION],
 ** [SQLITE_VERSION_NUMBER], and [SQLITE_SOURCE_ID] C preprocessor macros
 ** but are associated with the library instead of the header file.  ^(Cautious
@@ -49040,17 +49040,17 @@ SQLITE_PRIVATE int sqlite3PagerBegin(Pag
       /* If the pager is configured to use locking_mode=exclusive, and an
       ** exclusive lock on the database is not already held, obtain it now.
       */
       if( pPager->exclusiveMode && sqlite3WalExclusiveMode(pPager->pWal, -1) ){
         rc = pagerLockDb(pPager, EXCLUSIVE_LOCK);
         if( rc!=SQLITE_OK ){
           return rc;
         }
-        sqlite3WalExclusiveMode(pPager->pWal, 1);
+        (void)sqlite3WalExclusiveMode(pPager->pWal, 1);
       }
 
       /* Grab the write lock on the log file. If successful, upgrade to
       ** PAGER_RESERVED state. Otherwise, return an error code to the caller.
       ** The busy-handler is not invoked if another connection already
       ** holds the write-lock. If possible, the upper layer will call it.
       */
       rc = sqlite3WalBeginWriteTransaction(pPager->pWal);
@@ -50110,17 +50110,21 @@ SQLITE_PRIVATE sqlite3_file *sqlite3Page
   return pPager->fd;
 }
 
 /*
 ** Return the file handle for the journal file (if it exists).
 ** This will be either the rollback journal or the WAL file.
 */
 SQLITE_PRIVATE sqlite3_file *sqlite3PagerJrnlFile(Pager *pPager){
+#if SQLITE_OMIT_WAL
+  return pPager->jfd;
+#else
   return pPager->pWal ? sqlite3WalFile(pPager->pWal) : pPager->jfd;
+#endif
 }
 
 /*
 ** Return the full pathname of the journal file.
 */
 SQLITE_PRIVATE const char *sqlite3PagerJournalname(Pager *pPager){
   return pPager->zJournal;
 }
@@ -100274,17 +100278,17 @@ static int patternCompare(
         if( c2==0 || (seen ^ invert)==0 ){
           return 0;
         }
         continue;
       }
     }
     c2 = Utf8Read(zString);
     if( c==c2 ) continue;
-    if( noCase && sqlite3Tolower(c)==sqlite3Tolower(c2) ){
+    if( noCase && c<0x80 && c2<0x80 && sqlite3Tolower(c)==sqlite3Tolower(c2) ){
       continue;
     }
     if( c==matchOne && zPattern!=zEscaped && c2!=0 ) continue;
     return 0;
   }
   return *zString==0;
 }
 
@@ -135021,17 +135025,16 @@ static int openDatabase(
 
   /* Enable the lookaside-malloc subsystem */
   setupLookaside(db, 0, sqlite3GlobalConfig.szLookaside,
                         sqlite3GlobalConfig.nLookaside);
 
   sqlite3_wal_autocheckpoint(db, SQLITE_DEFAULT_WAL_AUTOCHECKPOINT);
 
 opendb_out:
-  sqlite3_free(zOpen);
   if( db ){
     assert( db->mutex!=0 || isThreadsafe==0
            || sqlite3GlobalConfig.bFullMutex==0 );
     sqlite3_mutex_leave(db->mutex);
   }
   rc = sqlite3_errcode(db);
   assert( db!=0 || rc==SQLITE_NOMEM );
   if( rc==SQLITE_NOMEM ){
@@ -135058,16 +135061,17 @@ opendb_out:
       for(i=0, iByte=0; i<sizeof(zKey)*2 && sqlite3Isxdigit(zHexKey[i]); i++){
         iByte = (iByte<<4) + sqlite3HexToInt(zHexKey[i]);
         if( (i&1)!=0 ) zKey[i/2] = iByte;
       }
       sqlite3_key_v2(db, 0, zKey, i/2);
     }
   }
 #endif
+  sqlite3_free(zOpen);
   return rc & 0xff;
 }
 
 /*
 ** Open a new database handle.
 */
 SQLITE_API int SQLITE_STDCALL sqlite3_open(
   const char *zFilename, 
@@ -182275,17 +182279,17 @@ static void fts5Fts5Func(
 ** Implementation of fts5_source_id() function.
 */
 static void fts5SourceIdFunc(
   sqlite3_context *pCtx,          /* Function call context */
   int nArg,                       /* Number of args */
   sqlite3_value **apVal           /* Function arguments */
 ){
   assert( nArg==0 );
-  sqlite3_result_text(pCtx, "fts5: 2016-01-13 21:41:56 254419c36766225ca542ae873ed38255e3fb8588", -1, SQLITE_TRANSIENT);
+  sqlite3_result_text(pCtx, "fts5: 2016-01-20 15:27:19 17efb4209f97fb4971656086b138599a91a75ff9", -1, SQLITE_TRANSIENT);
 }
 
 static int fts5Init(sqlite3 *db){
   static const sqlite3_module fts5Mod = {
     /* iVersion      */ 2,
     /* xCreate       */ fts5CreateMethod,
     /* xConnect      */ fts5ConnectMethod,
     /* xBestIndex    */ fts5BestIndexMethod,
--- a/db/sqlite3/src/sqlite3.h
+++ b/db/sqlite3/src/sqlite3.h
@@ -106,19 +106,19 @@ extern "C" {
 ** within its configuration management system.  ^The SQLITE_SOURCE_ID
 ** string contains the date and time of the check-in (UTC) and an SHA1
 ** hash of the entire source tree.
 **
 ** See also: [sqlite3_libversion()],
 ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
 ** [sqlite_version()] and [sqlite_source_id()].
 */
-#define SQLITE_VERSION        "3.10.1"
-#define SQLITE_VERSION_NUMBER 3010001
-#define SQLITE_SOURCE_ID      "2016-01-13 21:41:56 254419c36766225ca542ae873ed38255e3fb8588"
+#define SQLITE_VERSION        "3.10.2"
+#define SQLITE_VERSION_NUMBER 3010002
+#define SQLITE_SOURCE_ID      "2016-01-20 15:27:19 17efb4209f97fb4971656086b138599a91a75ff9"
 
 /*
 ** CAPI3REF: Run-Time Library Version Numbers
 ** KEYWORDS: sqlite3_version, sqlite3_sourceid
 **
 ** These interfaces provide the same information as the [SQLITE_VERSION],
 ** [SQLITE_VERSION_NUMBER], and [SQLITE_SOURCE_ID] C preprocessor macros
 ** but are associated with the library instead of the header file.  ^(Cautious
--- a/docshell/base/nsIContentViewer.idl
+++ b/docshell/base/nsIContentViewer.idl
@@ -26,17 +26,17 @@ class nsDOMNavigationTiming;
 [ptr] native nsIWidgetPtr(nsIWidget);
 [ref] native nsIntRectRef(nsIntRect);
 [ptr] native nsIPresShellPtr(nsIPresShell);
 [ptr] native nsPresContextPtr(nsPresContext);
 [ptr] native nsViewPtr(nsView);
 [ptr] native nsDOMNavigationTimingPtr(nsDOMNavigationTiming);
 [ref] native nsIContentViewerTArray(nsTArray<nsCOMPtr<nsIContentViewer> >);
 
-[scriptable, builtinclass, uuid(91b6c1f3-fc5f-43a9-88f4-9286bd19387f)]
+[scriptable, builtinclass, uuid(2da17016-7851-4a45-a7a8-00b360e01595)]
 interface nsIContentViewer : nsISupports
 {
   [noscript] void init(in nsIWidgetPtr aParentWidget,
                        [const] in nsIntRectRef aBounds);
 
   attribute nsIDocShell container;
 
   [noscript,notxpcom,nostdcall] void loadStart(in nsIDocument aDoc);
@@ -224,16 +224,28 @@ interface nsIContentViewer : nsISupports
   attribute long minFontSize;
 
   /**
    * Append |this| and all of its descendants to the given array,
    * in depth-first pre-order traversal.
    */
   [noscript] void appendSubtree(in nsIContentViewerTArray array);
 
+  /**
+   * Instruct the refresh driver to discontinue painting until further
+   * notice.
+   */
+  void pausePainting();
+
+  /**
+   * Instruct the refresh driver to resume painting after a previous call to
+   * pausePainting().
+   */
+  void resumePainting();
+
   /*
    * Render the document as if being viewed on a device with the specified
    * media type. This will cause a reflow.
    *
    * @param mediaType The media type to be emulated
    */
   void emulateMedium(in AString aMediaType);
 
--- a/docshell/test/browser/browser.ini
+++ b/docshell/test/browser/browser.ini
@@ -22,16 +22,17 @@ support-files =
   file_bug234628-7-child.html
   file_bug234628-7-child.html^headers^
   file_bug234628-7.html
   file_bug234628-8-child.html
   file_bug234628-8.html
   file_bug234628-9-child.html
   file_bug234628-9.html
   file_bug420605.html
+  file_bug422543_script.js
   file_bug503832.html
   file_bug655270.html
   file_bug670318.html
   file_bug852909.pdf
   file_bug852909.png
   file_bug1046022.html
   file_bug1206879.html
   file_multiple_pushState.html
@@ -54,32 +55,28 @@ support-files =
 [browser_bug234628-3.js]
 [browser_bug234628-4.js]
 [browser_bug234628-5.js]
 [browser_bug234628-6.js]
 [browser_bug234628-7.js]
 [browser_bug234628-8.js]
 [browser_bug234628-9.js]
 [browser_bug349769.js]
-skip-if = e10s # Bug ?????? - test touches content (newBrowser.contentDocument.nodePrincipal)
 [browser_bug388121-1.js]
-skip-if = e10s # Bug ?????? - test touches content (newBrowser.contentDocument.nodePrincipal)
 [browser_bug388121-2.js]
 [browser_bug420605.js]
 [browser_bug422543.js]
-skip-if = e10s # Bug 1220927 - Test tries to do addSHistoryListener on content.
 [browser_bug441169.js]
 skip-if = buildapp == 'mulet'
 [browser_bug503832.js]
 skip-if = buildapp == 'mulet'
 [browser_bug554155.js]
 [browser_bug655270.js]
 [browser_bug655273.js]
 [browser_bug670318.js]
-skip-if = e10s # Bug 1220927 - Test tries to do addSHistoryListener on content.
 [browser_bug673467.js]
 [browser_bug852909.js]
 [browser_bug92473.js]
 [browser_uriFixupIntegration.js]
 [browser_loadDisallowInherit.js]
 [browser_loadURI.js]
 [browser_multiple_pushState.js]
 [browser_onbeforeunload_navigation.js]
--- a/docshell/test/browser/browser_bug349769.js
+++ b/docshell/test/browser/browser_bug349769.js
@@ -1,44 +1,47 @@
-function test() {
-  waitForExplicitFinish(); 
-
-  var newTab;
-  var newBrowser;
+add_task(function* test() {
   const secMan = Cc["@mozilla.org/scriptsecuritymanager;1"].getService(Ci.nsIScriptSecurityManager);
-  var iteration = 1;
   const uris = [undefined, "about:blank"];
-  var uri;
 
-  function testLoad(event) {
-    newBrowser.removeEventListener("load", testLoad, true);
-    is (event.target, newBrowser.contentDocument, "Unexpected target");
-    var prin = newBrowser.contentDocument.nodePrincipal;
-    isnot(prin, null, "Loaded principal must not be null when adding " + uri);
-    isnot(prin, undefined, "Loaded principal must not be undefined when loading " + uri);
-    is(secMan.isSystemPrincipal(prin), false,
-       "Loaded principal must not be system when loading " + uri);
-    gBrowser.removeTab(newTab);
+  function checkContentProcess(uri) {
+    yield ContentTask.spawn(newBrowser, uri, function* (uri) {
+      var prin = content.document.nodePrincipal;
+      isnot(prin, null, "Loaded principal must not be null when adding " + uri);
+      isnot(prin, undefined, "Loaded principal must not be undefined when loading " + uri);
 
-    if (iteration == uris.length) {
-      finish();
-    } else {
-      ++iteration;
-      doTest();
-    }
+      const secMan = Cc["@mozilla.org/scriptsecuritymanager;1"]
+                       .getService(Ci.nsIScriptSecurityManager);
+      is(secMan.isSystemPrincipal(prin), false,
+         "Loaded principal must not be system when loading " + uri);
+    });
   }
 
-  function doTest() {
-    uri = uris[iteration - 1];
-    newTab = gBrowser.addTab(uri);
-    newBrowser = gBrowser.getBrowserForTab(newTab);
-    newBrowser.addEventListener("load", testLoad, true);
-    var prin = newBrowser.contentDocument.nodePrincipal;
-    isnot(prin, null, "Forced principal must not be null when loading " + uri);
-    isnot(prin, undefined,
-          "Forced principal must not be undefined when loading " + uri);
-    is(secMan.isSystemPrincipal(prin), false,
-       "Forced principal must not be system when loading " + uri);
-   }
+  for (var uri of uris) {
+    yield BrowserTestUtils.withNewTab({ gBrowser }, function* (newBrowser) {
+      yield BrowserTestUtils.loadURI(newBrowser, uri);
+
+      var prin = newBrowser.contentPrincipal;
+      isnot(prin, null, "Forced principal must not be null when loading " + uri);
+      isnot(prin, undefined,
+            "Forced principal must not be undefined when loading " + uri);
+      is(secMan.isSystemPrincipal(prin), false,
+         "Forced principal must not be system when loading " + uri);
+
+      // Belt-and-suspenders e10s check: make sure that the same checks hold
+      // true in the content process.
+      checkContentProcess(uri);
 
-   doTest();
-}
+      yield BrowserTestUtils.browserLoaded(newBrowser);
+
+      prin = newBrowser.contentPrincipal;
+      isnot(prin, null, "Loaded principal must not be null when adding " + uri);
+      isnot(prin, undefined, "Loaded principal must not be undefined when loading " + uri);
+      is(secMan.isSystemPrincipal(prin), false,
+         "Loaded principal must not be system when loading " + uri);
 
+      // Belt-and-suspenders e10s check: make sure that the same checks hold
+      // true in the content process.
+      checkContentProcess(uri);
+    });
+  }
+});
+
--- a/docshell/test/browser/browser_bug388121-1.js
+++ b/docshell/test/browser/browser_bug388121-1.js
@@ -1,26 +1,15 @@
-function test() {
-  waitForExplicitFinish(); 
-
-  var newTab;
-  var newBrowser;
-  const secMan = Cc["@mozilla.org/scriptsecuritymanager;1"].getService(Ci.nsIScriptSecurityManager);
+add_task(function* test() {
+  yield BrowserTestUtils.withNewTab({ gBrowser, url: "about:blank" }, function* (newBrowser) {
+    yield ContentTask.spawn(newBrowser, null, function* () {
+      var prin = content.document.nodePrincipal;
+      isnot(prin, null, "Loaded principal must not be null");
+      isnot(prin, undefined, "Loaded principal must not be undefined");
 
-  function testLoad(event) {
-    newBrowser.removeEventListener("load", testLoad, true);
-    is (event.target, newBrowser.contentDocument, "Unexpected target");
-    var prin = newBrowser.contentDocument.nodePrincipal;
-    isnot(prin, null, "Loaded principal must not be null");
-    isnot(prin, undefined, "Loaded principal must not be undefined");
-    is(secMan.isSystemPrincipal(prin), false,
-       "Loaded principal must not be system");
-    gBrowser.removeTab(newTab);
+      const secMan = Cc["@mozilla.org/scriptsecuritymanager;1"]
+                       .getService(Ci.nsIScriptSecurityManager);
+      is(secMan.isSystemPrincipal(prin), false,
+         "Loaded principal must not be system");
+    });
+  });
+});
 
-    finish();
-  }
-
-  newTab = gBrowser.addTab();
-  newBrowser = gBrowser.getBrowserForTab(newTab);
-  newBrowser.contentWindow.location.href = "about:blank"
-  newBrowser.addEventListener("load", testLoad, true);
-}
-
--- a/docshell/test/browser/browser_bug422543.js
+++ b/docshell/test/browser/browser_bug422543.js
@@ -1,174 +1,116 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
-Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-
-function SHistoryListener() {
-}
-
-SHistoryListener.prototype = {
-  retval: true,
-  last: "initial",
-
-  OnHistoryNewEntry: function (aNewURI) {
-    this.last = "newentry";
-  },
-
-  OnHistoryGoBack: function (aBackURI) {
-    this.last = "goback";
-    return this.retval;
-  },
-
-  OnHistoryGoForward: function (aForwardURI) {
-    this.last = "goforward";
-    return this.retval;
-  },
-
-  OnHistoryGotoIndex: function (aIndex, aGotoURI) {
-    this.last = "gotoindex";
-    return this.retval;
-  },
-
-  OnHistoryPurge: function (aNumEntries) {
-    this.last = "purge";
-    return this.retval;
-  },
-
-  OnHistoryReload: function (aReloadURI, aReloadFlags) {
-    this.last = "reload";
-    return this.retval;
-  },
-
-  OnHistoryReplaceEntry: function (aIndex) {},
-
-  QueryInterface: XPCOMUtils.generateQI([Ci.nsISHistoryListener,
-                                         Ci.nsISupportsWeakReference])
-};
-
-var gFirstListener = new SHistoryListener();
-var gSecondListener = new SHistoryListener();
-
-function test() {
-  TestRunner.run();
-}
-
-function runTests() {
+add_task(function* runTests() {
   yield setup();
   let browser = gBrowser.selectedBrowser;
-  checkListeners("initial", "listeners initialized");
+  // Now that we're set up, initialize our frame script.
+  yield checkListeners("initial", "listeners initialized");
 
   // Check if all history listeners are always notified.
   info("# part 1");
-  browser.loadURI("http://www.example.com/");
-  yield whenPageShown(browser);
-  checkListeners("newentry", "shistory has a new entry");
+  yield whenPageShown(browser, () => browser.loadURI("http://www.example.com/"));
+  yield checkListeners("newentry", "shistory has a new entry");
   ok(browser.canGoBack, "we can go back");
 
-  browser.goBack();
-  yield whenPageShown(browser);
-  checkListeners("goback", "back to the first shentry");
+  yield whenPageShown(browser, () => browser.goBack());
+  yield checkListeners("goback", "back to the first shentry");
   ok(browser.canGoForward, "we can go forward");
 
-  browser.goForward();
-  yield whenPageShown(browser);
-  checkListeners("goforward", "forward to the second shentry");
+  yield whenPageShown(browser, () => browser.goForward());
+  yield checkListeners("goforward", "forward to the second shentry");
 
-  browser.reload();
-  yield whenPageShown(browser);
-  checkListeners("reload", "current shentry reloaded");
+  yield whenPageShown(browser, () => browser.reload());
+  yield checkListeners("reload", "current shentry reloaded");
 
-  browser.gotoIndex(0);
-  yield whenPageShown(browser);
-  checkListeners("gotoindex", "back to the first index");
+  yield whenPageShown(browser, () => browser.gotoIndex(0));
+  yield checkListeners("gotoindex", "back to the first index");
 
   // Check nsISHistoryInternal.notifyOnHistoryReload
   info("# part 2");
-  ok(notifyReload(), "reloading has not been canceled");
-  checkListeners("reload", "saw the reload notification");
+  ok((yield notifyReload()), "reloading has not been canceled");
+  yield checkListeners("reload", "saw the reload notification");
 
   // Let the first listener cancel the reload action.
   info("# part 3");
-  resetListeners();
-  gFirstListener.retval = false;
-  ok(!notifyReload(), "reloading has been canceled");
-  checkListeners("reload", "saw the reload notification");
+  yield resetListeners();
+  yield setListenerRetval(0, false);
+  ok(!(yield notifyReload()), "reloading has been canceled");
+  yield checkListeners("reload", "saw the reload notification");
 
   // Let both listeners cancel the reload action.
   info("# part 4");
-  resetListeners();
-  gSecondListener.retval = false;
-  ok(!notifyReload(), "reloading has been canceled");
-  checkListeners("reload", "saw the reload notification");
+  yield resetListeners();
+  yield setListenerRetval(1, false);
+  ok(!(yield notifyReload()), "reloading has been canceled");
+  yield checkListeners("reload", "saw the reload notification");
 
   // Let the second listener cancel the reload action.
   info("# part 5");
-  resetListeners();
-  gFirstListener.retval = true;
-  ok(!notifyReload(), "reloading has been canceled");
-  checkListeners("reload", "saw the reload notification");
+  yield resetListeners();
+  yield setListenerRetval(0, true);
+  ok(!(yield notifyReload()), "reloading has been canceled");
+  yield checkListeners("reload", "saw the reload notification");
+});
+
+function listenOnce(message, arg = {}) {
+  return new Promise(resolve => {
+    let mm = gBrowser.selectedBrowser.messageManager;
+    mm.addMessageListener(message + ":return", function listener(msg) {
+      mm.removeMessageListener(message + ":return", listener);
+      resolve(msg.data);
+    });
+
+    mm.sendAsyncMessage(message, arg);
+  });
 }
 
 function checkListeners(aLast, aMessage) {
-  is(gFirstListener.last, aLast, aMessage);
-  is(gSecondListener.last, aLast, aMessage);
+  return listenOnce("bug422543:getListenerStatus").then((listenerStatuses) => {
+    is(listenerStatuses[0], aLast, aMessage);
+    is(listenerStatuses[1], aLast, aMessage);
+  });
 }
 
 function resetListeners() {
-  gFirstListener.last = gSecondListener.last = "initial";
+  return listenOnce("bug422543:resetListeners");
 }
 
 function notifyReload() {
-  let browser = gBrowser.selectedBrowser;
-  let shistory = browser.docShell.sessionHistory;
-  shistory.QueryInterface(Ci.nsISHistoryInternal);
-  return shistory.notifyOnHistoryReload(browser.currentURI, 0);
-}
-
-function setup(aCallback) {
-  let tab = gBrowser.selectedTab = gBrowser.addTab("about:mozilla");
-  let browser = tab.linkedBrowser;
-  registerCleanupFunction(function () { gBrowser.removeTab(tab); });
-
-  whenPageShown(browser, function () {
-    gFirstListener = new SHistoryListener();
-    gSecondListener = new SHistoryListener();
-
-    let shistory = browser.docShell.sessionHistory;
-    shistory.addSHistoryListener(gFirstListener);
-    shistory.addSHistoryListener(gSecondListener);
-
-    registerCleanupFunction(function () {
-      shistory.removeSHistoryListener(gFirstListener);
-      shistory.removeSHistoryListener(gSecondListener);
-    });
-
-    (aCallback || TestRunner.next)();
+  return listenOnce("bug422543:notifyReload").then(({ rval }) => {
+    return rval;
   });
 }
 
-function whenPageShown(aBrowser, aCallback) {
-  aBrowser.addEventListener("pageshow", function onLoad() {
-    aBrowser.removeEventListener("pageshow", onLoad, true);
-    executeSoon(aCallback || TestRunner.next);
-  }, true);
+function setListenerRetval(num, val) {
+  return listenOnce("bug422543:setRetval", { num, val });
 }
 
-var TestRunner = {
-  run: function () {
-    waitForExplicitFinish();
-    this._iter = runTests();
-    this.next();
-  },
+function setup() {
+  return BrowserTestUtils.openNewForegroundTab(gBrowser,
+                                               "http://mochi.test:8888")
+                         .then(function (tab) {
+    let browser = tab.linkedBrowser;
+    registerCleanupFunction(function* () {
+      yield listenOnce("bug422543:cleanup");
+      gBrowser.removeTab(tab);
+    });
 
-  next: function () {
-    try {
-      TestRunner._iter.next();
-    } catch (e if e instanceof StopIteration) {
-      TestRunner.finish();
-    }
-  },
+    browser.messageManager
+           .loadFrameScript(getRootDirectory(gTestPath) + "file_bug422543_script.js", false);
+  });
+}
 
-  finish: function () {
-    finish();
-  }
-};
+function whenPageShown(aBrowser, aNavigation) {
+  let listener = ContentTask.spawn(aBrowser, null, function () {
+    return new Promise(resolve => {
+      addEventListener("pageshow", function onLoad() {
+        removeEventListener("pageshow", onLoad, true);
+        resolve();
+      }, true);
+    });
+  });
+
+  aNavigation();
+  return listener;
+}
--- a/docshell/test/browser/browser_bug670318.js
+++ b/docshell/test/browser/browser_bug670318.js
@@ -5,56 +5,58 @@
  * Test for Bug 670318
  *
  * When LoadEntry() is called on a browser that has multiple duplicate history
  * entries, history.index can end up out of range (>= history.count).
  */
 
 const URL = "http://mochi.test:8888/browser/docshell/test/browser/file_bug670318.html";
 
-function test() {
-  waitForExplicitFinish();
-
-  let count = 0, historyListenerRemoved = false;
+add_task(function* test() {
+  yield BrowserTestUtils.withNewTab({ gBrowser, url: "about:blank" },
+                                    function* (browser) {
+    yield ContentTask.spawn(browser, URL, function* (URL) {
+      let history = docShell.sessionHistory;
+      let count = 0;
 
-  let listener = {
-    OnHistoryNewEntry: function (aNewURI) {
-      if (aNewURI.spec == URL && 5 == ++count) {
-        browser.addEventListener("load", function onLoad() {
-          browser.removeEventListener("load", onLoad, true);
+      let testDone = {};
+      testDone.promise = new Promise(resolve => { testDone.resolve = resolve; });
 
-          ok(history.index < history.count, "history.index is valid");
-          finish();
-        }, true);
+      let listener = {
+        OnHistoryNewEntry: function (aNewURI) {
+          if (aNewURI.spec == URL && 5 == ++count) {
+            addEventListener("load", function onLoad() {
+              removeEventListener("load", onLoad, true);
 
-        history.removeSHistoryListener(listener);
-        historyListenerRemoved = true;
+              ok(history.index < history.count, "history.index is valid");
+              testDone.resolve();
+            }, true);
 
-        executeSoon(function () { BrowserReload(); });
-      }
-
-      return true;
-    },
+            history.removeSHistoryListener(listener);
+            content.setTimeout(() => { content.location.reload(); }, 0);
+          }
 
-    OnHistoryReload: () => true,
-    OnHistoryGoBack: () => true,
-    OnHistoryGoForward: () => true,
-    OnHistoryGotoIndex: () => true,
-    OnHistoryPurge: () => true,
-    OnHistoryReplaceEntry: () => true,
-
-    QueryInterface: XPCOMUtils.generateQI([Ci.nsISHistoryListener,
-                                           Ci.nsISupportsWeakReference])
-  };
+          return true;
+        },
 
-  let tab = gBrowser.loadOneTab(URL, {inBackground: false});
-  let browser = tab.linkedBrowser;
-  let history = browser.sessionHistory;
-
-  history.addSHistoryListener(listener);
+        OnHistoryReload: () => true,
+        OnHistoryGoBack: () => true,
+        OnHistoryGoForward: () => true,
+        OnHistoryGotoIndex: () => true,
+        OnHistoryPurge: () => true,
+        OnHistoryReplaceEntry: () => {
+          // The initial load of about:blank causes a transient entry to be
+          // created, so our first navigation to a real page is a replace
+          // instead of a new entry.
+          ++count;
+          return true;
+        },
 
-  registerCleanupFunction(function () {
-    gBrowser.removeTab(tab);
+        QueryInterface: XPCOMUtils.generateQI([Ci.nsISHistoryListener,
+                                               Ci.nsISupportsWeakReference])
+      };
 
-    if (!historyListenerRemoved)
-      history.removeSHistoryListener(listener);
+      history.addSHistoryListener(listener);
+      content.location = URL;
+      yield testDone.promise;
+    });
   });
-}
+});
new file mode 100644
--- /dev/null
+++ b/docshell/test/browser/file_bug422543_script.js
@@ -0,0 +1,98 @@
+const { utils: Cu, interfaces: Ci } = Components;
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+function SHistoryListener() {
+}
+
+SHistoryListener.prototype = {
+  retval: true,
+  last: "initial",
+
+  OnHistoryNewEntry: function (aNewURI) {
+    this.last = "newentry";
+  },
+
+  OnHistoryGoBack: function (aBackURI) {
+    this.last = "goback";
+    return this.retval;
+  },
+
+  OnHistoryGoForward: function (aForwardURI) {
+    this.last = "goforward";
+    return this.retval;
+  },
+
+  OnHistoryGotoIndex: function (aIndex, aGotoURI) {
+    this.last = "gotoindex";
+    return this.retval;
+  },
+
+  OnHistoryPurge: function (aNumEntries) {
+    this.last = "purge";
+    return this.retval;
+  },
+
+  OnHistoryReload: function (aReloadURI, aReloadFlags) {
+    this.last = "reload";
+    return this.retval;
+  },
+
+  OnHistoryReplaceEntry: function (aIndex) {},
+
+  QueryInterface: XPCOMUtils.generateQI([Ci.nsISHistoryListener,
+                                         Ci.nsISupportsWeakReference])
+};
+
+let testAPI = {
+  shistory: null,
+  listeners: [ new SHistoryListener(),
+               new SHistoryListener() ],
+
+  init() {
+    this.shistory = docShell.QueryInterface(Ci.nsIWebNavigation).sessionHistory;
+    for (let listener of this.listeners) {
+      this.shistory.addSHistoryListener(listener);
+    }
+  },
+
+  cleanup() {
+    for (let listener of this.listeners) {
+      this.shistory.removeSHistoryListener(listener);
+    }
+    this.shistory = null;
+    sendAsyncMessage("bug422543:cleanup:return", {});
+  },
+
+  getListenerStatus() {
+    sendAsyncMessage("bug422543:getListenerStatus:return",
+                     this.listeners.map(l => l.last));
+  },
+
+  resetListeners() {
+    for (let listener of this.listeners) {
+      listener.last = "initial";
+    }
+
+    sendAsyncMessage("bug422543:resetListeners:return", {});
+  },
+
+  notifyReload() {
+    let internal = this.shistory.QueryInterface(Ci.nsISHistoryInternal);
+    let rval =
+      internal.notifyOnHistoryReload(content.document.documentURIObject, 0);
+    sendAsyncMessage("bug422543:notifyReload:return", { rval });
+  },
+
+  setRetval({ num, val }) {
+    this.listeners[num].retval = val;
+    sendAsyncMessage("bug422543:setRetval:return", {});
+  },
+};
+
+addMessageListener("bug422543:cleanup", () => { testAPI.cleanup(); });
+addMessageListener("bug422543:getListenerStatus", () => { testAPI.getListenerStatus(); });
+addMessageListener("bug422543:notifyReload", () => { testAPI.notifyReload(); });
+addMessageListener("bug422543:resetListeners", () => { testAPI.resetListeners(); });
+addMessageListener("bug422543:setRetval", (msg) => { testAPI.setRetval(msg.data); });
+
+testAPI.init();
--- a/docshell/test/browser/file_bug670318.html
+++ b/docshell/test/browser/file_bug670318.html
@@ -1,15 +1,15 @@
 <html><head>
 <meta http-equiv="content-type" content="text/html; charset=UTF-8">
 <script>
 function load() {
   function next() {
     if (count < 5)
-      iframe.src = 'data:text/html,iframe ' + (++count);
+      iframe.src = 'data:text/html;charset=utf-8,iframe ' + (++count);
   }
 
   var count = 0;
   var iframe = document.createElement('iframe');
   iframe.onload = function () { setTimeout(next, 0) };
   document.body.appendChild(iframe);
 
   setTimeout(next, 0);
--- a/docshell/test/navigation/browser.ini
+++ b/docshell/test/navigation/browser.ini
@@ -3,10 +3,9 @@ support-files =
   bug343515_pg1.html
   bug343515_pg2.html
   bug343515_pg3.html
   bug343515_pg3_1.html
   bug343515_pg3_1_1.html
   bug343515_pg3_2.html
 
 [browser_bug343515.js]
-skip-if = e10s # Bug ?????? - test directly touches content (tries to QI the content window)
 [browser_test-content-chromeflags.js]
--- a/docshell/test/navigation/browser_bug343515.js
+++ b/docshell/test/navigation/browser_bug343515.js
@@ -1,22 +1,14 @@
 // Test for bug 343515 - Need API for tabbrowsers to tell docshells they're visible/hidden
 
 // Globals
 var testPath = "http://mochi.test:8888/browser/docshell/test/navigation/";
 var ctx = {};
 
-// Helper function to check if a window is active
-function isActive(aWindow) {
-  var docshell = aWindow.QueryInterface(Ci.nsIInterfaceRequestor)
-                        .getInterface(Ci.nsIWebNavigation)
-                        .QueryInterface(Ci.nsIDocShell);
-  return docshell.isActive;
-}
-
 // We need to wait until the page from each testcase is fully loaded,
 // including all of its descendant iframes. To do that we manually count
 // how many load events should happen on that page (one for the toplevel doc
 // and one for each subframe) and wait until we receive the expected number
 // of events.
 function nShotsListener(aElem, aType, aCallback, aCount) {
   let count = aCount;
   aElem.addEventListener(aType, function listenerCallback() {
@@ -29,182 +21,239 @@ function nShotsListener(aElem, aType, aC
     }
   }, true);
 }
 
 function oneShotListener(aElem, aType, aCallback) {
   nShotsListener(aElem, aType, aCallback, 1);
 }
 
+function waitForPageshow(aBrowser, callback) {
+  return ContentTask.spawn(aBrowser, null, function* () {
+    yield ContentTaskUtils.waitForEvent(this, "pageshow");
+  }).then(callback);
+}
+
 // Entry point from Mochikit
 function test() {
 
   // Lots of callbacks going on here
   waitForExplicitFinish();
 
   // Begin the test
   step1();
 }
 
 function step1() {
 
   // Get a handle on the initial tab
   ctx.tab0 = gBrowser.selectedTab;
   ctx.tab0Browser = gBrowser.getBrowserForTab(ctx.tab0);
-  ctx.tab0Window = ctx.tab0Browser.contentWindow;
 
   // Our current tab should be active
-  ok(isActive(ctx.tab0Window), "Tab 0 should be active at test start");
+  ok(ctx.tab0Browser.docShellIsActive, "Tab 0 should be active at test start");
 
   // Open a New Tab
   ctx.tab1 = gBrowser.addTab(testPath + "bug343515_pg1.html");
   ctx.tab1Browser = gBrowser.getBrowserForTab(ctx.tab1);
-  ctx.tab1Window = ctx.tab1Browser.contentWindow;
   oneShotListener(ctx.tab1Browser, "load", step2);
 }
 
 function step2() {
   is(testPath + "bug343515_pg1.html", ctx.tab1Browser.currentURI.spec,
      "Got expected tab 1 url in step 2");
 
   // Our current tab should still be active
-  ok(isActive(ctx.tab0Window), "Tab 0 should still be active");
-  ok(!isActive(ctx.tab1Window), "Tab 1 should not be active");
+  ok(ctx.tab0Browser.docShellIsActive, "Tab 0 should still be active");
+  ok(!ctx.tab1Browser.docShellIsActive, "Tab 1 should not be active");
 
   // Switch to tab 1
-  gBrowser.selectedTab = ctx.tab1;
-
-  // Tab 1 should now be active
-  ok(!isActive(ctx.tab0Window), "Tab 0 should be inactive");
-  ok(isActive(ctx.tab1Window), "Tab 1 should be active");
+  BrowserTestUtils.switchTab(gBrowser, ctx.tab1).then(() => {
+    // Tab 1 should now be active
+    ok(!ctx.tab0Browser.docShellIsActive, "Tab 0 should be inactive");
+    ok(ctx.tab1Browser.docShellIsActive, "Tab 1 should be active");
 
-  // Open another tab
-  ctx.tab2 = gBrowser.addTab(testPath + "bug343515_pg2.html");
-  ctx.tab2Browser = gBrowser.getBrowserForTab(ctx.tab2);
-  ctx.tab2Window = ctx.tab2Browser.contentWindow;
+    // Open another tab
+    ctx.tab2 = gBrowser.addTab(testPath + "bug343515_pg2.html");
+    ctx.tab2Browser = gBrowser.getBrowserForTab(ctx.tab2);
 
-  // bug343515_pg2.html consists of a page with two iframes,
-  // which will therefore generate 3 load events.
-  nShotsListener(ctx.tab2Browser, "load", step3, 3);
+    // bug343515_pg2.html consists of a page with two iframes,
+    // which will therefore generate 3 load events.
+    nShotsListener(ctx.tab2Browser, "load", step3, 3);
+  });
 }
 
 function step3() {
   is(testPath + "bug343515_pg2.html", ctx.tab2Browser.currentURI.spec,
      "Got expected tab 2 url in step 3");
 
   // Tab 0 should be inactive, Tab 1 should be active
-  ok(!isActive(ctx.tab0Window), "Tab 0 should be inactive");
-  ok(isActive(ctx.tab1Window), "Tab 1 should be active");
+  ok(!ctx.tab0Browser.docShellIsActive, "Tab 0 should be inactive");
+  ok(ctx.tab1Browser.docShellIsActive, "Tab 1 should be active");
 
   // Tab 2's window _and_ its iframes should be inactive
-  ok(!isActive(ctx.tab2Window), "Tab 2 should be inactive");
-  is(ctx.tab2Window.frames.length, 2, "Tab 2 should have 2 iframes");
-  for (var i = 0; i < ctx.tab2Window.frames.length; i++)
-    info("step 3, frame " + i + " info: " + ctx.tab2Window.frames[i].location);
-  ok(!isActive(ctx.tab2Window.frames[0]), "Tab2 iframe 0 should be inactive");
-  ok(!isActive(ctx.tab2Window.frames[1]), "Tab2 iframe 1 should be inactive");
+  ok(!ctx.tab2Browser.docShellIsActive, "Tab 2 should be inactive");
+  ContentTask.spawn(ctx.tab2Browser, null, function* () {
+    is(content.frames.length, 2, "Tab 2 should have 2 iframes");
+    for (var i = 0; i < content.frames.length; i++) {
+      info("step 3, frame " + i + " info: " + content.frames[i].location);
+      let docshell = content.frames[i].QueryInterface(Ci.nsIInterfaceRequestor)
+                                      .getInterface(Ci.nsIWebNavigation)
+                                      .QueryInterface(Ci.nsIDocShell);
 
-  // Navigate tab 2 to a different page
-  ctx.tab2Window.location = testPath + "bug343515_pg3.html";
+      ok(!docShell.isActive, `Tab2 iframe ${i} should be inactive`);
+    }
+  }).then(() => {
+    // Navigate tab 2 to a different page
+    ctx.tab2Browser.loadURI(testPath + "bug343515_pg3.html");
 
-  // bug343515_pg3.html consists of a page with two iframes, one of which
-  // contains another iframe, so there'll be a total of 4 load events
-  nShotsListener(ctx.tab2Browser, "load", step4, 4);
+    // bug343515_pg3.html consists of a page with two iframes, one of which
+    // contains another iframe, so there'll be a total of 4 load events
+    nShotsListener(ctx.tab2Browser, "load", step4, 4);
+  });
 }
 
 function step4() {
+  function checkTab2Active(expected) {
+    return ContentTask.spawn(ctx.tab2Browser, expected, function* (expected) {
+      function isActive(aWindow) {
+        var docshell = aWindow.QueryInterface(Ci.nsIInterfaceRequestor)
+                              .getInterface(Ci.nsIWebNavigation)
+                              .QueryInterface(Ci.nsIDocShell);
+        return docshell.isActive;
+      }
+
+      let active = expected ? "active" : "inactive";
+      is(content.frames.length, 2, "Tab 2 should have 2 iframes");
+      for (var i = 0; i < content.frames.length; i++)
+        info("step 4, frame " + i + " info: " + content.frames[i].location);
+      is(content.frames[0].frames.length, 1, "Tab 2 iframe 0 should have 1 iframes");
+      is(isActive(content.frames[0]), expected, `Tab2 iframe 0 should be ${active}`);
+      is(isActive(content.frames[0].frames[0]), expected,
+         `Tab2 iframe 0 subiframe 0 should be ${active}`);
+      is(isActive(content.frames[1]), expected, `Tab2 iframe 1 should be ${active}`);
+    });
+  }
+
   is(testPath + "bug343515_pg3.html", ctx.tab2Browser.currentURI.spec,
      "Got expected tab 2 url in step 4");
 
   // Tab 0 should be inactive, Tab 1 should be active
-  ok(!isActive(ctx.tab0Window), "Tab 0 should be inactive");
-  ok(isActive(ctx.tab1Window), "Tab 1 should be active");
+  ok(!ctx.tab0Browser.docShellIsActive, "Tab 0 should be inactive");
+  ok(ctx.tab1Browser.docShellIsActive, "Tab 1 should be active");
 
   // Tab2 and all descendants should be inactive
-  ok(!isActive(ctx.tab2Window), "Tab 2 should be inactive");
-  is(ctx.tab2Window.frames.length, 2, "Tab 2 should have 2 iframes");
-  for (var i = 0; i < ctx.tab2Window.frames.length; i++)
-    info("step 4, frame " + i + " info: " + ctx.tab2Window.frames[i].location);
-  is(ctx.tab2Window.frames[0].frames.length, 1, "Tab 2 iframe 0 should have 1 iframes");
-  ok(!isActive(ctx.tab2Window.frames[0]), "Tab2 iframe 0 should be inactive");
-  ok(!isActive(ctx.tab2Window.frames[0].frames[0]), "Tab2 iframe 0 subiframe 0 should be inactive");
-  ok(!isActive(ctx.tab2Window.frames[1]), "Tab2 iframe 1 should be inactive");
-
-  // Switch to Tab 2
-  gBrowser.selectedTab = ctx.tab2;
+  checkTab2Active(false).then(() => {
+    // Switch to Tab 2
+    return BrowserTestUtils.switchTab(gBrowser, ctx.tab2);
+  }).then(() => {
+    // Check everything
+    ok(!ctx.tab0Browser.docShellIsActive, "Tab 0 should be inactive");
+    ok(!ctx.tab1Browser.docShellIsActive, "Tab 1 should be inactive");
+    ok(ctx.tab2Browser.docShellIsActive, "Tab 2 should be active");
 
-  // Check everything
-  ok(!isActive(ctx.tab0Window), "Tab 0 should be inactive");
-  ok(!isActive(ctx.tab1Window), "Tab 1 should be inactive");
-  ok(isActive(ctx.tab2Window), "Tab 2 should be active");
-  ok(isActive(ctx.tab2Window.frames[0]), "Tab2 iframe 0 should be active");
-  ok(isActive(ctx.tab2Window.frames[0].frames[0]), "Tab2 iframe 0 subiframe 0 should be active");
-  ok(isActive(ctx.tab2Window.frames[1]), "Tab2 iframe 1 should be active");
-
-  // Go back
-  oneShotListener(ctx.tab2Browser, "pageshow", step5);
-  ctx.tab2Browser.goBack();
-
+    return checkTab2Active(true);
+  }).then(() => {
+    // Go back
+    waitForPageshow(ctx.tab2Browser, step5);
+    ctx.tab2Browser.goBack();
+  });
 }
 
 function step5() {
   // Check everything
-  ok(!isActive(ctx.tab0Window), "Tab 0 should be inactive");
-  ok(!isActive(ctx.tab1Window), "Tab 1 should be inactive");
-  ok(isActive(ctx.tab2Window), "Tab 2 should be active");
-  ok(isActive(ctx.tab2Window.frames[0]), "Tab2 iframe 0 should be active");
-  ok(isActive(ctx.tab2Window.frames[1]), "Tab2 iframe 1 should be active");
+  ok(!ctx.tab0Browser.docShellIsActive, "Tab 0 should be inactive");
+  ok(!ctx.tab1Browser.docShellIsActive, "Tab 1 should be inactive");
+  ok(ctx.tab2Browser.docShellIsActive, "Tab 2 should be active");
+  ContentTask.spawn(ctx.tab2Browser, null, function* () {
+    for (var i = 0; i < content.frames.length; i++) {
+      let docshell = content.frames[i].QueryInterface(Ci.nsIInterfaceRequestor)
+                                      .getInterface(Ci.nsIWebNavigation)
+                                      .QueryInterface(Ci.nsIDocShell);
 
-  // Switch to tab 1
-  gBrowser.selectedTab = ctx.tab1;
+      ok(docShell.isActive, `Tab2 iframe ${i} should be active`);
+    }
+  }).then(() => {
+    // Switch to tab 1
+    return BrowserTestUtils.switchTab(gBrowser, ctx.tab1);
+  }).then(() => {
+    // Navigate to page 3
+    ctx.tab1Browser.loadURI(testPath + "bug343515_pg3.html");
 
-  // Navigate to page 3
-  ctx.tab1Window.location = testPath + "bug343515_pg3.html";
-
-  // bug343515_pg3.html consists of a page with two iframes, one of which
-  // contains another iframe, so there'll be a total of 4 load events
-  nShotsListener(ctx.tab1Browser, "load", step6, 4);
+    // bug343515_pg3.html consists of a page with two iframes, one of which
+    // contains another iframe, so there'll be a total of 4 load events
+    nShotsListener(ctx.tab1Browser, "load", step6, 4);
+  });
 }
 
 function step6() {
 
   // Check everything
-  ok(!isActive(ctx.tab0Window), "Tab 0 should be inactive");
-  ok(isActive(ctx.tab1Window), "Tab 1 should be active");
-  ok(isActive(ctx.tab1Window.frames[0]), "Tab1 iframe 0 should be active");
-  ok(isActive(ctx.tab1Window.frames[0].frames[0]), "Tab1 iframe 0 subiframe 0 should be active");
-  ok(isActive(ctx.tab1Window.frames[1]), "Tab1 iframe 1 should be active");
-  ok(!isActive(ctx.tab2Window), "Tab 2 should be inactive");
-  ok(!isActive(ctx.tab2Window.frames[0]), "Tab2 iframe 0 should be inactive");
-  ok(!isActive(ctx.tab2Window.frames[1]), "Tab2 iframe 1 should be inactive");
+  ok(!ctx.tab0Browser.docShellIsActive, "Tab 0 should be inactive");
+  ok(ctx.tab1Browser.docShellIsActive, "Tab 1 should be active");
+  ContentTask.spawn(ctx.tab1Browser, null, function* () {
+    function isActive(aWindow) {
+      var docshell = aWindow.QueryInterface(Ci.nsIInterfaceRequestor)
+                            .getInterface(Ci.nsIWebNavigation)
+                            .QueryInterface(Ci.nsIDocShell);
+      return docshell.isActive;
+    }
 
-  // Go forward on tab 2
-  oneShotListener(ctx.tab2Browser, "pageshow", step7);
-  var tab2docshell = ctx.tab2Window.QueryInterface(Ci.nsIInterfaceRequestor)
-                                   .getInterface(Ci.nsIWebNavigation);
-  tab2docshell.goForward();
+    ok(isActive(content.frames[0]), "Tab1 iframe 0 should be active");
+    ok(isActive(content.frames[0].frames[0]), "Tab1 iframe 0 subiframe 0 should be active");
+    ok(isActive(content.frames[1]), "Tab1 iframe 1 should be active");
+  }).then(() => {
+    ok(!ctx.tab2Browser.docShellIsActive, "Tab 2 should be inactive");
+    return ContentTask.spawn(ctx.tab2Browser, null, function* () {
+      for (var i = 0; i < content.frames.length; i++) {
+        let docshell = content.frames[i].QueryInterface(Ci.nsIInterfaceRequestor)
+                                        .getInterface(Ci.nsIWebNavigation)
+                                        .QueryInterface(Ci.nsIDocShell);
+
+        ok(!docShell.isActive, `Tab2 iframe ${i} should be inactive`);
+      }
+    });
+  }).then(() => {
+    // Go forward on tab 2
+    waitForPageshow(ctx.tab2Browser, step7);
+    ctx.tab2Browser.goForward();
+  });
 }
 
 function step7() {
+  function checkBrowser(browser, tabNum, active) {
+    return ContentTask.spawn(browser, { tabNum, active },
+                             function* ({ tabNum, active }) {
+             function isActive(aWindow) {
+               var docshell = aWindow.QueryInterface(Ci.nsIInterfaceRequestor)
+                                     .getInterface(Ci.nsIWebNavigation)
+                                     .QueryInterface(Ci.nsIDocShell);
+               return docshell.isActive;
+             }
 
-  ctx.tab2Window = ctx.tab2Browser.contentWindow;
+             let activestr = active ? "active" : "inactive";
+             is(isActive(content.frames[0]), active,
+                `Tab${tabNum} iframe 0 should be ${activestr}`);
+             is(isActive(content.frames[0].frames[0]), active,
+                `Tab${tabNum} iframe 0 subiframe 0 should be ${activestr}`);
+             is(isActive(content.frames[1]), active,
+                `Tab${tabNum} iframe 1 should be ${activestr}`);
+           });
+  }
 
   // Check everything
-  ok(!isActive(ctx.tab0Window), "Tab 0 should be inactive");
-  ok(isActive(ctx.tab1Window), "Tab 1 should be active");
-  ok(isActive(ctx.tab1Window.frames[0]), "Tab1 iframe 0 should be active");
-  ok(isActive(ctx.tab1Window.frames[0].frames[0]), "Tab1 iframe 0 subiframe 0 should be active");
-  ok(isActive(ctx.tab1Window.frames[1]), "Tab1 iframe 1 should be active");
-  ok(!isActive(ctx.tab2Window), "Tab 2 should be inactive");
-  ok(!isActive(ctx.tab2Window.frames[0]), "Tab2 iframe 0 should be inactive");
-  ok(!isActive(ctx.tab2Window.frames[0].frames[0]), "Tab2 iframe 0 subiframe 0 should be inactive");
-  ok(!isActive(ctx.tab2Window.frames[1]), "Tab2 iframe 1 should be inactive");
-
-  // That's probably enough
-  allDone();
+  ok(!ctx.tab0Browser.docShellIsActive, "Tab 0 should be inactive");
+  ok(ctx.tab1Browser.docShellIsActive, "Tab 1 should be active");
+  checkBrowser(ctx.tab1Browser, 1, true).then(() => {
+    ok(!ctx.tab2Browser.docShellIsActive, "Tab 2 should be inactive");
+    return checkBrowser(ctx.tab2Browser, 2, false);
+  }).then(() => {
+    // That's probably enough
+    allDone();
+  });
 }
 
 function allDone() {
 
   // Close the tabs we made
   gBrowser.removeTab(ctx.tab1);
   gBrowser.removeTab(ctx.tab2);
 
--- a/dom/base/Console.cpp
+++ b/dom/base/Console.cpp
@@ -680,17 +680,18 @@ NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(Con
 NS_IMPL_CYCLE_COLLECTION_TRACE_END
 
 NS_IMPL_CYCLE_COLLECTING_ADDREF(Console)
 NS_IMPL_CYCLE_COLLECTING_RELEASE(Console)
 
 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(Console)
   NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
   NS_INTERFACE_MAP_ENTRY(nsIObserver)
-  NS_INTERFACE_MAP_ENTRY(nsISupports)
+  NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIObserver)
+  NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference)
 NS_INTERFACE_MAP_END
 
 Console::Console(nsPIDOMWindow* aWindow)
   : mWindow(aWindow)
   , mOuterID(0)
   , mInnerID(0)
 {
   if (mWindow) {
@@ -704,17 +705,17 @@ Console::Console(nsPIDOMWindow* aWindow)
     if (outerWindow) {
       mOuterID = outerWindow->WindowID();
     }
   }
 
   if (NS_IsMainThread()) {
     nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
     if (obs) {
-      obs->AddObserver(this, "inner-window-destroyed", false);
+      obs->AddObserver(this, "inner-window-destroyed", true);
     }
   }
 
   mozilla::HoldJSObjects(this);
 }
 
 Console::~Console()
 {
--- a/dom/base/Console.h
+++ b/dom/base/Console.h
@@ -9,37 +9,39 @@
 
 #include "mozilla/dom/BindingDeclarations.h"
 #include "mozilla/ErrorResult.h"
 #include "mozilla/JSObjectHolder.h"
 #include "nsCycleCollectionParticipant.h"
 #include "nsDataHashtable.h"
 #include "nsHashKeys.h"
 #include "nsIObserver.h"
+#include "nsWeakReference.h"
 #include "nsWrapperCache.h"
 #include "nsDOMNavigationTiming.h"
 #include "nsPIDOMWindow.h"
 
 class nsIConsoleAPIStorage;
 class nsIPrincipal;
 
 namespace mozilla {
 namespace dom {
 
 class ConsoleCallData;
 struct ConsoleStackEntry;
 
 class Console final : public nsIObserver
                     , public nsWrapperCache
+                    , public nsSupportsWeakReference
 {
   ~Console();
 
 public:
   NS_DECL_CYCLE_COLLECTING_ISUPPORTS
-  NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(Console)
+  NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_AMBIGUOUS(Console, nsIObserver)
   NS_DECL_NSIOBSERVER
 
   explicit Console(nsPIDOMWindow* aWindow);
 
   // WebIDL methods
   nsISupports* GetParentObject() const
   {
     return mWindow;
--- a/dom/base/nsScriptLoader.cpp
+++ b/dom/base/nsScriptLoader.cpp
@@ -62,19 +62,16 @@ static LazyLogModule gCspPRLog("CSP");
 
 static LogModule*
 GetSriLog()
 {
   static LazyLogModule gSriPRLog("SRI");
   return gSriPRLog;
 }
 
-// The nsScriptLoadRequest is passed as the context to necko, and thus
-// it needs to be threadsafe. Necko won't do anything with this
-// context, but it will AddRef and Release it on other threads.
 NS_IMPL_ISUPPORTS0(nsScriptLoadRequest)
 
 nsScriptLoadRequestList::~nsScriptLoadRequestList()
 {
   Clear();
 }
 
 void
--- a/dom/base/nsScriptLoader.h
+++ b/dom/base/nsScriptLoader.h
@@ -77,17 +77,17 @@ public:
       mJSVersion(aVersion),
       mLineNo(1),
       mCORSMode(aCORSMode),
       mIntegrity(aIntegrity),
       mReferrerPolicy(mozilla::net::RP_Default)
   {
   }
 
-  NS_DECL_THREADSAFE_ISUPPORTS
+  NS_DECL_ISUPPORTS
 
   void FireScriptAvailable(nsresult aResult)
   {
     mElement->ScriptAvailable(aResult, mElement, mIsInline, mURI, mLineNo);
   }
   void FireScriptEvaluated(nsresult aResult)
   {
     mElement->ScriptEvaluated(aResult, mElement, mIsInline);
--- a/dom/canvas/WebGL2ContextFramebuffers.cpp
+++ b/dom/canvas/WebGL2ContextFramebuffers.cpp
@@ -253,17 +253,17 @@ WebGL2Context::BlitFramebuffer(GLint src
     gl->fBlitFramebuffer(srcX0, srcY0, srcX1, srcY1,
                          dstX0, dstY0, dstX1, dstY1,
                          mask, filter);
 }
 
 static bool
 ValidateTextureLayerAttachment(GLenum attachment)
 {
-    if (LOCAL_GL_COLOR_ATTACHMENT0 < attachment &&
+    if (LOCAL_GL_COLOR_ATTACHMENT0 <= attachment &&
         attachment <= LOCAL_GL_COLOR_ATTACHMENT15)
     {
         return true;
     }
 
     switch (attachment) {
     case LOCAL_GL_DEPTH_ATTACHMENT:
     case LOCAL_GL_DEPTH_STENCIL_ATTACHMENT:
@@ -288,32 +288,45 @@ WebGL2Context::FramebufferTextureLayer(G
         return ErrorInvalidEnumInfo("framebufferTextureLayer: attachment:", attachment);
 
     if (texture) {
         if (texture->IsDeleted()) {
             return ErrorInvalidValue("framebufferTextureLayer: texture must be a valid "
                                      "texture object.");
         }
 
+        if (layer < 0)
+            return ErrorInvalidValue("framebufferTextureLayer: layer must be >= 0.");
+
         if (level < 0)
-            return ErrorInvalidValue("framebufferTextureLayer: layer must be >= 0.");
+            return ErrorInvalidValue("framebufferTextureLayer: level must be >= 0.");
 
         switch (texture->Target().get()) {
         case LOCAL_GL_TEXTURE_3D:
             if (uint32_t(layer) >= mImplMax3DTextureSize) {
                 return ErrorInvalidValue("framebufferTextureLayer: layer must be < "
                                          "MAX_3D_TEXTURE_SIZE");
             }
+
+            if (uint32_t(level) > FloorLog2(mImplMax3DTextureSize)) {
+                return ErrorInvalidValue("framebufferTextureLayer: layer mube be <= "
+                                         "log2(MAX_3D_TEXTURE_SIZE");
+            }
             break;
 
         case LOCAL_GL_TEXTURE_2D_ARRAY:
             if (uint32_t(layer) >= mImplMaxArrayTextureLayers) {
                 return ErrorInvalidValue("framebufferTextureLayer: layer must be < "
                                          "MAX_ARRAY_TEXTURE_LAYERS");
             }
+
+            if (uint32_t(level) > FloorLog2(mImplMaxTextureSize)) {
+                return ErrorInvalidValue("framebufferTextureLayer: layer mube be <= "
+                                         "log2(MAX_TEXTURE_SIZE");
+            }
             break;
 
         default:
             return ErrorInvalidOperation("framebufferTextureLayer: texture must be an "
                                          "existing 3D texture, or a 2D texture array.");
         }
     }
 
--- a/dom/canvas/WebGL2ContextMRTs.cpp
+++ b/dom/canvas/WebGL2ContextMRTs.cpp
@@ -47,31 +47,52 @@ bool WebGL2Context::ValidateClearBuffer(
     }
     return true;
 }
 
 // Common base functionality. These a good candidates to be moved into WebGLContextUnchecked.cpp
 void
 WebGL2Context::ClearBufferiv_base(GLenum buffer, GLint drawbuffer, const GLint* value)
 {
+    const char funcName[] = "clearBufferiv";
+
     MakeContextCurrent();
+    if (mBoundDrawFramebuffer) {
+        if (!mBoundDrawFramebuffer->ValidateAndInitAttachments(funcName))
+            return;
+    }
+
     gl->fClearBufferiv(buffer, drawbuffer, value);
 }
 
 void
 WebGL2Context::ClearBufferuiv_base(GLenum buffer, GLint drawbuffer, const GLuint* value)
 {
+    const char funcName[] = "clearBufferuiv";
+
     MakeContextCurrent();
+    if (mBoundDrawFramebuffer) {
+        if (!mBoundDrawFramebuffer->ValidateAndInitAttachments(funcName))
+            return;
+    }
+
     gl->fClearBufferuiv(buffer, drawbuffer, value);
 }
 
 void
 WebGL2Context::ClearBufferfv_base(GLenum buffer, GLint drawbuffer, const GLfloat* value)
 {
+    const char funcName[] = "clearBufferfv";
+
     MakeContextCurrent();
+    if (mBoundDrawFramebuffer) {
+        if (!mBoundDrawFramebuffer->ValidateAndInitAttachments(funcName))
+            return;
+    }
+
     gl->fClearBufferfv(buffer, drawbuffer, value);
 }
 
 void
 WebGL2Context::ClearBufferiv(GLenum buffer, GLint drawbuffer, const dom::Int32Array& value)
 {
     value.ComputeLengthAndData();
     if (!ValidateClearBuffer("clearBufferiv", buffer, drawbuffer, value.Length())) {
--- a/dom/canvas/WebGL2ContextSamplers.cpp
+++ b/dom/canvas/WebGL2ContextSamplers.cpp
@@ -42,16 +42,18 @@ WebGL2Context::DeleteSampler(WebGLSample
         return;
 
     if (!sampler || sampler->IsDeleted())
         return;
 
     for (int n = 0; n < mGLMaxTextureUnits; n++) {
         if (mBoundSamplers[n] == sampler) {
             mBoundSamplers[n] = nullptr;
+
+            InvalidateResolveCacheForTextureWithTexUnit(n);
         }
     }
 
     sampler->RequestDelete();
 }
 
 bool
 WebGL2Context::IsSampler(WebGLSampler* sampler)
@@ -83,32 +85,34 @@ WebGL2Context::BindSampler(GLuint unit, 
 
     if (GLint(unit) >= mGLMaxTextureUnits)
         return ErrorInvalidValue("bindSampler: unit must be < %d", mGLMaxTextureUnits);
 
     if (sampler && sampler->IsDeleted())
         return ErrorInvalidOperation("bindSampler: binding deleted sampler");
 
     WebGLContextUnchecked::BindSampler(unit, sampler);
+    InvalidateResolveCacheForTextureWithTexUnit(unit);
 
     mBoundSamplers[unit] = sampler;
 }
 
 void
 WebGL2Context::SamplerParameteri(WebGLSampler* sampler, GLenum pname, GLint param)
 {
     if (IsContextLost())
         return;
 
     if (!sampler || sampler->IsDeleted())
         return ErrorInvalidOperation("samplerParameteri: invalid sampler");
 
     if (!ValidateSamplerParameterParams(pname, WebGLIntOrFloat(param), "samplerParameteri"))
         return;
 
+    sampler->SamplerParameter1i(pname, param);
     WebGLContextUnchecked::SamplerParameteri(sampler, pname, param);
 }
 
 void
 WebGL2Context::SamplerParameteriv(WebGLSampler* sampler, GLenum pname, const dom::Int32Array& param)
 {
     if (IsContextLost())
         return;
@@ -119,16 +123,17 @@ WebGL2Context::SamplerParameteriv(WebGLS
     param.ComputeLengthAndData();
     if (param.Length() < 1)
         return /* TODO(djg): Error message */;
 
     /* TODO(djg): All of these calls in ES3 only take 1 param */
     if (!ValidateSamplerParameterParams(pname, WebGLIntOrFloat(param.Data()[0]), "samplerParameteriv"))
         return;
 
+    sampler->SamplerParameter1i(pname, param.Data()[0]);
     WebGLContextUnchecked::SamplerParameteriv(sampler, pname, param.Data());
 }
 
 void
 WebGL2Context::SamplerParameteriv(WebGLSampler* sampler, GLenum pname, const dom::Sequence<GLint>& param)
 {
     if (IsContextLost())
         return;
@@ -138,31 +143,33 @@ WebGL2Context::SamplerParameteriv(WebGLS
 
     if (param.Length() < 1)
         return /* TODO(djg): Error message */;
 
     /* TODO(djg): All of these calls in ES3 only take 1 param */
     if (!ValidateSamplerParameterParams(pname, WebGLIntOrFloat(param[0]), "samplerParameteriv"))
         return;
 
+    sampler->SamplerParameter1i(pname, param[0]);
     WebGLContextUnchecked::SamplerParameteriv(sampler, pname, param.Elements());
 }
 
 void
 WebGL2Context::SamplerParameterf(WebGLSampler* sampler, GLenum pname, GLfloat param)
 {
     if (IsContextLost())
         return;
 
     if (!sampler || sampler->IsDeleted())
         return ErrorInvalidOperation("samplerParameterf: invalid sampler");
 
     if (!ValidateSamplerParameterParams(pname, WebGLIntOrFloat(param), "samplerParameterf"))
         return;
 
+    sampler->SamplerParameter1f(pname, param);
     WebGLContextUnchecked::SamplerParameterf(sampler, pname, param);
 }
 
 void
 WebGL2Context::SamplerParameterfv(WebGLSampler* sampler, GLenum pname, const dom::Float32Array& param)
 {
     if (IsContextLost())
         return;
@@ -173,16 +180,17 @@ WebGL2Context::SamplerParameterfv(WebGLS
     param.ComputeLengthAndData();
     if (param.Length() < 1)
         return /* TODO(djg): Error message */;
 
     /* TODO(djg): All of these calls in ES3 only take 1 param */
     if (!ValidateSamplerParameterParams(pname, WebGLIntOrFloat(param.Data()[0]), "samplerParameterfv"))
         return;
 
+    sampler->SamplerParameter1f(pname, param.Data()[0]);
     WebGLContextUnchecked::SamplerParameterfv(sampler, pname, param.Data());
 }
 
 void
 WebGL2Context::SamplerParameterfv(WebGLSampler* sampler, GLenum pname, const dom::Sequence<GLfloat>& param)
 {
     if (IsContextLost())
         return;
@@ -192,16 +200,17 @@ WebGL2Context::SamplerParameterfv(WebGLS
 
     if (param.Length() < 1)
         return /* TODO(djg): Error message */;
 
     /* TODO(djg): All of these calls in ES3 only take 1 param */
     if (!ValidateSamplerParameterParams(pname, WebGLIntOrFloat(param[0]), "samplerParameterfv"))
         return;
 
+    sampler->SamplerParameter1f(pname, param[0]);
     WebGLContextUnchecked::SamplerParameterfv(sampler, pname, param.Elements());
 }
 
 void
 WebGL2Context::GetSamplerParameter(JSContext*, WebGLSampler* sampler, GLenum pname, JS::MutableHandleValue retval)
 {
     if (IsContextLost())
         return;
--- a/dom/canvas/WebGLContext.h
+++ b/dom/canvas/WebGLContext.h
@@ -327,16 +327,18 @@ public:
      */
     WebGLTexture*
     ActiveBoundTextureForTexImageTarget(const TexImageTarget texImgTarget) const
     {
         const TexTarget texTarget = TexImageTargetToTexTarget(texImgTarget);
         return ActiveBoundTextureForTarget(texTarget);
     }
 
+    void InvalidateResolveCacheForTextureWithTexUnit(const GLuint);
+
     already_AddRefed<Layer>
     GetCanvasLayer(nsDisplayListBuilder* builder, Layer* oldLayer,
                    LayerManager* manager) override;
 
     // Note that 'clean' here refers to its invalidation state, not the
     // contents of the buffer.
     void MarkContextClean() override { mInvalidated = false; }
 
--- a/dom/canvas/WebGLContextGL.cpp
+++ b/dom/canvas/WebGLContextGL.cpp
@@ -1311,25 +1311,60 @@ WebGLContext::DoReadPixelsAndConvert(GLi
         return true;
     }
 
     gl->fReadPixels(x, y, width, height, destFormat, destType, destBytes);
     return true;
 }
 
 static bool
-IsFormatAndTypeUnpackable(GLenum format, GLenum type)
+IsFormatAndTypeUnpackable(GLenum format, GLenum type, bool isWebGL2)
 {
     switch (type) {
     case LOCAL_GL_UNSIGNED_BYTE:
+        switch (format) {
+        case LOCAL_GL_LUMINANCE:
+        case LOCAL_GL_LUMINANCE_ALPHA:
+            if (!isWebGL2)
+                return false;
+        case LOCAL_GL_ALPHA:
+        case LOCAL_GL_RED:
+        case LOCAL_GL_RED_INTEGER:
+        case LOCAL_GL_RG:
+        case LOCAL_GL_RG_INTEGER:
+        case LOCAL_GL_RGB:
+        case LOCAL_GL_RGB_INTEGER:
+        case LOCAL_GL_RGBA:
+        case LOCAL_GL_RGBA_INTEGER:
+            return true;
+        default:
+            return false;
+        }
+
+    case LOCAL_GL_BYTE:
+        switch (format) {
+        case LOCAL_GL_RED:
+        case LOCAL_GL_RED_INTEGER:
+        case LOCAL_GL_RG:
+        case LOCAL_GL_RG_INTEGER:
+        case LOCAL_GL_RGB:
+        case LOCAL_GL_RGB_INTEGER:
+        case LOCAL_GL_RGBA:
+        case LOCAL_GL_RGBA_INTEGER:
+            return true;
+        default:
+            return false;
+        }
+
     case LOCAL_GL_FLOAT:
     case LOCAL_GL_HALF_FLOAT:
     case LOCAL_GL_HALF_FLOAT_OES:
         switch (format) {
-        case LOCAL_GL_ALPHA:
+        case LOCAL_GL_RED:
+        case LOCAL_GL_RG:
         case LOCAL_GL_RGB:
         case LOCAL_GL_RGBA:
             return true;
         default:
             return false;
         }
 
     case LOCAL_GL_UNSIGNED_SHORT_4_4_4_4:
@@ -1343,24 +1378,38 @@ IsFormatAndTypeUnpackable(GLenum format,
         return false;
     }
 }
 
 static bool
 IsIntegerFormatAndTypeUnpackable(GLenum format, GLenum type)
 {
     switch (type) {
+    case LOCAL_GL_UNSIGNED_SHORT:
+    case LOCAL_GL_SHORT:
     case LOCAL_GL_UNSIGNED_INT:
     case LOCAL_GL_INT:
         switch (format) {
+        case LOCAL_GL_RED_INTEGER:
+        case LOCAL_GL_RG_INTEGER:
+        case LOCAL_GL_RGB_INTEGER:
         case LOCAL_GL_RGBA_INTEGER:
             return true;
         default:
             return false;
         }
+
+    case LOCAL_GL_UNSIGNED_INT_2_10_10_10_REV:
+        return format == LOCAL_GL_RGBA ||
+               format == LOCAL_GL_RGBA_INTEGER;
+
+    case LOCAL_GL_UNSIGNED_INT_10F_11F_11F_REV:
+    case LOCAL_GL_UNSIGNED_INT_5_9_9_9_REV:
+        return format == LOCAL_GL_RGB;
+
     default:
         return false;
     }
 }
 
 
 CheckedUint32
 WebGLContext::GetPackSize(uint32_t width, uint32_t height, uint8_t bytesPerPixel,
@@ -1413,62 +1462,90 @@ WebGLContext::ReadPixels(GLint x, GLint 
 
     if (width < 0 || height < 0)
         return ErrorInvalidValue("readPixels: negative size passed");
 
     if (pixels.IsNull())
         return ErrorInvalidValue("readPixels: null destination buffer");
 
     if (!(IsWebGL2() && IsIntegerFormatAndTypeUnpackable(format, type)) &&
-        !IsFormatAndTypeUnpackable(format, type)) {
+        !IsFormatAndTypeUnpackable(format, type, IsWebGL2())) {
         return ErrorInvalidEnum("readPixels: Bad format or type.");
     }
 
     int channels = 0;
 
     // Check the format param
     switch (format) {
     case LOCAL_GL_ALPHA:
+    case LOCAL_GL_LUMINANCE:
+    case LOCAL_GL_RED:
+    case LOCAL_GL_RED_INTEGER:
         channels = 1;
         break;
+    case LOCAL_GL_LUMINANCE_ALPHA:
+    case LOCAL_GL_RG:
+    case LOCAL_GL_RG_INTEGER:
+        channels = 2;
+        break;
     case LOCAL_GL_RGB:
+    case LOCAL_GL_RGB_INTEGER:
         channels = 3;
         break;
     case LOCAL_GL_RGBA:
     case LOCAL_GL_RGBA_INTEGER:
         channels = 4;
         break;
     default:
         MOZ_CRASH("bad `format`");
     }
 
 
     // Check the type param
     int bytesPerPixel;
     int requiredDataType;
     switch (type) {
+    case LOCAL_GL_BYTE:
+        bytesPerPixel = 1*channels;
+        requiredDataType = js::Scalar::Int8;
+        break;
+
     case LOCAL_GL_UNSIGNED_BYTE:
         bytesPerPixel = 1*channels;
         requiredDataType = js::Scalar::Uint8;
         break;
 
+    case LOCAL_GL_SHORT:
+        bytesPerPixel = 2*channels;
+        requiredDataType = js::Scalar::Int16;
+        break;
+
+    case LOCAL_GL_UNSIGNED_SHORT:
     case LOCAL_GL_UNSIGNED_SHORT_4_4_4_4:
     case LOCAL_GL_UNSIGNED_SHORT_5_5_5_1:
     case LOCAL_GL_UNSIGNED_SHORT_5_6_5:
         bytesPerPixel = 2;
         requiredDataType = js::Scalar::Uint16;
         break;
 
+    case LOCAL_GL_UNSIGNED_INT_2_10_10_10_REV:
+    case LOCAL_GL_UNSIGNED_INT_5_9_9_9_REV:
+    case LOCAL_GL_UNSIGNED_INT_10F_11F_11F_REV:
+    case LOCAL_GL_UNSIGNED_INT_24_8:
+        bytesPerPixel = 4;
+        requiredDataType = js::Scalar::Uint32;
+        break;
+
     case LOCAL_GL_UNSIGNED_INT:
-        bytesPerPixel = 4;
+        bytesPerPixel = 4*channels;
         requiredDataType = js::Scalar::Uint32;
         break;
 
     case LOCAL_GL_INT:
-        bytesPerPixel = 4;
+        bytesPerPixel = 4*channels;
         requiredDataType = js::Scalar::Int32;
         break;
 
     case LOCAL_GL_FLOAT:
         bytesPerPixel = 4*channels;
         requiredDataType = js::Scalar::Float32;
         break;
 
@@ -1519,40 +1596,65 @@ WebGLContext::ReadPixels(GLint x, GLint 
     MakeContextCurrent();
 
     const webgl::FormatUsageInfo* srcFormat;
     uint32_t srcWidth;
     uint32_t srcHeight;
     if (!ValidateCurFBForRead("readPixels", &srcFormat, &srcWidth, &srcHeight))
         return;
 
+    // Check the format and type params to assure they are an acceptable pair (as per spec)
     auto srcType = srcFormat->format->componentType;
-    const bool isSrcTypeFloat = (srcType == webgl::ComponentType::Float);
-
-    // Check the format and type params to assure they are an acceptable pair (as per spec)
-
-    const GLenum mainReadFormat = LOCAL_GL_RGBA;
-    const GLenum mainReadType = isSrcTypeFloat ? LOCAL_GL_FLOAT
-                                               : LOCAL_GL_UNSIGNED_BYTE;
+    GLenum mainReadFormat;
+    GLenum mainReadType;
+    switch (srcType) {
+        case webgl::ComponentType::Float:
+            mainReadFormat = LOCAL_GL_RGBA;
+            mainReadType = LOCAL_GL_FLOAT;
+            break;
+        case webgl::ComponentType::UInt:
+            mainReadFormat = LOCAL_GL_RGBA_INTEGER;
+            mainReadType = LOCAL_GL_UNSIGNED_INT;
+            break;
+        case webgl::ComponentType::Int:
+            mainReadFormat = LOCAL_GL_RGBA_INTEGER;
+            mainReadType = LOCAL_GL_INT;
+            break;
+        default:
+            mainReadFormat = LOCAL_GL_RGBA;
+            mainReadType = LOCAL_GL_UNSIGNED_BYTE;
+            break;
+    }
 
     GLenum auxReadFormat = mainReadFormat;
     GLenum auxReadType = mainReadType;
 
     // OpenGL ES 2.0 $4.3.1 - IMPLEMENTATION_COLOR_READ_{TYPE/FORMAT} is a valid
     // combination for glReadPixels().
     if (gl->IsSupported(gl::GLFeature::ES2_compatibility)) {
         gl->fGetIntegerv(LOCAL_GL_IMPLEMENTATION_COLOR_READ_FORMAT,
                          reinterpret_cast<GLint*>(&auxReadFormat));
         gl->fGetIntegerv(LOCAL_GL_IMPLEMENTATION_COLOR_READ_TYPE,
                          reinterpret_cast<GLint*>(&auxReadType));
     }
 
     const bool mainMatches = (format == mainReadFormat && type == mainReadType);
     const bool auxMatches = (format == auxReadFormat && type == auxReadType);
-    const bool isValid = mainMatches || auxMatches;
+    bool isValid = mainMatches || auxMatches;
+
+    // OpenGL ES 3.0.4 p194 - When the internal format of the rendering surface is
+    // RGB10_A2, a third combination of format RGBA and type UNSIGNED_INT_2_10_10_10_REV
+    // is accepted.
+    if (srcFormat->format->effectiveFormat == webgl::EffectiveFormat::RGB10_A2 &&
+        format == LOCAL_GL_RGBA &&
+        type == LOCAL_GL_UNSIGNED_INT_2_10_10_10_REV)
+    {
+        isValid = true;
+    }
+
     if (!isValid)
         return ErrorInvalidOperation("readPixels: Invalid format/type pair");
 
     // Now that the errors are out of the way, on to actually reading!
 
     uint32_t readX, readY;
     uint32_t writeX, writeY;
     uint32_t rwWidth, rwHeight;
--- a/dom/canvas/WebGLContextState.cpp
+++ b/dom/canvas/WebGLContextState.cpp
@@ -305,16 +305,17 @@ WebGLContext::GetParameter(JSContext* cx
             }
 
             GLint i = 0;
             if (gl->IsSupported(gl::GLFeature::ES2_compatibility)) {
                 gl->fGetIntegerv(pname, &i);
             } else {
                 i = LOCAL_GL_UNSIGNED_BYTE;
             }
+
             return JS::NumberValue(uint32_t(i));
         }
         case LOCAL_GL_IMPLEMENTATION_COLOR_READ_FORMAT: {
             if (mBoundReadFramebuffer) {
                 nsCString fbStatusInfoIgnored;
                 const auto status = mBoundReadFramebuffer->CheckFramebufferStatus(&fbStatusInfoIgnored);
                 if (status != LOCAL_GL_FRAMEBUFFER_COMPLETE) {
                     ErrorInvalidOperation("getParameter: Read framebuffer must be"
@@ -325,16 +326,24 @@ WebGLContext::GetParameter(JSContext* cx
             }
 
             GLint i = 0;
             if (gl->IsSupported(gl::GLFeature::ES2_compatibility)) {
                 gl->fGetIntegerv(pname, &i);
             } else {
                 i = LOCAL_GL_RGBA;
             }
+
+            // OpenGL ES 3.0.4 p112 Table 3.2 shows that read format SRGB_ALPHA is
+            // not supported. And if internal format of fbo is SRGB8_ALPHA8, then
+            // IMPLEMENTATION_COLOR_READ_FORMAT is SRGB_ALPHA which is not supported
+            // by ReadPixels. So, just return RGBA here.
+            if (i == LOCAL_GL_SRGB_ALPHA)
+                i = LOCAL_GL_RGBA;
+
             return JS::NumberValue(uint32_t(i));
         }
         // int
         case LOCAL_GL_STENCIL_REF:
         case LOCAL_GL_STENCIL_BACK_REF: {
             GLint stencilBits = 0;
             if (!GetStencilBits(&stencilBits))
                 return JS::NullValue();
--- a/dom/canvas/WebGLContextTextures.cpp
+++ b/dom/canvas/WebGLContextTextures.cpp
@@ -182,16 +182,29 @@ WebGLContext::IsTexParamValid(GLenum pna
     case LOCAL_GL_TEXTURE_MAX_ANISOTROPY_EXT:
         return IsExtensionEnabled(WebGLExtensionID::EXT_texture_filter_anisotropic);
 
     default:
         return false;
     }
 }
 
+void
+WebGLContext::InvalidateResolveCacheForTextureWithTexUnit(const GLuint texUnit)
+{
+    if (mBound2DTextures[texUnit])
+        mBound2DTextures[texUnit]->InvalidateResolveCache();
+    if (mBoundCubeMapTextures[texUnit])
+        mBoundCubeMapTextures[texUnit]->InvalidateResolveCache();
+    if (mBound3DTextures[texUnit])
+        mBound3DTextures[texUnit]->InvalidateResolveCache();
+    if (mBound2DArrayTextures[texUnit])
+        mBound2DArrayTextures[texUnit]->InvalidateResolveCache();
+}
+
 //////////////////////////////////////////////////////////////////////////////////////////
 // GL calls
 
 void
 WebGLContext::BindTexture(GLenum rawTarget, WebGLTexture* newTex)
 {
     if (IsContextLost())
         return;
--- a/dom/canvas/WebGLFramebuffer.cpp
+++ b/dom/canvas/WebGLFramebuffer.cpp
@@ -984,17 +984,23 @@ WebGLFramebuffer::ValidateAndInitAttachm
     const bool hasDrawBuffers = (mContext->IsWebGL2() ||
                                  mContext->IsExtensionEnabled(drawBufferExt));
 
     if (hasDrawBuffers) {
         fnDrawBuffers(tempDrawBuffers);
     }
 
     // Clear!
-    mContext->ForceClearFramebufferWithDefaultValues(clearBits, false);
+    {
+        // This FB maybe bind to GL_READ_FRAMEBUFFER and glClear only
+        // clear GL_DRAW_FRAMEBUFFER. So bind FB to GL_DRAW_FRAMEBUFFER
+        // here.
+        gl::ScopedBindFramebuffer autoFB(mContext->gl, mGLName);
+        mContext->ForceClearFramebufferWithDefaultValues(clearBits, false);
+    }
 
     if (hasDrawBuffers) {
         fnDrawBuffers(mDrawBuffers);
     }
 
     // Mark all the uninitialized images as initialized.
     if (mDepthAttachment.HasUninitializedImageData())
         mDepthAttachment.SetImageDataStatus(WebGLImageDataStatus::InitializedImageData);
--- a/dom/canvas/WebGLSampler.cpp
+++ b/dom/canvas/WebGLSampler.cpp
@@ -9,16 +9,25 @@
 #include "mozilla/dom/WebGL2RenderingContextBinding.h"
 #include "WebGLContext.h"
 
 namespace mozilla {
 
 WebGLSampler::WebGLSampler(WebGLContext* webgl, GLuint sampler)
     : WebGLContextBoundObject(webgl)
     , mGLName(sampler)
+    , mMinFilter(LOCAL_GL_NEAREST_MIPMAP_LINEAR)
+    , mMagFilter(LOCAL_GL_LINEAR)
+    , mWrapS(LOCAL_GL_REPEAT)
+    , mWrapT(LOCAL_GL_REPEAT)
+    , mWrapR(LOCAL_GL_REPEAT)
+    , mMinLod(-1000)
+    , mMaxLod(1000)
+    , mCompareMode(LOCAL_GL_NONE)
+    , mCompareFunc(LOCAL_GL_LEQUAL)
 {
     mContext->mSamplers.insertBack(this);
 }
 
 WebGLSampler::~WebGLSampler()
 {
     DeleteOnce();
 }
@@ -39,14 +48,80 @@ WebGLSampler::GetParentObject() const
 }
 
 JSObject*
 WebGLSampler::WrapObject(JSContext* cx, JS::Handle<JSObject*> givenProto)
 {
     return dom::WebGLSamplerBinding::Wrap(cx, this, givenProto);
 }
 
+void
+WebGLSampler::SamplerParameter1i(GLenum pname, GLint param)
+{
+    switch (pname) {
+    case LOCAL_GL_TEXTURE_MIN_FILTER:
+        mMinFilter = param;
+        break;
+
+    case LOCAL_GL_TEXTURE_MAG_FILTER:
+        mMagFilter = param;
+        break;
+
+    case LOCAL_GL_TEXTURE_WRAP_S:
+        mWrapS = param;
+        break;
+
+    case LOCAL_GL_TEXTURE_WRAP_T:
+        mWrapT = param;
+        break;
+
+    case LOCAL_GL_TEXTURE_WRAP_R:
+        mWrapR = param;
+        break;
+
+    case LOCAL_GL_TEXTURE_COMPARE_MODE:
+        mCompareMode = param;
+        break;
+
+    case LOCAL_GL_TEXTURE_COMPARE_FUNC:
+        mCompareFunc = param;
+        break;
+
+    default:
+        MOZ_CRASH("Unhandled pname");
+        break;
+    }
+
+    for (uint32_t i = 0; i < mContext->mBoundSamplers.Length(); ++i) {
+        if (this == mContext->mBoundSamplers[i])
+            mContext->InvalidateResolveCacheForTextureWithTexUnit(i);
+    }
+}
+
+void
+WebGLSampler::SamplerParameter1f(GLenum pname, GLfloat param)
+{
+    switch (pname) {
+    case LOCAL_GL_TEXTURE_MIN_LOD:
+        mMinLod = param;
+        break;
+
+    case LOCAL_GL_TEXTURE_MAX_LOD:
+        mMaxLod = param;
+        break;
+
+    default:
+        MOZ_CRASH("Unhandled pname");
+        break;
+    }
+
+    for (uint32_t i = 0; i < mContext->mBoundSamplers.Length(); ++i) {
+        if (this == mContext->mBoundSamplers[i])
+            mContext->InvalidateResolveCacheForTextureWithTexUnit(i);
+    }
+}
+
 
 NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_0(WebGLSampler)
 NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(WebGLSampler, AddRef)
 NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(WebGLSampler, Release)
 
 } // namespace mozilla
--- a/dom/canvas/WebGLSampler.h
+++ b/dom/canvas/WebGLSampler.h
@@ -14,31 +14,45 @@ namespace mozilla {
 
 class WebGLSampler final
     : public nsWrapperCache
     , public WebGLRefCountedObject<WebGLSampler>
     , public LinkedListElement<WebGLSampler>
     , public WebGLContextBoundObject
 {
     friend class WebGLContext2;
+    friend class WebGLTexture;
 
 public:
     explicit WebGLSampler(WebGLContext* webgl, GLuint sampler);
 
     const GLuint mGLName;
 
     void Delete();
     WebGLContext* GetParentObject() const;
 
     virtual JSObject* WrapObject(JSContext* cx, JS::Handle<JSObject*> givenProto) override;
 
+    void SamplerParameter1i(GLenum pname, GLint param);
+    void SamplerParameter1f(GLenum pname, GLfloat param);
+
 private:
 
     NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(WebGLSampler)
     NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(WebGLSampler)
 
+    TexMinFilter mMinFilter;
+    TexMagFilter mMagFilter;
+    TexWrap mWrapS;
+    TexWrap mWrapT;
+    TexWrap mWrapR;
+    GLint mMinLod;
+    GLint mMaxLod;
+    TexCompareMode mCompareMode;
+    TexCompareFunc mCompareFunc;
+
 private:
     ~WebGLSampler();
 };
 
 } // namespace mozilla
 
 #endif // WEBGL_SAMPLER_H_
--- a/dom/canvas/WebGLStrongTypes.h
+++ b/dom/canvas/WebGLStrongTypes.h
@@ -264,16 +264,32 @@ STRONG_GLENUM_BEGIN(TexMagFilter)
 STRONG_GLENUM_END(TexMagFilter)
 
 STRONG_GLENUM_BEGIN(TexWrap)
     STRONG_GLENUM_VALUE(REPEAT),
     STRONG_GLENUM_VALUE(CLAMP_TO_EDGE),
     STRONG_GLENUM_VALUE(MIRRORED_REPEAT),
 STRONG_GLENUM_END(TexWrap)
 
+STRONG_GLENUM_BEGIN(TexCompareMode)
+    STRONG_GLENUM_VALUE(NONE),
+    STRONG_GLENUM_VALUE(COMPARE_REF_TO_TEXTURE),
+STRONG_GLENUM_END(TexCompareMode)
+
+STRONG_GLENUM_BEGIN(TexCompareFunc)
+    STRONG_GLENUM_VALUE(LEQUAL),
+    STRONG_GLENUM_VALUE(GEQUAL),
+    STRONG_GLENUM_VALUE(LESS),
+    STRONG_GLENUM_VALUE(GREATER),
+    STRONG_GLENUM_VALUE(EQUAL),
+    STRONG_GLENUM_VALUE(NOTEQUAL),
+    STRONG_GLENUM_VALUE(ALWAYS),
+    STRONG_GLENUM_VALUE(NEVER),
+STRONG_GLENUM_END(TexCompareFunc)
+
 STRONG_GLENUM_BEGIN(TexFormat)
     STRONG_GLENUM_VALUE(NONE),            // 0x0000
     STRONG_GLENUM_VALUE(DEPTH_COMPONENT), // 0x1902
     STRONG_GLENUM_VALUE(RED),             // 0x1903
     STRONG_GLENUM_VALUE(ALPHA),           // 0x1906
     STRONG_GLENUM_VALUE(RGB),             // 0x1907
     STRONG_GLENUM_VALUE(RGBA),            // 0x1908
     STRONG_GLENUM_VALUE(LUMINANCE),       // 0x1909
--- a/dom/canvas/WebGLTexture.cpp
+++ b/dom/canvas/WebGLTexture.cpp
@@ -185,22 +185,22 @@ WebGLTexture::SetImageInfosAtLevel(uint3
     for (uint8_t i = 0; i < mFaceCount; i++) {
         ImageInfoAtFace(i, level) = newInfo;
     }
 
     InvalidateResolveCache();
 }
 
 bool
-WebGLTexture::IsMipmapComplete() const
+WebGLTexture::IsMipmapComplete(uint32_t texUnit) const
 {
     MOZ_ASSERT(DoesMinFilterRequireMipmap());
     // GLES 3.0.4, p161
 
-    const uint32_t maxLevel = MaxEffectiveMipmapLevel();
+    const uint32_t maxLevel = MaxEffectiveMipmapLevel(texUnit);
 
     // "* `level_base <= level_max`"
     if (mBaseMipmapLevel > maxLevel)
         return false;
 
     // Make a copy so we can modify it.
     const ImageInfo& baseImageInfo = BaseImageInfo();
     if (!baseImageInfo.IsDefined())
@@ -285,17 +285,17 @@ WebGLTexture::IsCubeComplete() const
             return false;
         }
     }
 
     return true;
 }
 
 bool
-WebGLTexture::IsComplete(const char** const out_reason) const
+WebGLTexture::IsComplete(uint32_t texUnit, const char** const out_reason) const
 {
     // Texture completeness is established at GLES 3.0.4, p160-161.
     // "[A] texture is complete unless any of the following conditions hold true:"
 
     // "* Any dimension of the `level_base` array is not positive."
     const ImageInfo& baseImageInfo = BaseImageInfo();
     if (!baseImageInfo.IsDefined()) {
         // In case of undefined texture image, we don't print any message because this is
@@ -310,29 +310,33 @@ WebGLTexture::IsComplete(const char** co
     }
 
     // "* The texture is a cube map texture, and is not cube complete."
     if (IsCubeMap() && !IsCubeComplete()) {
         *out_reason = "Cubemaps must be \"cube complete\".";
         return false;
     }
 
+    WebGLSampler* sampler = mContext->mBoundSamplers[texUnit];
+    TexMinFilter minFilter = sampler ? sampler->mMinFilter : mMinFilter;
+    TexMagFilter magFilter = sampler ? sampler->mMagFilter : mMagFilter;
+
     // "* The minification filter requires a mipmap (is neither NEAREST nor LINEAR) and
     //    the texture is not mipmap complete."
-    const bool requiresMipmap = (mMinFilter != LOCAL_GL_NEAREST &&
-                                 mMinFilter != LOCAL_GL_LINEAR);
-    if (requiresMipmap && !IsMipmapComplete()) {
+    const bool requiresMipmap = (minFilter != LOCAL_GL_NEAREST &&
+                                 minFilter != LOCAL_GL_LINEAR);
+    if (requiresMipmap && !IsMipmapComplete(texUnit)) {
         *out_reason = "Because the minification filter requires mipmapping, the texture"
                       " must be \"mipmap complete\".";
         return false;
     }
 
-    const bool isMinFilteringNearest = (mMinFilter == LOCAL_GL_NEAREST ||
-                                        mMinFilter == LOCAL_GL_NEAREST_MIPMAP_NEAREST);
-    const bool isMagFilteringNearest = (mMagFilter == LOCAL_GL_NEAREST);
+    const bool isMinFilteringNearest = (minFilter == LOCAL_GL_NEAREST ||
+                                        minFilter == LOCAL_GL_NEAREST_MIPMAP_NEAREST);
+    const bool isMagFilteringNearest = (magFilter == LOCAL_GL_NEAREST);
     const bool isFilteringNearestOnly = (isMinFilteringNearest && isMagFilteringNearest);
     if (!isFilteringNearestOnly) {
         auto formatUsage = baseImageInfo.mFormat;
         auto format = formatUsage->format;
 
         // "* The effective internal format specified for the texture arrays is a sized
         //    internal color format that is not texture-filterable, and either the
         //    magnification filter is not NEAREST or the minification filter is neither
@@ -389,19 +393,21 @@ WebGLTexture::IsComplete(const char** co
         // "* A two-dimensional sampler is called, the corresponding texture image is a
         //    non-power-of-two image[...], and either the texture wrap mode is not
         //    CLAMP_TO_EDGE, or the minification filter is neither NEAREST nor LINEAR."
 
         // "* A cube map sampler is called, any of the corresponding texture images are
         //    non-power-of-two images, and either the texture wrap mode is not
         //    CLAMP_TO_EDGE, or the minification filter is neither NEAREST nor LINEAR."
         if (!baseImageInfo.IsPowerOfTwo()) {
+            TexWrap wrapS = sampler ? sampler->mWrapS : mWrapS;
+            TexWrap wrapT = sampler ? sampler->mWrapT : mWrapT;
             // "either the texture wrap mode is not CLAMP_TO_EDGE"
-            if (mWrapS != LOCAL_GL_CLAMP_TO_EDGE ||
-                mWrapT != LOCAL_GL_CLAMP_TO_EDGE)
+            if (wrapS != LOCAL_GL_CLAMP_TO_EDGE ||
+                wrapT != LOCAL_GL_CLAMP_TO_EDGE)
             {
                 *out_reason = "Non-power-of-two textures must have a wrap mode of"
                               " CLAMP_TO_EDGE.";
                 return false;
             }
 
             // "or the minification filter is neither NEAREST nor LINEAR"
             if (requiresMipmap) {
@@ -416,20 +422,22 @@ WebGLTexture::IsComplete(const char** co
         // (already covered)
     }
 
     return true;
 }
 
 
 uint32_t
-WebGLTexture::MaxEffectiveMipmapLevel() const
+WebGLTexture::MaxEffectiveMipmapLevel(uint32_t texUnit) const
 {
-    if (mMinFilter == LOCAL_GL_NEAREST ||
-        mMinFilter == LOCAL_GL_LINEAR)
+    WebGLSampler* sampler = mContext->mBoundSamplers[texUnit];
+    TexMinFilter minFilter = sampler ? sampler->mMinFilter : mMinFilter;
+    if (minFilter == LOCAL_GL_NEAREST ||
+        minFilter == LOCAL_GL_LINEAR)
     {
         // No mips used.
         return mBaseMipmapLevel;
     }
 
     const auto& imageInfo = BaseImageInfo();
     MOZ_ASSERT(imageInfo.IsDefined());
 
@@ -437,33 +445,33 @@ WebGLTexture::MaxEffectiveMipmapLevel() 
     return std::min<uint32_t>(maxLevelBySize, mMaxMipmapLevel);
 }
 
 bool
 WebGLTexture::GetFakeBlackType(const char* funcName, uint32_t texUnit,
                                FakeBlackType* const out_fakeBlack)
 {
     const char* incompleteReason;
-    if (!IsComplete(&incompleteReason)) {
+    if (!IsComplete(texUnit, &incompleteReason)) {
         if (incompleteReason) {
             mContext->GenerateWarning("%s: Active texture %u for target 0x%04x is"
                                       " 'incomplete', and will be rendered as"
                                       " RGBA(0,0,0,1), as per the GLES 2.0.24 $3.8.2: %s",
                                       funcName, texUnit, mTarget.get(),
                                       incompleteReason);
         }
         *out_fakeBlack = FakeBlackType::RGBA0001;
         return true;
     }
 
     // We may still want FakeBlack as an optimization for uninitialized image data.
     bool hasUninitializedData = false;
     bool hasInitializedData = false;
 
-    const auto maxLevel = MaxEffectiveMipmapLevel();
+    const auto maxLevel = MaxEffectiveMipmapLevel(texUnit);
     MOZ_ASSERT(mBaseMipmapLevel <= maxLevel);
     for (uint32_t level = mBaseMipmapLevel; level <= maxLevel; level++) {
         for (uint8_t face = 0; face < mFaceCount; face++) {
             const auto& cur = ImageInfoAtFace(face, level);
             if (cur.IsDataInitialized())
                 hasInitializedData = true;
             else
                 hasUninitializedData = true;
@@ -729,16 +737,22 @@ WebGLTexture::GenerateMipmap(TexTarget t
     }
 
     if (format->hasDepth) {
         mContext->ErrorInvalidOperation("generateMipmap: Depth textures are not"
                                         " supported.");
         return;
     }
 
+    if (!baseImageInfo.mFormat->isRenderable || !baseImageInfo.mFormat->isFilterable) {
+        mContext->ErrorInvalidOperation("generateMipmap: Texture at base level is not"
+                                        " color-renderable or texture-filterable.");
+        return;
+    }
+
     // Done with validation. Do the operation.
 
     mContext->MakeContextCurrent();
     gl::GLContext* gl = mContext->gl;
 
     if (gl->WorkAroundDriverBugs()) {
         // bug 696495 - to work around failures in the texture-mips.html test on various drivers, we
         // set the minification filter before calling glGenerateMipmap. This should not carry a significant performance
--- a/dom/canvas/WebGLTexture.h
+++ b/dom/canvas/WebGLTexture.h
@@ -279,17 +279,17 @@ public:
 
     ////////////////////////////////////
 
 protected:
     void ClampLevelBaseAndMax();
 
     void PopulateMipChain(uint32_t baseLevel, uint32_t maxLevel);
 
-    uint32_t MaxEffectiveMipmapLevel() const;
+    uint32_t MaxEffectiveMipmapLevel(uint32_t texUnit) const;
 
     static uint8_t FaceForTarget(TexImageTarget texImageTarget) {
         GLenum rawTexImageTarget = texImageTarget.get();
         switch (rawTexImageTarget) {
         case LOCAL_GL_TEXTURE_CUBE_MAP_POSITIVE_X:
         case LOCAL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
         case LOCAL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
         case LOCAL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
@@ -364,21 +364,21 @@ public:
     }
 
     void SetGeneratedMipmap();
 
     void SetCustomMipmap();
 
     bool AreAllLevel0ImageInfosEqual() const;
 
-    bool IsMipmapComplete() const;
+    bool IsMipmapComplete(uint32_t texUnit) const;
 
     bool IsCubeComplete() const;
 
-    bool IsComplete(const char** const out_reason) const;
+    bool IsComplete(uint32_t texUnit, const char** const out_reason) const;
 
     bool IsMipmapCubeComplete() const;
 
     bool IsCubeMap() const { return (mTarget == LOCAL_GL_TEXTURE_CUBE_MAP); }
 
     // Resolve cache optimizations
 protected:
     bool GetFakeBlackType(const char* funcName, uint32_t texUnit,
--- a/dom/canvas/test/test_canvas.html
+++ b/dom/canvas/test/test_canvas.html
@@ -11260,32 +11260,17 @@ ctx.lineWidth = 50;
 ctx.strokeStyle = '#f00';
 ctx.beginPath();
 ctx.arc(50, 50, 50, 0, Math.PI, false);
 ctx.stroke();
 isPixel(ctx, 50,25, 0,255,0,255, 0);
 isPixel(ctx, 1,1, 0,255,0,255, 0);
 isPixel(ctx, 98,1, 0,255,0,255, 0);
 isPixel(ctx, 1,48, 0,255,0,255, 0);
-// Fails on Linux with Azure/Cairo only
-// The arc is drawn badly due to Cairo limitations, the error only becomes
-// apparent on Linux because of anti-aliasing, probably due to X.
-// The limitation is that Cairo draws arcs by stroking perpendicular to the arc,
-// and at very large stroke thicknesses, this becomes a fan. Where exactly the
-// 'blades' of the fan appear seems to depend on exactly how the arc is defined
-// and the platform. So if the blades of the fan are where pixels are tested it
-// passes the test, if the testing pixels fall in between the blades, then we fail.
-// With Thebes/Cairo, we were rendering wrong, but got lucky with the test, now
-// we are not so lucky.
-// Bug 764125
-if (IsAzureCairo() && IsLinux()) {
-    todo_isPixel(ctx, 20,48, 0,255,0,255, 0);
-} else {
-    isPixel(ctx, 20,48, 0,255,0,255, 0);
-}
+isPixel(ctx, 20,48, 0,255,0,255, 0);
 isPixel(ctx, 98,48, 0,255,0,255, 0);
 
 }
 </script>
 
 <!-- [[[ test_2d.path.arc.shape.2.html ]]] -->
 
 <p>Canvas test: 2d.path.arc.shape.2</p>
--- a/dom/html/HTMLMediaElement.cpp
+++ b/dom/html/HTMLMediaElement.cpp
@@ -2116,17 +2116,18 @@ HTMLMediaElement::HTMLMediaElement(alrea
     mAudioChannelVolume(1.0),
     mPlayingThroughTheAudioChannel(false),
     mDisableVideo(false),
     mPlayBlockedBecauseHidden(false),
     mMediaStreamTrackListener(nullptr),
     mElementInTreeState(ELEMENT_NOT_INTREE),
     mHasUserInteraction(false),
     mFirstFrameLoaded(false),
-    mDefaultPlaybackStartPosition(0.0)
+    mDefaultPlaybackStartPosition(0.0),
+    mIsAudioTrackAudible(false)
 {
   mAudioChannel = AudioChannelService::GetDefaultAudioChannel();
 
   mPaused.SetOuter(this);
 
   RegisterActivityObserver();
   NotifyOwnerDocumentActivityChangedInternal();
 
@@ -5172,10 +5173,19 @@ HTMLMediaElement::IsCurrentlyPlaying() c
     if (mDecoder && mDecoder->IsSeeking() && !mPlayingBeforeSeek) {
       return false;
     }
     return true;
   }
   return false;
 }
 
+void
+HTMLMediaElement::NotifyAudibleStateChanged(bool aAudible)
+{
+  if (mIsAudioTrackAudible != aAudible) {
+    mIsAudioTrackAudible = aAudible;
+    // To do ...
+  }
+}
+
 } // namespace dom
 } // namespace mozilla
--- a/dom/html/HTMLMediaElement.h
+++ b/dom/html/HTMLMediaElement.h
@@ -392,16 +392,19 @@ public:
   {
     return mNetworkState;
   }
 
   // Called by the media decoder object, on the main thread,
   // when the connection between Rtsp server and client gets lost.
   virtual void ResetConnectionState() final override;
 
+  // Called by media decoder when the audible state changed.
+  virtual void NotifyAudibleStateChanged(bool aAudible) final override;
+
   // XPCOM GetPreload() is OK
   void SetPreload(const nsAString& aValue, ErrorResult& aRv)
   {
     SetHTMLAttr(nsGkAtoms::preload, aValue, aRv);
   }
 
   already_AddRefed<TimeRanges> Buffered() const;
 
@@ -1520,14 +1523,17 @@ private:
 
   // True if the first frame has been successfully loaded.
   bool mFirstFrameLoaded;
 
   // Media elements also have a default playback start position, which must
   // initially be set to zero seconds. This time is used to allow the element to
   // be seeked even before the media is loaded.
   double mDefaultPlaybackStartPosition;
+
+  // True if the audio track is producing audible sound.
+  bool mIsAudioTrackAudible;
 };
 
 } // namespace dom
 } // namespace mozilla
 
 #endif // mozilla_dom_HTMLMediaElement_h
--- a/dom/html/nsTextEditorState.cpp
+++ b/dom/html/nsTextEditorState.cpp
@@ -1929,16 +1929,31 @@ nsTextEditorState::SetValue(const nsAStr
     if (EditorHasComposition()) {
       // When this is called recursively, there shouldn't be composition.
       if (NS_WARN_IF(mIsCommittingComposition)) {
         // Don't request to commit composition again.  But if it occurs,
         // we should skip to set the new value to the editor here.  It should
         // be set later with the updated mValueBeingSet.
         return true;
       }
+      if (NS_WARN_IF(!mBoundFrame)) {
+        // We're not sure if this case is possible.
+      } else {
+        // If setting value won't change current value, we shouldn't commit
+        // composition for compatibility with the other browsers.
+        nsAutoString currentValue;
+        mBoundFrame->GetText(currentValue);
+        if (newValue == currentValue) {
+          // Note that in this case, we shouldn't fire any events with setting
+          // value because event handlers may try to set value recursively but
+          // we cannot commit composition at that time due to unsafe to run
+          // script (see below).
+          return true;
+        }
+      }
       // If there is composition, need to commit composition first because
       // other browsers do that.
       // NOTE: We don't need to block nested calls of this because input nor
       //       other events won't be fired by setting values and script blocker
       //       is used during setting the value to the editor.  IE also allows
       //       to set the editor value on the input event which is caused by
       //       forcibly committing composition.
       if (nsContentUtils::IsSafeToRunScript()) {
--- a/dom/media/MediaData.cpp
+++ b/dom/media/MediaData.cpp
@@ -49,16 +49,33 @@ AudioData::SizeOfIncludingThis(MallocSiz
 {
   size_t size = aMallocSizeOf(this) + aMallocSizeOf(mAudioData.get());
   if (mAudioBuffer) {
     size += mAudioBuffer->SizeOfIncludingThis(aMallocSizeOf);
   }
   return size;
 }
 
+bool
+AudioData::IsAudible() const
+{
+  if (!mAudioData) {
+    return false;
+  }
+
+  for (uint32_t frame = 0; frame < mFrames; ++frame) {
+    for (uint32_t channel = 0; channel < mChannels; ++channel) {
+      if (mAudioData[frame * mChannels + channel] != 0) {
+        return true;
+      }
+    }
+  }
+  return false;
+}
+
 /* static */
 already_AddRefed<AudioData>
 AudioData::TransferAndUpdateTimestampAndDuration(AudioData* aOther,
                                                   int64_t aTimestamp,
                                                   int64_t aDuration)
 {
   NS_ENSURE_TRUE(aOther, nullptr);
   RefPtr<AudioData> v = new AudioData(aOther->mOffset,
--- a/dom/media/MediaData.h
+++ b/dom/media/MediaData.h
@@ -144,16 +144,20 @@ public:
                                         int64_t aTimestamp,
                                         int64_t aDuration);
 
   size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const;
 
   // If mAudioBuffer is null, creates it from mAudioData.
   void EnsureAudioBuffer();
 
+  // To check whether mAudioData has audible signal, it's used to distinguish
+  // the audiable data and silent data.
+  bool IsAudible() const;
+
   const uint32_t mChannels;
   const uint32_t mRate;
   // At least one of mAudioBuffer/mAudioData must be non-null.
   // mChannels channels, each with mFrames frames
   RefPtr<SharedBuffer> mAudioBuffer;
   // mFrames frames, each with mChannels values
   UniquePtr<AudioDataValue[]> mAudioData;
 
--- a/dom/media/MediaDecoder.cpp
+++ b/dom/media/MediaDecoder.cpp
@@ -527,16 +527,18 @@ MediaDecoder::MediaDecoder(MediaDecoderO
                      MediaDecoderOwner::NEXT_FRAME_UNINITIALIZED,
                      "MediaDecoder::mNextFrameStatus (Mirror)")
   , mCurrentPosition(AbstractThread::MainThread(), 0,
                      "MediaDecoder::mCurrentPosition (Mirror)")
   , mStateMachineDuration(AbstractThread::MainThread(), NullableTimeUnit(),
                           "MediaDecoder::mStateMachineDuration (Mirror)")
   , mPlaybackPosition(AbstractThread::MainThread(), 0,
                       "MediaDecoder::mPlaybackPosition (Mirror)")
+  , mIsAudioDataAudible(AbstractThread::MainThread(), false,
+                        "MediaDecoder::mIsAudioDataAudible (Mirror)")
   , mVolume(AbstractThread::MainThread(), 0.0,
             "MediaDecoder::mVolume (Canonical)")
   , mPlaybackRate(AbstractThread::MainThread(), 1.0,
                   "MediaDecoder::mPlaybackRate (Canonical)")
   , mPreservesPitch(AbstractThread::MainThread(), true,
                     "MediaDecoder::mPreservesPitch (Canonical)")
   , mEstimatedDuration(AbstractThread::MainThread(), NullableTimeUnit(),
                        "MediaDecoder::mEstimatedDuration (Canonical)")
@@ -587,16 +589,18 @@ MediaDecoder::MediaDecoder(MediaDecoderO
   // mLogicalPosition
   mWatchManager.Watch(mCurrentPosition, &MediaDecoder::UpdateLogicalPosition);
   mWatchManager.Watch(mPlayState, &MediaDecoder::UpdateLogicalPosition);
   mWatchManager.Watch(mLogicallySeeking, &MediaDecoder::UpdateLogicalPosition);
 
   // mIgnoreProgressData
   mWatchManager.Watch(mLogicallySeeking, &MediaDecoder::SeekingChanged);
 
+  mWatchManager.Watch(mIsAudioDataAudible, &MediaDecoder::NotifyAudibleStateChanged);
+
   MediaShutdownManager::Instance().Register(this);
 }
 
 RefPtr<ShutdownPromise>
 MediaDecoder::Shutdown()
 {
   MOZ_ASSERT(NS_IsMainThread());
 
@@ -618,16 +622,18 @@ MediaDecoder::Shutdown()
   if (mDecoderStateMachine) {
     mTimedMetadataListener.Disconnect();
     mMetadataLoadedListener.Disconnect();
     mFirstFrameLoadedListener.Disconnect();
     mOnPlaybackEvent.Disconnect();
     mOnSeekingStart.Disconnect();
     mOnMediaNotSeekable.Disconnect();
 
+    mWatchManager.Unwatch(mIsAudioDataAudible, &MediaDecoder::NotifyAudibleStateChanged);
+
     shutdown = mDecoderStateMachine->BeginShutdown()
         ->Then(AbstractThread::MainThread(), __func__, this,
                &MediaDecoder::FinishShutdown,
                &MediaDecoder::FinishShutdown)
         ->CompletionPromise();
   }
 
   // Force any outstanding seek and byterange requests to complete
@@ -1468,23 +1474,25 @@ MediaDecoder::SetStateMachine(MediaDecod
 
   if (mDecoderStateMachine) {
     mStateMachineDuration.Connect(mDecoderStateMachine->CanonicalDuration());
     mBuffered.Connect(mDecoderStateMachine->CanonicalBuffered());
     mStateMachineIsShutdown.Connect(mDecoderStateMachine->CanonicalIsShutdown());
     mNextFrameStatus.Connect(mDecoderStateMachine->CanonicalNextFrameStatus());
     mCurrentPosition.Connect(mDecoderStateMachine->CanonicalCurrentPosition());
     mPlaybackPosition.Connect(mDecoderStateMachine->CanonicalPlaybackOffset());
+    mIsAudioDataAudible.Connect(mDecoderStateMachine->CanonicalIsAudioDataAudible());
   } else {
     mStateMachineDuration.DisconnectIfConnected();
     mBuffered.DisconnectIfConnected();
     mStateMachineIsShutdown.DisconnectIfConnected();
     mNextFrameStatus.DisconnectIfConnected();
     mCurrentPosition.DisconnectIfConnected();
     mPlaybackPosition.DisconnectIfConnected();
+    mIsAudioDataAudible.DisconnectIfConnected();
   }
 }
 
 ImageContainer*
 MediaDecoder::GetImageContainer()
 {
   return mVideoFrameContainer ? mVideoFrameContainer->GetImageContainer() : nullptr;
 }
@@ -1826,16 +1834,23 @@ MediaDecoder::NextFrameBufferedStatus()
     media::TimeUnit::FromMicroseconds(CurrentPosition());
   media::TimeInterval interval(currentPosition,
                                currentPosition + media::TimeUnit::FromMicroseconds(DEFAULT_NEXT_FRAME_AVAILABLE_BUFFERED));
   return GetBuffered().Contains(interval)
     ? MediaDecoderOwner::NEXT_FRAME_AVAILABLE
     : MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE;
 }
 
+void
+MediaDecoder::NotifyAudibleStateChanged()
+{
+  MOZ_ASSERT(!mShuttingDown);
+  mOwner->NotifyAudibleStateChanged(mIsAudioDataAudible);
+}
+
 MediaMemoryTracker::MediaMemoryTracker()
 {
 }
 
 void
 MediaMemoryTracker::InitMemoryReporter()
 {
   RegisterWeakAsyncMemoryReporter(this);
--- a/dom/media/MediaDecoder.h
+++ b/dom/media/MediaDecoder.h
@@ -772,16 +772,19 @@ protected:
   Mirror<media::NullableTimeUnit> mStateMachineDuration;
 
   // Current playback position in the stream. This is (approximately)
   // where we're up to playing back the stream. This is not adjusted
   // during decoder seek operations, but it's updated at the end when we
   // start playing back again.
   Mirror<int64_t> mPlaybackPosition;
 
+  // Used to distiguish whether the audio is producing sound.
+  Mirror<bool> mIsAudioDataAudible;
+
   // Volume of playback.  0.0 = muted. 1.0 = full volume.
   Canonical<double> mVolume;
 
   // PlaybackRate and pitch preservation status we should start at.
   Canonical<double> mPlaybackRate;
 
   Canonical<bool> mPreservesPitch;
 
@@ -867,16 +870,19 @@ public:
   AbstractCanonical<int64_t>* CanonicalDecoderPosition() {
     return &mDecoderPosition;
   }
   AbstractCanonical<bool>* CanonicalMediaSeekable() {
     return &mMediaSeekable;
   }
 
 private:
+  // Notify owner when the audible state changed
+  void NotifyAudibleStateChanged();
+
   /* Functions called by ResourceCallback */
 
   // A media stream is assumed to be infinite if the metadata doesn't
   // contain the duration, and range requests are not supported, and
   // no headers give a hint of a possible duration (Content-Length,
   // Content-Duration, and variants), and we cannot seek in the media
   // stream to determine the duration.
   //
--- a/dom/media/MediaDecoderOwner.h
+++ b/dom/media/MediaDecoderOwner.h
@@ -125,16 +125,19 @@ public:
   // Called by the media decoder and the video frame to get the
   // ImageContainer containing the video data.
   virtual VideoFrameContainer* GetVideoFrameContainer() = 0;
 
   // Called by the media decoder object, on the main thread,
   // when the connection between Rtsp server and client gets lost.
   virtual void ResetConnectionState() = 0;
 
+  // Called by media decoder when the audible state changed
+  virtual void NotifyAudibleStateChanged(bool aAudible) = 0;
+
 #ifdef MOZ_EME
   // Dispatches a "encrypted" event to the HTMLMediaElement, with the
   // provided init data. Actual dispatch may be delayed until HAVE_METADATA.
   // Main thread only.
   virtual void DispatchEncrypted(const nsTArray<uint8_t>& aInitData,
                                  const nsAString& aInitDataType) = 0;
 #endif // MOZ_EME
 };
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -111,16 +111,21 @@ static const int32_t LOW_VIDEO_THRESHOLD
 static const int AUDIO_DURATION_USECS = 40000;
 
 // If we increase our "low audio threshold" (see LOW_AUDIO_USECS above), we
 // use this as a factor in all our calculations. Increasing this will cause
 // us to be more likely to increase our low audio threshold, and to
 // increase it by more.
 static const int THRESHOLD_FACTOR = 2;
 
+// When the continuous silent data is over this threshold, means the a/v does
+// not produce any sound. This time is decided by UX suggestion, see
+// https://bugzilla.mozilla.org/show_bug.cgi?id=1235612#c18
+static const uint32_t SILENT_DATA_THRESHOLD_USECS = 10000000;
+
 namespace detail {
 
 // If we have less than this much undecoded data available, we'll consider
 // ourselves to be running low on undecoded data. We determine how much
 // undecoded data we have remaining using the reader's GetBuffered()
 // implementation.
 static const int64_t LOW_DATA_THRESHOLD_USECS = 5000000;
 
@@ -231,16 +236,17 @@ MediaDecoderStateMachine::MediaDecoderSt
   mCorruptFrames(60),
   mDecodingFirstFrame(true),
   mSentLoadedMetadataEvent(false),
   mSentFirstFrameLoadedEvent(false),
   mSentPlaybackEndedEvent(false),
   mOutputStreamManager(new OutputStreamManager()),
   mResource(aDecoder->GetResource()),
   mAudioOffloading(false),
+  mSilentDataDuration(0),
   mBuffered(mTaskQueue, TimeIntervals(),
             "MediaDecoderStateMachine::mBuffered (Mirror)"),
   mEstimatedDuration(mTaskQueue, NullableTimeUnit(),
                     "MediaDecoderStateMachine::mEstimatedDuration (Mirror)"),
   mExplicitDuration(mTaskQueue, Maybe<double>(),
                     "MediaDecoderStateMachine::mExplicitDuration (Mirror)"),
   mPlayState(mTaskQueue, MediaDecoder::PLAY_STATE_LOADING,
              "MediaDecoderStateMachine::mPlayState (Mirror)"),
@@ -267,17 +273,19 @@ MediaDecoderStateMachine::MediaDecoderSt
             "MediaDecoderStateMachine::mDuration (Canonical"),
   mIsShutdown(mTaskQueue, false,
               "MediaDecoderStateMachine::mIsShutdown (Canonical)"),
   mNextFrameStatus(mTaskQueue, MediaDecoderOwner::NEXT_FRAME_UNINITIALIZED,
                    "MediaDecoderStateMachine::mNextFrameStatus (Canonical)"),
   mCurrentPosition(mTaskQueue, 0,
                    "MediaDecoderStateMachine::mCurrentPosition (Canonical)"),
   mPlaybackOffset(mTaskQueue, 0,
-                  "MediaDecoderStateMachine::mPlaybackOffset (Canonical)")
+                  "MediaDecoderStateMachine::mPlaybackOffset (Canonical)"),
+  mIsAudioDataAudible(mTaskQueue, false,
+                     "MediaDecoderStateMachine::mIsAudioDataAudible (Canonical)")
 {
   MOZ_COUNT_CTOR(MediaDecoderStateMachine);
   NS_ASSERTION(NS_IsMainThread(), "Should be on main thread.");
 
   // Dispatch initialization that needs to happen on that task queue.
   nsCOMPtr<nsIRunnable> r = NS_NewRunnableMethodWithArg<RefPtr<MediaDecoder>>(
     this, &MediaDecoderStateMachine::InitializationTask, aDecoder);
   mTaskQueue->Dispatch(r.forget());
@@ -705,23 +713,45 @@ MediaDecoderStateMachine::PushFront(Medi
     VideoQueue().PushFront(aSample);
   } else {
     // TODO: Handle MediaRawData, determine which queue should be pushed.
   }
   UpdateNextFrameStatus();
 }
 
 void
+MediaDecoderStateMachine::CheckIsAudible(const MediaData* aSample)
+{
+  MOZ_ASSERT(OnTaskQueue());
+  MOZ_ASSERT(aSample->mType == MediaData::AUDIO_DATA);
+
+  const AudioData* data = aSample->As<AudioData>();
+  bool isAudible = data->IsAudible();
+  if (isAudible && !mIsAudioDataAudible) {
+    mIsAudioDataAudible = true;
+    mSilentDataDuration = 0;
+  } else if (isAudible && mIsAudioDataAudible) {
+    mSilentDataDuration += data->mDuration;
+    if (mSilentDataDuration > SILENT_DATA_THRESHOLD_USECS) {
+      mIsAudioDataAudible = false;
+      mSilentDataDuration = 0;
+    }
+  }
+}
+
+void
 MediaDecoderStateMachine::OnAudioPopped(const RefPtr<MediaData>& aSample)
 {
   MOZ_ASSERT(OnTaskQueue());
+
   mPlaybackOffset = std::max(mPlaybackOffset.Ref(), aSample->mOffset);
   UpdateNextFrameStatus();
   DispatchAudioDecodeTaskIfNeeded();
   MaybeStartBuffering();
+  CheckIsAudible(aSample);
 }
 
 void
 MediaDecoderStateMachine::OnVideoPopped(const RefPtr<MediaData>& aSample)
 {
   MOZ_ASSERT(OnTaskQueue());
   mPlaybackOffset = std::max(mPlaybackOffset.Ref(), aSample->mOffset);
   UpdateNextFrameStatus();
@@ -2163,16 +2193,17 @@ MediaDecoderStateMachine::FinishShutdown
   mDecoderPosition.DisconnectIfConnected();
   mMediaSeekable.DisconnectIfConnected();
 
   mDuration.DisconnectAll();
   mIsShutdown.DisconnectAll();
   mNextFrameStatus.DisconnectAll();
   mCurrentPosition.DisconnectAll();
   mPlaybackOffset.DisconnectAll();
+  mIsAudioDataAudible.DisconnectAll();
 
   // Shut down the watch manager before shutting down our task queue.
   mWatchManager.Shutdown();
 
   MOZ_ASSERT(mState == DECODER_STATE_SHUTDOWN,
              "How did we escape from the shutdown state?");
   DECODER_LOG("Shutting down state machine task queue");
   return OwnerThread()->BeginShutdown();
--- a/dom/media/MediaDecoderStateMachine.h
+++ b/dom/media/MediaDecoderStateMachine.h
@@ -400,16 +400,17 @@ protected:
   // aSample must not be null.
 
   void Push(MediaData* aSample, MediaData::Type aSampleType);
   void PushFront(MediaData* aSample, MediaData::Type aSampleType);
 
   void OnAudioPopped(const RefPtr<MediaData>& aSample);
   void OnVideoPopped(const RefPtr<MediaData>& aSample);
 
+  void CheckIsAudible(const MediaData* aSample);
   void VolumeChanged();
   void LogicalPlaybackRateChanged();
   void PreservesPitchChanged();
 
   MediaQueue<MediaData>& AudioQueue() { return mAudioQueue; }
   MediaQueue<MediaData>& VideoQueue() { return mVideoQueue; }
 
   // True if our buffers of decoded audio are not full, and we should
@@ -1190,16 +1191,19 @@ private:
 
   MediaEventProducer<MediaEventType> mOnPlaybackEvent;
   MediaEventProducer<MediaDecoderEventVisibility> mOnSeekingStart;
 
   // True if audio is offloading.
   // Playback will not start when audio is offloading.
   bool mAudioOffloading;
 
+  // Duration of the continuous silent data.
+  uint32_t mSilentDataDuration;
+
 #ifdef MOZ_EME
   void OnCDMProxyReady(RefPtr<CDMProxy> aProxy);
   void OnCDMProxyNotReady();
   RefPtr<CDMProxy> mCDMProxy;
   MozPromiseRequestHolder<MediaDecoder::CDMProxyPromise> mCDMProxyPromise;
 #endif
 
 private:
@@ -1258,16 +1262,19 @@ private:
   // The time of the current frame in microseconds, corresponding to the "current
   // playback position" in HTML5. This is referenced from 0, which is the initial
   // playback position.
   Canonical<int64_t> mCurrentPosition;
 
   // Current playback position in the stream in bytes.
   Canonical<int64_t> mPlaybackOffset;
 
+  // Used to distiguish whether the audio is producing sound.
+  Canonical<bool> mIsAudioDataAudible;
+
 public:
   AbstractCanonical<media::TimeIntervals>* CanonicalBuffered() {
     return mReader->CanonicalBuffered();
   }
   AbstractCanonical<media::NullableTimeUnit>* CanonicalDuration() {
     return &mDuration;
   }
   AbstractCanonical<bool>* CanonicalIsShutdown() {
@@ -1277,13 +1284,16 @@ public:
     return &mNextFrameStatus;
   }
   AbstractCanonical<int64_t>* CanonicalCurrentPosition() {
     return &mCurrentPosition;
   }
   AbstractCanonical<int64_t>* CanonicalPlaybackOffset() {
     return &mPlaybackOffset;
   }
+  AbstractCanonical<bool>* CanonicalIsAudioDataAudible() {
+    return &mIsAudioDataAudible;
+  }
 };
 
 } // namespace mozilla
 
 #endif
--- a/dom/media/gtest/MockMediaDecoderOwner.h
+++ b/dom/media/gtest/MockMediaDecoderOwner.h
@@ -42,12 +42,13 @@ public:
   void DownloadResumed(bool aForceNetworkLoading) override {}
   void NotifySuspendedByCache(bool aIsSuspended) override {}
   void NotifyDecoderPrincipalChanged() override {}
   VideoFrameContainer* GetVideoFrameContainer() override
   {
     return nullptr;
   }
   void ResetConnectionState() override {}
+  void NotifyAudibleStateChanged(bool aAudible) override {}
 };
 }
 
 #endif
--- a/dom/media/platforms/PDMFactory.cpp
+++ b/dom/media/platforms/PDMFactory.cpp
@@ -4,16 +4,19 @@
  * 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/. */
 
 #include "PDMFactory.h"
 
 #ifdef XP_WIN
 #include "WMFDecoderModule.h"
 #endif
+#ifdef MOZ_FFVPX
+#include "FFVPXRuntimeLinker.h"
+#endif
 #ifdef MOZ_FFMPEG
 #include "FFmpegRuntimeLinker.h"
 #endif
 #ifdef MOZ_APPLEMEDIA
 #include "AppleDecoderModule.h"
 #endif
 #ifdef MOZ_GONK_MEDIACODEC
 #include "GonkDecoderModule.h"
@@ -48,16 +51,20 @@ bool PDMFactory::sUseBlankDecoder = fals
 #ifdef MOZ_GONK_MEDIACODEC
 bool PDMFactory::sGonkDecoderEnabled = false;
 #endif
 #ifdef MOZ_WIDGET_ANDROID
 bool PDMFactory::sAndroidMCDecoderEnabled = false;
 bool PDMFactory::sAndroidMCDecoderPreferred = false;
 #endif
 bool PDMFactory::sGMPDecoderEnabled = false;
+#ifdef MOZ_FFVPX
+bool PDMFactory::sFFVPXDecoderEnabled = false;
+using namespace ffvpx;
+#endif
 #ifdef MOZ_FFMPEG
 bool PDMFactory::sFFmpegDecoderEnabled = false;
 #endif
 #ifdef XP_WIN
 bool PDMFactory::sWMFDecoderEnabled = false;
 #endif
 
 bool PDMFactory::sEnableFuzzingWrapper = false;
@@ -89,16 +96,20 @@ PDMFactory::Init()
 #endif
 
   Preferences::AddBoolVarCache(&sGMPDecoderEnabled,
                                "media.gmp.decoder.enabled", false);
 #ifdef MOZ_FFMPEG
   Preferences::AddBoolVarCache(&sFFmpegDecoderEnabled,
                                "media.ffmpeg.enabled", false);
 #endif
+#ifdef MOZ_FFVPX
+  Preferences::AddBoolVarCache(&sFFVPXDecoderEnabled,
+                               "media.ffvpx.enabled", false);
+#endif
 #ifdef XP_WIN
   Preferences::AddBoolVarCache(&sWMFDecoderEnabled,
                                "media.wmf.enabled", false);
 #endif
 
   Preferences::AddBoolVarCache(&sEnableFuzzingWrapper,
                                "media.decoder.fuzzing.enabled", false);
   Preferences::AddUintVarCache(&sVideoOutputMinimumInterval_ms,
@@ -107,16 +118,19 @@ PDMFactory::Init()
                                "media.decoder.fuzzing.dont-delay-inputexhausted", false);
 
 #ifdef XP_WIN
   WMFDecoderModule::Init();
 #endif
 #ifdef MOZ_APPLEMEDIA
   AppleDecoderModule::Init();
 #endif
+#ifdef MOZ_FFVPX
+  FFVPXRuntimeLinker::Link();
+#endif
 #ifdef MOZ_FFMPEG
   FFmpegRuntimeLinker::Link();
 #endif
   GMPDecoderModule::Init();
 }
 
 PDMFactory::PDMFactory()
 {
@@ -257,16 +271,22 @@ PDMFactory::CreatePDMs()
   }
 #endif
 #ifdef XP_WIN
   if (sWMFDecoderEnabled) {
     m = new WMFDecoderModule();
     StartupPDM(m);
   }
 #endif
+#ifdef MOZ_FFVPX
+  if (sFFVPXDecoderEnabled) {
+    m = FFVPXRuntimeLinker::CreateDecoderModule();
+    StartupPDM(m);
+  }
+#endif
 #ifdef MOZ_FFMPEG
   if (sFFmpegDecoderEnabled) {
     m = FFmpegRuntimeLinker::CreateDecoderModule();
     StartupPDM(m);
   }
 #endif
 #ifdef MOZ_APPLEMEDIA
   m = new AppleDecoderModule();
--- a/dom/media/platforms/PDMFactory.h
+++ b/dom/media/platforms/PDMFactory.h
@@ -68,16 +68,19 @@ private:
 #ifdef MOZ_GONK_MEDIACODEC
   static bool sGonkDecoderEnabled;
 #endif
 #ifdef MOZ_WIDGET_ANDROID
   static bool sAndroidMCDecoderPreferred;
   static bool sAndroidMCDecoderEnabled;
 #endif
   static bool sGMPDecoderEnabled;
+#ifdef MOZ_FFVPX
+  static bool sFFVPXDecoderEnabled;
+#endif
 #ifdef MOZ_FFMPEG
   static bool sFFmpegDecoderEnabled;
 #endif
 #ifdef XP_WIN
   static bool sWMFDecoderEnabled;
 #endif
   static bool sEnableFuzzingWrapper;
   static uint32_t sVideoOutputMinimumInterval_ms;
--- a/dom/media/platforms/agnostic/OpusDecoder.cpp
+++ b/dom/media/platforms/agnostic/OpusDecoder.cpp
@@ -143,16 +143,22 @@ OpusDataDecoder::DoDecode(MediaRawData* 
 
   if (mPaddingDiscarded) {
     // Discard padding should be used only on the final packet, so
     // decoding after a padding discard is invalid.
     OPUS_DEBUG("Opus error, discard padding on interstitial packet");
     return -1;
   }
 
+  if (!mLastFrameTime || mLastFrameTime.ref() != aSample->mTime) {
+    // We are starting a new block.
+    mFrames = 0;
+    mLastFrameTime = Some(aSample->mTime);
+  }
+
   // Maximum value is 63*2880, so there's no chance of overflow.
   int32_t frames_number = opus_packet_get_nb_frames(aSample->Data(),
                                                     aSample->Size());
   if (frames_number <= 0) {
     OPUS_DEBUG("Invalid packet header: r=%ld length=%ld",
                frames_number, aSample->Size());
     return -1;
   }
@@ -248,18 +254,19 @@ OpusDataDecoder::DoDecode(MediaRawData* 
   }
 #endif
 
   CheckedInt64 duration = FramesToUsecs(frames, mOpusParser->mRate);
   if (!duration.isValid()) {
     NS_WARNING("OpusDataDecoder: Int overflow converting WebM audio duration");
     return -1;
   }
-  CheckedInt64 time = startTime - FramesToUsecs(mOpusParser->mPreSkip,
-                                                mOpusParser->mRate);
+  CheckedInt64 time =
+    startTime - FramesToUsecs(mOpusParser->mPreSkip, mOpusParser->mRate) +
+    FramesToUsecs(mFrames, mOpusParser->mRate);
   if (!time.isValid()) {
     NS_WARNING("OpusDataDecoder: Int overflow shifting tstamp by codec delay");
     return -1;
   };
 
   mCallback->Output(new AudioData(aSample->mOffset,
                                   time.value(),
                                   duration.value(),
@@ -290,17 +297,17 @@ nsresult
 OpusDataDecoder::Flush()
 {
   mTaskQueue->Flush();
   if (mOpusDecoder) {
     // Reset the decoder.
     opus_multistream_decoder_ctl(mOpusDecoder, OPUS_RESET_STATE);
     mSkip = mOpusParser->mPreSkip;
     mPaddingDiscarded = false;
-    mFrames = 0;
+    mLastFrameTime.reset();
   }
   return NS_OK;
 }
 
 /* static */
 bool
 OpusDataDecoder::IsOpus(const nsACString& aMimeType)
 {
--- a/dom/media/platforms/agnostic/OpusDecoder.h
+++ b/dom/media/platforms/agnostic/OpusDecoder.h
@@ -4,16 +4,17 @@
  * 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 !defined(OpusDecoder_h_)
 #define OpusDecoder_h_
 
 #include "OpusParser.h"
 #include "PlatformDecoderModule.h"
 
+#include "mozilla/Maybe.h"
 #include "nsAutoPtr.h"
 
 namespace mozilla {
 
 class OpusDataDecoder : public MediaDataDecoder
 {
 public:
   OpusDataDecoder(const AudioInfo& aConfig,
@@ -48,12 +49,13 @@ private:
   uint16_t mSkip;        // Samples left to trim before playback.
   bool mDecodedHeader;
 
   // Opus padding should only be discarded on the final packet.  Once this
   // is set to true, if the reader attempts to decode any further packets it
   // will raise an error so we can indicate that the file is invalid.
   bool mPaddingDiscarded;
   int64_t mFrames;
+  Maybe<int64_t> mLastFrameTime;
 };
 
 } // namespace mozilla
 #endif
--- a/dom/media/platforms/agnostic/VorbisDecoder.cpp
+++ b/dom/media/platforms/agnostic/VorbisDecoder.cpp
@@ -12,19 +12,73 @@
 #include "nsAutoPtr.h"
 
 #undef LOG
 extern mozilla::LogModule* GetPDMLog();
 #define LOG(type, msg) MOZ_LOG(GetPDMLog(), type, msg)
 
 namespace mozilla {
 
-ogg_packet InitVorbisPacket(const unsigned char* aData, size_t aLength,
-                         bool aBOS, bool aEOS,
-                         int64_t aGranulepos, int64_t aPacketNo)
+VorbisPacketSampleCounter::VorbisPacketSampleCounter()
+  : mError(0)
+  , mVorbisPacketCount(0)
+{
+  vorbis_info_init(&mVorbisInfo);
+  vorbis_comment_init(&mVorbisComment);
+}
+
+bool
+VorbisPacketSampleCounter::Init(const nsTArray<const uint8_t*>& aHeaders,
+                                const nsTArray<size_t>& aHeaderLens)
+{
+  for (size_t i = 0; i < aHeaders.Length(); i++) {
+    ogg_packet pkt =
+      VorbisDataDecoder::InitVorbisPacket(aHeaders[i], aHeaderLens[i],
+                                          i == 0, false, 0, mVorbisPacketCount++);
+    if ((mError = vorbis_synthesis_headerin(&mVorbisInfo, &mVorbisComment, &pkt))) {
+      return false;
+    }
+  }
+  return true;
+}
+
+int
+VorbisPacketSampleCounter::GetNumSamples(const uint8_t* aData, size_t aLength)
+{
+  if (mError) {
+    return -1;
+  }
+  ogg_packet pkt =
+    VorbisDataDecoder::InitVorbisPacket(aData, aLength, false, false, -1, mVorbisPacketCount++);
+  long blockSize = vorbis_packet_blocksize(&mVorbisInfo, &pkt);
+  if (blockSize < 0) {
+    return blockSize;
+  }
+  int nsamples;
+  if (mVorbisLastBlockSize) {
+    nsamples = mVorbisLastBlockSize.ref() / 4 + blockSize / 4;
+  } else {
+    // The first packet will output no audio, so set its count as 0.
+    nsamples = 0;
+  }
+  mVorbisLastBlockSize = Some(blockSize);
+  return nsamples;
+}
+
+VorbisPacketSampleCounter::~VorbisPacketSampleCounter()
+{
+  vorbis_info_clear(&mVorbisInfo);
+  vorbis_comment_clear(&mVorbisComment);
+}
+
+/* static */
+ogg_packet
+VorbisDataDecoder::InitVorbisPacket(const unsigned char* aData, size_t aLength,
+                                    bool aBOS, bool aEOS,
+                                    int64_t aGranulepos, int64_t aPacketNo)
 {
   ogg_packet packet;
   packet.packet = const_cast<unsigned char*>(aData);
   packet.bytes = aLength;
   packet.b_o_s = aBOS;
   packet.e_o_s = aEOS;
   packet.granulepos = aGranulepos;
   packet.packetno = aPacketNo;
--- a/dom/media/platforms/agnostic/VorbisDecoder.h
+++ b/dom/media/platforms/agnostic/VorbisDecoder.h
@@ -12,16 +12,35 @@
 #ifdef MOZ_TREMOR
 #include "tremor/ivorbiscodec.h"
 #else
 #include "vorbis/codec.h"
 #endif
 
 namespace mozilla {
 
+class VorbisPacketSampleCounter
+{
+public:
+  VorbisPacketSampleCounter();
+  ~VorbisPacketSampleCounter();
+
+  bool Init(const nsTArray<const uint8_t*>& aHeaders,
+            const nsTArray<size_t>& aHeaderLens);
+  int GetNumSamples(const uint8_t* aData, size_t aLength);
+  void Reset() { mVorbisLastBlockSize.reset(); }
+
+private:
+  int mError;
+  vorbis_info mVorbisInfo;
+  vorbis_comment mVorbisComment;
+  int64_t mVorbisPacketCount;
+  Maybe<long> mVorbisLastBlockSize;
+};
+
 class VorbisDataDecoder : public MediaDataDecoder
 {
 public:
   VorbisDataDecoder(const AudioInfo& aConfig,
                 FlushableTaskQueue* aTaskQueue,
                 MediaDataDecoderCallback* aCallback);
   ~VorbisDataDecoder();
 
@@ -29,16 +48,20 @@ public:
   nsresult Input(MediaRawData* aSample) override;
   nsresult Flush() override;
   nsresult Drain() override;
   nsresult Shutdown() override;
 
   // Return true if mimetype is Vorbis
   static bool IsVorbis(const nsACString& aMimeType);
 
+  static ogg_packet InitVorbisPacket(const unsigned char* aData, size_t aLength,
+                                     bool aBOS, bool aEOS,
+                                     int64_t aGranulepos, int64_t aPacketNo);
+
 private:
   nsresult DecodeHeader(const unsigned char* aData, size_t aLength);
 
   void Decode (MediaRawData* aSample);
   int DoDecode (MediaRawData* aSample);
   void DoDrain ();
 
   const AudioInfo& mInfo;
--- a/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp
+++ b/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp
@@ -96,34 +96,34 @@ CopyAndPackAudio(AVFrame* aFrame, uint32
   return audio;
 }
 
 void
 FFmpegAudioDecoder<LIBAV_VER>::DecodePacket(MediaRawData* aSample)
 {
   MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
   AVPacket packet;
-  av_init_packet(&packet);
+  AV_CALL(av_init_packet(&packet));
 
   packet.data = const_cast<uint8_t*>(aSample->Data());
   packet.size = aSample->Size();
 
   if (!PrepareFrame()) {
     NS_WARNING("FFmpeg audio decoder failed to allocate frame.");
     mCallback->Error();
     return;
   }
 
   int64_t samplePosition = aSample->mOffset;
   media::TimeUnit pts = media::TimeUnit::FromMicroseconds(aSample->mTime);
 
   while (packet.size > 0) {
     int decoded;
     int bytesConsumed =
-      avcodec_decode_audio4(mCodecContext, mFrame, &decoded, &packet);
+      AV_CALL(avcodec_decode_audio4(mCodecContext, mFrame, &decoded, &packet));
 
     if (bytesConsumed < 0) {
       NS_WARNING("FFmpeg audio decoder error.");
       mCallback->Error();
       return;
     }
 
     if (decoded) {
--- a/dom/media/platforms/ffmpeg/FFmpegDataDecoder.cpp
+++ b/dom/media/platforms/ffmpeg/FFmpegDataDecoder.cpp
@@ -49,17 +49,17 @@ FFmpegDataDecoder<LIBAV_VER>::InitDecode
   AVCodec* codec = FindAVCodec(mCodecID);
   if (!codec) {
     NS_WARNING("Couldn't find ffmpeg decoder");
     return NS_ERROR_FAILURE;
   }
 
   StaticMutexAutoLock mon(sMonitor);
 
-  if (!(mCodecContext = avcodec_alloc_context3(codec))) {
+  if (!(mCodecContext = AV_CALL(avcodec_alloc_context3(codec)))) {
     NS_WARNING("Couldn't init ffmpeg context");
     return NS_ERROR_FAILURE;
   }
 
   mCodecContext->opaque = this;
 
   InitCodecContext();
 
@@ -72,20 +72,20 @@ FFmpegDataDecoder<LIBAV_VER>::InitDecode
   } else {
     mCodecContext->extradata_size = 0;
   }
 
   if (codec->capabilities & CODEC_CAP_DR1) {
     mCodecContext->flags |= CODEC_FLAG_EMU_EDGE;
   }
 
-  if (avcodec_open2(mCodecContext, codec, nullptr) < 0) {
+  if (AV_CALL(avcodec_open2(mCodecContext, codec, nullptr)) < 0) {
     NS_WARNING("Couldn't initialise ffmpeg decoder");
-    avcodec_close(mCodecContext);
-    av_freep(&mCodecContext);
+    AV_CALL(avcodec_close(mCodecContext));
+    AV_CALL(av_freep(&mCodecContext));
     return NS_ERROR_FAILURE;
   }
 
   if (mCodecContext->codec_type == AVMEDIA_TYPE_AUDIO &&
       mCodecContext->sample_fmt != AV_SAMPLE_FMT_FLT &&
       mCodecContext->sample_fmt != AV_SAMPLE_FMT_FLTP &&
       mCodecContext->sample_fmt != AV_SAMPLE_FMT_S16 &&
       mCodecContext->sample_fmt != AV_SAMPLE_FMT_S16P) {
@@ -136,73 +136,73 @@ FFmpegDataDecoder<LIBAV_VER>::Drain()
   return NS_OK;
 }
 
 void
 FFmpegDataDecoder<LIBAV_VER>::ProcessFlush()
 {
   MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
   if (mCodecContext) {
-    avcodec_flush_buffers(mCodecContext);
+    AV_CALL(avcodec_flush_buffers(mCodecContext));
   }
   MonitorAutoLock mon(mMonitor);
   mIsFlushing = false;
   mon.NotifyAll();
 }
 
 void
 FFmpegDataDecoder<LIBAV_VER>::ProcessShutdown()
 {
   StaticMutexAutoLock mon(sMonitor);
 
   if (sFFmpegInitDone && mCodecContext) {
-    avcodec_close(mCodecContext);
-    av_freep(&mCodecContext);
+    AV_CALL(avcodec_close(mCodecContext));
+    AV_CALL(av_freep(&mCodecContext));
 #if LIBAVCODEC_VERSION_MAJOR >= 55
-    av_frame_free(&mFrame);
+    AV_CALL(av_frame_free(&mFrame));
 #elif LIBAVCODEC_VERSION_MAJOR == 54
-    avcodec_free_frame(&mFrame);
+    AV_CALL(avcodec_free_frame(&mFrame));
 #else
     delete mFrame;
     mFrame = nullptr;
 #endif
   }
 }
 
 AVFrame*
 FFmpegDataDecoder<LIBAV_VER>::PrepareFrame()
 {
   MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
 #if LIBAVCODEC_VERSION_MAJOR >= 55
   if (mFrame) {
-    av_frame_unref(mFrame);
+    AV_CALL(av_frame_unref(mFrame));
   } else {
-    mFrame = av_frame_alloc();
+    mFrame = AV_CALL(av_frame_alloc());
   }
 #elif LIBAVCODEC_VERSION_MAJOR == 54
   if (mFrame) {
-    avcodec_get_frame_defaults(mFrame);
+    AV_CALL(avcodec_get_frame_defaults(mFrame));
   } else {
-    mFrame = avcodec_alloc_frame();
+    mFrame = AV_CALL(avcodec_alloc_frame());
   }
 #else
   delete mFrame;
   mFrame = new AVFrame;
-  avcodec_get_frame_defaults(mFrame);
+  AV_CALL(avcodec_get_frame_defaults(mFrame));
 #endif
   return mFrame;
 }
 
 /* static */ AVCodec*
 FFmpegDataDecoder<LIBAV_VER>::FindAVCodec(AVCodecID aCodec)
 {
   StaticMutexAutoLock mon(sMonitor);
   if (!sFFmpegInitDone) {
-    avcodec_register_all();
+    AV_CALL(avcodec_register_all());
 #ifdef DEBUG
-    av_log_set_level(AV_LOG_DEBUG);
+    AV_CALL(av_log_set_level(AV_LOG_DEBUG));
 #endif
     sFFmpegInitDone = true;
   }
-  return avcodec_find_decoder(aCodec);
+  return AV_CALL(avcodec_find_decoder(aCodec));
 }
   
 } // namespace mozilla
--- a/dom/media/platforms/ffmpeg/FFmpegDecoderModule.h
+++ b/dom/media/platforms/ffmpeg/FFmpegDecoderModule.h
@@ -4,17 +4,17 @@
  * 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 __FFmpegDecoderModule_h__
 #define __FFmpegDecoderModule_h__
 
 #include "PlatformDecoderModule.h"
 #include "FFmpegAudioDecoder.h"
-#include "FFmpegH264Decoder.h"
+#include "FFmpegVideoDecoder.h"
 
 namespace mozilla
 {
 
 template <int V>
 class FFmpegDecoderModule : public PlatformDecoderModule
 {
 public:
@@ -32,35 +32,43 @@ public:
   already_AddRefed<MediaDataDecoder>
   CreateVideoDecoder(const VideoInfo& aConfig,
                      layers::LayersBackend aLayersBackend,
                      layers::ImageContainer* aImageContainer,
                      FlushableTaskQueue* aVideoTaskQueue,
                      MediaDataDecoderCallback* aCallback) override
   {
     RefPtr<MediaDataDecoder> decoder =
-      new FFmpegH264Decoder<V>(aVideoTaskQueue, aCallback, aConfig,
-                               aImageContainer);
+      new FFmpegVideoDecoder<V>(aVideoTaskQueue, aCallback, aConfig,
+                                aImageContainer);
     return decoder.forget();
   }
 
   already_AddRefed<MediaDataDecoder>
   CreateAudioDecoder(const AudioInfo& aConfig,
                      FlushableTaskQueue* aAudioTaskQueue,
                      MediaDataDecoderCallback* aCallback) override
   {
+#ifdef USING_MOZFFVPX
+    return nullptr;
+#else
     RefPtr<MediaDataDecoder> decoder =
       new FFmpegAudioDecoder<V>(aAudioTaskQueue, aCallback, aConfig);
     return decoder.forget();
+#endif
   }
 
   bool SupportsMimeType(const nsACString& aMimeType) const override
   {
+#ifdef USING_MOZFFVPX
+    AVCodecID audioCodec = AV_CODEC_ID_NONE;
+#else
     AVCodecID audioCodec = FFmpegAudioDecoder<V>::GetCodecId(aMimeType);
-    AVCodecID videoCodec = FFmpegH264Decoder<V>::GetCodecId(aMimeType);
+#endif
+    AVCodecID videoCodec = FFmpegVideoDecoder<V>::GetCodecId(aMimeType);
     if (audioCodec == AV_CODEC_ID_NONE && videoCodec == AV_CODEC_ID_NONE) {
       return false;
     }
     AVCodecID codec = audioCodec != AV_CODEC_ID_NONE ? audioCodec : videoCodec;
     return !!FFmpegDataDecoder<V>::FindAVCodec(codec);
   }
 
   ConversionRequired
--- a/dom/media/platforms/ffmpeg/FFmpegLibs.h
+++ b/dom/media/platforms/ffmpeg/FFmpegLibs.h
@@ -26,19 +26,34 @@ extern "C" {
 #define AV_CODEC_ID_H264 CODEC_ID_H264
 #define AV_CODEC_ID_AAC CODEC_ID_AAC
 #define AV_CODEC_ID_MP3 CODEC_ID_MP3
 #define AV_CODEC_ID_VP8 CODEC_ID_VP8
 #define AV_CODEC_ID_NONE CODEC_ID_NONE
 typedef CodecID AVCodecID;
 #endif
 
+#ifdef FFVPX_VERSION
+enum { LIBAV_VER = FFVPX_VERSION };
+#else
 enum { LIBAV_VER = LIBAVCODEC_VERSION_MAJOR };
+#endif
 
 namespace mozilla {
 
+#ifdef USING_MOZFFVPX
+namespace ffvpx {
+#endif
+
 #define AV_FUNC(func, ver) extern decltype(func)* func;
 #include "FFmpegFunctionList.h"
 #undef AV_FUNC
 
+#ifdef USING_MOZFFVPX
+} // namespace ffvpx
+#define AV_CALL(func) mozilla::ffvpx::func
+#else
+#define AV_CALL(func) mozilla::func
+#endif
+
 }
 
 #endif // __FFmpegLibs_h__
--- a/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp
+++ b/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp
@@ -2,28 +2,19 @@
 /* vim:set ts=2 sw=2 sts=2 et cindent: */
 /* 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/. */
 
 #include "FFmpegRuntimeLinker.h"
 #include "mozilla/ArrayUtils.h"
 #include "FFmpegLog.h"
-#include "mozilla/Preferences.h"
 #include "mozilla/Types.h"
-#include "nsIFile.h"
-#include "nsXPCOMPrivate.h" // for XUL_DLL
-#include "prmem.h"
 #include "prlink.h"
 
-#if defined(XP_WIN)
-#include "libavcodec/avcodec.h"
-#include "libavutil/avutil.h"
-#endif
-
 namespace mozilla
 {
 
 FFmpegRuntimeLinker::LinkStatus FFmpegRuntimeLinker::sLinkStatus =
   LinkStatus_INIT;
 
 template <int V> class FFmpegDecoderModule
 {
@@ -72,17 +63,16 @@ MozAVLink(const char* aName)
 }
 
 /* static */ bool
 FFmpegRuntimeLinker::Link()
 {
   if (sLinkStatus) {
     return sLinkStatus == LinkStatus_SUCCEEDED;
   }
-
   MOZ_ASSERT(NS_IsMainThread());
 
   for (size_t i = 0; i < ArrayLength(sLibs); i++) {
     const char* lib = sLibs[i];
     sLinkedLib = MozAVLink(lib);
     if (sLinkedLib) {
       sLinkedUtilLib = sLinkedLib;
       if (Bind(lib)) {
@@ -95,64 +85,16 @@ FFmpegRuntimeLinker::Link()
   }
 
   FFMPEG_LOG("H264/AAC codecs unsupported without [");
   for (size_t i = 0; i < ArrayLength(sLibs); i++) {
     FFMPEG_LOG("%s %s", i ? "," : "", sLibs[i]);
   }
   FFMPEG_LOG(" ]\n");
 
-#ifdef MOZ_FFVPX
-  // We retrieve the path of the XUL library as this is where mozavcodec and
-  // mozavutil libs are located.
-  char* path =
-    PR_GetLibraryFilePathname(XUL_DLL, (PRFuncPtr)&FFmpegRuntimeLinker::Link);
-  if (!path) {
-    return false;
-  }
-  nsCOMPtr<nsIFile> xulFile = do_CreateInstance(NS_LOCAL_FILE_CONTRACTID);
-  if (!xulFile ||
-      NS_FAILED(xulFile->InitWithNativePath(nsDependentCString(path)))) {
-    PR_Free(path);
-    return false;
-  }
-  PR_Free(path);
-
-  nsCOMPtr<nsIFile> rootDir;
-  if (NS_FAILED(xulFile->GetParent(getter_AddRefs(rootDir))) || !rootDir) {
-    return false;
-  }
-  nsAutoCString rootPath;
-  if (NS_FAILED(rootDir->GetNativePath(rootPath))) {
-    return false;
-  }
-
-  char* libname = NULL;
-  /* Get the platform-dependent library name of the module */
-  libname = PR_GetLibraryName(rootPath.get(), "mozavutil");
-  if (!libname) {
-    return false;
-  }
-  sLinkedUtilLib = MozAVLink(libname);
-  PR_FreeLibraryName(libname);
-  libname = PR_GetLibraryName(rootPath.get(), "mozavcodec");
-  if (!libname) {
-    Unlink();
-    return false;
-  }
-  sLinkedLib = MozAVLink(libname);
-  PR_FreeLibraryName(libname);
-  if (sLinkedLib && sLinkedUtilLib) {
-    if (Bind("mozavcodec")) {
-      sLinkStatus = LinkStatus_SUCCEEDED;
-      return true;
-    }
-  }
-#endif
-
   Unlink();
 
   sLinkStatus = LinkStatus_FAILED;
   return false;
 }
 
 /* static */ bool
 FFmpegRuntimeLinker::Bind(const char* aLibName)
@@ -213,22 +155,20 @@ FFmpegRuntimeLinker::CreateDecoderModule
   }
   uint32_t major, minor, micro;
   if (!GetVersion(major, minor, micro)) {
     return  nullptr;
   }
 
   RefPtr<PlatformDecoderModule> module;
   switch (major) {
-#ifndef XP_WIN
     case 53: module = FFmpegDecoderModule<53>::Create(); break;
     case 54: module = FFmpegDecoderModule<54>::Create(); break;
     case 55:
     case 56: module = FFmpegDecoderModule<55>::Create(); break;
-#endif
     case 57: module = FFmpegDecoderModule<57>::Create(); break;
     default: module = nullptr;
   }
   return module.forget();
 }
 
 /* static */ void
 FFmpegRuntimeLinker::Unlink()
rename from dom/media/platforms/ffmpeg/FFmpegH264Decoder.cpp
rename to dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
--- a/dom/media/platforms/ffmpeg/FFmpegH264Decoder.cpp
+++ b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
@@ -7,17 +7,17 @@
 #include "mozilla/TaskQueue.h"
 
 #include "nsThreadUtils.h"
 #include "nsAutoPtr.h"
 #include "ImageContainer.h"
 
 #include "MediaInfo.h"
 
-#include "FFmpegH264Decoder.h"
+#include "FFmpegVideoDecoder.h"
 #include "FFmpegLog.h"
 #include "mozilla/PodOperations.h"
 
 #include "libavutil/pixfmt.h"
 #if LIBAVCODEC_VERSION_MAJOR < 54
 #define AVPixelFormat PixelFormat
 #define AV_PIX_FMT_YUV420P PIX_FMT_YUV420P
 #define AV_PIX_FMT_YUVJ420P PIX_FMT_YUVJ420P
@@ -54,26 +54,26 @@ ChoosePixelFormat(AVCodecContext* aCodec
         break;
     }
   }
 
   NS_WARNING("FFmpeg does not share any supported pixel formats.");
   return AV_PIX_FMT_NONE;
 }
 
-FFmpegH264Decoder<LIBAV_VER>::PtsCorrectionContext::PtsCorrectionContext()
+FFmpegVideoDecoder<LIBAV_VER>::PtsCorrectionContext::PtsCorrectionContext()
   : mNumFaultyPts(0)
   , mNumFaultyDts(0)
   , mLastPts(INT64_MIN)
   , mLastDts(INT64_MIN)
 {
 }
 
 int64_t
-FFmpegH264Decoder<LIBAV_VER>::PtsCorrectionContext::GuessCorrectPts(int64_t aPts, int64_t aDts)
+FFmpegVideoDecoder<LIBAV_VER>::PtsCorrectionContext::GuessCorrectPts(int64_t aPts, int64_t aDts)
 {
   int64_t pts = AV_NOPTS_VALUE;
 
   if (aDts != int64_t(AV_NOPTS_VALUE)) {
     mNumFaultyDts += aDts <= mLastDts;
     mLastDts = aDts;
   }
   if (aPts != int64_t(AV_NOPTS_VALUE)) {
@@ -85,52 +85,52 @@ FFmpegH264Decoder<LIBAV_VER>::PtsCorrect
     pts = aPts;
   } else {
     pts = aDts;
   }
   return pts;
 }
 
 void
-FFmpegH264Decoder<LIBAV_VER>::PtsCorrectionContext::Reset()
+FFmpegVideoDecoder<LIBAV_VER>::PtsCorrectionContext::Reset()
 {
   mNumFaultyPts = 0;
   mNumFaultyDts = 0;
   mLastPts = INT64_MIN;
   mLastDts = INT64_MIN;
 }
 
-FFmpegH264Decoder<LIBAV_VER>::FFmpegH264Decoder(
+FFmpegVideoDecoder<LIBAV_VER>::FFmpegVideoDecoder(
   FlushableTaskQueue* aTaskQueue, MediaDataDecoderCallback* aCallback,
   const VideoInfo& aConfig,
   ImageContainer* aImageContainer)
   : FFmpegDataDecoder(aTaskQueue, aCallback, GetCodecId(aConfig.mMimeType))
   , mImageContainer(aImageContainer)
   , mDisplay(aConfig.mDisplay)
   , mImage(aConfig.mImage)
   , mCodecParser(nullptr)
 {
-  MOZ_COUNT_CTOR(FFmpegH264Decoder);
+  MOZ_COUNT_CTOR(FFmpegVideoDecoder);
   // Use a new MediaByteBuffer as the object will be modified during initialization.
   mExtraData = new MediaByteBuffer;
   mExtraData->AppendElements(*aConfig.mExtraData);
 }
 
 RefPtr<MediaDataDecoder::InitPromise>
-FFmpegH264Decoder<LIBAV_VER>::Init()
+FFmpegVideoDecoder<LIBAV_VER>::Init()
 {
   if (NS_FAILED(InitDecoder())) {
     return InitPromise::CreateAndReject(DecoderFailureReason::INIT_ERROR, __func__);
   }
 
   return InitPromise::CreateAndResolve(TrackInfo::kVideoTrack, __func__);
 }
 
 void
-FFmpegH264Decoder<LIBAV_VER>::InitCodecContext()
+FFmpegVideoDecoder<LIBAV_VER>::InitCodecContext()
 {
   mCodecContext->width = mImage.width;
   mCodecContext->height = mImage.height;
 
   // We use the same logic as libvpx in determining the number of threads to use
   // so that we end up behaving in the same fashion when using ffmpeg as
   // we would otherwise cause various crashes (see bug 1236167)
   int decode_threads = 1;
@@ -146,44 +146,44 @@ FFmpegH264Decoder<LIBAV_VER>::InitCodecC
   mCodecContext->thread_count = decode_threads;
   if (decode_threads > 1) {
     mCodecContext->thread_type = FF_THREAD_SLICE | FF_THREAD_FRAME;
   }
 
   // FFmpeg will call back to this to negotiate a video pixel format.
   mCodecContext->get_format = ChoosePixelFormat;
 
-  mCodecParser = av_parser_init(mCodecID);
+  mCodecParser = AV_CALL(av_parser_init(mCodecID));
   if (mCodecParser) {
     mCodecParser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
   }
 }
 
-FFmpegH264Decoder<LIBAV_VER>::DecodeResult
-FFmpegH264Decoder<LIBAV_VER>::DoDecodeFrame(MediaRawData* aSample)
+FFmpegVideoDecoder<LIBAV_VER>::DecodeResult
+FFmpegVideoDecoder<LIBAV_VER>::DoDecodeFrame(MediaRawData* aSample)
 {
   MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
 
   uint8_t* inputData = const_cast<uint8_t*>(aSample->Data());
   size_t inputSize = aSample->Size();
 
 #if LIBAVCODEC_VERSION_MAJOR >= 54
   if (inputSize && mCodecParser && (mCodecID == AV_CODEC_ID_VP8
 #if LIBAVCODEC_VERSION_MAJOR >= 55
       || mCodecID == AV_CODEC_ID_VP9
 #endif
       )) {
     bool gotFrame = false;
     while (inputSize) {
       uint8_t* data;
       int size;
-      int len = av_parser_parse2(mCodecParser, mCodecContext, &data, &size,
-                                 inputData, inputSize,
-                                 aSample->mTime, aSample->mTimecode,
-                                 aSample->mOffset);
+      int len = AV_CALL(av_parser_parse2(mCodecParser, mCodecContext, &data, &size,
+                                         inputData, inputSize,
+                                         aSample->mTime, aSample->mTimecode,
+                                         aSample->mOffset));
       if (size_t(len) > inputSize) {
         mCallback->Error();
         return DecodeResult::DECODE_ERROR;
       }
       inputData += len;
       inputSize -= len;
       if (size) {
         switch (DoDecodeFrame(aSample, data, size)) {
@@ -198,24 +198,24 @@ FFmpegH264Decoder<LIBAV_VER>::DoDecodeFr
       }
     }
     return gotFrame ? DecodeResult::DECODE_FRAME : DecodeResult::DECODE_NO_FRAME;
   }
 #endif
   return DoDecodeFrame(aSample, inputData, inputSize);
 }
 
-FFmpegH264Decoder<LIBAV_VER>::DecodeResult
-FFmpegH264Decoder<LIBAV_VER>::DoDecodeFrame(MediaRawData* aSample,
+FFmpegVideoDecoder<LIBAV_VER>::DecodeResult
+FFmpegVideoDecoder<LIBAV_VER>::DoDecodeFrame(MediaRawData* aSample,
                                             uint8_t* aData, int aSize)
 {
   MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
 
   AVPacket packet;
-  av_init_packet(&packet);
+  AV_CALL(av_init_packet(&packet));
 
   packet.data = aData;
   packet.size = aSize;
   packet.dts = aSample->mTimecode;
   packet.pts = aSample->mTime;
   packet.flags = aSample->mKeyframe ? AV_PKT_FLAG_KEY : 0;
   packet.pos = aSample->mOffset;
 
@@ -232,17 +232,17 @@ FFmpegH264Decoder<LIBAV_VER>::DoDecodeFr
     return DecodeResult::DECODE_ERROR;
   }
 
   // Required with old version of FFmpeg/LibAV
   mFrame->reordered_opaque = AV_NOPTS_VALUE;
 
   int decoded;
   int bytesConsumed =
-    avcodec_decode_video2(mCodecContext, mFrame, &decoded, &packet);
+    AV_CALL(avcodec_decode_video2(mCodecContext, mFrame, &decoded, &packet));
 
   FFMPEG_LOG("DoDecodeFrame:decode_video: rv=%d decoded=%d "
              "(Input: pts(%lld) dts(%lld) Output: pts(%lld) "
              "opaque(%lld) pkt_pts(%lld) pkt_dts(%lld))",
              bytesConsumed, decoded, packet.pts, packet.dts, mFrame->pts,
              mFrame->reordered_opaque, mFrame->pkt_pts, mFrame->pkt_dts);
 
   if (bytesConsumed < 0) {
@@ -312,67 +312,67 @@ FFmpegH264Decoder<LIBAV_VER>::DoDecodeFr
     }
     mCallback->Output(v);
     return DecodeResult::DECODE_FRAME;
   }
   return DecodeResult::DECODE_NO_FRAME;
 }
 
 void
-FFmpegH264Decoder<LIBAV_VER>::DecodeFrame(MediaRawData* aSample)
+FFmpegVideoDecoder<LIBAV_VER>::DecodeFrame(MediaRawData* aSample)
 {
   MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
 
   if (DoDecodeFrame(aSample) != DecodeResult::DECODE_ERROR &&
       mTaskQueue->IsEmpty()) {
     mCallback->InputExhausted();
   }
 }
 
 nsresult
-FFmpegH264Decoder<LIBAV_VER>::Input(MediaRawData* aSample)
+FFmpegVideoDecoder<LIBAV_VER>::Input(MediaRawData* aSample)
 {
   nsCOMPtr<nsIRunnable> runnable(
     NS_NewRunnableMethodWithArg<RefPtr<MediaRawData>>(
-      this, &FFmpegH264Decoder<LIBAV_VER>::DecodeFrame,
+      this, &FFmpegVideoDecoder<LIBAV_VER>::DecodeFrame,
       RefPtr<MediaRawData>(aSample)));
   mTaskQueue->Dispatch(runnable.forget());
 
   return NS_OK;
 }
 
 void
-FFmpegH264Decoder<LIBAV_VER>::ProcessDrain()
+FFmpegVideoDecoder<LIBAV_VER>::ProcessDrain()
 {
   MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn());
   RefPtr<MediaRawData> empty(new MediaRawData());
   while (DoDecodeFrame(empty) == DecodeResult::DECODE_FRAME) {
   }
   mCallback->DrainComplete();
 }
 
 void
-FFmpegH264Decoder<LIBAV_VER>::ProcessFlush()
+FFmpegVideoDecoder<LIBAV_VER>::ProcessFlush()
 {
   mPtsContext.Reset();
   mDurationMap.Clear();
   FFmpegDataDecoder::ProcessFlush();
 }
 
-FFmpegH264Decoder<LIBAV_VER>::~FFmpegH264Decoder()
+FFmpegVideoDecoder<LIBAV_VER>::~FFmpegVideoDecoder()
 {
-  MOZ_COUNT_DTOR(FFmpegH264Decoder);
+  MOZ_COUNT_DTOR(FFmpegVideoDecoder);
   if (mCodecParser) {
-    av_parser_close(mCodecParser);
+    AV_CALL(av_parser_close(mCodecParser));
     mCodecParser = nullptr;
   }
 }
 
 AVCodecID
-FFmpegH264Decoder<LIBAV_VER>::GetCodecId(const nsACString& aMimeType)
+FFmpegVideoDecoder<LIBAV_VER>::GetCodecId(const nsACString& aMimeType)
 {
   if (aMimeType.EqualsLiteral("video/avc") || aMimeType.EqualsLiteral("video/mp4")) {
     return AV_CODEC_ID_H264;
   }
 
   if (aMimeType.EqualsLiteral("video/x-vnd.on2.vp6")) {
     return AV_CODEC_ID_VP6F;
   }
rename from dom/media/platforms/ffmpeg/FFmpegH264Decoder.h
rename to dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h
--- a/dom/media/platforms/ffmpeg/FFmpegH264Decoder.h
+++ b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h
@@ -1,47 +1,47 @@
 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* vim:set ts=2 sw=2 sts=2 et cindent: */
 /* 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 __FFmpegH264Decoder_h__
-#define __FFmpegH264Decoder_h__
+#ifndef __FFmpegVideoDecoder_h__
+#define __FFmpegVideoDecoder_h__
 
 #include "FFmpegDataDecoder.h"
 #include "mozilla/Pair.h"
 #include "nsTArray.h"
 
 namespace mozilla
 {
 
 template <int V>
-class FFmpegH264Decoder : public FFmpegDataDecoder<V>
+class FFmpegVideoDecoder : public FFmpegDataDecoder<V>
 {
 };
 
 template <>
-class FFmpegH264Decoder<LIBAV_VER> : public FFmpegDataDecoder<LIBAV_VER>
+class FFmpegVideoDecoder<LIBAV_VER> : public FFmpegDataDecoder<LIBAV_VER>
 {
   typedef mozilla::layers::Image Image;
   typedef mozilla::layers::ImageContainer ImageContainer;
 
   enum DecodeResult {
     DECODE_FRAME,
     DECODE_NO_FRAME,
     DECODE_ERROR
   };
 
 public:
-  FFmpegH264Decoder(FlushableTaskQueue* aTaskQueue,
+  FFmpegVideoDecoder(FlushableTaskQueue* aTaskQueue,
                     MediaDataDecoderCallback* aCallback,
                     const VideoInfo& aConfig,
                     ImageContainer* aImageContainer);
-  virtual ~FFmpegH264Decoder();
+  virtual ~FFmpegVideoDecoder();
 
   RefPtr<InitPromise> Init() override;
   nsresult Input(MediaRawData* aSample) override;
   void ProcessDrain() override;
   void ProcessFlush() override;
   void InitCodecContext() override;
   static AVCodecID GetCodecId(const nsACString& aMimeType);
 
@@ -117,9 +117,9 @@ private:
     nsAutoTArray<DurationElement, 16> mMap;
   };
 
   DurationMap mDurationMap;
 };
 
 } // namespace mozilla
 
-#endif // __FFmpegH264Decoder_h__
+#endif // __FFmpegVideoDecoder_h__
--- a/dom/media/platforms/ffmpeg/ffmpeg57/moz.build
+++ b/dom/media/platforms/ffmpeg/ffmpeg57/moz.build
@@ -3,27 +3,23 @@
 # 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/.
 
 UNIFIED_SOURCES += [
     '../FFmpegAudioDecoder.cpp',
     '../FFmpegDataDecoder.cpp',
     '../FFmpegDecoderModule.cpp',
-    '../FFmpegH264Decoder.cpp',
+    '../FFmpegVideoDecoder.cpp',
 ]
 LOCAL_INCLUDES += [
     '..',
     'include',
 ]
 
 if CONFIG['GNU_CXX']:
   CXXFLAGS += [ '-Wno-deprecated-declarations' ]
 if CONFIG['CLANG_CXX']:
   CXXFLAGS += [
     '-Wno-unknown-attributes',
   ]
-if CONFIG['_MSC_VER']:
-  CXXFLAGS += [
-    '-wd4996', # deprecated declaration
-  ]
 
 FINAL_LIBRARY = 'xul'
new file mode 100644
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/ffvpx/FFVPXRuntimeLinker.cpp
@@ -0,0 +1,162 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* 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/. */
+
+#include "FFVPXRuntimeLinker.h"
+#include "FFmpegRuntimeLinker.h"
+#include "FFmpegLog.h"
+#include "mozilla/Types.h"
+#include "nsIFile.h"
+#include "nsXPCOMPrivate.h" // for XUL_DLL
+#include "prmem.h"
+#include "prlink.h"
+
+#if defined(XP_WIN)
+#include "libavcodec/avcodec.h"
+#include "libavutil/avutil.h"
+#endif
+
+namespace mozilla
+{
+
+template <int V> class FFmpegDecoderModule
+{
+public:
+  static already_AddRefed<PlatformDecoderModule> Create();
+};
+
+namespace ffvpx
+{
+
+FFVPXRuntimeLinker::LinkStatus FFVPXRuntimeLinker::sLinkStatus =
+  LinkStatus_INIT;
+
+PRLibrary* FFVPXRuntimeLinker::sLinkedLib = nullptr;
+PRLibrary* FFVPXRuntimeLinker::sLinkedUtilLib = nullptr;
+static unsigned (*avcodec_version)() = nullptr;
+
+#ifdef __GNUC__
+#define AV_FUNC(func, ver) void (*func)();
+#define LIBAVCODEC_ALLVERSION
+#else
+#define AV_FUNC(func, ver) decltype(func)* func;
+#endif
+#include "FFmpegFunctionList.h"
+#undef AV_FUNC
+
+static PRLibrary*
+MozAVLink(const char* aName)
+{
+  PRLibSpec lspec;
+  lspec.type = PR_LibSpec_Pathname;
+  lspec.value.pathname = aName;
+  return PR_LoadLibraryWithFlags(lspec, PR_LD_NOW | PR_LD_LOCAL);
+}
+
+/* static */ bool
+FFVPXRuntimeLinker::Link()
+{
+  if (sLinkStatus) {
+    return sLinkStatus == LinkStatus_SUCCEEDED;
+  }
+
+  MOZ_ASSERT(NS_IsMainThread());
+
+  // We retrieve the path of the XUL library as this is where mozavcodec and
+  // mozavutil libs are located.
+  char* path =
+    PR_GetLibraryFilePathname(XUL_DLL, (PRFuncPtr)&FFVPXRuntimeLinker::Link);
+  if (!path) {
+    return false;
+  }
+  nsCOMPtr<nsIFile> xulFile = do_CreateInstance(NS_LOCAL_FILE_CONTRACTID);
+  if (!xulFile ||
+      NS_FAILED(xulFile->InitWithNativePath(nsDependentCString(path)))) {
+    PR_Free(path);
+    return false;
+  }
+  PR_Free(path);
+
+  nsCOMPtr<nsIFile> rootDir;
+  if (NS_FAILED(xulFile->GetParent(getter_AddRefs(rootDir))) || !rootDir) {
+    return false;
+  }
+  nsAutoCString rootPath;
+  if (NS_FAILED(rootDir->GetNativePath(rootPath))) {
+    return false;
+  }
+
+  char* libname = NULL;
+  /* Get the platform-dependent library name of the module */
+  libname = PR_GetLibraryName(rootPath.get(), "mozavutil");
+  if (!libname) {
+    return false;
+  }
+  sLinkedUtilLib = MozAVLink(libname);
+  PR_FreeLibraryName(libname);
+  libname = PR_GetLibraryName(rootPath.get(), "mozavcodec");
+  if (libname) {
+    sLinkedLib = MozAVLink(libname);
+    PR_FreeLibraryName(libname);
+    if (sLinkedLib && sLinkedUtilLib) {
+      if (Bind("mozavcodec")) {
+        sLinkStatus = LinkStatus_SUCCEEDED;
+        return true;
+      }
+    }
+  }
+
+  Unlink();
+
+  sLinkStatus = LinkStatus_FAILED;
+  return false;
+}
+
+/* static */ bool
+FFVPXRuntimeLinker::Bind(const char* aLibName)
+{
+  int version = AV_FUNC_57;
+
+#define AV_FUNC(func, ver)                                                     \
+  if ((ver) & version) {                                                       \
+    if (!(func = (decltype(func))PR_FindSymbol(((ver) & AV_FUNC_AVUTIL_MASK) ? sLinkedUtilLib : sLinkedLib, #func))) { \
+      FFMPEG_LOG("Couldn't load function " #func " from %s.", aLibName);       \
+      return false;                                                            \
+    }                                                                          \
+  } else {                                                                     \
+    func = (decltype(func))nullptr;                                            \
+  }
+#include "FFmpegFunctionList.h"
+#undef AV_FUNC
+  return true;
+}
+
+/* static */ already_AddRefed<PlatformDecoderModule>
+FFVPXRuntimeLinker::CreateDecoderModule()
+{
+  if (!Link()) {
+    return nullptr;
+  }
+  return FFmpegDecoderModule<FFVPX_VERSION>::Create();
+}
+
+/* static */ void
+FFVPXRuntimeLinker::Unlink()
+{
+  if (sLinkedUtilLib && sLinkedUtilLib != sLinkedLib) {
+    PR_UnloadLibrary(sLinkedUtilLib);
+  }
+  if (sLinkedLib) {
+    PR_UnloadLibrary(sLinkedLib);
+    sLinkedLib = nullptr;
+    sLinkStatus = LinkStatus_INIT;
+    avcodec_version = nullptr;
+  }
+  sLinkedUtilLib = nullptr;
+}
+
+#undef LIBAVCODEC_ALLVERSION
+} // namespace ffvpx
+} // namespace mozilla
new file mode 100644
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/ffvpx/FFVPXRuntimeLinker.h
@@ -0,0 +1,43 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* 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 __FFVPXRuntimeLinker_h__
+#define __FFVPXRuntimeLinker_h__
+
+#include "PlatformDecoderModule.h"
+
+struct PRLibrary;
+
+namespace mozilla
+{
+namespace ffvpx
+{
+
+class FFVPXRuntimeLinker
+{
+public:
+  static bool Link();
+  static void Unlink();
+  static already_AddRefed<PlatformDecoderModule> CreateDecoderModule();
+
+private:
+  static PRLibrary* sLinkedLib;
+  static PRLibrary* sLinkedUtilLib;
+  static enum LinkStatus {
+    LinkStatus_INIT = 0,
+    LinkStatus_FAILED,
+    LinkStatus_SUCCEEDED
+  } sLinkStatus;
+
+  static bool Bind(const char* aLibName);
+
+};
+
+}
+}
+
+
+#endif /* __FFVPXRuntimeLinker_h__ */
new file mode 100644
--- /dev/null
+++ b/dom/media/platforms/ffmpeg/ffvpx/moz.build
@@ -0,0 +1,44 @@
+# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# 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/.
+
+LOCAL_INCLUDES += ['/xpcom/build']
+EXPORTS += [
+    'FFVPXRuntimeLinker.h',
+]
+
+UNIFIED_SOURCES += [
+    '../FFmpegDataDecoder.cpp',
+    '../FFmpegDecoderModule.cpp',
+    '../FFmpegVideoDecoder.cpp',
+]
+SOURCES += [
+    'FFVPXRuntimeLinker.cpp',
+]
+LOCAL_INCLUDES += [
+    '..',
+    '../ffmpeg57/include',
+]
+
+if CONFIG['OS_ARCH'] == 'WINNT':
+    LOCAL_INCLUDES += [
+        '../ffmpeg57/include',
+    ]
+
+if CONFIG['GNU_CXX']:
+  CXXFLAGS += [ '-Wno-deprecated-declarations' ]
+if CONFIG['CLANG_CXX']:
+  CXXFLAGS += [
+    '-Wno-unknown-attributes',
+  ]
+if CONFIG['_MSC_VER']:
+  CXXFLAGS += [
+    '-wd4996', # deprecated declaration
+  ]
+
+DEFINES['FFVPX_VERSION'] = 46465650
+DEFINES['USING_MOZFFVPX'] = True
+
+FINAL_LIBRARY = 'xul'
--- a/dom/media/platforms/ffmpeg/libav53/moz.build
+++ b/dom/media/platforms/ffmpeg/libav53/moz.build
@@ -3,17 +3,17 @@
 # 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/.
 
 UNIFIED_SOURCES += [
     '../FFmpegAudioDecoder.cpp',
     '../FFmpegDataDecoder.cpp',
     '../FFmpegDecoderModule.cpp',
-    '../FFmpegH264Decoder.cpp',
+    '../FFmpegVideoDecoder.cpp',
 ]
 LOCAL_INCLUDES += [
     '..',
     'include',
 ]
 
 FINAL_LIBRARY = 'xul'
 
--- a/dom/media/platforms/ffmpeg/libav54/moz.build
+++ b/dom/media/platforms/ffmpeg/libav54/moz.build
@@ -3,17 +3,17 @@
 # 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/.
 
 UNIFIED_SOURCES += [
     '../FFmpegAudioDecoder.cpp',
     '../FFmpegDataDecoder.cpp',
     '../FFmpegDecoderModule.cpp',
-    '../FFmpegH264Decoder.cpp',
+    '../FFmpegVideoDecoder.cpp',
 ]
 LOCAL_INCLUDES += [
     '..',
     'include',
 ]
 
 FINAL_LIBRARY = 'xul'
 
--- a/dom/media/platforms/ffmpeg/libav55/moz.build
+++ b/dom/media/platforms/ffmpeg/libav55/moz.build
@@ -3,27 +3,23 @@
 # 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/.
 
 UNIFIED_SOURCES += [
     '../FFmpegAudioDecoder.cpp',
     '../FFmpegDataDecoder.cpp',
     '../FFmpegDecoderModule.cpp',
-    '../FFmpegH264Decoder.cpp',
+    '../FFmpegVideoDecoder.cpp',
 ]
 LOCAL_INCLUDES += [
     '..',
     'include',
 ]
 
 if CONFIG['GNU_CXX']:
   CXXFLAGS += [ '-Wno-deprecated-declarations' ]
 if CONFIG['CLANG_CXX']:
   CXXFLAGS += [
     '-Wno-unknown-attributes',
   ]
-if CONFIG['_MSC_VER']:
-  CXXFLAGS += [
-    '-wd4996', # deprecated declaration
-  ]
 
 FINAL_LIBRARY = 'xul'
--- a/dom/media/platforms/moz.build
+++ b/dom/media/platforms/moz.build
@@ -33,36 +33,32 @@ DIRS += [
 ]
 
 if CONFIG['MOZ_WMF']:
     DIRS += [ 'wmf' ];
 
 if CONFIG['MOZ_EME']:
     DIRS += ['agnostic/eme']
 
+if CONFIG['MOZ_FFVPX']:
+    DIRS += [
+        'ffmpeg/ffvpx',
+    ]
+
 if CONFIG['MOZ_FFMPEG']:
-    LOCAL_INCLUDES += ['/xpcom/build']
     EXPORTS += [
         'ffmpeg/FFmpegRuntimeLinker.h',
     ]
     UNIFIED_SOURCES += [
         'ffmpeg/FFmpegRuntimeLinker.cpp',
     ]
-    if CONFIG['OS_ARCH'] != 'WINNT':
-        DIRS += [
-            'ffmpeg/libav53',
-            'ffmpeg/libav54',
-            'ffmpeg/libav55',
-        ]
-    else:
-        LOCAL_INCLUDES += [
-            'ffmpeg/ffmpeg57/include',
-        ]
-
     DIRS += [
+        'ffmpeg/libav53',
+        'ffmpeg/libav54',
+        'ffmpeg/libav55',
         'ffmpeg/ffmpeg57',
     ]
 
 if CONFIG['MOZ_APPLEMEDIA']:
   EXPORTS += [
       'apple/AppleDecoderModule.h',
   ]
   UNIFIED_SOURCES += [
--- a/dom/media/webm/WebMDemuxer.cpp
+++ b/dom/media/webm/WebMDemuxer.cpp
@@ -7,31 +7,35 @@
 #include "nsError.h"
 #include "MediaDecoderStateMachine.h"
 #include "AbstractMediaDecoder.h"
 #include "MediaResource.h"
 #include "WebMDemuxer.h"
 #include "WebMBufferedParser.h"
 #include "gfx2DGlue.h"
 #include "mozilla/Endian.h"
+#include "mozilla/PodOperations.h"
 #include "mozilla/Preferences.h"
 #include "mozilla/SharedThreadPool.h"
 #include "MediaDataDemuxer.h"
 #include "nsAutoRef.h"
 #include "NesteggPacketHolder.h"
+#include "VideoUtils.h"
 #include "XiphExtradata.h"
 #include "prprf.h"
 
 #include <algorithm>
 #include <stdint.h>
 
 #define VPX_DONT_DEFINE_STDINT_TYPES
 #include "vpx/vp8dx.h"
 #include "vpx/vpx_decoder.h"
 
+#include <opus/opus.h>
+
 #define WEBM_DEBUG(arg, ...) MOZ_LOG(gWebMDemuxerLog, mozilla::LogLevel::Debug, ("WebMDemuxer(%p)::%s: " arg, this, __func__, ##__VA_ARGS__))
 
 namespace mozilla {
 
 using namespace gfx;
 
 LazyLogModule gWebMDemuxerLog("WebMDemuxer");
 LazyLogModule gNesteggLog("Nestegg");
@@ -412,16 +416,23 @@ WebMDemuxer::ReadMetadata()
                                     headers, headerLens)) {
           return NS_ERROR_FAILURE;
         }
       }
       else {
         mInfo.mAudio.mCodecSpecificConfig->AppendElements(headers[0],
                                                           headerLens[0]);
       }
+
+      if (mAudioCodec == NESTEGG_CODEC_VORBIS) {
+        if (!mVorbisCounter.Init(headers, headerLens)) {
+          return NS_ERROR_FAILURE;
+        }
+      }
+
       uint64_t duration = 0;
       r = nestegg_duration(mContext, &duration);
       if (!r) {
         mInfo.mAudio.mDuration = media::TimeUnit::FromNanoseconds(duration).ToMicroseconds();
       }
     }
   }
   return NS_OK;
@@ -537,26 +548,52 @@ WebMDemuxer::GetNextPacket(TrackInfo::Tr
   if (mIsMediaSource && next_tstamp == INT64_MIN) {
     return false;
   }
 
   int64_t discardPadding = 0;
   (void) nestegg_packet_discard_padding(holder->Packet(), &discardPadding);
 
   for (uint32_t i = 0; i < count; ++i) {
+    int64_t duration = next_tstamp - tstamp;
     unsigned char* data;
     size_t length;
     r = nestegg_packet_data(holder->Packet(), i, &data, &length);
     if (r == -1) {
       WEBM_DEBUG("nestegg_packet_data failed r=%d", r);
       return false;
     }
     bool isKeyframe = false;
     if (aType == TrackInfo::kAudioTrack) {
       isKeyframe = true;
+      switch (mAudioCodec) {
+        case NESTEGG_CODEC_VORBIS:
+        {
+          int nsamples = mVorbisCounter.GetNumSamples(data, length);
+          if (nsamples < 0) {
+            return false;
+          }
+          duration =
+            FramesToTimeUnit(nsamples, mInfo.mAudio.mRate).ToMicroseconds();
+          break;
+        }
+        case NESTEGG_CODEC_OPUS:
+        {
+          int nsamples =
+            opus_packet_get_nb_samples(data, length, mInfo.mAudio.mRate);
+          if (nsamples < 0) {
+            return false;
+          }
+          duration =
+            FramesToTimeUnit(nsamples, mInfo.mAudio.mRate).ToMicroseconds();
+          break;
+        }
+        default:
+          break;
+      }
     } else if (aType == TrackInfo::kVideoTrack) {
       vpx_codec_stream_info_t si;
       PodZero(&si);
       si.sz = sizeof(si);
       switch (mVideoCodec) {
         case NESTEGG_CODEC_VP8:
           vpx_codec_peek_stream_info(vpx_codec_vp8_dx(), data, length, &si);
           break;
@@ -567,26 +604,30 @@ WebMDemuxer::GetNextPacket(TrackInfo::Tr
       isKeyframe = si.is_kf;
     }
 
     WEBM_DEBUG("push sample tstamp: %ld next_tstamp: %ld length: %ld kf: %d",
                tstamp, next_tstamp, length, isKeyframe);
     RefPtr<MediaRawData> sample = new MediaRawData(data, length);
     sample->mTimecode = tstamp;
     sample->mTime = tstamp;
-    sample->mDuration = next_tstamp - tstamp;
+    sample->mDuration = duration;
     sample->mOffset = holder->Offset();
     sample->mKeyframe = isKeyframe;
     if (discardPadding) {
       uint8_t c[8];
       BigEndian::writeInt64(&c[0], discardPadding);
       sample->mExtraData = new MediaByteBuffer;
       sample->mExtraData->AppendElements(&c[0], 8);
     }
     aSamples->Push(sample);
+    if (mAudioCodec == NESTEGG_CODEC_VORBIS ||
+        mAudioCodec == NESTEGG_CODEC_OPUS) {
+      tstamp += duration;
+    }
   }
   return true;
 }
 
 RefPtr<NesteggPacketHolder>
 WebMDemuxer::NextPacket(TrackInfo::TrackType aType)
 {
   bool isVideo = aType == TrackInfo::kVideoTrack;
@@ -716,16 +757,17 @@ WebMDemuxer::SeekInternal(const media::T
       WEBM_DEBUG("and nestegg_offset_seek to %" PRIu64 " failed", offset);
       return NS_ERROR_FAILURE;
     }
     WEBM_DEBUG("got offset from buffered state: %" PRIu64 "", offset);
   }
 
   mLastAudioFrameTime.reset();
   mLastVideoFrameTime.reset();
+  mVorbisCounter.Reset();
 
   return NS_OK;
 }
 
 media::TimeIntervals
 WebMDemuxer::GetBuffered()
 {
   EnsureUpToDateIndex();
--- a/dom/media/webm/WebMDemuxer.h
+++ b/dom/media/webm/WebMDemuxer.h
@@ -4,18 +4,20 @@
  * 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 !defined(WebMDemuxer_h_)
 #define WebMDemuxer_h_
 
 #include "nsTArray.h"
 #include "MediaDataDemuxer.h"
 #include "NesteggPacketHolder.h"
+#include "mozilla/Maybe.h"
 #include "mozilla/Move.h"
 
+#include "VorbisDecoder.h"
 typedef struct nestegg nestegg;
 
 namespace mozilla {
 
 class WebMBufferedState;
 
 // Queue for holding MediaRawData samples
 class MediaRawDataQueue {
@@ -194,16 +196,18 @@ private:
   bool mHasAudio;
   bool mNeedReIndex;
 
   // The last complete block parsed by the WebMBufferedState. -1 if not set.
   // We cache those values rather than retrieving them for performance reasons
   // as nestegg only performs 1-byte read at a time.
   int64_t mLastWebMBlockOffset;
   const bool mIsMediaSource;
+
+  VorbisPacketSampleCounter mVorbisCounter;
 };
 
 class WebMTrackDemuxer : public MediaTrackDemuxer
 {
 public:
   WebMTrackDemuxer(WebMDemuxer* aParent,
                   TrackInfo::TrackType aType,
                   uint32_t aTrackNumber);
--- a/extensions/spellcheck/locales/en-US/hunspell/README_en_US.txt
+++ b/extensions/spellcheck/locales/en-US/hunspell/README_en_US.txt
@@ -1,11 +1,11 @@
 en_US-mozilla Hunspell Dictionary
-Generated from SCOWL Version 2015.08.24
-Sun Jan 10 15:07:17 EST 2016
+Generated from SCOWL Version 2016.01.19
+Thu Jan 21 09:46:53 EST 2016
 
 http://wordlist.sourceforge.net
 
 README file for English Hunspell dictionaries derived from SCOWL.
 
 These dictionaries are created using the speller/make-hunspell-dict
 script in SCOWL.
 
@@ -19,54 +19,62 @@ The following dictionaries are available
   en_US-large
   en_CA-large
   en_GB-large (with both "ise" and "ize" spelling)
 
 The normal (non-large) dictionaries correspond to SCOWL size 60 and,
 to encourage consistent spelling, generally only include one spelling
 variant for a word.  The large dictionaries correspond to SCOWL size
 70 and may include multiple spelling for a word when both variants are
-considered almost equal.  Also, the general quality of the larger
-dictionaries may also be less as they are not as carefully checked for
-errors as the normal dictionaries.
+considered almost equal.  The larger dictionaries however (1) have not
+been as carefully checked for errors as the normal dictionaries and
+thus may contain misspelled or invalid words; and (2) contain
+uncommon, yet valid, words that might cause problems as they are
+likely to be misspellings of more common words (for example, "ort" and
+"calender").
 
 To get an idea of the difference in size, here are 25 random words
 only found in the large dictionary for American English:
 
   Bermejo Freyr's Guenevere Hatshepsut Nottinghamshire arrestment
   crassitudes crural dogwatches errorless fetial flaxseeds godroon
   incretion jalapeño's kelpie kishkes neuroglias pietisms pullulation
   stemwinder stenoses syce thalassic zees
 
 The en_US and en_CA are the official dictionaries for Hunspell.  The
 en_GB and large dictionaries are made available on an experimental
 basis.  If you find them useful please send me a quick email at
 kevina@gnu.org.
 
 If none of these dictionaries suite you (for example, maybe you want
-the larger dictionary but only use spelling of a word) additional
+the normal dictionary that also includes common variants) additional
 dictionaries can be generated at http://app.aspell.net/create or by
 modifying speller/make-hunspell-dict in SCOWL.  Please do let me know
 if you end up publishing a customized dictionary.
 
 If a word is not found in the dictionary or a word is there you think
 shouldn't be, you can lookup the word up at http://app.aspell.net/lookup
 to help determine why that is.
 
 General comments on these list can be sent directly to me at
 kevina@gnu.org or to the wordlist-devel mailing lists
 (https://lists.sourceforge.net/lists/listinfo/wordlist-devel).  If you
 have specific issues with any of these dictionaries please file a bug
 report at https://github.com/kevina/wordlist/issues.
 
-IMPORTANT CHANGES FROM 2015.02.15:
+IMPORTANT CHANGES INTRODUCED IN 2015.04.24:
 
 The dictionaries are now in UTF-8 format instead of ISO-8859-1.  This
 was required to handle smart quotes correctly.
 
+IMPORTANT CHANGES INTRODUCED IN 2016.01.19:
+
+"SET UTF8" was changes to "SET UTF-8" in the affix file as some
+versions of Hunspell do not recognize "UTF8".
+
 ADDITIONAL NOTES:
 
 The NOSUGGEST flag was added to certain taboo words.  While I made an
 honest attempt to flag the strongest taboo words with the NOSUGGEST
 flag, I MAKE NO GUARANTEE THAT I FLAGGED EVERY POSSIBLE TABOO WORD.
 The list was originally derived from Németh László, however I removed
 some words which, while being considered taboo by some dictionaries,
 are not really considered swear words in today's society.
@@ -306,9 +314,9 @@ from the Ispell distribution they are un
   INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
   BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
   CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
   ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   POSSIBILITY OF SUCH DAMAGE.
 
-Build Date: Sun Jan 10 15:07:17 EST 2016
+Build Date: Thu Jan 21 09:46:53 EST 2016
--- a/extensions/spellcheck/locales/en-US/hunspell/dictionary-sources/5-mozilla-added
+++ b/extensions/spellcheck/locales/en-US/hunspell/dictionary-sources/5-mozilla-added
@@ -1,270 +1,131 @@
 API's
 APIs
 ATPase
 ATPase's
-Aaren
-Aaren's
-Aarika
-Aarika's
-Ab
 Ab's
-Abagael
-Abagael's
-Abagail
-Abagail's
 Abba
-Abbe
-Abbe's
-Abbey
-Abbey's
-Abbi
-Abbi's
 Abbie
 Abbie's
-Abbot
-Abbot's
-Abbye
-Abbye's
 Abdel
 Abdel's
 AbeBooks
-Abeu
-Abeu's
-Abey
-Abey's
 Abie
 Abie's
-Abigael
-Abigael's
-Abigale
-Abigale's
 Abra
 Abra's
-Abrahan
-Abrahan's
 Abramo
 Abramo's
-Abran
-Abran's
 ActiveX
 ActiveX's
 Acura
 Acura's
-Acuras
-Ad
-Ad's
 Adah
 Adah's
 Adair
 Adair's
 Adaline
 Adaline's
 Adamo
 Adamo's
-Adara
-Adara's
 AddThis
 AddThis's
 Adda
 Adda's
 Addi
 Addi's
-Addia
-Addia's
 Addy
 Addy's
 Ade
 Ade's
 Adel
 Adel's
 Adelaida
 Adelaida's
 Adelbert
 Adelbert's
 Adelheid
 Adelheid's
-Adelice
-Adelice's
 Adelina
 Adelina's
-Adelind
-Adelind's
-Adella
-Adella's
 Adelle
 Adelle's
 Adena
 Adena's
 Adey
 Adey's
 Adham
 Adham's
 Adi
 Adi's
-Adiana
-Adiana's
 Adina
 Adina's
 Adlai
 Adlai's
-Ado
-Ado's
 Adolphe
 Adolphe's
-Adolpho
-Adolpho's
 Adolphus
 Adolphus's
-Adora
-Adora's
-Adore
 Adore's
-Adoree
-Adoree's
-Adorne
-Adorne's
-Adrea
-Adrea's
 Adria
 Adria's
-Adriaens
 Adriane
 Adriane's
 Adrianna
 Adrianna's
 Adrianne
 Adrianne's
 Adriano
 Adriano's
 Adrien
 Adrien's
-Adriena
-Adriena's
-Aeriel
-Aeriel's
-Aeriela
-Aeriela's
-Aeriell
-Aeriell's
 Afton
 Afton's
-Agace
-Agace's
 Agata
 Agata's
 Agathe
 Agathe's
-Aggi
-Aggi's
-Aggy
-Aggy's
 Agilent
-Agna
-Agna's
-Agnella
-Agnella's
 Agnese
 Agnese's
-Agnesse
-Agnesse's
-Agneta
-Agneta's
-Agnola
-Agnola's
 Agosto
 Agosto's
-Agretha
-Agretha's
-Aguie
-Aguie's
-Aguistin
-Aguistin's
-Aguste
-Aguste's
 Aharon
 Aharon's
 Aidan
 Aidan's
-Aigneis
-Aigneis's
 Aila
 Aila's
-Ailbert
-Ailbert's
-Aile
-Aile's
-Ailee
-Ailee's
-Ailene
-Ailene's
 Ailey
 Ailey's
-Aili
-Aili's
-Ailina
-Ailina's
-Ailis
-Ailsun
-Ailsun's
-Ailyn
-Ailyn's
 Aime
 Aime's
-Aimil
-Aimil's
-Aindrea
-Aindrea's
-Ainslee
-Ainslee's
 Ainsley
 Ainsley's
 Ainslie
 Ainslie's
 Ajay
 Ajay's
 Akim
 Akim's
-Aksel
-Aksel's
 Alain
 Alain's
-Alaine
-Alaine's
-Alair
-Alair's
 Alameda
 Alameda's
-Alanah
-Alanah's
 Aland
 Aland's
-Alane
-Alane's
 Alanna
 Alanna's
-Alano
-Alano's
 Alanson
 Alanson's
-Alard
-Alard's
 Alasdair
 Alasdair's
 Alastair
 Alastair's
-Alasteir
-Alasteir's
-Alaster
-Alaster's
-Alayne
-Alayne's
-Alberik
-Alberik's
 Albertina
 Albertina's
 Albertine
 Albertine's
 Albie
 Albie's
 Albina
 Albina's
@@ -273,2509 +134,1015 @@ Albrecht's
 Aldin
 Aldin's
 Aldis
 Aldis's
 Aldon
 Aldon's
 Aldous
 Aldous's
-Aldric
-Aldric's
 Aldrich
 Aldrich's
 Aldridge
 Aldridge's
 Aldus
 Aldus's
-Aldwin
-Aldwin's
-Alecia
-Alecia's
-Aleda
-Aleda's
-Aleece
-Aleece's
-Aleen
-Aleen's
-Alejandrina
-Alejandrina's
-Alejoa
-Alejoa's
 Aleksandr
 Aleksandr's
 Alena
 Alena's
 Alene
 Alene's
 Alessandra
 Alessandra's
 Alessandro
 Alessandro's
-Aleta
-Aleta's
 Alethea
 Alethea's
 Alexa
 Alexa's
 Alexandr
 Alexandr's
 Alexandre
 Alexandre's
 Alexandrina
 Alexandrina's
-Alexandro
-Alexandro's
 Alexandros
 Alexi
 Alexi's
 Alexia
 Alexia's
 Alexina
 Alexina's
-Alexine
-Alexine's
-Alexio
-Alexio's
 Alf
 Alf's
-Alfi
-Alfi's
 Alfie
 Alfie's
 Alfons
 Alfons's
 Alfonse
 Alfonse's
-Alfy
-Alfy's
 Algernon
 Algernon's
 Alia
 Alia's
-Alibaba
-Alic
-Alic's
-Alica
-Alica's
-Alicea
-Alicea's
 Alick
 Alick's
 Alida
 Alida's
-Alidia
-Alidia's
-Alie
-Alie's
-Alika
-Alika's
-Alikee
-Alikee's
 Alina
 Alina's
 Alis
-Alisander
-Alisander's
 Alister
 Alister's
-Alisun
-Alisun's
 Alix
 Alix's
-Aliza
-Aliza's
 Alla
 Alla's
 Allard
 Allard's
-Allayne
-Allayne's
-Alleen
-Alleen's
 Allene
 Allene's
-Alley
-Alley's
 Alleyn
 Alleyn's
-Allissa
-Allissa's
 Allister
 Allister's
-Allistir
-Allistir's
-Allix
-Allix's
-Allsun
-Allsun's
-Allx
-Allx's
-Ally
-Ally's
-Allyce
-Allyce's
 Allyn
 Allyn's
-Almeda
-Almeda's
 Almeria
 Almeria's
-Almeta
-Almeta's
 Almira
 Almira's
-Almire
-Almire's
-Aloin
-Aloin's
-Aloise
-Aloise's
-Aloisia
-Aloisia's
 Alon
 Alon's
 Alonso
 Alonso's
-Aloysia
-Aloysia's
 Aloysius
 Aloysius's
 Alric
 Alric's
-Aluin
-Aluin's
-Aluino
-Aluino's
 Alvan
 Alvan's
-Alvera
-Alvera's
-Alverta
-Alverta's
-Alvie
-Alvie's
 Alvina
 Alvina's
-Alvinia
-Alvinia's
-Alvira
-Alvira's
 Alvis
 Alvis's
 Alvy
 Alvy's
 Alwin
 Alwin's
 Alwyn
 Alwyn's
-Alyda
-Alyda's
 Alyosha
 Alyosha's
 Alys
 Alys's
-Alysa
-Alysa's
-Alyse
-Alyse's
-Alysia
-Alysia's
 Alyss
 Amabel
 Amabel's
-Amabelle
-Amabelle's
-Amalea
-Amalea's
-Amalee
-Amalee's
-Amaleta
-Amaleta's
 Amalie
 Amalie's
-Amalita
-Amalita's
-Amalle
-Amalle's
-Amandi
-Amandi's
-Amandie
-Amandie's
-Amandy
-Amandy's
 Amara
 Amara's
-Amargo
-Amargo's
 Amata
 Amata's
-Amberly
-Amberly's
-Amble
-Amble's
 Ambros
 Ambros's
 Ambrose
-Ambrosi
-Ambrosi's
 Ambrosio
 Ambrosio's
 Ambrosius
 Ambrosius's
-Ambur
-Ambur's
-Amby
-Amby's
 Ame
 Ame's
 Amelie
 Amelie's
-Amelina
-Amelina's
-Ameline
-Ameline's
-Amelita
-Amelita's
 Amerigo
 Amerigo's
 Amery
 Amery's
 Ami
 Ami's
-Amii
-Amii's
 Amil
 Amil's
-Amitie
-Amitie's
-Amity
-Amity's
-Ammamaria
-Ammamaria's
 Amory
 Amory's
-Amye
-Amye's
-Anabal
-Anabal's
-Anabella
-Anabella's
-Anabelle
-Anabelle's
-Analiese
-Analiese's
 Analise
 Analise's
-Anallese
-Anallese's
-Anallise
-Anallise's
-Anastasie
-Anastasie's
-Anastassia
-Anastassia's
 Anatol
 Anatol's
-Anatola
-Anatola's
-Anatollo
-Anatollo's
-Ancell
-Ancell's
-Andee
-Andee's
-Andeee
-Andeee's
-Anderea
-Anderea's
 Anders
 Andi
 Andi's
 Andie
 Andie's
-Andonis
-Andonis's
 Andra
 Andra's
 Andras
-Andreana
-Andreana's
 Andreas
 Andree
 Andree's
 Andrej
 Andrej's
 Andrey
 Andrey's
 Andria
 Andria's
-Andriana
-Andriana's
-Andriette
-Andriette's
-Andris
 Andros
 Andrus
 Andrus's
-Anestassia
-Anestassia's
 Anet
 Anet's
-Anett
-Anett's
-Anetta
-Anetta's
-Anette
-Anette's
 Ange
 Ange's
 Angele
 Angele's
 Angeli
 Angeli's
 Angelika
 Angelika's
-Angelle
-Angelle's
-Angil
-Angil's
-Anglicized
-Anglicizes
-Anglicizing
-Angy
-Angy's
 Ania
 Ania's
-Anica
-Anica's
-Anissa
-Anissa's
-Anitra
-Anitra's
-Anjanette
-Anjanette's
-Anjela
-Anjela's
-Annabal
-Annabal's
-Annabela
-Annabela's
-Annabell
-Annabell's
 Annabella
 Annabella's
-Annadiana
-Annadiana's
-Annadiane
-Annadiane's
-Annalee
-Annalee's
-Annaliese
-Annaliese's
 Annalise
 Annalise's
-Annamaria
-Annamaria's
-Annamarie
-Annamarie's
-Annecorinne
-Annecorinne's
 Anneliese
 Anneliese's
 Annelise
 Annelise's
 Annemarie
 Annemarie's
-Annetta
-Annetta's
 Anni
 Anni's
-Annice
-Annice's
 Annis
-Annissa
-Annissa's
-Annmaria
-Annmaria's
-Annnora
-Annnora's
-Annora
-Annora's
 Anny
 Anny's
 Ansel
 Ansel's
 Ansell
 Ansell's
-Anselma
-Anselma's
 Ansley
 Ansley's
 Anson
 Anson's
 Anstice
 Anstice's
-Anthe
-Anthe's
 Anthea
 Anthea's
-Anthia
-Anthia's
-Anthiathia
-Anthiathia's
 Antin
 Antin's
 Antonella
 Antonella's
-Antonetta
-Antonetta's
 Antoni
 Antoni's
 Antonie
 Antonie's
 Antonietta
 Antonietta's
 Antonin
 Antonin's
 Antonina
 Antonina's
 Antonino
 Antonino's
-Antons
-Any
 Any's
 Anya
 Anya's
-Appolonia
-Appolonia's
-Aprilette
-Aprilette's
-Arabel
-Arabel's
-Arabela
-Arabela's
-Arabele
-Arabele's
 Arabella
 Arabella's
-Arabelle
-Arabelle's
 Arabidopsis
-Araldo
-Araldo's
-Arch
-Archaimbaud
-Archaimbaud's
 Archambault
 Archambault's
-Archer
-Archibaldo
-Archibaldo's
-Archibold
-Archibold's
 Archy
 Archy's
 Arda
 Arda's
-Ardath
-Ardath's
-Ardeen
-Ardeen's
-Ardelia
-Ardelia's
-Ardelis
-Ardelis's
-Ardella
-Ardella's
-Ardelle
-Ardelle's
-Ardene
-Ardene's
-Ardenia
-Ardenia's
-Ardine
-Ardine's
 Ardis
 Ardis's
-Ardisj
-Ardisj's
-Ardith
-Ardith's
-Ardra
-Ardra's
-Ardyce
-Ardyce's
-Ardys
-Ardyth
-Ardyth's
-Arel
-Arel's
 Aretha
 Aretha's
 Ari
 Ari's
 Arial
 Arial's
 Ariana
 Ariana's
-Aridatha
-Aridatha's
 Arie
 Arie's
-Ariela
-Ariela's
-Ariella
-Ariella's
 Arielle
 Arielle's
 Arin
 Arin's
-Ario
-Ario's
-Arlan
-Arlan's
-Arlana
-Arlana's
-Arlee
-Arlee's
-Arleen
-Arleen's
 Arlen
 Arlen's
-Arlena
-Arlena's
-Arleta
-Arleta's
 Arlette
 Arlette's
 Arley
 Arley's
-Arleyne
-Arleyne's
 Arlie
 Arlie's
-Arliene
-Arliene's
 Arlin
 Arlin's
-Arlina
-Arlina's
-Arlinda
-Arlinda's
-Arluene
-Arluene's
 Arly
 Arly's
-Arlyn
-Arlyn's
-Arlyne
-Arlyne's
 Arman
 Arman's
 Armin
 Armin's
 Arnaldo
 Arnaldo's
 Arne
-Arney
-Arney's
 Arni
 Arni's
 Arnie
 Arnie's
 Arnoldo
 Arnoldo's
-Arnuad
-Arnuad's
-Arny
-Arny's
-Arri
-Arri's
-Artair
-Artair's
 Arte
 Arte's
 Artemas
 Artemus
 Artemus's
-Arther
-Arther's
 Artur
 Artur's
 Artus
 Artus's
-Arty
 Arty's
 Arv
 Arv's
-Arvie
-Arvie's
 Arvin
 Arvin's
-Arvy
-Arvy's
-Aryn
-Aryn's
 Asa
 Asa's
 Ase
 Ase's
-Ash
-Ash's
-Ashbey
-Ashbey's
 Ashby
 Ashby's
-Ashely
-Ashely's
 Asher
-Ashia
-Ashia's
-Ashien
-Ashien's
-Ashil
-Ashil's
-Ashla
-Ashla's
-Ashlan
-Ashlan's
 Ashleigh
 Ashleigh's
-Ashlen
-Ashlen's
-Ashli
-Ashli's
-Ashlie
-Ashlie's
-Ashlin
-Ashlin's
-Ashly
-Ashly's
 Ashton
 Astra
 Astra's
 Astrid
 Astrid's
-Astrix
-Astrix's
 Athlon
 Athlon's
-Athlons
-Atlante
-Atlante's
 Aube
-Auberon
-Auberon's
 Aubert
 Aubert's
-Auberta
-Auberta's
-Aubine
-Aubine's
-Aubree
-Aubree's
-Aubrette
-Aubrette's
-Aubrie
-Aubrie's
 Aubry
 Aubry's
 Audie
 Audie's
 Audre
 Audre's
-Audrie
-Audrie's
-Audry
-Audry's
-Audrye
-Audrye's
-Audy
-Audy's
 Augie
 Augie's
 Auguste
 Auguste's
 Augustin
 Augustin's
-Augustina
-Augustina's
 Augusto
 Augusto's
-Augy
-Augy's
-Aundrea
-Aundrea's
-Aura
-Aura's
 Aurea
 Aurea's
 Aurel
 Aurel's
-Aurelea
-Aurelea's
 Aurelie
 Aurelie's
-Auria
-Auria's
-Aurie
-Aurie's
-Aurilia
-Aurilia's
-Aurlie
-Aurlie's
-Auroora
-Auroora's
 Aurore
 Aurore's
-Aurthur
-Aurthur's
-Austina
-Austina's
-Austine
-Austine's
 Aveline
 Aveline's
 Averell
 Averell's
 Averil
 Averil's
 Averill
 Averill's
-Averyl
-Averyl's
-Avictor
-Avictor's
-Avie
-Avie's
 Avigdor
 Avigdor's
 Aviva
 Aviva's
-Avivah
-Avivah's
 Avram
 Avram's
 Avril
 Avril's
-Avrit
-Avrit's
-Avrom
-Avrom's
-Ax
-Ax's
 Axe
 Axe's
 Axel
-Aylmar
-Aylmar's
 Aylmer
 Aylmer's
 Aymer
 Aymer's
 Ayn
 Ayn's
 Bab
 Bab's
-Babara
-Babara's
 Babb
 Babb's
-Babbette
-Babbette's
 Babbie
 Babbie's
 Babette
 Babette's
-Babita
-Babita's
 Babs
-Bail
-Bail's
 Bailie
 Bailie's
 Baillie
 Baillie's
 Baily
 Baily's
-Bald
 Bald's
-Balduin
-Balduin's
-Bale
-Bale's
-Bambie
-Bambie's
-Bamby
-Bamby's
-Ban
-Ban's
 Bancorp
-Bank
-Bank's
-Banky
-Banky's
-Bar
-Barb
-Barb's
-Barbabas
-Barbabas's
-Barbabra
-Barbabra's
-Barbaraanne
-Barbaraanne's
 Barbe
 Barbe's
 Barbee
 Barbee's
 Barbette
 Barbette's
 Barbey
 Barbey's
-Barbi
-Barbi's
-Barby
-Barby's
-Bard
-Bard's
 Barde
 Barde's
 Bari
 Bari's
-Barn
-Barn's
-Barnabe
-Barnabe's
-Barnebas
-Barnebas's
-Barnie
-Barnie's
-Barny
-Barny's
-Baron
-Baron's
 Barret
 Barret's
 Barri
 Barri's
 Barris
 Bartel
 Bartel's
 Barthel
 Barthel's
-Bartholemy
-Bartholemy's
-Bartholomeo
-Bartholomeo's
-Bartholomeus
-Bartholomeus's
-Bartie
-Bartie's
 Bartlet
 Bartlet's
-Bartolemo
-Bartolemo's
 Bartolomeo
 Bartolomeo's
 Bartram
 Bartram's
 Barty
 Barty's
 Bary
 Bary's
-Baryram
-Baryram's
-Base
-Base's
 Basia
 Basia's
 Basile
 Basile's
 Basilio
 Basilio's
 Basilius
 Basilius's
 Bastian
 Bastian's
 Bastien
 Bastien's
-Bat
-Bat's
-Batholomew
-Batholomew's
-Batsheva
-Batsheva's
 Baudoin
 Baudoin's
 Bax
-Baxie
-Baxie's
-Baxy
-Baxy's
-Bay
-Bay's
 Bayard
 Bea
 Bea's
 Beale
 Beale's
-Bealle
-Bealle's
-Bear
-Bear's
-Bearnard
-Bearnard's
-Beatrisa
-Beatrisa's
 Bebe
 Bebe's
 Becca
 Becca's
 Becka
 Becka's
 Beckham
 Beckham's
-Becki
-Becki's
 Beckie
 Beckie's
-Bee
-Bee's
-Beilul
-Beilul's
-Beitris
-Beitris's
-Bekki
-Bekki's
 Bel
 Bel's
-Belia
-Belia's
-Belicia
-Belicia's
-Belita
-Belita's
 Belkin
 Belkin's
-Bellanca
-Bellanca's
-Belle
-Belle's
 Bellevue
 Bellevue's
-Bellina
-Bellina's
 Beltran
 Beltran's
 Belva
 Belva's
-Belvia
-Belvia's
-Bendick
-Bendick's
-Bendicty
-Bendicty's
-Bendite
-Bendite's
 Benedetta
 Benedetta's
 Benedetto
 Benedetto's
 Benedick
 Benedick's
 Benedicta
 Benedicta's
 Benedicto
 Benedicto's
 Benedikt
 Benedikt's
-Benedikta
-Benedikta's
-Benetta
-Benetta's
 Bengt
 Bengt's
-Beniamino
-Beniamino's
-Benjamen
-Benjamen's
 Benji
 Benji's
 Benjie
 Benjie's
 Benjy
 Benjy's
 Benn
 Benn's
-Benni
-Benni's
 Benoit
 Benoit's
-Benoite
-Benoite's
-Bent
-Bent's
-Bentlee
-Bentlee's
-Benyamin
-Benyamin's
 Ber
 Ber's
-Beret
-Berget
-Berget's
 Berk
 Berk's
 Berke
 Berke's
-Berkie
-Berkie's
 Berkley
 Berkley's
-Berkly
-Berkly's
-Berky
-Berky's
-Berna
-Berna's
-Bernadene
-Bernadene's
-Bernadina
-Bernadina's
-Bernardina
-Bernardina's
 Bernardine
-Bernarr
-Bernarr's
-Bernelle
-Bernelle's
-Bernete
-Bernete's
-Bernetta
-Bernetta's
-Bernette
-Bernette's
 Bernhard
 Bernhard's
 Berni
 Berni's
-Bernita
-Bernita's
-Berny
-Berny's
 Berri
 Berri's
-Berrie
-Berrie's
-Berte
-Berte's
 Berthe
 Berthe's
 Berti
 Berti's
-Bertina
-Bertina's
-Bertine
-Bertine's
 Berton
 Berton's
-Bertrando
-Bertrando's
-Berty
-Berty's
-Beryle
-Beryle's
 Bespin
 Bespin's
 Bessy
 Bessy's
-Bethanne
-Bethanne's
-Bethena
-Bethena's
-Bethina
-Bethina's
 Betsey
 Betsey's
 Betta
 Betta's
-Betteann
-Betteann's
-Betteanne
-Betteanne's
 Betti
 Bettina
 Bettina's
-Bettine
-Bettine's
 Bevan
-Beverie
-Beverie's
-Beverlee
-Beverlee's
-Beverlie
-Beverlie's
 Bevin
-Bevon
-Bevon's
-Bevvy
 Bevvy's
-Bianka
-Bianka's
 BibSonomy
 BibSonomy's
 BibTeX
 BibTeX's
-Bibbie
-Bibbie's
 Bibby
 Bibby's
-Bibbye
-Bibbye's
 Bibi
 Bibi's
-Biddie
-Biddie's
-Biddy
-Biddy's
-Bidget
-Bidget's
 Bil
 Bil's
 Bili
 Bili's
-Billi
-Billi's
-Billye
-Billye's
 Bink
 Bink's
 Binky
 Binky's
-Binni
-Binni's
 Binnie
 Binnie's
-Binny
-Binny's
-Birch
-Birch's
-Birdie
-Birdie's
 Birgit
 Birgit's
 Birgitta
 Birgitta's
 Birk
 Birk's
 Biron
 Biron's
 BizRate
 BizRate's
 Bjorn
 Bjorn's
-BlackBerry
-BlackBerry's
-Blaire
-Blaire's
-Blakelee
-Blakelee's
 Blakeley
 Blakeley's
-Blanch
 Blanch's
-Blancha
-Blancha's
 Blane
 Blane's
-Blayne
-Blayne's
 BlinkList
 BlinkList's
-Blinni
-Blinni's
-Blinnie
-Blinnie's
-Blinny
-Blinny's
-Bliss
-Blisse
-Blisse's
-Blithe
 Blithe's
-Bloglines
-Bloglines's
-Blondell
-Blondell's
-Blondelle
-Blondelle's
-Blondy
-Blondy's
 Bloomberg
 Bloomberg's
 Bo
 Bo's
-Bobbe
-Bobbe's
-Bobbee
-Bobbee's
-Bobbette
-Bobbette's
-Bobbye
-Bobbye's
-Bobette
-Bobette's
-Bobina
-Bobina's
-Bobine
-Bobine's
-Bobinette
-Bobinette's
-Bogey
-Bogey's
-Boigie
-Boigie's
-Bondie
-Bondie's
-Bondon
-Bondon's
 Bondy
 Bondy's
-Bone
-Bone's
-Bonnee
-Bonnee's
-Bonni
-Bonni's
-Bonnibelle
-Bonnibelle's
-Bonny
 Bonsai
 Bonsai's
-Boonie
-Boonie's
-Boony
-Boony's
-Boot
-Boot's
-Boote
-Boote's
 Boothe
 Boothe's
 Bord
 Bord's
-Bordie
-Bordie's
-Bordy
-Bordy's
 Bourke
 Bourke's
-Boy
-Boy's
 Boyce
 Boyce's
-Boycey
-Boycey's
-Boycie
-Boycie's
-Bradan
-Bradan's
-Brade
-Brade's
 Braden
 Braden's
-Bradney
-Bradney's
 Bram
 Bram's
-Brana
-Brana's
-Brand
-Brand's
-Brandais
-Brandais's
 Brande
 Brande's
-Brandea
-Brandea's
 Brander
 Brander's
-Brandice
-Brandice's
-Brandise
-Brandise's
-Brandtr
-Brandtr's
-Brandyn
-Brandyn's
 Brannon
 Brannon's
 Brantley
 Brantley's
-Breanne
-Breanne's
-Brear
-Brear's
 Bree
 Bree's
-Breena
-Breena's
 Bren
 Bren's
-Brena
-Brena's
 Brenden
 Brenden's
-Brendin
-Brendin's
-Brendis
-Brendis's
 Brendon
 Brendon's
-Brenn
-Brenn's
 Brenna
 Brenna's
-Brennen
-Brennen's
-Brew
-Brew's
-Bria
-Bria's
 Brianne
 Brianne's
-Briano
-Briano's
 Briant
 Briant's
-Bride
-Bride's
 Bridie
 Bridie's
 Brien
 Brien's
-Brier
-Brier's
-Brietta
-Brietta's
-Brig
 Brigg
 Brigg's
 Brigida
 Brigida's
 Brigit
 Brigit's
 Brigitta
 Brigitta's
-Brina
-Brina's
-Briney
-Briney's
-Brinn
-Brinn's
-Brinna
-Brinna's
-Briny
 Briny's
 Brion
 Brion's
 Brita
 Brita's
-Britni
-Britni's
 Britta
 Britta's
 Brittan
 Brittan's
-Brittaney
-Brittaney's
-Brittani
-Brittani's
-Britte
-Britte's
-Britteny
-Britteny's
-Brittne
-Brittne's
-Brittni
-Brittni's
-Brnaba
-Brnaba's
-Brnaby
-Brnaby's
-Brockie
-Brockie's
-Brocky
-Brocky's
 Brod
 Brod's
-Broddie
-Broddie's
-Broddy
-Broddy's
-Broderic
-Broderic's
 Broderick
 Broderick's
 Brodie
 Brodie's
 Brody
 Brody's
-Brok
-Brok's
 Bron
 Bron's
-Bronnie
-Bronnie's
-Bronny
-Bronny's
-Brook
-Brook's
 Brose
 Brose's
-Brucie
-Brucie's
-Bruis
-Bruis's
-Brunhilda
-Brunhilda's
-Bryana
-Bryana's
-Bryanty
-Bryanty's
 Bryn
 Bryn's
-Bryna
-Bryna's
 Brynn
 Brynn's
-Brynna
-Brynna's
-Brynne
-Brynne's
-Buckie
-Buckie's
 Bucky
 Bucky's
 Budd
 Budd's
-Buddie
-Buddie's
-Buiron
-Buiron's
-Bunni
-Bunni's
-Bunnie
-Bunnie's
-Bunny
-Bunny's
-Burg
-Burg's
 Burk
 Burk's
 Burkina
 Burkina's
-Burlie
-Burlie's
 Burnaby
 Burnaby's
 Burnard
 Burnard's
-Burtie
-Burtie's
-Burty
-Burty's
-Butch
-Butch's
 Byram
 Byram's
-Byran
-Byran's
-Byrann
-Byrann's
-Byrle
-Byrle's
 Byrom
 Byrom's
 CEOs
 CFCs
-Cacilia
-Cacilia's
-Cacilie
-Cacilie's
 Cad
 Cad's
-Caddric
-Caddric's
-Cahra
-Cahra's
 Caicos
 Caicos's
-Cairistiona
-Cairistiona's
-Caitrin
-Caitrin's
 Cale
 Cale's
-Calida
-Calida's
-Calla
-Calla's
-Callean
-Callean's
 Calley
 Calley's
 Calli
 Calli's
-Callida
-Callida's
 Cally
 Cally's
-Calv
-Calv's
-Calypso
-Cam
-Camala
-Camala's
 Cambridgeshire
 Cambridgeshire's
-Camella
-Camella's
-Camellia
-Camellia's
-Camey
-Camey's
 Cami
 Cami's
 Camila
 Camila's
-Camile
-Camile's
 Camino
 Camino's
-Cammi
-Cammi's
 Cammie
 Cammie's
 Cammy
 Cammy's
 Candi
 Candi's
 Candida
 Candida's
-Candie
-Candie's
-Candis
 Candra
 Candra's
-Caprice
-Caprice's
-Car
-Car's
-Caralie
-Caralie's
-Carce
-Carce's
-Care
-Care's
 CareerBuilder
 CareerBuilder's
 Caren
 Caren's
-Carena
-Carena's
-Caresa
-Caresa's
-Caressa
-Caressa's
-Caresse
-Caresse's
 Cari
 Cari's
 Caria
-Carie
-Carie's
-Caril
-Caril's
-Carilyn
-Carilyn's
 Carin
 Carin's
 Carine
 Carine's
-Cariotta
-Cariotta's
 Carita
 Carita's
-Caritta
-Caritta's
-Carlee
-Carlee's
-Carleen
-Carleen's
 Carlen
 Carlen's
 Carleton
 Carleton's
 Carley
 Carley's
 Carlie
 Carlie's
-Carlina
-Carlina's
-Carline
-Carline's
 Carling
 Carling's
 Carlisle
 Carlisle's
-Carlita
-Carlita's
 Carlota
 Carlotta
 Carlotta's
-Carlye
-Carlye's
-Carlyn
-Carlyn's
-Carlynn
-Carlynn's
-Carlynne
-Carlynne's
-Carma
-Carma's
 Carmel
-Carmelia
-Carmelia's
-Carmelina
-Carmelina's
 Carmelita
 Carmelita's
-Carmelle
-Carmelle's
-Carmencita
-Carmencita's
 Carmina
 Carmina's
-Carmita
-Carmita's
-Carmon
-Carmon's
-Carny
-Carny's
 Caro
 Caro's
 Carola
 Carola's
 Carolan
 Carolan's
-Carolann
-Carolann's
-Carolee
-Carolee's
-Carolin
-Carolin's
-Caroljean
-Caroljean's
 Carolus
 Carolus's
 Carolyne
 Carolyne's
-Carolynn
-Carolynn's
 Caron
 Caron's
-Carree
-Carree's
-Carri
-Carri's
-Carrissa
-Carrissa's
 Carrol
 Carrol's
-Carry
-Carry's
-Cart
-Cart's
 Caryl
 Caryl's
 Caryn
 Caryn's
 Casar
 Casar's
 Casi
 Casi's
-Casie
-Casie's
 Casper
 Casper's
 Cass
 Cass's
-Cassandre
-Cassandre's
-Cassandry
-Cassandry's
-Cassaundra
-Cassaundra's
-Cassey
-Cassey's
 Cassi
 Cassi's
 Cassini
 Cassini's
-Cassondra
-Cassondra's
 Cassy
 Cassy's
 Catarina
 Catarina's
 Cate
 Cate's
 Caterina
 Caterina's
-Catha
-Catha's
 Catharina
 Catharina's
 Catharine
 Catharine's
-Cathe
-Cathe's
-Cathee
-Cathee's
-Catherin
-Catherin's
-Catherina
-Catherina's
-Cathi
-Cathi's
 Cathie
 Cathie's
-Cathlene
-Cathlene's
-Cathrin
-Cathrin's
-Cathrine
-Cathrine's
-Cathyleen
-Cathyleen's
 Cati
 Cati's
 Catie
 Catie's
-Catina
-Catina's
-Catlaina
-Catlaina's
-Catlee
-Catlee's
 Catlin
 Catlin's
 Catrina
 Catrina's
 Catriona
 Catriona's
-Caty
-Caty's
 Caye
 Caye's
-Cayla
-Cayla's
 Caz
 Caz's
-Cazzie
-Cazzie's
-Cchaddie
-Cchaddie's
 Cece
 Cece's
-Ceciley
-Ceciley's
 Cecilio
 Cecilio's
-Cecilius
-Cecilius's
-Cecilla
-Cecilla's
 Ced
 Ced's
 Ceil
 Ceil's
 Cele
 Cele's
-Celene
-Celene's
-Celesta
-Celesta's
 Celestia
 Celestia's
 Celestina
 Celestina's
 Celestine
 Celestine's
-Celestyn
-Celestyn's
-Celestyna
-Celestyna's
 Celie
 Celie's
-Celinda
-Celinda's
 Celine
 Celine's
-Celinka
-Celinka's
-Celisse
-Celisse's
-Celka
-Celka's
 Celle
 Celle's
-Cello
-Cello's
 Centro
 Centro's
 Cesare
 Cesare's
-Cesaro
-Cesaro's
-Cesya
-Cesya's
-Chadd
-Chadd's
-Chaddie
-Chaddie's
-Chaddy
-Chaddy's
 Chaim
 Chaim's
 Chancey
 Chancey's
 Chanda
 Chanda's
-Chandal
-Chandal's
 Chane
 Chane's
 Channa
 Channa's
 Chantal
 Chantal's
-Chantalle
-Chantalle's
 Chara
-Charil
-Charil's
-Charin
-Charin's
-Chariot
-Chariot's
 Charis
-Charissa
-Charissa's
 Charisse
 Charisse's
-Charita
-Charita's
-Charla
-Charla's
-Charlean
-Charlean's
-Charleen
-Charleen's
-Charlena
-Charlena's
-Charline
-Charline's
 Charlot
 Charlot's
 Charlotta
 Charlotta's
 Charlton
-Charmain
-Charmain's
-Charmane
-Charmane's
 Charmian
 Charmian's
-Charmine
-Charmine's
-Charmion
-Charmion's
-Charo
-Charo's
-Charyl
-Charyl's
 Chas
-Chastity
-Chastity's
 ChatZilla
 ChatZilla's
 Chatham
 Chatham's
-Chaunce
-Chaunce's
-Chelsae
-Chelsae's
-Chelsey
-Chelsey's
-Chelsie
-Chelsie's
-Chelsy
-Chelsy's
 Cher
 Chere
 Chere's
-Cherey
-Cherey's
-Cherianne
-Cherianne's
-Cherice
-Cherice's
-Cherida
-Cherida's
-Cherilyn
-Cherilyn's
-Cherilynn
-Cherilynn's
-Cherin
-Cherin's
 Cherise
 Cherise's
-Cherish
 Cherish's
-Cherlyn
-Cherlyn's
-Cherri
-Cherri's
-Cherrita
-Cherrita's
-Chery
-Chery's
-Cherye
-Cherye's
 Ches
-Cheslie
-Cheslie's
-Cheston
-Cheston's
 Chet
 Chet's
 Chev
 Chev's
-Chiarra
-Chiarra's
-Chic
-Chic's
-Chick
-Chick's
-Chickie
-Chickie's
-Chicky
-Chicky's
 Chico
 Chico's
 Chilton
 Chilton's
-Chip
-Chip's
-Chiquia
-Chiquia's
-Chlo
-Chlo's
-Chloette
-Chloette's
 Chloris
 Chloris's
 Choi
 Choi's
-Chrisse
-Chrisse's
 Chrissie
 Chrissie's
 Chrissy
 Chrissy's
 Christabel
 Christabel's
-Christabella
-Christabella's
-Christal
-Christal's
-Christalle
-Christalle's
-Christan
-Christan's
-Christean
-Christean's
 Christel
 Christel's
-Christen
 Christen's
 Christiana
 Christiana's
 Christiane
 Christiane's
 Christianized
-Christianizes
 Christianizing
-Christiano
-Christiano's
-Christin
-Christin's
-Christoffer
-Christoffer's
-Christoforo
-Christoforo's
 Christoph
 Christoph's
 Christophe
-Christophorus
-Christophorus's
 Christos
 Christos's
-Christye
-Christye's
-Christyna
-Christyna's
-Chrisy
-Chrisy's
-Chrotoem
-Chrotoem's
-Chrysa
-Chrysa's
-Chryste
-Chryste's
-Chrystel
-Chrystel's
-Chucho
-Chucho's
 Cicely
 Cicely's
-Cicily
-Cicily's
 Ciel
 Ciel's
-Cilka
-Cilka's
-Cinda
-Cinda's
-Cindee
-Cindee's
-Cindelyn
-Cindelyn's
 Cindi
 Cindi's
-Cindie
-Cindie's
-Cindra
-Cindra's
 Cingular
 Cingular's
-Cinnamon
-Cinnamon's
 Cirillo
 Cirillo's
-Cirilo
-Cirilo's
 Ciro
 Ciro's
-Cissiee
-Cissiee's
 Cissy
 Cissy's
-Citysearch
-Citysearch's
-Claiborn
-Claiborn's
-Clarabelle
-Clarabelle's
-Clarance
-Clarance's
-Claresta
-Claresta's
-Clareta
-Clareta's
-Claretta
-Claretta's
-Clarette
-Clarette's
-Clarey
-Clarey's
 Clari
 Clari's
 Claribel
 Claribel's
-Clarie
-Clarie's
 Clarinda
 Clarinda's
-Clarine
-Clarine's
 Clarisse
 Clarisse's
 Clarita
 Clarita's
 Clarkson
 Clarkson's
 Clary
 Clary's
-Claudell
-Claudell's
-Claudelle
-Claudelle's
-Claudetta
-Claudetta's
 Claudian
 Claudian's
-Claudianus
-Claudianus's
-Claudie
-Claudie's
-Claudina
-Claudina's
-Clayborn
-Clayborn's
 Clayborne
 Clayborne's
-Claybourne
-Claybourne's
-Clayson
-Clayson's
 Clea
 Clea's
-Cleavland
-Cleavland's
 Clemence
 Clemence's
 Clemente
 Clemente's
-Clementia
-Clementia's
 Clementina
 Clementina's
-Clementius
-Clementius's
 Clemmie
 Clemmie's
-Clemmy
-Clemmy's
 Cleon
 Clerc
 Clerc's
-Clerissa
-Clerissa's
-Cletis
 Cletus
 Cletus's
 Cleve
 Cleve's
-Clevey
-Clevey's
-Clevie
-Clevie's
-Clim
-Clim's
 Clo
 Clo's
-Cloe
-Cloe's
-Cloris
-Cloris's
 Clotilda
 Clotilda's
-Cly
-Cly's
-Clyve
-Clyve's
-Clywd
-Clywd's
-Cob
-Cob's
-Cobbie
-Cobbie's
-Cobby
-Cobby's
-Codee
-Codee's
-Codi
-Codi's
-Codie
-Codie's
-Cointon
-Cointon's
-Colan
-Colan's
-Colas
 ColdFusion
 ColdFusion's
-Colene
-Colene's
 Colet
 Coletta
 Coletta's
 Collen
 Collen's
-Collete
-Collete's
 Collette
 Collette's
-Collie
-Collie's
 Colline
 Colline's
-Colly
-Colly's
 Colman
 Colman's
-Colver
-Colver's
 Comcast
 Comcast's
 Composer
 Composer's
 Computerworld
 Computerworld's
-Con
 Conant
 Conant's
-Concettina
-Concettina's
 Conchita
 Conchita's
 Concordia
 Concordia's
-Conney
-Conney's
-Conni
-Conni's
 Connor
 Connor's
-Connotea
-Connotea's
 Conny
 Conny's
-Conrade
-Conrade's
 Conrado
 Conrado's
 Conroy
 Conroy's
-Consalve
-Consalve's
-Consolata
-Consolata's
 Constancia
 Constancia's
-Constancy
-Constancy's
 Constanta
 Constanta's
 Constantia
 Constantin
 Constantin's
-Constantina
-Constantina's
 Constantino
 Constantino's
 Consuela
 Consuela's
-Cookie
-Cookie's
-Coop
-Coop's
-Corabel
-Corabel's
-Corabella
-Corabella's
-Corabelle
-Corabelle's
-Coral
-Coral's
 Coralie
 Coralie's
-Coraline
-Coraline's
-Coralyn
-Coralyn's
 Corbet
 Corbet's
 Corbett
 Corbett's
 Corbie
 Corbie's
 Corbin
 Corbin's
 Corby
-Cord
-Cord's
-Cordelie
-Cordelie's
 Cordell
 Cordell's
-Cordey
-Cordey's
-Cordi
-Cordi's
-Cordie
-Cordie's
-Cordula
-Cordula's
 Cordy
 Cordy's
-Coreen
-Coreen's
-Corella
-Corella's
-Corenda
-Corenda's
-Corene
-Corene's
 Coretta
 Coretta's
-Corette
-Corette's
 Cori
 Cori's
-Corie
-Corie's
-Corilla
-Corilla's
 Corinna
 Corinna's
-Coriss
-Coriss's
-Corissa
-Corissa's
 Corliss
 Corliss's
-Corly
-Corly's
-Cornall
-Cornall's
-Cornela
-Cornela's
-Cornelle
-Cornelle's
 Corney
 Corney's
-Cornie
-Cornie's
-Corny
 Corny's
-Correna
-Correna's
-Correy
-Correy's
-Corri
-Corri's
-Corrianne
-Corrianne's
 Corrie
 Corrie's
-Corrina
-Corrina's
-Corrinne
-Corrinne's
 Corry
 Corry's
 Cort
 Cort's
-Cortie
-Cortie's
-Cortney
-Cortney's
-Corty
-Corty's
-Cos
-Cosetta
-Cosetta's
 Cosette
 Cosette's
 Cosimo
 Cosimo's
 Cosme
 Cosme's
 Cosmo
 Cosmo's
 Costa
 Costa's
 Costanza
 Costanza's
 Councillor
 Councillor's
 Councillors
-Court
-Court's
 Courtenay
 Courtenay's
-Courtnay
-Courtnay's
-Cozmo
-Cozmo's
-Craggie
-Craggie's
-Craggy
 Craggy's
 Craigslist
 Craigslist's
-Creigh
-Creigh's
-Creight
-Creight's
-Crin
-Crin's
 Cris
 Cris's
-Crissie
-Crissie's
 Crissy
 Crissy's
 Crista
 Crista's
-Cristabel
-Cristabel's
 Cristal
 Cristal's
-Cristen
-Cristen's
-Cristi
-Cristi's
 Cristian
 Cristian's
 Cristiano
 Cristiano's
-Cristie
-Cristie's
-Cristin
-Cristin's
-Cristine
-Cristine's
-Cristionna
-Cristionna's
 Cristobal
 Cristobal's
-Cristy
-Cristy's
-Crysta
-Crysta's
-Crystie
-Crystie's
-Cthrine
-Cthrine's
-Cull
-Cull's
-Cullan
-Cullan's
 Culley
 Culley's
-Cullie
-Cullie's
-Cullin
-Cullin's
 Cully
 Cully's
 Culver
 Culver's
 Cumbria
 Cumbria's
 Curcio
 Curcio's
@@ -2785,2593 +1152,1135 @@ Curran
 Curran's
 Currey
 Currey's
 Currie
 Currie's
 Curtice
 Curtice's
 Cy
-Cyb
-Cyb's
 Cybil
 Cybil's
-Cybill
-Cybill's
-Cymbre
-Cymbre's
-Cynde
-Cynde's
 Cyndi
 Cyndi's
-Cyndia
-Cyndia's
-Cyndie
-Cyndie's
-Cyndy
-Cyndy's
-Cynthea
-Cynthea's
-Cynthie
-Cynthie's
 Cynthy
 Cynthy's
-Cyrill
-Cyrill's
 Cyrille
 Cyrille's
-Cyrillus
-Cyrillus's
 D'Arcy
 DRM
 DVDs
 Dacey
 Dacey's
 Dacia
-Dacie
-Dacie's
-Dacy
-Dacy's
-Dael
-Dael's
-Daffi
-Daffi's
-Daffie
-Daffie's
-Daffy
 Daffy's
-Dag
 Dag's
 Dagmar
 Dagmar's
 Dagny
 Dagny's
-Dahlia
-Dahlia's
-Daile
-Daile's
-Daisey
-Daisey's
-Daisi
-Daisi's
-Daisie
-Daisie's
 Dal
 Dal's
-Dalenna
-Dalenna's
 Dalia
 Dalia's
 Dalila
 Dalila's
-Dalis
 Dall
 Dall's
-Dalli
-Dalli's
-Dallis
-Dallon
-Dallon's
-Daloris
-Daloris's
-Dalston
-Dalston's
-Dalt
-Dalt's
 Damara
 Damara's
 Damaris
 Damaris's
 Damiano
 Damiano's
-Damita
-Damita's
-Danell
-Danell's
-Danella
-Danella's
 Danette
 Danette's
 Dani
 Dani's
 Dania
 Dania's
 Danica
 Danica's
-Danice
-Danice's
-Danie
-Danie's
 Daniela
 Daniela's
 Daniele
 Daniele's
 Daniella
 Daniella's
-Danika
-Danika's
-Danila
-Danila's
-Danit
-Danit's
-Danita
-Danita's
 Danna
 Danna's
-Dannel
-Dannel's
 Danni
 Danni's
-Dannye
-Dannye's
-Danya
-Danya's
-Danyelle
-Danyelle's
-Danyette
-Danyette's
-Daphene
-Daphene's
-Daphna
-Daphna's
 Dar
 Dar's
 Dara
 Dara's
-Darb
-Darb's
-Darbee
-Darbee's
-Darbie
-Darbie's
-Darcee
-Darcee's
 Darcey
 Darcey's
 Darci
 Darci's
 Darcie
 Darcie's
-Darda
-Darda's
-Dareen
-Dareen's
-Darell
-Darell's
-Darelle
-Darelle's
 Dari
 Dari's
 Daria
 Daria's
-Darice
-Darice's
-Darill
-Darill's
-Darleen
-Darleen's
-Darline
-Darline's
-Darlleen
-Darlleen's
-Darn
-Darn's
-Darnall
-Darnall's
 Daron
 Daron's
-Darrelle
-Darrelle's
-Darrick
-Darrick's
-Darsey
-Darsey's
 Darsie
 Darsie's
 Darya
 Darya's
-Daryle
-Daryle's
-Daryn
-Daryn's
 Dasha
 Dasha's
-Dasi
-Dasi's
-Dasie
-Dasie's
-Dasya
-Dasya's
-Datha
-Datha's
-Daune
-Daune's
 Dav
 Dav's
-Daveen
-Daveen's
-Daven
-Daven's
-Daveta
-Daveta's
 Davey
 Davey's
 Davida
 Davida's
-Davidde
-Davidde's
 Davide
 Davide's
 Davie
 Davie's
 Davin
 Davin's
 Davina
 Davina's
-Davine
-Davine's
-Dawna
-Dawna's
-Dayle
-Dayle's
 Dayna
 Dayna's
 Daytona
 Daytona's
-Ddene
-Ddene's
 De
 De's
 DeKalb
 DeKalb's
 DealTime
 DealTime's
 Deane
 Deane's
 Deb
 Deb's
 Debbi
 Debbi's
-Debee
-Debee's
-Debera
-Debera's
 Debi
 Debi's
-Debor
-Debor's
-Deck
-Deck's
 Dede
 Dede's
-Dedie
-Dedie's
-Dedra
-Dedra's
-Deeann
-Deeann's
-Deeanne
-Deeanne's
 Deedee
 Deedee's
-Deerdre
-Deerdre's
-Deeyn
-Deeyn's
-Dehlia
-Dehlia's
-Deina
-Deina's
 Dela
 Dela's
-Delainey
-Delainey's
-Delcina
-Delcina's
-Delcine
-Delcine's
-Delila
-Delila's
-Delinda
-Delinda's
-Delly
-Delly's
-Delmor
-Delmor's
 Delmore
 Delmore's
 Deloitte
 Deloitte's
-Delora
-Delora's
 Deloria
 Deloria's
 Delphine
 Delphine's
-Delphinia
-Delphinia's
-Demetra
-Demetra's
-Demetre
-Demetre's
 Demetri
 Demetri's
 Demetria
 Demetria's
-Demetris
 Demott
 Demott's
-Den
 Dene
 Deni
 Deni's
-Denice
-Denice's
-Denna
-Denna's
-Dennet
-Dennet's
 Denney
 Denney's
-Denni
-Denni's
 Dennie
 Dennie's
 Dennison
 Dennison's
 Denton
 Denton's
-Deny
 Deny's
 Denys
-Denyse
-Denyse's
-Deonne
-Deonne's
 Der
 Der's
 Derk
 Derk's
-Derrek
-Derrek's
-Derrik
-Derrik's
-Derril
-Derril's
-Derron
-Derron's
 Derry
-Derward
-Derward's
-Derwin
-Derwin's
 Des
 Deseret
 Deseret's
 Desi
 Desi's
-Desirae
-Desirae's
-Desiri
-Desiri's
-Desmund
-Desmund's
 Dev
 Dev's
 Deva
 Deva's
 Devan
 Devan's
-Devina
-Devina's
-Devinne
-Devinne's
-Devland
-Devland's
-Devlen
-Devlen's
 Devlin
 Devlin's
-Devondra
-Devondra's
-Devonna
-Devonna's
-Devonne
-Devonne's
-Devora
-Devora's
-Devy
-Devy's
-Dew
-Dew's
-Dewain
-Dewain's
-Dewie
-Dewie's
 Dex
 Dex's
 Dhabi
-Diahann
-Diahann's
 Dian
 Dian's
-Diandra
-Diandra's
-Dianemarie
-Dianemarie's
-Diannne
-Diannne's
-Diarmid
-Diarmid's
 Dickie
 Dickie's
 Dicky
 Dicky's
 Didi
 Didi's
-Diena
-Diena's
 Dierdre
 Dierdre's
 Dieter
 Dieter's
 Digg
 Digg's
 Diggs
-Dilan
-Dilan's
-Dill
-Dill's
-Dillie
-Dillie's
-Dilly
-Dilly's
 Dimitri
 Dimitri's
-Dimitry
-Dimitry's
-Dinnie
-Dinnie's
 Dinny
 Dinny's
 Dione
-Dionis
-Dionis's
 Dionisio
 Dionisio's
 Dita
 Dita's
 DivX
 DivX's
-Dniren
-Dniren's
-Dode
-Dode's
 Dodi
 Dodi's
 Dodie
 Dodie's
-Dody
-Dody's
 Dolf
 Dolf's
-Doll
-Doll's
 Dolley
 Dolley's
-Dolli
-Dolli's
-Dolorita
-Dolorita's
-Doloritas
 Dolph
 Dolph's
 Dom
 Domenic
 Domenic's
 Domenico
 Domenico's
-Domeniga
-Domeniga's
-Dominga
-Dominga's
 Domini
 Domini's
 Dominik
 Dominik's
-Don't
 Donal
 Donal's
-Donall
-Donall's
-Donalt
-Donalt's
-Donaugh
-Donaugh's
-Donavon
-Donavon's
-Donella
-Donella's
-Donelle
-Donelle's
-Donetta
-Donetta's
-Donia
-Donia's
-Donica
-Donica's
-Donielle
-Donielle's
-Donnamarie
-Donnamarie's
-Donni
-Donni's
-Doralia
-Doralia's
-Doralin
-Doralin's
-Doralyn
-Doralyn's
-Doralynn
-Doralynn's
-Doralynne
-Doralynne's
 Dore
 Dore's
-Dorelia
-Dorelia's
-Dorella
-Dorella's
-Dorelle
-Dorelle's
-Dorena
-Dorena's
-Dorene
-Dorene's
-Doretta
-Doretta's
-Dorette
-Dorette's
 Dorey
 Dorey's
 Dori
 Dori's
 Doria
 Doria's
-Dorice
-Dorice's
 Dorie
 Dorie's
-Dorine
-Dorine's
-Dorisa
-Dorisa's
 Dorise
 Dorise's
-Dorita
-Dorita's
 Doro
 Doro's
-Dorolice
-Dorolice's
-Dorolisa
-Dorolisa's
 Dorotea
 Dorotea's
-Doroteya
-Doroteya's
 Dorothee
 Dorothee's
-Dorree
-Dorree's
-Dorri
-Dorri's
 Dorrie
 Dorrie's
 Dorris
-Dorry
-Dorry's
-Dorthea
-Dorthea's
-Dory
-Dory's
 Dosi
 Dosi's
-Doti
-Doti's
-Dotti
-Dotti's
 Dottie
 Dottie's
-Dotty
 Dotty's
 Dougie
 Dougie's
-Dougy
-Dougy's
 Dov
 Dov's
 Doy
 Doy's
 Dre
 Dre's
 Dreamweaver
 Dreamweaver's
-Dreddy
-Dreddy's
-Dredi
-Dredi's
 Drona
 Drona's
 Dru
 Dru's
-Druci
-Druci's
-Drucie
-Drucie's
-Drucill
-Drucill's
-Drucy
-Drucy's
-Drud
-Drud's
-Drugi
-Drugi's
-Drusi
-Drusi's
-Drusie
-Drusie's
 Drusilla
 Drusilla's
-Drusy
-Drusy's
-Dud
-Dud's
 Duff
 Duff's
 Duffie
 Duffie's
 Dugald
 Dugald's
-Dukey
-Dukey's
-Dukie
-Dukie's
-Duky
-Duky's
 Dulce
 Dulce's
-Dulcea
-Dulcea's
-Dulci
-Dulci's
-Dulcia
-Dulcia's
-Dulciana
-Dulciana's
 Dulcie
 Dulcie's
-Dulcine
-Dulcine's
 Dulcinea
 Dulcinea's
-Dulcy
-Dulcy's
-Dulsea
-Dulsea's
-Dun
-Dun's
-Dunc
-Dunc's
 Dunstan
 Dur
 Durand
 Durand's
 Durward
 Durward's
-Dwain
-Dwain's
 Dyan
 Dyan's
-Dyana
-Dyana's
-Dyane
-Dyane's
-Dyann
-Dyann's
-Dyanna
-Dyanna's
-Dyanne
-Dyanne's
 Dyna
 Dyna's
-Dynah
-Dynah's
-Eachelle
-Eachelle's
-Eada
-Eada's
 Eadie
 Eadie's
-Eadith
-Eadith's
-Eadmund
-Eadmund's
 Eal
 Eal's
-Ealasaid
-Ealasaid's
 Eamon
 Eamon's
-Earlie
-Earlie's
-Early
 Early's
-Eartha
-Eartha's
-Earvin
-Earvin's
 Easton
 Easton's
 Eb
 Eb's
 Eba
 Eba's
 Ebba
 Ebba's
-Ebeneser
-Ebeneser's
 Ebenezer
 Ebenezer's
 Eberhard
 Eberhard's
-Eberto
-Eberto's
-Ebonee
-Ebonee's
 Ecma
 Ecma's
 Eda
 Eda's
-Edan
-Edan's
 Edd
 Edd's
-Eddi
-Eddi's
 Ede
-Edee
-Edee's
-Edeline
-Edeline's
 Edgard
 Edgard's
 Edi
 Edi's
 Edie
 Edie's
-Edik
-Edik's
 Edin
 Edin's
-Edita
-Edita's
 Editha
 Editha's
-Edithe
-Edithe's
-Ediva
-Ediva's
 Edlin
 Edlin's
-Edmon
-Edmon's
 Edouard
 Edouard's
 Eduard
 Eduard's
-Eduino
-Eduino's
 Edvard
 Edvard's
 Edy
 Edy's
-Edyth
-Edyth's
 Edythe
 Edythe's
 Efrem
 Efrem's
 Egan
 Egan's
 Egbert
 Egon
 Egon's
 Egor
 Egor's
-Eilis
-Eilis's
-Eimile
-Eimile's
-Eirena
-Eirena's
 Ekaterina
 Ekaterina's
 El
 Elaina
 Elaina's
 Elana
 Elana's
-Elane
-Elane's
 Elayne
 Elayne's
-Elberta
-Elberta's
-Elbertina
-Elbertina's
-Elbertine
-Elbertine's
 Elden
 Elden's
 Eldin
 Eldin's
 Eldredge
 Eldredge's
 Eldridge
 Eldridge's
 Eleanora
 Eleanora's
 Eleanore
 Eleanore's
-Eleen
-Eleen's
 Elene
 Elene's
 Eleni
 Eleni's
-Elenore
-Elenore's
 Eleonora
 Eleonora's
 Eleonore
 Eleonore's
-Elfie
-Elfie's
 Elfreda
 Elfreda's
 Elfrida
 Elfrida's
-Elfrieda
-Elfrieda's
-Elga
-Elga's
 Elia
-Elianora
-Elianora's
-Elianore
-Elianore's
-Elicia
-Elicia's
 Elie
 Elie's
 Elihu
 Elihu's
-Elinore
-Elinore's
 Elisabet
 Elisabet's
 Elisabetta
 Elisabetta's
 Elissa
 Elissa's
-Elita
-Elita's
-Elizabet
-Elizabet's
-Elka
-Elka's
 Elke
 Elke's
-Elladine
-Elladine's
-Ellary
-Ellary's
 Elle
 Elle's
-Ellene
-Ellene's
-Ellerey
-Ellerey's
 Ellery
 Ellery's
-Ellette
-Ellette's
 Elli
 Elli's
-Ellissa
-Ellissa's
-Ellswerth
-Ellswerth's
 Ellsworth
 Ellsworth's
 Ellwood
 Ellwood's
 Elly
 Elly's
 Ellyn
 Ellyn's
-Ellynn
-Ellynn's
 Elmira
 Elmira's
 Elmore
 Elmore's
-Elna
-Elna's
-Elnar
-Elnar's
-Elnore
-Elnore's
 Eloisa
 Eloisa's
-Elonore
-Elonore's
-Elora
-Elora's
 Elsbeth
 Elsbeth's
-Else
 Else's
-Elset
-Elset's
 Elsevier
 Elsevier's
 Elsey
 Elsey's
-Elsi
-Elsi's
 Elspeth
 Elspeth's
 Elston
 Elston's
-Elsworth
-Elsworth's
-Elsy
-Elsy's
-Elvera
-Elvera's
-Elvina
-Elvina's
-Elvyn
-Elvyn's
 Elwin
 Elwin's
-Elwira
-Elwira's
 Elwyn
 Elwyn's
 Ely
-Elyn
-Elyn's
 Elyse
 Elyse's
-Elysha
-Elysha's
-Elysia
 Elyssa
 Elyssa's
-Em
-Em's
 Ema
 Ema's
-Emalee
-Emalee's
-Emalia
-Emalia's
 Emanuele
 Emanuele's
-Emelda
-Emelda's
-Emelen
-Emelen's
-Emelia
-Emelia's
-Emelina
-Emelina's
 Emeline
 Emeline's
-Emelita
-Emelita's
-Emelyne
-Emelyne's
-Emera
-Emera's
-Emilee
-Emilee's
-Emili
-Emili's
 Emilie
 Emilie's
-Emiline
-Emiline's
 Emlen
 Emlen's
 Emlyn
 Emlyn's
-Emlynn
-Emlynn's
-Emlynne
-Emlynne's
-Emmalee
-Emmalee's
 Emmaline
 Emmaline's
-Emmalyn
-Emmalyn's
-Emmalynn
-Emmalynn's
-Emmalynne
-Emmalynne's
 Emmeline
 Emmeline's
 Emmerich
 Emmerich's
-Emmery
-Emmery's
 Emmet
 Emmet's
-Emmey
-Emmey's
-Emmi
-Emmi's
 Emmie
 Emmie's
-Emmit
-Emmit's
-Emmott
-Emmott's
-Emmye
-Emmye's
-Emogene
-Emogene's
-Emyle
-Emyle's
-Emylee
-Emylee's
 EndNote
 EndNote's
-Engadget
-Engadget's
 Engelbert
 Engelbert's
-Englebert
-Englebert's
-Engracia
-Engracia's
 Ennis
 Enrica
 Enrica's
-Enrichetta
-Enrichetta's
-Enrika
-Enrika's
-Enriqueta
-Enriqueta's
-Eolanda
-Eolanda's
-Eolande
-Eolande's
-Ephrayim
-Ephrayim's
 Ephrem
 Ephrem's
-Epinions
-Epinions's
 Eran
 Eran's
 Erastus
 Erastus's
 Erda
 Erda's
-Erek
-Erek's
-Erena
-Erena's
-Erhart
-Erhart's
-Ericha
-Ericha's
-Erina
-Erina's
-Erinn
-Erinn's
-Erinna
-Erinna's
 Erl
 Erl's
-Ermanno
-Ermanno's
-Ermengarde
-Ermengarde's
-Ermentrude
-Ermentrude's
-Ermin
-Ermin's
-Ermina
-Ermina's
-Erminia
-Erminia's
-Erminie
-Erminie's
-Ernaline
-Ernaline's
-Ernesta
-Ernesta's
-Ernestus
-Ernestus's
-Erny
-Erny's
-Errick
-Errick's
 Erroll
 Erroll's
 Erskine
-Ertha
-Ertha's
 Erv
 Erv's
-Eryn
-Eryn's
 Esdras
-Esma
-Esma's
-Esmaria
-Esmaria's
 Esme
 Esme's
-Esra
-Esra's
 Essa
 Essa's
-Essy
-Essy's
 Esta
 Esta's
-Estel
-Estel's
-Estele
-Estele's
-Estell
-Estell's
 Estevan
 Estevan's
 Estrella
 Estrella's
-Estrellita
-Estrellita's
-Etan
-Etan's
-Ethe
-Ethe's
 Ethelbert
-Ethelda
-Ethelda's
-Ethelin
-Ethelin's
-Ethelind
-Ethelind's
-Etheline
-Etheline's
 Ethelyn
 Ethelyn's
-Ethyl
-Ethyl's
 Etienne
 Etienne's
-Etti
-Etti's
 Ettie
 Ettie's
 Ettore
 Ettore's
 Etty
 Etty's
 Eudora
 Eudora's
-Euell
-Euell's
 Eugen
 Eugen's
 Eugenius
 Eugenius's
-Eugine
-Eugine's
-Eukaryota
-Eukaryota's
-Eukaryotas
 Eulalie
 Eulalie's
 Euphemia
 Euphemia's
 Eustace
 Eustace's
 Eustacia
 Eustacia's
 Ev
 Ev's
-Evaleen
-Evaleen's
-Evangelia
-Evangelia's
-Evangelin
-Evangelin's
-Evania
-Evania's
-Evanne
-Evanne's
-Eveleen
-Eveleen's
-Evelin
-Evelin's
 Evelina
 Evelina's
 Eveline
 Eveline's
-Even
-Even's
 Everard
 Everard's
-Evered
-Evered's
 Evey
 Evey's
 Evie
 Evie's
 Evin
 Evin's
-Evonne
-Evonne's
-Evvie
-Evvie's
-Evvy
-Evvy's
 Evy
 Evy's
-Evyn
-Evyn's
 Ewan
 Ewan's
-Eward
-Eward's
 Ewart
 Ewart's
 Ewell
 Ewell's
 Ewen
 Ewen's
 Expedia
 Expedia's
-Eyde
-Eyde's
-Eydie
-Eydie's
-Ezechiel
-Ezechiel's
 Ezequiel
 Ezequiel's
-Eziechiele
-Eziechiele's
-Ezmeralda
-Ezmeralda's
-Ezri
-Ezri's
-Fabe
-Fabe's
 Faber
 Faber's
-Fabiano
-Fabiano's
 Fabien
 Fabien's
 Fabio
 Fabio's
 Fae
 Fae's
-Faina
-Faina's
-Fair
-Fair's
 Fairfax
 Fairleigh
 Fairleigh's
 Fairlie
 Fairlie's
-Falito
-Falito's
 Falkner
 Fallon
 Fallon's
-Fan
-Fanchette
-Fanchette's
-Fanchon
-Fanchon's
-Fancie
-Fancie's
-Fancy
-Fancy's
-Fanechka
-Fanechka's
 Fania
 Fania's
-Fanni
-Fanni's
-Fanya
-Fanya's
-Far
 Far's
 Fara
 Fara's
 Farah
 Farah's
-Farand
-Farand's
-Farica
-Farica's
-Farlay
-Farlay's
-Farlee
-Farlee's
-Farleigh
-Farleigh's
-Farlie
-Farlie's
-Farly
-Farly's
 Farr
 Farr's
-Farra
-Farra's
 Farrah
 Farrah's
 Farrand
 Farrand's
 Farrel
 Farrel's
 Farris
 Farris's
 Faso
 Faso's
-Faun
-Faun's
-Faunie
-Faunie's
 Faustina
 Faustina's
-Faustine
-Faustine's
-Favorited
-Fawn
-Fawn's
-Fawne
-Fawne's
-Fawnia
-Fawnia's
-Fax
-Fax's
-Faydra
-Faydra's
 Fayette
 Fayette's
-Fayina
-Fayina's
 Fayre
 Fayre's
-Fayth
-Fayth's
-Faythe
-Faythe's
-Federica
-Federica's
-Fedora
-Fedora's
-Fee
-Fee's
-Felic
-Felic's
-Felicdad
-Felicdad's
-Felicio
-Felicio's
-Felicle
-Felicle's
-Felike
-Felike's
 Feliks
 Feliks's
-Felipa
-Felipa's
-Felisha
-Felisha's
-Felita
-Felita's
-Feliza
-Feliza's
-Felizio
-Felizio's
-Fenelia
-Fenelia's
 Feng
 Feng's
 Fennec
 Fennec's
 Feodor
 Feodor's
-Feodora
-Feodora's
 Ferd
 Ferd's
 Ferdie
 Ferdie's
-Ferdinanda
-Ferdinanda's
-Ferdinande
-Ferdinande's
 Ferdy
 Ferdy's
 Fernanda
 Fernanda's
 Fernande
 Fernande's
 Fernandina
 Fernandina's
 Ferne
 Ferne's
 Ferrel
 Ferrel's
-Fey
 Fey's
-Fiann
-Fiann's
 Fianna
-Fidela
-Fidela's
 Fidelia
 Fidelia's
 Fidelio
 Fidelio's
-Fidelity
-Fidelity's
-Fidole
-Fidole's
-Field
 Fifi
 Fifi's
-Fifine
-Fifine's
-Filbert
-Filbert's
-Filberte
-Filberte's
-Filberto
-Filberto's
-Filia
-Filia's
-Filide
-Filide's
 Filip
 Filip's
-Filippa
-Filippa's
 Filippo
 Filippo's
 FilmSpot
 FilmSpot's
 Filmer
 Filmer's
-Filmore
-Filmore's
-Fin
 Fina
 Fina's
 FindArticles
 FindArticles's
 FindLaw
 FindLaw's
 Findlay
 Findlay's
 Findley
 Findley's
 Finlay
 Finlay's
-Fionna
-Fionna's
-Fionnula
-Fionnula's
-Fiorenze
-Fiorenze's
 Fitz
 Fitz's
 Flem
 Flemming
 Flemming's
 Fletch
 Fletch's
 Fleur
 Fleur's
-Fleurette
-Fleurette's
 Flickr
 Flickr's
 Flin
 Flin's
 Flinn
 Flinn's
 Flock
 Flock's
 Flor
 Flor's
-Florance
-Florance's
 Flore
 Flore's
-Florella
-Florella's
 Florencia
 Florencia's
-Florentia
-Florentia's
-Florenza
-Florenza's
 Florette
 Florette's
-Flori
-Flori's
-Floria
-Floria's
 Florian
 Florian's
-Florie
-Florie's
-Florina
-Florina's
 Florinda
 Florinda's
 Floris
-Florri
-Florri's
 Florrie
 Florrie's
-Florry
-Florry's
-Flossi
-Flossi's
-Flossy
 Flossy's
-Flss
-Flss's
 Fons
-Fonsie
-Fonsie's
-Fonz
-Fonz's
-Fonzie
-Fonzie's
 Forex
 Forex's
 Forrester
 Forrester's
 Foss
 Foss's
-Francene
-Francene's
 Francesco
 Francesco's
-Franchot
-Franchot's
-Franciska
-Franciska's
-Franciskus
-Franciskus's
-Francklin
-Francklin's
-Francklyn
-Francklyn's
-Francyne
-Francyne's
 Franklyn
 Franklyn's
 Franky
 Franky's
-Franni
-Franni's
 Frannie
 Frannie's
 Frans
 Fransisco
 Fransisco's
-Frants
-Frants's
 Franzen
 Franzen's
-Frasco
-Frasco's
 Frasier
 Frasier's
-Frasquito
-Frasquito's
-Frayda
-Frayda's
-Fraze
-Fraze's
 Frazer
-Freddi
-Freddi's
-Fredek
-Fredek's
-Fredelia
-Fredelia's
 Frederica
 Frederica's
 Frederich
 Frederich's
-Fredericka
-Fredericka's
 Frederico
 Frederico's
-Frederigo
-Frederigo's
 Frederik
 Frederik's
 Frederique
 Frederique's
-Fredi
-Fredi's
-Fredia
-Fredia's
-Fredra
-Fredra's
 Fredrika
 Fredrika's
-Free
 Free's
 FreeBSD
 FreeBSD's
-Freedman
-Freedman's
 Freeland
 Freeland's
-Freemon
-Freemon's
 Friederike
 Friederike's
 Friedrich
-Friedrick
-Friedrick's
 FrontPage
 FrontPage's
 Fukushima
 Fukushima's
 Fulvia
 Fulvia's
 GHz's
 GaAs
-Gabbey
-Gabbey's
-Gabbi
-Gabbi's
-Gabbie
-Gabbie's
 Gabby
 Gabby's
 Gabe
 Gabe's
-Gabey
-Gabey's
 Gabi
 Gabi's
-Gabie
-Gabie's
 Gabriele
 Gabriele's
-Gabriell
-Gabriell's
 Gabriella
 Gabriella's
-Gabriellia
-Gabriellia's
-Gabriello
-Gabriello's
-Gabrila
-Gabrila's
 Gaby
 Gaby's
 Gae
 Gae's
-Gaelan
-Gaelan's
-Gaile
-Gaile's
-Gal
 Galina
 Galina's
-Gallard
-Gallard's
 Galvan
 Galvan's
-Galven
-Galven's
 Galvin
 Galvin's
 Gamaliel
 Gamaliel's
 GameCube
 GameCube's
 GameFAQs
 GameFAQs's
 GameSpot
 GameSpot's
 Gan
 Gan's
-Gannie
-Gannie's
 Gannon
 Gannon's
-Ganny
-Ganny's
-Gar
-Gar's
-Garald
-Garald's
 Gard
-Gardener
-Gardener's
-Gardie
-Gardie's
 Gardiner
-Gardy
-Gardy's
 Gare
 Gare's
-Garek
-Garek's
 Garey
 Garey's
-Garik
-Garik's
-Garmin
-Garmin's
-Garnet
-Garnet's
-Garnette
-Garnette's
-Garold
-Garold's
 Garrard
 Garrard's
-Garrek
-Garrek's
-Garret
-Garret's
-Garreth
-Garreth's
-Garrik
-Garrik's
-Garrot
-Garrot's
-Garrott
-Garrott's
-Garv
-Garv's
 Garvin
 Garvin's
-Garvy
-Garvy's
-Garwin
-Garwin's
 Garwood
 Garwood's
 Gaspar
 Gaspard
 Gaspard's
 Gasparo
 Gasparo's
 Gasper
 Gasper's
 Gaston
 Gaston's
-Gaultiero
-Gaultiero's
 Gauthier
 Gauthier's
 Gav
 Gav's
 Gavan
 Gavan's
 Gaven
 Gaven's
-Gavra
-Gavra's
-Gavrielle
-Gavrielle's
-Gawen
-Gawen's
 Gaye
 Gaye's
-Gayel
-Gayel's
-Gayelord
-Gayelord's
-Gayla
-Gayla's
-Gayleen
-Gayleen's
-Gaylene
-Gaylene's
-Gayler
-Gayler's
-Gaylor
-Gaylor's
 Gaylord
 Gaylord's
 Gaynor
 Gaynor's
 Gbps
-Gearalt
-Gearalt's
-Gearard
-Gearard's
 Gecko
 Gecko's
-Gelya
-Gelya's
 GenBank
 GenBank's
 Genevra
 Genevra's
 Genia
 Genia's
 Genna
 Genna's
-Genni
-Genni's
-Gennie
-Gennie's
-Gennifer
-Gennifer's
 Genny
 Genny's
 Geno
 Geno's
-Genovera
-Genovera's
-Genvieve
-Genvieve's
 Geoff
 Geoff's
-Geoffry
-Geoffry's
-Georas
-Georas's
 Geordie
 Georg
 Georg's
-Georgeanna
-Georgeanna's
-Georgeanne
-Georgeanne's
-Georgena
-Georgena's
-Georgeta
-Georgeta's
-Georgetta
-Georgetta's
 Georgi
 Georgi's
 Georgiana
 Georgiana's
 Georgianna
 Georgianna's
-Georgianne
-Georgianne's
 Georgie
 Georgie's
-Georgine
-Georgine's
 Georgy
 Georgy's
-Geralda
-Geralda's
 Gerda
 Gerda's
-Gerek
-Gerek's
 Gerhard
 Gerhard's
-Gerhardine
-Gerhardine's
 Gerhardt
 Gerhardt's
 Geri
 Geri's
-Gerianna
-Gerianna's
-Gerianne
-Gerianne's
-Gerick
-Gerick's
-Gerik
-Gerik's
-Gerladina
-Gerladina's
 Germain
 Germain's
 Germaine
 Germaine's
-Germana
-Germana's
-Germayne
-Germayne's
 Gerome
 Gerome's
 Gerrard
 Gerrard's
 Gerri
 Gerri's
-Gerrie
-Gerrie's
-Gerrilee
-Gerrilee's
 Gert
 Gert's
-Gerta
-Gerta's
-Gerti
-Gerti's
 Gertie
 Gertie's
 Gertrud
 Gertrud's
-Gertruda
-Gertruda's
 Gertrudis
 Gertrudis's
 Gerty
 Gerty's
 Gery
 Gery's
-Gherardo
-Gherardo's
-Giacinta
-Giacinta's
-Giacobo
-Giacobo's
 Giacomo
 Giacomo's
-Giacopo
-Giacopo's
 Gian
 Gian's
-Giana
-Giana's
-Gianina
-Gianina's
 Gianna
 Gianna's
 Gianni
 Gianni's
-Giavani
-Giavani's
 Gib
 Gib's
 Gibb
 Gibb's
-Gibbie
-Gibbie's
-Gibby
-Gibby's
 Giff
 Giff's
 Giffard
 Giffard's
-Giffer
-Giffer's
-Giffie
-Giffie's
 Gifford
 Gifford's
-Giffy
-Giffy's
 Gigi
 Gigi's
-Gilberta
-Gilberta's
 Gilberte
 Gilberte's
-Gilbertina
-Gilbertina's
-Gilbertine
-Gilburt
-Gilburt's
-Gilemette
-Gilemette's
 Gillan
 Gillan's
 Gilles
-Gilli
-Gilli's
-Gillie
 Gillie's
 Gilly
 Gilly's
-Ginelle
-Ginelle's
 Ginevra
 Ginevra's
-Ginni
-Ginni's
 Ginnie
 Ginnie's
-Ginnifer
-Ginnifer's
 Giordano
 Giordano's
 Giorgi
 Giorgi's
-Giorgia
-Giorgia's
 Giorgio
 Giorgio's
 Giovanna
 Giovanna's
-Giralda
-Giralda's
-Giraldo
-Giraldo's
 Giraud
 Gisela
 Gisela's
-Giselbert
-Giselbert's
 Gisele
 Gisele's
-Gisella
-Gisella's
-Giuditta
-Giuditta's
 Giulia
 Giulia's
 Giulietta
 Giulietta's
 Giulio
 Giulio's
-Giustina
-Giustina's
-Giustino
-Giustino's
 Giusto
 Giusto's
-Gizela
-Gizela's
-Glad
-Glad's
-Gladi
-Gladi's
-Gleda
-Gleda's
-Glenden
-Glenden's
 Glendon
 Glendon's
-Glenine
-Glenine's
 Glennie
 Glennie's
-Glennis
-Glennis's
-Glori
-Glori's
 Gloriana
 Gloriana's
-Gloriane
-Gloriane's
-Glory
-Glory's
 Gloucestershire
 Gloucestershire's
 Glyn
 Glyn's
-Glynda
-Glynda's
 Glynis
 Glynis's
 Glynn
 Glynn's
-Glynnis
-Glynnis's
 GmbH
-Gnni
-Gnni's
-Godart
-Godart's
-Goddart
-Goddart's
-Godfree
-Godfree's
 Godfrey
 Godfrey's
-Godfry
-Godfry's
 Godwin
-Goldarina
-Goldarina's
-Goldi
-Goldi's
-Goldia
-Goldia's
-Goldina
-Goldina's
 Goldy
 Goldy's
-Goober
-Goober's
 Goran
 Goran's
-Goraud
-Goraud's
 Gordan
 Gordan's
 Gorden
 Gorden's
 Gordie
 Gordie's
 Gordy
 Gordy's
-Gothart
-Gothart's
 Gottfried
 Gottfried's
 Gracia
 Gracia's
-Gradeigh
-Gradeigh's
-Gradey
-Gradey's
-Graehme
-Graehme's
 Graeme
 Graeme's
-Graig
-Graig's
-Gram
-Gram's
-Gran
 Gran's
 Grange
 Granger
 Grannie
 Grannie's
-Granny
-Granny's
 Grantham
 Grantham's
-Granthem
-Granthem's
 Grantley
 Grantley's
 Granville
 Granville's
 Grata
 Grata's
 Gratia
 Gratia's
-Gratiana
-Gratiana's
-Grayce
-Grayce's
 Grazia
 Grazia's
-Greggory
-Greggory's
 Gregoire
 Gregoire's
-Gregoor
-Gregoor's
 Gregor
 Gregor's
 Gregorius
 Gregorius's
 Grenville
-Gretal
-Gretal's
 Grete
 Grete's
-Grethel
-Grethel's
 Gretna
 Gretna's
 Gretta
 Gretta's
 Grier
 Grier's
 Griff
 Griff's
-Griffie
-Griffie's
 Griffiths
-Griffy
-Griffy's
 Griselda
-Grissel
-Grissel's
 Griswold
 Griswold's
-Griz
-Griz's
-Grove
-Grove's
-Gualterio
-Gualterio's
-Guendolen
-Guendolen's
 Guenevere
 Guenevere's
-Guenna
-Guenna's
-Guglielma
-Guglielma's
 Guglielmo
 Guglielmo's
 Gui
 Gui's
 Guido's
 Guilbert
 Guilbert's
 Guildford
 Guildford's
 Guillaume
 Guillaume's
-Guillema
-Guillema's
-Guillemette
-Guillemette's
-Guinna
-Guinna's
-Gun
-Gun's
-Gunar
-Gunar's
 Gunilla
 Gunilla's
-Gunner
-Gunner's
-Guntar
-Guntar's
 Gunter
-Gusella
-Gusella's
-Guss
-Gussi
-Gussi's
 Gussie
 Gussie's
-Gussy
 Gussy's
 Gusta
 Gusta's
 Gustaf
 Gustaf's
 Gustave
 Gustave's
 Gusti
 Gusti's
-Gustie
-Gustie's
-Gusty
 Gusty's
-Guthrey
-Guthrey's
-Guthry
-Guthry's
 Gwendolen
 Gwendolen's
-Gwendolin
-Gwendolin's
-Gweneth
-Gweneth's
-Gwenette
-Gwenette's
-Gwenneth
-Gwenneth's
-Gwenni
-Gwenni's
-Gwennie
-Gwennie's
-Gwenny
-Gwenny's
-Gwenora
-Gwenora's
-Gwenore
-Gwenore's
 Gwyneth
 Gwyneth's
 Gwynne
 Gwynne's
 HTTPS
-Had
 Had's
-Hadlee
-Hadlee's
 Hadleigh
 Hadleigh's
 Hadley
 Hadley's
 Hadria
 Hadria's
 Hagan
 Hagan's
 Hagen
-Hailee
-Hailee's
 Hailey
 Hailey's
-Haily
-Haily's
 Hakeem
 Hakeem's
 Hakim
 Hakim's
-Haleigh
-Haleigh's
-Halette
-Halette's
 Hali
 Hali's
-Halie
-Halie's
-Halimeda
-Halimeda's
-Halli
-Halli's
-Hallsy
-Hallsy's
 Hally
 Hally's
-Halsy
-Halsy's
 Hamas
 Hamas's
 Hamel
 Hamel's
 Hamid
 Hamid's
 Hamil
 Hamil's
 Hamish
 Hamish's
-Hamlen
-Hamlen's
 Hammad
 Hammad's
-Hamnet
-Hamnet's
 Hana
 Hana's
 Hanan
 Hanan's
 Hanni
 Hanni's
-Hannie
-Hannie's
-Hannis
-Hanny
-Hanny's
-Hansiain
-Hansiain's
-Happy
 Happy's
 Harald
 Harald's
 Harbert
 Harbert's
 Harcourt
 Harcourt's
 Harland
 Harland's
-Harlen
-Harlen's
-Harlene
-Harlene's
-Harli
-Harli's
-Harlie
-Harlie's
 Harlin
 Harlin's
 Harman
 Harman's
 Harmonia
 Harmonia's
 Harmonie
 Harmonie's
-Harmony
-Harmony's
 Haroun
 Haroun's
-Harp
-Harp's
 Harri
 Harri's
-Harrie
-Harrie's
-Harrietta
-Harrietta's
 Harriette
 Harriette's
 Harriot
 Harriot's
 Harriott
 Harriott's
 Hartley
 Hartwell
 Hartwell's
 Harv
 Harv's
 Harwell
 Harwell's
-Harwilll
-Harwilll's
-Hasheem
-Hasheem's
 Hashim
 Hashim's
-Haskel
-Haskel's
-Haskell
-Haskell's
 Haslett
 Haslett's
 Hassan
 Hassan's
 Hastie
 Hastie's
-Hasty
 Hasty's
 Hatti
 Hatti's
 Hatty
 Hatty's
-Haven
-Haven's
 Haydon
 Haydon's
 Hayley
 Hayley's
 Hayyim
 Hayyim's
-Haze
-Haze's
 Hazlett
 Hazlett's
-Heall
-Heall's
-Heda
-Heda's
 Hedda
 Hedda's
-Heddi
-Heddi's
-Heddie
-Heddie's
 Hedi
 Hedi's
-Hedvig
-Hedvig's
-Hedvige
-Hedvige's
 Hedwig
 Hedwig's
-Hedwiga
-Hedwiga's
 Hedy
 Hedy's
-Heida
-Heida's
-Heidie
-Heidie's
-Heindrick
-Heindrick's
-Heinrick
-Heinrick's
-Heinrik
-Heinrik's
 Hejira's
-Hejiras
 Helaina
 Helaina's
-Helaine
-Helaine's
-Helenka
-Helenka's
 Helge
 Helge's
 Hellenized
-Hellenizes
-Hellenizing
-Helli
-Helli's
-Helsa
-Helsa's
 Helvetica
-Helyn
-Helyn's
 Hendrik
 Hendrik's
-Hendrika
-Hendrika's
-Henka
-Henka's
-Henrie
-Henrie's
-Henrieta
-Henrieta's
 Henriette
 Henriette's
-Henryetta
-Henryetta's
 Hephzibah
 Hephzibah's
-Herb
-Herb's
 Herbie
 Herbie's
 Herby
 Herby's
 Herc
 Herc's
 Hercule
 Hercule's
-Herculie
-Herculie's
 Hermann
 Hermann's
 Hermia
 Hermia's
-Hermie
-Hermie's
-Hermina
-Hermina's
 Hermine
 Hermine's
 Hermione
 Hermione's
 Hermon
-Hermy
-Hermy's
 Hernando
 Hernando's
 Herold
 Herold's
 Hersch
 Hersch's
 Hersh
 Hersh's
@@ -5380,6797 +2289,3000 @@ Herta's
 Hertfordshire
 Hertfordshire's
 Hertha
 Hertha's
 Herve
 Herve's
 Hervey
 Hervey's
-Hesther
-Hesther's
 Hestia
 Hestia's
-Hetti
-Hetti's
 Hetty
 Hetty's
-Hew
 Hew's
-Hewe
-Hewe's
-Hewet
-Hewet's
 Hewett
 Hewett's
-Hewie
-Hewie's
-Hi
 Hi's
-Hilarius
-Hilarius's
-Hildagard
-Hildagard's
-Hildagarde
-Hildagarde's
 Hilde
 Hilde's
-Hildegaard
-Hildegaard's
 Hildegarde
 Hildegarde's
 Hildy
 Hildy's
 Hillard
 Hillard's
 Hillery
 Hillery's
 Hilliard
-Hilliary
-Hilliary's
-Hillie
-Hillie's
 Hillier
 Hillier's
 Hillsborough
 Hillsborough's
-Hilly
 Hilly's
 Hillyer
 Hillyer's
-Hinda
-Hinda's
 Hinze
 Hinze's
 Hirsch
 Hirsch's
-Hobard
-Hobard's
-Hobey
-Hobey's
 Hobie
 Hobie's
-Hoebart
-Hoebart's
-Holli
-Holli's
-Hollyanne
-Hollyanne's
-Homere
-Homere's
-Homerus
-Homerus's
-Honey
-Honey's
-Honor
 Honoria
 Honoria's
 Horatia
 Horatia's
 Horatius
 Horatius's
 Horst
 Horst's
 Hort
 Hort's
-Horten
-Horten's
 Hortense
 Hortensia
 Hortensia's
 Hotmail
 Hotmail's
 Houghton
 Houghton's
 Howey
 Howey's
 Howie
 Howie's
 Hoyt
 Hoyt's
-Hube
-Hube's
-Huberto
-Huberto's
-Hubey
-Hubey's
-Hubie
-Hubie's
 Hughie
-Hugibert
-Hugibert's
 Hugues
 Hugues's
 Hulda
 Hulda's
 Humbert
 Humbert's
 Humfrey
 Humfrey's
-Humfrid
-Humfrid's
-Humfried
-Humfried's
-Hunfredo
-Hunfredo's
-Huntlee
-Huntlee's
-Hurlee
-Hurlee's
-Hurleigh
-Hurleigh's
 Husein
 Husein's
 Hy
 Hy's
-Hyacinth
-Hyacinth's
-Hyacintha
-Hyacintha's
 Hyacinthe
 Hyacinthe's
-Hyacinthia
-Hyacinthia's
-Hyacinthie
-Hyacinthie's
 Hyatt
 Hyatt's
 Hyman
 Hyman's
 Hymie
-Hynda
-Hynda's
 IMDb
 IMDb's
 IMDbPro
 IMDbPro's
 IPO's
 IPOs
 Iain
 Iain's
 Ianthe
 Ianthe's
-Ibbie
-Ibbie's
-Ibby
-Ibby's
 Ibrahim
 Ibrahim's
 Ichabod
 Ichabod's
-Idalia
-Idalia's
-Idalina
-Idalina's
-Idaline
-Idaline's
-Idell
-Idell's
-Idelle
-Idelle's
-Idette
-Idette's
-Iggie
-Iggie's
 Iggy
 Iggy's
 Ignace
 Ignace's
-Ignacius
-Ignacius's
 Ignaz
 Ignaz's
 Ignazio
 Ignazio's
 Ikey
 Ikey's
-Ilaire
-Ilaire's
-Ilario
-Ilario's
 Ileana
 Ileana's
-Ileane
-Ileane's
-Ilise
-Ilise's
 Ilka
 Ilka's
 Illa
 Illa's
 Ilsa
 Ilsa's
 Ilse
 Ilse's
-Ilysa
-Ilysa's
-Ilyse
-Ilyse's
-Ilyssa
-Ilyssa's
 Immanuel
 Imogen
 Imogen's
-Imojean
-Imojean's
-Inesita
-Inesita's
-Inessa
-Inessa's
 Inga
 Inga's
-Ingaberg
-Ingaberg's
-Ingaborg
-Ingaborg's
-Ingamar
-Ingamar's
-Ingar
-Ingar's
-Ingeberg
-Ingeberg's
 Ingeborg
 Ingeborg's
-Ingelbert
-Ingelbert's
 Ingemar
 Ingemar's
 Inger
 Inger's
-Inglebert
-Inglebert's
 Inglis
 Inglis's
 Ingmar
 Ingmar's
-Ingra
-Ingra's
-Ingrim
-Ingrim's
-Ingunna
-Ingunna's
 Inigo
 Inigo's
 Inna
 Inna's
 Inness
 Inness's
 Innis
 Innis's
-Iolande
-Iolande's
-Iolanthe
-Iolanthe's
 Iona
-Iorgo
-Iorgo's
-Iorgos
-Iormina
-Iormina's
-Iosep
-Iosep's
 Irena
 Irena's
 Irina
 Irina's
-Irita
-Irita's
 Irv
 Irv's
-Irwinn
-Irwinn's
 Isa
 Isaak
 Isaak's
-Isabelita
-Isabelita's
-Isac
-Isac's
-Isacco
-Isacco's
-Isador
-Isador's
 Isadora
 Isadora's
 Isadore
 Isadore's
-Isahella
-Isahella's
 Isak
 Isak's
-Iseabal
-Iseabal's
-Isiahi
-Isiahi's
 Isidor
 Isidor's
 Isidora
 Isidora's
 Isidore
 Isidore's
 Isidoro
 Isidoro's
 Isobel
 Isobel's
-Issi
-Issi's
-Issiah
-Issiah's
-Issie
-Issie's
 Issy
 Issy's
-Itch
-Itch's
 Ivar
 Ivar's
 Ive
 Ive's
 Iver
 Iver's
-Ivett
-Ivett's
-Ivette
-Ivette's
 Ivie
 Ivie's
 Ivoire
-Ivonne
-Ivonne's
 Ivor
 Ivor's
-Izabel
-Izabel's
-Izak
-Izak's
 Izzy
 Izzy's
 JPEG's
 JPEGs
 Jabez
 Jabez's
-Jacenta
-Jacenta's
-Jacinda
-Jacinda's
 Jacinta
 Jacinta's
-Jacintha
-Jacintha's
-Jacinthe
-Jacinthe's
-Jackelyn
-Jackelyn's
 Jacki
 Jacki's
 Jacklin
 Jacklin's
-Jackquelin
-Jackquelin's
-Jackqueline
-Jackqueline's
-Jaclin
-Jaclin's
 Jacobo
 Jacobo's
-Jacquelin
-Jacquelin's
-Jacquelynn
-Jacquelynn's
-Jacquenetta
-Jacquenetta's
-Jacquenette
-Jacquenette's
-Jacquetta
-Jacquetta's
-Jacquette
-Jacquette's
 Jacqui
 Jacqui's
 Jacquie
 Jacquie's
-Jacynth
-Jacynth's
 Jada
 Jada's
-Jade
-Jade's
 Jae
 Jae's
-Jaimie
-Jaimie's
-Jaine
-Jaine's
-Jakie
-Jakie's
 Jakob
 Jakob's
 Jameson
-Jamesy
-Jamesy's
 Jamey
 Jamey's
 Jamil
 Jamil's
-Jamill
-Jamill's
-Jamima
-Jamima's
 Jamison
 Jamison's
-Jammal
-Jammal's
-Jammie
-Jammie's
-Janaya
-Janaya's
-Janaye
-Janaye's
-Jandy
-Jandy's
-Janean
-Janean's
-Janeczka
-Janeczka's
-Janeen
-Janeen's
 Janek
 Janek's
-Janel
-Janel's
-Janela
-Janela's
-Janella
-Janella's
-Janene
-Janene's
-Janenna
-Janenna's
-Janessa
-Janessa's
-Janeta
-Janeta's
-Janetta
-Janetta's
-Janeva
-Janeva's
 Janey
 Janey's
-Jania
-Jania's
-Janifer
-Janifer's
 Janina
-Janith
-Janith's
-Janka
-Janka's
-Jannel
-Jannel's
-Jannelle
-Jannelle's
 Janos
 Janos's
-Janot
-Janot's
 Jany
 Jany's
-Jaquelin
-Jaquelin's
-Jaquelyn
-Jaquelyn's
-Jaquenetta
-Jaquenetta's
-Jaquenette
-Jaquenette's
-Jaquith
-Jaquith's
-Jarad
-Jarad's
-Jard
-Jard's
-Jareb
-Jareb's
-Jarib
-Jarib's
-Jarid
-Jarid's
-Jarrad
-Jarrad's
 Jarret
 Jarret's
-Jarrid
-Jarrid's
 Jase
 Jase's
-Jasen
-Jasen's
 Jasmin
 Jasmin's
-Jasmina
-Jasmina's
-Jasun
-Jasun's
 Jaye
 Jaye's
 Jayme
 Jayme's
-Jaymee
-Jaymee's
-Jaymie
-Jaymie's
-Jaynell
-Jaynell's
-Jazmin
-Jazmin's
-Jdavie
-Jdavie's
 Jeana
 Jeana's
 Jeane
 Jeane's
-Jeanelle
-Jeanelle's
-Jeanna
-Jeanna's
-Jecho
-Jecho's
-Jedd
-Jedd's
-Jeddy
-Jeddy's
 Jedediah
 Jedediah's
 Jedidiah
 Jedidiah's
-Jeffie
-Jeffie's
-Jeffy
-Jeffy's
-Jehanna
-Jehanna's
 Jehu
-Jelene
-Jelene's
-Jemie
-Jemie's
 Jemima
 Jemima's
-Jemimah
-Jemimah's
-Jemmie
-Jemmie's
 Jemmy
 Jemmy's
 Jen
 Jen's
 Jena
 Jena's
-Jenda
-Jenda's
-Jenelle
-Jenelle's
-Jeni
-Jeni's
-Jenica
-Jenica's
-Jeniece
-Jeniece's
-Jeniffer
-Jeniffer's
-Jenilee
-Jenilee's
-Jenine
-Jenine's
 Jenn
 Jenn's
-Jennee
-Jennee's
-Jennette
-Jennette's
 Jenni
 Jenni's
-Jennica
-Jennica's
-Jennilee
-Jennilee's
-Jennine
-Jennine's
 Jeno
 Jeno's
 Jens
-Jerad
-Jerad's
-Jeralee
-Jeralee's
-Jeramey
-Jeramey's
-Jeramie
-Jeramie's
 Jere
 Jere's
-Jereme
-Jereme's
 Jeremias
 Jeremias's
 Jeremie
 Jeremie's
-Jermain
-Jermain's
-Jermayne
-Jermayne's
-Jeromy
-Jeromy's
 Jerrie
 Jerrie's
-Jerrilee
-Jerrilee's
-Jerrilyn
-Jerrilyn's
-Jerrine
-Jerrine's
-Jerrome
-Jerrome's
-Jerrylee
-Jerrylee's
 Jervis
 Jervis's
-Jessa
-Jessa's
-Jessalin
-Jessalin's
-Jessalyn
-Jessalyn's
 Jessamine
 Jessamine's
 Jessamyn
 Jessamyn's
-Jessee
-Jessee's
-Jesselyn
-Jesselyn's
 Jessey
 Jessey's
 Jessi
 Jessi's
-Jessika
-Jessika's
 Jessy
 Jessy's
-Jeth
-Jeth's
 Jethro
-Jewelle
-Jewelle's
-Jillana
-Jillana's
-Jillane
-Jillane's
-Jillayne
-Jillayne's
-Jilleen
-Jilleen's
-Jillene
-Jillene's
-Jilli
-Jilli's
-Jillie
-Jillie's
 Jilly
 Jilly's
 Joachim
 Joana
 Joana's
 Joane
 Joane's
 Joanie
 Joanie's
 Joannes
-Jobey
-Jobey's
-Jobi
-Jobi's
-Jobie
-Jobie's
-Jobina
-Jobina's
 Joby
 Joby's
-Jobye
-Jobye's
-Jobyna
-Jobyna's
 Jocelin
 Jocelin's
-Joceline
-Joceline's
 Jocelyne
 Jocelyne's
 Jocko
 Jocko's
-Jodee
-Jodee's
-Joeann
-Joeann's
-Joela
-Joela's
-Joelie
-Joelie's
-Joell
-Joell's
-Joella
-Joella's
 Joelle
 Joelle's
-Joellen
-Joellen's
-Joelly
-Joelly's
-Joellyn
-Joellyn's
-Joelynn
-Joelynn's
-Joete
-Joete's
 Johan
 Johan's
-Johannah
-Johannah's
-Johna
-Johna's
-Johnath
-Johnath's
-Johnette
-Johnette's
-Johnna
-Johnna's
-Johny
-Johny's
-Joice
-Joice's
 Jojo
 Jojo's
-Jolee
-Jolee's
-Joleen
-Joleen's
-Joletta
-Joletta's
 Joli
 Joli's
 Jolie
 Jolie's
-Joline
-Joline's
 Joly
 Joly's
-Jolyn
-Jolyn's
-Jolynn
-Jolynn's
 Jone
 Jone's
-Jonell
-Jonell's
-Jonie
-Jonie's
-Jonis
-Jordain
-Jordain's
 Jordana
 Jordana's
-Jordanna
-Jordanna's
 Jordon
 Jordon's
-Jorey
-Jorey's
-Jorgan
-Jorgan's
 Jori
 Jori's
-Jorie
-Jorie's
-Jorrie
-Jorrie's
-Jorry
-Jorry's
 Jory
 Jory's
 Joscelin
 Joscelin's
-Josee
-Josee's
-Joseito
-Joseito's
 Josepha
 Josepha's
-Josephina
-Josephina's
 Josey
 Josey's
-Joshia
-Joshia's
-Joshuah
-Joshuah's
-Josi
-Josi's
 Josias
 Josias's
 Josselyn
 Josselyn's
-Josy
-Josy's
 Jourdain
 Jourdain's
 Jourdan
 Jourdan's
 Joya
 Joya's
-Joyan
-Joyan's
-Joyann
-Joyann's
-Joycelin
-Joycelin's
 Joye
 Joye's
 Jozef
 Jozef's
-Jsandye
-Jsandye's
 Jud
 Judi
 Judi's
-Judie
-Judie's
-Juditha
-Juditha's
-Judon
-Judon's
-Judye
-Judye's
-Juieta
-Juieta's
 Jule
 Jule's
-Julee
-Julee's
 Juli
 Juli's
 Juliane
 Juliane's
-Juliann
-Juliann's
 Julianna
 Julianna's
-Julienne
 Julienne's
-Julieta
-Julieta's
-Julietta
-Julietta's
-Julina
-Julina's
-Juline
-Juline's
-Julissa
-Julissa's
-Julita
-Julita's
-Junette
-Junette's
 Junia
 Junia's
 Junie
 Junie's
-Junina
-Junina's
-Justen
-Justen's
 Justina
 Justina's
-Justinn
-Justinn's
-Justino
-Justino's
-Justis
-Justis's
 Justus
 Justus's
 Jyoti
 Jyoti's
-Kacey
-Kacey's
-Kacie
-Kacie's
-Kacy
-Kacy's
-Kaela
-Kaela's
-Kahaleel
-Kahaleel's
 Kahlil
 Kahlil's
 Kai
 Kai's
 Kaia
 Kaia's
 Kaila
 Kaila's
-Kaile
-Kaile's
-Kailey
-Kailey's
 Kain
 Kain's
 Kaine
 Kaine's
 Kaitlyn
 Kaitlyn's
-Kaitlynn
-Kaitlynn's
 Kaja
 Kaja's
-Kakalina
-Kakalina's
 Kala
 Kala's
-Kale
-Kale's
-Kaleb
-Kaleb's
-Kaleena
-Kaleena's
-Kalie
-Kalie's
 Kalil
 Kalil's
-Kalila
-Kalila's
 Kalina
 Kalina's
-Kalinda
-Kalinda's
-Kalindi
-Kalindi's
 Kalle
 Kalle's
-Kalli
-Kalli's
-Kally
-Kally's
-Kalvin
-Kalvin's
-Kameko
-Kameko's
-Kamila
-Kamila's
-Kamilah
-Kamilah's
-Kamillah
-Kamillah's
-Kandace
-Kandace's
 Kandy
 Kania
 Kania's
 Kanya
 Kanya's
-Karalee
-Karalee's
-Karalynn
-Karalynn's
 Kare
 Kare's
-Karee
-Karee's
 Karel
 Karel's
-Karena
-Karena's
-Karia
-Karia's
-Karie
-Karie's
-Karil
-Karil's
-Karilynn
-Karilynn's
 Karim
 Karim's
 Karine
 Karine's
-Kariotta
-Kariotta's
-Karisa
-Karisa's
-Karissa
-Karissa's
-Karita
-Karita's
-Karlan
-Karlan's
-Karlee
-Karlee's
-Karleen
-Karleen's
 Karlen
 Karlen's
-Karlene
-Karlene's
-Karlens
-Karlie
-Karlie's
-Karlik
-Karlik's
-Karlis
-Karlotta
-Karlotta's
-Karlotte
-Karlotte's
 Karly
 Karly's
-Karlyn
-Karlyn's
-Karmen
-Karmen's
 Karna
 Karna's
 Karnataka
 Karnataka's
-Karney
-Karney's
-Karola
-Karola's
-Karole
-Karole's
 Karolina
 Karolina's
 Karoline
 Karoline's
 Karoly
 Karoly's
 Karon
 Karon's
-Karrah
-Karrah's
-Karrie
-Karrie's
-Karry
-Karry's
-Kary
-Kary's
-Karyl
-Karyl's
-Karylin
-Karylin's
 Kaspar
 Kaspar's
 Kasper
 Kasper's
 Kass
 Kassandra
 Kassandra's
-Kassey
-Kassey's
-Kassi
-Kassi's
-Kassia
-Kassia's
-Kassie
-Kassie's
 Kat
 Kat's
 Kata
 Kata's
 Katalin
 Katalin's
-Katee
-Katee's
 Katerina
 Katerina's
-Katerine
-Katerine's
-Katey
-Katey's
 Kath
 Kath's
 Katha
 Katha's
 Katharina
 Katharina's
-Katharyn
-Katharyn's
 Kathe
 Kathe's
 Katherina
 Katherina's
 Kathi
 Kathi's
-Kathlin
-Kathlin's
-Kathryne
-Kathryne's
-Kathye
-Kathye's
 Kati
 Kati's
-Katine
-Katine's
 Katinka
 Katinka's
-Katleen
-Katleen's
-Katlin
-Katlin's
 Katrine
 Katrinka
 Katrinka's
-Katti
-Katti's
-Kattie
-Kattie's
-Katuscha
-Katuscha's
-Katusha
-Katusha's
 Katya
 Katya's
 Kaycee
 Kaycee's
-Kayle
-Kayle's
 Kaylee
 Kaylee's
-Kayley
-Kayley's
-Kaylil
-Kaylil's
-Kaylyn
-Kaylyn's
 Kayne
 Kayne's
 Kean
 Keane
 Keane's
 Kearney
 Kearney's
-Keary
-Keary's
 Keefe
 Keefe's
 Keefer
 Keefer's
-Keelby
-Keelby's
 Keeley
 Keeley's
-Keelia
-Keelia's
 Keely
 Keely's
-Keen
-Keen's
 Keene
 Keene's
 Keir
 Keir's
-Kelbee
-Kelbee's
-Kelby
-Kelby's
-Kelcey
-Kelcey's
-Kelci
-Kelci's
-Kelcie
-Kelcie's
-Kelcy
-Kelcy's
-Kele
-Kele's
-Kelila
-Kelila's
-Kellby
-Kellby's
 Kellen
 Kellen's
-Kellia
-Kellia's
-Kellina
-Kellina's
-Kellsie
-Kellsie's
-Kellyann
-Kellyann's
-Kelsi
-Kelsi's
-Kelsy
-Kelsy's
-Kelwin
-Kelwin's
 Kendal
 Kendal's
 Kendell
 Kendell's
-Kendre
-Kendre's
 Kendricks
 Kenn
 Kenn's
 Kenna
 Kenna's
 Kennett
 Kennett's
-Kennie
-Kennie's
-Kenon
-Kenon's
 Ker
 Ker's
 Kerala
 Kerala's
 Kerby
 Kerby's
-Keriann
-Keriann's
-Kerianne
-Kerianne's
 Kerk
 Kerk's
-Kermie
-Kermie's
-Kermy
-Kermy's
 Kerrie
 Kerrie's
-Kerrill
-Kerrill's
-Kerrin
-Kerrin's
 Kerstin
 Kerstin's
 Kerwin
 Kerwin's
-Kerwinn
-Kerwinn's
-Kesley
-Kesley's
-Keslie
-Keslie's
-Kessia
-Kessia's
-Kessiah
-Kessiah's
-Ketti
-Ketti's
-Kettie
-Kettie's
-Ketty
-Ketty's
 Kev
 Kev's
 Kevan
 Kevan's
-Kevina
-Kevina's
-Kevon
-Kevon's
-Kevyn
-Kevyn's
 Khalil
 Khalil's
 Ki
 Ki's
-Kiah
-Kiah's
-Kial
-Kial's
-Kiele
-Kiele's
-Kienan
-Kienan's
-Kiersten
-Kiersten's
-Kijiji
-Kijiji's
-Kikelia
-Kikelia's
 Kile
 Kile's
 Kiley
 Kiley's
 Kilian
 Kilian's
 Killian
 Killian's
-Killie
-Killie's
-Killy
-Killy's
 Kimball
 Kimball's
 Kimbell
 Kimbell's
-Kimberlee
-Kimberlee's
-Kimberli
-Kimberli's
-Kimberlyn
-Kimberlyn's
 Kimble
 Kimble's
-Kimbra
-Kimbra's
-Kimmi
-Kimmi's
-Kimmie
-Kimmie's
 Kimmy
 Kimmy's
-Kin
-Kin's
 Kincaid
 Kincaid's
 Kingsley
-Kingsly
-Kingsly's
 Kinko
-Kinna
-Kinna's
-Kinnie
-Kinnie's
-Kinny
-Kinny's
 Kinsley
 Kinsley's
 Kipp
 Kipp's
-Kippar
-Kippar's
-Kipper
-Kipper's
-Kippie
-Kippie's
-Kippy
-Kippy's
 Kira
 Kira's
-Kirbee
-Kirbee's
-Kirbie
-Kirbie's
 Kiri
 Kiri's
-Kirsteni
-Kirsteni's
-Kirsti
-Kirsti's
-Kirstin
-Kirstin's
-Kirstyn
-Kirstyn's
-Kissee
-Kissee's
-Kissiah
-Kissiah's
-Kissie
-Kissie's
-Kitti
-Kitti's
-Kittie
-Kittie's
 Kitts
 Kitts's
-Kizzee
-Kizzee's
-Kizzie
-Kizzie's
 Klara
 Klara's
-Klarika
-Klarika's
-Klarrisa
-Klarrisa's
 Klemens
 Klemens's
 Klement
 Klement's
-Kleon
-Kleon's
-Kliment
-Kliment's
-Koenraad
-Koenraad's
-Konstance
-Konstance's
 Konstantin
 Konstantin's
-Konstantine
-Konstantine's
-Konstanze
-Konstanze's
 Koo
 Koo's
 Kora
 Kora's
-Koral
-Koral's
-Koralle
-Koralle's
-Kordula
-Kordula's
 Kore
 Kore's
-Korella
-Korella's
 Koren
 Koren's
-Koressa
-Koressa's
-Korey
-Korey's
 Kori
 Kori's
-Korie
-Korie's
-Korney
-Korney's
-Korrie
-Korrie's
-Korry
-Korry's
 Kort
 Kort's
 Kosovo
 Kosovo's
-Krisha
-Krisha's
-Krishnah
-Krishnah's
-Krispin
-Krispin's
-Krissie
-Krissie's
-Krissy
-Krissy's
-Kristal
-Kristal's
-Kristan
-Kristan's
-Kriste
-Kriste's
-Kristel
-Kristel's
 Kristian
 Kristian's
-Kristien
-Kristien's
-Kristo
-Kristo's
-Kristofer
-Kristofer's
-Kristoffer
-Kristoffer's
-Kristofor
-Kristofor's
-Kristoforo
-Kristoforo's
-Kristos
-Kristyn
-Kristyn's
-Krysta
-Krysta's
-Krystalle
-Krystalle's
-Krystle
-Krystle's
 Krystyna
 Krystyna's
 Kuala
 Kuala's
 Kyla
 Kyla's
-Kylen
-Kylen's
 Kylie
 Kylie's
-Kylila
-Kylila's
-Kylynn
-Kylynn's
 Kym
 Kym's
-Kynthia
-Kynthia's
-Kyrstin
-Kyrstin's
-Lacee
-Lacee's
-Lacie
-Lacie's
 Laetitia
 Laetitia's
-Laina
-Laina's
 Lainey
 Lainey's
-Laird
-Laird's
 Lakers
 Lakers's
 Lalo
 Lalo's
-Lammond
-Lammond's
 Lamond
 Lamond's
-Lanae
-Lanae's
-Lanette
-Lanette's
 Laney
 Laney's
-Langsdon
-Langsdon's
 Langston
 Langston's
 Lani
 Lani's
 Lanie
 Lanie's
-Lanita
-Lanita's
 Lanna
 Lanna's
-Lanni
-Lanni's
-Lannie
-Lannie's
-Laraine
-Laraine's
 Lari
 Lari's
-Larina
-Larina's
-Larine
-Larine's
 Larisa
 Larisa's
 Larissa
 Larissa's
-Lark
-Lark's
-Laryssa
-Laryssa's
-Latashia
-Latashia's
-Latia
-Latia's
-Latrena
-Latrena's
-Latrina
-Latrina's
 Laughton
 Launce
 Launce's
-Lauraine
-Lauraine's
-Laural
-Laural's
-Lauralee
-Lauralee's
 Laure
 Laure's
-Lauree
-Lauree's
-Laureen
-Laureen's
-Laurella
-Laurella's
-Laurena
-Laurena's
-Laurene
-Laurene's
 Laurens
 Lauretta
 Lauretta's
 Laurette
 Laurette's
-Laurianne
-Laurianne's
-Laurice
-Laurice's
-Lauritz
-Lauritz's
 Lauryn
 Lauryn's
-Lavena
-Lavena's
-Laverna
-Laverna's
 Lavina
 Lavina's
 Lavinia
 Lavinia's
-Lavinie
-Lavinie's
-Law
 Lawry
 Lawry's
 Lawton
 Lawton's
-Lay
-Lay's
 Layne
 Layne's
-Layney
-Layney's
 Layton
 Layton's
 Lazar
 Lazar's
 Lazare
 Lazare's
 Leandra
 Leandra's
-Leanor
-Leanor's
-Leanora
-Leanora's
-Lebbie
-Lebbie's
-Leeann
-Leeann's
-Leeanne
-Leeanne's
 Leela
 Leela's
-Leelah
-Leelah's
-Leeland
-Leeland's
 Leena
 Leena's
-Leesa
-Leesa's
 Leese
 Leese's
-Lefty
-Lefty's
-Legra
-Legra's
 Leia
 Leia's
 Leica
 Leica's
-Leigha
-Leigha's
 Leighton
 Leighton's
-Leilah
-Leilah's
-Leisha
-Leisha's
 Lek
 Lek's
-Lelah
-Lelah's
 Lem
 Lem's
-Lemar
-Lemar's
-Lemmie
-Lemmie's
-Lemmy
-Lemmy's
-Lenci
-Lenci's
-Lenee
-Lenee's
-Lenette
-Lenette's
-Lenka
-Lenka's
-Lenna
-Lenna's
 Lennard
 Lennard's
 Lennie
 Lennie's
-Leodora
-Leodora's
-Leoine
-Leoine's
-Leoline
-Leoline's
-Leonanie
-Leonanie's
 Leone
 Leone's
-Leonelle
-Leonelle's
-Leonerd
-Leonerd's
 Leonhard
 Leonhard's
 Leonie
 Leonie's
 Leonora
 Leonora's
 Leonore
 Leonore's
 Leontine
 Leontine's
-Leontyne
-Leontyne's
 Leora
 Leora's
 Leroi
 Leroi's
-Leshia
-Leshia's
-Lesli
-Lesli's
-Lesly
-Lesly's
-Lesya
-Lesya's
-Lethia
-Lethia's
-Letisha
-Letisha's
 Letizia
 Letizia's
-Letta
-Letta's
-Letti
-Letti's
 Lettie
 Lettie's
 Letty
 Letty's
-Leupold
-Leupold's
 Lev
 Levey
 Levey's
 Levin
 Levin's
 Levon
 Levon's
 Lewes
-Lewie
-Lewie's
-Lewiss
 Lexi
 Lexi's
 Lexie
 Lexie's
-Lexine
-Lexine's
-Lexis
 LexisNexis
 LexisNexis's
-Lexmark
-Lexmark's
 Lexy
 Lexy's
 Leyla
 Leyla's
-Lezley
-Lezley's
-Lezlie
-Lezlie's
 Lia
 Lia's
 Liam
 Liam's
 Lian
 Lian's
 Liana
 Liana's
 Liane
 Liane's
-Lianna
-Lianna's
 Lianne
 Lianne's
-Lib
 Libbey
 Libbey's
-Libbi
-Libbi's
 Libbie
 Libbie's
-Licha
-Licha's
 Lida
 Lida's
-Lief
 Lief's
-Liesa
-Liesa's
 Lightning
 Lightning's
 Lil
 Lil's
 Lilah
 Lilah's
-Lilas
 Liliane
 Liliane's
 Lilias
 Lilla
 Lilla's
 Lilli
 Lilli's
-Lillis
-Lilllie
-Lilllie's
-Lilyan
-Lilyan's
 Linc
 Linc's
 Lincolnshire
 Lincolnshire's
 Lindi
 Lindi's
-Lindie
-Lindie's
 Lindon
 Lindon's
-Lindsy
-Lindsy's
 Linea
 Linea's
-Linell
-Linell's
-Linet
-Linet's
-Linette
-Linette's
-Link
-Link's
 LinkedIn
 LinkedIn's
 Linn
 Linn's
 Linnea
 Linnea's
 Linnell
 Linnell's
-Linnet
-Linnet's
-Linnie
-Linnie's
-Linoel
-Linoel's
-Linzy
-Linzy's
-Lion
-Lionello
-Lionello's
-Lira
-Lira's
-Lisabeth
-Lisabeth's
 Lisbeth
 Lisbeth's
 Lise
 Lise's
-Lisetta
-Lisetta's
 Lisette
 Lisette's
-Lisha
-Lisha's
-Lishe
-Lishe's
 Lisle
 Lisle's
 Lissa
 Lissa's
-Lissi
-Lissi's
-Lissie
-Lissie's
 Lissy
 Lissy's
 Lita
 Lita's
-Liuka
-Liuka's
 Liv
 Liv's
-Liva
-Liva's
 LiveJournal
 LiveJournal's
-Livvie
-Livvie's
 Livvy
 Livvy's
-Livvyy
-Livvyy's
 Lizabeth
 Lizabeth's
 Lizbeth
 Lizbeth's
 Lizette
 Lizette's
-Llywellyn
-Llywellyn's
-Lock
-Lock's
 Lodovico
 Lodovico's
-Loella
-Loella's
 Logitech
 Logitech's
-Loise
-Loise's
-Loleta
-Loleta's
-Lolly
 Lolly's
 Lona
 Lona's
-Lonee
-Lonee's
 Loni
 Loni's
-Lonna
-Lonna's
-Lonnard
-Lonnard's
-Lonni
-Lonni's
 Lonny
 Lonny's
 LookSmart
 LookSmart's
 Lorain
 Lorain's
-Loralee
-Loralee's
-Loralie
-Loralie's
-Loralyn
-Loralyn's
 Lorant
 Lorant's
-Loree
-Loree's
-Loreen
-Loreen's
-Lorelle
-Lorelle's
-Lorens
 Lorenza
 Lorenza's
 Lorette
 Lorette's
 Loria
 Loria's
-Lorianna
-Lorianna's
-Lorianne
-Lorianne's
-Lorilee
-Lorilee's
-Lorilyn
-Lorilyn's
 Lorin
 Lorin's
 Lorinda
 Lorinda's
-Lorine
-Lorine's
-Lorita
-Lorita's
 Lorne
 Lorne's
-Lorrayne
-Lorrayne's
-Lorri
-Lorri's
-Lorrin
-Lorrin's
-Lorry
-Lorry's
 Lory
 Lory's
-Lothaire
-Lothaire's
 Lotta
 Lotta's
 Lotte
 Lotte's
 Lotti
 Lotti's
 Lotty
 Lotty's
-Louisette
-Louisette's
-Loutitia
-Loutitia's
 Lovell
-Lowrance
-Lowrance's
 Loy
 Loy's
-Loydie
-Loydie's
 Luca
 Luca's
-Lucais
-Lucais's
-Lucho
-Lucho's
 Luci
 Luci's
 Luciana
 Luciana's
-Lucias
 Lucie
 Lucie's
 Lucienne
 Lucienne's
-Lucila
-Lucila's
-Lucilia
-Lucilia's
 Lucina
-Lucine
-Lucine's
-Lucita
-Lucita's
-Lucky
 Lucky's
 Ludovico
 Ludovico's
-Ludovika
-Ludovika's
 Ludvig
 Ludvig's
-Luelle
-Luelle's
 Luise
 Luise's
 Lukas
 Lukas's
-Lulita
-Lulita's
 Lura
 Lura's
-Lurette
-Lurette's
-Lurleen
-Lurleen's
-Lurlene
-Lurlene's
-Lurline
-Lurline's
-Lusa
-Lusa's
-Lutero
-Lutero's
 Ly
 Ly's
 Lycos
 Lycos's
 Lyda
 Lyda's
 Lydie
 Lydie's
 Lydon
 Lydon's
 Lyn
 Lyn's
 Lynde
 Lynde's
-Lyndel
-Lyndel's
-Lyndell
-Lyndell's
 Lyndsay
 Lyndsay's
 Lyndsey
 Lyndsey's
-Lyndsie
-Lyndsie's
-Lyndy
-Lyndy's
-Lynea
-Lynea's
-Lynelle
-Lynelle's
-Lynett
-Lynett's
-Lynna
-Lynna's
-Lynnea
-Lynnea's
-Lynnell
-Lynnell's
-Lynnelle
-Lynnelle's
-Lynnet
-Lynnet's
-Lynnett
-Lynnett's
-Lynsey
-Lynsey's
 Lyssa
 Lyssa's
 MHz's
 MPEG's
 MPEGs
 Mab
-Mabelle
-Mabelle's
 Macau
 Macau's
 Macromedia
 Macromedia's
 Mada
 Mada's
-Madalena
-Madalena's
 Madalyn
 Madalyn's
 Maddalena
 Maddalena's
 Maddi
 Maddi's
 Maddie
 Maddie's
 Maddy
 Maddy's
-Madel
-Madel's
 Madelaine
 Madelaine's
-Madelena
-Madelena's
-Madelene
-Madelene's
-Madelin
-Madelin's
-Madelina
-Madelina's
-Madella
-Madella's
-Madelle
-Madelle's
 Madelon
 Madelon's
-Madlen
-Madlen's
-Madlin
-Madlin's
-Mady
-Mady's
-Maegan
-Maegan's
-Mag
-Mag's
 Magda
 Magda's
-Magdaia
-Magdaia's
 Magdalen
-Maggee
-Maggee's
 Maggi
 Maggi's
 Maggy
 Maggy's
-Magnum
 Mahala
 Mahala's
 Mahalia
 Mahalia's
 Mahmoud
 Mahmoud's
 Mahmud
 Mahmud's
 Maia
 Maia's
-Maible
-Maible's
-Maiga
-Maiga's
-Maighdiln
-Maighdiln's
 Mair
 Mair's
 Maire
 Maire's
-Maisey
-Maisey's
 Maison
 Maison's
-Maitilde
-Maitilde's
-Maje
-Maje's
 Mal
 Mala
 Mala's
-Malanie
-Malanie's
-Malchy
-Malchy's
-Malena
-Malena's
 Malia
 Malia's
 Malina
 Malina's
-Malinde
-Malinde's
 Malissa
 Malissa's
-Malissia
-Malissia's
-Mallissa
-Mallissa's
-Mallorie
-Mallorie's
-Malorie
-Malorie's
 Malva
 Malva's
 Malvin
 Malvin's
 Malvina
 Malvina's
-Malynda
-Malynda's
 Mame
 Mame's
 Manda
 Manda's
 Mandel
 Mandel's
 Mandi
 Mandi's
 Mandie
 Mandie's
-Mandriva
-Mandriva's
 Mannie
 Mannie's
 Manny
 Manny's
 Mano
 Mano's
 Manolo
 Manolo's
 Manon
 Manon's
 Manya
 Manya's
 MapQuest
 MapQuest's
-Marabel
-Marabel's
 Marcela
 Marcela's
-Marcelia
-Marcelia's
 Marcelle
 Marcelle's
-Marcellina
-Marcellina's
-Marcelline
-Marcelline's
 Marcello
 Marcello's
 Marcellus
-Marchall
-Marchall's
-Marchelle
-Marchelle's
-Marcile
-Marcile's
-Marcille
-Marcille's
-Mareah
-Mareah's
 Maren
 Maren's
-Marena
-Marena's
-Maressa
-Maressa's
 Marga
 Marga's
 Margalit
 Margalit's
-Margalo
-Margalo's
 Margareta
 Margareta's
 Margarete
 Margarete's
 Margaretha
 Margaretha's
 Margarethe
 Margarethe's
 Margaretta
 Margaretta's
-Margarette
-Margarette's
 Margaux
-Margeaux
-Margeaux's
 Marget
 Marget's
-Margette
-Margette's
-Margi
-Margi's
 Margit
 Margit's
-Margot
 Margot's
 Margy
 Margy's
 Mariam
 Mariam's
-Mariann
-Mariann's
 Marianna
 Marianna's
-Maribelle
-Maribelle's
 Maribeth
 Maribeth's
-Marice
-Marice's
-Maridel
-Maridel's
-Marieann
-Marieann's
-Mariejeanne
-Mariejeanne's
 Mariel
 Mariel's
-Mariele
-Mariele's
 Marielle
 Marielle's
-Mariellen
-Mariellen's
 Mariette
 Mariette's
-Marigold
-Marigold's
-Marijn
-Marijn's
-Marijo
-Marijo's
 Marika
 Marika's
 Marilee
 Marilee's
-Marilin